Commit 1259cd2d authored by 赵啸非's avatar 赵啸非

测试多线程优化考勤计算

parent 9298d6ee
......@@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.framework.util.StringUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.common.code.*;
import com.mortals.xhx.module.attendance.model.*;
import com.mortals.xhx.module.attendance.service.*;
......@@ -154,173 +153,162 @@ public class AttendanceRecordHikServiceImpl extends AbstractCRUDServiceImpl<Atte
for (Map.Entry<Long, List<AttendanceRecordHikEntity>> itemEntry : listMap.entrySet()) {
//按人员 todo 改为多线程并行计算
List<AttendanceRecordEntity> saveList = new ArrayList<>();
List<AttendanceRecordEntity> updateList = new ArrayList<>();
Long staffId = itemEntry.getKey();
List<AttendanceRecordHikEntity> recordHikEntityList = itemEntry.getValue();
Map<String, List<AttendanceRecordHikEntity>> dateRecordMap = recordHikEntityList.stream().collect(Collectors.groupingBy(hikEntity -> DateUtil.formatDate(hikEntity.getAttendanceDate())));
for (Map.Entry<String, List<AttendanceRecordHikEntity>> dateEntry : dateRecordMap.entrySet()) {
//按每日
String dateStr = dateEntry.getKey();
List<AttendanceRecordHikEntity> recordHikEntities = dateEntry.getValue();
if (ObjectUtils.isEmpty(recordHikEntities)) continue;
AttendanceRecordHikEntity item = recordHikEntities.get(0);
AttendanceRecordEntity attendanceRecordEntity = new AttendanceRecordEntity();
attendanceRecordEntity.initAttrValue();
Runnable runnable = new Runnable() {
@Override
public void run() {
List<AttendanceRecordEntity> saveList = new ArrayList<>();
List<AttendanceRecordEntity> updateList = new ArrayList<>();
Long staffId = itemEntry.getKey();
List<AttendanceRecordHikEntity> recordHikEntityList = itemEntry.getValue();
Map<String, List<AttendanceRecordHikEntity>> dateRecordMap = recordHikEntityList.stream().collect(Collectors.groupingBy(hikEntity -> DateUtil.formatDate(hikEntity.getAttendanceDate())));
for (Map.Entry<String, List<AttendanceRecordHikEntity>> dateEntry : dateRecordMap.entrySet()) {
//按每日
String dateStr = dateEntry.getKey();
List<AttendanceRecordHikEntity> recordHikEntities = dateEntry.getValue();
if (ObjectUtils.isEmpty(recordHikEntities)) continue;
AttendanceRecordHikEntity item = recordHikEntities.get(0);
AttendanceRecordEntity attendanceRecordEntity = new AttendanceRecordEntity();
attendanceRecordEntity.initAttrValue();
attendanceRecordEntity.setStaffId(item.getStaffId());
attendanceRecordEntity.setStaffName(item.getStaffName());
attendanceRecordEntity.setDeptId(item.getDeptId());
attendanceRecordEntity.setDeptName(item.getDeptName());
attendanceRecordEntity.setPositionId(item.getPositionId());
attendanceRecordEntity.setPositionName(item.getPositionName());
attendanceRecordEntity.setWorkNum(item.getWorkNum());
attendanceRecordEntity.setAttendanceDate(item.getAttendanceDate());
attendanceRecordEntity.setCreateTime(item.getAttendanceDate());
attendanceRecordEntity.setCreateUserId(attendanceRecordHikService.getContextUserId(context));
StaffEntity staffEntity = staffService.getExtCache(staffId.toString());
if (ObjectUtils.isEmpty(staffEntity)) {
//log.info("staffEntity is null ,staffId:{}", staffId);
continue;
}
attendanceRecordEntity.setStaffId(item.getStaffId());
attendanceRecordEntity.setStaffName(item.getStaffName());
attendanceRecordEntity.setDeptId(item.getDeptId());
attendanceRecordEntity.setDeptName(item.getDeptName());
attendanceRecordEntity.setPositionId(item.getPositionId());
attendanceRecordEntity.setPositionName(item.getPositionName());
attendanceRecordEntity.setWorkNum(item.getWorkNum());
attendanceRecordEntity.setAttendanceDate(item.getAttendanceDate());
attendanceRecordEntity.setCreateTime(item.getAttendanceDate());
attendanceRecordEntity.setCreateUserId(this.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.setSalaName(staffEntity.getSalaName());
attendanceRecordEntity.setSalaId(staffEntity.getSalaId());
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);
}
//通过员工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长度大于1 则该考勤人员有多个考勤组.
if (StringUtils.isNotNull(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() > 1) {
for (AttendanceGroupStaffEntity groupStaffEntity : attendanceGroupStaffEntities) {
detailEntityList = new ArrayList<>();
//多考勤组 todo 暂时和单一覆盖
//checkAttendGroupByOne(attendanceRecordEntity, detailEntityList, attendanceDate, groupStaffEntity, context);
//查询考勤组
// AttendanceGroupEntity attendanceGroupEntity = attendanceGroupService.get(groupStaffEntity.getGroupId(), context);
AttendanceGroupEntity attendanceGroupEntity = groupMap.get(groupStaffEntity.getGroupId());
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);
}
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);
}
}
//如果考勤人员信息list长度大于1 则该考勤人员有多个考勤组.
if (StringUtils.isNotNull(attendanceGroupStaffEntities) && attendanceGroupStaffEntities.size() > 1) {
for (AttendanceGroupStaffEntity groupStaffEntity : attendanceGroupStaffEntities) {
detailEntityList = new ArrayList<>();
//多考勤组 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 (!ObjectUtils.isEmpty(detailEntityList)) {
attendanceRecordEntity.setAttendanceRecordDetailList(detailEntityList);
//判断签到 只要存在一次正常打卡详细记录 就判断签到
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;
}
}
if (!ObjectUtils.isEmpty(detailEntityList)) {
attendanceRecordEntity.setAttendanceRecordDetailList(detailEntityList);
//判断签到 只要存在一次正常打卡详细记录 就判断签到
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;
}
}
if (YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignInResult() && YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignOutResult()) {
attendanceRecordEntity.setPunchResult(YesNoEnum.YES.getValue());
} else {
attendanceRecordEntity.setPunchResult(YesNoEnum.NO.getValue());
}
if (YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignInResult() && YesNoEnum.YES.getValue() == attendanceRecordEntity.getSignOutResult()) {
attendanceRecordEntity.setPunchResult(YesNoEnum.YES.getValue());
} else {
attendanceRecordEntity.setPunchResult(YesNoEnum.NO.getValue());
}
attendanceRecordEntity.setAttendType("现场打卡");
//判断是否存在记录 如果存在 则更新 维度 staffId attendanceDate shiftsId attendanceGroupId
AttendanceRecordQuery query = new AttendanceRecordQuery();
query.setStaffId(attendanceRecordEntity.getStaffId());
query.setAttendanceDateStart(dateStr);
query.setAttendanceDateEnd(dateStr);
attendanceRecordEntity.setAttendType("现场打卡");
//判断是否存在记录 如果存在 则更新 维度 staffId attendanceDate shiftsId attendanceGroupId
AttendanceRecordQuery query = new AttendanceRecordQuery();
query.setStaffId(attendanceRecordEntity.getStaffId());
query.setAttendanceDateStart(dateStr);
query.setAttendanceDateEnd(dateStr);
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);
}
}
AttendanceRecordEntity recordEntity = attendanceRecordService.selectOne(query);
if (!ObjectUtils.isEmpty(recordEntity)) {
attendanceRecordEntity.setId(recordEntity.getId());
attendanceRecordEntity.setUpdateTime(new Date());
attendanceRecordEntity.setUpdateUserId(this.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) {
attendanceRecordService.save(attendanceRecordEntity, context);
}*/
}
}
if (!ObjectUtils.isEmpty(updateList)) {
attendanceRecordService.update(updateList);
if (!ObjectUtils.isEmpty(updateList)) {
attendanceRecordService.update(updateList);
/* for (AttendanceRecordEntity attendanceRecordEntity : updateList) {
attendanceRecordService.update(attendanceRecordEntity, context);
}*/
}
}
};
ThreadPool.getInstance().execute(runnable);
}
}
}
......
......@@ -37,7 +37,7 @@ POST {{baseUrl}}/attendance/record/hik/addAttendanceRecord
Content-Type: application/json
{
"attendanceDateStart": "2024-07-01",
"attendanceDateStart": "2024-07-21",
"attendanceDateEnd": "2024-08-15"
}
......
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