diff --git a/src/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.java b/src/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.java index ae09281..73d3412 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.java +++ b/src/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.java @@ -8,13 +8,13 @@ public interface AskForLeaveService { * 根据时间请假 * @return */ - List> askForLeaveByTime(Map param); + Map askForLeaveByTime(Map param); /** * 根据时长请假 * @return */ - List> askForLeaveByDurationTime(Map param); + Map askForLeaveByDurationTime(Map param); /** * 根据半天请假 diff --git a/src/com/engine/attendance/attendanceanalysis/service/EvectionService.java b/src/com/engine/attendance/attendanceanalysis/service/EvectionService.java index 3297fe1..be949d5 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/EvectionService.java +++ b/src/com/engine/attendance/attendanceanalysis/service/EvectionService.java @@ -8,13 +8,13 @@ public interface EvectionService { * 根据时间出差 * @return */ - List> evectionByTime(Map param); + Map evectionByTime(Map param); /** * 根据时长出差 * @return */ - List> evectionByDurationTime(Map param); + Map evectionByDurationTime(Map param); /** * 根据半天出差 diff --git a/src/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.java b/src/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.java index 98fb4ae..c2daa17 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.java +++ b/src/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.java @@ -3,6 +3,7 @@ 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.AccountingUnitEnum; +import com.engine.attendance.enums.AttendanceItemTypeEnum; import com.engine.attendance.enums.ClassSegmentTypeEnum; import com.engine.attendance.enums.WorkForTimeEnum; import com.engine.common.util.DateUtil; @@ -76,6 +77,8 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt 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); resultList.add(saveWorkTimeBeLateParam); // List> classInfoList = Lists.newArrayList(); // classInfoList.add(classInfo); @@ -109,6 +112,8 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt saveWorkTimeBeLateParam.put("item",getBeLateItems(lateParams).get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); + saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE); + saveWorkTimeBeLateParam.put("hsdw",hsdw); resultList.add(saveWorkTimeBeLateParam); // List> classInfoList = Lists.newArrayList(); // classInfoList.add(classInfo); @@ -141,6 +146,8 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt saveWorkTimeBeLateParam.put("item",getBeLateItems(lateParams).get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); + saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE); + saveWorkTimeBeLateParam.put("hsdw",hsdw); resultList.add(saveWorkTimeBeLateParam); // List> classInfoList = Lists.newArrayList(); // classInfoList.add(classInfo); @@ -207,6 +214,7 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt saveWorkTimeBeLateParam.put("item",getBeEarlyItems(earlyParams).get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); + saveWorkTimeBeLateParam.put("hsdw",hsdw); resultList.add(saveWorkTimeBeLateParam); // List> classInfoList = Lists.newArrayList(); // classInfoList.add(classInfo); @@ -242,6 +250,7 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt saveWorkTimeBeLateParam.put("item",getBeEarlyItems(earlyParams).get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); + saveWorkTimeBeLateParam.put("hsdw",hsdw); resultList.add(saveWorkTimeBeLateParam); // List> classInfoList = Lists.newArrayList(); // classInfoList.add(classInfo); @@ -274,6 +283,7 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt saveWorkTimeBeLateParam.put("item",getBeEarlyItems(earlyParams).get(0).get("key")); saveWorkTimeBeLateParam.put("itemduration",itemduration); saveWorkTimeBeLateParam.put("betweenMinutes",between); + saveWorkTimeBeLateParam.put("hsdw",hsdw); resultList.add(saveWorkTimeBeLateParam); // List> classInfoList = Lists.newArrayList(); // classInfoList.add(classInfo); diff --git a/src/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.java b/src/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.java index 2cfd064..b111b81 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.java +++ b/src/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.java @@ -5,6 +5,7 @@ import com.engine.attendance.enums.CheckBoxEnum; import com.engine.common.util.DateUtil; import com.engine.core.impl.Service; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import weaver.general.Util; import java.util.Comparator; @@ -15,7 +16,7 @@ import java.util.stream.Collectors; public class AskForLeaveServiceImpl extends Service implements AskForLeaveService { @Override - public List> askForLeaveByTime(Map param) { + public Map askForLeaveByTime(Map param) { //人员迟到、早退、漏卡等记录 List> abnormalClockInList = (List>)param.get("abnormalClockInList"); //请假开始时间 @@ -23,16 +24,20 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic //请假结束时间 String jssj = Util.null2String(param.get("jssj")); - List> needRemoveList = Lists.newArrayList(); + + List> offsetAskForLeaveAnomaly = Lists.newArrayList(); for (int i=0;i=0){ - needRemoveList.add(abnormalClockInList.get(i)); + offsetAskForLeaveAnomaly.add(abnormalClockInList.get(i)); } } - abnormalClockInList.removeAll(needRemoveList); - return abnormalClockInList; + abnormalClockInList.removeAll(offsetAskForLeaveAnomaly); + Map map = Maps.newHashMap(); + map.put("abnormalClockInList",abnormalClockInList); + map.put("offsetAskForLeaveAnomaly",offsetAskForLeaveAnomaly); + return map; } @Override @@ -41,39 +46,43 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } @Override - public List> askForLeaveByDurationTime(Map param) { + public Map askForLeaveByDurationTime(Map param) { //人员迟到、早退、漏卡等记录 List> abnormalClockInList = (List>)param.get("abnormalClockInList"); List> forgetClockList = abnormalClockInList.stream().filter(e -> e.get("betweenMinutes") == null).collect(Collectors.toList()); abnormalClockInList = abnormalClockInList.stream().filter(e -> e.get("betweenMinutes") != null).collect(Collectors.toList()); abnormalClockInList = abnormalClockInList.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("betweenMinutes").toString()))).collect(Collectors.toList()); + List> offsetAskForLeaveAnomaly = Lists.newArrayList(); //请假时长,单位小时 int qjsc = param.get("qjsc") == null?0:Double.valueOf(Double.valueOf(param.get("qjsc").toString())*60).intValue(); //同一天可抵消多个异常 String tybcndbjlhbjs = Util.null2String(param.get("tybcndbjlhbjs")); - List> needRemoveList = Lists.newArrayList(); + if (CheckBoxEnum.CHECKED.getKey().equals(tybcndbjlhbjs)){ for (int i=abnormalClockInList.size() -1;i>=0;i--){ int time = Integer.valueOf(abnormalClockInList.get(i).get("betweenMinutes").toString()); if (qjsc >= time){ qjsc = qjsc-time; - needRemoveList.add(abnormalClockInList.get(i)); + offsetAskForLeaveAnomaly.add(abnormalClockInList.get(i)); } } - abnormalClockInList.removeAll(needRemoveList); + abnormalClockInList.removeAll(offsetAskForLeaveAnomaly); }else{ for (int i=abnormalClockInList.size() -1;i>=0;i--){ int time = Integer.valueOf(abnormalClockInList.get(i).get("betweenMinutes").toString()); if (qjsc >= time){ + offsetAskForLeaveAnomaly.add(abnormalClockInList.get(i)); abnormalClockInList.remove(i); break; } } } abnormalClockInList.addAll(forgetClockList); - - return abnormalClockInList; + Map map = Maps.newHashMap(); + map.put("abnormalClockInList",abnormalClockInList); + map.put("offsetAskForLeaveAnomaly",offsetAskForLeaveAnomaly); + return map; } } diff --git a/src/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.java b/src/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.java index 443bf9e..273da65 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.java +++ b/src/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.java @@ -5,6 +5,7 @@ import com.engine.attendance.enums.CheckBoxEnum; import com.engine.common.util.DateUtil; import com.engine.core.impl.Service; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import weaver.general.Util; import java.util.Comparator; @@ -14,7 +15,7 @@ import java.util.stream.Collectors; public class EvectionServiceImpl extends Service implements EvectionService { @Override - public List> evectionByTime(Map param) { + public Map evectionByTime(Map param) { //人员迟到、早退、漏卡等记录 List> abnormalClockInList = (List>)param.get("abnormalClockInList"); //请假开始时间 @@ -22,20 +23,23 @@ public class EvectionServiceImpl extends Service implements EvectionService { //请假结束时间 String jssj = Util.null2String(param.get("jssj")); - List> needRemoveList = Lists.newArrayList(); + List> offsetEvectionAnomaly = Lists.newArrayList(); for (int i=0;i=0){ - needRemoveList.add(abnormalClockInList.get(i)); + offsetEvectionAnomaly.add(abnormalClockInList.get(i)); } } - abnormalClockInList.removeAll(needRemoveList); - return abnormalClockInList; + abnormalClockInList.removeAll(offsetEvectionAnomaly); + Map resultMap = Maps.newHashMap(); + resultMap.put("abnormalClockInList",abnormalClockInList); + resultMap.put("offsetEvectionAnomaly",offsetEvectionAnomaly); + return resultMap; } @Override - public List> evectionByDurationTime(Map param) { + public Map evectionByDurationTime(Map param) { //人员迟到、早退、漏卡等记录 List> abnormalClockInList = (List>)param.get("abnormalClockInList"); List> forgetClockList = abnormalClockInList.stream().filter(e -> e.get("betweenMinutes") == null).collect(Collectors.toList()); @@ -45,30 +49,33 @@ public class EvectionServiceImpl extends Service implements EvectionService { //请假时长,单位小时 int ccsc = param.get("ccsc") == null?0:Double.valueOf(Double.valueOf(param.get("ccsc").toString())*60).intValue(); //同一天可抵消多个异常 + List> offsetEvectionAnomaly = Lists.newArrayList(); - List> needRemoveList = Lists.newArrayList(); String tybcndbjlhbjs = Util.null2String(param.get("tybcndbjlhbjs")); if (CheckBoxEnum.CHECKED.getKey().equals(tybcndbjlhbjs)){ for (int i=abnormalClockInList.size() -1;i>=0;i--){ int time = Integer.valueOf(abnormalClockInList.get(i).get("betweenMinutes").toString()); if (ccsc > time){ ccsc = ccsc-time; - needRemoveList.add(abnormalClockInList.get(i)); + offsetEvectionAnomaly.add(abnormalClockInList.get(i)); } } - abnormalClockInList.removeAll(needRemoveList); + abnormalClockInList.removeAll(offsetEvectionAnomaly); }else{ for (int i=abnormalClockInList.size() -1;i>=0;i--){ int time = Integer.valueOf(abnormalClockInList.get(i).get("betweenMinutes").toString()); if (ccsc > time){ + offsetEvectionAnomaly.add(abnormalClockInList.get(i)); abnormalClockInList.remove(i); break; } } } abnormalClockInList.addAll(forgetClockList); - - return abnormalClockInList; + Map resultMap = Maps.newHashMap(); + resultMap.put("abnormalClockInList",abnormalClockInList); + resultMap.put("offsetEvectionAnomaly",offsetEvectionAnomaly); + return resultMap; } @Override diff --git a/src/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.java b/src/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.java index 5e97ab0..eedb396 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.java +++ b/src/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.java @@ -1,6 +1,7 @@ package com.engine.attendance.attendanceanalysis.service.impl; import com.engine.attendance.attendanceanalysis.service.ForgetClockInService; +import com.engine.attendance.enums.AttendanceItemTypeEnum; import com.engine.attendance.enums.SystemItemEnum; import com.engine.core.impl.Service; import com.google.common.collect.Lists; @@ -34,6 +35,7 @@ public class ForgetClockInServiceImpl extends Service implements ForgetClockInSe Map forgetParam = Maps.newHashMap(); forgetParam.put("item", SystemItemEnum.MISSING_CLOCK_IN.getKey()); forgetParam.put("itemduration", 1); + forgetParam.put("itemType", AttendanceItemTypeEnum.MISSE_CARD); // List> classInfoList = Lists.newArrayList(); // classInfoList.add((Map)params.get("classInfo")); // forgetParam.put("classInfo",classInfoList); diff --git a/src/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java b/src/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java index 832720a..d59f1e5 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java +++ b/src/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.java @@ -17,6 +17,7 @@ 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.conn.RecordSet; import weaver.general.Util; import java.util.List; import java.util.Map; @@ -55,12 +56,16 @@ public class UtilServiceImpl extends Service implements UtilService { sql = sql +bcxxIds+") order by b.kssj"; List> dataList = DbTools.getSqlToList(sql); Map>> dataMap = dataList.stream().collect(Collectors.groupingBy(e->Util.null2String(e.get("bcxx")))); - + String edsc = "8"; + if (dataList.size()>0){ + edsc = Util.null2String(dataList.get(0).get("edsc")); + } dataMap.entrySet().forEach(e -> { List> schedulingList = schedulingMap.get(e.getKey()); for (Map scheduling :schedulingList){ String bcrq = Util.null2String(scheduling.get("bcrq")); String rqlx = Util.null2String(scheduling.get("rqlx")); + List> bcxxs = e.getValue(); for (Map map:bcxxs){ map.put("rqlx",rqlx); @@ -124,7 +129,7 @@ public class UtilServiceImpl extends Service implements UtilService { map.put("bcxx","0"); map.put("bcsdxx",""); - map.put("edsc","8"); + map.put("edsc",edsc); map.put("bdlx", ClassSegmentTypeEnum.OVERTIME_PLAN.getKey()); map.put("dtkssj",overtimePlan.get("kssj")); map.put("dtjssj",overtimePlan.get("jssj")); @@ -136,6 +141,7 @@ public class UtilServiceImpl extends Service implements UtilService { map.put("zddxfz","0"); map.put("dxhs","0"); map.put("rqlx",dateMap.get(e.getKey())); + map.put("jbsc",overtimePlan.get("jbsc")); if (attendanceItems.size() >0){ map.put("ksdk",attendanceItems.get(0).get("ksjbbxydk")); map.put("jsdk",attendanceItems.get(0).get("jsjbbxydk")); diff --git a/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java b/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java index 0697928..eca3889 100644 --- a/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java +++ b/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java @@ -2,24 +2,25 @@ package com.engine.attendance.attendanceanalysis.service.impl; import com.engine.attendance.attendanceanalysis.cmd.item.WorkOvertimeItemCmd; import com.engine.attendance.attendanceanalysis.service.WorkOverTimeService; -import com.engine.attendance.enums.CheckBoxEnum; -import com.engine.attendance.enums.ClassSegmentTypeEnum; -import com.engine.attendance.enums.DateTypeEnum; -import com.engine.attendance.enums.WorkForTimeEnum; +import com.engine.attendance.enums.*; +import com.engine.common.util.CommonUtil; import com.engine.common.util.DateUtil; import com.engine.common.util.DbTools; 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.TimeUtil; import weaver.general.Util; +import java.math.BigDecimal; import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +@Slf4j public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeService { @Override public List> recordWorkOverTime(Map params) { @@ -31,10 +32,21 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ String analysisDate = Util.null2String(params.get("analysisDate")); //请假记录 List> askForLeaveList = (List>)params.get("askForLeaveList"); + //请假项目 + Map> askForLeaveItems = (Map>)params.get("askForLeaveItems"); //外出记录 List> evectionList = (List>)params.get("evectionList"); + //外出项目 + Map> evectionItems = (Map>)params.get("evectionItems"); //打卡卡点 List>> clcokInTimeList = (List>>)params.get("clcokInTimeList"); + //请假后消除的异常 + List> offsetAskForLeaveAnomaly = (List>)params.get("offsetAskForLeaveAnomaly"); + //出差外出后消除的异常 + List> offsetEvectionAnomaly = (List>)params.get("offsetEvectionAnomaly"); + + //经过请假外出处理过的异常项目 + List> abnormalClockInList = (List>)params.get("abnormalClockInList"); Map> clcokInTimeMap = Maps.newHashMap(); @@ -60,9 +72,7 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ //人员 String userId = Util.null2String(params.get("userId")); List> resultLists = Lists.newArrayList(); - int maxDayTime = 0; - int maxWeekTime = 0; - int maxMonthTime = 0; + for (Map scheduleMap :scheduleResult){ String bdlx = Util.null2String(scheduleMap.get("bdlx")); String rqlx = Util.null2String(scheduleMap.get("rqlx")); @@ -73,26 +83,27 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ //加班结束时间 String dtjssj = Util.null2String(scheduleMap.get("dtjssj")); - String kssj = analysisDate +" "+Util.null2String(scheduleMap.get("dtkssj")); - String jssj = analysisDate +" "+Util.null2String(scheduleMap.get("dtjssj")); + String kssj = analysisDate +" "+dtkssj; + String jssj = analysisDate +" "+dtjssj; if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(jssj)) >0){ jssj = DateUtil.AfterDay(analysisDate,1)+" "+Util.null2String(scheduleMap.get("dtjssj")); } + //加班实际开始时间 + String realityStartTime = ""; + //加班实际结束时间 + String realityEndime = ""; //申请时间 int applicationTime = DateUtil.getBetWeenMinutes(kssj,jssj); - //扣除休息时间后的剩余 - int applicationRestTime = applicationTime; + resultLists.add(workOverTimeItems); getWorkOverTimeParam.put("attendanceItems",attendanceItems); getWorkOverTimeParam.put("rqlx",scheduleMap.get("rqlx")); - if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx)){ getWorkOverTimeParam.put("workfor", WorkForTimeEnum.DELAY_TO_WORK_OVERTIME.getKey()); }else if (ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx)){ getWorkOverTimeParam.put("workfor",WorkForTimeEnum.EARLY_TO_WORK_OVERTIME.getKey()); }else if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){ - applicationRestTime = Utils.removeRestTime(kssj,jssj,scheduleResult,analysisDate); getWorkOverTimeParam.put("workfor",WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey()); } Map result = commandExecutor.execute(new WorkOvertimeItemCmd(getWorkOverTimeParam)); @@ -101,14 +112,20 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ if (workTimeBeLateItems.size() == 0){ continue; } - workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key")); + double jbsc = Integer.valueOf(Util.null2String(scheduleMap.get("jbsc"))); + + + //开始加班必须打卡 + String ksjbbxydk = Util.null2String(workTimeBeLateItems.get(0).get("ksjbbxydk")); + //结束加班必须打卡 + String jsjbbxydk = Util.null2String(workTimeBeLateItems.get(0).get("jsjbbxydk")); //提前打卡开始的时长计入加班 String tqdkjrjb = Util.null2String(workTimeBeLateItems.get(0).get("tqdkjrjb")); //推后打卡结束的时长计入加班 String thdkjrjb = Util.null2String(workTimeBeLateItems.get(0).get("thdkjrjb")); //结算加班时长不得超过申请的时长 String jbscbdccsqsc = Util.null2String(workTimeBeLateItems.get(0).get("jbscbdccsqsc")); - //结算加班时长不得超过申请的时长 + //是否扣除时间区间内的就餐休息时长 String zdkcjcxxsc = Util.null2String(workTimeBeLateItems.get(0).get("zdkcjcxxsc")); //超出限制时长的处理方式 String ccclfs = Util.null2String(workTimeBeLateItems.get(0).get("ccclfs")); @@ -120,21 +137,139 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ String zzdjbxss = Util.null2String(workTimeBeLateItems.get(0).get("zzdjbxss")); //加班时长自动转入假期余额 String jbzdzjqye= Util.null2String(workTimeBeLateItems.get(0).get("jbzdzjqye")); + //最小加班分钟数 + String jbqsfzs = Util.null2String(workTimeBeLateItems.get(0).get("jbqsfzs")); + //超出最小时长后的单次累加分钟数 + String ccqszhdhsfzs = Util.null2String(workTimeBeLateItems.get(0).get("ccqszhdhsfzs")); + //核算量 + double workOverTimeHsl = Double.valueOf(Util.null2String(workTimeBeLateItems.get(0).get("hsl"))); + //核算单位 + String workOverTimeHsdw = Util.null2String(workTimeBeLateItems.get(0).get("hsdw")); - if (CheckBoxEnum.CHECKED.getKey().equals(tqdkjrjb)){ + /** + * 获得实际加班时间 + */ + if (CheckBoxEnum.CHECKED.getKey().equals(ksjbbxydk)){ Map clcokInTimeData = clcokInTimeMap.get(dtkssj); String signTime = clcokInTimeData.get("signdate")+" "+clcokInTimeData.get("signtime"); - if (DateUtil.getTime(signTime).compareTo(DateUtil.getTime(dtkssj)) < 0){ - dtkssj = signTime; - } + realityStartTime = signTime; + }else { + realityStartTime = kssj; } - if (CheckBoxEnum.CHECKED.getKey().equals(thdkjrjb)){ + if (CheckBoxEnum.CHECKED.getKey().equals(jsjbbxydk)){ Map clcokInTimeData = clcokInTimeMap.get(dtjssj); String signTime = clcokInTimeData.get("signdate")+" "+clcokInTimeData.get("signtime"); - if (DateUtil.getTime(signTime).compareTo(DateUtil.getTime(dtjssj)) > 0){ - dtjssj = signTime; + realityEndime = signTime; + }else { + realityEndime= jssj; + } + jbsc = jbsc*60; + if (CheckBoxEnum.CHECKED.getKey().equals(tqdkjrjb)){ + //提前打卡开始的时长计入加班 + if (DateUtil.getTime(realityStartTime).compareTo(DateUtil.getTime(kssj)) <0){ + jbsc +=DateUtil.getBetWeenMinutes(realityStartTime,kssj); + } + } + if (CheckBoxEnum.CHECKED.getKey().equals(thdkjrjb)){ + // 推后打卡结束的时长计入加班 + if (DateUtil.getTime(realityEndime).compareTo(DateUtil.getTime(jssj)) >0){ + jbsc +=DateUtil.getBetWeenMinutes(jssj,realityEndime); } } + + /** + * 当存在迟到项目时扣除异常时长,不存在时 + */ + List> beLateAbnormal = abnormalClockInList.stream().filter(e->e.get("pointTime").toString().split(" ")[1].equals(dtkssj)).collect(Collectors.toList()); + double beLateTime = 0; + if (beLateAbnormal.size() >0){ + String hsdw = Util.null2String(beLateAbnormal.get(0).get("hsdw")); + String itemduration = Util.null2String(beLateAbnormal.get(0).get("itemduration")); + AttendanceItemTypeEnum itemType = (AttendanceItemTypeEnum)beLateAbnormal.get(0).get("itemType"); + if (itemType == AttendanceItemTypeEnum.MISSE_CARD){ + //早上漏卡 + beLateTime = jbsc; + }else { + if (AccountingUnitEnum.DAY.getKey().equals(hsdw)){ + beLateTime = Integer.valueOf(scheduleMap.get("edsc").toString()) * Double.valueOf(itemduration); + }else if (AccountingUnitEnum.HOUR.getKey().equals(hsdw)){ + beLateTime = Double.valueOf(itemduration)*60; + }else if (AccountingUnitEnum.MINUTES.getKey().equals(hsdw)){ + beLateTime = Double.valueOf(itemduration); + }else if (AccountingUnitEnum.ONCE.getKey().equals(hsdw)){ + beLateTime = jbsc; + } + } + }else { + if (DateUtil.getTime(realityStartTime).compareTo(DateUtil.getTime(kssj)) >0){ + beLateTime = DateUtil.getBetWeenMinutes(kssj,realityStartTime); + } + } + /** + * 当存在早退项目时扣除异常时长,不存在时扣除实际早退时间 + */ + List> leaveEarlyAbnormal = abnormalClockInList.stream().filter(e->e.get("pointTime").toString().split(" ")[1].equals(dtjssj)).collect(Collectors.toList()); + double leaveElaryTime=0; + if (leaveEarlyAbnormal.size() > 0){ + String hsdw = Util.null2String(beLateAbnormal.get(0).get("hsdw")); + String itemduration = Util.null2String(beLateAbnormal.get(0).get("itemduration")); + AttendanceItemTypeEnum itemType = (AttendanceItemTypeEnum)beLateAbnormal.get(0).get("itemType"); + if (itemType == AttendanceItemTypeEnum.MISSE_CARD){ + //下午漏卡 + leaveElaryTime = jbsc; + + }else { + if (AccountingUnitEnum.DAY.getKey().equals(hsdw)){ + leaveElaryTime = Integer.valueOf(scheduleMap.get("edsc").toString()) * Double.valueOf(itemduration); + }else if (AccountingUnitEnum.HOUR.getKey().equals(hsdw)){ + leaveElaryTime = Double.valueOf(itemduration)*60; + }else if (AccountingUnitEnum.MINUTES.getKey().equals(hsdw)){ + leaveElaryTime = Double.valueOf(itemduration); + }else if (AccountingUnitEnum.ONCE.getKey().equals(hsdw)){ + leaveElaryTime = jbsc; + } + + } + }else { + if (DateUtil.getTime(realityEndime).compareTo(DateUtil.getTime(jssj)) <0){ + leaveElaryTime = DateUtil.getBetWeenMinutes(realityEndime,jssj); + } + + } + + /** + * 当存在请假时,考虑扣除请假时长 + */ + int askForLeaveTime = removeAskForLeave(realityStartTime,realityEndime,Util.null2String(getWorkOverTimeParam.get("workfor")) + ,bdlx,evectionList,askForLeaveItems,offsetAskForLeaveAnomaly); + + /** + * 当存在外出时,考虑扣除外出时长 + */ + int evectionTime = removeEvection(realityStartTime,realityEndime,Util.null2String(getWorkOverTimeParam.get("workfor")) + ,bdlx,askForLeaveList,evectionItems,offsetEvectionAnomaly); + + log.info("加班时长: {}",jbsc); + log.info("beLateTime :[{}],leaveElaryTime :[{}],askForLeaveTime:[{}],evectionTime:[{}]",beLateTime,leaveElaryTime,askForLeaveTime,evectionTime); + BigDecimal jbscbig = new BigDecimal(jbsc); + jbsc = jbscbig.subtract(new BigDecimal(beLateTime)).subtract(new BigDecimal(leaveElaryTime)).subtract(new BigDecimal(askForLeaveTime)).subtract(new BigDecimal(evectionTime)).intValue(); + log.info("jbsc :[{}]",jbsc); + if (!"".equals(jbqsfzs)){ + if (jbsc < Integer.valueOf(jbqsfzs)){ + //小于最小加班分钟数不算加班 + continue; + }else if (jbsc >= Integer.valueOf(jbqsfzs) && !"".equals(ccqszhdhsfzs)){ + jbsc = Double.valueOf(Utils.getItemdurationDown(Integer.valueOf(ccqszhdhsfzs),AccountingUnitEnum.MINUTES.getKey(),Double.valueOf(jbsc).intValue(),AccountingUnitEnum.MINUTES)).intValue(); + } + } + if (jbsc < 0){ + //加班时长为0 + workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key")); + workOverTimeItems.put("itemduration","0"); + continue; + } + + //自动扣除 if ("2".equals(ccclfs) && workOverTimeResults == null){ String startDate = analysisDate.split("-")[0]+"-"+ analysisDate.split("-")[1]+"-01"; @@ -144,26 +279,122 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ } if ("2".equals(ccclfs) && !"".equals(rzdjbxss) && DateTypeEnum.WORK_DAY.getKey().equals(rqlx)){ //工作日加班最大数 - maxDayTime = getWorkDayTime(workOverTimeResults,analysisDate); - - - }else if ("2".equals(ccclfs) && !"".equals(yzdjbxss)){ - //每月最大加班数 - maxWeekTime = getMonthTime(workOverTimeResults); - - - }else if ("2".equals(ccclfs) && !"".equals(zzdjbxss)){ + double dayTime = getWorkDayTime(workOverTimeResults,analysisDate) *60; + double maxDayTime = Double.valueOf(rzdjbxss) *60; + double time = jbsc+dayTime; + if (time > maxDayTime){ + jbsc = maxDayTime-dayTime; + } + } + if ("2".equals(ccclfs) && !"".equals(zzdjbxss)){ //每周最大加班小时数 - maxMonthTime = getWeekTime(workOverTimeResults,analysisDate); - - + double weekTime = getWeekTime(workOverTimeResults,analysisDate); + double maxWeekTime = Double.valueOf(zzdjbxss) *60; + double time = jbsc+weekTime; + if (time > maxWeekTime){ + jbsc = maxWeekTime-weekTime; + } } + if ("2".equals(ccclfs) && !"".equals(yzdjbxss)){ + //每月最大加班数 + double monthTime = getMonthTime(workOverTimeResults); + double maxMonthTime = Double.valueOf(yzdjbxss) *60; + double time = jbsc+monthTime; + if (time > maxMonthTime){ + jbsc = maxMonthTime-monthTime; + } + } + if (CheckBoxEnum.CHECKED.getKey().equals(jbscbdccsqsc)){ + if (jbsc > Integer.valueOf(Util.null2String(scheduleMap.get("jbsc")))*60){ + jbsc = Integer.valueOf(Util.null2String(scheduleMap.get("jbsc")))*60; + } + } + log.info("最终加班时长: {}",jbsc); + workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key")); + double itemduration = Utils.getItemdurationDown(workOverTimeHsl,workOverTimeHsdw,Long.valueOf(Math.round(jbsc)).intValue(),AccountingUnitEnum.MINUTES); + workOverTimeItems.put("itemduration",itemduration); + /** + * 入加班结果表 + */ + Map insertParam = Maps.newHashMap(); + insertParam.put("jbry",userId); + insertParam.put("sjksrq",realityStartTime.split(" ")[0]); + insertParam.put("sjkssj",realityStartTime.split(" ")[1]); + insertParam.put("sjjsrq",realityEndime.split(" ")[0]); + insertParam.put("sjjssj",realityEndime.split(" ")[1]); + insertParam.put("sjjbsc",String.format ("%.2f", jbsc/60)); + insertParam.put("jbjgly","4"); + insertParam.put("zt","1"); + DbTools.update(CommonUtil.makeInsertSql("uf_jcl_kq_jbjg",insertParam)); - + /** + * 入假期余额 + */ //加班时长自动转入假期余额 if (CheckBoxEnum.CHECKED.getKey().equals(jbzdzjqye)){ + Map insertHoliDayParam = Maps.newHashMap(); + insertHoliDayParam.put("ygid",userId); + insertHoliDayParam.put("jqid",workTimeBeLateItems.get(0).get("zrdjb")); + //转入的假期额度生效日期 + String yesxrq = Util.null2String(workTimeBeLateItems.get(0).get("yesxrq")); + if ("0".equals(yesxrq)){ + //一月后 + insertHoliDayParam.put("sxrq",DateUtil.lastMonth(analysisDate,DateUtil.yyyyMMdd)); + }else if ("1".equals(yesxrq)){ + //次月 + insertHoliDayParam.put("sxrq",DateUtil.lastMonth(analysisDate)+"-01"); + }else if ("2".equals(yesxrq)){ + //次日 + insertHoliDayParam.put("sxrq",DateUtil.AfterDay(analysisDate,1)); + } + //额度可用的周期 + String yekyzq = Util.null2String(workTimeBeLateItems.get(0).get("yekyzq")); + if ("0".equals(yekyzq)){ + //一个月 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,1,DateUtil.yyyyMMdd)); + }else if ("1".equals(yekyzq)){ + //两个月 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,2,DateUtil.yyyyMMdd)); + }else if ("2".equals(yekyzq)){ + //三个月 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,3,DateUtil.yyyyMMdd)); + }else if ("3".equals(yekyzq)){ + //六个月 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,6,DateUtil.yyyyMMdd)); + }else if ("4".equals(yekyzq)){ + //十二个月 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,12,DateUtil.yyyyMMdd)); + }else if ("5".equals(yekyzq)){ + //季度 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,3,DateUtil.yyyyMMdd)); + }else if ("6".equals(yekyzq)){ + //半年 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,6,DateUtil.yyyyMMdd)); + }else if ("7".equals(yekyzq)){ + //一年 + insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,12,DateUtil.yyyyMMdd)); + } + insertHoliDayParam.put("ktsc",String.format ("%.2f", jbsc/60)); + String zdyqsc = Util.null2String(workTimeBeLateItems.get(0).get("zdyqsc")); + if ("0".equals(zdyqsc)){ + //一个月 + insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,1,DateUtil.yyyyMMdd)); + }else if ("1".equals(zdyqsc)){ + //两个月 + insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,2,DateUtil.yyyyMMdd)); + }else if ("2".equals(zdyqsc)){ + //三个月 + insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,3,DateUtil.yyyyMMdd)); + }else if ("3".equals(zdyqsc)){ + //半年 + insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,6,DateUtil.yyyyMMdd)); + }else if ("4".equals(zdyqsc)){ + //一年 + insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,12,DateUtil.yyyyMMdd)); + } + DbTools.update(CommonUtil.makeInsertSql("uf_jcl_kq_kqxm",insertHoliDayParam)); } } @@ -219,4 +450,81 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ return totalHour; } + /** + * 请假影响加班时长 + * @param kssj 加班开始时间 + * @param jssj 加班结束时间 + * @param workFor 作用时段 + * @param askForLeaveList 请假集合 + * @param askForLeaveItems 请假项目 + * @return 请假在加班中所占时间 + */ + public int removeAskForLeave(String kssj,String jssj,String workFor,String bdlx,List> askForLeaveList, + Map> askForLeaveItems,List> offsetAskForLeaveAnomaly ){ + int employTime = 0; + for (int i=0;i askForLeaveItem = askForLeaveItems.get(askForLeaveList.get(i).get("jqlx")); + //作用时段 + String zysd = Util.null2String(askForLeaveItem.get("zysd")); + if (!zysd.contains(workFor) && !WorkForTimeEnum.ALL_TIME.getKey().equals(zysd)){ + continue; + } + if ("".equals(Util.null2String(askForLeaveList.get(i).get("kssj"))) || "".equals(Util.null2String(askForLeaveList.get(i).get("jssj")))){ + if (!"".equals(qjsc)){ + //时长请假 + if (offsetAskForLeaveAnomaly.size() > 0){ + List> list = offsetAskForLeaveAnomaly.stream().filter(e->bdlx.equals(e.get("bdlx"))).collect(Collectors.toList()); + employTime += Math.round(list.size()/Double.valueOf(offsetAskForLeaveAnomaly.size()) *Double.valueOf(qjsc)*60); + } + } + }else { + //按照开始时间,结束时间请假 + employTime +=Utils.getStartAndEndTime(kssj,jssj,askForLeaveList.get(i)); + } + } + return employTime; + } + + /** + * 外出影响加班时长 + * @param kssj 加班开始时间 + * @param jssj 加班结束时间 + * @param evectionList 外出、请假集合 + * @return + */ + public int removeEvection(String kssj,String jssj,String workFor,String bdlx,List> evectionList,Map> evectionItems,List> offsetEvectionAnomaly){ + int askForLeaveTime=0; + for (int i=0;i resultMap = Maps.newHashMap(); + resultMap.put("item",evectionList.get(i).get("cclx")); + //请假时长 + String qjsc = Util.null2String(evectionList.get(i).get("ccsc")); + //请假项目 + Map evectionItem = evectionItems.get(evectionList.get(i).get("cclx")); + //作用时段 + String zysd = Util.null2String(evectionItem.get("zysd")); + if (!zysd.contains(workFor) && !WorkForTimeEnum.ALL_TIME.getKey().equals(zysd)){ + continue; + } + + if ("".equals(Util.null2String(evectionList.get(i).get("kssj"))) || "".equals(Util.null2String(evectionList.get(i).get("jssj")))){ + if (!"".equals(qjsc)){ + if (offsetEvectionAnomaly.size() > 0){ + List> list = offsetEvectionAnomaly.stream().filter(e->bdlx.equals(e.get("bdlx"))).collect(Collectors.toList()); + askForLeaveTime += Math.round(list.size()/Double.valueOf(offsetEvectionAnomaly.size()) *Double.valueOf(qjsc)*60); + } + } + }else { + //按照开始时间,结束时间请假 + askForLeaveTime +=Utils.getStartAndEndTime(kssj,jssj,evectionList.get(i)); + } + } + return askForLeaveTime; + } + + } diff --git a/src/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.java b/src/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.java index 3f030b0..4f2ed34 100644 --- a/src/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.java +++ b/src/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.java @@ -270,7 +270,8 @@ public class AttendanceAnalysisWrapper extends Service { /** * 计算是否考勤异常,是否有早退、迟到、漏卡的情况 - * */ + * + **/ List> abnormalClockInList = updateAttendanceResultWrapper.recordAbnormalClockIn(recordAbnormalParam); @@ -282,19 +283,23 @@ public class AttendanceAnalysisWrapper extends Service { recordAbnormalParam.put("askForLeaveItems",askForLeaveItems); recordAbnormalParam.put("abnormalClockInList",abnormalClockInList); Map vactionMap = updateAttendanceResultWrapper.recordAskForLeave(recordAbnormalParam); - abnormalClockInList = (List>)vactionMap.get("abnormalClockInList"); + List> abnormalClockInListByAskForLeave = (List>)vactionMap.get("abnormalClockInList"); List> vactionList = (List>)vactionMap.get("resultList"); + recordAbnormalParam.put("offsetAskForLeaveAnomaly",vactionMap.get("offsetAskForLeaveAnomaly")); + log.info("请假后消除的异常 : [{}]",vactionMap.get("offsetAskForLeaveAnomaly")); /** * 出差、外出 */ recordAbnormalParam.put("evectionList",evectionList); recordAbnormalParam.put("evectionItems",evectionItems); - recordAbnormalParam.put("abnormalClockInList",abnormalClockInList); + recordAbnormalParam.put("abnormalClockInList",abnormalClockInListByAskForLeave); Map recordEvection= updateAttendanceResultWrapper.recordEvection(recordAbnormalParam); - abnormalClockInList = (List>)recordEvection.get("abnormalClockInList"); + List> abnormalClockInListByEvction = (List>)recordEvection.get("abnormalClockInList"); List> evectionResultList = (List>)recordEvection.get("resultList"); - + recordAbnormalParam.put("abnormalClockInList",abnormalClockInListByEvction); + recordAbnormalParam.put("offsetEvectionAnomaly",recordEvection.get("offsetEvectionAnomaly")); + log.info("出差外出后消除的异常 : [{}]",recordEvection.get("offsetEvectionAnomaly")); /** * 加班 */ @@ -307,11 +312,11 @@ public class AttendanceAnalysisWrapper extends Service { List> recordData = Lists.newArrayList(); recordData.addAll(vactionList); recordData.addAll(evectionResultList); - recordData.addAll(abnormalClockInList); + recordData.addAll(abnormalClockInListByEvction); recordParam.put("recordData",recordData); recordParam.put("recordDataTime",utilService.getNeedRecordClockInTime(clcokInTimeData)); log.info("recordParam : {}",recordParam); - if (abnormalClockInList.size()>0){ + if (abnormalClockInListByEvction.size()>0){ recordParam.put("cqzt",CheckBoxEnum.CHECKED.getKey()); }else { recordParam.put("cqzt",CheckBoxEnum.UNCHECKED.getKey()); diff --git a/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java b/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java index f386c22..bb29d96 100644 --- a/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java +++ b/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java @@ -83,6 +83,7 @@ public class UpdateAttendanceResultWrapper extends Service { List> iforgetClockIn = forgetClockInService.forgetClockIn(missCardParams); if (iforgetClockIn.size() >0){ iforgetClockIn.get(0).put("pointTime",pointTime); + iforgetClockIn.get(0).put("bdlx",classInfo.get("bdlx")); resultList.add(iforgetClockIn.get(0)); } @@ -99,6 +100,7 @@ public class UpdateAttendanceResultWrapper extends Service { List> ifBeLate = beLateService.beLate(beLateParams); if (ifBeLate.size() > 0){ ifBeLate.get(0).put("pointTime",pointTime); + ifBeLate.get(0).put("bdlx",classInfo.get("bdlx")); resultList.add(ifBeLate.get(0)); } }else if (ClockPointEnum.END.getKey().equals(pointType) && ClockPointEnum.BEFORE.getKey().equals(timeType)){ @@ -114,6 +116,7 @@ public class UpdateAttendanceResultWrapper extends Service { List> ifLeaveEarly = beLateService.leaveEarly(leaveEarlyParams); if (ifLeaveEarly.size() > 0){ ifLeaveEarly.get(0).put("pointTime",pointTime); + ifLeaveEarly.get(0).put("bdlx",classInfo.get("bdlx")); resultList.add(ifLeaveEarly.get(0)); } } @@ -152,7 +155,8 @@ public class UpdateAttendanceResultWrapper extends Service { List> askForLeaveList = (List>)params.get("askForLeaveList"); //异常记录 List> abnormalClockInList = (List>)params.get("abnormalClockInList"); - + //请假抵消异常 + List> offsetAskForLeaveAnomaly = Lists.newArrayList(); Map map = Maps.newHashMap(); List> resultList = Lists.newArrayList(); @@ -180,7 +184,6 @@ public class UpdateAttendanceResultWrapper extends Service { Map param = Maps.newHashMap(); param.put("abnormalClockInList",abnormalClockInList); - double itemduration = 0; if ("".equals(Util.null2String(askForLeaveList.get(i).get("kssj"))) || "".equals(Util.null2String(askForLeaveList.get(i).get("jssj")))){ //弹性请假,半天请假 @@ -195,7 +198,9 @@ public class UpdateAttendanceResultWrapper extends Service { param.put("qjsc",qjsc); param.put("tybcndbjlhbjs",tybcndbjlhbjs); if (abnormalClockInList.size()>0){ - abnormalClockInList =askForLeaveService.askForLeaveByDurationTime(param); + Map map1 = askForLeaveService.askForLeaveByDurationTime(param); + abnormalClockInList =(List>)map1.get("abnormalClockInList"); + offsetAskForLeaveAnomaly.addAll((List>)map1.get("offsetAskForLeaveAnomaly")); } } }else { @@ -210,12 +215,15 @@ public class UpdateAttendanceResultWrapper extends Service { param.put("kssj",kssj); param.put("jssj",jssj); if (abnormalClockInList.size()>0){ - abnormalClockInList = askForLeaveService.askForLeaveByTime(param); + Map map1 = askForLeaveService.askForLeaveByTime(param); + abnormalClockInList = (List>)map1.get("abnormalClockInList"); + offsetAskForLeaveAnomaly.addAll((List>)map1.get("offsetAskForLeaveAnomaly")); } } } map.put("resultList",resultList); map.put("abnormalClockInList",abnormalClockInList); + map.put("offsetAskForLeaveAnomaly",offsetAskForLeaveAnomaly); return map; } @@ -236,7 +244,8 @@ public class UpdateAttendanceResultWrapper extends Service { List> evectionList = (List>)params.get("evectionList"); //异常记录 List> abnormalClockInList = (List>)params.get("abnormalClockInList"); - + //外出抵消异常 + List> offsetEvectionAnomaly = Lists.newArrayList(); Map map = Maps.newHashMap(); List> resultList = Lists.newArrayList(); @@ -279,7 +288,9 @@ public class UpdateAttendanceResultWrapper extends Service { param.put("ccsc",qjsc); param.put("tybcndbjlhbjs",tybcndbjlhbjs); if (abnormalClockInList.size()>0){ - abnormalClockInList =evectionService.evectionByDurationTime(param); + Map map1 =evectionService.evectionByDurationTime(param); + abnormalClockInList = (List>)map1.get("abnormalClockInList"); + offsetEvectionAnomaly.addAll((List>)map1.get("offsetEvectionAnomaly")); } } }else { @@ -294,12 +305,15 @@ public class UpdateAttendanceResultWrapper extends Service { param.put("kssj",kssj); param.put("jssj",jssj); if (abnormalClockInList.size()>0){ - abnormalClockInList = evectionService.evectionByTime(param); + Map map1 = evectionService.evectionByTime(param); + abnormalClockInList = (List>)map1.get("abnormalClockInList"); + offsetEvectionAnomaly.addAll((List>)map1.get("offsetEvectionAnomaly")); } } } map.put("resultList",resultList); map.put("abnormalClockInList",abnormalClockInList); + map.put("offsetEvectionAnomaly",offsetEvectionAnomaly); return map; } diff --git a/src/com/engine/attendance/enums/AttendanceItemTypeEnum.java b/src/com/engine/attendance/enums/AttendanceItemTypeEnum.java index 52cc4a7..7adf24c 100644 --- a/src/com/engine/attendance/enums/AttendanceItemTypeEnum.java +++ b/src/com/engine/attendance/enums/AttendanceItemTypeEnum.java @@ -11,7 +11,8 @@ public enum AttendanceItemTypeEnum implements BaseEnum { EVECTION("5","出差"), PUNCH_IN_AGAIN("6","补打卡"), ALLOWANCE("7","津贴"), - OTHER("8","其他"); + OTHER("8","其他"), + MISSE_CARD("9","漏打卡"); private String key; private String value; diff --git a/src/com/engine/common/util/DateUtil.java b/src/com/engine/common/util/DateUtil.java index cd6af75..ce53d87 100644 --- a/src/com/engine/common/util/DateUtil.java +++ b/src/com/engine/common/util/DateUtil.java @@ -14,14 +14,24 @@ public class DateUtil { public static DateTimeFormatter yyyyMM = DateTimeFormatter.ofPattern("yyyy-MM"); public static String beforeMonth(String time){ - LocalDateTime localDateTime = LocalDate.parse(time, yyyyMMdd).atStartOfDay(); + LocalDateTime localDateTime = DateUtil.getTime(time); return localDateTime.minusMonths(1).format(yyyyMM); } public static String lastMonth(String time){ - LocalDateTime localDateTime = LocalDate.parse(time, yyyyMMdd).atStartOfDay(); + LocalDateTime localDateTime = DateUtil.getTime(time); return localDateTime.plusMonths(1).format(yyyyMM); } + public static String lastMonth(String time,DateTimeFormatter dateTimeFormatter){ + LocalDateTime localDateTime = DateUtil.getTime(time); + + return localDateTime.plusMonths(1).format(dateTimeFormatter); + } + public static String nextMonth(String time,int month,DateTimeFormatter dateTimeFormatter){ + LocalDateTime localDateTime = DateUtil.getTime(time); + + return localDateTime.plusMonths(month).format(dateTimeFormatter); + } public static String beforeDay(String time,long day){ @@ -73,10 +83,8 @@ public class DateUtil { public static LocalDateTime getTime(String time){ int length = time.length(); switch (length){ - case 7: - return LocalDateTime.parse(time, yyyyMM); case 10: - return LocalDateTime.parse(time, yyyyMMdd); + return LocalDate.parse(time, yyyyMMdd).atStartOfDay(); case 19: return LocalDateTime.parse(time, yyyyMMddHHmmss); case 16: diff --git a/src/com/engine/common/util/DbTools.java b/src/com/engine/common/util/DbTools.java index 159a08d..cca46a6 100644 --- a/src/com/engine/common/util/DbTools.java +++ b/src/com/engine/common/util/DbTools.java @@ -15,6 +15,7 @@ public class DbTools { public static List> getSqlToList(String sql,Object...value){ RecordSet rs = thread.get(); + List> result = new ArrayList<>(); if (value == null || value.length <=0 || "".equals(value)){ rs.executeQuery(sql); diff --git a/src/com/engine/common/util/Utils.java b/src/com/engine/common/util/Utils.java index 20af2f1..b6a4634 100644 --- a/src/com/engine/common/util/Utils.java +++ b/src/com/engine/common/util/Utils.java @@ -1,6 +1,7 @@ package com.engine.common.util; import com.engine.attendance.enums.AccountingUnitEnum; +import com.engine.attendance.enums.CheckBoxEnum; import com.engine.attendance.enums.ClassSegmentTypeEnum; import com.engine.attendance.enums.ClockPointEnum; import com.google.common.collect.Maps; @@ -393,13 +394,13 @@ public class Utils { betweenMinutes = betweenMinutes - DateUtil.getBetWeenMinutes(dtkssj,dtjssj); log.info("休息时间在请假时间中间"); }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtkssj)) >=0){ - //休息时间在请假时间 左边 + //休息时间在请假时间 右边 betweenMinutes = betweenMinutes - DateUtil.getBetWeenMinutes(dtkssj,jssj); - log.info("休息时间在请假时间 左边"); + log.info("休息时间在请假时间 右边"); }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) >=0 && DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtjssj)) <=0){ - //休息时间在请假时间 右边 + //休息时间在请假时间 左边 betweenMinutes = betweenMinutes - DateUtil.getBetWeenMinutes(kssj,dtjssj); - log.info("休息时间在请假时间 右边"); + log.info("休息时间在请假时间 左边"); }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(dtkssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(dtjssj)) <=0){ //请假时间在休息时间中间 betweenMinutes = 0; @@ -411,4 +412,32 @@ public class Utils { return betweenMinutes; } + /** + * 请假外出在加班中所占时间 + * @return + */ + public static int getStartAndEndTime(String kssj,String jssj,Map leaveMap){ + String leavekssj = leaveMap.get("ksrq") + " "+leaveMap.get("kssj"); + String leavejssj = leaveMap.get("jsrq")+ " "+leaveMap.get("jssj"); + int betweenMinutes=0; + if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) >=0){ + //请假外出时间在中间 + betweenMinutes = DateUtil.getBetWeenMinutes(leavekssj,leavejssj); + log.info("请假外出时间在中间"); + }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavekssj)) >=0){ + //请假外出时间 右边 + betweenMinutes = DateUtil.getBetWeenMinutes(leavekssj,jssj); + log.info("请假外出时间 右边"); + }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) >=0 && DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavejssj)) <=0){ + //休请假外出时间 左边 + betweenMinutes = DateUtil.getBetWeenMinutes(kssj,leavejssj); + log.info("请假外出时间 左边"); + }else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) <=0){ + //请假外出时间中间 + betweenMinutes = 0; + log.info("加班实际在请假外出时间中间"); + } + return betweenMinutes; + } + } diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.class b/target/classes/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.class index 07d2aad..0f8cac3 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/AskForLeaveService.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/EvectionService.class b/target/classes/com/engine/attendance/attendanceanalysis/service/EvectionService.class index d9b5bfd..c8f3d63 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/EvectionService.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/EvectionService.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.class b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.class index 96505e9..97de038 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.class b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.class index 7636846..56abbaf 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AskForLeaveServiceImpl.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.class b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.class index 6d6502b..6781c50 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/EvectionServiceImpl.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.class b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.class index 6f1d339..71ab9b0 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/ForgetClockInServiceImpl.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.class b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.class index f2bf55f..e182c9e 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/UtilServiceImpl.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.class b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.class index 4cfbbd3..89fb538 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.class and b/target/classes/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.class b/target/classes/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.class index 08eab8c..7777682 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.class and b/target/classes/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.class differ diff --git a/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class b/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class index efecf3f..64a5edd 100644 Binary files a/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class and b/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class differ diff --git a/target/classes/com/engine/attendance/enums/AttendanceItemTypeEnum.class b/target/classes/com/engine/attendance/enums/AttendanceItemTypeEnum.class index 1a2ac11..fe8ae26 100644 Binary files a/target/classes/com/engine/attendance/enums/AttendanceItemTypeEnum.class and b/target/classes/com/engine/attendance/enums/AttendanceItemTypeEnum.class differ diff --git a/target/classes/com/engine/common/util/DateUtil.class b/target/classes/com/engine/common/util/DateUtil.class index 3dad251..4aa6c78 100644 Binary files a/target/classes/com/engine/common/util/DateUtil.class and b/target/classes/com/engine/common/util/DateUtil.class differ diff --git a/target/classes/com/engine/common/util/DbTools.class b/target/classes/com/engine/common/util/DbTools.class index 65602b2..9900897 100644 Binary files a/target/classes/com/engine/common/util/DbTools.class and b/target/classes/com/engine/common/util/DbTools.class differ diff --git a/target/classes/com/engine/common/util/Utils$1.class b/target/classes/com/engine/common/util/Utils$1.class index 3fa2952..6d8253b 100644 Binary files a/target/classes/com/engine/common/util/Utils$1.class and b/target/classes/com/engine/common/util/Utils$1.class differ diff --git a/target/classes/com/engine/common/util/Utils$2.class b/target/classes/com/engine/common/util/Utils$2.class index 6cce080..707a19b 100644 Binary files a/target/classes/com/engine/common/util/Utils$2.class and b/target/classes/com/engine/common/util/Utils$2.class differ diff --git a/target/classes/com/engine/common/util/Utils$3.class b/target/classes/com/engine/common/util/Utils$3.class index f10d866..1ecb957 100644 Binary files a/target/classes/com/engine/common/util/Utils$3.class and b/target/classes/com/engine/common/util/Utils$3.class differ diff --git a/target/classes/com/engine/common/util/Utils.class b/target/classes/com/engine/common/util/Utils.class index d9e6424..570d9e2 100644 Binary files a/target/classes/com/engine/common/util/Utils.class and b/target/classes/com/engine/common/util/Utils.class differ diff --git a/target/test-classes/Test$1.class b/target/test-classes/Test$1.class index c4a5546..5dc12d4 100644 Binary files a/target/test-classes/Test$1.class and b/target/test-classes/Test$1.class differ diff --git a/target/test-classes/Test$10.class b/target/test-classes/Test$10.class index 6a5714f..9423d16 100644 Binary files a/target/test-classes/Test$10.class and b/target/test-classes/Test$10.class differ diff --git a/target/test-classes/Test$11.class b/target/test-classes/Test$11.class index 47428ca..b6d010b 100644 Binary files a/target/test-classes/Test$11.class and b/target/test-classes/Test$11.class differ diff --git a/target/test-classes/Test$12.class b/target/test-classes/Test$12.class index 29562de..89a9b0e 100644 Binary files a/target/test-classes/Test$12.class and b/target/test-classes/Test$12.class differ diff --git a/target/test-classes/Test$13.class b/target/test-classes/Test$13.class index ab5085c..27d9470 100644 Binary files a/target/test-classes/Test$13.class and b/target/test-classes/Test$13.class differ diff --git a/target/test-classes/Test$2.class b/target/test-classes/Test$2.class index be7af60..b407a7f 100644 Binary files a/target/test-classes/Test$2.class and b/target/test-classes/Test$2.class differ diff --git a/target/test-classes/Test$3.class b/target/test-classes/Test$3.class index 29558ac..9c17264 100644 Binary files a/target/test-classes/Test$3.class and b/target/test-classes/Test$3.class differ diff --git a/target/test-classes/Test$4.class b/target/test-classes/Test$4.class index afff1a5..fa0454c 100644 Binary files a/target/test-classes/Test$4.class and b/target/test-classes/Test$4.class differ diff --git a/target/test-classes/Test$5.class b/target/test-classes/Test$5.class index 48dc9d1..46d0d3f 100644 Binary files a/target/test-classes/Test$5.class and b/target/test-classes/Test$5.class differ diff --git a/target/test-classes/Test$6.class b/target/test-classes/Test$6.class index a8999ab..a3ef535 100644 Binary files a/target/test-classes/Test$6.class and b/target/test-classes/Test$6.class differ diff --git a/target/test-classes/Test$7.class b/target/test-classes/Test$7.class index 6da92bc..02e837b 100644 Binary files a/target/test-classes/Test$7.class and b/target/test-classes/Test$7.class differ diff --git a/target/test-classes/Test$8.class b/target/test-classes/Test$8.class index b77bc77..30c53ac 100644 Binary files a/target/test-classes/Test$8.class and b/target/test-classes/Test$8.class differ diff --git a/target/test-classes/Test$9.class b/target/test-classes/Test$9.class index 4809cff..ebf1684 100644 Binary files a/target/test-classes/Test$9.class and b/target/test-classes/Test$9.class differ diff --git a/target/test-classes/Test.class b/target/test-classes/Test.class index a035e3a..44619e2 100644 Binary files a/target/test-classes/Test.class and b/target/test-classes/Test.class differ diff --git a/target/test-classes/TestAskForLeaveByDurationTime.class b/target/test-classes/TestAskForLeaveByDurationTime.class index 6cea6bd..77beed5 100644 Binary files a/target/test-classes/TestAskForLeaveByDurationTime.class and b/target/test-classes/TestAskForLeaveByDurationTime.class differ diff --git a/test/Test.java b/test/Test.java index d2fd076..8e43cb8 100644 --- a/test/Test.java +++ b/test/Test.java @@ -18,6 +18,8 @@ import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -180,11 +182,24 @@ public class Test { // System.out.println(lists2); // // System.out.println(Double.valueOf("1.00").intValue()*60); - String analysisDate = "2023-11-22"; +// String analysisDate = "2023-11-22"; +// List lists = Lists.newArrayList(); +// lists.add("aa"); +// lists.add("aa"); +// lists.add("bb"); +// List lists2 = lists.stream().filter(e->e.equals("aa")).collect(Collectors.toList()); +// System.out.println(lists.size()); +// System.out.println(lists2.size()); + BigDecimal s = new BigDecimal(110.0); + + System.out.println(String.format ("%.2f", 1.8333)); + + System.out.println(DateUtil.lastMonth("2023-11-23",DateUtil.yyyyMMdd)); + //System.out.println(Utils.getItemdurationDown(15,AccountingUnitEnum.MINUTES.getKey(),59,AccountingUnitEnum.MINUTES)); // Calendar calendar = Calendar.getInstance(); // calendar.set(Integer.valueOf(analysisDate.split("-")[0]), Integer.valueOf(analysisDate.split("-")[1]) - 1, 1); - int day = TimeUtil.getDayOfWeek(analysisDate); - System.out.println(DateUtil.AfterDay(analysisDate,0)); +// int day = TimeUtil.getDayOfWeek(analysisDate); +// System.out.println(DateUtil.AfterDay(analysisDate,0)); // System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_WEEK)); // List> lists = Lists.newArrayList();