|
|
package com.engine.jucailinkq.attendance.attendanceanalysis.wrapper;
|
|
|
|
|
|
import com.engine.jucailinkq.attendance.attendanceanalysis.dto.clockpoint.ClockPointDTO;
|
|
|
import com.engine.jucailinkq.attendance.attendanceanalysis.service.ComprehensiveWorkingHourService;
|
|
|
import com.engine.jucailinkq.attendance.attendanceanalysis.service.UtilService;
|
|
|
import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.ComprehensiveWorkingHourServiceImpl;
|
|
|
import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.UtilServiceImpl;
|
|
|
import com.engine.jucailinkq.attendance.enums.CheckBoxEnum;
|
|
|
import com.engine.jucailinkq.attendance.enums.ClassSegmentTypeEnum;
|
|
|
import com.engine.jucailinkq.common.util.CommonUtil;
|
|
|
import com.engine.jucailinkq.common.util.DateUtil;
|
|
|
import com.engine.common.util.ServiceUtil;
|
|
|
import com.engine.jucailinkq.common.util.ExtensionClassHolder;
|
|
|
import com.engine.jucailinkq.common.util.Utils;
|
|
|
import com.engine.core.impl.Service;
|
|
|
import com.google.common.collect.Lists;
|
|
|
import com.google.common.collect.Maps;
|
|
|
import com.google.common.collect.Sets;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import weaver.general.Util;
|
|
|
|
|
|
import java.time.ZoneOffset;
|
|
|
import java.util.Comparator;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 考勤分析主题逻辑
|
|
|
*/
|
|
|
@Slf4j
|
|
|
public class AttendanceAnalysisWrapper extends Service {
|
|
|
|
|
|
private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class);
|
|
|
private UpdateAttendanceResultWrapper updateAttendanceResultWrapper = ServiceUtil.getService(UpdateAttendanceResultWrapper.class);
|
|
|
private ComprehensiveWorkingHourService comprehensiveWorkingHourService = ServiceUtil.getService(ComprehensiveWorkingHourServiceImpl.class);
|
|
|
|
|
|
/**
|
|
|
* 考勤分析主逻辑入口
|
|
|
*
|
|
|
* @param userId 人员id
|
|
|
* @param dataList 打卡数据
|
|
|
*/
|
|
|
public void attendanceAnalysis(String userId, List<String> analysisDateList, List<Map<String, Object>> dataList, Map<String,Object> analysisParam, Map<String, Map<String, Object>> clockInTimeMap, Map<String, List<Map<String, Object>>> attendaceResultMap) {
|
|
|
log.debug("***********analysis userId:{} analysisDate:{} start***********", userId,analysisDateList);
|
|
|
log.debug("clockInTimeDate : [{}]", dataList);
|
|
|
|
|
|
/** 打卡数据 */
|
|
|
Map<String, List<Map<String, Object>>> collect = Maps.newHashMap();
|
|
|
if (dataList != null && dataList.size() > 0) {
|
|
|
collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("signdate"))));
|
|
|
}
|
|
|
String departmentid = Util.null2String(analysisParam.get("departmentId"));
|
|
|
String subcompanyid1 = Util.null2String(analysisParam.get("subCompanyId"));
|
|
|
|
|
|
Map<String,String> attendancePlanMap = (Map<String,String>)analysisParam.get("attendancePlanMap");
|
|
|
List<Map<String,Object>> generalAttendanceItems = (List<Map<String,Object>>)analysisParam.get("generalAttendanceItems");
|
|
|
Map<String,List<Map<String,Object>>> attendanceItemGroupByPlan = (Map<String,List<Map<String,Object>>>)analysisParam.get("attendanceItemGroupByPlan");
|
|
|
|
|
|
/**获得综合工时*/
|
|
|
List<Map<String,String>> comprehensiveWorkingHourList = (List<Map<String,String>>)analysisParam.get("comprehensiveWorkingHourList");
|
|
|
Map<String,List<Map<String,Object>>> workingHourGroupBy = (Map<String,List<Map<String,Object>>>)analysisParam.get("workingHourGroupBy");
|
|
|
|
|
|
for (String analysisDate :analysisDateList){
|
|
|
|
|
|
/**获得人员考勤项目*/
|
|
|
Map<String,Object> getAttendacneParamMap = Maps.newHashMap();
|
|
|
getAttendacneParamMap.put("userId",userId);
|
|
|
getAttendacneParamMap.put("departmentId",departmentid);
|
|
|
getAttendacneParamMap.put("subCompanyId",subcompanyid1);
|
|
|
getAttendacneParamMap.put("anysisyDate",analysisDate);
|
|
|
getAttendacneParamMap.put("seclevel",analysisParam.get("seclevel"));
|
|
|
getAttendacneParamMap.putAll(attendancePlanMap);
|
|
|
|
|
|
/**
|
|
|
* 获得综合工时
|
|
|
*/
|
|
|
List<Map<String, Object>> workHourItems = Lists.newArrayList();
|
|
|
List<Map<String,String>> analysisDateWorkingHourList = comprehensiveWorkingHourList.stream().filter(e->{
|
|
|
if ((!"".equals(Util.null2String(e.get("bdate"))) && DateUtil.getTime(analysisDate).compareTo(DateUtil.getTime(e.get("bdate"))) <0) ||
|
|
|
(!"".equals(Util.null2String(e.get("edate"))) && DateUtil.getTime(analysisDate).compareTo(DateUtil.getTime(e.get("edate"))) > 0)){
|
|
|
return false;
|
|
|
}else {
|
|
|
return true;
|
|
|
}
|
|
|
}).collect(Collectors.toList());
|
|
|
if (analysisDateWorkingHourList.size() > 0){
|
|
|
analysisDateWorkingHourList = analysisDateWorkingHourList.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("priority")))).collect(Collectors.toList());
|
|
|
if (workingHourGroupBy.get(analysisDateWorkingHourList.get(0).get("dataid")) != null &&
|
|
|
workingHourGroupBy.get(analysisDateWorkingHourList.get(0).get("dataid")).size()>0){
|
|
|
workHourItems.addAll(workingHourGroupBy.get(analysisDateWorkingHourList.get(0).get("dataid")));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/** 获取人员班次*/
|
|
|
Map<String, Object> classesParamMap = Maps.newHashMap();
|
|
|
classesParamMap.put("startDate", analysisDate);
|
|
|
classesParamMap.put("endDate", analysisDate);
|
|
|
classesParamMap.put("pbdx", userId);
|
|
|
classesParamMap.put("clockInTimeMap", clockInTimeMap);
|
|
|
classesParamMap.put("clockInData", dataList);
|
|
|
classesParamMap.put("allScheduleList",analysisParam.get("allScheduleList"));
|
|
|
classesParamMap.put("allClassInfoList",analysisParam.get("allClassInfoList"));
|
|
|
classesParamMap.put("allOverPlanList",analysisParam.get("allOverPlanList"));
|
|
|
classesParamMap.put("attendaceResultMap",attendaceResultMap);
|
|
|
classesParamMap.put("evectionList",analysisParam.get("evectionList"));
|
|
|
classesParamMap.put("askforList",analysisParam.get("askforList"));
|
|
|
classesParamMap.put("hxbzList",analysisParam.get("hxbzList"));
|
|
|
|
|
|
List<Map<String, Object>> analysisDateAttendaceResult = attendaceResultMap.get(analysisDate);
|
|
|
List<Map<String, Object>> analysisDateAttendanceItems =Lists.newArrayList();
|
|
|
Map<String, Object> schedulMap = null;
|
|
|
if (analysisDateAttendaceResult == null || analysisDateAttendaceResult.size() == 0 || (!CheckBoxEnum.CHECKED.getKey().equals(analysisDateAttendaceResult.get(0).get("sgsj")) &&
|
|
|
!"3".equals(analysisDateAttendaceResult.get(0).get("sjzt")))) {
|
|
|
/**人员换了部门,需班次、分部、部门继续走老的*/
|
|
|
if (analysisDateAttendaceResult!=null && analysisDateAttendaceResult.size() >0 && (!analysisDateAttendaceResult.get(0).get("fbid").equals(subcompanyid1) || !analysisDateAttendaceResult.get(0).get("bm").equals(departmentid))){
|
|
|
String olddepartmentid = analysisDateAttendaceResult.get(0).get("bm").toString();
|
|
|
String oldsubCompanyid = analysisDateAttendaceResult.get(0).get("fbid").toString();
|
|
|
|
|
|
//旧的考勤项目
|
|
|
getAttendacneParamMap.put("departmentId",olddepartmentid);
|
|
|
getAttendacneParamMap.put("subCompanyId",oldsubCompanyid);
|
|
|
Map<String, Object> attendanceItemresultMap = utilService.getAttendanceItems(getAttendacneParamMap);
|
|
|
Set<String> attendanceItems = (Set<String>)attendanceItemresultMap.get("attendanceItems");
|
|
|
for (String attendanceItemId:attendanceItems){
|
|
|
if (attendanceItemGroupByPlan.get(attendanceItemId) != null &&
|
|
|
attendanceItemGroupByPlan.get(attendanceItemId).size()>0){
|
|
|
analysisDateAttendanceItems.addAll(attendanceItemGroupByPlan.get(attendanceItemId));
|
|
|
}
|
|
|
}
|
|
|
analysisDateAttendanceItems.addAll(generalAttendanceItems);
|
|
|
|
|
|
|
|
|
//旧的综合工时
|
|
|
Map<String,Object> workhourpersonOrganzationMap = (Map<String,Object>)analysisParam.get("workhourpersonOrganzationMap");
|
|
|
Map<String,Object> workhourdepartMentMap = (Map<String,Object>)analysisParam.get("workhourdepartMentMap");
|
|
|
Map<String,Object> workhoursubCompanyMap = (Map<String,Object>)analysisParam.get("workhoursubCompanyMap");
|
|
|
|
|
|
|
|
|
//旧的班次
|
|
|
classesParamMap.put("olddepartmentid",olddepartmentid);
|
|
|
classesParamMap.put("oldsubCompanyid",oldsubCompanyid);
|
|
|
classesParamMap.put("attendanceItems", analysisDateAttendanceItems);
|
|
|
schedulMap = utilService.getSchedulingInFormation(classesParamMap);
|
|
|
}else {
|
|
|
Map<String, Object> attendanceItemresultMap = utilService.getAttendanceItems(getAttendacneParamMap);
|
|
|
Set<String> attendanceItems = (Set<String>)attendanceItemresultMap.get("attendanceItems");
|
|
|
for (String attendanceItemId:attendanceItems){
|
|
|
if (attendanceItemGroupByPlan.get(attendanceItemId) != null &&
|
|
|
attendanceItemGroupByPlan.get(attendanceItemId).size()>0){
|
|
|
analysisDateAttendanceItems.addAll(attendanceItemGroupByPlan.get(attendanceItemId));
|
|
|
}
|
|
|
}
|
|
|
analysisDateAttendanceItems.addAll(generalAttendanceItems);
|
|
|
|
|
|
classesParamMap.put("attendanceItems", analysisDateAttendanceItems);
|
|
|
schedulMap = utilService.getSchedulingInFormation(classesParamMap);
|
|
|
}
|
|
|
|
|
|
Map<String, List<Map<String, Object>>> schedulingResultsMap = (Map<String, List<Map<String, Object>>>) schedulMap.get("schedulingResultsMap");
|
|
|
|
|
|
Map<String, Object> getClockTimeParam = Maps.newHashMap();
|
|
|
getClockTimeParam.put("date", analysisDate);
|
|
|
getClockTimeParam.put("clockInTimeList", dataList);
|
|
|
getClockTimeParam.put("clockInTimeCollect", collect);
|
|
|
getClockTimeParam.put("schedulingResultCollect", schedulingResultsMap);
|
|
|
getClockTimeParam.put("clockInTimeMap", clockInTimeMap);
|
|
|
getClockTimeParam.put("userId", userId);
|
|
|
|
|
|
//打卡数据
|
|
|
List<Map<String, Object>> analysisDateClockInTimeList = utilService.getClockInTime(getClockTimeParam);
|
|
|
//分析考勤
|
|
|
Map<String, Object> recordDataTime1 = analysis(userId, analysisDate, analysisDateClockInTimeList, schedulingResultsMap.get(analysisDate), analysisDateAttendanceItems, workHourItems,(Map<String,Object>)schedulMap.get("clockInTimeDataMap"),
|
|
|
(List<Map<String,Object>>)analysisParam.get("evectionList"),(List<Map<String,Object>>)analysisParam.get("askforList"));
|
|
|
clockInTimeMap.put(analysisDate, recordDataTime1);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 考勤分析主逻辑入口
|
|
|
*
|
|
|
* @param userId 人员id
|
|
|
* @param analysisDate 分析日期
|
|
|
* @param dataList 需要包含分析日期以及分析日期前后2天的3天打卡数据
|
|
|
*/
|
|
|
public void attendanceAnalysisForApi(String userId, String analysisDate, List<Map<String, Object>> dataList,Map<String,Object> analysisParam , Map<String, Map<String, Object>> clockInTimeMap,Map<String, List<Map<String, Object>>> attendaceResultMap) {
|
|
|
log.debug("***********analysis userId:{},analysisDate:{} start***********", userId, analysisDate);
|
|
|
log.debug("clockInTimeDate : [{}]", dataList);
|
|
|
List<Map<String, Object>> attendaceResult = attendaceResultMap.get(analysisDate);
|
|
|
|
|
|
log.debug("attendaceResult : [{}]",attendaceResult);
|
|
|
if (attendaceResult!=null && attendaceResult.size()>0 && (CheckBoxEnum.CHECKED.getKey().equals(attendaceResult.get(0).get("sgsj")) ||
|
|
|
"3".equals(attendaceResult.get(0).get("sjzt")))) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
Map<String, List<Map<String, Object>>> collect = Maps.newHashMap();
|
|
|
if (dataList != null && dataList.size() > 0) {
|
|
|
collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("signdate"))));
|
|
|
}
|
|
|
List<Map<String,Object>> generalAttendanceItems = (List<Map<String,Object>>)analysisParam.get("generalAttendanceItems");
|
|
|
|
|
|
Map<String,String> attendancePlanMap = (Map<String,String>)analysisParam.get("attendancePlanMap");
|
|
|
Map<String,List<Map<String,Object>>> attendanceItemGroupByPlan = (Map<String,List<Map<String,Object>>>)analysisParam.get("attendanceItemGroupByPlan");
|
|
|
List<Map<String,String>> comprehensiveWorkingHourList = (List<Map<String,String>>)analysisParam.get("comprehensiveWorkingHourList");
|
|
|
Map<String,List<Map<String,Object>>> workingHourGroupBy = (Map<String,List<Map<String,Object>>>)analysisParam.get("workingHourGroupBy");
|
|
|
|
|
|
String departmentid = Util.null2String(analysisParam.get("departmentId"));
|
|
|
String subcompanyid1 = Util.null2String(analysisParam.get("subCompanyId"));
|
|
|
|
|
|
|
|
|
/**获得人员考勤项目*/
|
|
|
Map<String,Object> getAttendacneParamMap = Maps.newHashMap();
|
|
|
getAttendacneParamMap.put("userId",userId);
|
|
|
getAttendacneParamMap.put("departmentId",departmentid);
|
|
|
getAttendacneParamMap.put("subCompanyId",subcompanyid1);
|
|
|
getAttendacneParamMap.put("anysisyDate",analysisDate);
|
|
|
getAttendacneParamMap.put("seclevel",analysisParam.get("seclevel"));
|
|
|
getAttendacneParamMap.putAll(attendancePlanMap);
|
|
|
|
|
|
/**
|
|
|
* 获得综合工时
|
|
|
*/
|
|
|
List<Map<String, Object>> workHourItems = Lists.newArrayList();
|
|
|
List<Map<String,String>> analysisDateWorkingHourList = comprehensiveWorkingHourList.stream().filter(e->{
|
|
|
if ((!"".equals(Util.null2String(e.get("bdate"))) && DateUtil.getTime(analysisDate).compareTo(DateUtil.getTime(e.get("bdate"))) <0) ||
|
|
|
(!"".equals(Util.null2String(e.get("edate"))) && DateUtil.getTime(analysisDate).compareTo(DateUtil.getTime(e.get("edate"))) > 0)){
|
|
|
return false;
|
|
|
}else {
|
|
|
return true;
|
|
|
}
|
|
|
}).collect(Collectors.toList());
|
|
|
if (analysisDateWorkingHourList.size() > 0){
|
|
|
analysisDateWorkingHourList = analysisDateWorkingHourList.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("priority")))).collect(Collectors.toList());
|
|
|
if (workingHourGroupBy.get(analysisDateWorkingHourList.get(0).get("dataid")) != null &&
|
|
|
workingHourGroupBy.get(analysisDateWorkingHourList.get(0).get("dataid")).size()>0){
|
|
|
workHourItems.addAll(workingHourGroupBy.get(analysisDateWorkingHourList.get(0).get("dataid")));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/** 获取人员班次*/
|
|
|
Map<String, Object> classesParamMap = Maps.newHashMap();
|
|
|
classesParamMap.put("startDate", analysisDate);
|
|
|
classesParamMap.put("endDate", analysisDate);
|
|
|
classesParamMap.put("pbdx", userId);
|
|
|
classesParamMap.put("clockInTimeMap", clockInTimeMap);
|
|
|
classesParamMap.put("clockInData", dataList);
|
|
|
classesParamMap.put("allScheduleList",analysisParam.get("allScheduleList"));
|
|
|
classesParamMap.put("allClassInfoList",analysisParam.get("allClassInfoList"));
|
|
|
classesParamMap.put("allOverPlanList",analysisParam.get("allOverPlanList"));
|
|
|
classesParamMap.put("attendaceResultMap",attendaceResultMap);
|
|
|
classesParamMap.put("evectionList",analysisParam.get("evectionList"));
|
|
|
classesParamMap.put("askforList",analysisParam.get("askforList"));
|
|
|
classesParamMap.put("hxbzList",analysisParam.get("hxbzList"));
|
|
|
Map<String, Object> schedulMap = null;
|
|
|
List<Map<String, Object>> analysisDateAttendanceItems =Lists.newArrayList();
|
|
|
/**人员换了部门,需班次、分部、部门继续走老的*/
|
|
|
if (attendaceResult!=null && attendaceResult.size() >0 && (!attendaceResult.get(0).get("fbid").equals(subcompanyid1) || !attendaceResult.get(0).get("bm").equals(departmentid))){
|
|
|
String olddepartmentid = attendaceResult.get(0).get("bm").toString();
|
|
|
String oldsubCompanyid = attendaceResult.get(0).get("fbid").toString();
|
|
|
|
|
|
//旧的考勤项目
|
|
|
getAttendacneParamMap.put("departmentId",olddepartmentid);
|
|
|
getAttendacneParamMap.put("subCompanyId",oldsubCompanyid);
|
|
|
Map<String, Object> attendanceItemresultMap = utilService.getAttendanceItems(getAttendacneParamMap);
|
|
|
Set<String> attendanceItems = (Set<String>)attendanceItemresultMap.get("attendanceItems");
|
|
|
for (String attendanceItemId:attendanceItems){
|
|
|
if (attendanceItemGroupByPlan.get(attendanceItemId) != null &&
|
|
|
attendanceItemGroupByPlan.get(attendanceItemId).size()>0){
|
|
|
analysisDateAttendanceItems.addAll(attendanceItemGroupByPlan.get(attendanceItemId));
|
|
|
}
|
|
|
}
|
|
|
analysisDateAttendanceItems.addAll(generalAttendanceItems);
|
|
|
|
|
|
|
|
|
//旧的综合工时
|
|
|
Map<String,Object> workhourpersonOrganzationMap = (Map<String,Object>)analysisParam.get("workhourpersonOrganzationMap");
|
|
|
Map<String,Object> workhourdepartMentMap = (Map<String,Object>)analysisParam.get("workhourdepartMentMap");
|
|
|
Map<String,Object> workhoursubCompanyMap = (Map<String,Object>)analysisParam.get("workhoursubCompanyMap");
|
|
|
|
|
|
|
|
|
//旧的班次
|
|
|
classesParamMap.put("olddepartmentid",olddepartmentid);
|
|
|
classesParamMap.put("oldsubCompanyid",oldsubCompanyid);
|
|
|
classesParamMap.put("attendanceItems", analysisDateAttendanceItems);
|
|
|
schedulMap = utilService.getSchedulingInFormation(classesParamMap);
|
|
|
}else {
|
|
|
classesParamMap.put("attendanceItems", analysisDateAttendanceItems);
|
|
|
Map<String, Object> attendanceItemresultMap = utilService.getAttendanceItems(getAttendacneParamMap);
|
|
|
Set<String> attendanceItems = (Set<String>)attendanceItemresultMap.get("attendanceItems");
|
|
|
for (String attendanceItemId:attendanceItems){
|
|
|
if (attendanceItemGroupByPlan.get(attendanceItemId) != null &&
|
|
|
attendanceItemGroupByPlan.get(attendanceItemId).size()>0){
|
|
|
analysisDateAttendanceItems.addAll(attendanceItemGroupByPlan.get(attendanceItemId));
|
|
|
}
|
|
|
}
|
|
|
analysisDateAttendanceItems.addAll(generalAttendanceItems);
|
|
|
|
|
|
classesParamMap.put("attendanceItems", analysisDateAttendanceItems);
|
|
|
schedulMap = utilService.getSchedulingInFormation(classesParamMap);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Map<String, List<Map<String, Object>>> schedulingResultsMap = (Map<String, List<Map<String, Object>>>) schedulMap.get("schedulingResultsMap");
|
|
|
|
|
|
Map<String, Object> getClockTimeParam = Maps.newHashMap();
|
|
|
getClockTimeParam.put("date", analysisDate);
|
|
|
getClockTimeParam.put("clockInTimeList", dataList);
|
|
|
getClockTimeParam.put("schedulingResultCollect", schedulingResultsMap);
|
|
|
getClockTimeParam.put("clockInTimeMap", clockInTimeMap);
|
|
|
getClockTimeParam.put("clockInTimeCollect", collect);
|
|
|
getClockTimeParam.put("userId", userId);
|
|
|
getClockTimeParam.put("workHourItems",workHourItems);
|
|
|
|
|
|
//打卡数据
|
|
|
List<Map<String, Object>> analysisDateClockInTimeList = utilService.getClockInTime(getClockTimeParam);
|
|
|
Map<String, Object> recordDataTime1 = analysis(userId, analysisDate, analysisDateClockInTimeList, schedulingResultsMap.get(analysisDate), analysisDateAttendanceItems, workHourItems,(Map<String,Object>)schedulMap.get("clockInTimeDataMap"),
|
|
|
(List<Map<String,Object>>)analysisParam.get("evectionList"),(List<Map<String,Object>>)analysisParam.get("askforList"));
|
|
|
clockInTimeMap.put(analysisDate, recordDataTime1);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 分析数据
|
|
|
*
|
|
|
* @param userId 分析人员
|
|
|
* @param analysisDate 分析日期
|
|
|
* @param clockInTimeList 打卡数据
|
|
|
* @param scheduleResult 班次
|
|
|
* @param attendanceItems 考勤项目
|
|
|
*/
|
|
|
public Map<String, Object> analysis(String userId, String analysisDate, List<Map<String, Object>> clockInTimeList, List<Map<String, Object>> scheduleResult, List<Map<String, Object>> attendanceItems, List<Map<String, Object>> workHourItems
|
|
|
,Map<String,Object> clockInTimeDataMap,List<Map<String, Object>> evectionList,List<Map<String, Object>> askforList) {
|
|
|
Map<String, Object> recordParam = Maps.newHashMap();
|
|
|
Map<String, String> formModeIdMap = Utils.getFormmodeIdMap();
|
|
|
recordParam.put("userId", userId);
|
|
|
recordParam.put("analysisDate", analysisDate);
|
|
|
recordParam.put("classInfo", scheduleResult);
|
|
|
recordParam.put("formmodeIdMap", formModeIdMap);
|
|
|
recordParam.put("attendanceDuration", 0);
|
|
|
|
|
|
recordParam.put("modeId", formModeIdMap.get("uf_jcl_kq_cqjg"));
|
|
|
|
|
|
Map<String, Object> workingHourparam = Maps.newHashMap();
|
|
|
workingHourparam.put("clockInTimeCollect", clockInTimeList);
|
|
|
workingHourparam.put("analysisDate", analysisDate);
|
|
|
workingHourparam.put("userId", userId);
|
|
|
workingHourparam.put("attendanceItems", attendanceItems);
|
|
|
workingHourparam.put("scheduleResult", scheduleResult);
|
|
|
workingHourparam.put("evectionList",evectionList);
|
|
|
workingHourparam.put("askforList",askforList);
|
|
|
|
|
|
/**
|
|
|
* 津贴
|
|
|
*/
|
|
|
Map<String, Object> allowanceMap = updateAttendanceResultWrapper.allowanceHandle(recordParam);
|
|
|
|
|
|
if (workHourItems != null && workHourItems.size() > 0) {
|
|
|
workingHourparam.put("workHourItem", workHourItems.get(0));
|
|
|
String ifPriority = Util.null2String(workHourItems.get(0).get("hlpbyxsyzhgs"));
|
|
|
//核算工时的日期类型
|
|
|
String hsgsdrqlx = Util.null2String(workHourItems.get(0).get("hsgsdrqlx"));
|
|
|
String rqlx = Utils.getDateType(analysisDate, Util.null2String(workHourItems.get(0).get("qyrl")));
|
|
|
|
|
|
if (CheckBoxEnum.CHECKED.getKey().equals(ifPriority) && CommonUtil.ifContainStr(hsgsdrqlx, rqlx, ",")) {
|
|
|
//综合工时
|
|
|
return (Map<String,Object>)comprehensiveWorkingHourService.excuteByWorkHour(workingHourparam).get("recordDataTime");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (scheduleResult == null || scheduleResult.size() == 0) {
|
|
|
//没有排班
|
|
|
Map<String, Object> params = Maps.newHashMap();
|
|
|
params.put("userId", userId);
|
|
|
params.put("analysisDate", analysisDate);
|
|
|
params.put("clockInTimeCollect", clockInTimeList);
|
|
|
params.put("modeId", formModeIdMap.get("uf_jcl_kq_cqjg"));
|
|
|
params.put("workHourItems", workHourItems);
|
|
|
params.put("attendanceItems", attendanceItems);
|
|
|
params.put("allowanceMap", allowanceMap);
|
|
|
|
|
|
return (Map<String,Object>)updateAttendanceResultWrapper.recordNoClass(params).get("recordDataTime");
|
|
|
}
|
|
|
recordParam.put("rqlx", scheduleResult.get(0).get("rqlx"));
|
|
|
//休息班次,休息班打卡自动加班不算自动加班,扣除原有的工作时段
|
|
|
if (scheduleResult.get(0).get("sfxx") != null && CheckBoxEnum.CHECKED.getKey().equals(scheduleResult.get(0).get("sfxx")) &&
|
|
|
scheduleResult.get(0).get("xxbdkzdjb") != null && CheckBoxEnum.UNCHECKED.getKey().equals(scheduleResult.get(0).get("xxbdkzdjb"))) {
|
|
|
List<Map<String,Object>> overTimePlanList = scheduleResult.stream().filter(e->e.get("bdlx").equals(ClassSegmentTypeEnum.OVERTIME_PLAN.getKey())).collect(Collectors.toList());
|
|
|
if (overTimePlanList.size() >0){
|
|
|
scheduleResult = scheduleResult.stream().filter(e->ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(e.get("bdlx")) || Utils.ifRestClassSegment(e.get("bdlx").toString()) || Utils.ifAskforOrEvctionClassSegment(e.get("bdlx").toString())).collect(Collectors.toList());
|
|
|
}else {
|
|
|
//没有加班计划,直接记为休息
|
|
|
updateAttendanceResultWrapper.recordRest(recordParam);
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
List<Map<String, Object>> askForLeaveAndEvctionSchedule = Lists.newArrayList();
|
|
|
//请假记录
|
|
|
Map<String, Object> askForLeaveDataMap = updateAttendanceResultWrapper.getAskForLeave(workingHourparam);
|
|
|
if (askForLeaveDataMap.get("alldayVaction") != null) {
|
|
|
//全天请假
|
|
|
recordParam.put("cqzt", CheckBoxEnum.UNCHECKED.getKey());
|
|
|
recordParam.put("recordData", askForLeaveDataMap.get("alldayVaction"));
|
|
|
utilService.recordItem(recordParam);
|
|
|
return null;
|
|
|
}
|
|
|
askForLeaveAndEvctionSchedule.addAll((List<Map<String, Object>>) askForLeaveDataMap.get("askForLeaveSchedule"));
|
|
|
|
|
|
//出差记录
|
|
|
Map<String, Object> evectionDataMap = updateAttendanceResultWrapper.getEvection(workingHourparam);
|
|
|
if (evectionDataMap.get("alldayEvection") != null) {
|
|
|
//全天出差
|
|
|
recordParam.put("cqzt", CheckBoxEnum.UNCHECKED.getKey());
|
|
|
recordParam.put("recordData", evectionDataMap.get("alldayEvection"));
|
|
|
utilService.recordItem(recordParam);
|
|
|
return null;
|
|
|
}
|
|
|
askForLeaveAndEvctionSchedule.addAll((List<Map<String, Object>>) evectionDataMap.get("evectionSchedule"));
|
|
|
|
|
|
|
|
|
if (askForLeaveAndEvctionSchedule.size() > 0) {
|
|
|
askForLeaveAndEvctionSchedule = mergeAskForLeaveAndEvctionSchedule(askForLeaveAndEvctionSchedule, analysisDate);
|
|
|
}
|
|
|
Map<String, Object> clcokInTimeDataParam = Maps.newHashMap();
|
|
|
clcokInTimeDataParam.put("analysisDate", analysisDate);
|
|
|
clcokInTimeDataParam.put("scheduleResult", scheduleResult);
|
|
|
clcokInTimeDataParam.put("clockInTimeList", clockInTimeList);
|
|
|
clcokInTimeDataParam.put("askForLeaveAndEvctionSchedule", askForLeaveAndEvctionSchedule);
|
|
|
|
|
|
//打卡卡点以及匹配的打卡时间
|
|
|
List<ClockPointDTO> clcokInTimeData = null;
|
|
|
if (clockInTimeDataMap.get(analysisDate) != null){
|
|
|
clcokInTimeData = (List<ClockPointDTO>)clockInTimeDataMap.get(analysisDate);
|
|
|
}else {
|
|
|
clcokInTimeData = utilService.getClockInPointCmd(clcokInTimeDataParam);
|
|
|
}
|
|
|
|
|
|
Map<String, Object> recordAbnormalParam = Maps.newHashMap();
|
|
|
recordAbnormalParam.put("clcokInTimeData", clcokInTimeData);
|
|
|
recordAbnormalParam.put("attendanceItems", attendanceItems);
|
|
|
recordAbnormalParam.put("scheduleResult", scheduleResult);
|
|
|
recordAbnormalParam.put("analysisDate", analysisDate);
|
|
|
recordAbnormalParam.put("userId", userId);
|
|
|
recordAbnormalParam.put("rqlx", scheduleResult.get(0).get("rqlx"));
|
|
|
|
|
|
recordAbnormalParam.put("formmodeIdMap", formModeIdMap);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 计算是否考勤异常,是否有早退、迟到、漏卡的情况
|
|
|
*
|
|
|
**/
|
|
|
|
|
|
recordAbnormalParam.put("askForLeaveList", askForLeaveDataMap.get("askForLeaveList"));
|
|
|
recordAbnormalParam.put("askForLeaveItems", askForLeaveDataMap.get("askForLeaveItems"));
|
|
|
recordAbnormalParam.put("evectionList", evectionDataMap.get("evectionList"));
|
|
|
recordAbnormalParam.put("evectionItems", evectionDataMap.get("evectionItems"));
|
|
|
|
|
|
List<Map<String, Object>> abnormalClockInList = updateAttendanceResultWrapper.recordAbnormalClockIn(recordAbnormalParam);
|
|
|
|
|
|
/**
|
|
|
* 出勤津贴
|
|
|
*/
|
|
|
recordAbnormalParam.put("abnormalClockInList", abnormalClockInList);
|
|
|
//recordAbnormalParam.put("notRecordAbnormalClockInList", notRecordAbnormalClockInList);
|
|
|
String ifnotWork = Util.null2String(allowanceMap.get("ifnotWork"));
|
|
|
if (!"".equals(ifnotWork)) {
|
|
|
//次日免班
|
|
|
recordParam.put("recordData", Lists.newArrayList());
|
|
|
recordParam.put("recordDataTime", Maps.newHashMap());
|
|
|
recordParam.put("attendanceDuration", scheduleResult.get(0).get("edsc").toString());
|
|
|
recordParam.put("cqzt", CheckBoxEnum.UNCHECKED.getKey());
|
|
|
utilService.recordItem(recordParam);
|
|
|
return null;
|
|
|
}
|
|
|
if (!"".equals(Util.null2String(allowanceMap.get("delayMinute")))) {
|
|
|
recordAbnormalParam.put("delayMinute", allowanceMap.get("delayMinute"));
|
|
|
updateAttendanceResultWrapper.removeAbnormal(recordAbnormalParam);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 请假
|
|
|
*/
|
|
|
Map<String, Object> vactionMap = updateAttendanceResultWrapper.recordAskForLeave(recordAbnormalParam);
|
|
|
List<Map<String, Object>> abnormalClockInListByAskForLeave = (List<Map<String, Object>>) vactionMap.get("abnormalClockInList");
|
|
|
List<Map<String, Object>> vactionList = (List<Map<String, Object>>) vactionMap.get("resultList");
|
|
|
recordAbnormalParam.put("offsetAskForLeaveAnomaly", vactionMap.get("offsetAskForLeaveAnomaly"));
|
|
|
recordAbnormalParam.put("askForLeaveToOffsetAbnomaly",vactionMap.get("askForLeaveToOffsetAbnomaly"));
|
|
|
log.debug("请假后消除的异常 : [{}]", vactionMap.get("offsetAskForLeaveAnomaly"));
|
|
|
/**
|
|
|
* 出差、外出
|
|
|
*/
|
|
|
recordAbnormalParam.put("abnormalClockInList", abnormalClockInListByAskForLeave);
|
|
|
|
|
|
Map<String, Object> recordEvection = updateAttendanceResultWrapper.recordEvection(recordAbnormalParam);
|
|
|
List<Map<String, Object>> abnormalClockInListByEvction = (List<Map<String, Object>>) recordEvection.get("abnormalClockInList");
|
|
|
List<Map<String, Object>> evectionResultList = (List<Map<String, Object>>) recordEvection.get("resultList");
|
|
|
|
|
|
recordAbnormalParam.put("abnormalClockInList", abnormalClockInListByEvction);
|
|
|
recordAbnormalParam.put("offsetEvectionAnomaly", recordEvection.get("offsetEvectionAnomaly"));
|
|
|
recordAbnormalParam.put("evectionToOffsetAbnomaly",recordEvection.get("evectionToOffsetAbnomaly"));
|
|
|
log.debug("出差外出后消除的异常 : [{}]", recordEvection.get("offsetEvectionAnomaly"));
|
|
|
/**
|
|
|
* 加班
|
|
|
* workOverTimeItemList:加班项目集合
|
|
|
* overTimeHolidayList:假期余额集合
|
|
|
* overTimeResultList:加班结果余额
|
|
|
*/
|
|
|
Map<String, Object> recordWorkOverTime = updateAttendanceResultWrapper.recordWorkOverTime(recordAbnormalParam);
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 计算出勤时长
|
|
|
*/
|
|
|
double attendanceDuration = utilService.computeAttendanceDuration(recordAbnormalParam);
|
|
|
|
|
|
/**
|
|
|
* 入库
|
|
|
*/
|
|
|
List<Map<String, Object>> recordData = Lists.newArrayList();
|
|
|
recordData.addAll(vactionList);
|
|
|
recordData.addAll(evectionResultList);
|
|
|
abnormalClockInListByEvction = abnormalClockInListByEvction.stream().filter(e -> (boolean) e.get("record")).collect(Collectors.toList());
|
|
|
recordData.addAll(abnormalClockInListByEvction);
|
|
|
List<Map<String, Object>> workOverTimeItemList = (List<Map<String, Object>>)recordWorkOverTime.get("workOverTimeItemList");
|
|
|
if (workOverTimeItemList.size() > 0){
|
|
|
recordData.addAll(workOverTimeItemList);
|
|
|
}
|
|
|
recordParam.put("recordData", recordData);
|
|
|
recordParam.put("recordDataTime", utilService.getNeedRecordClockInTime(clcokInTimeData));
|
|
|
recordParam.put("attendanceDuration", attendanceDuration);
|
|
|
recordParam.put("overTimeHolidayList",recordWorkOverTime.get("overTimeHolidayList") == null?Lists.newArrayList():recordWorkOverTime.get("overTimeHolidayList"));
|
|
|
recordParam.put("overTimeResultList",recordWorkOverTime.get("overTimeResultList") == null?Lists.newArrayList():recordWorkOverTime.get("overTimeResultList"));
|
|
|
log.debug("recordParam : {}", recordParam);
|
|
|
if (abnormalClockInListByEvction.size() > 0) {
|
|
|
recordParam.put("cqzt", CheckBoxEnum.CHECKED.getKey());
|
|
|
} else {
|
|
|
recordParam.put("cqzt", CheckBoxEnum.UNCHECKED.getKey());
|
|
|
}
|
|
|
|
|
|
//休息班次,休息班打卡自动加班不算自动加班,且为正常
|
|
|
if (scheduleResult.get(0).get("sfxx") != null && CheckBoxEnum.CHECKED.getKey().equals(scheduleResult.get(0).get("sfxx"))) {
|
|
|
recordParam.put("sfxx", CheckBoxEnum.CHECKED.getKey());
|
|
|
recordParam.put("cqzt", CheckBoxEnum.UNCHECKED.getKey());
|
|
|
recordParam.put("attendanceDuration", 0);
|
|
|
}
|
|
|
utilService.recordItem(recordParam);
|
|
|
return (Map<String, Object>) recordParam.get("recordDataTime");
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 合并请假或出差
|
|
|
*
|
|
|
* @param askForLeaveAndEvctionSchedule
|
|
|
* @param analysisDate
|
|
|
* @return
|
|
|
*/
|
|
|
public List<Map<String, Object>> mergeAskForLeaveAndEvctionSchedule(List<Map<String, Object>> askForLeaveAndEvctionSchedule, String analysisDate) {
|
|
|
|
|
|
askForLeaveAndEvctionSchedule = askForLeaveAndEvctionSchedule.stream().sorted(Comparator.comparing(e -> DateUtil.getTime(Utils.getkssjTime(e, analysisDate)).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList());
|
|
|
|
|
|
for (int i = 0; i < askForLeaveAndEvctionSchedule.size() - 1; i++) {
|
|
|
String beforeDtkssj = Utils.getkssjTime(askForLeaveAndEvctionSchedule.get(i),analysisDate);
|
|
|
String beforeDtjssj = Utils.getjssjTime(askForLeaveAndEvctionSchedule.get(i),analysisDate);
|
|
|
|
|
|
for (int j = i + 1; j < askForLeaveAndEvctionSchedule.size(); j++) {
|
|
|
String dtkssj = Utils.getkssjTime(askForLeaveAndEvctionSchedule.get(j),analysisDate);
|
|
|
String dtjssj = Utils.getjssjTime(askForLeaveAndEvctionSchedule.get(j),analysisDate);
|
|
|
if (DateUtil.getTime(beforeDtjssj).compareTo(DateUtil.getTime(dtkssj)) == 0) {
|
|
|
askForLeaveAndEvctionSchedule.get(i).put("dtjssj", dtjssj);
|
|
|
askForLeaveAndEvctionSchedule.get(i).put("jsdk", askForLeaveAndEvctionSchedule.get(j).get("jsdk"));
|
|
|
askForLeaveAndEvctionSchedule.get(i).put("thfghlfzs", askForLeaveAndEvctionSchedule.get(j).get("thfghlfzs"));
|
|
|
askForLeaveAndEvctionSchedule.remove(askForLeaveAndEvctionSchedule.get(j));
|
|
|
j--;
|
|
|
i--;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return askForLeaveAndEvctionSchedule;
|
|
|
}
|
|
|
}
|