Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
attendance-performance-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
attendance-performance-platform
Commits
3a44e978
Commit
3a44e978
authored
Dec 04, 2023
by
赵啸非
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
b61cd627
28511dae
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
1547 additions
and
149 deletions
+1547
-149
attendance-performance-manager-ui/admin/src/assets/mixins/formdialog.js
...formance-manager-ui/admin/src/assets/mixins/formdialog.js
+5
-1
attendance-performance-manager-ui/admin/src/views/staff/leave/drawershow.vue
...nce-manager-ui/admin/src/views/staff/leave/drawershow.vue
+233
-144
attendance-performance-manager-ui/admin/src/views/system/user/list.vue
...rformance-manager-ui/admin/src/views/system/user/list.vue
+1
-1
attendance-performance-manager/src/main/java/com/mortals/xhx/common/utils/DynamicColExcelUtil.java
...ava/com/mortals/xhx/common/utils/DynamicColExcelUtil.java
+1209
-0
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceStatController.java
...s/xhx/module/attendance/web/AttendanceStatController.java
+99
-3
No files found.
attendance-performance-manager-ui/admin/src/assets/mixins/formdialog.js
View file @
3a44e978
...
@@ -127,7 +127,11 @@ export default {
...
@@ -127,7 +127,11 @@ export default {
const
dataCopy
=
Object
.
assign
({},
data
);
const
dataCopy
=
Object
.
assign
({},
data
);
array
.
forEach
((
item
)
=>
{
array
.
forEach
((
item
)
=>
{
dataCopy
[
item
]
=
dataCopy
[
item
]
=
dataCopy
[
item
]
===
undefined
?
[]
:
dataCopy
[
item
].
split
(
"
,
"
);
dataCopy
[
item
]
===
undefined
?
[]
:
Array
.
isArray
(
dataCopy
[
item
])
?
dataCopy
[
item
]
:
dataCopy
[
item
].
split
(
"
,
"
);
});
});
return
dataCopy
;
return
dataCopy
;
},
},
...
...
attendance-performance-manager-ui/admin/src/views/staff/leave/drawershow.vue
View file @
3a44e978
...
@@ -4,44 +4,139 @@
...
@@ -4,44 +4,139 @@
:title=
"title"
:title=
"title"
:visible.sync=
"open"
:visible.sync=
"open"
:direction=
"direction"
:direction=
"direction"
size=
"50%"
>
size=
"50%"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form
ref=
"form"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-row>
<el-row>
<Field
label=
"员工姓名"
prop=
"staffName"
v-model=
"form.staffName"
placeholder=
"请输入员工姓名"
/>
<Field
<Field
label=
"性别"
prop=
"gender"
v-model=
"form.gender"
type=
"select"
:enumData=
"dict.gender"
placeholder=
"请选择性别"
/>
label=
"员工姓名"
<Field
label=
"出生日期"
prop=
"birthday"
v-model=
"form.birthday"
type=
"date"
/>
prop=
"staffName"
<Field
label=
"照片"
prop=
"photoPath"
v-model=
"form.photoPath"
type=
"textarea"
placeholder=
"请输入照片"
/>
v-model=
"form.staffName"
<Field
label=
"联系电话"
prop=
"phoneNumber"
v-model=
"form.phoneNumber"
placeholder=
"请输入联系电话"
/>
placeholder=
"请输入员工姓名"
<Field
label=
"身份证号码"
prop=
"idCard"
v-model=
"form.idCard"
placeholder=
"请输入身份证号码"
/>
/>
<Field
label=
"工号"
prop=
"workNum"
v-model=
"form.workNum"
placeholder=
"请输入工号"
/>
<Field
<Field
label=
"政治面貌 "
prop=
"politicalstatus"
v-model=
"form.politicalstatus"
type=
"select"
:enumData=
"dict.politicalstatus"
placeholder=
"请选择政治面貌 "
/>
label=
"性别"
<Field
label=
"所属部门"
prop=
"deptId"
v-model=
"form.deptId"
:enumData=
"dict.deptId"
placeholder=
"请输入所属部门"
/>
prop=
"gender"
<Field
label=
"职位ID"
prop=
"jobId"
v-model=
"form.jobId"
:enumData=
"dict.jobId"
placeholder=
"请输入职位ID"
/>
v-model=
"form.gender"
<Field
label=
"员工类型"
prop=
"staffType"
v-model=
"form.staffType"
type=
"select"
:enumData=
"dict.staffType"
placeholder=
"请选择员工类型"
/>
type=
"select"
<Field
label=
"员工状态"
prop=
"status"
v-model=
"form.status"
type=
"select"
:enumData=
"dict.status"
placeholder=
"请选择员工状态"
/>
:enumData=
"dict.gender"
<Field
label=
"入职时间"
prop=
"entryDate"
v-model=
"form.entryDate"
type=
"date"
/>
placeholder=
"请选择性别"
<Field
label=
"离职时间"
prop=
"leaveDate"
v-model=
"form.leaveDate"
type=
"date"
/>
/>
<Field
label=
"离职原因"
prop=
"leaveReason"
v-model=
"form.leaveReason"
type=
"textarea"
placeholder=
"请输入离职原因"
/>
<Field
<Field
label=
"审核状态"
prop=
"auditStatus"
v-model=
"form.auditStatus"
type=
"select"
:enumData=
"dict.auditStatus"
placeholder=
"请选择审核状态"
/>
label=
"出生日期"
prop=
"birthday"
v-model=
"form.birthday"
type=
"date"
/>
<Field
label=
"照片"
prop=
"photoPath"
v-model=
"form.photoPath"
type=
"textarea"
placeholder=
"请输入照片"
/>
<Field
label=
"联系电话"
prop=
"phoneNumber"
v-model=
"form.phoneNumber"
placeholder=
"请输入联系电话"
/>
<Field
label=
"身份证号码"
prop=
"idCard"
v-model=
"form.idCard"
placeholder=
"请输入身份证号码"
/>
<Field
label=
"工号"
prop=
"workNum"
v-model=
"form.workNum"
placeholder=
"请输入工号"
/>
<Field
label=
"政治面貌 "
prop=
"politicalstatus"
v-model=
"form.politicalstatus"
type=
"select"
:enumData=
"dict.politicalstatus"
placeholder=
"请选择政治面貌 "
/>
<Field
label=
"所属部门"
prop=
"deptId"
v-model=
"form.deptId"
:enumData=
"dict.deptId"
placeholder=
"请输入所属部门"
/>
<Field
label=
"职位ID"
prop=
"jobId"
v-model=
"form.jobId"
:enumData=
"dict.jobId"
placeholder=
"请输入职位ID"
/>
<Field
label=
"员工类型"
prop=
"staffType"
v-model=
"form.staffType"
type=
"select"
:enumData=
"dict.staffType"
placeholder=
"请选择员工类型"
/>
<Field
label=
"员工状态"
prop=
"status"
v-model=
"form.status"
type=
"select"
:enumData=
"dict.status"
placeholder=
"请选择员工状态"
/>
<Field
label=
"入职时间"
prop=
"entryDate"
v-model=
"form.entryDate"
type=
"date"
/>
<Field
label=
"离职时间"
prop=
"leaveDate"
v-model=
"form.leaveDate"
type=
"date"
/>
<Field
label=
"离职原因"
prop=
"leaveReason"
v-model=
"form.leaveReason"
type=
"textarea"
placeholder=
"请输入离职原因"
/>
<Field
label=
"审核状态"
prop=
"auditStatus"
v-model=
"form.auditStatus"
type=
"select"
:enumData=
"dict.auditStatus"
placeholder=
"请选择审核状态"
/>
</el-row>
</el-row>
<form-buttons
@
submit=
'submitForm'
noCancelBtn
/>
<form-buttons
@
submit=
"submitForm"
noCancelBtn
v-if=
"(title == '修改员工离职信息')"
/>
</el-form>
</el-form>
</el-drawer>
</el-drawer>
</
template
>
</
template
>
<
script
>
<
script
>
import
form
from
"
@/assets/mixins/formdialog
"
;
import
form
from
"
@/assets/mixins/formdialog
"
;
export
default
{
export
default
{
name
:
"
StaffLeaveDetail
"
,
name
:
"
StaffLeaveDetail
"
,
mixins
:
[
form
],
mixins
:
[
form
],
components
:
{
components
:
{},
},
created
()
{
created
()
{
this
.
changePath
(
"
staff/leave
"
)
this
.
changePath
(
"
staff/leave
"
);
},
},
data
()
{
data
()
{
return
{
return
{
...
@@ -51,57 +146,51 @@
...
@@ -51,57 +146,51 @@
title
:
"
员工离职信息
"
,
title
:
"
员工离职信息
"
,
// 是否显示弹出层
// 是否显示弹出层
open
:
false
,
open
:
false
,
direction
:
"
rtl
"
,
direction
:
"
rtl
"
,
toString
:
[
toString
:
[
"
gender
"
,
"
gender
"
,
"
politicalstatus
"
,
"
politicalstatus
"
,
"
staffType
"
,
"
staffType
"
,
"
status
"
,
"
status
"
,
"
auditStatus
"
,
"
auditStatus
"
,
],
],
toDate
:[
toDate
:
[
"
birthday
"
,
"
entryDate
"
,
"
leaveDate
"
],
"
birthday
"
,
"
entryDate
"
,
"
leaveDate
"
,
],
// 表单校验
// 表单校验
rules
:
{
rules
:
{
staffName
:
[
staffName
:
[
{
required
:
true
,
message
:
"
请输入员工姓名
"
,
trigger
:
"
blur
"
},
{
required
:
true
,
message
:
"
请输入员工姓名
"
,
trigger
:
"
blur
"
},
{
max
:
64
,
message
:
"
最多只能录入64个字符
"
,
trigger
:
"
blur
"
,
},
{
max
:
64
,
message
:
"
最多只能录入64个字符
"
,
trigger
:
"
blur
"
},
],
],
createTime
:
[
createTime
:
[{
required
:
true
,
message
:
"
请选择创建时间
"
}],
{
required
:
true
,
message
:
"
请选择创建时间
"
},
},
],
}
};
};
},
},
methods
:
{
methods
:
{
/** 编辑 */
/** 编辑 */
edit
(
row
)
{
edit
(
row
)
{
this
.
reset
()
this
.
reset
();
this
.
query
=
{
id
:
row
.
id
};
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
staff/leave/edit
"
;
this
.
urls
.
currUrl
=
"
staff/leave/edit
"
;
this
.
getData
();
this
.
getData
();
this
.
pageInfo
.
type
=
"
edit
"
this
.
pageInfo
.
type
=
"
edit
"
;
this
.
title
=
"
修改员工离职信息
"
;
this
.
title
=
"
修改员工离职信息
"
;
},
},
/** 新增 */
/** 新增 */
add
(
row
)
{
add
(
row
)
{
this
.
reset
()
this
.
reset
();
this
.
urls
.
currUrl
=
"
staff/leave/add
"
;
this
.
urls
.
currUrl
=
"
staff/leave/add
"
;
this
.
getData
();
this
.
getData
();
this
.
pageInfo
.
type
=
"
add
"
this
.
pageInfo
.
type
=
"
add
"
;
this
.
title
=
"
新增员工离职信息
"
;
this
.
title
=
"
新增员工离职信息
"
;
},
},
/** 查看*/
/** 查看*/
view
(
row
)
{
view
(
row
)
{
this
.
reset
()
this
.
reset
();
this
.
query
=
{
id
:
row
.
id
};
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
staff/leave/view
"
;
this
.
urls
.
currUrl
=
"
staff/leave/view
"
;
this
.
getData
();
this
.
getData
();
this
.
pageInfo
.
type
=
"
view
"
this
.
pageInfo
.
type
=
"
view
"
;
this
.
title
=
"
员工离职信息详细
"
;
this
.
title
=
"
员工离职信息详细
"
;
},
},
/**取消按钮 */
/**取消按钮 */
...
@@ -121,25 +210,25 @@
...
@@ -121,25 +210,25 @@
// 表单重置
// 表单重置
reset
()
{
reset
()
{
this
.
form
=
{
this
.
form
=
{
staffId
:
null
,
staffId
:
null
,
staffName
:
""
,
staffName
:
""
,
gender
:
1
,
gender
:
1
,
birthday
:
null
,
birthday
:
null
,
photoPath
:
""
,
photoPath
:
""
,
phoneNumber
:
""
,
phoneNumber
:
""
,
idCard
:
""
,
idCard
:
""
,
workNum
:
""
,
workNum
:
""
,
politicalstatus
:
1
,
politicalstatus
:
1
,
deptId
:
null
,
deptId
:
null
,
deptName
:
""
,
deptName
:
""
,
jobId
:
null
,
jobId
:
null
,
jobName
:
""
,
jobName
:
""
,
staffType
:
1
,
staffType
:
1
,
status
:
1
,
status
:
1
,
entryDate
:
null
,
entryDate
:
null
,
leaveDate
:
null
,
leaveDate
:
null
,
leaveReason
:
""
,
leaveReason
:
""
,
auditStatus
:
0
,
auditStatus
:
0
,
};
};
this
.
resetForm
(
"
form
"
);
this
.
resetForm
(
"
form
"
);
},
},
...
@@ -149,5 +238,5 @@
...
@@ -149,5 +238,5 @@
}
}
},
},
},
},
};
};
</
script
>
</
script
>
attendance-performance-manager-ui/admin/src/views/system/user/list.vue
View file @
3a44e978
...
@@ -298,7 +298,7 @@ export default {
...
@@ -298,7 +298,7 @@ export default {
{
{
prop
:
"
roleIds
"
,
prop
:
"
roleIds
"
,
label
:
"
所属角色
"
,
label
:
"
所属角色
"
,
formatter
:
this
.
formatter
s
,
formatter
:
this
.
formatter
,
align
:
"
center
"
,
align
:
"
center
"
,
},
},
...
...
attendance-performance-manager/src/main/java/com/mortals/xhx/common/utils/DynamicColExcelUtil.java
0 → 100644
View file @
3a44e978
package
com.mortals.xhx.common.utils
;
import
cn.hutool.core.util.ReflectUtil
;
import
com.mortals.framework.annotation.Excel
;
import
com.mortals.framework.annotation.Excel.ColumnType
;
import
com.mortals.framework.annotation.Excel.Type
;
import
com.mortals.framework.annotation.Excels
;
import
com.mortals.framework.exception.AppException
;
import
com.mortals.framework.model.BaseEntity
;
import
com.mortals.framework.model.BaseEntityLong
;
import
com.mortals.framework.util.DateUtils
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.framework.util.file.FileTypeUtils
;
import
com.mortals.framework.util.file.ImageUtils
;
import
com.mortals.framework.util.text.Convert
;
import
com.mortals.framework.utils.DictUtils
;
import
com.mortals.framework.utils.ExcelColumn
;
import
com.mortals.framework.utils.ReflectUtils
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.apache.poi.hssf.usermodel.*
;
import
org.apache.poi.ooxml.POIXMLDocumentPart
;
import
org.apache.poi.ss.usermodel.*
;
import
org.apache.poi.ss.util.CellRangeAddressList
;
import
org.apache.poi.xssf.streaming.SXSSFWorkbook
;
import
org.apache.poi.xssf.usermodel.*
;
import
org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker
;
import
org.springframework.util.ObjectUtils
;
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.Serializable
;
import
java.lang.reflect.Field
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
* Excel相关处理
*
* @author zxfei
*/
public
class
DynamicColExcelUtil
<
T
extends
BaseEntity
<
PK
>,
PK
extends
Serializable
>
{
protected
Log
log
=
LogFactory
.
getLog
(
this
.
getClass
());
/**
* Excel sheet最大行数,默认65536
*/
public
static
final
int
sheetSize
=
65536
;
/**
* 工作表名称
*/
private
String
sheetName
;
/**
* 导出类型(EXPORT:导出数据;IMPORT:导入模板)
*/
private
Type
type
;
/**
* 工作薄对象
*/
private
Workbook
wb
;
/**
* 工作表对象
*/
private
Sheet
sheet
;
/**
* 样式列表
*/
private
Map
<
String
,
CellStyle
>
styles
;
/**
* 导入导出数据列表
*/
private
List
<
T
>
list
;
/**
* 注解列表 0为注解 1为属性
*/
private
List
<
Object
[]>
fields
;
/**
* 最大高度
*/
private
short
maxHeight
;
/**
* 统计列表
*/
private
Map
<
Integer
,
Double
>
statistics
=
new
HashMap
<>();
/**
* 数字格式
*/
private
static
final
DecimalFormat
DOUBLE_FORMAT
=
new
DecimalFormat
(
"######0.00"
);
/**
* 实体对象
*/
public
Class
<
T
>
clazz
;
public
DynamicColExcelUtil
(
Class
<
T
>
clazz
)
{
this
.
clazz
=
clazz
;
}
public
void
init
(
List
<
T
>
list
,
String
sheetName
,
List
<
String
>
properties
,
Type
type
)
{
if
(
list
==
null
)
{
list
=
new
ArrayList
<
T
>();
}
this
.
list
=
list
;
this
.
sheetName
=
sheetName
;
this
.
type
=
type
;
createExcelField
(
properties
);
createWorkbook
();
}
public
void
init
(
List
<
T
>
list
,
String
sheetName
,
List
<
String
>
properties
,
List
<
List
<
Map
<
String
,
Object
>>>
dynamicColMaps
,
Type
type
,
Integer
dynamicIndex
)
{
if
(
list
==
null
)
{
list
=
new
ArrayList
<
T
>();
}
this
.
list
=
list
;
this
.
sheetName
=
sheetName
;
this
.
type
=
type
;
createExcelField
(
properties
,
dynamicColMaps
,
dynamicIndex
);
createWorkbook
();
}
/**
* @param list
* @param sheetName
* @param properties
* @param dynamicColMaps
* @param type
*/
public
void
init
(
List
<
T
>
list
,
String
sheetName
,
List
<
String
>
properties
,
List
<
List
<
Map
<
String
,
Object
>>>
dynamicColMaps
,
Type
type
,
String
Order
)
{
if
(
list
==
null
)
{
list
=
new
ArrayList
<
T
>();
}
this
.
list
=
list
;
this
.
sheetName
=
sheetName
;
this
.
type
=
type
;
createExcelField
(
properties
,
dynamicColMaps
,
null
);
createWorkbook
();
}
/**
* 对excel表单默认第一个索引名转换成list
*
* @param is 输入流
* @return 转换后集合
*/
public
List
<
T
>
importExcel
(
InputStream
is
)
throws
Exception
{
return
importExcel
(
StringUtils
.
EMPTY
,
is
,
0
,
1
);
}
public
List
<
T
>
importExcel
(
InputStream
is
,
Integer
headereRow
,
Integer
dataRow
)
throws
Exception
{
return
importExcel
(
StringUtils
.
EMPTY
,
is
,
headereRow
,
dataRow
);
}
/**
* 对excel表单指定表格索引名转换成list
*
* @param sheetName 表格索引名
* @param is 输入流
* @return 转换后集合
*/
public
List
<
T
>
importExcel
(
String
sheetName
,
InputStream
is
,
Integer
headereRow
,
Integer
dataRow
)
throws
Exception
{
this
.
type
=
Type
.
IMPORT
;
this
.
wb
=
WorkbookFactory
.
create
(
is
);
List
<
T
>
list
=
new
ArrayList
<
T
>();
Sheet
sheet
=
null
;
if
(
StringUtils
.
isNotEmpty
(
sheetName
))
{
// 如果指定sheet名,则取指定sheet中的内容.
sheet
=
wb
.
getSheet
(
sheetName
);
}
else
{
// 如果传入的sheet名不存在则默认指向第1个sheet.
sheet
=
wb
.
getSheetAt
(
0
);
}
if
(
sheet
==
null
)
{
throw
new
IOException
(
"文件sheet不存在"
);
}
//校验是否存在图片数据
Map
<
String
,
PictureData
>
pictures
=
null
;
if
(
sheet
instanceof
HSSFSheet
)
{
pictures
=
getPictures
((
HSSFSheet
)
sheet
);
}
else
if
(
sheet
instanceof
XSSFSheet
)
{
pictures
=
getPictures
((
XSSFSheet
)
sheet
);
}
int
rows
=
sheet
.
getPhysicalNumberOfRows
();
if
(
rows
>
0
)
{
// 定义一个map用于存放excel列的序号和field.
Map
<
String
,
Integer
>
cellMap
=
new
HashMap
<>();
// 获取表头
Row
heard
=
sheet
.
getRow
(
headereRow
);
for
(
int
i
=
0
;
i
<
heard
.
getPhysicalNumberOfCells
();
i
++)
{
Cell
cell
=
heard
.
getCell
(
i
);
if
(
StringUtils
.
isNotNull
(
cell
))
{
String
value
=
this
.
getCellValue
(
heard
,
i
).
toString
();
cellMap
.
put
(
value
,
i
);
}
else
{
cellMap
.
put
(
null
,
i
);
}
}
// 有数据时才处理 得到类的所有field.
Field
[]
allFields
=
ReflectUtil
.
getFields
(
clazz
);
//Field[] allFields = clazz.getDeclaredFields();
// 定义一个map用于存放列的序号和field.
Map
<
Integer
,
Field
>
fieldsMap
=
new
HashMap
<>();
for
(
int
col
=
0
;
col
<
allFields
.
length
;
col
++)
{
Field
field
=
allFields
[
col
];
Excel
attr
=
field
.
getAnnotation
(
Excel
.
class
);
if
(
attr
!=
null
&&
(
attr
.
type
()
==
Type
.
ALL
||
attr
.
type
()
==
type
))
{
// 设置类的私有字段属性可访问.
field
.
setAccessible
(
true
);
Integer
column
=
cellMap
.
get
(
attr
.
name
());
if
(
column
!=
null
)
{
fieldsMap
.
put
(
column
,
field
);
}
}
}
for
(
int
i
=
dataRow
;
i
<
rows
;
i
++)
{
// 从第2行开始取数据,默认第一行是表头.
Row
row
=
sheet
.
getRow
(
i
);
T
entity
=
clazz
.
newInstance
();
entity
.
initAttrValue
();
for
(
Map
.
Entry
<
Integer
,
Field
>
entry
:
fieldsMap
.
entrySet
())
{
Object
val
=
this
.
getCellValue
(
row
,
entry
.
getKey
());
// entity =clazz.newInstance();
// entity.initAttrValue();
// 从map中得到对应列的field.
Field
field
=
fieldsMap
.
get
(
entry
.
getKey
());
// 取得属性类型,并根据对象类型设置值.
Class
<?>
fieldType
=
field
.
getType
();
//属性字段为字符串
if
(
String
.
class
==
fieldType
)
{
String
s
=
Convert
.
toStr
(
val
);
if
(
StringUtils
.
endsWith
(
s
,
".0"
))
{
val
=
StringUtils
.
substringBefore
(
s
,
".0"
);
}
else
{
String
dateFormat
=
field
.
getAnnotation
(
Excel
.
class
).
dateFormat
();
if
(
StringUtils
.
isNotEmpty
(
dateFormat
))
{
val
=
DateUtils
.
getDateTimeStr
((
Date
)
val
,
dateFormat
);
}
else
{
val
=
Convert
.
toStr
(
val
);
}
}
}
else
if
((
Integer
.
TYPE
==
fieldType
||
Integer
.
class
==
fieldType
)
&&
StringUtils
.
isNumeric
(
Convert
.
toStr
(
val
)))
{
//属性为整形
val
=
Convert
.
toInt
(
val
);
}
else
if
(
Long
.
TYPE
==
fieldType
||
Long
.
class
==
fieldType
)
{
//上传的值为字符串,转String 后面字典匹配属性
if
(
val
instanceof
String
)
{
val
=
Convert
.
toStr
(
val
);
}
else
if
(
val
instanceof
Long
)
{
val
=
Convert
.
toLong
(
val
);
}
}
else
if
(
Double
.
TYPE
==
fieldType
||
Double
.
class
==
fieldType
)
{
val
=
Convert
.
toDouble
(
val
);
}
else
if
(
Float
.
TYPE
==
fieldType
||
Float
.
class
==
fieldType
)
{
val
=
Convert
.
toFloat
(
val
);
}
else
if
(
BigDecimal
.
class
==
fieldType
)
{
val
=
Convert
.
toBigDecimal
(
val
);
}
else
if
(
Date
.
class
==
fieldType
)
{
//上传的值为字符串,转data参数
if
(
val
instanceof
String
)
{
val
=
DateUtils
.
StrToDateTime
(
val
.
toString
());
}
else
if
(
val
instanceof
Double
)
{
val
=
DateUtil
.
getJavaDate
((
Double
)
val
);
}
}
else
if
(
Boolean
.
TYPE
==
fieldType
||
Boolean
.
class
==
fieldType
)
{
val
=
Convert
.
toBool
(
val
,
false
);
}
else
if
(
PictureData
.
class
==
fieldType
)
{
//属性类型为pic图片数据,通过picmap找到行列并赋值val,
if
(
pictures
!=
null
)
{
val
=
pictures
.
get
((
row
.
getRowNum
()
-
headereRow
)
+
"-"
+
entry
.
getKey
());
}
}
if
(
StringUtils
.
isNotNull
(
fieldType
))
{
//获取注解标签
Excel
attr
=
field
.
getAnnotation
(
Excel
.
class
);
//获取属性名称
String
propertyName
=
field
.
getName
();
if
(
StringUtils
.
isNotEmpty
(
attr
.
targetAttr
()))
{
//属性为对象,如dept.deptName.导出多级属性
propertyName
=
field
.
getName
()
+
"."
+
attr
.
targetAttr
();
}
else
if
(
StringUtils
.
isNotEmpty
(
attr
.
cacheDict
()))
{
String
cacheDictStr
=
attr
.
cacheDict
();
Map
<
String
,
String
>
dictMap
=
DictUtils
.
getDictMap
(
cacheDictStr
);
//dictMap. 通过value 找key
final
String
value
=
Convert
.
toStr
(
val
);
val
=
dictMap
.
entrySet
().
stream
()
.
filter
(
entry1
->
value
.
equals
(
entry1
.
getValue
()))
.
map
(
Map
.
Entry
::
getKey
)
.
findFirst
()
.
orElseGet
(()
->
""
);
}
else
if
(
StringUtils
.
isNotEmpty
(
attr
.
readConverterExp
()))
{
//反射字典
val
=
reverseByExp
(
Convert
.
toStr
(
val
),
attr
.
readConverterExp
(),
attr
.
separator
());
}
else
if
(
StringUtils
.
isNotEmpty
(
attr
.
dictType
()))
{
//todo,通过字典key值获取字典值
val
=
reverseDictByExp
(
Convert
.
toStr
(
val
),
attr
.
dictType
(),
attr
.
separator
());
}
//反射设值
//ReflectUtil.setFieldValue(entity,field,val);
ReflectUtils
.
invokeSetter
(
entity
,
propertyName
,
val
);
}
}
if
(!
ObjectUtils
.
isEmpty
(
entity
))
{
list
.
add
(
entity
);
}
}
}
return
list
;
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @return 结果
*/
public
byte
[]
exportExcel
(
List
<
T
>
list
,
String
sheetName
)
{
this
.
init
(
list
,
sheetName
,
null
,
Type
.
EXPORT
);
return
exportExcel
();
}
/**
* 对list数据源将其里面的数据导入到excel表单
* <p>
* properties 过滤存在的属性元素
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @return 结果
*/
public
byte
[]
exportExcel
(
List
<
T
>
list
,
List
<
String
>
properties
,
String
sheetName
)
{
this
.
init
(
list
,
sheetName
,
properties
,
Type
.
EXPORT
);
return
exportExcel
();
}
/**
* 对list数据源将其里面的数据导入到excel表单
* <p>
* properties 过滤存在的属性元素
* dynamicCol 动态列
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param dynamicIndex 动态列插入位置0开始
* @return 结果
*/
public
byte
[]
exportExcel
(
List
<
T
>
list
,
List
<
String
>
properties
,
List
<
List
<
Map
<
String
,
Object
>>>
dynamicColMaps
,
String
sheetName
,
Integer
dynamicIndex
)
{
this
.
init
(
list
,
sheetName
,
properties
,
dynamicColMaps
,
Type
.
EXPORT
,
dynamicIndex
);
return
exportExcel
();
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @param sheetName 工作表的名称
* @return 结果
*/
public
byte
[]
importTemplateExcel
(
String
sheetName
)
{
this
.
init
(
null
,
sheetName
,
null
,
Type
.
IMPORT
);
return
exportExcel
();
}
/**
* 对list数据源将其里面的数据导入到excel表单
*
* @return 结果
*/
public
byte
[]
exportExcel
()
{
ByteArrayOutputStream
out
=
null
;
try
{
// 取出一共有多少个sheet.
double
sheetNo
=
Math
.
ceil
(
list
.
size
()
/
sheetSize
);
for
(
int
index
=
0
;
index
<=
sheetNo
;
index
++)
{
createSheet
(
sheetNo
,
index
);
// 产生一行
Row
row
=
sheet
.
createRow
(
0
);
int
column
=
0
;
// 写入各个字段的列头名称 创建head信息
boolean
createDynamic
=
true
;
for
(
Object
[]
os
:
fields
)
{
if
(
os
[
0
]
instanceof
Integer
)
{
if
(
createDynamic
)
{
//动态列
List
<
Map
<
String
,
Object
>>
dynamicCol
=
(
List
<
Map
<
String
,
Object
>>)
os
[
1
];
for
(
int
i
=
0
;
i
<
dynamicCol
.
size
();
i
++)
{
this
.
createCell
(
dynamicCol
.
get
(
i
),
row
,
column
++);
}
createDynamic
=
false
;
}
}
else
{
Excel
excel
=
(
Excel
)
os
[
1
];
this
.
createCell
(
excel
,
row
,
column
++);
}
}
//填充数据行
if
(
Type
.
EXPORT
.
equals
(
type
))
{
fillExcelData
(
index
,
row
);
addStatisticsRow
();
}
}
out
=
new
ByteArrayOutputStream
();
wb
.
write
(
out
);
return
out
.
toByteArray
();
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel异常:"
+
e
.
getMessage
());
throw
new
AppException
(
"导出Excel失败,请联系管理员!"
);
}
finally
{
if
(
wb
!=
null
)
{
try
{
wb
.
close
();
}
catch
(
IOException
e1
)
{
e1
.
printStackTrace
();
}
}
if
(
out
!=
null
)
{
try
{
out
.
close
();
}
catch
(
IOException
e1
)
{
e1
.
printStackTrace
();
}
}
}
}
/**
* 填充excel数据
*
* @param index 序号
* @param row 单元格行
*/
public
void
fillExcelData
(
int
index
,
Row
row
)
{
int
startNo
=
index
*
sheetSize
;
int
endNo
=
Math
.
min
(
startNo
+
sheetSize
,
list
.
size
());
for
(
int
i
=
startNo
;
i
<
endNo
;
i
++)
{
row
=
sheet
.
createRow
(
i
+
1
-
startNo
);
// 得到导出对象.
T
vo
=
list
.
get
(
i
);
int
column
=
0
;
for
(
Object
[]
os
:
fields
)
{
if
(
os
[
0
]
instanceof
Integer
)
{
//动态列
Integer
num
=
(
Integer
)
os
[
0
];
if
(
num
==
i
)
{
List
<
Map
<
String
,
Object
>>
dynamicCol
=
(
List
<
Map
<
String
,
Object
>>)
os
[
1
];
for
(
int
j
=
0
;
j
<
dynamicCol
.
size
();
j
++)
{
this
.
addCell
(
dynamicCol
.
get
(
j
),
row
,
column
++);
}
}
}
else
{
Field
field
=
(
Field
)
os
[
0
];
Excel
excel
=
(
Excel
)
os
[
1
];
// 设置实体类私有属性可访问
field
.
setAccessible
(
true
);
this
.
addCell
(
excel
,
row
,
vo
,
field
,
column
++);
}
}
}
}
/**
* 创建表格样式
*
* @param wb 工作薄对象
* @return 样式列表
*/
private
Map
<
String
,
CellStyle
>
createStyles
(
Workbook
wb
)
{
// 写入各条记录,每条记录对应excel表中的一行
Map
<
String
,
CellStyle
>
styles
=
new
HashMap
<>();
CellStyle
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
style
.
setBorderRight
(
BorderStyle
.
THIN
);
style
.
setRightBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderLeft
(
BorderStyle
.
THIN
);
style
.
setLeftBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderTop
(
BorderStyle
.
THIN
);
style
.
setTopBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderBottom
(
BorderStyle
.
THIN
);
style
.
setBottomBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
Font
dataFont
=
wb
.
createFont
();
dataFont
.
setFontName
(
"Arial"
);
dataFont
.
setFontHeightInPoints
((
short
)
10
);
style
.
setFont
(
dataFont
);
styles
.
put
(
"data"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
style
.
setFillForegroundColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setFillPattern
(
FillPatternType
.
SOLID_FOREGROUND
);
Font
headerFont
=
wb
.
createFont
();
headerFont
.
setFontName
(
"Arial"
);
headerFont
.
setFontHeightInPoints
((
short
)
10
);
headerFont
.
setBold
(
true
);
headerFont
.
setColor
(
IndexedColors
.
WHITE
.
getIndex
());
style
.
setFont
(
headerFont
);
styles
.
put
(
"header"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
Font
totalFont
=
wb
.
createFont
();
totalFont
.
setFontName
(
"Arial"
);
totalFont
.
setFontHeightInPoints
((
short
)
10
);
style
.
setFont
(
totalFont
);
styles
.
put
(
"total"
,
style
);
//水平靠左
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
HorizontalAlignment
.
LEFT
);
styles
.
put
(
"data1"
,
style
);
//水平居中
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
styles
.
put
(
"data2"
,
style
);
//水平靠右
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
HorizontalAlignment
.
RIGHT
);
styles
.
put
(
"data3"
,
style
);
return
styles
;
}
/**
* 创建单元格
*/
public
Cell
createCell
(
Excel
attr
,
Row
row
,
int
column
)
{
// 创建列
Cell
cell
=
row
.
createCell
(
column
);
// 写入列信息
cell
.
setCellValue
(
attr
.
name
());
//设置列的校验样式,如下拉框,提示等
setDataValidation
(
attr
,
row
,
column
);
cell
.
setCellStyle
(
styles
.
get
(
"header"
));
return
cell
;
}
/**
* 创建单元格
*/
public
Cell
createCell
(
Map
<
String
,
Object
>
map
,
Row
row
,
int
column
)
{
// 创建列
Cell
cell
=
row
.
createCell
(
column
);
// 写入列信息
String
name
=
(
String
)
map
.
get
(
"name"
);
sheet
.
setColumnWidth
(
column
,
(
int
)
((
16
+
0.72
)
*
256
));
cell
.
setCellValue
(
name
);
cell
.
setCellStyle
(
styles
.
get
(
"header"
));
return
cell
;
}
/**
* 设置单元格信息
*
* @param value 单元格值
* @param attr 注解相关
* @param cell 单元格信息
*/
public
void
setCellVo
(
Object
value
,
Excel
attr
,
Cell
cell
)
{
if
(
ColumnType
.
STRING
==
attr
.
cellType
())
{
cell
.
setCellValue
(
StringUtils
.
isNull
(
value
)
?
attr
.
defaultValue
()
:
value
+
attr
.
suffix
());
}
else
if
(
ColumnType
.
NUMERIC
==
attr
.
cellType
())
{
cell
.
setCellValue
(
StringUtils
.
contains
(
Convert
.
toStr
(
value
),
"."
)
?
Convert
.
toDouble
(
value
)
:
Convert
.
toInt
(
value
));
}
else
if
(
ColumnType
.
IMAGE
==
attr
.
cellType
())
{
ClientAnchor
anchor
=
new
XSSFClientAnchor
(
0
,
0
,
0
,
0
,
(
short
)
cell
.
getColumnIndex
(),
cell
.
getRow
().
getRowNum
(),
(
short
)
(
cell
.
getColumnIndex
()
+
1
),
cell
.
getRow
().
getRowNum
()
+
1
);
//相对路径
String
imagePath
=
Convert
.
toStr
(
value
);
if
(
StringUtils
.
isNotEmpty
(
imagePath
))
{
byte
[]
data
=
ImageUtils
.
getImage
(
imagePath
);
getDrawingPatriarch
(
cell
.
getSheet
()).
createPicture
(
anchor
,
cell
.
getSheet
().
getWorkbook
().
addPicture
(
data
,
getImageType
(
data
)));
}
}
}
/**
* 获取画布
*/
public
static
Drawing
<?>
getDrawingPatriarch
(
Sheet
sheet
)
{
if
(
sheet
.
getDrawingPatriarch
()
==
null
)
{
sheet
.
createDrawingPatriarch
();
}
return
sheet
.
getDrawingPatriarch
();
}
/**
* 获取图片类型,设置图片插入类型
*/
public
int
getImageType
(
byte
[]
value
)
{
String
type
=
FileTypeUtils
.
getFileExtendName
(
value
);
if
(
"JPG"
.
equalsIgnoreCase
(
type
))
{
return
Workbook
.
PICTURE_TYPE_JPEG
;
}
else
if
(
"PNG"
.
equalsIgnoreCase
(
type
))
{
return
Workbook
.
PICTURE_TYPE_PNG
;
}
return
Workbook
.
PICTURE_TYPE_JPEG
;
}
/**
* 创建表格样式
*/
public
void
setDataValidation
(
Excel
attr
,
Row
row
,
int
column
)
{
if
(
attr
.
name
().
indexOf
(
"注:"
)
>=
0
)
{
sheet
.
setColumnWidth
(
column
,
6000
);
}
else
{
// 设置列宽
sheet
.
setColumnWidth
(
column
,
(
int
)
((
attr
.
width
()
+
0.72
)
*
256
));
}
// 如果设置了提示信息则鼠标放上去提示.
if
(
StringUtils
.
isNotEmpty
(
attr
.
prompt
()))
{
// 这里默认设了2-101行提示.
setXSSFPrompt
(
sheet
,
""
,
attr
.
prompt
(),
1
,
100
,
column
,
column
);
}
//这里设置缓存中读取的下拉列表
if
(
StringUtils
.
isNotEmpty
(
attr
.
cacheDict
()))
{
// TODO: 2022/7/7 这里默认设了2-101列只能选择不能输入.
//读取缓存指定值
String
cacheDictStr
=
attr
.
cacheDict
();
Map
<
String
,
String
>
dictMap
=
DictUtils
.
getDictMap
(
cacheDictStr
);
if
(
ObjectUtils
.
isEmpty
(
dictMap
))
{
return
;
}
//设置combo 与readConverterExp
// dictMap.values().stream().toArray(String[]::new);
setXSSFValidation
(
sheet
,
dictMap
.
values
().
stream
().
toArray
(
String
[]::
new
),
1
,
100
,
column
,
column
);
}
else
if
(
attr
.
combo
().
length
>
0
)
{
// 这里默认设了2-101行只能选择不能输入.
setXSSFValidation
(
sheet
,
attr
.
combo
(),
1
,
100
,
column
,
column
);
}
}
/**
* 添加单元格
*/
public
Cell
addCell
(
Excel
attr
,
Row
row
,
T
vo
,
Field
field
,
int
column
)
{
Cell
cell
=
null
;
try
{
// 设置行高
row
.
setHeight
(
maxHeight
);
// 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.
if
(
attr
.
isExport
())
{
// 创建cell
cell
=
row
.
createCell
(
column
);
int
align
=
attr
.
align
().
value
();
cell
.
setCellStyle
(
styles
.
get
(
"data"
+
(
align
>=
1
&&
align
<=
3
?
align
:
""
)));
// 用于读取对象中的属性
Object
value
=
getTargetValue
(
vo
,
field
,
attr
);
String
dateFormat
=
attr
.
dateFormat
();
String
readConverterExp
=
attr
.
readConverterExp
();
String
separator
=
attr
.
separator
();
String
dictType
=
attr
.
dictType
();
if
(
StringUtils
.
isNotEmpty
(
dateFormat
)
&&
StringUtils
.
isNotNull
(
value
))
{
cell
.
setCellValue
(
DateUtils
.
convertTime2Str
(((
Date
)
value
).
getTime
(),
dateFormat
));
}
else
if
(
StringUtils
.
isNotEmpty
(
readConverterExp
)
&&
StringUtils
.
isNotNull
(
value
))
{
cell
.
setCellValue
(
convertByExp
(
Convert
.
toStr
(
value
),
readConverterExp
,
separator
));
}
else
if
(
StringUtils
.
isNotEmpty
(
dictType
)
&&
StringUtils
.
isNotNull
(
value
))
{
cell
.
setCellValue
(
convertDictByExp
(
Convert
.
toStr
(
value
),
dictType
,
separator
));
}
else
if
(
value
instanceof
BigDecimal
&&
-
1
!=
attr
.
scale
())
{
if
(
attr
.
percentEnabled
())
{
BigDecimal
bigValue
=
(
BigDecimal
)
value
;
cell
.
setCellValue
(
ObjectUtils
.
isEmpty
(
value
)
?
attr
.
defaultValue
()
:
((
bigValue
).
multiply
(
new
BigDecimal
(
100
)).
setScale
(
attr
.
scale
(),
attr
.
roundingMode
())).
toString
()
+
attr
.
suffix
());
}
else
{
cell
.
setCellValue
((((
BigDecimal
)
value
).
setScale
(
attr
.
scale
(),
attr
.
roundingMode
())).
toString
());
}
}
else
{
// 设置列类型
setCellVo
(
value
,
attr
,
cell
);
}
addStatisticsData
(
column
,
Convert
.
toStr
(
value
),
attr
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel失败{}"
,
e
);
}
return
cell
;
}
/**
* 添加单元格
*/
public
Cell
addCell
(
Map
<
String
,
Object
>
map
,
Row
row
,
int
column
)
{
Cell
cell
=
null
;
try
{
// 创建cell
cell
=
row
.
createCell
(
column
);
int
align
=
2
;
cell
.
setCellStyle
(
styles
.
get
(
"data"
+
(
align
>=
1
&&
align
<=
3
?
align
:
""
)));
// 用于读取对象中的属性
Object
value
=
map
.
get
(
"value"
);
cell
.
setCellValue
(
StringUtils
.
isNull
(
value
)
?
""
:
value
.
toString
());
}
catch
(
Exception
e
)
{
log
.
error
(
"导出Excel失败{}"
,
e
);
}
return
cell
;
}
/**
* 设置 POI XSSFSheet 单元格提示
*
* @param sheet 表单
* @param promptTitle 提示标题
* @param promptContent 提示内容
* @param firstRow 开始行
* @param endRow 结束行
* @param firstCol 开始列
* @param endCol 结束列
*/
public
void
setXSSFPrompt
(
Sheet
sheet
,
String
promptTitle
,
String
promptContent
,
int
firstRow
,
int
endRow
,
int
firstCol
,
int
endCol
)
{
DataValidationHelper
helper
=
sheet
.
getDataValidationHelper
();
DataValidationConstraint
constraint
=
helper
.
createCustomConstraint
(
"DD1"
);
CellRangeAddressList
regions
=
new
CellRangeAddressList
(
firstRow
,
endRow
,
firstCol
,
endCol
);
DataValidation
dataValidation
=
helper
.
createValidation
(
constraint
,
regions
);
dataValidation
.
createPromptBox
(
promptTitle
,
promptContent
);
dataValidation
.
setShowPromptBox
(
true
);
sheet
.
addValidationData
(
dataValidation
);
}
/**
* 设置某些列的值只能输入预制的数据,显示下拉框.
*
* @param sheet 要设置的sheet.
* @param textlist 下拉框显示的内容
* @param firstRow 开始行
* @param endRow 结束行
* @param firstCol 开始列
* @param endCol 结束列
* @return 设置好的sheet.
*/
public
void
setXSSFValidation
(
Sheet
sheet
,
String
[]
textlist
,
int
firstRow
,
int
endRow
,
int
firstCol
,
int
endCol
)
{
DataValidationHelper
helper
=
sheet
.
getDataValidationHelper
();
// 加载下拉列表内容
DataValidationConstraint
constraint
=
helper
.
createExplicitListConstraint
(
textlist
);
// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
CellRangeAddressList
regions
=
new
CellRangeAddressList
(
firstRow
,
endRow
,
firstCol
,
endCol
);
// 数据有效性对象
DataValidation
dataValidation
=
helper
.
createValidation
(
constraint
,
regions
);
// 处理Excel兼容性问题
if
(
dataValidation
instanceof
XSSFDataValidation
)
{
dataValidation
.
setSuppressDropDownArrow
(
true
);
dataValidation
.
setShowErrorBox
(
true
);
}
else
{
dataValidation
.
setSuppressDropDownArrow
(
false
);
}
sheet
.
addValidationData
(
dataValidation
);
}
/**
* 解析导出值 0=男,1=女,2=未知
*
* @param propertyValue 参数值
* @param converterExp 翻译注解
* @param separator 分隔符
* @return 解析后值
*/
public
static
String
convertByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
{
StringBuilder
propertyString
=
new
StringBuilder
();
String
[]
convertSource
=
converterExp
.
split
(
","
);
for
(
String
item
:
convertSource
)
{
String
[]
itemArray
=
item
.
split
(
"="
);
if
(
StringUtils
.
containsAny
(
separator
,
propertyValue
))
{
for
(
String
value
:
propertyValue
.
split
(
separator
))
{
if
(
itemArray
[
0
].
equals
(
value
))
{
propertyString
.
append
(
itemArray
[
1
]
+
separator
);
break
;
}
}
}
else
{
if
(
itemArray
[
0
].
equals
(
propertyValue
))
{
return
itemArray
[
1
];
}
}
}
return
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
separator
);
}
/**
* 反向解析值 男=0,女=1,未知=2
*
* @param propertyValue 参数值
* @param converterExp 翻译注解
* @param separator 分隔符
* @return 解析后值
*/
public
static
String
reverseByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
{
StringBuilder
propertyString
=
new
StringBuilder
();
String
[]
convertSource
=
converterExp
.
split
(
","
);
for
(
String
item
:
convertSource
)
{
String
[]
itemArray
=
item
.
split
(
"="
);
if
(
StringUtils
.
containsAny
(
separator
,
propertyValue
))
{
for
(
String
value
:
propertyValue
.
split
(
separator
))
{
if
(
itemArray
[
1
].
equals
(
value
))
{
propertyString
.
append
(
itemArray
[
0
]
+
separator
);
break
;
}
}
}
else
{
if
(
itemArray
[
1
].
equals
(
propertyValue
))
{
return
itemArray
[
0
];
}
}
}
return
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
separator
);
}
/**
* 解析字典值
*
* @param dictValue 字典值
* @param dictType 字典类型
* @param separator 分隔符
* @return 字典标签
*/
public
static
String
convertDictByExp
(
String
dictValue
,
String
dictType
,
String
separator
)
{
return
null
;
//return DictUtils.getDictLabel(dictType, dictValue, separator);
}
/**
* 反向解析值字典值
*
* @param dictLabel 字典标签
* @param dictType 字典类型
* @param separator 分隔符
* @return 字典值
*/
public
static
String
reverseDictByExp
(
String
dictLabel
,
String
dictType
,
String
separator
)
{
return
DictUtils
.
getDictValue
(
dictType
,
dictLabel
,
separator
);
}
/**
* 合计统计信息
*/
private
void
addStatisticsData
(
Integer
index
,
String
text
,
Excel
entity
)
{
if
(
entity
!=
null
&&
entity
.
isStatistics
())
{
Double
temp
=
0
D
;
if
(!
statistics
.
containsKey
(
index
))
{
statistics
.
put
(
index
,
temp
);
}
try
{
temp
=
Double
.
valueOf
(
text
);
}
catch
(
NumberFormatException
e
)
{
}
statistics
.
put
(
index
,
statistics
.
get
(
index
)
+
temp
);
}
}
/**
* 创建统计行
*/
public
void
addStatisticsRow
()
{
if
(
statistics
.
size
()
>
0
)
{
Cell
cell
=
null
;
Row
row
=
sheet
.
createRow
(
sheet
.
getLastRowNum
()
+
1
);
Set
<
Integer
>
keys
=
statistics
.
keySet
();
cell
=
row
.
createCell
(
0
);
cell
.
setCellStyle
(
styles
.
get
(
"total"
));
cell
.
setCellValue
(
"合计"
);
for
(
Integer
key
:
keys
)
{
cell
=
row
.
createCell
(
key
);
cell
.
setCellStyle
(
styles
.
get
(
"total"
));
cell
.
setCellValue
(
DOUBLE_FORMAT
.
format
(
statistics
.
get
(
key
)));
}
statistics
.
clear
();
}
}
/**
* 编码文件名
*/
public
String
encodingFilename
(
String
filename
)
{
filename
=
UUID
.
randomUUID
().
toString
()
+
"_"
+
filename
+
".xlsx"
;
return
filename
;
}
/**
* 获取下载路径
*
* @param filename 文件名称
*/
public
String
getAbsoluteFile
(
String
filename
)
{
//todo
return
null
;
// String downloadPath = RuoYiConfig.getDownloadPath() + filename;
// File desc = new File(downloadPath);
// if (!desc.getParentFile().exists()) {
// desc.getParentFile().mkdirs();
// }
// return downloadPath;
}
/**
* 获取bean中的属性值
*
* @param vo 实体对象
* @param field 字段
* @param excel 注解
* @return 最终的属性值
* @throws Exception
*/
private
Object
getTargetValue
(
T
vo
,
Field
field
,
Excel
excel
)
throws
Exception
{
Object
o
=
field
.
get
(
vo
);
if
(
StringUtils
.
isNotEmpty
(
excel
.
targetAttr
()))
{
String
target
=
excel
.
targetAttr
();
if
(
target
.
indexOf
(
"."
)
>
-
1
)
{
String
[]
targets
=
target
.
split
(
"[.]"
);
for
(
String
name
:
targets
)
{
o
=
getValue
(
o
,
name
);
}
}
else
{
o
=
getValue
(
o
,
target
);
}
}
return
o
;
}
/**
* 以类的属性的get方法方法形式获取值
*
* @param o
* @param name
* @return value
* @throws Exception
*/
private
Object
getValue
(
Object
o
,
String
name
)
throws
Exception
{
if
(
StringUtils
.
isNotNull
(
o
)
&&
StringUtils
.
isNotEmpty
(
name
))
{
Class
<?>
clazz
=
o
.
getClass
();
Field
field
=
clazz
.
getDeclaredField
(
name
);
field
.
setAccessible
(
true
);
o
=
field
.
get
(
o
);
}
return
o
;
}
/**
* 反射属性得到所有定义字段
*/
private
void
createExcelField
(
List
<
String
>
properties
)
{
this
.
fields
=
new
ArrayList
<>();
List
<
Field
>
tempFields
=
new
ArrayList
<>();
//反射对象,获取改对象所有属性名称
tempFields
.
addAll
(
Arrays
.
asList
(
ReflectUtil
.
getFields
(
clazz
)));
for
(
Field
field
:
tempFields
)
{
// 单注解
if
(
field
.
isAnnotationPresent
(
Excel
.
class
))
{
Excel
column
=
field
.
getAnnotation
(
Excel
.
class
);
if
(
ObjectUtils
.
isEmpty
(
properties
))
{
putToField
(
field
,
column
);
}
else
{
//column
// if (column != null && properties.contains(column.name())) {
if
(
column
!=
null
&&
properties
.
contains
(
field
.
getName
()))
{
putToField
(
field
,
column
);
}
}
}
// 多注解
if
(
field
.
isAnnotationPresent
(
Excels
.
class
))
{
Excels
attrs
=
field
.
getAnnotation
(
Excels
.
class
);
Excel
[]
excels
=
attrs
.
value
();
for
(
Excel
excel
:
excels
)
{
if
(
ObjectUtils
.
isEmpty
(
properties
))
{
putToField
(
field
,
excel
);
}
else
{
// if (excel != null && properties.contains(excel.name())) {
if
(
excel
!=
null
&&
properties
.
contains
(
field
.
getName
()))
{
putToField
(
field
,
excel
);
}
}
}
}
}
//通过sort参数排序
this
.
fields
=
this
.
fields
.
stream
().
sorted
(
Comparator
.
comparing
(
objects
->
((
Excel
)
objects
[
1
]).
sort
())).
collect
(
Collectors
.
toList
());
this
.
maxHeight
=
getRowHeight
();
}
/**
* 反射属性得到所有定义字段
*/
private
void
createExcelField
(
List
<
String
>
properties
,
List
<
List
<
Map
<
String
,
Object
>>>
dynamicColMaps
,
Integer
dynamicIndex
)
{
this
.
fields
=
new
ArrayList
<>();
List
<
Field
>
tempFields
=
new
ArrayList
<>();
//反射对象,获取改对象所有属性名称
tempFields
.
addAll
(
Arrays
.
asList
(
ReflectUtil
.
getFields
(
clazz
)));
for
(
Field
field
:
tempFields
)
{
// 单注解
if
(
field
.
isAnnotationPresent
(
Excel
.
class
))
{
Excel
column
=
field
.
getAnnotation
(
Excel
.
class
);
if
(
ObjectUtils
.
isEmpty
(
properties
))
{
putToField
(
field
,
column
);
}
else
{
//column
if
(
column
!=
null
&&
properties
.
contains
(
field
.
getName
()))
{
putToField
(
field
,
column
);
}
}
}
// 多注解
if
(
field
.
isAnnotationPresent
(
Excels
.
class
))
{
Excels
attrs
=
field
.
getAnnotation
(
Excels
.
class
);
Excel
[]
excels
=
attrs
.
value
();
for
(
Excel
excel
:
excels
)
{
if
(
ObjectUtils
.
isEmpty
(
properties
))
{
putToField
(
field
,
excel
);
}
else
{
if
(
excel
!=
null
&&
properties
.
contains
(
field
.
getName
()))
{
putToField
(
field
,
excel
);
}
}
}
}
}
//通过sort参数排序
this
.
fields
=
this
.
fields
.
stream
().
sorted
(
Comparator
.
comparing
(
objects
->
((
Excel
)
objects
[
1
]).
sort
())).
collect
(
Collectors
.
toList
());
this
.
maxHeight
=
getRowHeight
();
// [[{"name":"08-01","value":"1"},{"name":"08-02","value":"2"},...],[...]]
if
(!
ObjectUtils
.
isEmpty
(
dynamicColMaps
))
{
if
(
dynamicIndex
!=
null
){
for
(
int
i
=
0
;
i
<
dynamicColMaps
.
size
();
i
++)
{
this
.
fields
.
add
(
dynamicIndex
+
i
,
new
Object
[]{
i
,
dynamicColMaps
.
get
(
i
)});
}
}
else
{
for
(
int
i
=
0
;
i
<
dynamicColMaps
.
size
();
i
++)
{
this
.
fields
.
add
(
new
Object
[]{
i
,
dynamicColMaps
.
get
(
i
)});
}
}
}
}
/**
* 根据注解获取最大行高
*/
public
short
getRowHeight
()
{
double
maxHeight
=
0
;
for
(
Object
[]
os
:
this
.
fields
)
{
Excel
excel
=
(
Excel
)
os
[
1
];
maxHeight
=
maxHeight
>
excel
.
height
()
?
maxHeight
:
excel
.
height
();
}
return
(
short
)
(
maxHeight
*
20
);
}
/**
* 放到字段集合中
*/
private
void
putToField
(
Field
field
,
Excel
attr
)
{
if
(
attr
!=
null
&&
(
attr
.
type
()
==
Type
.
ALL
||
attr
.
type
()
==
type
))
{
this
.
fields
.
add
(
new
Object
[]{
field
,
attr
});
}
}
/**
* 创建一个工作簿
*/
public
void
createWorkbook
()
{
this
.
wb
=
new
SXSSFWorkbook
(
500
);
}
/**
* 创建工作表
*
* @param sheetNo sheet数量
* @param index 序号
*/
public
void
createSheet
(
double
sheetNo
,
int
index
)
{
this
.
sheet
=
wb
.
createSheet
();
//初始化表格样式
this
.
styles
=
createStyles
(
wb
);
// 设置工作表的名称.
if
(
sheetNo
==
0
)
{
wb
.
setSheetName
(
index
,
sheetName
);
}
else
{
wb
.
setSheetName
(
index
,
sheetName
+
index
);
}
}
/**
* 获取单元格值
*
* @param row 获取的行
* @param column 获取单元格列号
* @return 单元格值
*/
public
Object
getCellValue
(
Row
row
,
int
column
)
{
if
(
row
==
null
)
{
return
row
;
}
Object
val
=
""
;
try
{
Cell
cell
=
row
.
getCell
(
column
);
if
(
StringUtils
.
isNotNull
(
cell
))
{
if
(
cell
.
getCellType
()
==
CellType
.
NUMERIC
||
cell
.
getCellType
()
==
CellType
.
FORMULA
)
{
val
=
cell
.
getNumericCellValue
();
if
(
DateUtil
.
isCellDateFormatted
(
cell
))
{
val
=
DateUtil
.
getJavaDate
((
Double
)
val
);
// POI Excel 日期格式转换
}
else
{
if
((
Double
)
val
%
1
!=
0
)
{
val
=
new
BigDecimal
(
val
.
toString
());
}
else
{
val
=
new
DecimalFormat
(
"0"
).
format
(
val
);
}
}
}
else
if
(
cell
.
getCellType
()
==
CellType
.
STRING
)
{
val
=
cell
.
getStringCellValue
();
}
else
if
(
cell
.
getCellType
()
==
CellType
.
BOOLEAN
)
{
val
=
cell
.
getBooleanCellValue
();
}
else
if
(
cell
.
getCellType
()
==
CellType
.
ERROR
)
{
val
=
cell
.
getErrorCellValue
();
}
}
}
catch
(
Exception
e
)
{
return
val
;
}
return
val
;
}
/**
* 获取图片和位置 (xls)
*
* @param sheet
* @return
* @throws IOException
*/
public
Map
<
String
,
PictureData
>
getPictures
(
HSSFSheet
sheet
)
{
Map
<
String
,
PictureData
>
map
=
new
HashMap
<>();
if
(
sheet
.
getDrawingPatriarch
()
==
null
)
{
return
null
;
}
List
<
HSSFShape
>
list
=
sheet
.
getDrawingPatriarch
().
getChildren
();
for
(
HSSFShape
shape
:
list
)
{
if
(
shape
instanceof
HSSFPicture
)
{
HSSFPicture
picture
=
(
HSSFPicture
)
shape
;
HSSFClientAnchor
cAnchor
=
(
HSSFClientAnchor
)
picture
.
getAnchor
();
HSSFPictureData
pdata
=
picture
.
getPictureData
();
String
key
=
cAnchor
.
getRow1
()
+
"-"
+
cAnchor
.
getCol1
();
// 行号-列号
map
.
put
(
key
,
pdata
);
}
}
return
map
;
}
/**
* 获取图片和位置 (xlsx)
* <p>
* key值为"行-列"
*
* @param sheet
* @return
* @throws IOException
*/
public
Map
<
String
,
PictureData
>
getPictures
(
XSSFSheet
sheet
)
{
Map
<
String
,
PictureData
>
map
=
new
HashMap
<>();
List
<
POIXMLDocumentPart
>
list
=
sheet
.
getRelations
();
for
(
POIXMLDocumentPart
part
:
list
)
{
if
(
part
instanceof
XSSFDrawing
)
{
XSSFDrawing
drawing
=
(
XSSFDrawing
)
part
;
List
<
XSSFShape
>
shapes
=
drawing
.
getShapes
();
for
(
XSSFShape
shape
:
shapes
)
{
XSSFPicture
picture
=
(
XSSFPicture
)
shape
;
XSSFClientAnchor
anchor
=
picture
.
getPreferredSize
();
CTMarker
marker
=
anchor
.
getFrom
();
String
key
=
marker
.
getRow
()
+
"-"
+
marker
.
getCol
();
map
.
put
(
key
,
picture
.
getPictureData
());
}
}
}
return
map
;
}
}
attendance-performance-manager/src/main/java/com/mortals/xhx/module/attendance/web/AttendanceStatController.java
View file @
3a44e978
...
@@ -17,6 +17,7 @@ import com.mortals.framework.utils.ReflectUtils;
...
@@ -17,6 +17,7 @@ import com.mortals.framework.utils.ReflectUtils;
import
com.mortals.framework.utils.poi.ExcelUtil
;
import
com.mortals.framework.utils.poi.ExcelUtil
;
import
com.mortals.framework.web.BaseCRUDJsonBodyMappingController
;
import
com.mortals.framework.web.BaseCRUDJsonBodyMappingController
;
import
com.mortals.xhx.base.system.param.service.ParamService
;
import
com.mortals.xhx.base.system.param.service.ParamService
;
import
com.mortals.xhx.common.utils.DynamicColExcelUtil
;
import
com.mortals.xhx.module.attendance.model.AttendanceClassQuery
;
import
com.mortals.xhx.module.attendance.model.AttendanceClassQuery
;
import
com.mortals.xhx.module.attendance.model.AttendanceGroupQuery
;
import
com.mortals.xhx.module.attendance.model.AttendanceGroupQuery
;
import
com.mortals.xhx.module.attendance.model.AttendanceStaffStatEntity
;
import
com.mortals.xhx.module.attendance.model.AttendanceStaffStatEntity
;
...
@@ -41,6 +42,7 @@ import com.mortals.xhx.module.attendance.service.AttendanceStatService;
...
@@ -41,6 +42,7 @@ import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import
org.apache.commons.lang3.ArrayUtils
;
import
org.apache.commons.lang3.ArrayUtils
;
import
com.mortals.framework.util.StringUtils
;
import
com.mortals.framework.util.StringUtils
;
import
java.math.BigDecimal
;
import
java.text.DateFormat
;
import
java.text.DateFormat
;
import
java.time.LocalDate
;
import
java.time.LocalDate
;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatter
;
...
@@ -200,7 +202,7 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
...
@@ -200,7 +202,7 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
PageInfo
pageInfo
=
new
PageInfo
(-
1
);
PageInfo
pageInfo
=
new
PageInfo
(-
1
);
List
<
AttendanceStatEntity
>
list
=
this
.
getService
().
findExt
(
query
,
pageInfo
,
context
).
getList
();
List
<
AttendanceStatEntity
>
list
=
this
.
getService
().
findExt
(
query
,
pageInfo
,
context
).
getList
();
Class
<
AttendanceStatEntity
>
tClass
=
ReflectUtils
.
getClassGenricType
(
this
.
getClass
(),
1
);
Class
<
AttendanceStatEntity
>
tClass
=
ReflectUtils
.
getClassGenricType
(
this
.
getClass
(),
1
);
ExcelUtil
<
AttendanceStatEntity
,
Long
>
util
=
new
ExcelUtil
(
tClass
);
DynamicColExcelUtil
<
AttendanceStatEntity
,
Long
>
util
=
new
DynamicCol
ExcelUtil
(
tClass
);
this
.
doExportAfter
(
context
,
list
);
this
.
doExportAfter
(
context
,
list
);
DateTime
startDate
=
DateUtil
.
parse
(
query
.
getSummaryTimeStart
());
DateTime
startDate
=
DateUtil
.
parse
(
query
.
getSummaryTimeStart
());
DateTime
endDate
=
DateUtil
.
parse
(
query
.
getSummaryTimeEnd
());
DateTime
endDate
=
DateUtil
.
parse
(
query
.
getSummaryTimeEnd
());
...
@@ -210,7 +212,7 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
...
@@ -210,7 +212,7 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
final
String
[]
weekStr
={
"星期日"
,
"星期一"
,
"星期二"
,
"星期三"
,
"星期四"
,
"星期五"
,
"星期六"
};
final
String
[]
weekStr
={
"星期日"
,
"星期一"
,
"星期二"
,
"星期三"
,
"星期四"
,
"星期五"
,
"星期六"
};
//由于1表示周日,2表示周一所以需要-1后对应上数组下标
//由于1表示周日,2表示周一所以需要-1后对应上数组下标
List
<
List
<
Map
<
String
,
Object
>>>
lists
=
list
.
stream
().
map
(
item
->
{
List
<
List
<
Map
<
String
,
Object
>>>
lists
=
list
.
stream
().
map
(
item
->
{
attendanceStatExport
(
item
);
List
<
AttendanceStaffStatEntity
>
attendanceStaffStatEntities
=
item
.
getAttendanceStaffStatEntities
();
List
<
AttendanceStaffStatEntity
>
attendanceStaffStatEntities
=
item
.
getAttendanceStaffStatEntities
();
Map
<
Integer
,
String
>
collect
=
new
HashMap
<>();
Map
<
Integer
,
String
>
collect
=
new
HashMap
<>();
if
(!
ObjectUtils
.
isEmpty
(
attendanceStaffStatEntities
))
{
if
(!
ObjectUtils
.
isEmpty
(
attendanceStaffStatEntities
))
{
...
@@ -244,7 +246,7 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
...
@@ -244,7 +246,7 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
}).
collect
(
Collectors
.
toList
());
}).
collect
(
Collectors
.
toList
());
// byte[] data = util.exportExcel(list, properties, name);
// byte[] data = util.exportExcel(list, properties, name);
byte
[]
data
=
util
.
exportExcel
(
list
,
properties
,
lists
,
name
);
byte
[]
data
=
util
.
exportExcel
(
list
,
properties
,
lists
,
name
,
6
);
this
.
responseStream
(
this
.
response
,
data
,
fileName
);
this
.
responseStream
(
this
.
response
,
data
,
fileName
);
this
.
recordSysLog
(
this
.
request
,
busiDesc
+
" 【成功】"
);
this
.
recordSysLog
(
this
.
request
,
busiDesc
+
" 【成功】"
);
}
catch
(
Exception
var12
)
{
}
catch
(
Exception
var12
)
{
...
@@ -252,4 +254,98 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
...
@@ -252,4 +254,98 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
}
}
}
}
private
void
attendanceStatExport
(
AttendanceStatEntity
entity
){
if
(
isNull
(
entity
.
getBackToUnit
())){
entity
.
setBackToUnit
(
null
);
}
if
(
isNull
(
entity
.
getOnDutyLeave
())){
entity
.
setOnDutyLeave
(
null
);
}
if
(
isNull
(
entity
.
getOutOfOffice
())){
entity
.
setOutOfOffice
(
null
);
}
if
(
isNull
(
entity
.
getShiftCompensation
())){
entity
.
setShiftCompensation
(
null
);
}
if
(
isNull
(
entity
.
getPhysicalExamination
())){
entity
.
setPhysicalExamination
(
null
);
}
if
(
isNull
(
entity
.
getQuarantine
())){
entity
.
setQuarantine
(
null
);
}
if
(
isNull
(
entity
.
getBusinessTrip
())){
entity
.
setBusinessTrip
(
null
);
}
if
(
isNull
(
entity
.
getPublicHoliday
())){
entity
.
setPublicHoliday
(
null
);
}
if
(
isNull
(
entity
.
getSickLeave
())){
entity
.
setSickLeave
(
null
);
}
if
(
isNull
(
entity
.
getFuneralLeave
())){
entity
.
setFuneralLeave
(
null
);
}
if
(
isNull
(
entity
.
getMarriageLeave
())){
entity
.
setMarriageLeave
(
null
);
}
if
(
isNull
(
entity
.
getChildRearingLeave
())){
entity
.
setChildRearingLeave
(
null
);
}
if
(
isNull
(
entity
.
getMaternityLeave
())){
entity
.
setMaternityLeave
(
null
);
}
if
(
isNull
(
entity
.
getTransferBack
())){
entity
.
setTransferBack
(
null
);
}
if
(
isNull
(
entity
.
getHomeLeave
())){
entity
.
setHomeLeave
(
null
);
}
if
(
isNull
(
entity
.
getPersonalLeave
())){
entity
.
setPersonalLeave
(
null
);
}
if
(
isNull
(
entity
.
getAbsenteeismDays
())){
entity
.
setAbsenteeismDays
(
null
);
}
if
(
isNull
(
entity
.
getOtherDays
())){
entity
.
setOtherDays
(
null
);
}
if
(
isNull
(
entity
.
getNonCompliancePunch
())){
entity
.
setNonCompliancePunch
(
null
);
}
if
(
entity
.
getLateTimes
()!=
null
&&
entity
.
getLateTimes
()==
0
){
entity
.
setLateTimes
(
null
);
}
if
(
entity
.
getSurfingMobileTimes
()!=
null
&&
entity
.
getSurfingMobileTimes
()==
0
){
entity
.
setSurfingMobileTimes
(
null
);
}
if
(
entity
.
getOvertimeTimes
()!=
null
&&
entity
.
getOvertimeTimes
()==
0
){
entity
.
setOvertimeTimes
(
null
);
}
if
(
isNull
(
entity
.
getVacancy
())){
entity
.
setVacancy
(
null
);
}
if
(
entity
.
getNonStandardDressTimes
()!=
null
&&
entity
.
getNonStandardDressTimes
()==
0
){
entity
.
setNonStandardDressTimes
(
null
);
}
if
(
isNull
(
entity
.
getUnexcusedMeetingAbsence
())){
entity
.
setUnexcusedMeetingAbsence
(
null
);
}
if
(
isNull
(
entity
.
getEarlyLeaveMeeting
())){
entity
.
setEarlyLeaveMeeting
(
null
);
}
}
private
boolean
isNull
(
BigDecimal
bigDecimal
){
if
(
ObjectUtils
.
isEmpty
(
bigDecimal
)){
return
true
;
}
else
{
BigDecimal
zero
=
new
BigDecimal
(
"0"
);
if
(
bigDecimal
.
compareTo
(
zero
)
>
0
){
return
false
;
}
else
{
return
true
;
}
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment