Commit 055cc65f authored by 赵啸非's avatar 赵啸非

Merge branch 'master' into reg

# Conflicts:
#	attendance-performance-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthTokenServiceImpl.java
parents d3378530 a8eff47c
...@@ -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;
}, },
......
...@@ -30,6 +30,8 @@ export default { ...@@ -30,6 +30,8 @@ export default {
} else { } else {
delete this.query.createTimeStart; delete this.query.createTimeStart;
delete this.query.createTimeEnd; delete this.query.createTimeEnd;
delete this.query.errorTimeStart;
delete this.query.errorTimeEnd;
} }
} }
this.getData(); this.getData();
......
...@@ -352,6 +352,8 @@ export default { ...@@ -352,6 +352,8 @@ export default {
if (this.form.createTimeMonth) { if (this.form.createTimeMonth) {
this.form.createTimeStart = this.form.createTimeMonth + "-01"; this.form.createTimeStart = this.form.createTimeMonth + "-01";
this.form.createTimeEnd = this.form.createTimeMonth + "-31"; this.form.createTimeEnd = this.form.createTimeMonth + "-31";
this.form.errorTimeStart = this.form.createTimeMonth + "-01";
this.form.errorTimeEnd = this.form.createTimeMonth + "-31";
} else if (this.form.createTimeStart1 || this.form.createTimeEnd1) { } else if (this.form.createTimeStart1 || this.form.createTimeEnd1) {
this.form.createTimeStart = this.form.createTimeStart1; this.form.createTimeStart = this.form.createTimeStart1;
this.form.createTimeEnd = this.form.createTimeEnd1; this.form.createTimeEnd = this.form.createTimeEnd1;
...@@ -412,6 +414,8 @@ export default { ...@@ -412,6 +414,8 @@ export default {
} else { } else {
query.createTimeEnd = undefined; query.createTimeEnd = undefined;
query.createTimeStart = undefined; query.createTimeStart = undefined;
query.errorTimeStart = undefined;
query.errorTimeEnd = undefined;
} }
} }
console.log({ console.log({
......
...@@ -153,7 +153,9 @@ export default { ...@@ -153,7 +153,9 @@ export default {
}; };
addobjArr.push(obj); addobjArr.push(obj);
}); });
this.config.columns = [...this.initalArr, ...addobjArr]; let arr1 = this.initalArr.slice(0, 8);
let arr2 = this.initalArr.slice(8);
this.config.columns = [...arr1, ...addobjArr, ...arr2];
this.$forceUpdate(); this.$forceUpdate();
}, },
beforeRender(row) { beforeRender(row) {
...@@ -287,8 +289,17 @@ export default { ...@@ -287,8 +289,17 @@ export default {
{ label: "员工姓名", prop: "staffName", fixed: "left", width: 100 }, { label: "员工姓名", prop: "staffName", fixed: "left", width: 100 },
{ label: "部门", prop: "deptName" }, { label: "部门", prop: "deptName" },
{ label: "出勤天数", prop: "goTimes", formatter: this.formatter }, { label: "应到", prop: "workDays", formatter: this.formatter },
{ label: "实到", prop: "goTimes", formatter: this.formatter },
{
label: "出勤率%",
prop: "attendanceRate",
formatter: (row) => {
return row.attendanceRate
? (Number(row.attendanceRate) * 100).toFixed(2) + "%"
: "--";
},
},
{ {
label: "缺卡次数", label: "缺卡次数",
prop: "morningTimes", prop: "morningTimes",
...@@ -341,16 +352,6 @@ export default { ...@@ -341,16 +352,6 @@ export default {
{ label: "其他(天)", prop: "otherDays" }, { label: "其他(天)", prop: "otherDays" },
{
label: "出勤率%",
prop: "attendanceRate",
formatter: (row) => {
return row.attendanceRate
? (Number(row.attendanceRate) * 100).toFixed(2) + "%"
: "--";
},
},
{ label: "未按规定打卡(含忘记打卡)", prop: "nonCompliancePunch" }, { label: "未按规定打卡(含忘记打卡)", prop: "nonCompliancePunch" },
{ label: "迟到(次)", prop: "lateTimes" }, { label: "迟到(次)", prop: "lateTimes" },
......
...@@ -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>
...@@ -133,6 +133,12 @@ export default { ...@@ -133,6 +133,12 @@ export default {
this.$post("/check/all/record/list", { this.$post("/check/all/record/list", {
checkStatus: 2, checkStatus: 2,
staffId: id, staffId: id,
checkTimeStart: this.$route.query.yearmonth
? this.$route.query.yearmonth + "-01"
: "",
checkTimeEnd: this.$route.query.yearmonth
? this.$route.query.yearmonth + "-31"
: "",
}).then((res) => { }).then((res) => {
const { code, data, dict } = res; const { code, data, dict } = res;
if (code == 1) { if (code == 1) {
...@@ -164,7 +170,9 @@ export default { ...@@ -164,7 +170,9 @@ export default {
/** 查看*/ /** 查看*/
view(row) { view(row) {
this.reset(); this.reset();
this.query = { id: row.id }; this.query = {
id: row.id,
};
this.urls.currUrl = "staff/perform/summary/view"; this.urls.currUrl = "staff/perform/summary/view";
this.getData(); this.getData();
this.pageInfo.type = "view"; this.pageInfo.type = "view";
......
...@@ -298,7 +298,7 @@ export default { ...@@ -298,7 +298,7 @@ export default {
{ {
prop: "roleIds", prop: "roleIds",
label: "所属角色", label: "所属角色",
formatter: this.formatters, formatter: this.formatter,
align: "center", align: "center",
}, },
......
...@@ -39,4 +39,6 @@ public class UserVo extends BaseEntityLong { ...@@ -39,4 +39,6 @@ public class UserVo extends BaseEntityLong {
* 过期时间 * 过期时间
*/ */
private Long expireTime; private Long expireTime;
String roleIdStrs;
} }
\ No newline at end of file
...@@ -24,6 +24,7 @@ import com.mortals.xhx.base.system.resource.model.ResourceEntity; ...@@ -24,6 +24,7 @@ import com.mortals.xhx.base.system.resource.model.ResourceEntity;
import com.mortals.xhx.base.system.resource.service.ResourceService; import com.mortals.xhx.base.system.resource.service.ResourceService;
import com.mortals.xhx.base.system.role.dao.RoleUserDao; import com.mortals.xhx.base.system.role.dao.RoleUserDao;
import com.mortals.xhx.base.system.role.model.RoleUserEntity; import com.mortals.xhx.base.system.role.model.RoleUserEntity;
import com.mortals.xhx.base.system.role.model.RoleUserQuery;
import com.mortals.xhx.base.system.user.dao.UserDao; import com.mortals.xhx.base.system.user.dao.UserDao;
import com.mortals.xhx.base.system.user.model.UserEntity; import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.model.UserQuery; import com.mortals.xhx.base.system.user.model.UserQuery;
...@@ -33,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -33,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* <p>Title: 用户信息</p> * <p>Title: 用户信息</p>
...@@ -149,6 +151,12 @@ public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserE ...@@ -149,6 +151,12 @@ public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserE
roleIds.add(role.getRoleId()); roleIds.add(role.getRoleId());
}); });
item.setRoleIds(roleIds); item.setRoleIds(roleIds);
String roleIdStrs = StringUtils.join(roleIds, ",");
item.setRoleIdStrs(roleIdStrs);
RoleUserQuery roleUserQuery = new RoleUserQuery();
roleUserQuery.setUserId(item.getId());
}); });
} }
} }
...@@ -338,4 +346,5 @@ public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserE ...@@ -338,4 +346,5 @@ public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserE
public UserDao getUserDao() { public UserDao getUserDao() {
return this.getDao(); return this.getDao();
} }
} }
\ No newline at end of file
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 = 0D;
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;
}
}
...@@ -43,6 +43,32 @@ public class AttendanceStatEntity extends AttendanceStatVo { ...@@ -43,6 +43,32 @@ public class AttendanceStatEntity extends AttendanceStatVo {
*/ */
@Excel(name = "部门名称") @Excel(name = "部门名称")
private String deptName; private String deptName;
/**
* 手机号码
*/
private String phoneNumer;
@Excel(name = "出勤天数")
private Integer workDays;
/**
* 出勤天数
*/
@Excel(name = "实际出勤天数")
private Integer goTimes;
/**
* 考勤汇总-出勤率(%)
*/
@Excel(name = "考勤汇总-出勤率",percentEnabled = true,suffix="%",scale=2)
private BigDecimal attendanceRate;
/**
* 上午缺卡次数
*/
@Excel(name = "缺卡次数")
private Integer morningTimes;
/**
* 下午缺卡次数
*/
private Integer afternoonTimes;
/** /**
* 回单位(天) * 回单位(天)
*/ */
...@@ -133,11 +159,7 @@ public class AttendanceStatEntity extends AttendanceStatVo { ...@@ -133,11 +159,7 @@ public class AttendanceStatEntity extends AttendanceStatVo {
*/ */
@Excel(name = "考勤汇总-其他") @Excel(name = "考勤汇总-其他")
private BigDecimal otherDays; private BigDecimal otherDays;
/**
* 考勤汇总-出勤率(%)
*/
@Excel(name = "考勤汇总-出勤率",percentEnabled = true,suffix="%",scale=2)
private BigDecimal attendanceRate;
/** /**
* 考勤汇总-未按规定打卡(含忘记打卡) * 考勤汇总-未按规定打卡(含忘记打卡)
*/ */
...@@ -219,24 +241,7 @@ public class AttendanceStatEntity extends AttendanceStatVo { ...@@ -219,24 +241,7 @@ public class AttendanceStatEntity extends AttendanceStatVo {
*/ */
@Excel(name = "陪产假") @Excel(name = "陪产假")
private BigDecimal paternityLeaveDays; private BigDecimal paternityLeaveDays;
/**
* 手机号码
*/
private String phoneNumer;
/**
* 出勤天数
*/
@Excel(name = "出勤天数")
private Integer goTimes;
/**
* 上午缺卡次数
*/
@Excel(name = "缺卡次数")
private Integer morningTimes;
/**
* 下午缺卡次数
*/
private Integer afternoonTimes;
@Override @Override
public int hashCode() { public int hashCode() {
return this.getId().hashCode(); return this.getId().hashCode();
......
...@@ -337,11 +337,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -337,11 +337,7 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
for (AttendanceRecordDetailEntity recordDetailEntity : detailEntityList) { for (AttendanceRecordDetailEntity recordDetailEntity : detailEntityList) {
Integer goWorkResult = recordDetailEntity.getGoWorkResult(); Integer goWorkResult = recordDetailEntity.getGoWorkResult();
Integer offWorkResult = recordDetailEntity.getOffWorkResult(); Integer offWorkResult = recordDetailEntity.getOffWorkResult();
//判断是否是离职员工 如果是 则不添加 //判断是否是离职员工 如果是 则不添加
//判断上班 //判断上班
AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(recordDetailEntity.getShiftsId()); AttendanceClassDetailEntity attendanceClassDetailEntity = attendanceClassDetailService.get(recordDetailEntity.getShiftsId());
if (ObjectUtils.isEmpty(attendanceClassDetailEntity)) continue; if (ObjectUtils.isEmpty(attendanceClassDetailEntity)) continue;
...@@ -409,10 +405,13 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -409,10 +405,13 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
} }
if (!ObjectUtils.isEmpty(errorEntityList)) {
//删除当前员工当日未处理的异常后,重新添加 //删除当前员工当日未处理的异常后,重新添加
AttendanceRecordErrorQuery errorQuery = new AttendanceRecordErrorQuery(); AttendanceRecordErrorQuery errorQuery = new AttendanceRecordErrorQuery();
errorQuery.setCreateTimeStart(dateStr); errorQuery.setErrorDateTimeStart(dateStr);
errorQuery.setCreateTimeEnd(dateStr); errorQuery.setErrorDateTimeEnd(dateStr);
errorQuery.setStaffId(attendanceRecordEntity.getStaffId()); errorQuery.setStaffId(attendanceRecordEntity.getStaffId());
errorQuery.setProcessStatus(YesNoEnum.NO.getValue()); errorQuery.setProcessStatus(YesNoEnum.NO.getValue());
...@@ -422,13 +421,14 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -422,13 +421,14 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
errorService.remove(errorIds, context); errorService.remove(errorIds, context);
} }
if (!ObjectUtils.isEmpty(errorEntityList)) {
for (AttendanceRecordErrorEntity errorEntity : errorEntityList) { for (AttendanceRecordErrorEntity errorEntity : errorEntityList) {
//查看是否存在相同的异常记录,如果存在 则不添加 //查看是否存在相同的异常记录,如果存在 则不添加
errorQuery = new AttendanceRecordErrorQuery(); errorQuery = new AttendanceRecordErrorQuery();
errorQuery.setShiftsId(errorEntity.getShiftsId()); errorQuery.setShiftsId(errorEntity.getShiftsId());
errorQuery.setGoOffDateTime(errorEntity.getErrorDateTime()); errorQuery.setGoOffDateTime(errorEntity.getErrorDateTime());
errorQuery.setStaffId(errorEntity.getStaffId()); errorQuery.setStaffId(errorEntity.getStaffId());
errorQuery.setShiftsId(errorEntity.getShiftsId());
errorQuery.setProcessStatus(YesNoEnum.YES.getValue()); errorQuery.setProcessStatus(YesNoEnum.YES.getValue());
AttendanceRecordErrorEntity attendanceRecordErrorEntity = errorService.selectOne(errorQuery, context); AttendanceRecordErrorEntity attendanceRecordErrorEntity = errorService.selectOne(errorQuery, context);
......
...@@ -144,10 +144,10 @@ public class AttendanceRecordErrorController extends BaseCRUDJsonBodyMappingCont ...@@ -144,10 +144,10 @@ public class AttendanceRecordErrorController extends BaseCRUDJsonBodyMappingCont
for (AttendanceRecordErrorEntity recordErrorEntity : entity.getRecordErrorEntities()) { for (AttendanceRecordErrorEntity recordErrorEntity : entity.getRecordErrorEntities()) {
AttendanceRecordErrorEntity updateEntity = new AttendanceRecordErrorEntity(); AttendanceRecordErrorEntity updateEntity = new AttendanceRecordErrorEntity();
updateEntity.setId(recordErrorEntity.getId()); updateEntity.setId(recordErrorEntity.getId());
updateEntity.setAttendanceGroupId(recordErrorEntity.getAttendanceGroupId()); /* updateEntity.setAttendanceGroupId(recordErrorEntity.getAttendanceGroupId());
updateEntity.setAttendanceGroupName(recordErrorEntity.getAttendanceGroupName()); updateEntity.setAttendanceGroupName(recordErrorEntity.getAttendanceGroupName());
updateEntity.setErrorDateTime(recordErrorEntity.getErrorDateTime()); updateEntity.setErrorDateTime(recordErrorEntity.getErrorDateTime());
updateEntity.setGoOffDateTime(recordErrorEntity.getGoOffDateTime()); updateEntity.setGoOffDateTime(recordErrorEntity.getGoOffDateTime());*/
updateEntity.setProcessStatus(entity.getProcessStatus()); updateEntity.setProcessStatus(entity.getProcessStatus());
updateEntity.setProcessResult(entity.getProcessResult()); updateEntity.setProcessResult(entity.getProcessResult());
updateEntity.setStaffId(recordErrorEntity.getStaffId()); updateEntity.setStaffId(recordErrorEntity.getStaffId());
......
...@@ -2,6 +2,7 @@ package com.mortals.xhx.module.attendance.web; ...@@ -2,6 +2,7 @@ package com.mortals.xhx.module.attendance.web;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.common.Rest; import com.mortals.framework.common.Rest;
import com.mortals.framework.exception.AppException; import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
...@@ -130,6 +131,7 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro ...@@ -130,6 +131,7 @@ public class AttendanceRecordHikController extends BaseCRUDJsonBodyMappingContro
} }
@PostMapping(value = "/addAttendanceRecord") @PostMapping(value = "/addAttendanceRecord")
@UnAuth
public Rest<String> addAttendanceRecord(@RequestBody AttendanceRecordHikEntity hikEntity) { public Rest<String> addAttendanceRecord(@RequestBody AttendanceRecordHikEntity hikEntity) {
Rest<String> ret = new Rest(); Rest<String> ret = new Rest();
Map<String, Object> model = new HashMap(); Map<String, Object> model = new HashMap();
......
...@@ -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 DynamicColExcelUtil(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,113 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController< ...@@ -252,4 +254,113 @@ 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);
}
if(isNull(entity.getBreastfeedingLeaveDays())){
entity.setBreastfeedingLeaveDays(null);
}
if(isNull(entity.getMenstrualLeaveDays())){
entity.setMenstrualLeaveDays(null);
}
if(isNull(entity.getAnnualLeaveDays())){
entity.setAnnualLeaveDays(null);
}
if(isNull(entity.getCompensatedLeaveDays())){
entity.setCompensatedLeaveDays(null);
}
if(isNull(entity.getPaternityLeaveDays())){
entity.setPaternityLeaveDays(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;
}
}
}
} }
...@@ -15,11 +15,11 @@ import java.util.Date; ...@@ -15,11 +15,11 @@ import java.util.Date;
*/ */
@Data @Data
public class CheckAttendRecordVo extends BaseEntityLong { public class CheckAttendRecordVo extends BaseEntityLong {
/** 开始 创建时间 */ /** 开始 异常时间 */
private String createTimeStart; private String errorTimeStart;
/** 结束 创建时间 */ /** 结束 异常时间 */
private String createTimeEnd; private String errorTimeEnd;
/** 序号,主键,自增长列表 */ /** 序号,主键,自增长列表 */
......
...@@ -152,6 +152,10 @@ public class CheckAttendRecordServiceImpl extends AbstractCRUDServiceImpl<CheckA ...@@ -152,6 +152,10 @@ public class CheckAttendRecordServiceImpl extends AbstractCRUDServiceImpl<CheckA
if (entity.getId() == null) { if (entity.getId() == null) {
throw new AppException("核查记录ID不能为空"); throw new AppException("核查记录ID不能为空");
} }
CheckAttendRecordEntity temp = this.get(entity.getId());
if (temp == null) {
throw new AppException("核查记录ID不正确");
}
if (context != null && context.getUser() != null) { if (context != null && context.getUser() != null) {
IUser user = context.getUser(); IUser user = context.getUser();
entity.setUpdateUserId(user.getId()); entity.setUpdateUserId(user.getId());
...@@ -162,13 +166,11 @@ public class CheckAttendRecordServiceImpl extends AbstractCRUDServiceImpl<CheckA ...@@ -162,13 +166,11 @@ public class CheckAttendRecordServiceImpl extends AbstractCRUDServiceImpl<CheckA
AuditUtil.audit(entity); AuditUtil.audit(entity);
} }
entity.setCheckTime(new Date()); entity.setCheckTime(temp.getErrorTime());
entity.setUpdateTime(entity.getCheckTime()); entity.setUpdateTime(new Date());
entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理) entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理)
dao.update(entity); dao.update(entity);
try { try {
CheckAttendRecordEntity temp = this.get(entity.getId());
if (temp != null) {
if (!ObjectUtils.isEmpty(entity.getRecordId())) { if (!ObjectUtils.isEmpty(entity.getRecordId())) {
PerformAttendRecordEntity performAttendRecordEntity = attendRecordService.get(entity.getRecordId()); PerformAttendRecordEntity performAttendRecordEntity = attendRecordService.get(entity.getRecordId());
if (!ObjectUtils.isEmpty(performAttendRecordEntity)) { if (!ObjectUtils.isEmpty(performAttendRecordEntity)) {
...@@ -184,7 +186,6 @@ public class CheckAttendRecordServiceImpl extends AbstractCRUDServiceImpl<CheckA ...@@ -184,7 +186,6 @@ public class CheckAttendRecordServiceImpl extends AbstractCRUDServiceImpl<CheckA
StaffCheckSummaryQuery query = new StaffCheckSummaryQuery(); StaffCheckSummaryQuery query = new StaffCheckSummaryQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
summaryCheck(query); summaryCheck(query);
}
} catch (Exception e) { } catch (Exception e) {
log.error("汇总已审核的核查记录出错", e); log.error("汇总已审核的核查记录出错", e);
} }
......
...@@ -150,6 +150,10 @@ public class CheckComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Chec ...@@ -150,6 +150,10 @@ public class CheckComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Chec
if (entity.getId() == null) { if (entity.getId() == null) {
throw new AppException("核查记录ID不能为空"); throw new AppException("核查记录ID不能为空");
} }
CheckComplainRecordEntity temp = this.get(entity.getId());
if (temp == null) {
throw new AppException("核查记录ID不正确");
}
if (context != null && context.getUser() != null) { if (context != null && context.getUser() != null) {
IUser user = context.getUser(); IUser user = context.getUser();
entity.setUpdateUserId(user.getId()); entity.setUpdateUserId(user.getId());
...@@ -158,13 +162,11 @@ public class CheckComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Chec ...@@ -158,13 +162,11 @@ public class CheckComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Chec
if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){ if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){
AuditUtil.audit(entity); AuditUtil.audit(entity);
} }
entity.setCheckTime(new Date()); entity.setCheckTime(temp.getComplainTime());
entity.setUpdateTime(entity.getCheckTime()); entity.setUpdateTime(new Date());
entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理) entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理)
dao.update(entity); dao.update(entity);
try { try {
CheckComplainRecordEntity temp = this.get(entity.getId());
if (temp != null) {
if(!ObjectUtils.isEmpty(temp.getRecordId())){ if(!ObjectUtils.isEmpty(temp.getRecordId())){
PerformComplainRecordEntity recordEntity = recordService.get(temp.getRecordId()); PerformComplainRecordEntity recordEntity = recordService.get(temp.getRecordId());
if(!ObjectUtils.isEmpty(recordEntity)){ if(!ObjectUtils.isEmpty(recordEntity)){
...@@ -178,7 +180,6 @@ public class CheckComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Chec ...@@ -178,7 +180,6 @@ public class CheckComplainRecordServiceImpl extends AbstractCRUDServiceImpl<Chec
StaffCheckSummaryQuery query = new StaffCheckSummaryQuery(); StaffCheckSummaryQuery query = new StaffCheckSummaryQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
summaryCheck(query); summaryCheck(query);
}
} catch (Exception e) { } catch (Exception e) {
log.error("汇总已审核的核查记录出错", e); log.error("汇总已审核的核查记录出错", e);
} }
......
...@@ -150,6 +150,10 @@ public class CheckEffectRecordServiceImpl extends AbstractCRUDServiceImpl<CheckE ...@@ -150,6 +150,10 @@ public class CheckEffectRecordServiceImpl extends AbstractCRUDServiceImpl<CheckE
if(entity.getId()==null){ if(entity.getId()==null){
throw new AppException("核查记录ID不能为空"); throw new AppException("核查记录ID不能为空");
} }
CheckEffectRecordEntity temp = this.get(entity.getId());
if (temp == null) {
throw new AppException("核查记录ID不正确");
}
if (context != null && context.getUser()!=null) { if (context != null && context.getUser()!=null) {
IUser user = context.getUser(); IUser user = context.getUser();
entity.setUpdateUserId(user.getId()); entity.setUpdateUserId(user.getId());
...@@ -158,13 +162,11 @@ public class CheckEffectRecordServiceImpl extends AbstractCRUDServiceImpl<CheckE ...@@ -158,13 +162,11 @@ public class CheckEffectRecordServiceImpl extends AbstractCRUDServiceImpl<CheckE
if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){ if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){
AuditUtil.audit(entity); AuditUtil.audit(entity);
} }
entity.setCheckTime(new Date()); entity.setCheckTime(temp.getHappenTime());
entity.setUpdateTime(entity.getCheckTime()); entity.setUpdateTime(new Date());
entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理) entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理)
dao.update(entity); dao.update(entity);
try{ try{
CheckEffectRecordEntity temp = this.get(entity.getId());
if(temp!=null) {
if(!ObjectUtils.isEmpty(temp.getRecordId())){ if(!ObjectUtils.isEmpty(temp.getRecordId())){
PerformEffectRecordEntity recordEntity = recordService.get(temp.getRecordId()); PerformEffectRecordEntity recordEntity = recordService.get(temp.getRecordId());
if(!ObjectUtils.isEmpty(recordEntity)){ if(!ObjectUtils.isEmpty(recordEntity)){
...@@ -179,7 +181,6 @@ public class CheckEffectRecordServiceImpl extends AbstractCRUDServiceImpl<CheckE ...@@ -179,7 +181,6 @@ public class CheckEffectRecordServiceImpl extends AbstractCRUDServiceImpl<CheckE
StaffCheckSummaryQuery query = new StaffCheckSummaryQuery(); StaffCheckSummaryQuery query = new StaffCheckSummaryQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
summaryCheck(query); summaryCheck(query);
}
}catch (Exception e){ }catch (Exception e){
log.error("汇总已审核的核查记录出错",e); log.error("汇总已审核的核查记录出错",e);
} }
......
...@@ -147,6 +147,10 @@ public class CheckGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<CheckG ...@@ -147,6 +147,10 @@ public class CheckGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<CheckG
if(entity.getId()==null){ if(entity.getId()==null){
throw new AppException("核查记录ID不能为空"); throw new AppException("核查记录ID不能为空");
} }
CheckGoworkRecordEntity temp = this.get(entity.getId());
if (temp == null) {
throw new AppException("核查记录ID不正确");
}
if (context != null && context.getUser()!=null) { if (context != null && context.getUser()!=null) {
IUser user = context.getUser(); IUser user = context.getUser();
entity.setUpdateUserId(user.getId()); entity.setUpdateUserId(user.getId());
...@@ -155,14 +159,12 @@ public class CheckGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<CheckG ...@@ -155,14 +159,12 @@ public class CheckGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<CheckG
if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){ if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){
AuditUtil.audit(entity); AuditUtil.audit(entity);
} }
entity.setCheckTime(new Date()); entity.setCheckTime(temp.getGoworkTime());
entity.setUpdateTime(entity.getCheckTime()); entity.setUpdateTime(new Date());
entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理) entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理)
dao.update(entity); dao.update(entity);
//发送钉钉通知信息 //发送钉钉通知信息
try{ try{
CheckGoworkRecordEntity temp = this.get(entity.getId());
if(temp!=null) {
if(!ObjectUtils.isEmpty(temp.getRecordId())){ if(!ObjectUtils.isEmpty(temp.getRecordId())){
PerformGoworkRecordEntity recordEntity = recordService.get(temp.getRecordId()); PerformGoworkRecordEntity recordEntity = recordService.get(temp.getRecordId());
if(!ObjectUtils.isEmpty(recordEntity)){ if(!ObjectUtils.isEmpty(recordEntity)){
...@@ -176,7 +178,6 @@ public class CheckGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<CheckG ...@@ -176,7 +178,6 @@ public class CheckGoworkRecordServiceImpl extends AbstractCRUDServiceImpl<CheckG
StaffCheckSummaryQuery query = new StaffCheckSummaryQuery(); StaffCheckSummaryQuery query = new StaffCheckSummaryQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
summaryCheck(query); summaryCheck(query);
}
}catch (Exception e){ }catch (Exception e){
log.error("汇总已审核的核查记录出错",e); log.error("汇总已审核的核查记录出错",e);
} }
......
...@@ -152,6 +152,10 @@ public class CheckOtherRecordServiceImpl extends AbstractCRUDServiceImpl<CheckOt ...@@ -152,6 +152,10 @@ public class CheckOtherRecordServiceImpl extends AbstractCRUDServiceImpl<CheckOt
if (entity.getId() == null) { if (entity.getId() == null) {
throw new AppException("核查记录ID不能为空"); throw new AppException("核查记录ID不能为空");
} }
CheckOtherRecordEntity temp = this.get(entity.getId());
if (temp == null) {
throw new AppException("核查记录ID不正确");
}
if (context != null && context.getUser() != null) { if (context != null && context.getUser() != null) {
IUser user = context.getUser(); IUser user = context.getUser();
entity.setUpdateUserId(user.getId()); entity.setUpdateUserId(user.getId());
...@@ -160,14 +164,13 @@ public class CheckOtherRecordServiceImpl extends AbstractCRUDServiceImpl<CheckOt ...@@ -160,14 +164,13 @@ public class CheckOtherRecordServiceImpl extends AbstractCRUDServiceImpl<CheckOt
if (!ObjectUtils.isEmpty(entity.getSubAddType()) && !ObjectUtils.isEmpty(entity.getCheckResult())) { if (!ObjectUtils.isEmpty(entity.getSubAddType()) && !ObjectUtils.isEmpty(entity.getCheckResult())) {
AuditUtil.audit(entity); AuditUtil.audit(entity);
} }
entity.setCheckTime(new Date());
entity.setUpdateTime(entity.getCheckTime()); entity.setCheckTime(temp.getHappenTime());
entity.setUpdateTime(new Date());
entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理) entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理)
dao.update(entity); dao.update(entity);
//发送钉钉通知信息 //发送钉钉通知信息
try { try {
CheckOtherRecordEntity temp = this.get(entity.getId());
if (temp != null) {
if (!ObjectUtils.isEmpty(temp.getRecordId())) { if (!ObjectUtils.isEmpty(temp.getRecordId())) {
PerformOtherRecordEntity recordEntity = recordService.get(temp.getRecordId()); PerformOtherRecordEntity recordEntity = recordService.get(temp.getRecordId());
if (!ObjectUtils.isEmpty(recordEntity)) { if (!ObjectUtils.isEmpty(recordEntity)) {
...@@ -181,7 +184,6 @@ public class CheckOtherRecordServiceImpl extends AbstractCRUDServiceImpl<CheckOt ...@@ -181,7 +184,6 @@ public class CheckOtherRecordServiceImpl extends AbstractCRUDServiceImpl<CheckOt
StaffCheckSummaryQuery query = new StaffCheckSummaryQuery(); StaffCheckSummaryQuery query = new StaffCheckSummaryQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
summaryCheck(query); summaryCheck(query);
}
} catch (Exception e) { } catch (Exception e) {
log.error("汇总已审核的核查记录出错", e); log.error("汇总已审核的核查记录出错", e);
......
...@@ -152,6 +152,10 @@ public class CheckReviewRecordServiceImpl extends AbstractCRUDServiceImpl<CheckR ...@@ -152,6 +152,10 @@ public class CheckReviewRecordServiceImpl extends AbstractCRUDServiceImpl<CheckR
if (entity.getId() == null) { if (entity.getId() == null) {
throw new AppException("核查记录ID不能为空"); throw new AppException("核查记录ID不能为空");
} }
CheckReviewRecordEntity temp = this.get(entity.getId());
if (temp == null) {
throw new AppException("核查记录ID不正确");
}
if (context != null && context.getUser() != null) { if (context != null && context.getUser() != null) {
IUser user = context.getUser(); IUser user = context.getUser();
entity.setUpdateUserId(user.getId()); entity.setUpdateUserId(user.getId());
...@@ -160,14 +164,12 @@ public class CheckReviewRecordServiceImpl extends AbstractCRUDServiceImpl<CheckR ...@@ -160,14 +164,12 @@ public class CheckReviewRecordServiceImpl extends AbstractCRUDServiceImpl<CheckR
if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){ if(!ObjectUtils.isEmpty(entity.getSubAddType())&&!ObjectUtils.isEmpty(entity.getCheckResult())){
AuditUtil.audit(entity); AuditUtil.audit(entity);
} }
entity.setCheckTime(new Date()); entity.setCheckTime(temp.getReviewTime());
entity.setUpdateTime(entity.getCheckTime()); entity.setUpdateTime(new Date());
entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理) entity.setCheckStatus(CheckStatusEnum.已处理.getValue()); //处理状态(1.未处理,2.已处理)
dao.update(entity); dao.update(entity);
//发送钉钉通知信息 //发送钉钉通知信息
try { try {
CheckReviewRecordEntity temp = this.get(entity.getId());
if (temp != null) {
if(!ObjectUtils.isEmpty(temp.getRecordId())){ if(!ObjectUtils.isEmpty(temp.getRecordId())){
PerformReviewRecordEntity recordEntity = recordService.get(temp.getRecordId()); PerformReviewRecordEntity recordEntity = recordService.get(temp.getRecordId());
if(!ObjectUtils.isEmpty(recordEntity)){ if(!ObjectUtils.isEmpty(recordEntity)){
...@@ -181,7 +183,6 @@ public class CheckReviewRecordServiceImpl extends AbstractCRUDServiceImpl<CheckR ...@@ -181,7 +183,6 @@ public class CheckReviewRecordServiceImpl extends AbstractCRUDServiceImpl<CheckR
StaffCheckSummaryQuery query = new StaffCheckSummaryQuery(); StaffCheckSummaryQuery query = new StaffCheckSummaryQuery();
query.setStaffId(temp.getStaffId()); query.setStaffId(temp.getStaffId());
summaryCheck(query); summaryCheck(query);
}
} catch (Exception e) { } catch (Exception e) {
log.error("汇总已审核的核查记录出错", e); log.error("汇总已审核的核查记录出错", e);
} }
......
...@@ -26,6 +26,8 @@ import com.mortals.xhx.module.check.service.CheckAttendRecordService; ...@@ -26,6 +26,8 @@ import com.mortals.xhx.module.check.service.CheckAttendRecordService;
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.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -89,9 +91,11 @@ public class CheckAttendRecordController extends BaseCRUDJsonBodyMappingControll ...@@ -89,9 +91,11 @@ public class CheckAttendRecordController extends BaseCRUDJsonBodyMappingControll
query.getOrderColList().add(new OrderCol("createTime", OrderCol.DESCENDING)); query.getOrderColList().add(new OrderCol("createTime", OrderCol.DESCENDING));
} }
if(!ObjectUtils.isEmpty(query.getCreateTime())){ if(ObjectUtils.isEmpty(query.getErrorTimeStart())){
query.setCreateTimeStart(DateUtil.formatDate(query.getCreateTime())); LocalDateTime currentDate = LocalDateTime.now();
query.setCreateTimeEnd(DateUtil.formatDate(query.getCreateTime())); LocalDateTime firstDayOfMonth = currentDate.withDayOfMonth(1);
query.setErrorTimeStart(DateUtil.format(firstDayOfMonth,"yyyy-MM-dd"));
//query.setErrorTimeEnd(DateUtil.formatDate(query.getCreateTime()));
} }
super.doListBefore(query, model, context); super.doListBefore(query, model, context);
} }
......
...@@ -312,8 +312,8 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta ...@@ -312,8 +312,8 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta
} }
staffEntity.setName(personInfo.getPersonName()); staffEntity.setName(personInfo.getPersonName());
staffEntity.setRemarkId(personInfo.getPersonId()); staffEntity.setRemarkId(personInfo.getPersonId());
staffEntity.setPicUri(personInfo.getPersonPhoto().getPicUri()); staffEntity.setPicUri(personInfo.getPersonPhoto()==null?"":personInfo.getPersonPhoto().getPicUri());
staffEntity.setServerIndexCode(personInfo.getPersonPhoto().getServerIndexCode()); staffEntity.setServerIndexCode(personInfo.getPersonPhoto()==null?"":personInfo.getPersonPhoto().getServerIndexCode());
staffEntity.setDeptName(personInfo.getOrgName()); staffEntity.setDeptName(personInfo.getOrgName());
staffEntity.setGender(personInfo.getGender()); staffEntity.setGender(personInfo.getGender());
staffEntity.setWorkNum(personInfo.getJobNo()); staffEntity.setWorkNum(personInfo.getJobNo());
...@@ -329,8 +329,8 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta ...@@ -329,8 +329,8 @@ public class StaffServiceImpl extends AbstractCRUDCacheServiceImpl<StaffDao, Sta
} }
staffEntity.setName(personInfo.getPersonName()); staffEntity.setName(personInfo.getPersonName());
staffEntity.setRemarkId(personInfo.getPersonId()); staffEntity.setRemarkId(personInfo.getPersonId());
staffEntity.setPicUri(personInfo.getPersonPhoto().getPicUri()); staffEntity.setPicUri(personInfo.getPersonPhoto()==null?"":personInfo.getPersonPhoto().getPicUri());
staffEntity.setServerIndexCode(personInfo.getPersonPhoto().getServerIndexCode()); staffEntity.setServerIndexCode(personInfo.getPersonPhoto()==null?"":personInfo.getPersonPhoto().getServerIndexCode());
staffEntity.setDeptName(personInfo.getOrgName()); staffEntity.setDeptName(personInfo.getOrgName());
staffEntity.setGender(personInfo.getGender()); staffEntity.setGender(personInfo.getGender());
staffEntity.setWorkNum(personInfo.getJobNo()); staffEntity.setWorkNum(personInfo.getJobNo());
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
s.deptId, s.deptId,
s.deptName, s.deptName,
s.phoneNumer, s.phoneNumer,
count(1) as workDays,
ROUND(IFNULL(sum(s.goTimes),0)/count(1),4) as attendanceRate, ROUND(IFNULL(sum(s.goTimes),0)/count(1),4) as attendanceRate,
sum(s.goTimes) AS goTimes, sum(s.goTimes) AS goTimes,
sum(s.morningTimes) AS morningTimes, sum(s.morningTimes) AS morningTimes,
......
...@@ -5,7 +5,7 @@ Content-Type: application/json ...@@ -5,7 +5,7 @@ Content-Type: application/json
{ {
"loginName":"admin", "loginName":"admin",
"password":"xhxADMIN8@a", "password":"admin",
"securityCode":"admin" "securityCode":"admin"
} }
...@@ -33,8 +33,8 @@ Authorization: {{authToken}} ...@@ -33,8 +33,8 @@ Authorization: {{authToken}}
Content-Type: application/json Content-Type: application/json
{ {
"attendanceDateStart":"2023-09-28", "attendanceDateStart":"2023-12-01",
"attendanceDateEnd":"2023-10-08" "attendanceDateEnd":"2023-12-01"
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment