Commit 9298d6ee authored by 赵啸非's avatar 赵啸非

测试多线程优化考勤计算

parent 1ac2c160
...@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; ...@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest; import com.mortals.framework.common.Rest;
import com.mortals.framework.util.StringUtils; import com.mortals.framework.util.StringUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.common.code.*; import com.mortals.xhx.common.code.*;
import com.mortals.xhx.module.attendance.model.*; import com.mortals.xhx.module.attendance.model.*;
import com.mortals.xhx.module.attendance.service.*; import com.mortals.xhx.module.attendance.service.*;
...@@ -152,162 +153,173 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte ...@@ -152,162 +153,173 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
*/ */
for (Map.Entry<Long, List<AttendanceRecordHikEntity>> itemEntry : listMap.entrySet()) { for (Map.Entry<Long, List<AttendanceRecordHikEntity>> itemEntry : listMap.entrySet()) {
//按人员 //按人员 todo 改为多线程并行计算
List<AttendanceRecordEntity> saveList = new ArrayList<>();
List<AttendanceRecordEntity> updateList = new ArrayList<>(); Runnable runnable = new Runnable() {
Long staffId = itemEntry.getKey(); @Override
List<AttendanceRecordHikEntity> recordHikEntityList = itemEntry.getValue(); public void run() {
Map<String, List<AttendanceRecordHikEntity>> dateRecordMap = recordHikEntityList.stream().collect(Collectors.groupingBy(hikEntity -> DateUtil.formatDate(hikEntity.getAttendanceDate())));
for (Map.Entry<String, List<AttendanceRecordHikEntity>> dateEntry : dateRecordMap.entrySet()) { List<AttendanceRecordEntity> saveList = new ArrayList<>();
//按每日 List<AttendanceRecordEntity> updateList = new ArrayList<>();
String dateStr = dateEntry.getKey(); Long staffId = itemEntry.getKey();
List<AttendanceRecordHikEntity> recordHikEntities = dateEntry.getValue(); List<AttendanceRecordHikEntity> recordHikEntityList = itemEntry.getValue();
if (ObjectUtils.isEmpty(recordHikEntities)) continue; Map<String, List<AttendanceRecordHikEntity>> dateRecordMap = recordHikEntityList.stream().collect(Collectors.groupingBy(hikEntity -> DateUtil.formatDate(hikEntity.getAttendanceDate())));
AttendanceRecordHikEntity item = recordHikEntities.get(0); for (Map.Entry<String, List<AttendanceRecordHikEntity>> dateEntry : dateRecordMap.entrySet()) {
AttendanceRecordEntity attendanceRecordEntity = new AttendanceRecordEntity(); //按每日
attendanceRecordEntity.initAttrValue(); String dateStr = dateEntry.getKey();
List<AttendanceRecordHikEntity> recordHikEntities = dateEntry.getValue();
attendanceRecordEntity.setStaffId(item.getStaffId()); if (ObjectUtils.isEmpty(recordHikEntities)) continue;
attendanceRecordEntity.setStaffName(item.getStaffName()); AttendanceRecordHikEntity item = recordHikEntities.get(0);
attendanceRecordEntity.setDeptId(item.getDeptId()); AttendanceRecordEntity attendanceRecordEntity = new AttendanceRecordEntity();
attendanceRecordEntity.setDeptName(item.getDeptName()); attendanceRecordEntity.initAttrValue();
attendanceRecordEntity.setPositionId(item.getPositionId()); attendanceRecordEntity.setStaffId(item.getStaffId());
attendanceRecordEntity.setPositionName(item.getPositionName()); attendanceRecordEntity.setStaffName(item.getStaffName());
attendanceRecordEntity.setWorkNum(item.getWorkNum()); attendanceRecordEntity.setDeptId(item.getDeptId());
attendanceRecordEntity.setAttendanceDate(item.getAttendanceDate()); attendanceRecordEntity.setDeptName(item.getDeptName());
attendanceRecordEntity.setCreateTime(item.getAttendanceDate());
attendanceRecordEntity.setCreateUserId(this.getContextUserId(context)); attendanceRecordEntity.setPositionId(item.getPositionId());
attendanceRecordEntity.setPositionName(item.getPositionName());
StaffEntity staffEntity = staffService.getExtCache(staffId.toString()); attendanceRecordEntity.setWorkNum(item.getWorkNum());
if (ObjectUtils.isEmpty(staffEntity)) { attendanceRecordEntity.setAttendanceDate(item.getAttendanceDate());
//log.info("staffEntity is null ,staffId:{}", staffId); attendanceRecordEntity.setCreateTime(item.getAttendanceDate());
continue; attendanceRecordEntity.setCreateUserId(attendanceRecordHikService.getContextUserId(context));
}
StaffEntity staffEntity = staffService.getExtCache(staffId.toString());
if (ObjectUtils.isEmpty(staffEntity)) {
//log.info("staffEntity is null ,staffId:{}", staffId);
continue;
}
attendanceRecordEntity.setSalaId(staffEntity.getSalaId()); attendanceRecordEntity.setSalaId(staffEntity.getSalaId());
attendanceRecordEntity.setSalaName(staffEntity.getSalaName()); attendanceRecordEntity.setSalaName(staffEntity.getSalaName());
//通过员工id查询考勤组人员信息
// List<AttendanceGroupStaffEntity> attendanceGroupStaffEntities = attendanceGroupStaffService.find(new AttendanceGroupStaffQuery().staffId(staffId));
List<AttendanceGroupStaffEntity> attendanceGroupStaffEntities = groupStaffMap.getOrDefault(staffId, new ArrayList<>(0));
//过滤重复考勤组与人员
attendanceGroupStaffEntities = attendanceGroupStaffEntities.stream().collect(Collectors.toMap(x -> x.getGroupId() + "#" + x.getStaffId(), y -> y, (o, n) -> n)).values().stream().collect(Collectors.toList());
List<AttendanceRecordDetailEntity> detailEntityList = new ArrayList<>();
if (!ObjectUtils.isEmpty(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() == 1) {
//查询考勤组
//AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.get(attendanceGroupStaffEntities.get(0).getGroupId(), context);
AttendanceGroupEntity attendanceGroupEntity = groupMap.get(attendanceGroupStaffEntities.get(0).getGroupId());
attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity == null ? 0L : attendanceGroupEntity.getId());
attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName());
//查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制
AttendanceWorkAbstract workAbstract = AttendanceWorkAbstract.newType(attendanceGroupEntity.getType());
CommonData commonData = new CommonData();
commonData.setContext(context);
commonData.setAttendanceGroupEntity(attendanceGroupEntity);
commonData.setAttendanceRecordEntity(attendanceRecordEntity);
commonData.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
commonData.setDetailEntityList(detailEntityList);
commonData.setStaffId(attendanceRecordEntity.getStaffId());
commonData.setDateStr(dateStr);
commonData.setClassEntityMap(classEntityMap);
commonData.setRecordHikEntities(recordHikEntities);
commonData.setFixedSpecialGroupMap(fixedSpecialGroupMap);
commonData.setClassDetailEntityMap(classDetailEntityMap);
// commonData.setLeaveRecordGroupMap(leaveRecordGroupMap);
workAbstract.doHandleWork(commonData);
}
//如果考勤人员信息list长度大于1 则该考勤人员有多个考勤组. //通过员工id查询考勤组人员信息
if (StringUtils.isNotNull(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() > 1) { // List<AttendanceGroupStaffEntity> attendanceGroupStaffEntities = attendanceGroupStaffService.find(new AttendanceGroupStaffQuery().staffId(staffId));
for (AttendanceGroupStaffEntity groupStaffEntity : attendanceGroupStaffEntities) { List<AttendanceGroupStaffEntity> attendanceGroupStaffEntities = groupStaffMap.getOrDefault(staffId, new ArrayList<>(0));
detailEntityList = new ArrayList<>(); //过滤重复考勤组与人员
//多考勤组 todo 暂时和单一覆盖 attendanceGroupStaffEntities = attendanceGroupStaffEntities.stream().collect(Collectors.toMap(x -> x.getGroupId() + "#" + x.getStaffId(), y -> y, (o, n) -> n)).values().stream().collect(Collectors.toList());
//checkAttendGroupByOne(attendanceRecordEntity, detailEntityList, attendanceDate, groupStaffEntity, context);
//查询考勤组
// AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.get(groupStaffEntity.getGroupId(), context);
AttendanceGroupEntity attendanceGroupEntity = groupMap.get(groupStaffEntity.getGroupId());
attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity == null ? 0L : attendanceGroupEntity.getId()); List<AttendanceRecordDetailEntity> detailEntityList = new ArrayList<>();
attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName()); if (!ObjectUtils.isEmpty(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() == 1) {
//查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制 //查询考勤组
AttendanceWorkAbstract workAbstract = AttendanceWorkAbstract.newType(attendanceGroupEntity.getType()); //AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.get(attendanceGroupStaffEntities.get(0).getGroupId(), context);
CommonData commonData = new CommonData(); AttendanceGroupEntity attendanceGroupEntity = groupMap.get(attendanceGroupStaffEntities.get(0).getGroupId());
commonData.setContext(context); attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity == null ? 0L : attendanceGroupEntity.getId());
commonData.setAttendanceGroupEntity(attendanceGroupEntity); attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName());
commonData.setAttendanceRecordEntity(attendanceRecordEntity); //查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制
commonData.setDetailEntityList(detailEntityList); AttendanceWorkAbstract workAbstract = AttendanceWorkAbstract.newType(attendanceGroupEntity.getType());
commonData.setAttendanceDate(attendanceRecordEntity.getAttendanceDate()); CommonData commonData = new CommonData();
commonData.setStaffId(attendanceRecordEntity.getStaffId()); commonData.setContext(context);
commonData.setDateStr(dateStr); commonData.setAttendanceGroupEntity(attendanceGroupEntity);
commonData.setClassEntityMap(classEntityMap); commonData.setAttendanceRecordEntity(attendanceRecordEntity);
commonData.setRecordHikEntities(recordHikEntities); commonData.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
commonData.setFixedSpecialGroupMap(fixedSpecialGroupMap); commonData.setDetailEntityList(detailEntityList);
commonData.setClassDetailEntityMap(classDetailEntityMap); commonData.setStaffId(attendanceRecordEntity.getStaffId());
// commonData.setLeaveRecordGroupMap(leaveRecordGroupMap); commonData.setDateStr(dateStr);
workAbstract.doHandleWork(commonData); commonData.setClassEntityMap(classEntityMap);
} commonData.setRecordHikEntities(recordHikEntities);
} commonData.setFixedSpecialGroupMap(fixedSpecialGroupMap);
commonData.setClassDetailEntityMap(classDetailEntityMap);
if (!ObjectUtils.isEmpty(detailEntityList)) { // commonData.setLeaveRecordGroupMap(leaveRecordGroupMap);
attendanceRecordEntity.setAttendanceRecordDetailList(detailEntityList); workAbstract.doHandleWork(commonData);
//判断签到 只要存在一次正常打卡详细记录 就判断签到
attendanceRecordEntity.setSignInResult(YesNoEnum.YES.getValue());
for (AttendanceRecordDetailEntity detailEntity : detailEntityList) {
if (GoWorkResultEnum.缺卡.getValue() == detailEntity.getGoWorkResult() || GoWorkResultEnum.迟到.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setSignInResult(YesNoEnum.NO.getValue());
break;
} }
}
attendanceRecordEntity.setSignOutResult(YesNoEnum.YES.getValue()); //如果考勤人员信息list长度大于1 则该考勤人员有多个考勤组.
for (AttendanceRecordDetailEntity detailEntity : detailEntityList) { if (StringUtils.isNotNull(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() > 1) {
if (OffWorkResultEnum.缺卡.getValue() == detailEntity.getOffWorkResult() || OffWorkResultEnum.早退.getValue() == detailEntity.getOffWorkResult()) { for (AttendanceGroupStaffEntity groupStaffEntity : attendanceGroupStaffEntities) {
attendanceRecordEntity.setSignOutResult(YesNoEnum.NO.getValue()); detailEntityList = new ArrayList<>();
break; //多考勤组 todo 暂时和单一覆盖
//checkAttendGroupByOne(attendanceRecordEntity, detailEntityList, attendanceDate, groupStaffEntity, context);
//查询考勤组
// AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.get(groupStaffEntity.getGroupId(), context);
AttendanceGroupEntity attendanceGroupEntity = groupMap.get(groupStaffEntity.getGroupId());
attendanceRecordEntity.setAttendanceGroupId(attendanceGroupEntity == null ? 0L : attendanceGroupEntity.getId());
attendanceRecordEntity.setAttendanceGroupName(attendanceGroupEntity == null ? "" : attendanceGroupEntity.getGroupName());
//查询考勤组详细信息获取班次 todo 默认固定班次 还有自由 与排班制
AttendanceWorkAbstract workAbstract = AttendanceWorkAbstract.newType(attendanceGroupEntity.getType());
CommonData commonData = new CommonData();
commonData.setContext(context);
commonData.setAttendanceGroupEntity(attendanceGroupEntity);
commonData.setAttendanceRecordEntity(attendanceRecordEntity);
commonData.setDetailEntityList(detailEntityList);
commonData.setAttendanceDate(attendanceRecordEntity.getAttendanceDate());
commonData.setStaffId(attendanceRecordEntity.getStaffId());
commonData.setDateStr(dateStr);
commonData.setClassEntityMap(classEntityMap);
commonData.setRecordHikEntities(recordHikEntities);
commonData.setFixedSpecialGroupMap(fixedSpecialGroupMap);
commonData.setClassDetailEntityMap(classDetailEntityMap);
// commonData.setLeaveRecordGroupMap(leaveRecordGroupMap);
workAbstract.doHandleWork(commonData);
}
} }
}
if (YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignInResult() && YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignOutResult()) { if (!ObjectUtils.isEmpty(detailEntityList)) {
attendanceRecordEntity.setPunchResult(YesNoEnum.YES.getValue()); attendanceRecordEntity.setAttendanceRecordDetailList(detailEntityList);
} else { //判断签到 只要存在一次正常打卡详细记录 就判断签到
attendanceRecordEntity.setPunchResult(YesNoEnum.NO.getValue()); attendanceRecordEntity.setSignInResult(YesNoEnum.YES.getValue());
} for (AttendanceRecordDetailEntity detailEntity : detailEntityList) {
if (GoWorkResultEnum.缺卡.getValue() == detailEntity.getGoWorkResult() || GoWorkResultEnum.迟到.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setSignInResult(YesNoEnum.NO.getValue());
break;
}
}
attendanceRecordEntity.setSignOutResult(YesNoEnum.YES.getValue());
for (AttendanceRecordDetailEntity detailEntity : detailEntityList) {
if (OffWorkResultEnum.缺卡.getValue() == detailEntity.getOffWorkResult() || OffWorkResultEnum.早退.getValue() == detailEntity.getOffWorkResult()) {
attendanceRecordEntity.setSignOutResult(YesNoEnum.NO.getValue());
break;
}
}
attendanceRecordEntity.setAttendType("现场打卡"); if (YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignInResult() && YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignOutResult()) {
//判断是否存在记录 如果存在 则更新 维度 staffId attendanceDate shiftsId attendanceGroupId attendanceRecordEntity.setPunchResult(YesNoEnum.YES.getValue());
AttendanceRecordQuery query = new AttendanceRecordQuery(); } else {
query.setStaffId(attendanceRecordEntity.getStaffId()); attendanceRecordEntity.setPunchResult(YesNoEnum.NO.getValue());
query.setAttendanceDateStart(dateStr); }
query.setAttendanceDateEnd(dateStr);
AttendanceRecordEntity recordEntity = attendanceRecordService.selectOne(query); attendanceRecordEntity.setAttendType("现场打卡");
if (!ObjectUtils.isEmpty(recordEntity)) { //判断是否存在记录 如果存在 则更新 维度 staffId attendanceDate shiftsId attendanceGroupId
attendanceRecordEntity.setId(recordEntity.getId()); AttendanceRecordQuery query = new AttendanceRecordQuery();
attendanceRecordEntity.setUpdateTime(new Date()); query.setStaffId(attendanceRecordEntity.getStaffId());
attendanceRecordEntity.setUpdateUserId(this.getContextUserId(context)); query.setAttendanceDateStart(dateStr);
updateList.add(attendanceRecordEntity); query.setAttendanceDateEnd(dateStr);
} else {
saveList.add(attendanceRecordEntity); AttendanceRecordEntity recordEntity = attendanceRecordService.selectOne(query);
if (!ObjectUtils.isEmpty(recordEntity)) {
attendanceRecordEntity.setId(recordEntity.getId());
attendanceRecordEntity.setUpdateTime(new Date());
attendanceRecordEntity.setUpdateUserId(attendanceRecordHikService.getContextUserId(context));
updateList.add(attendanceRecordEntity);
} else {
saveList.add(attendanceRecordEntity);
}
}
} }
} if (!ObjectUtils.isEmpty(saveList)) {
} attendanceRecordService.save(saveList);
if (!ObjectUtils.isEmpty(saveList)) {
attendanceRecordService.save(saveList);
/* for (AttendanceRecordEntity attendanceRecordEntity : saveList) { /* for (AttendanceRecordEntity attendanceRecordEntity : saveList) {
attendanceRecordService.save(attendanceRecordEntity, context); attendanceRecordService.save(attendanceRecordEntity, context);
}*/ }*/
} }
if (!ObjectUtils.isEmpty(updateList)) { if (!ObjectUtils.isEmpty(updateList)) {
attendanceRecordService.update(updateList); attendanceRecordService.update(updateList);
/* for (AttendanceRecordEntity attendanceRecordEntity : updateList) { /* for (AttendanceRecordEntity attendanceRecordEntity : updateList) {
attendanceRecordService.update(attendanceRecordEntity, context); attendanceRecordService.update(attendanceRecordEntity, context);
}*/ }*/
} }
}
}
};
ThreadPool.getInstance().execute(runnable);
}
} }
......
...@@ -536,10 +536,6 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract { ...@@ -536,10 +536,6 @@ public class FixWorkOtherAttendance extends AttendanceWorkAbstract {
AttendanceRecordErrorEntity attendanceRecordErrorEntity = errorService.selectOne(errorQuery, context); AttendanceRecordErrorEntity attendanceRecordErrorEntity = errorService.selectOne(errorQuery, context);
if (ObjectUtils.isEmpty(attendanceRecordErrorEntity)) { if (ObjectUtils.isEmpty(attendanceRecordErrorEntity)) {
errorService.save(errorEntity, context); errorService.save(errorEntity, context);
} else {
/* errorEntity.setId(attendanceRecordErrorEntity.getId());
errorService.update(errorEntity,context);*/
log.info("已经存在相同的已处理异常记录,不保存!");
} }
} }
} }
......
...@@ -37,8 +37,8 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord ...@@ -37,8 +37,8 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
Content-Type: application/json Content-Type: application/json
{ {
"attendanceDateStart": "2024-07-19", "attendanceDateStart": "2024-07-01",
"attendanceDateEnd": "2024-07-19" "attendanceDateEnd": "2024-08-15"
} }
###海康考勤打卡记录计算1 ###海康考勤打卡记录计算1
......
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