Merge remote-tracking branch 'origin/main'

zm_dev
sy 11 months ago
commit 29d9fd522f

@ -10,28 +10,29 @@
</component>
<component name="ChangeListManager">
<list default="true" id="baeb3dfb-5097-46c5-933e-6d1dab18b815" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/workovertime/GetOvertimeDurationCmd.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/workovertime/SaveWorkOverTimeCmd.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values.at" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values.at" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values.s" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat.values.s" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat_i" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/ade958e9-d72b-48ba-8be1-0441de7da9a5/entities/entities.dat_i" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/WEB-INF/sqllog/ecologysql" beforeDir="false" afterPath="$PROJECT_DIR$/WEB-INF/sqllog/ecologysql" afterDir="false" />
<change beforePath="$PROJECT_DIR$/log/sdk.log" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/out/artifacts/hrm_attendance/hrm-attendance.jar" beforeDir="false" afterPath="$PROJECT_DIR$/out/artifacts/hrm_attendance/hrm-attendance.jar" afterDir="false" />
<change beforePath="$PROJECT_DIR$/log/sdk.log" beforeDir="false" afterPath="$PROJECT_DIR$/log/sdk.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/GetScheduleResultListCmd.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/GetScheduleResultListCmd.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/getclockInpoint/AdjustByWorkOverTimeCmd.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/getclockInpoint/AdjustByWorkOverTimeCmd.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/ShiftService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/ShiftService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/ShiftServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/ShiftServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/cmd/getclockInpoint/AdjustByWorkOverTimeCmd.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/cmd/getclockInpoint/AdjustByWorkOverTimeCmd.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/service/impl/AbnormalAttendanceServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/com/engine/common/util/Utils.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/engine/common/util/Utils.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/cmd/GetScheduleResultListCmd.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/cmd/GetScheduleResultListCmd.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/service/impl/ShiftServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/service/impl/ShiftServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test/TestAttendanceAllowance/Test.java" beforeDir="false" afterPath="$PROJECT_DIR$/test/TestAttendanceAllowance/Test.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/AttendanceAnalysisWrapper.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/classes/com/engine/common/util/Utils.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/classes/com/engine/common/util/Utils.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/target/test-classes/Tset_sy.class" beforeDir="false" afterPath="$PROJECT_DIR$/target/test-classes/Tset_sy.class" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test/Tset_sy.java" beforeDir="false" afterPath="$PROJECT_DIR$/test/Tset_sy.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -123,14 +124,6 @@
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestMethod" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="TestMethod" />
<module name="hrm-attendance" />
<shortenClasspath name="MANIFEST" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="TestObj" type="Application" factoryName="Application" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="TestObj" />
<module name="hrm-attendance" />
@ -196,6 +189,17 @@
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="Tset_sy.test" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
<module name="hrm-attendance" />
<shortenClasspath name="MANIFEST" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="Tset_sy" />
<option name="METHOD_NAME" value="test" />
<option name="TEST_OBJECT" value="method" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="JUnit" factoryName="JUnit">
<shortenClasspath name="MANIFEST" />
<option name="TEST_OBJECT" value="class" />
@ -206,10 +210,10 @@
<recent_temporary>
<list>
<item itemvalue="JUnit.Test.testAnalysis" />
<item itemvalue="JUnit.Tset_sy.test" />
<item itemvalue="JUnit.Test2.testAnalysis" />
<item itemvalue="JUnit.Test1.test1" />
<item itemvalue="Application.TestMain" />
<item itemvalue="Application.TestMethod" />
</list>
</recent_temporary>
</component>
@ -623,7 +627,9 @@
<workItem from="1715837102628" duration="19500000" />
<workItem from="1715909515931" duration="5482000" />
<workItem from="1715923672642" duration="9625000" />
<workItem from="1716168995101" duration="7106000" />
<workItem from="1716168995101" duration="7410000" />
<workItem from="1716182862702" duration="18415000" />
<workItem from="1716255298319" duration="10236000" />
</task>
<servers />
</component>
@ -663,24 +669,29 @@
<option name="timeStamp" value="99" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/AllowanceServiceImpl.java</url>
<line>26</line>
<option name="timeStamp" value="127" />
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java</url>
<line>86</line>
<option name="timeStamp" value="101" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/workovertime/GetOvertimeDurationCmd.java</url>
<line>254</line>
<option name="timeStamp" value="102" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/wrapper/UpdateAttendanceResultWrapper.java</url>
<line>122</line>
<option name="timeStamp" value="130" />
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/WorkOverTimeServiceImpl.java</url>
<line>100</line>
<option name="timeStamp" value="103" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/web/AttendanceanalysisAction.java</url>
<line>157</line>
<option name="timeStamp" value="142" />
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/workovertime/SaveWorkOverTimeCmd.java</url>
<line>38</line>
<option name="timeStamp" value="104" />
</line-breakpoint>
<line-breakpoint enabled="true" type="java-line">
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/service/impl/ShiftServiceImpl.java</url>
<line>204</line>
<option name="timeStamp" value="143" />
<url>file://$PROJECT_DIR$/src/com/engine/attendance/attendanceanalysis/cmd/workovertime/SaveWorkOverTimeCmd.java</url>
<line>81</line>
<option name="timeStamp" value="105" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -6,7 +6,6 @@ import com.engine.attendance.attendanceanalysis.service.impl.ShiftServiceImpl;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.ClassBelongToEnum;
import com.engine.attendance.enums.ClassSegmentTypeEnum;
import com.engine.attendance.enums.WorkForTimeEnum;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.common.util.DateUtil;
@ -62,7 +61,7 @@ public class GetScheduleResultListCmd extends AbstractCommonCommand<Map<String,O
schedulMap.put("schedulingMapBydate",schedulingMapBydate);
Map<String,List<Map<String,Object>>> resultMap = Maps.newHashMap();
String sql = "select a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid where a.id in (";
String sql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid where a.id in (";
String bcxxIds = "";
for (Map.Entry<String,List<Map<String,Object>>> entry :schedulingMap.entrySet()){
if (!entry.getKey().equals("")){
@ -102,7 +101,11 @@ public class GetScheduleResultListCmd extends AbstractCommonCommand<Map<String,O
*/
for (Map<String,Object> candidateSchedulingResult:candidateSchedulingResultsList){
Map<String, Object> shiftResult = basicsetService.punchMatchShift(params.get("pbdx").toString(),candidateSchedulingResult,(List<Map<String,Object>>)params.get("clockInData"),(Map<String,Map<String,Object>>)params.get("clockInTimeMap"));
resultMap.put(shiftResult.get("bcrq").toString(),(List<Map<String,Object>>)shiftResult.get("bcData"));
List<Map<String,Object>> bcData = (List<Map<String,Object>>)shiftResult.get("bcData");
for(Map<String,Object> data:bcData){
adjustWorkOverTimeClass(data, attendanceItems,commandContext);
}
resultMap.put(shiftResult.get("bcrq").toString(),bcData);
}
/** 加班计划*/
@ -146,6 +149,8 @@ public class GetScheduleResultListCmd extends AbstractCommonCommand<Map<String,O
map.put("sfdx",Util.null2String(resultList.get(0).get("sfdx")));
map.put("zddxfz",Util.null2String(resultList.get(0).get("zddxfz")));
map.put("dxhs",Util.null2String(resultList.get(0).get("dxhs")));
map.put("sfxx",resultList.get(0).get("sfxx"));
map.put("xxbdkzdjb",resultList.get(0).get("xxbdkzdjb"));
}else {
map.put("edsc","0");
}
@ -233,32 +238,42 @@ public class GetScheduleResultListCmd extends AbstractCommonCommand<Map<String,O
}
/**
* 1
*
* 1
* 2
* @param scheduleMap
*/
public void adjustWorkOverTimeClass(Map<String,Object> scheduleMap,List<Map<String,Object>> attendanceItems,CommandContext commandContext){
String bdlx = Util.null2String(scheduleMap.get("bdlx"));
//是否休息
String sfxx = Util.null2String(scheduleMap.get("sfxx"));
//休息班打卡自动加班
String xxbdkzdjb = Util.null2String(scheduleMap.get("xxbdkzdjb"));
if (CheckBoxEnum.CHECKED.getKey().equals(sfxx) && CheckBoxEnum.CHECKED.getKey().equals(xxbdkzdjb) &&
bdlx.equals(ClassSegmentTypeEnum.WORK_TIME.getKey())){
scheduleMap.put("beforeClassSegment",bdlx);
scheduleMap.put("bdlx",ClassSegmentTypeEnum.OVERTIME_PLAN.getKey());
bdlx = ClassSegmentTypeEnum.OVERTIME_PLAN.getKey();
}
if (Utils.ifOverTimeClassSegment(scheduleMap.get("bdlx").toString())){
Map<String,Object> getWorkOverTimeParam = Maps.newHashMap();
getWorkOverTimeParam.put("attendanceItems",attendanceItems);
getWorkOverTimeParam.put("rqlx",scheduleMap.get("rqlx"));
getWorkOverTimeParam.put("workfor", Utils.getWorkFor(bdlx));
List<Map<String,Object>> workTimeBeItems = Lists.newArrayList();
if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor", WorkForTimeEnum.DELAY_TO_WORK_OVERTIME.getKey());
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
//加班项目
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else if (ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor",WorkForTimeEnum.EARLY_TO_WORK_OVERTIME.getKey());
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){
workTimeBeItems = (List<Map<String,Object>>)scheduleMap.get("jblx");
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
scheduleMap.put("jblx",workTimeBeItems);
}else if (ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor",WorkForTimeEnum.OVERTIME_IN_CLASS.getKey());
Map<String,Object> result = new WorkOvertimeItemCmd(getWorkOverTimeParam).execute(commandContext);
workTimeBeItems = (List<Map<String,Object>>)result.get("attendanceItems");
}

@ -0,0 +1,352 @@
package com.engine.attendance.attendanceanalysis.cmd.workovertime;
import com.engine.attendance.enums.*;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.common.util.DateUtil;
import com.engine.common.util.Utils;
import com.engine.core.interceptor.CommandContext;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
*/
@Slf4j
public class GetOvertimeDurationCmd extends AbstractCommonCommand<Map<String, Object>> {
public GetOvertimeDurationCmd(Map<String, Object> params) {
this.params = params;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
Map<String, Object> resultMap = Maps.newHashMap();
//考勤项目
List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)params.get("attendanceItems");
//排班
List<Map<String, Object>> scheduleResult = (List<Map<String,Object>>)params.get("scheduleResult");
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//请假记录
List<Map<String,Object>> askForLeaveList = (List<Map<String,Object>>)params.get("askForLeaveList");
//请假项目
Map<String,Map<String,Object>> askForLeaveItems = (Map<String,Map<String,Object>>)params.get("askForLeaveItems");
//外出记录
List<Map<String,Object>> evectionList = (List<Map<String,Object>>)params.get("evectionList");
//外出项目
Map<String,Map<String,Object>> evectionItems = (Map<String,Map<String,Object>>)params.get("evectionItems");
//请假后消除的异常
List<Map<String,Object>> offsetAskForLeaveAnomaly = (List<Map<String,Object>>)params.get("offsetAskForLeaveAnomaly");
//出差外出后消除的异常
List<Map<String,Object>> offsetEvectionAnomaly = (List<Map<String,Object>>)params.get("offsetEvectionAnomaly");
//经过请假外出处理过的异常项目
List<Map<String,Object>> abnormalClockInList = (List<Map<String,Object>>)params.get("abnormalClockInList");
//不需要记录的异常项目
List<Map<String,Object>> notRecordAbnormalClockInList = (List<Map<String,Object>>)params.get("notRecordAbnormalClockInList");
//加班项目
List<Map<String, Object>> workTimeBeLateItems = (List<Map<String,Object>>)params.get("workTimeBeLateItems");
//打卡匹配
Map<String,Map<String,Object>> clcokInTimeMap = (Map<String,Map<String,Object>>)params.get("clcokInTimeMap");
//班次
Map<String, Object> scheduleMap = (Map<String, Object>)params.get("scheduleMap");
abnormalClockInList.addAll(notRecordAbnormalClockInList);
//总抵消异常
List<Map<String,Object>> anomalyList = Lists.newArrayList();
anomalyList.addAll(offsetEvectionAnomaly);
anomalyList.addAll(offsetAskForLeaveAnomaly);
String bdlx = Util.null2String(scheduleMap.get("bdlx"));
Map<String, Object> getWorkOverTimeParam = Maps.newHashMap();
//加班开始时间
String kssj = Utils.getkssjTime(scheduleMap, analysisDate);
//加班结束时间
String jssj = Utils.getjssjTime(scheduleMap, analysisDate);
//加班实际开始时间
String realityStartTime = "";
//加班实际结束时间
String realityEndime = "";
getWorkOverTimeParam.put("attendanceItems", attendanceItems);
getWorkOverTimeParam.put("rqlx", scheduleMap.get("rqlx"));
//开始必须打卡,当为加班计划类型的加班时已考勤项目设置为准
String ksjbbxydk = scheduleMap.get("ksdk").toString();
//结束必须打卡,当为加班计划类型的加班时已考勤项目设置为准
String jsjbbxydk = scheduleMap.get("jsdk").toString();
double jbsc = Double.valueOf(Util.null2String(scheduleMap.get("edxss")));
//提前打卡开始的时长计入加班
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 jbwdhlfzs = Util.null2String(workTimeBeLateItems.get(0).get("jbwdhlfzs")).equals("") ? "0" : Util.null2String(workTimeBeLateItems.get(0).get("jbwdhlfzs"));
//早于结束时间忽略分钟数
String jbzzhlfzs = Util.null2String(workTimeBeLateItems.get(0).get("jbzzhlfzs")).equals("") ? "0" : Util.null2String(workTimeBeLateItems.get(0).get("jbzzhlfzs"));
/**
*
*/
if (CheckBoxEnum.CHECKED.getKey().equals(ksjbbxydk)) {
Map<String, Object> clcokInTimeData = clcokInTimeMap.get(kssj);
if (clcokInTimeData == null) {
log.info("加班开始时间漏卡: {},clcokInTimeData:{}", kssj, clcokInTimeMap);
resultMap.put("jbsc","0");
return resultMap;
}
String hourTime = clcokInTimeData.get("signtime").toString();
if (hourTime.length() > 5) {
hourTime = hourTime.substring(0, 5);
}
String signTime = clcokInTimeData.get("signdate") + " " + hourTime;
realityStartTime = signTime;
} else {
realityStartTime = kssj;
}
if (CheckBoxEnum.CHECKED.getKey().equals(jsjbbxydk)) {
Map<String, Object> clcokInTimeData = clcokInTimeMap.get(jssj);
if (clcokInTimeData == null) {
log.info("加班结束时间漏卡: {},clcokInTimeData:{}", jssj, clcokInTimeData);
resultMap.put("jbsc","0");
return resultMap;
}
String hourTime = clcokInTimeData.get("signtime").toString();
if (hourTime.length() > 5) {
hourTime = hourTime.substring(0, 5);
}
String signTime = clcokInTimeData.get("signdate") + " " + hourTime;
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<Map<String, Object>> beLateAbnormal = abnormalClockInList.stream().filter(e -> e.get("pointTime").equals(kssj)).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<Map<String, Object>> collect1 = anomalyList.stream().filter(e -> e.get("pointTime").equals(kssj)).collect(Collectors.toList());
if (!"".equals(jbwdhlfzs) && beLateTime < Integer.valueOf(jbwdhlfzs)) {
beLateTime = 0;
}
//当存在迟到异常被抵消的情况
if (collect1.size() > 0) {
beLateTime = 0;
}
}
}
/**
* 退,退
*/
List<Map<String, Object>> leaveEarlyAbnormal = abnormalClockInList.stream().filter(e -> e.get("pointTime").equals(jssj)).collect(Collectors.toList());
double leaveElaryTime = 0;
if (leaveEarlyAbnormal.size() > 0) {
String hsdw = Util.null2String(leaveEarlyAbnormal.get(0).get("hsdw"));
String itemduration = Util.null2String(leaveEarlyAbnormal.get(0).get("itemduration"));
AttendanceItemTypeEnum itemType = (AttendanceItemTypeEnum) leaveEarlyAbnormal.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);
List<Map<String, Object>> collect2 = anomalyList.stream().filter(e -> e.get("pointTime").equals(jssj)).collect(Collectors.toList());
if (!"".equals(jbzzhlfzs) && leaveElaryTime < Integer.valueOf(jbzzhlfzs)) {
leaveElaryTime = 0;
}
//当存在早退异常被抵消的情况
if (collect2.size() > 0) {
leaveElaryTime = 0;
}
}
}
/**
*
*/
int askForLeaveTime = removeAskForLeave(realityStartTime, realityEndime, Util.null2String(getWorkOverTimeParam.get("workfor"))
, bdlx, askForLeaveList, askForLeaveItems, offsetAskForLeaveAnomaly);
/**
*
*/
int evectionTime = removeEvection(realityStartTime, realityEndime, Util.null2String(getWorkOverTimeParam.get("workfor"))
, bdlx, evectionList, evectionItems, offsetEvectionAnomaly);
/**
*
*/
int dinnerTime = Utils.dinnerTime(realityStartTime, realityEndime, scheduleResult, analysisDate);
log.info("未扣减过的加班时长: {}", jbsc);
log.info("beLateTime :[{}],leaveElaryTime :[{}],askForLeaveTime:[{}],evectionTime:[{}],dinnerTime:[{}]", beLateTime, leaveElaryTime, askForLeaveTime, evectionTime, dinnerTime);
BigDecimal jbscbig = new BigDecimal(jbsc);
if (CheckBoxEnum.CHECKED.getKey().equals(zdkcjcxxsc)){
//扣除就餐时长
jbsc = jbscbig.subtract(new BigDecimal(beLateTime)).subtract(new BigDecimal(leaveElaryTime)).subtract(new BigDecimal(askForLeaveTime)).subtract(new BigDecimal(evectionTime)).subtract(new BigDecimal(dinnerTime)).intValue();
}else {
jbsc = jbscbig.subtract(new BigDecimal(beLateTime)).subtract(new BigDecimal(leaveElaryTime)).subtract(new BigDecimal(askForLeaveTime)).subtract(new BigDecimal(evectionTime)).intValue();
}
if (CheckBoxEnum.CHECKED.getKey().equals(jbscbdccsqsc)) {
if (jbsc > Double.valueOf(Util.null2String(scheduleMap.get("edxss"))) * 60) {
jbsc = Double.valueOf(Util.null2String(scheduleMap.get("edxss"))) * 60;
}
}
log.info("扣减过的加班时长 :[{}]", jbsc);
resultMap.put("jbsc",jbsc);
resultMap.put("realityStartTime",realityStartTime);
resultMap.put("realityEndime",realityEndime);
return resultMap;
}
/**
*
* @param kssj
* @param jssj
* @param workFor
* @param askForLeaveList
* @param askForLeaveItems
* @return
*/
public int removeAskForLeave(String kssj,String jssj,String workFor,String bdlx,List<Map<String, Object>> askForLeaveList,
Map<String,Map<String,Object>> askForLeaveItems,List<Map<String, Object>> offsetAskForLeaveAnomaly ){
int employTime = 0;
for (int i=0;i<askForLeaveList.size();i++){
//请假时长
String qjsc = Util.null2String(askForLeaveList.get(i).get("qjsc"));
//请假项目
Map<String,Object> askForLeaveItem = askForLeaveItems.get(askForLeaveList.get(i).get("jqlx"));
//作用时段
String zysd = Util.null2String(askForLeaveItem.get("zysd"));
// if (!zysd.contains(workFor) && !zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())){
// 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<Map<String, Object>> 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<Map<String, Object>> evectionList,Map<String,
Map<String,Object>> evectionItems,List<Map<String, Object>> offsetEvectionAnomaly){
int askForLeaveTime=0;
for (int i=0;i<evectionList.size();i++){
//出差时长
String qjsc = Util.null2String(evectionList.get(i).get("ccsc"));
//出差项目
Map<String,Object> 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<Map<String, Object>> 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;
}
}

@ -0,0 +1,280 @@
package com.engine.attendance.attendanceanalysis.cmd.workovertime;
import com.engine.attendance.enums.AccountingUnitEnum;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.DateTypeEnum;
import com.engine.attendance.enums.DelayTypeEnum;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.common.util.DateUtil;
import com.engine.common.util.DbTools;
import com.engine.common.util.Utils;
import com.engine.core.interceptor.CommandContext;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.TimeUtil;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
*/
@Slf4j
public class SaveWorkOverTimeCmd extends AbstractCommonCommand<Map<String,Object>> {
public SaveWorkOverTimeCmd(Map<String, Object> params) {
this.params = params;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
//加班项目
List<Map<String, Object>> workTimeBeLateItems = (List<Map<String,Object>>)params.get("workTimeBeLateItems");
//加班时长
double jbsc = Double.valueOf(params.get("jbsc").toString());
//班次
Map<String, Object> scheduleMap = (Map<String, Object>)params.get("scheduleMap");
Map<String,Object> workOverTimeItems = Maps.newHashMap();
//超出限制时长的处理方式
String ccclfs = Util.null2String(workTimeBeLateItems.get(0).get("ccclfs"));
//工作日加班最大小时数
String rzdjbxss = Util.null2String(workTimeBeLateItems.get(0).get("rzdjbxss"));
//每周最大加班小时数
String yzdjbxss = Util.null2String(workTimeBeLateItems.get(0).get("yzdjbxss"));
//每月最大加班小时数
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"));
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//实际开始时间
String realityStartTime = Util.null2String(params.get("realityStartTime"));
//实际结束时间
String realityEndime = Util.null2String(params.get("realityEndime"));
long diffdays = Long.valueOf(Util.null2String(params.get("diffdays")));
String rqlx = Util.null2String(scheduleMap.get("rqlx"));
List<Map<String, Object>> workOverTimeResults = null;
String userId = Util.null2String(params.get("userId"));
if (!"".equals(jbqsfzs)){
if (jbsc < Integer.valueOf(jbqsfzs)){
//小于最小加班分钟数不算加班
workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key"));
workOverTimeItems.put("itemduration","0");
return workOverTimeItems;
}else if (jbsc >= Integer.valueOf(jbqsfzs) && !"".equals(ccqszhdhsfzs)){
jbsc = Double.valueOf(Utils.getItemdurationDown(Integer.valueOf(ccqszhdhsfzs), AccountingUnitEnum.MINUTES.getKey(),Double.valueOf(jbsc).intValue()-Integer.valueOf(jbqsfzs),AccountingUnitEnum.MINUTES)).intValue()+Integer.valueOf(jbqsfzs);
}
}
if (jbsc <= 0){
//加班时长为0
workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key"));
workOverTimeItems.put("itemduration","0");
return workOverTimeItems;
}
//自动扣除
if ("2".equals(ccclfs) && workOverTimeResults == null){
String startDate = analysisDate.split("-")[0]+"-"+ analysisDate.split("-")[1]+"-01";
String endDate = analysisDate.split("-")[0]+"-"+ analysisDate.split("-")[1]+"-"+diffdays;
workOverTimeResults =getWorkOverTimeResults(startDate,endDate,userId);
}
if ("2".equals(ccclfs) && !"".equals(rzdjbxss) && DateTypeEnum.WORK_DAY.getKey().equals(rqlx)){
//工作日加班最大数
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)){
//每周最大加班小时数
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;
}
}
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<String,Object> 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",itemduration);
insertParam.put("jbjgly","4");
insertParam.put("jblx",workTimeBeLateItems.get(0).get("id"));
insertParam.put("lyid",userId+"-"+ DateUtil.getCurrentDate());
insertParam.put("zt","1");
Utils.InsertFormTable("uf_jcl_kq_jbjg",insertParam,(Map<String,String>)params.get("formmodeIdMap"));
/**
*
*/
//加班时长自动转入假期余额
if (CheckBoxEnum.CHECKED.getKey().equals(jbzdzjqye)){
Map<String,Object> insertHoliDayParam = Maps.newHashMap();
insertHoliDayParam.put("ygid",userId);
insertHoliDayParam.put("jqid",workTimeBeLateItems.get(0).get("zrdjb"));
insertHoliDayParam.put("lyid",userId+"-"+DateUtil.getCurrentDate());
//转入的假期额度生效日期
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(insertHoliDayParam.get("sxrq").toString(),1,DateUtil.yyyyMMdd));
}else if ("1".equals(yekyzq)){
//两个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),2,DateUtil.yyyyMMdd));
}else if ("2".equals(yekyzq)){
//三个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),3,DateUtil.yyyyMMdd));
}else if ("3".equals(yekyzq)){
//六个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),6,DateUtil.yyyyMMdd));
}else if ("4".equals(yekyzq)){
//十二个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),12,DateUtil.yyyyMMdd));
}else if ("5".equals(yekyzq)){
//当前季度
insertHoliDayParam.put("jzrq",DateUtil.getCurrentQuarter(insertHoliDayParam.get("sxrq").toString()));
}else if ("6".equals(yekyzq)){
//当前半年
insertHoliDayParam.put("jzrq",DateUtil.getCurrentHalfYear(insertHoliDayParam.get("sxrq").toString()));
}else if ("7".equals(yekyzq)){
//当前一年
insertHoliDayParam.put("jzrq",insertHoliDayParam.get("sxrq").toString().split("-")[0]+"-12-31");
}
insertHoliDayParam.put("ktsc",itemduration);
String zdyqsc = Util.null2String(workTimeBeLateItems.get(0).get("zdyqsc"));
if (DelayTypeEnum.ONE_MONTH.getKey().equals(zdyqsc)){
//一个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),1,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.TWO_MONTH.getKey().equals(zdyqsc)){
//两个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),2,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.THREE_MONTH.getKey().equals(zdyqsc)){
//三个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),3,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.HALF_YEAR.getKey().equals(zdyqsc)){
//半年
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),6,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.ONE_YEAR.getKey().equals(zdyqsc)){
//一年
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),12,DateUtil.yyyyMMdd));
}
insertHoliDayParam.put("yxsc","0");
insertHoliDayParam.put("wxsc","0");
insertHoliDayParam.put("ztsc","0");
Utils.InsertFormTable("uf_jcl_kq_jqye",insertHoliDayParam,(Map<String,String>)params.get("formmodeIdMap"));
}
return workOverTimeItems;
}
public List<Map<String, Object>> getWorkOverTimeResults(String startDate,String endDate,String userId){
String sql = "select sjjbsc,sjksrq,sjjsrq from uf_jcl_kq_jbjg where jbry=? and sjksrq>? and sjjsrq<?";
List<Map<String, Object>> dataList = DbTools.getSqlToList(sql,userId,startDate,endDate);
return dataList;
}
/**
*
* @param dataList
* @return
*/
public int getWorkDayTime(List<Map<String, Object>> dataList,String date){
List<Map<String, Object>> list = dataList.stream().filter(e->date.equals(e.get("sjksrq"))).collect(Collectors.toList());
int totalHour = list.stream().mapToInt(e->Integer.valueOf(e.get("sjjbsc").toString())).sum();
return totalHour;
}
/**
*
* @param dataList
* @return
*/
public int getWeekTime(List<Map<String, Object>> dataList,String date){
int day = TimeUtil.getDayOfWeek(date);
if (day ==0){
day = 7;
}
String startDate = DateUtil.beforeDay(date,day-1);
String endDate = DateUtil.AfterDay(date,7-day);
List<Map<String, Object>> list = dataList.stream().filter(e->{
String sjksrq = Util.null2String(e.get("sjksrq"));
if (DateUtil.getTime(sjksrq).compareTo(DateUtil.getTime(startDate)) >=0 &&
DateUtil.getTime(sjksrq).compareTo(DateUtil.getTime(endDate)) >=0){
return true;
}else {
return false;
}
}).collect(Collectors.toList());
int totalHour = list.stream().mapToInt(e->Integer.valueOf(e.get("sjjbsc").toString())).sum();
return totalHour;
}
/**
*
* @param dataList
* @return
*/
public int getMonthTime(List<Map<String, Object>> dataList){
int totalHour = dataList.stream().mapToInt(e->Integer.valueOf(e.get("sjjbsc").toString())).sum();
return totalHour;
}
}

@ -338,7 +338,7 @@ public class ShiftServiceImpl extends Service implements ShiftService {
Map<String, Object> bcData = DbTools.getSqlToMap(bcSql);
String bcsdxx = Util.null2String(bcData.get("bcsdxx"));
String sql = "select a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid where a.id =" + shiftId;
String sql = "select a.xxbdkzdjb,a.sfxx,a.id bcxx,a.edsc,a.zgzsc,a.bcsdxx,a.sfdx,a.sfkt,b.bdlx,a.btgz,a.fgsjd,a.zddxfz,a.dxhs,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs,b.edxss,b.sfdx dtsfdx,b.zddxfz dtzddxfz,b.dxhs dtdxhs,b.gsrq from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid where a.id =" + shiftId;
List<Map<String,Object>> dataList = DbTools.getSqlToList(sql);
Map<String,List<Map<String,Object>>> resultMap = Maps.newHashMap();
List<Map<String,Object>> classs = Lists.newArrayList();

@ -1,6 +1,8 @@
package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.cmd.workovertime.GetOvertimeDurationCmd;
import com.engine.attendance.attendanceanalysis.cmd.item.WorkOvertimeItemCmd;
import com.engine.attendance.attendanceanalysis.cmd.workovertime.SaveWorkOverTimeCmd;
import com.engine.attendance.attendanceanalysis.dto.ClockPointDTO;
import com.engine.attendance.attendanceanalysis.service.WorkOverTimeService;
import com.engine.attendance.enums.*;
@ -14,8 +16,9 @@ import lombok.extern.slf4j.Slf4j;
import weaver.general.TimeUtil;
import weaver.general.Util;
import java.math.BigDecimal;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -30,43 +33,16 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
List<Map<String, Object>> scheduleResult = (List<Map<String,Object>>)params.get("scheduleResult");
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//请假记录
List<Map<String,Object>> askForLeaveList = (List<Map<String,Object>>)params.get("askForLeaveList");
//请假项目
Map<String,Map<String,Object>> askForLeaveItems = (Map<String,Map<String,Object>>)params.get("askForLeaveItems");
//外出记录
List<Map<String,Object>> evectionList = (List<Map<String,Object>>)params.get("evectionList");
//外出项目
Map<String,Map<String,Object>> evectionItems = (Map<String,Map<String,Object>>)params.get("evectionItems");
//打卡卡点
List<ClockPointDTO> clcokInTimeDataList = (List<ClockPointDTO>)params.get("clcokInTimeData");
//请假后消除的异常
List<Map<String,Object>> offsetAskForLeaveAnomaly = (List<Map<String,Object>>)params.get("offsetAskForLeaveAnomaly");
//出差外出后消除的异常
List<Map<String,Object>> offsetEvectionAnomaly = (List<Map<String,Object>>)params.get("offsetEvectionAnomaly");
//经过请假外出处理过的异常项目
List<Map<String,Object>> abnormalClockInList = (List<Map<String,Object>>)params.get("abnormalClockInList");
//不需要记录的异常项目
List<Map<String,Object>> notRecordAbnormalClockInList = (List<Map<String,Object>>)params.get("notRecordAbnormalClockInList");
abnormalClockInList.addAll(notRecordAbnormalClockInList);
//总抵消异常
List<Map<String,Object>> anomalyList = Lists.newArrayList();
anomalyList.addAll(offsetEvectionAnomaly);
anomalyList.addAll(offsetAskForLeaveAnomaly);
Map<String,Map<String,Object>> clcokInTimeMap = Maps.newHashMap();
List<Map<String, Object>> workOverTimeResults = null;
Calendar calendar = Calendar.getInstance();
calendar.set(Integer.valueOf(analysisDate.split("-")[0]), Integer.valueOf(analysisDate.split("-")[1]) - 1, 1);
long diffdays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
params.put("diffdays",diffdays);
for (ClockPointDTO clockPointDTO :clcokInTimeDataList){
//当天打卡数据
@ -75,526 +51,86 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
String pointTime = clockPointDTO.getClassTime();
clcokInTimeMap.put(pointTime,clcokInTime);
}
//人员
String userId = Util.null2String(params.get("userId"));
List<Map<String, Object>> resultLists = Lists.newArrayList();
for (Map<String, Object> scheduleMap :scheduleResult){
String bdlx = Util.null2String(scheduleMap.get("bdlx"));
String rqlx = Util.null2String(scheduleMap.get("rqlx"));
Map<String,Object> getWorkOverTimeParam = Maps.newHashMap();
Map<String,Object> workOverTimeItems = Maps.newHashMap();
//加班开始时间
String kssj = Utils.getkssjTime(scheduleMap,analysisDate);
//加班结束时间
String jssj = Utils.getjssjTime(scheduleMap,analysisDate);
//加班实际开始时间
String realityStartTime = "";
//加班实际结束时间
String realityEndime = "";
params.put("clcokInTimeMap",clcokInTimeMap);
getWorkOverTimeParam.put("attendanceItems",attendanceItems);
getWorkOverTimeParam.put("rqlx",scheduleMap.get("rqlx"));
List<Map<String, Object>> restOverTimeList = scheduleResult.stream().filter(e->e.get("bdlx").equals(ClassSegmentTypeEnum.OVERTIME_PLAN.getKey())
&& ClassSegmentTypeEnum.WORK_TIME.getKey().equals(e.get("beforeClassSegment"))).collect(Collectors.toList());
List<Map<String,Object>> workTimeBeLateItems = Lists.newArrayList();
//开始必须打卡,当为加班计划类型的加班时已考勤项目设置为准
String ksjbbxydk = scheduleMap.get("ksdk").toString();
//结束必须打卡,当为加班计划类型的加班时已考勤项目设置为准
String jsjbbxydk = scheduleMap.get("jsdk").toString();
if (ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor", WorkForTimeEnum.DELAY_TO_WORK_OVERTIME.getKey());
Map<String,Object> result = commandExecutor.execute(new WorkOvertimeItemCmd(getWorkOverTimeParam));
//加班项目
workTimeBeLateItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else if (ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor",WorkForTimeEnum.EARLY_TO_WORK_OVERTIME.getKey());
Map<String,Object> result = commandExecutor.execute(new WorkOvertimeItemCmd(getWorkOverTimeParam));
workTimeBeLateItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor",WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey());
workTimeBeLateItems = (List<Map<String,Object>>)scheduleMap.get("jblx");
}else if (ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor",WorkForTimeEnum.OVERTIME_IN_CLASS.getKey());
Map<String,Object> result = commandExecutor.execute(new WorkOvertimeItemCmd(getWorkOverTimeParam));
workTimeBeLateItems = (List<Map<String,Object>>)result.get("attendanceItems");
}else {
continue;
}
if (workTimeBeLateItems.size() == 0){
/**
*
*/
List<Map<String, Object>> resultLists = Lists.newArrayList();
for (Map<String, Object> scheduleMap :scheduleResult){
List<Map<String,Object>> workTimeBeLateItems = getWorkTimeBeLateItems(scheduleMap,attendanceItems);
if (workTimeBeLateItems.size() == 0 || ClassSegmentTypeEnum.WORK_TIME.getKey().equals(scheduleMap.get("beforeClassSegment"))){
continue;
}
double jbsc = Double.valueOf(Util.null2String(scheduleMap.get("edxss")));
//提前打卡开始的时长计入加班
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"));
//工作日加班最大小时数
String rzdjbxss = Util.null2String(workTimeBeLateItems.get(0).get("rzdjbxss"));
//每周最大加班小时数
String yzdjbxss = Util.null2String(workTimeBeLateItems.get(0).get("yzdjbxss"));
//每月最大加班小时数
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"));
//晚于开始时间忽略分钟数
String jbwdhlfzs = Util.null2String(workTimeBeLateItems.get(0).get("jbwdhlfzs")).equals("")?"0":Util.null2String(workTimeBeLateItems.get(0).get("jbwdhlfzs"));
//早于结束时间忽略分钟数
String jbzzhlfzs = Util.null2String(workTimeBeLateItems.get(0).get("jbzzhlfzs")).equals("")?"0":Util.null2String(workTimeBeLateItems.get(0).get("jbzzhlfzs"));
/**
*
*/
if (CheckBoxEnum.CHECKED.getKey().equals(ksjbbxydk)){
Map<String,Object> clcokInTimeData = clcokInTimeMap.get(kssj);
if (clcokInTimeData == null){
log.info("加班开始时间漏卡: {},clcokInTimeData:{}",kssj,clcokInTimeMap);
workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key"));
workOverTimeItems.put("itemduration","0");
resultLists.add(workOverTimeItems);
continue;
}
String hourTime = clcokInTimeData.get("signtime").toString();
if (hourTime.length() > 5){
hourTime = hourTime.substring(0,5);
}
String signTime = clcokInTimeData.get("signdate")+" "+hourTime;
realityStartTime = signTime;
}else {
realityStartTime = kssj;
}
if (CheckBoxEnum.CHECKED.getKey().equals(jsjbbxydk)){
Map<String,Object> clcokInTimeData = clcokInTimeMap.get(jssj);
if (clcokInTimeData == null){
log.info("加班结束时间漏卡: {},clcokInTimeData:{}",jssj,clcokInTimeData);
workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key"));
workOverTimeItems.put("itemduration","0");
resultLists.add(workOverTimeItems);
continue;
}
String hourTime = clcokInTimeData.get("signtime").toString();
if (hourTime.length() > 5){
hourTime = hourTime.substring(0,5);
}
String signTime = clcokInTimeData.get("signdate")+" "+hourTime;
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<Map<String,Object>> beLateAbnormal = abnormalClockInList.stream().filter(e->e.get("pointTime").equals(kssj)).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<Map<String,Object>> collect1 = anomalyList.stream().filter(e->e.get("pointTime").equals(kssj)).collect(Collectors.toList());
if (!"".equals(jbwdhlfzs) && beLateTime < Integer.valueOf(jbwdhlfzs)){
beLateTime=0;
}
//当存在迟到异常被抵消的情况
if (collect1.size() > 0){
beLateTime=0;
}
}
}
/**
* 退,退
*/
List<Map<String,Object>> leaveEarlyAbnormal = abnormalClockInList.stream().filter(e->e.get("pointTime").equals(jssj)).collect(Collectors.toList());
double leaveElaryTime=0;
if (leaveEarlyAbnormal.size() > 0){
String hsdw = Util.null2String(leaveEarlyAbnormal.get(0).get("hsdw"));
String itemduration = Util.null2String(leaveEarlyAbnormal.get(0).get("itemduration"));
AttendanceItemTypeEnum itemType = (AttendanceItemTypeEnum)leaveEarlyAbnormal.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);
List<Map<String,Object>> collect2 = anomalyList.stream().filter(e->e.get("pointTime").equals(jssj)).collect(Collectors.toList());
if (!"".equals(jbzzhlfzs) && leaveElaryTime < Integer.valueOf(jbzzhlfzs)){
leaveElaryTime=0;
}
//当存在早退异常被抵消的情况
if (collect2.size()>0){
leaveElaryTime=0;
}
}
}
/**
*
*/
int askForLeaveTime = removeAskForLeave(realityStartTime,realityEndime,Util.null2String(getWorkOverTimeParam.get("workfor"))
,bdlx,askForLeaveList,askForLeaveItems,offsetAskForLeaveAnomaly);
/**
*
*/
int evectionTime = removeEvection(realityStartTime,realityEndime,Util.null2String(getWorkOverTimeParam.get("workfor"))
,bdlx,evectionList,evectionItems,offsetEvectionAnomaly);
/**
*
*/
int dinnerTime = Utils.dinnerTime(realityStartTime,realityEndime,scheduleResult,analysisDate);
log.info("未扣减过的加班时长: {}",jbsc);
log.info("beLateTime :[{}],leaveElaryTime :[{}],askForLeaveTime:[{}],evectionTime:[{}],dinnerTime:[{}]",beLateTime,leaveElaryTime,askForLeaveTime,evectionTime,dinnerTime);
BigDecimal jbscbig = new BigDecimal(jbsc);
jbsc = jbscbig.subtract(new BigDecimal(beLateTime)).subtract(new BigDecimal(leaveElaryTime)).subtract(new BigDecimal(askForLeaveTime)).subtract(new BigDecimal(evectionTime)).subtract(new BigDecimal(dinnerTime)).intValue();
log.info("最终加班时长 :[{}]",jbsc);
if (!"".equals(jbqsfzs)){
if (jbsc < Integer.valueOf(jbqsfzs)){
//小于最小加班分钟数不算加班
workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key"));
workOverTimeItems.put("itemduration","0");
resultLists.add(workOverTimeItems);
continue;
}else if (jbsc >= Integer.valueOf(jbqsfzs) && !"".equals(ccqszhdhsfzs)){
params.put("workTimeBeLateItems",workTimeBeLateItems);
params.put("scheduleMap",scheduleMap);
//获得加班时长以及加班开始时间和结束时间
Map<String,Object> overTimeDuraionMap = commandExecutor.execute(new GetOvertimeDurationCmd(params));
double jbsc = Double.valueOf(overTimeDuraionMap.get("jbsc").toString());
String realityStartTime = overTimeDuraionMap.get("realityStartTime").toString();
String realityEndime = overTimeDuraionMap.get("realityEndime").toString();
params.putAll(overTimeDuraionMap);
//获得加班项目
Map<String,Object> itemMap = commandExecutor.execute(new SaveWorkOverTimeCmd(params));
resultLists.add(itemMap);
}
jbsc = Double.valueOf(Utils.getItemdurationDown(Integer.valueOf(ccqszhdhsfzs),AccountingUnitEnum.MINUTES.getKey(),Double.valueOf(jbsc).intValue()-Integer.valueOf(jbqsfzs),AccountingUnitEnum.MINUTES)).intValue()+Integer.valueOf(jbqsfzs);
}
}
if (jbsc < 0){
//加班时长为0
workOverTimeItems.put("item",workTimeBeLateItems.get(0).get("key"));
workOverTimeItems.put("itemduration","0");
resultLists.add(workOverTimeItems);
/**
*
*/
List<Map<String,Object>> restOverTimeDuraion = Lists.newArrayList();
double jbsc = 0;
for (Map<String, Object> restOverTimeMap :restOverTimeList){
List<Map<String,Object>> workTimeBeLateItems = getWorkTimeBeLateItems(restOverTimeMap,attendanceItems);
if (workTimeBeLateItems.size() == 0){
continue;
}
params.put("workTimeBeLateItems",workTimeBeLateItems);
params.put("scheduleMap",restOverTimeMap);
//获得加班时长以及加班开始时间和结束时间
Map<String,Object> overTimeDuraionMap = commandExecutor.execute(new GetOvertimeDurationCmd(params));
jbsc += Double.valueOf(overTimeDuraionMap.get("jbsc").toString());
//自动扣除
if ("2".equals(ccclfs) && workOverTimeResults == null){
String startDate = analysisDate.split("-")[0]+"-"+ analysisDate.split("-")[1]+"-01";
String endDate = analysisDate.split("-")[0]+"-"+ analysisDate.split("-")[1]+"-"+diffdays;
workOverTimeResults =getWorkOverTimeResults(startDate,endDate,userId);
}
if ("2".equals(ccclfs) && !"".equals(rzdjbxss) && DateTypeEnum.WORK_DAY.getKey().equals(rqlx)){
//工作日加班最大数
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)){
//每周最大加班小时数
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 > Double.valueOf(Util.null2String(scheduleMap.get("edxss")))*60){
jbsc = Double.valueOf(Util.null2String(scheduleMap.get("edxss")))*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<String,Object> 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",itemduration);
insertParam.put("jbjgly","4");
insertParam.put("jblx",workTimeBeLateItems.get(0).get("id"));
insertParam.put("lyid",userId+"-"+DateUtil.getCurrentDate());
insertParam.put("zt","1");
Utils.InsertFormTable("uf_jcl_kq_jbjg",insertParam,(Map<String,String>)params.get("formmodeIdMap"));
/**
*
*/
//加班时长自动转入假期余额
if (CheckBoxEnum.CHECKED.getKey().equals(jbzdzjqye)){
Map<String,Object> insertHoliDayParam = Maps.newHashMap();
insertHoliDayParam.put("ygid",userId);
insertHoliDayParam.put("jqid",workTimeBeLateItems.get(0).get("zrdjb"));
insertHoliDayParam.put("lyid",userId+"-"+DateUtil.getCurrentDate());
//转入的假期额度生效日期
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(insertHoliDayParam.get("sxrq").toString(),1,DateUtil.yyyyMMdd));
}else if ("1".equals(yekyzq)){
//两个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),2,DateUtil.yyyyMMdd));
}else if ("2".equals(yekyzq)){
//三个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),3,DateUtil.yyyyMMdd));
}else if ("3".equals(yekyzq)){
//六个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),6,DateUtil.yyyyMMdd));
}else if ("4".equals(yekyzq)){
//十二个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),12,DateUtil.yyyyMMdd));
}else if ("5".equals(yekyzq)){
//当前季度
insertHoliDayParam.put("jzrq",DateUtil.getCurrentQuarter(insertHoliDayParam.get("sxrq").toString()));
}else if ("6".equals(yekyzq)){
//当前半年
insertHoliDayParam.put("jzrq",DateUtil.getCurrentHalfYear(insertHoliDayParam.get("sxrq").toString()));
}else if ("7".equals(yekyzq)){
//当前一年
insertHoliDayParam.put("jzrq",insertHoliDayParam.get("sxrq").toString().split("-")[0]+"-12-31");
}
insertHoliDayParam.put("ktsc",itemduration);
String zdyqsc = Util.null2String(workTimeBeLateItems.get(0).get("zdyqsc"));
if (DelayTypeEnum.ONE_MONTH.getKey().equals(zdyqsc)){
//一个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),1,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.TWO_MONTH.getKey().equals(zdyqsc)){
//两个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),2,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.THREE_MONTH.getKey().equals(zdyqsc)){
//三个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),3,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.HALF_YEAR.getKey().equals(zdyqsc)){
//半年
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),6,DateUtil.yyyyMMdd));
}else if (DelayTypeEnum.ONE_YEAR.getKey().equals(zdyqsc)){
//一年
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),12,DateUtil.yyyyMMdd));
}
Utils.InsertFormTable("uf_jcl_kq_jqye",insertHoliDayParam,(Map<String,String>)params.get("formmodeIdMap"));
}
resultLists.add(workOverTimeItems);
restOverTimeDuraion.add(overTimeDuraionMap);
}
return resultLists;
}
public List<Map<String, Object>> getWorkOverTimeResults(String startDate,String endDate,String userId){
String sql = "select sjjbsc,sjksrq,sjjsrq from uf_jcl_kq_jbjg where jbry=? and sjksrq>? and sjjsrq<?";
List<Map<String, Object>> dataList = DbTools.getSqlToList(sql,userId,startDate,endDate);
return dataList;
}
/**
*
* @param dataList
* @return
*/
public int getWorkDayTime(List<Map<String, Object>> dataList,String date){
List<Map<String, Object>> list = dataList.stream().filter(e->date.equals(e.get("sjksrq"))).collect(Collectors.toList());
int totalHour = list.stream().mapToInt(e->Integer.valueOf(e.get("sjjbsc").toString())).sum();
return totalHour;
}
/**
*
* @param dataList
* @return
*/
public int getWeekTime(List<Map<String, Object>> dataList,String date){
int day = TimeUtil.getDayOfWeek(date);
if (day ==0){
day = 7;
if (restOverTimeDuraion.size() > 0){
params.put("jbsc",jbsc);
String realityStartTime = restOverTimeDuraion.stream().min(Comparator.comparing(e->DateUtil.getTime(e.get("realityStartTime").toString()).toInstant(ZoneOffset.of("+8")).toEpochMilli())).get().get("realityStartTime").toString();
String realityEndime = restOverTimeDuraion.stream().max(Comparator.comparing(e->DateUtil.getTime(e.get("realityEndime").toString()).toInstant(ZoneOffset.of("+8")).toEpochMilli())).get().get("realityEndime").toString();
params.put("realityStartTime",realityStartTime);
params.put("realityEndime",realityEndime);
Map<String,Object> itemMap = commandExecutor.execute(new SaveWorkOverTimeCmd(params));
resultLists.add(itemMap);
}
String startDate = DateUtil.beforeDay(date,day-1);
String endDate = DateUtil.AfterDay(date,7-day);
List<Map<String, Object>> list = dataList.stream().filter(e->{
String sjksrq = Util.null2String(e.get("sjksrq"));
if (DateUtil.getTime(sjksrq).compareTo(DateUtil.getTime(startDate)) >=0 &&
DateUtil.getTime(sjksrq).compareTo(DateUtil.getTime(endDate)) >=0){
return true;
}else {
return false;
}
}).collect(Collectors.toList());
int totalHour = list.stream().mapToInt(e->Integer.valueOf(e.get("sjjbsc").toString())).sum();
return totalHour;
}
/**
*
* @param dataList
* @return
*/
public int getMonthTime(List<Map<String, Object>> dataList){
int totalHour = dataList.stream().mapToInt(e->Integer.valueOf(e.get("sjjbsc").toString())).sum();
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<Map<String, Object>> askForLeaveList,
Map<String,Map<String,Object>> askForLeaveItems,List<Map<String, Object>> offsetAskForLeaveAnomaly ){
int employTime = 0;
for (int i=0;i<askForLeaveList.size();i++){
//请假时长
String qjsc = Util.null2String(askForLeaveList.get(i).get("qjsc"));
//请假项目
Map<String,Object> askForLeaveItem = askForLeaveItems.get(askForLeaveList.get(i).get("jqlx"));
//作用时段
String zysd = Util.null2String(askForLeaveItem.get("zysd"));
// if (!zysd.contains(workFor) && !zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())){
// 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<Map<String, Object>> 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;
return resultLists;
}
/**
*
* @param kssj
* @param jssj
* @param evectionList
* @return
*/
public int removeEvection(String kssj,String jssj,String workFor,String bdlx,List<Map<String, Object>> evectionList,Map<String,
Map<String,Object>> evectionItems,List<Map<String, Object>> offsetEvectionAnomaly){
int askForLeaveTime=0;
for (int i=0;i<evectionList.size();i++){
//出差时长
String qjsc = Util.null2String(evectionList.get(i).get("ccsc"));
//出差项目
Map<String,Object> 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;
// }
public List<Map<String,Object>> getWorkTimeBeLateItems(Map<String, Object> scheduleMap,List<Map<String,Object>> attendanceItems){
String bdlx = Util.null2String(scheduleMap.get("bdlx"));
Map<String,Object> getWorkOverTimeParam = Maps.newHashMap();
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<Map<String, Object>> 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);
}
}
getWorkOverTimeParam.put("attendanceItems",attendanceItems);
getWorkOverTimeParam.put("rqlx",scheduleMap.get("rqlx"));
getWorkOverTimeParam.put("workfor",Utils.getWorkFor(bdlx));
List<Map<String,Object>> workTimeBeLateItems = Lists.newArrayList();
if (Utils.ifOverTimeClassSegment(bdlx)){
if (ClassSegmentTypeEnum.OVERTIME_PLAN.getKey().equals(bdlx)){
getWorkOverTimeParam.put("workfor",WorkForTimeEnum.PLAN_WORK_OVERTIME.getKey());
workTimeBeLateItems = (List<Map<String,Object>>)scheduleMap.get("jblx");
}else {
//按照开始时间,结束时间请假
askForLeaveTime +=Utils.getStartAndEndTime(kssj,jssj,evectionList.get(i));
Map<String,Object> result = commandExecutor.execute(new WorkOvertimeItemCmd(getWorkOverTimeParam));
//加班项目
workTimeBeLateItems = (List<Map<String,Object>>)result.get("attendanceItems");
}
}
return askForLeaveTime;
return workTimeBeLateItems;
}
}

@ -41,11 +41,11 @@ public class AttendanceanalysisAction {
@Produces({"text/plain"})
public String getSchedulingData(@Context HttpServletRequest request, @Context HttpServletResponse response) {
try {
Map<String,Object> paramMap = ParamUtil.request2Map(request);
// Map<String,Object> paramMap = Maps.newHashMap();
// paramMap.put("startDate","2024-04-22");
// paramMap.put("endDate","2024-04-24");
// paramMap.put("userIds","31");
// Map<String,Object> paramMap = ParamUtil.request2Map(request);
Map<String,Object> paramMap = Maps.newHashMap();
paramMap.put("startDate","2024-05-11");
paramMap.put("endDate","2024-05-11");
paramMap.put("userIds","31");
String startDate = Util.null2String(paramMap.get("startDate"));

@ -15,6 +15,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 org.apache.struts.tiles.xmlDefinition.I18nFactorySet;
import weaver.general.Util;
import java.time.ZoneOffset;
@ -180,6 +181,14 @@ public class AttendanceAnalysisWrapper extends Service {
return null;
}
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"))){
updateAttendanceResultWrapper.recordRest(recordParam);
return null;
}
List<Map<String,Object>> askForLeaveAndEvctionSchedule = Lists.newArrayList();
//请假记录

@ -512,4 +512,16 @@ public class UpdateAttendanceResultWrapper extends Service {
}
/**
*
*/
public void recordRest(Map<String,Object> recordParam){
recordParam.put("recordData",Lists.newArrayList());
recordParam.put("recordDataTime",Maps.newHashMap());
recordParam.put("attendanceDuration",0);
recordParam.put("cqzt",CheckBoxEnum.UNCHECKED.getKey());
recordParam.put("sfxx",CheckBoxEnum.CHECKED.getKey());
utilService.recordItem(recordParam);
}
}

@ -535,6 +535,8 @@ public class Utils<T> {
workFor = WorkForTimeEnum.LEAVE_TIME.getKey();
}else if (ClassSegmentTypeEnum.EVECTION.getKey().equals(bdlx)){
workFor = WorkForTimeEnum.EVECTION.getKey();
}else if (ClassSegmentTypeEnum.OVERTIME_IN_CLASS.getKey().equals(bdlx)){
workFor = WorkForTimeEnum.OVERTIME_IN_CLASS.getKey();
}
return workFor;
}

Binary file not shown.

@ -2,6 +2,7 @@
import ComprehensiveWorkingHourServiceImpl.beforlog;
import com.engine.attendance.workflow.service.AllowanceService;
import com.engine.attendance.workflow.service.impl.AllowanceServiceImpl;
import com.engine.common.util.DateUtil;
import com.engine.common.util.ServiceUtil;
import com.google.common.collect.Maps;
import org.junit.Test;
@ -16,13 +17,7 @@ import java.util.Map;
public class Tset_sy extends beforlog {
@Test
public void test() {
System.out.println("hello");
AllowanceService getAllowanceService = ServiceUtil.getService(AllowanceServiceImpl.class);
Map<String,Object> param = Maps.newHashMap();
param.put("startDate","2024-04-01");
param.put("endDate","2024-04-09");
getAllowanceService.addAllowanceRecords(param);
System.out.println( DateUtil.getBetWeenMinutes("2024-05-20 11:00:00","2024-05-20 11:00:01"));
}
}

Loading…
Cancel
Save