package com.engine.attendance.attendanceanalysis.service.impl; import com.engine.attendance.attendanceanalysis.cmd.item.*; import com.engine.attendance.attendanceanalysis.service.AbnormalAttendanceService; import com.engine.attendance.enums.*; import com.engine.common.util.Utils; import com.engine.core.impl.Service; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import weaver.general.Util; import java.util.List; import java.util.Map; @Slf4j public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAttendanceService { @Override public Map fullDayAbsenteeism(Map params) { return null; } @Override public List> beLate(Map params) { //当前单条明细班次 Map classInfo = (Map)params.get("classInfo"); //当前单个打卡数据 Map clcokInTimeData = (Map)params.get("clcokInTimeData"); //考勤项目 List> attendanceItems = (List>)params.get("attendanceItems"); //班段类型 String bdlx = Util.null2String(classInfo.get("bdlx")); //卡点 String point = Util.null2String(params.get("point")); //分析日期 String analysisDate = Util.null2String(params.get("analysisDate")); //班次 List> scheduleResult = (List>)params.get("scheduleResult"); //人员 String userId = Util.null2String(params.get("userId")); List> resultList = Lists.newArrayList(); String clockInTime = clcokInTimeData.get("signdate")+" "+clcokInTimeData.get("signtime"); String classStartTime = ""; if (point.split("\\|").length > 3){ //弹性上班 classStartTime=point.split("\\|")[3]; }else { classStartTime=point.split("\\|")[0]; } int between = Utils.removeRestTime(classStartTime,clockInTime,scheduleResult,analysisDate); Map lateParams = Maps.newHashMap(); lateParams.put("attendanceItems",attendanceItems); lateParams.put("time",between); lateParams.put("rqlx",classInfo.get("rqlx")); if (ClassSegmentTypeEnum.WORK_TIME.getKey().equals(bdlx)){ //工作时段 lateParams.put("workfor",WorkForTimeEnum.WORK_TIME.getKey()); Map result = commandExecutor.execute(new BeLateItemCmd(lateParams)); List> workTimeBeLateItems = (List>)result.get("attendanceItems"); if (workTimeBeLateItems.size() == 0){ workTimeBeLateItems = (List>)commandExecutor.execute(new AbsenteeismItemCmd(lateParams)).get("attendanceItems"); } if (workTimeBeLateItems.size() > 0){ Map saveWorkTimeBeLateParam = Maps.newHashMap(); double hsl = Double.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("hsl"))); String hsdw = Util.null2String(workTimeBeLateItems.get(0).get("hsdw")); String kczgsc = Util.null2String(workTimeBeLateItems.get(0).get("kczgsc")); if (CheckBoxEnum.CHECKED.getKey().equals(kczgsc)){ //起步扣除分钟数 int qbkcsc = Integer.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("qbkcsc"))); //超出后单次累加扣除分钟数 int cckcbc = Integer.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("cckcbc"))); if (between <= qbkcsc){ between = qbkcsc; }else { int deductionDuration = between-qbkcsc; between = Double.valueOf(Utils.getItemduration(cckcbc,AccountingUnitEnum.MINUTES.getKey(),deductionDuration,AccountingUnitEnum.MINUTES)).intValue()+qbkcsc; } } double itemduration = Utils.getItemduration(hsl,hsdw,between,AccountingUnitEnum.MINUTES); saveWorkTimeBeLateParam.put("item",workTimeBeLateItems.get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE); saveWorkTimeBeLateParam.put("hsdw",hsdw); saveWorkTimeBeLateParam.put("hsl",hsl); saveWorkTimeBeLateParam.put("kczgsc",kczgsc); saveWorkTimeBeLateParam.put("classStartTime",classStartTime); saveWorkTimeBeLateParam.put("classEndTime",clockInTime); resultList.add(saveWorkTimeBeLateParam); } }else if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx) || ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx) || ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){ //加班 if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx)){ lateParams.put("workfor",WorkForTimeEnum.DELAY_TO_WORK_OVERTIME.getKey()); }else if (ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx)){ lateParams.put("workfor",WorkForTimeEnum.EARLY_TO_WORK_OVERTIME.getKey()); }else if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){ lateParams.put("workfor",WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey()); } Map result = commandExecutor.execute(new WorkOvertimeItemCmd(lateParams)); List> workTimeItems = (List>)result.get("attendanceItems"); List> lateItems = getBeLateItems(lateParams); if (workTimeItems.size() > 0 && lateItems.size() >0){ double hsl = Double.valueOf(Util.null2String(lateItems.get(0).get("hsl"))); String hsdw = Util.null2String(lateItems.get(0).get("hsdw")); String jbwdhlfzs = Util.null2String(workTimeItems.get(0).get("jbwdhlfzs")); if (!"".equals(jbwdhlfzs) && between > Integer.valueOf(jbwdhlfzs)){ Map saveWorkTimeBeLateParam = Maps.newHashMap(); String kczgsc = Util.null2String(lateItems.get(0).get("kczgsc")); if (CheckBoxEnum.CHECKED.getKey().equals(kczgsc)){ //起步扣除分钟数 int qbkcsc = Integer.valueOf(Util.null2String(lateItems.get(0).get("qbkcsc"))); //超出后单次累加扣除分钟数 int cckcbc = Integer.valueOf(Util.null2String(lateItems.get(0).get("cckcbc"))); if (between <= qbkcsc){ between = qbkcsc; }else { int deductionDuration = between-qbkcsc; between = Double.valueOf(Utils.getItemduration(cckcbc,AccountingUnitEnum.MINUTES.getKey(),deductionDuration,AccountingUnitEnum.MINUTES)).intValue()+qbkcsc; } } double itemduration = Utils.getItemduration(hsl,hsdw,between,AccountingUnitEnum.MINUTES); saveWorkTimeBeLateParam.put("item",lateItems.get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE); saveWorkTimeBeLateParam.put("hsdw",hsdw); saveWorkTimeBeLateParam.put("hsl",hsl); saveWorkTimeBeLateParam.put("kczgsc",kczgsc); saveWorkTimeBeLateParam.put("classStartTime",classStartTime); saveWorkTimeBeLateParam.put("classEndTime",clockInTime); resultList.add(saveWorkTimeBeLateParam); } } }else if (ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey().equals(bdlx) || ClassSegmentTypeEnum.EVECTION.getKey().equals(bdlx)){ //请假、出差 Map result = null; if (ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey().equals(bdlx)){ lateParams.put("workfor",WorkForTimeEnum.WORK_TIME.getKey()); result = commandExecutor.execute(new VacationItemCmd(lateParams)); }else if (ClassSegmentTypeEnum.EVECTION.getKey().equals(bdlx)){ lateParams.put("workfor",WorkForTimeEnum.WORK_TIME.getKey()); result = commandExecutor.execute(new BeAwayItemCmd(lateParams)); } List> beAwayItems = (List>)result.get("attendanceItems"); List> lateItems = getBeLateItems(lateParams); double hsl = Double.valueOf(Util.null2String(lateItems.get(0).get("hsl"))); String hsdw = Util.null2String(lateItems.get(0).get("hsdw")); String thfghlfzs = Util.null2String(beAwayItems.get(0).get("thfghlfzs")); if (!"".equals(thfghlfzs) && between> Integer.valueOf(thfghlfzs)){ String kczgsc = Util.null2String(lateItems.get(0).get("kczgsc")); if (CheckBoxEnum.CHECKED.getKey().equals(kczgsc)){ //起步扣除分钟数 int qbkcsc = Integer.valueOf(Util.null2String(lateItems.get(0).get("qbkcsc"))); //超出后单次累加扣除分钟数 int cckcbc = Integer.valueOf(Util.null2String(lateItems.get(0).get("cckcbc"))); if (between <= qbkcsc){ between = qbkcsc; }else { int deductionDuration = between-qbkcsc; between = Double.valueOf(Utils.getItemduration(cckcbc,AccountingUnitEnum.MINUTES.getKey(),deductionDuration,AccountingUnitEnum.MINUTES)).intValue()+qbkcsc; } } double itemduration = Utils.getItemduration(hsl,hsdw,between,AccountingUnitEnum.MINUTES); Map saveWorkTimeBeLateParam = Maps.newHashMap(); saveWorkTimeBeLateParam.put("item",lateItems.get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE); saveWorkTimeBeLateParam.put("hsdw",hsdw); saveWorkTimeBeLateParam.put("kczgsc",kczgsc); saveWorkTimeBeLateParam.put("hsl",hsl); saveWorkTimeBeLateParam.put("classStartTime",classStartTime); saveWorkTimeBeLateParam.put("classEndTime",clockInTime); resultList.add(saveWorkTimeBeLateParam); } } return resultList; } @Override public List> leaveEarly(Map params) { //当前单条明细班次 Map classInfo = (Map)params.get("classInfo"); //当前单个打卡数据 Map clcokInTimeData = (Map)params.get("clcokInTimeData"); //考勤项目 List> attendanceItems = (List>)params.get("attendanceItems"); List> scheduleResult = (List>)params.get("scheduleResult"); //班段类型 String bdlx = Util.null2String(classInfo.get("bdlx")); //分析日期 String analysisDate = Util.null2String(params.get("analysisDate")); //人员 String userId = Util.null2String(params.get("userId")); //卡点 String point = Util.null2String(params.get("point")); List> resultList = Lists.newArrayList(); String clockInTime = clcokInTimeData.get("signdate")+" "+clcokInTimeData.get("signtime"); String classEndTime = ""; if (point.split("\\|").length > 3){ //弹性下班 classEndTime=point.split("\\|")[3]; }else { classEndTime=point.split("\\|")[0]; } int between = Utils.removeRestTime(clockInTime,classEndTime,scheduleResult,analysisDate); Map earlyParams = Maps.newHashMap(); earlyParams.put("attendanceItems",attendanceItems); earlyParams.put("time",between); earlyParams.put("rqlx",classInfo.get("rqlx")); boolean ifLeaveEarly = false; if (ClassSegmentTypeEnum.WORK_TIME.getKey().equals(bdlx)){ //工作时段 earlyParams.put("workfor",WorkForTimeEnum.WORK_TIME.getKey()); Map result = commandExecutor.execute(new LeaveEarlyItemCmd(earlyParams)); List> workTimeBeLateItems = (List>)result.get("attendanceItems"); if (workTimeBeLateItems.size() == 0){ workTimeBeLateItems = (List>)commandExecutor.execute(new AbsenteeismItemCmd(earlyParams)).get("attendanceItems"); } if (workTimeBeLateItems.size() > 0){ Map saveWorkTimeBeLateParam = Maps.newHashMap(); double hsl = Double.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("hsl"))); String hsdw = Util.null2String(workTimeBeLateItems.get(0).get("hsdw")); String kczgsc = Util.null2String(workTimeBeLateItems.get(0).get("kczgsc")); if (CheckBoxEnum.CHECKED.getKey().equals(kczgsc)){ //起步扣除分钟数 int qbkcsc = Integer.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("qbkcsc"))); //超出后单次累加扣除分钟数 int cckcbc = Integer.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("cckcbc"))); if (between <= qbkcsc){ between = qbkcsc; }else { int deductionDuration = between-qbkcsc; between = Double.valueOf(Utils.getItemduration(cckcbc,AccountingUnitEnum.MINUTES.getKey(),deductionDuration,AccountingUnitEnum.MINUTES)).intValue()+qbkcsc; } } double itemduration = Utils.getItemduration(hsl,hsdw,between,AccountingUnitEnum.MINUTES); // saveWorkTimeBeLateParam.put("userId",userId); // saveWorkTimeBeLateParam.put("date",analysisDate); saveWorkTimeBeLateParam.put("item",workTimeBeLateItems.get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LEAVE_EARLY); saveWorkTimeBeLateParam.put("hsdw",hsdw); saveWorkTimeBeLateParam.put("kczgsc",kczgsc); saveWorkTimeBeLateParam.put("hsl",hsl); saveWorkTimeBeLateParam.put("classStartTime",clockInTime); saveWorkTimeBeLateParam.put("classEndTime",classEndTime); resultList.add(saveWorkTimeBeLateParam); } }else if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx) || ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx) || ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){ //加班 if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx)){ earlyParams.put("workfor",WorkForTimeEnum.DELAY_TO_WORK_OVERTIME.getKey()); }else if (ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx)){ earlyParams.put("workfor",WorkForTimeEnum.EARLY_TO_WORK_OVERTIME.getKey()); }else if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){ earlyParams.put("workfor",WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey()); } Map result = commandExecutor.execute(new WorkOvertimeItemCmd(earlyParams)); List> workTimeItems = (List>)result.get("attendanceItems"); List> beEarlyItems = getBeEarlyItems(earlyParams); if (workTimeItems.size() > 0 && beEarlyItems.size() >0){ String jbzzhlfzs = Util.null2String(workTimeItems.get(0).get("jbzzhlfzs")); String hsdw = Util.null2String(beEarlyItems.get(0).get("hsdw")); double hsl = Double.valueOf(Util.null2String(beEarlyItems.get(0).get("hsl"))); if (!"".equals(jbzzhlfzs) && between > Integer.valueOf(jbzzhlfzs)){ log.info("between :{},jbzzhlfzs:{}",between,jbzzhlfzs); Map saveWorkTimeBeLateParam = Maps.newHashMap(); String kczgsc = Util.null2String(beEarlyItems.get(0).get("kczgsc")); if (CheckBoxEnum.CHECKED.getKey().equals(kczgsc)){ //起步扣除分钟数 int qbkcsc = Integer.valueOf(Util.null2String(beEarlyItems.get(0).get("qbkcsc"))); //超出后单次累加扣除分钟数 int cckcbc = Integer.valueOf(Util.null2String(beEarlyItems.get(0).get("cckcbc"))); if (between <= qbkcsc){ between = qbkcsc; }else { int deductionDuration = between-qbkcsc; between = Double.valueOf(Utils.getItemduration(cckcbc,AccountingUnitEnum.MINUTES.getKey(),deductionDuration,AccountingUnitEnum.MINUTES)).intValue()+qbkcsc; } } double itemduration = Utils.getItemduration(hsl,hsdw,between,AccountingUnitEnum.MINUTES); saveWorkTimeBeLateParam.put("item",beEarlyItems.get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LEAVE_EARLY); saveWorkTimeBeLateParam.put("hsdw",hsdw); saveWorkTimeBeLateParam.put("kczgsc",kczgsc); saveWorkTimeBeLateParam.put("hsl",hsl); saveWorkTimeBeLateParam.put("classStartTime",clockInTime); saveWorkTimeBeLateParam.put("classEndTime",classEndTime); resultList.add(saveWorkTimeBeLateParam); } } }else if (ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey().equals(bdlx) || ClassSegmentTypeEnum.EVECTION.getKey().equals(bdlx)){ //请假、出差 Map result = null; if (ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey().equals(bdlx)){ earlyParams.put("workfor",WorkForTimeEnum.WORK_TIME.getKey()); result = commandExecutor.execute(new VacationItemCmd(earlyParams)); }else if (ClassSegmentTypeEnum.EVECTION.getKey().equals(bdlx)){ earlyParams.put("workfor",WorkForTimeEnum.WORK_TIME.getKey()); result = commandExecutor.execute(new BeAwayItemCmd(earlyParams)); } List> beAwayItems = (List>)result.get("attendanceItems"); List> beEarlyItems = getBeEarlyItems(earlyParams); double hsl = Double.valueOf(Util.null2String(beEarlyItems.get(0).get("hsl"))); String hsdw = Util.null2String(beEarlyItems.get(0).get("hsdw")); String tqlghlfzs = Util.null2String(beAwayItems.get(0).get("tqlghlfzs")); if (!"".equals(tqlghlfzs) && between> Integer.valueOf(tqlghlfzs) && beEarlyItems.size()>0){ String kczgsc = Util.null2String(beEarlyItems.get(0).get("kczgsc")); if (CheckBoxEnum.CHECKED.getKey().equals(kczgsc)){ //起步扣除分钟数 int qbkcsc = Integer.valueOf(Util.null2String(beEarlyItems.get(0).get("qbkcsc"))); //超出后单次累加扣除分钟数 int cckcbc = Integer.valueOf(Util.null2String(beEarlyItems.get(0).get("cckcbc"))); if (between <= qbkcsc){ between = qbkcsc; }else { int deductionDuration = between-qbkcsc; between = Double.valueOf(Utils.getItemduration(cckcbc,AccountingUnitEnum.MINUTES.getKey(),deductionDuration,AccountingUnitEnum.MINUTES)).intValue()+qbkcsc; } } double itemduration = Utils.getItemduration(hsl,hsdw,between,AccountingUnitEnum.MINUTES); Map saveWorkTimeBeLateParam = Maps.newHashMap(); saveWorkTimeBeLateParam.put("item",beEarlyItems.get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LEAVE_EARLY); saveWorkTimeBeLateParam.put("hsdw",hsdw); saveWorkTimeBeLateParam.put("kczgsc",kczgsc); saveWorkTimeBeLateParam.put("hsl",hsl); saveWorkTimeBeLateParam.put("classStartTime",clockInTime); saveWorkTimeBeLateParam.put("classEndTime",classEndTime); resultList.add(saveWorkTimeBeLateParam); } } return resultList; } /** * 获得迟到项目 * @return */ public List> getBeLateItems(Map lateParams){ Map result = commandExecutor.execute(new BeLateItemCmd(lateParams)); List> workTimeBeLateItems = (List>)result.get("attendanceItems"); if (workTimeBeLateItems.size() == 0){ workTimeBeLateItems = (List>)commandExecutor.execute(new AbsenteeismItemCmd(lateParams)).get("attendanceItems"); } return workTimeBeLateItems; } /** * 获得早退项目 * @return */ public List> getBeEarlyItems(Map earlyParams){ Map result = commandExecutor.execute(new LeaveEarlyItemCmd(earlyParams)); List> workTimeBeLateItems = (List>)result.get("attendanceItems"); if (workTimeBeLateItems.size() == 0){ workTimeBeLateItems = (List>)commandExecutor.execute(new AbsenteeismItemCmd(earlyParams)).get("attendanceItems"); } return workTimeBeLateItems; } }