From 687a8787b51c879d14efc8310127ed12f0575b42 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 25 Nov 2024 17:02:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4-=E8=AF=B7=E5=81=87=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E7=94=9F=E6=88=90=E5=8A=9F=E8=83=BD=E6=94=B9=E9=80=A0?= =?UTF-8?q?=EF=BC=8C=E8=AF=B7=E5=81=87=E6=97=B6=E9=95=BF=E5=8F=82=E8=80=83?= =?UTF-8?q?=E7=8F=AD=E6=AC=A1=E9=A2=9D=E5=AE=9A=E6=97=B6=E9=95=BF=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E8=BF=9B=E8=A1=8C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BatchAskForLeaveWorkFlowSubmitAction.java | 192 +++- .../service/impl/AskForLeaveServiceImpl.java | 941 ++++++++++++------ .../hrmattendance/HrmjucailAskForLeave_e9.jsp | 3 + .../HrmjucailBatchAskForLeave_e9.jsp | 3 + 4 files changed, 803 insertions(+), 336 deletions(-) diff --git a/src/com/engine/jucailinkq/attendance/workflow/action/askforleave/BatchAskForLeaveWorkFlowSubmitAction.java b/src/com/engine/jucailinkq/attendance/workflow/action/askforleave/BatchAskForLeaveWorkFlowSubmitAction.java index ae46986..73c60bf 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/action/askforleave/BatchAskForLeaveWorkFlowSubmitAction.java +++ b/src/com/engine/jucailinkq/attendance/workflow/action/askforleave/BatchAskForLeaveWorkFlowSubmitAction.java @@ -1,7 +1,9 @@ package com.engine.jucailinkq.attendance.workflow.action.askforleave; import com.engine.jucailinkq.attendance.enums.AccountingUnitEnum; +import com.engine.jucailinkq.attendance.enums.AttendanceItemTypeEnum; import com.engine.jucailinkq.common.util.CommonUtil; +import com.engine.jucailinkq.common.util.DateUtil; import com.engine.jucailinkq.common.util.DbTools; import com.engine.jucailinkq.common.util.Utils; import com.google.common.collect.Lists; @@ -14,6 +16,7 @@ import weaver.soa.workflow.request.RequestInfo; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; +import java.time.ZoneOffset; import java.util.*; import java.util.stream.Collectors; @@ -41,28 +44,51 @@ public class BatchAskForLeaveWorkFlowSubmitAction implements Action { log.info("detail2TableName : [{}]", detail2TableName); //第一笔开始时间 String firstStartDate = detailTableData.get(0).get("ksrq"); + List startDateList = detailTableData.stream().map(map -> map.get("ksrq")).collect(Collectors.toList()); + String minStartDate = startDateList.stream().min(Comparator.comparing(e-> DateUtil.getTime(e).toInstant(ZoneOffset.of("+8")).toEpochMilli())).get(); + //请假人员列表 + List leaveEmpIdList = detailTableData.stream().map(map -> map.get("qjr")).distinct().collect(Collectors.toList()); - List> detailTable2 = Lists.newArrayList(); + //请假人姓名映射 + String sql; + Map empIdToName = new HashMap<>(); + if (leaveEmpIdList.size() > 0) { + sql = "select id, lastname from hrmresource where id in (" + String.join(",",leaveEmpIdList) + ")"; + List> data = DbTools.getSqlToList(sql); + empIdToName = data.stream().collect(Collectors.toMap(e->Util.null2String(e.get("id")),e->Util.null2String(e.get("lastname")))); + } + //获取假期类型的考勤项目 + sql = "select id, mc, hsdw, zdyzsl, yxyz from uf_jcl_kq_kqxm where xmlx=?"; + List> holidayItemList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.HOLIDAY.getKey()); + Map> kqxmInfo = holidayItemList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("id")), e->e)); + List> detailTable2 = Lists.newArrayList(); Map holidayBalanceMap = new HashMap<>(); //需要校验假期额度的假期类型 List checkAmountJqIdList = CommonUtil.getJqInfoWithAmount(); //根据明细表1,根据请假类型分组,对于需要校验余额的遍历生成明细表2 Map>> detail1TabDataGroupByJqlx = detailTableData.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("qjlx")))); + //收集假期类型和使用人员id的映射 + Map> jqlxToEmpIds = new HashMap<>(); + //收集假期类型和使用人员id的映射 + Map>> jqlxToJqye = new HashMap<>(); + //收集假期余额id和本次流程中使用的小时时长映射 + Map jqyeIdToUseHours = new HashMap<>(); for(Map.Entry>> entry : detail1TabDataGroupByJqlx.entrySet()) { if (checkAmountJqIdList.contains(entry.getKey())) { -// String sql = "select id,jqid,sxrq,ktsc,yxsc,wxsc,yqsxrq,ztsc from uf_jcl_kq_jqye where jqid=? and sxrq<=? and yqsxrq>=? order by sxrq"; -// List> holidayBalanceList = DbTools.getSqlToList(sql, entry.getKey(), firstStartDate, firstStartDate); - String sql = "select id,jqid,sxrq,ktsc,yxsc,wxsc,yqsxrq,ztsc from uf_jcl_kq_jqye where jqid=?"; - List> holidayBalanceList = DbTools.getSqlToList(sql, entry.getKey()); + + sql = "select id,jqid,sxrq,ktsc,yxsc,wxsc,yqsxrq,ztsc,ygid from uf_jcl_kq_jqye where jqid=? and sxrq <= ? order by yqsxrq, modedatacreatedate, modedatacreatetime"; + List> holidayBalanceList = DbTools.getSqlToList(sql, entry.getKey(), minStartDate); if (holidayBalanceList.size() > 0) { holidayBalanceMap.putAll(holidayBalanceList.stream().collect(Collectors.toMap(e -> e.get("id").toString(), e -> e))); + jqlxToJqye.put(entry.getKey(), holidayBalanceList); } sql = "select id,mc,hsdw,hsl,jcbyxsyqjb,yxsydjb,qzsyyxjb from uf_jcl_kq_kqxm where id=?"; Map holidayItem = DbTools.getSqlToMap(sql, entry.getKey()); //假期核算单位 String hsdw = Util.null2String(holidayItem.get("hsdw")); //遍历生成明细表2 + List empIds = new ArrayList<>(); for (Map detailData : entry.getValue()) { String jqyeInfoStr = Util.null2String(detailData.get("jqye")); List jqyeInfoList = Arrays.asList(jqyeInfoStr.split(",")); @@ -72,16 +98,46 @@ public class BatchAskForLeaveWorkFlowSubmitAction implements Action { detail2Map.put("jqye", jqyeInfo.split("_")[0]); detail2Map.put("mainid", mainTableData.get("id")); detail2Map.put("glrq", detailData.get("ksrq")); - if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { - detail2Map.put("sysc", Utils.divide(Double.parseDouble(jqyeInfo.split("_")[1]), 8)); - } else { - detail2Map.put("sysc", jqyeInfo.split("_")[1]); - } +// if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { +// detail2Map.put("sysc", Utils.divide(Double.parseDouble(jqyeInfo.split("_")[1]), 8)); +// } else { +// detail2Map.put("sysc", jqyeInfo.split("_")[1]); +// } + //20241118需求变更,时长不进行核算单位倍率转换,按照原本核算单位进行收集和处理 + detail2Map.put("sysc", jqyeInfo.split("_")[1]); detailTable2.add(detail2Map); + //累计假期余额id对应的使用小时数/天数,具体单位根据假别的核算单位 + jqyeIdToUseHours.put(jqyeInfo.split("_")[0], + jqyeIdToUseHours.getOrDefault(jqyeInfo.split("_")[0], (double) 0) + Double.parseDouble(jqyeInfo.split("_")[1])); } + //收集使用该假期类型的人员id + empIds.add(Util.null2String(detailData.get("qjr"))); } + jqlxToEmpIds.put(entry.getKey(), empIds); + } + } + //校验假期余额使用是否满足要求,并且区分核算单位“天”和“小时” + StringBuilder jqyeCheckFailMessage = new StringBuilder(); + Map jqyeIdToJqMc = new HashMap<>(); + Map jqyeIdToEmpName = new HashMap<>(); + //获取本次使用的假期余额对应还可使用的假期余额小时数 + List errorMessage = new ArrayList<>(); + Map jqyeIdToCanUseHours = getJqyeCanUseHours(jqlxToEmpIds, jqlxToJqye, errorMessage, empIdToName, kqxmInfo, jqyeIdToJqMc, jqyeIdToEmpName); + for (Map.Entry entry : jqyeIdToUseHours.entrySet()) { + if (jqyeIdToCanUseHours.getOrDefault(entry.getKey(), (double) 0) < entry.getValue()) { + //记录假期余额不足信息 + jqyeCheckFailMessage.append(jqyeIdToEmpName.get(entry.getKey())).append("-").append(jqyeIdToJqMc.get(entry.getKey())).append("的假期余额不足!"); } } + if (errorMessage.size() > 0) { + jqyeCheckFailMessage.append(errorMessage); + } + if (!"".equals(jqyeCheckFailMessage.toString())) { + log.error(jqyeCheckFailMessage.toString()); + requestInfo.getRequestManager().setMessageid("11111" + requestid + "22222"); + requestInfo.getRequestManager().setMessagecontent(jqyeCheckFailMessage.toString()); + return Action.FAILURE_AND_CONTINUE; + } //明细表2有数据时,更新明细表2入库,并且更新假期余额表 //更新流程明细表2 String delteSql = "delete from " + detail2TableName + " where mainid=?"; @@ -112,8 +168,6 @@ public class BatchAskForLeaveWorkFlowSubmitAction implements Action { double havedztsc = Util.null2String(map.get("ztsc")).equals("") ? 0 : Double.valueOf(map.get("ztsc").toString()); double havedwxsc = Util.null2String(map.get("wxsc")).equals("") ? 0 : Double.valueOf(map.get("wxsc").toString()); -// double updatedztsc = Utils.add(havedztsc, ztsc); -// double updatedwxsc = Utils.subtract(havedwxsc, ztsc); double updatedztsc = new BigDecimal(String.valueOf(havedztsc)).add(new BigDecimal(String.valueOf(ztsc)),new MathContext(5, RoundingMode.HALF_UP)).doubleValue(); double updatedwxsc = new BigDecimal(String.valueOf(havedwxsc)).subtract(new BigDecimal(String.valueOf(ztsc)),new MathContext(5, RoundingMode.HALF_UP)).doubleValue(); @@ -127,8 +181,6 @@ public class BatchAskForLeaveWorkFlowSubmitAction implements Action { return Action.FAILURE_AND_CONTINUE; } } - //////////////////////////// - }catch (Exception e){ log.error("BatchAskForLeaveWorkFlowSubmitAction error : [{}]",e); @@ -137,4 +189,116 @@ public class BatchAskForLeaveWorkFlowSubmitAction implements Action { return Action.SUCCESS; } + + private Map getJqyeCanUseHours(Map> jqlxToEmpIds, Map>> jqlxToJqye, + List errorMessage, Map empIdToName, Map> kqxmInfo, + Map jqyeIdToJqMc, Map jqyeIdToEmpName) { + Map result = new HashMap<>(); + if (jqlxToEmpIds.size() == 0) { + return result; + } + //获取modeId,假期额度规则的modeId + Map formmodeIdMap = Utils.getFormmodeIdMap(); + String modeId = formmodeIdMap.get("uf_jcl_kq_jqed"); + List> jqyeInfoList; + Map holidayItem = new HashMap<>(); + for (Map.Entry> entry : jqlxToEmpIds.entrySet()) { + holidayItem = kqxmInfo.get(entry.getKey()); + jqyeInfoList = jqlxToJqye.get(entry.getKey()); + if (jqyeInfoList == null || jqyeInfoList.size() == 0) { + continue; + } + jqyeInfoList = jqyeInfoList.stream().filter(f -> entry.getValue().contains(f.get("ygid").toString())).collect(Collectors.toList()); + if (jqyeInfoList.size() == 0) { + continue; + } + //获取假期额度规则中额度可休次数、单次最小休时长、额度单位 + Map jqedInfo = new HashMap<>(); + String sql = "select id, eddw, dczskxsc, edbxdcxw from uf_jcl_kq_jqed where jb = ? and gzzt = 0"; + List> jqedData = DbTools.getSqlToList(sql, entry.getKey()); + //按人员分组 + Map>> empIdToJqyeInfo = jqyeInfoList.stream().collect(Collectors.groupingBy(map -> (String) map.get("ygid"))); + for (Map.Entry>> entry2 : empIdToJqyeInfo.entrySet()) { + List> waitDealHolidayBalanceList = entry2.getValue(); + //获取延期失效日期最晚的一条 + Map maxYqsxrqMap = waitDealHolidayBalanceList.stream().reduce((m1, m2) -> m2).orElse(null); + + Integer empPriority = null; + boolean samePriority = false; + for (Map jqedItem : jqedData) { + String dataId = jqedItem.get("id").toString(); + //获取假期额度规则适用的人员id列表 + Map empInfo = CommonUtil.getEmpIdWithPriority(dataId, modeId); + if (empInfo.get(entry2.getKey()) != null) { + if (empPriority == null) { + jqedInfo = jqedItem; + empPriority = empInfo.get(entry2.getKey()); + } else if (empPriority > empInfo.get(entry2.getKey())) { + jqedInfo = jqedItem; + empPriority = empInfo.get(entry2.getKey()); + } else if (empPriority.equals(empInfo.get(entry2.getKey()))) { + samePriority = true; + } + + } + } + if (empPriority != null && samePriority) { + String message = empIdToName.get(entry2.getKey()); + message = message + "可使用的假别—‘" + holidayItem.get("mc") + "’同一优先级情况下存在超过一种适用的假期额度规则,无法确定唯一规则!"; + errorMessage.add(message); + continue; + } + //假期的核算单位,0-天、1-小时 + String hsdw = Util.null2String(holidayItem.get("hsdw")); + //假期额度的额度单位,0-天、1-小时 + String eddw = Util.null2String(jqedInfo.get("eddw")); + //额度可修次数 + String allowLeaveNumStr = Util.null2String(jqedInfo.get("edbxdcxw")); + if (!"".equals(allowLeaveNumStr) && waitDealHolidayBalanceList.size() > 0) { + //查询请假记录中,人员id+假期类别id情况下的结果,遍历每条主表数据下的明细数据中使用了哪些假期余额id + sql = "select a.id,dt2.jqye from uf_jcl_kq_qjjl a left join uf_jcl_kq_qjjl_dt1 dt1 on dt1.mainid = a.id left join uf_jcl_kq_qjjl_dt2 dt2 on dt2.glmxid = dt1.glmxid " + + "where a.jqlx = " + entry.getKey() + " and qjry = " + entry2.getKey() + " and a.cxqj = 0 and dt1.cxqj = 0 and a.jlzt in (0, 1) and dt1.glmxid is not null"; + List> leaveList = DbTools.getSqlToList(sql); + Map jqyeUseNumInfo = new HashMap<>(); + List leaveUseList = new ArrayList<>(); + Integer useNum; + for (Map leaveItem : leaveList) { + String jqyeId = Util.null2String(leaveItem.get("jqye")); + if (!"".equals(jqyeId)) { + String leaveInfo = leaveItem.get("id").toString() + "_" + jqyeId; + if (leaveUseList.size() == 0) { + leaveUseList.add(leaveInfo); + jqyeUseNumInfo.put(jqyeId, 1); + } else if (!leaveUseList.contains(leaveInfo)) { + leaveUseList.add(leaveInfo); + useNum = jqyeUseNumInfo.get(jqyeId); + jqyeUseNumInfo.put(jqyeId, useNum == null ? 1 : ++useNum); + } + } + } + //筛选次数未使用完的假期余额 + waitDealHolidayBalanceList = waitDealHolidayBalanceList.stream().filter(f -> { + int beforeUseNum = jqyeUseNumInfo.get(f.get("id").toString()) == null ? 0 : jqyeUseNumInfo.get(f.get("id").toString()); + return Integer.parseInt(allowLeaveNumStr) > beforeUseNum; + }).collect(Collectors.toList()); + } + //判断是否可预支 + String allowAdvance = Util.null2String(holidayItem.get("yxyz")); + String advanceSc = Util.null2String(holidayItem.get("zdyzsl")); + //遍历可使用的假期余额 + for (Map holidayBalance : waitDealHolidayBalanceList) { + String jqyeId = Util.null2String(holidayBalance.get("id")); + double wxsc = Utils.convertDouble(holidayBalance.get("wxsc")); + //如果该条假期余额可以预支,则在原有未休时长基础上增加预支时长 + if ("1".equals(allowAdvance) && maxYqsxrqMap != null && Util.null2String(maxYqsxrqMap.get("id")).equals(jqyeId)) { + wxsc = wxsc + Utils.convertDouble(advanceSc); + } + result.put(jqyeId, wxsc); + jqyeIdToJqMc.put(jqyeId, holidayItem.get("mc").toString()); + jqyeIdToEmpName.put(jqyeId, empIdToName.get(entry2.getKey())); + } + } + } + return result; + } } diff --git a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java index f55280a..464f3ec 100644 --- a/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java +++ b/src/com/engine/jucailinkq/attendance/workflow/service/impl/AskForLeaveServiceImpl.java @@ -151,11 +151,8 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic //开始日期、结束日期、请假方式、开始时间、结束时间、假期类型、请假时长 String startDate = Util.null2String(mainTableData.get("ksrq")); String endDate = Util.null2String(mainTableData.get("jsrq")); - String startTime = Util.null2String(mainTableData.get("kssj")); - String endTime = Util.null2String(mainTableData.get("jssj")); String leaveMode = Util.null2String(mainTableData.get("cxjqj")); String leaveType = Util.null2String(mainTableData.get("jqlx")); - String leaveDuration = Util.null2String(mainTableData.get("qjsc")); String dailyRepeat = Util.null2String(mainTableData.get("mtcfsdjq")); //假期余额使用规则,0-假别优先,1-失效日期优先,默认0 String jqyeUsePriority = Util.null2String(mainTableData.get("yesygz")); @@ -194,7 +191,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String sql = "select id,mc,hsdw,hsl,jcbyxsyqjb,yxsydjb,qzsyyxjb,zdycbcndfgzsd,zdycrqqjndxxb,yxyz,zdyzsl,zysd from uf_jcl_kq_kqxm where id=?"; Map holidayItem = DbTools.getSqlToMap(sql,leaveType); //勾选假期类型名称 - String checkItemName = Util.null2String(holidayItem.get("mc")); +// String checkItemName = Util.null2String(holidayItem.get("mc")); //核算单位 String hsdw = Util.null2String(holidayItem.get("hsdw")); //核算量 @@ -225,9 +222,6 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic countBdlxList.add(ClassSegmentTypeEnum.DINING_PERIOD.getKey()); } } - //判断考勤项目是否需要强制使用“优先使用项目” -// boolean useFirstItemSign = CheckBoxEnum.CHECKED.getKey().equals(holidayItem.get("qzsyyxjb")) && CheckBoxEnum.CHECKED.getKey().equals(holidayItem.get("jcbyxsyqjb")); -// Map holidayPriorityItem = useFirstItemSign ? DbTools.getSqlToMap(sql,holidayItem.get("yxsydjb")) : null; //20241021逻辑变更,根据考勤项目的“优先使用项目”信息,逐级找到所有“优先使用项目”,找到的先后顺序,来决定使用优先级,最后的优先级最大 List> holidayPriorityItemList = new ArrayList<>(); holidayPriorityItemList.add(holidayItem); @@ -235,22 +229,30 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic sql = "select id,mc,hsdw,hsl,jcbyxsyqjb,yxsydjb,qzsyyxjb,zdycbcndfgzsd,zdycrqqjndxxb,yxyz,zdyzsl,zysd from uf_jcl_kq_kqxm where xmlx=?"; List> holidayItemList = DbTools.getSqlToList(sql, AttendanceItemTypeEnum.HOLIDAY.getKey()); Map> holidayItemInfos = holidayItemList.stream().collect(Collectors.toMap(e->e.get("id").toString(), e->e)); + Map jbIdToHsdw = holidayItemList.stream().collect(Collectors.toMap(e->e.get("id").toString(), e->e.get("hsdw").toString())); //逐级获取优先使用项目 getHolidayPriorityItem(holidayPriorityItemList, holidayItemInfos, holidayItem); + //20241118需求变更,“指定时间区间”、“指定时长”方式请假时,不允许使用核算单位为“天”的假别 + if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey()) || leaveMode.equals(AskAndEvctionWayEnum.HOUR.getKey())) { + holidayPriorityItemList = holidayPriorityItemList.stream().filter(f -> !f.get("hsdw").toString().equals(AccountingUnitEnum.DAY.getKey())).collect(Collectors.toList()); + } //遍历人员、日期,生成人员+日期+请假时长的请假信息 //请假人的请假区间内每一天的日期类型信息 Map> restDayInfo = removeNonWorkDayRange ? getRestDayWithEmpId(leaveEmpIdList, leaveType, startDate, endDate) : new HashMap<>(); //请假人的请假区间内的排班结果 Map>> scheduleInfoMap = getScheduleInfoWithEmpId(leaveEmpIdList, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1)); - + //班次信息与班次id的映射 + Map> shiftInfoMap = getShiftInfoWithShiftId(); //收集未关联假期余额的请假明细数据 List> simpleLeaveDetailList; + //收集请假人有班次时的日期对应的额定时长信息 + Map> empIdToDateRatedHours = new HashMap<>(); if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey()) && !"1".equals(dailyRepeat)) { simpleLeaveDetailList = createSimpleLeaveDetailListWithNoDaily(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap, - restDayInfo, startDate, endDate, startTime, endTime, countBdlxList, hsdw, hsl); + restDayInfo, countBdlxList, hsdw, hsl, shiftInfoMap, mainTableData, empIdToDateRatedHours); } else { simpleLeaveDetailList = createSimpleLeaveDetailList(leaveEmpIdList, leaveDateList, removeNonWorkDayRange, scheduleInfoMap, - restDayInfo, leaveMode, startTime, endTime, leaveDuration, countBdlxList, hsdw, hsl); + restDayInfo, countBdlxList, hsdw, hsl, shiftInfoMap, mainTableData, empIdToDateRatedHours); } //收集已关联假期余额的请假明细数据 List> completeLeaveDetailList = new ArrayList<>(); @@ -265,21 +267,6 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic if (!kqCycleAllow) { continue; } -// //1-收集使用勾选的关联的可使用的余额,才能够生成请假明细,可使用的条件为,a-满足最小使用时长,b-满足使用次数上限,c-存在未休时长 -// List> canUseCheckJqyeInfo = collectUsableHolidayBalance(unableUseJqyeIdList, editedUseJqed, holidayItem, startDate, entry.getKey()); -// List> detailListItem; -// //判断考勤项目是否需要强制使用“优先使用项目” -// if (useFirstItemSign) { -// //勾选假期类型名称 -// String firstItemName = Util.null2String(holidayPriorityItem.get("mc")); -// //2-收集优先使用的项目关联的可使用的余额,才能够生成请假明细,可使用的条件为,a-满足最小使用时长,b-满足使用次数上限,c-存在未休时长 -// List> canUseFirstJqyeInfo = collectUsableHolidayBalance(unableUseJqyeIdList, editedUseJqed, holidayPriorityItem, startDate, entry.getKey()); -// detailListItem = matchHolidayBalance(editedLeaveInfo, checkAmountJqIdList, errorMessage, entry.getKey(), empIdToName.get(entry.getKey()), canUseCheckJqyeInfo, canUseFirstJqyeInfo, editedUseJqed, -// editedUseJqlxWithEmp, entry.getValue(), leaveType, holidayPriorityItem.get("id").toString(), checkItemName, firstItemName); -// } else { -// detailListItem = matchHolidayBalance(editedLeaveInfo, checkAmountJqIdList, errorMessage, entry.getKey(), empIdToName.get(entry.getKey()), canUseCheckJqyeInfo, null, editedUseJqed, -// editedUseJqlxWithEmp, entry.getValue(), leaveType, null, checkItemName, null); -// } //20241021逻辑变更,根据考勤项目的“优先使用项目”信息,获取所有可使用假期余额信息 Map>> canUseJqyeInfo = new HashMap<>(); //20241107需求变更,获取所有可使用假期余额信息列表,并按照失效期+级联优先级排序 @@ -293,6 +280,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } //20241107需求变更,根据流程中设置的假期额度使用优先规则,收集假期余额数据 canUseJqyeItem = collectUsableHolidayBalance(unableUseJqyeIdList, editedUseJqed, item, startDate, entry.getKey(), empIdToName.get(entry.getKey()), modeId, errorMessage, jbPriorityValue); + jbPriorityValue++; if ("0".equals(jqyeUsePriority)) { canUseJqyeInfo.put(item.get("id").toString(), canUseJqyeItem); } else if ("1".equals(jqyeUsePriority)) { @@ -308,10 +296,12 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic List> detailListItem = new ArrayList<>(); if ("0".equals(jqyeUsePriority)) { detailListItem = matchHolidayWithPriority(editedLeaveInfo, checkAmountJqIdList, errorMessage, entry.getKey(), - empIdToName.get(entry.getKey()), canUseJqyeInfo, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, entry.getValue(), editedEmpLeaveInfo.get(entry.getKey())); + empIdToName.get(entry.getKey()), canUseJqyeInfo, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, + entry.getValue(), editedEmpLeaveInfo.get(entry.getKey()), jbIdToHsdw, empIdToDateRatedHours.get(entry.getKey())); } else if ("1".equals(jqyeUsePriority)) { detailListItem = matchHolidayWithDatePriority(editedLeaveInfo, checkAmountJqIdList, errorMessage, entry.getKey(), - empIdToName.get(entry.getKey()), canUseJqyeList, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, entry.getValue(), editedEmpLeaveInfo.get(entry.getKey())); + empIdToName.get(entry.getKey()), canUseJqyeList, holidayPriorityItemList, editedUseJqed, editedUseJqlxWithEmp, + entry.getValue(), editedEmpLeaveInfo.get(entry.getKey()), jbIdToHsdw, empIdToDateRatedHours.get(entry.getKey())); } if (detailListItem.size() > 0) { completeLeaveDetailList.addAll(detailListItem); @@ -336,6 +326,16 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic return resultMap; } + private Map> getShiftInfoWithShiftId() { + Map> result = new HashMap<>(); + String sql = "select id, mc ,edsc, fgsjd, zgzsc, btgz from uf_jcl_kq_bcxx"; + List> shiftInfoList = DbTools.getSqlToList(sql); + if (shiftInfoList.size() > 0) { + result = shiftInfoList.stream().collect(Collectors.toMap(e -> e.get("id").toString(), e -> e)); + } + return result; + } + private void getHolidayPriorityItem(List> holidayPriorityItemList, Map> holidayItemInfos, Map holidayItem) { boolean useFirstItemSign = CheckBoxEnum.CHECKED.getKey().equals(holidayItem.get("qzsyyxjb")) && CheckBoxEnum.CHECKED.getKey().equals(holidayItem.get("jcbyxsyqjb")); String useFirstItemId = useFirstItemSign ? Util.null2String(holidayItem.get("yxsydjb")) : ""; @@ -402,21 +402,28 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic * @param removeNonWorkDayRange 是否移除非工作日时长 * @param scheduleInfoMap 排班信息 * @param restDayInfo 休息日信息 - * @param leaveMode 请假方式 - * @param startTime 开始时间 - * @param endTime 结束时间 - * @param leaveDuration 请假时长 * @param countBdlxList 收集需要统计时长的班段类型 * @return 组装初步的请假明细 */ - private List> createSimpleLeaveDetailList(List leaveEmpIdList, List leaveDateList, boolean removeNonWorkDayRange, - Map>> scheduleInfoMap, Map> restDayInfo, - String leaveMode, String startTime, String endTime, String leaveDuration, List countBdlxList, - String hsdw, double hsl) { + private List> createSimpleLeaveDetailList(List leaveEmpIdList, List leaveDateList, boolean removeNonWorkDayRange, Map>> scheduleInfoMap, + Map> restDayInfo, List countBdlxList, String hsdw, double hsl, Map> shiftInfoMap, + Map mainTableData, Map> empIdToDateRatedHours) { + //开始时间、结束时间、请假方式、请假时长、上下午选择、开始时段、结束时段 + String startTime = Util.null2String(mainTableData.get("kssj")); + String endTime = Util.null2String(mainTableData.get("jssj")); + String leaveMode = Util.null2String(mainTableData.get("cxjqj")); + String leaveDuration = Util.null2String(mainTableData.get("qjsc")); + String halfDayRangeSelect = Util.null2String(mainTableData.get("sxwxz")); + String startRange = Util.null2String(mainTableData.get("kssd")); + String endRange= Util.null2String(mainTableData.get("jssd")); + List> simpleLeaveDetailList = new ArrayList<>(); Map simpleLeaveDetailItem; - + String qjscHours = ""; + String sql = ""; + Map dateToRatedHours; for (String leaveEmpId : leaveEmpIdList) { + dateToRatedHours = new HashMap<>(); //需要自动移除日期区间内的休息日时,去除请假日期区间中的休息日 List> scheduleInfoList = scheduleInfoMap.getOrDefault(leaveEmpId, new ArrayList<>()); Map dateToBcxxMap = scheduleInfoList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("bcrq")),e->Util.null2String(e.get("bcxx")))); @@ -438,17 +445,25 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic restDateList.addAll(restDateListFromSchedule); } for (String leaveDate : leaveDateList) { + //获取当天班次id + String currentDayBcId = restDateList.contains(leaveDate) ? "" : Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; + if (!"".equals(currentDayBcId)) { + Map shiftInfo = shiftInfoMap.get(currentDayBcId); + qjscHours = shiftInfo == null ? "8" : shiftInfo.get("edsc").toString(); + dateToRatedHours.put(leaveDate, Double.parseDouble(qjscHours)); + } //请假方式为“指定时间区间”时 if (leaveMode.equals(AskAndEvctionWayEnum.TIME_INTERVAL.getKey())) { simpleLeaveDetailItem = new HashMap<>(); + int scMinutes = 0; + String realStartDate = leaveDate; + String realStartTime = startTime; + String realEndDate = leaveDate; + String realEndTime = endTime; //组装初步的请假明细数据 simpleLeaveDetailItem.put("qjr", leaveEmpId); - simpleLeaveDetailItem.put("ksrq", leaveDate); - simpleLeaveDetailItem.put("jsrq", leaveDate); - simpleLeaveDetailItem.put("kssj", startTime); - simpleLeaveDetailItem.put("jssj", endTime); //获取当天班次id - String currentDayBcId = restDateList.contains(leaveDate) ? "" : Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; +// String currentDayBcId = restDateList.contains(leaveDate) ? "" : Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; //获取前一天班次id String yesterday = DateUtil.beforeDay(leaveDate,1); String yesterdayBcId = restDateList.contains(yesterday) ? "" : Util.null2String(dateToBcxxMap.get(yesterday)).split("-")[0]; @@ -456,14 +471,38 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String nextDay = DateUtil.AfterDay(leaveDate,1); String nextDayBcId = restDateList.contains(nextDay) ? "" : Util.null2String(dateToBcxxMap.get(nextDay)).split("-")[0]; - String sql = ""; + if (halfDayRangeSelect.equals(CheckBoxEnum.CHECKED.getKey())) { + //根据“上下午选择”字段来重新获取开始和结束时间点 + //获取开始日期班次id + if ("".equals(currentDayBcId)) { + continue; + } + //获取开始时间、结束时间 + String startFromBc = getTimePointFromBc(leaveDate, shiftInfoMap.get(currentDayBcId), "start", startRange); + String endFromBc = getTimePointFromBc(leaveDate, shiftInfoMap.get(currentDayBcId),"end", endRange); + if ("".equals(startFromBc) || "".equals(endFromBc)) { + continue; + } + realStartDate = startFromBc.split(" ")[0]; + realStartTime = startFromBc.split(" ")[1]; + realEndDate = endFromBc.split(" ")[0]; + realEndTime = endFromBc.split(" ")[1]; + } else { + //开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间 + if (startTime.compareTo(endTime) >= 0) { + realEndDate = DateUtil.AfterDay(leaveDate,1); + } + + } + simpleLeaveDetailItem.put("ksrq", realStartDate); + simpleLeaveDetailItem.put("jsrq", realEndDate); + simpleLeaveDetailItem.put("kssj", realStartTime); + simpleLeaveDetailItem.put("jssj", realEndTime); + List> bcDetailData; - String endDate = leaveDate; - int scMinutes = 0; //开始时时和结束时间存在跨天情况时,即开始时间大于等于结束时间 if (startTime.compareTo(endTime) >= 0) { - endDate = nextDay; - simpleLeaveDetailItem.put("jsrq", nextDay); + realEndDate = nextDay; } if (!"".equals(yesterdayBcId)) { @@ -471,27 +510,27 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic bcDetailData = DbTools.getSqlToList(sql); bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - scMinutes = Utils.removeTime(leaveDate + " " + startTime, endDate + " " + endTime, bcDetailData, yesterday); + scMinutes = Utils.removeTime(realStartDate + " " + realStartTime, realEndDate + " " + realEndTime, bcDetailData, yesterday); } if (!"".equals(currentDayBcId)) { sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + currentDayBcId; bcDetailData = DbTools.getSqlToList(sql); bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - scMinutes = scMinutes + Utils.removeTime(leaveDate + " " + startTime, endDate + " " + endTime, bcDetailData, leaveDate); + scMinutes = scMinutes + Utils.removeTime(realStartDate + " " + realStartTime, realEndDate + " " + realEndTime, bcDetailData, leaveDate); } if (!"".equals(nextDayBcId)) { sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + nextDayBcId; bcDetailData = DbTools.getSqlToList(sql); bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - scMinutes = scMinutes + Utils.removeTime(leaveDate + " " + startTime, endDate + " " + endTime, bcDetailData, nextDay); + scMinutes = scMinutes + Utils.removeTime(realStartDate + " " + realStartTime, realEndDate + " " + realEndTime, bcDetailData, nextDay); } //增加加班计划中的数据,加班计划明细中的数据作为“加班计划”班段类型数据的补充 if (countBdlxList.contains(ClassSegmentTypeEnum.OVERTIME_PLAN.getKey())) { sql = "select b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.jbry =? and b.ksrq>=? and b.jsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1"; - List> overtimePlanList = DbTools.getSqlToList(sql, leaveEmpId, DateUtil.beforeDay(leaveDate,1), DateUtil.AfterDay(endDate,1)); - int scMinutesInOvertimePlan = Utils.removeTimeWithOvertimePlan(leaveDate + " " + startTime, endDate + " " + endTime, overtimePlanList, dateToBcxxMap); + List> overtimePlanList = DbTools.getSqlToList(sql, leaveEmpId, DateUtil.beforeDay(leaveDate,1), DateUtil.AfterDay(realEndDate,1)); + int scMinutesInOvertimePlan = Utils.removeTimeWithOvertimePlan(realStartDate + " " + realStartTime, realEndDate + " " + realEndTime, overtimePlanList, dateToBcxxMap); scMinutes = scMinutes + scMinutesInOvertimePlan; } if (scMinutes > 0) { @@ -519,22 +558,33 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } } else if (leaveMode.equals(AskAndEvctionWayEnum.ALLDAY.getKey()) && !restDateList.contains(leaveDate)) { simpleLeaveDetailItem = new HashMap<>(); + //获取当天班次id +// String currentDayBcId = restDateList.contains(leaveDate) ? "" : Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; + Map shiftInfo = shiftInfoMap.get(currentDayBcId); + qjscHours = shiftInfo == null ? "8" : shiftInfo.get("edsc").toString(); //组装初步的请假明细数据 simpleLeaveDetailItem.put("qjr", leaveEmpId); simpleLeaveDetailItem.put("ksrq", leaveDate); simpleLeaveDetailItem.put("jsrq", leaveDate); simpleLeaveDetailItem.put("qtj", "1"); + simpleLeaveDetailItem.put("qjscHours", qjscHours); simpleLeaveDetailList.add(simpleLeaveDetailItem); } else if (leaveMode.equals(AskAndEvctionWayEnum.HALFDAY.getKey()) && !restDateList.contains(leaveDate)) { simpleLeaveDetailItem = new HashMap<>(); + //获取当天班次id +// String currentDayBcId = restDateList.contains(leaveDate) ? "" : Util.null2String(dateToBcxxMap.get(leaveDate)).split("-")[0]; + Map shiftInfo = shiftInfoMap.get(currentDayBcId); + qjscHours = shiftInfo == null ? "4" : String.valueOf(Double.parseDouble(shiftInfo.get("edsc").toString()) / 2); //组装初步的请假明细数据 simpleLeaveDetailItem.put("qjr", leaveEmpId); simpleLeaveDetailItem.put("ksrq", leaveDate); simpleLeaveDetailItem.put("jsrq", leaveDate); simpleLeaveDetailItem.put("btj", "1"); + simpleLeaveDetailItem.put("qjscHours", qjscHours); simpleLeaveDetailList.add(simpleLeaveDetailItem); } } + empIdToDateRatedHours.put(leaveEmpId, dateToRatedHours); } return simpleLeaveDetailList; } @@ -545,17 +595,21 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic * @param removeNonWorkDayRange 是否移除非工作日时长 * @param scheduleInfoMap 排班信息 * @param restDayInfo 休息日信息 - * @param startDate 开始日期 - * @param endDate 结束日期 - * @param startTime 开始时间 - * @param endTime 结束时间 * @param countBdlxList 收集需要统计时长的班段类型 * @return 组装初步的请假明细,这边只处理“每天重复时段请假”未勾选,且请假方式为“指定时间区间” */ - private List> createSimpleLeaveDetailListWithNoDaily(List leaveEmpIdList, List leaveDateList, boolean removeNonWorkDayRange, - Map>> scheduleInfoMap, Map> restDayInfo, - String startDate, String endDate, String startTime, String endTime, List countBdlxList, - String hsdw, double hsl) { + private List> createSimpleLeaveDetailListWithNoDaily(List leaveEmpIdList, List leaveDateList, boolean removeNonWorkDayRange, Map>> scheduleInfoMap, + Map> restDayInfo, List countBdlxList, String hsdw, double hsl, Map> shiftInfoMap, + Map mainTableData, Map> empIdToDateRatedHours) { + //开始日期、结束日期、开始时间、结束时间、请假方式、请假时长、上下午选择、开始时段、结束时段 + String startDate = Util.null2String(mainTableData.get("ksrq")); + String endDate = Util.null2String(mainTableData.get("jsrq")); + String startTime = Util.null2String(mainTableData.get("kssj")); + String endTime = Util.null2String(mainTableData.get("jssj")); + String halfDayRangeSelect = Util.null2String(mainTableData.get("sxwxz")); + String startRange = Util.null2String(mainTableData.get("kssd")); + String endRange = Util.null2String(mainTableData.get("jssd")); + List> simpleLeaveDetailList = new ArrayList<>(); Map simpleLeaveDetailItem; String sql = ""; @@ -563,7 +617,9 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String targetDateBcId = ""; leaveDateList.add(0, DateUtil.beforeDay(startDate,1)); leaveDateList.add(DateUtil.AfterDay(endDate,1)); + Map dateToRatedHours; for (String leaveEmpId : leaveEmpIdList) { + dateToRatedHours = new HashMap<>(); int scMinutes = 0; //需要自动移除日期区间内的休息日时,去除请假日期区间中的休息日 List> scheduleInfoList = scheduleInfoMap.getOrDefault(leaveEmpId, new ArrayList<>()); @@ -586,27 +642,55 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic restDateList.addAll(restDateListFromSchedule); } simpleLeaveDetailItem = new HashMap<>(); + + String realStartDate = startDate; + String realStartTime = startTime; + String realEndDate = endDate; + String realEndTime = endTime; + if (halfDayRangeSelect.equals(CheckBoxEnum.CHECKED.getKey())) { + //根据“上下午选择”字段来重新获取开始和结束时间点 + //获取开始、结束日期班次id + String startDayBcId = restDateList.contains(startDate) ? "" : Util.null2String(dateToBcxxMap.get(startDate)).split("-")[0]; + String endDayBcId = restDateList.contains(endDate) ? "" : Util.null2String(dateToBcxxMap.get(endDate)).split("-")[0]; + if ("".equals(startDayBcId) || "".equals(endDayBcId)) { + continue; + } + //获取开始时间、结束时间 + String startFromBc = getTimePointFromBc(startDate, shiftInfoMap.get(startDayBcId), "start", startRange); + String endFromBc = getTimePointFromBc(endDate, shiftInfoMap.get(endDayBcId),"end", endRange); + if ("".equals(startFromBc) || "".equals(endFromBc)) { + continue; + } + realStartDate = startFromBc.split(" ")[0]; + realStartTime = startFromBc.split(" ")[1]; + realEndDate = endFromBc.split(" ")[0]; + realEndTime = endFromBc.split(" ")[1]; + } //组装初步的请假明细数据 simpleLeaveDetailItem.put("qjr", leaveEmpId); - simpleLeaveDetailItem.put("ksrq", startDate); - simpleLeaveDetailItem.put("jsrq", endDate); - simpleLeaveDetailItem.put("kssj", startTime); - simpleLeaveDetailItem.put("jssj", endTime); + simpleLeaveDetailItem.put("ksrq", realStartDate); + simpleLeaveDetailItem.put("jsrq", realEndDate); + simpleLeaveDetailItem.put("kssj", realStartTime); + simpleLeaveDetailItem.put("jssj", realEndTime); for (String date : leaveDateList) { targetDateBcId = restDateList.contains(date) ? "" : Util.null2String(dateToBcxxMap.get(date)).split("-")[0]; if (!"".equals(targetDateBcId)) { + Map shiftInfo = shiftInfoMap.get(targetDateBcId); + dateToRatedHours.put(date, Double.parseDouble(shiftInfo == null ? "8" : shiftInfo.get("edsc").toString())); + sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj from uf_jcl_kq_bcxx_dt1 where mainid = " + targetDateBcId; bcDetailData = DbTools.getSqlToList(sql); bcDetailData = bcDetailData.stream().filter(e -> countBdlxList.contains(Util.null2String(e.get("bdlx")))).collect(Collectors.toList()); //获取需要累计的班段时长区间和请假区间存在交集的分钟数 - scMinutes = scMinutes + Utils.removeTime(startDate + " " + startTime, endDate + " " + endTime, bcDetailData, date); + scMinutes = scMinutes + Utils.removeTime(realStartDate + " " + realStartTime, realEndDate + " " + realEndTime, bcDetailData, date); } } + empIdToDateRatedHours.put(leaveEmpId, dateToRatedHours); //增加加班计划中的数据,加班计划明细中的数据作为“加班计划”班段类型数据的补充 if (countBdlxList.contains(ClassSegmentTypeEnum.OVERTIME_PLAN.getKey())) { sql = "select b.jbry,b.ksrq,b.kssj,b.jblx,b.jsrq,b.jssj,b.jbsc,b.gsrq from uf_jcl_kq_jbjh a left join uf_jcl_kq_jbjh_dt1 b on a.id=b.mainid where b.jbry =? and b.ksrq>=? and b.jsrq<=? and (b.jbcx=0 or b.jbcx is null) and a.jlzt=1"; - List> overtimePlanList = DbTools.getSqlToList(sql, leaveEmpId, DateUtil.beforeDay(startDate,1), DateUtil.AfterDay(endDate,1)); - int scMinutesInOvertimePlan = Utils.removeTimeWithOvertimePlan(startDate + " " + startTime, endDate + " " + endTime, overtimePlanList, dateToBcxxMap); + List> overtimePlanList = DbTools.getSqlToList(sql, leaveEmpId, DateUtil.beforeDay(realStartDate,1), DateUtil.AfterDay(realEndDate,1)); + int scMinutesInOvertimePlan = Utils.removeTimeWithOvertimePlan(realStartDate + " " + realStartTime, realEndDate + " " + realEndTime, overtimePlanList, dateToBcxxMap); scMinutes = scMinutes + scMinutesInOvertimePlan; } if (scMinutes > 0) { @@ -620,6 +704,131 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } return simpleLeaveDetailList; } + + private String getTimePointFromBc(String leaveDate, Map shiftInfo, String pointType, String timeRange) { + String sql = "select id, bdlx, gsrq, kssj as dtkssj, jssj as dtjssj, edts, edxss from uf_jcl_kq_bcxx_dt1 where mainid = " + shiftInfo.get("id") + + " and bdlx = " + ClassSegmentTypeEnum.WORK_TIME.getKey() + " order by gsrq, kssj"; + List> bdData = DbTools.getSqlToList(sql); + if (bdData.size() == 0) { + return ""; + } + //根据半天规则,处理班段的上下半天数据 + String halfDayRuleValue = shiftInfo.get("btgz").toString(); + double ratedSc = Double.parseDouble(shiftInfo.get("edsc").toString()); + double totalSc = Double.parseDouble(shiftInfo.get("zgzsc").toString()); + String wholeBdStartTime = Utils.getkssjTime(bdData.get(0), leaveDate); + String wholeBdEndTime = Utils.getjssjTime(bdData.get(bdData.size() - 1), leaveDate); + String firstHalfEndTime = ""; + String secondHalfStartTime = ""; + //按班次设置 取固定时间 取总时长一半 取额定时长一半 + if (HalfDayRuleREnum.BY_CLASS_SET.getKey().equals(halfDayRuleValue)) { + //按班次设置,根据班段明细中的额定天数来推断半天时间段,累计额定天数达到0.5天的时间点为上午结束的时间点,之后开始的工作时段的时间点为下午开始的时间点 + double countDays = 0; + for (Map bdItem : bdData) { + if (countDays == 0.50) { + secondHalfStartTime = Utils.getkssjTime(bdItem, leaveDate); + break; + } + double itemEdts = Double.parseDouble(bdItem.get("edts").toString()); + if (countDays + itemEdts > 0.50) { + double multiple = (0.50 - countDays) / itemEdts; + String itemStartTime = Utils.getkssjTime(bdItem, leaveDate); + String itemEndTime = Utils.getjssjTime(bdItem, leaveDate); + int minutes = (int) (DateUtil.getBetWeenMinutes(itemStartTime, itemEndTime) * multiple); + firstHalfEndTime = DateUtil.AfterMinutes(itemStartTime, minutes); + secondHalfStartTime = firstHalfEndTime; + break; + } else if (countDays + itemEdts == 0.50) { + firstHalfEndTime = Utils.getjssjTime(bdItem, leaveDate); + } + countDays = countDays + itemEdts; + } + } else if (HalfDayRuleREnum.FIXED_DURATION.getKey().equals(halfDayRuleValue)) { + //取固定时间,根据“分隔时间点”字段fgsjd来指定上午和下午分割的时间点 + String segmentTime = shiftInfo.get("fgsjd").toString(); + segmentTime = getSegmentTime(segmentTime, wholeBdStartTime, wholeBdEndTime); + if (segmentTime.equals("")) { + return ""; + } + firstHalfEndTime = segmentTime; + secondHalfStartTime = segmentTime; + } else if (HalfDayRuleREnum.HALF_TOTAL_DURATION.getKey().equals(halfDayRuleValue)) { + //取总时长一半,根据工作总时长的一半小时数,来确定半天小时数,累加班段明细的额定时长达到半天小时数的时间点为上午结束时间点 + double countHours = 0; + for (Map bdItem : bdData) { + if (countHours == totalSc / 2) { + secondHalfStartTime = Utils.getkssjTime(bdItem, leaveDate); + break; + } + double itemEdxss = Double.parseDouble(bdItem.get("edxss").toString()); + if (countHours + itemEdxss > totalSc / 2) { + String itemStartTime = Utils.getkssjTime(bdItem, leaveDate); + int diffMinutes = (int) ((totalSc / 2 - countHours) * 60); + firstHalfEndTime = DateUtil.AfterMinutes(itemStartTime, diffMinutes); + secondHalfStartTime = firstHalfEndTime; + break; + } else if (countHours + itemEdxss == totalSc / 2) { + firstHalfEndTime = Utils.getjssjTime(bdItem, leaveDate); + } + countHours = countHours + itemEdxss; + } + } else if (HalfDayRuleREnum.HALF_RATED_DURATION.getKey().equals(halfDayRuleValue)) { + //取额定时长一半,根据主表额定时长的一半小时数,来确定半天小时数,累加班段明细的额定时长达到半天小时数的时间点为上午结束时间点 + double countHours = 0; + for (Map bdItem : bdData) { + if (countHours == ratedSc / 2) { + secondHalfStartTime = Utils.getkssjTime(bdItem, leaveDate); + break; + } + double itemEdxss = Double.parseDouble(bdItem.get("edxss").toString()); + if (countHours + itemEdxss > ratedSc / 2) { + String itemStartTime = Utils.getkssjTime(bdItem, leaveDate); + int diffMinutes = (int) ((ratedSc / 2 - countHours) * 60); + firstHalfEndTime = DateUtil.AfterMinutes(itemStartTime, diffMinutes); + secondHalfStartTime = firstHalfEndTime; + break; + } else if (countHours + itemEdxss == ratedSc / 2) { + firstHalfEndTime = Utils.getjssjTime(bdItem, leaveDate); + } + countHours = countHours + itemEdxss; + } + } + + if ("0".equals(timeRange)) { + return "start".equals(pointType) ? wholeBdStartTime : firstHalfEndTime; + } else if ("1".equals(timeRange)) { + return "start".equals(pointType) ? secondHalfStartTime : wholeBdEndTime; + } else { + return ""; + } + } + + private String getSegmentTime(String segmentTime, String wholeBdStartTime, String wholeBdEndTime) { + String startDate = wholeBdStartTime.split(" ")[0]; + String endDate = wholeBdEndTime.split(" ")[0]; + String startPoint = wholeBdStartTime.split(" ")[1]; + String endPoint = wholeBdEndTime.split(" ")[1]; + if (startDate.equals(endDate)) { + if (segmentTime.compareTo(startPoint) > 0 && segmentTime.compareTo(endPoint) < 0) { + segmentTime = startDate + " " + segmentTime; + return segmentTime; + } else { + return ""; + } + } + String waitJudgeSegTime = ""; + int waitCompareMinutes = 9999; + for (int i = 0; i < 3; i++) { + String matchSegTime = DateUtil.AfterDay(startDate,i) + " " + segmentTime; + if (matchSegTime.compareTo(wholeBdStartTime) > 0 && matchSegTime.compareTo(wholeBdEndTime) < 0) { + int diffMinutes = Math.abs(DateUtil.getBetWeenMinutes(wholeBdStartTime, matchSegTime) - DateUtil.getBetWeenMinutes(matchSegTime, wholeBdEndTime)); + waitCompareMinutes = Math.min(waitCompareMinutes, diffMinutes); + waitJudgeSegTime = waitCompareMinutes == diffMinutes ? matchSegTime : waitJudgeSegTime; + } + } + return waitJudgeSegTime; + } + /** * @param qjry 请假人员id * @param detailTableData 请假明细 @@ -663,169 +872,169 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic return true; } - /** - * @param editedLeaveInfo 触发接口前已编辑的请假明细信息 - * @param checkAmountJqIdList 需要校验假期额度的假期类型id集合 - * @param errorMessage 错误信息记录集合 - * @param empId 请假人员id - * @param empName 请假人员姓名 - * @param canUseCheckJqyeInfo 勾选的假期类型可使用的假期余额信息 - * @param canUseFirstJqyeInfo 优先使用的假期类型可使用的假期余额信息 - * @param editedUseJqed 触发接口前已编辑的假期额度使用信息 - * @param editedUseJqlxWithEmp 触发接口前,本次提交的日期集合中已编辑的假期类型id_人员id条件下已使用的时长 - * @param leaveDetailList 请假明细集合 - * @param checkItemId 勾选的假期类型id - * @param firstItemId 优先使用的假期类型id - * @return 给请假明细中请假时长分配应扣的假期余额id及时长 - */ - private List> matchHolidayBalance(Map editedLeaveInfo, List checkAmountJqIdList, List errorMessage, String empId, String empName, - List> canUseCheckJqyeInfo, List> canUseFirstJqyeInfo, Map editedUseJqed, - Map editedUseJqlxWithEmp,List> leaveDetailList, String checkItemId, String firstItemId, - String checkItemName, String firstItemName) { - List> result = new ArrayList<>(); - //记录分配假期余额的结果 - boolean matchResultSign = true; - //此次遍历请假总时长 - double totalLeaveDuration = 0; - for (Map detailData : leaveDetailList) { - String qtj = Util.null2String(detailData.get("qtj")); - String btj = Util.null2String(detailData.get("btj")); - //请假时间 - double leaveDuration; - if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { - //全天默认8小时 - leaveDuration = 8; - } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { - //半天默认4小时 - leaveDuration = 4; - } else{ - leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); - } - totalLeaveDuration = totalLeaveDuration + leaveDuration; - } - //已编辑明细中已使用时长 - Double checkItemEditedUseSc = editedUseJqlxWithEmp.getOrDefault(checkItemId + "_" + empId, (double) 0); - Double firstItemEditedUseSc = editedUseJqlxWithEmp.getOrDefault(firstItemId + "_" + empId, (double) 0); -// totalLeaveDuration = Utils.subtract(totalLeaveDuration, checkItemEditedUseSc == null ? 0 : checkItemEditedUseSc); -// totalLeaveDuration = Utils.subtract(totalLeaveDuration, firstItemEditedUseSc == null ? 0 : firstItemEditedUseSc); -// //如果总时长为0,则退出 - if (Utils.add(checkItemEditedUseSc, firstItemEditedUseSc) > 0) { - String message = empName + "在该请假类型的本次请假日期范围内,已存在开始日期相同的请假明细,请重新选择日期范围!"; - errorMessage.add(message); - return result; - } - Map leaveDurationMap = new HashMap<>(); - leaveDurationMap.put("totalLeaveDuration", totalLeaveDuration); - //默认存在优先使用项目时长 - boolean firstItemHaveDuration = true; - //优先使用的假期类型项目是否不需要校验假期余额的额度 - boolean firstItemNonCheck = firstItemId != null && !checkAmountJqIdList.contains(firstItemId); - //勾选的假期类型项目是否不需要校验假期余额的额度 - boolean checkItemNonCheck = !checkAmountJqIdList.contains(checkItemId); - //遍历关联请假余额id和假期类型id - for (Map detailData : leaveDetailList) { - String ksrq = Util.null2String(detailData.get("ksrq")); - String qtj = Util.null2String(detailData.get("qtj")); - String btj = Util.null2String(detailData.get("btj")); - detailData.put("qjrName", empName); - //请假时间 - double leaveDuration; - if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { - //全天默认8小时 - leaveDuration = 8; - } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { - //半天默认4小时 - leaveDuration = 4; - } else{ - leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); - } - log.info("leaveDuration : [{}]", leaveDuration); - //优先使用的的请假项目是否已被编辑 - double firstItemEditedDetailSc = editedLeaveInfo.get(empId + "_" + firstItemId + "_" + ksrq) == null ? 0 : Double.parseDouble(editedLeaveInfo.get(empId + "_" + firstItemId + "_" + ksrq)); - boolean firstItemEditedDetail = editedLeaveInfo.get(empId + "_" + firstItemId + "_" + ksrq) != null; - //勾选的请假项目是否已被编辑,此处判定包含了优先使用的请假项目编辑记录中的时长大于等于提交请假需求者的时长 - double checkItemEditedDetailSc = editedLeaveInfo.get(empId + "_" + checkItemId + "_" + ksrq) == null ? 0 : Double.parseDouble(editedLeaveInfo.get(empId + "_" + checkItemId + "_" + ksrq)); - boolean checkItemEditedDetail = editedLeaveInfo.get(empId + "_" + checkItemId + "_" + ksrq) != null || (firstItemEditedDetail && firstItemEditedDetailSc - leaveDuration >= 0); - - leaveDuration = Utils.subtract(leaveDuration, firstItemEditedDetailSc); - leaveDuration = Utils.subtract(leaveDuration, checkItemEditedDetailSc); - if (leaveDuration <= 0) { - continue; - } - //存在优先使用假期类型时,且该假期类型不需要进行额度校验 - if (firstItemNonCheck && !firstItemEditedDetail) { - detailData.put("qjlx", firstItemId); - detailData.put("qjlxName", firstItemName); - detailData.put("qjsc", String.valueOf(leaveDuration)); - result.add(detailData); - continue; - } - //不存在优先使用假期类型时,勾选的假期类型不需要进行额度校验 - if (firstItemId == null && checkItemNonCheck && !checkItemEditedDetail) { - detailData.put("qjlx", checkItemId); - detailData.put("qjlxName", checkItemName); - detailData.put("qjsc", String.valueOf(leaveDuration)); - result.add(detailData); - continue; - } - - leaveDurationMap.put("leaveDuration", leaveDuration); - //存在优先使用假期类型时,但是需要进行额度校验 - if (canUseFirstJqyeInfo != null && canUseFirstJqyeInfo.size() > 0 && firstItemHaveDuration && !firstItemEditedDetail) { - dealLeaveDetailWithJqyeInfo(detailData, canUseFirstJqyeInfo, editedUseJqed, leaveDurationMap, ksrq, firstItemId, firstItemName, result); - if (leaveDurationMap.get("leaveDuration") == 0) { - //如果同假期类型出现多假期余额拼接配置一条请假明细时,请假明细的时长需要重新设置下 - //请假明细初始要求时长已配置完成则赋值为初始请假时长,否则为初始时长-剩余未配置时长 - if (Util.null2String(detailData.get("jqye")).contains(",")) { - detailData.put("qjsc", String.valueOf(leaveDuration)); - } - continue; - } else { - firstItemHaveDuration = false; - if (Util.null2String(detailData.get("jqye")).contains(",")) { - detailData.put("qjsc", String.valueOf(leaveDuration - leaveDurationMap.get("leaveDuration"))); - } - } - } - if (!"".equals(Util.null2String(detailData.get("qjlx")))) { - result.add(new HashMap<>(detailData)); - detailData.remove("qjlx"); - detailData.remove("qjlxName"); - detailData.remove("qjsc"); - detailData.remove("jqye"); - } - //不存在优先使用假期类型,或者优先使用假期类型关联的假期余额用完时 - //勾选的假期类型不需要进行额度校验 - if (checkItemNonCheck && !checkItemEditedDetail) { - detailData.put("qjlx", checkItemId); - detailData.put("qjlxName", checkItemName); - detailData.put("qjsc", String.valueOf(leaveDurationMap.get("leaveDuration"))); - leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDurationMap.get("leaveDuration"))); - result.add(detailData); - continue; - } - //勾选的假期类型需要进行额度校验 - boolean checkItemDealSign = true; - if (!checkItemEditedDetail) { - checkItemDealSign = dealLeaveDetailWithJqyeInfo(detailData, canUseCheckJqyeInfo, editedUseJqed, leaveDurationMap, ksrq, checkItemId, checkItemName, result); - } - if (leaveDurationMap.get("leaveDuration") > 0) { - String message = empName; - if (checkItemEditedDetail) { - //人员id+日期+假期类型三种条件约束唯一性 - message = message + "_" + ksrq + "已存在一笔该请假类型的请假明细!"; - } else if(!checkItemDealSign) { - message = message + "_" + ksrq + "不存在可使用的假期余额,请检查假期余额使用次数和最小使用时长设置!"; - } else { - //假期余额不足 - message = message + "_" + ksrq + "假期余额不足!"; - } - errorMessage.add(message); - matchResultSign = false; - } - } - return matchResultSign ? result : new ArrayList<>(); - } +// /** +// * @param editedLeaveInfo 触发接口前已编辑的请假明细信息 +// * @param checkAmountJqIdList 需要校验假期额度的假期类型id集合 +// * @param errorMessage 错误信息记录集合 +// * @param empId 请假人员id +// * @param empName 请假人员姓名 +// * @param canUseCheckJqyeInfo 勾选的假期类型可使用的假期余额信息 +// * @param canUseFirstJqyeInfo 优先使用的假期类型可使用的假期余额信息 +// * @param editedUseJqed 触发接口前已编辑的假期额度使用信息 +// * @param editedUseJqlxWithEmp 触发接口前,本次提交的日期集合中已编辑的假期类型id_人员id条件下已使用的时长 +// * @param leaveDetailList 请假明细集合 +// * @param checkItemId 勾选的假期类型id +// * @param firstItemId 优先使用的假期类型id +// * @return 给请假明细中请假时长分配应扣的假期余额id及时长 +// */ +// private List> matchHolidayBalance(Map editedLeaveInfo, List checkAmountJqIdList, List errorMessage, String empId, String empName, +// List> canUseCheckJqyeInfo, List> canUseFirstJqyeInfo, Map editedUseJqed, +// Map editedUseJqlxWithEmp,List> leaveDetailList, String checkItemId, String firstItemId, +// String checkItemName, String firstItemName) { +// List> result = new ArrayList<>(); +// //记录分配假期余额的结果 +// boolean matchResultSign = true; +// //此次遍历请假总时长 +// double totalLeaveDuration = 0; +// for (Map detailData : leaveDetailList) { +// String qtj = Util.null2String(detailData.get("qtj")); +// String btj = Util.null2String(detailData.get("btj")); +// //请假时间 +// double leaveDuration; +// if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { +// //全天默认8小时 +// leaveDuration = 8; +// } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { +// //半天默认4小时 +// leaveDuration = 4; +// } else{ +// leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); +// } +// totalLeaveDuration = totalLeaveDuration + leaveDuration; +// } +// //已编辑明细中已使用时长 +// Double checkItemEditedUseSc = editedUseJqlxWithEmp.getOrDefault(checkItemId + "_" + empId, (double) 0); +// Double firstItemEditedUseSc = editedUseJqlxWithEmp.getOrDefault(firstItemId + "_" + empId, (double) 0); +//// totalLeaveDuration = Utils.subtract(totalLeaveDuration, checkItemEditedUseSc == null ? 0 : checkItemEditedUseSc); +//// totalLeaveDuration = Utils.subtract(totalLeaveDuration, firstItemEditedUseSc == null ? 0 : firstItemEditedUseSc); +//// //如果总时长为0,则退出 +// if (Utils.add(checkItemEditedUseSc, firstItemEditedUseSc) > 0) { +// String message = empName + "在该请假类型的本次请假日期范围内,已存在开始日期相同的请假明细,请重新选择日期范围!"; +// errorMessage.add(message); +// return result; +// } +// Map leaveDurationMap = new HashMap<>(); +// leaveDurationMap.put("totalLeaveDuration", totalLeaveDuration); +// //默认存在优先使用项目时长 +// boolean firstItemHaveDuration = true; +// //优先使用的假期类型项目是否不需要校验假期余额的额度 +// boolean firstItemNonCheck = firstItemId != null && !checkAmountJqIdList.contains(firstItemId); +// //勾选的假期类型项目是否不需要校验假期余额的额度 +// boolean checkItemNonCheck = !checkAmountJqIdList.contains(checkItemId); +// //遍历关联请假余额id和假期类型id +// for (Map detailData : leaveDetailList) { +// String ksrq = Util.null2String(detailData.get("ksrq")); +// String qtj = Util.null2String(detailData.get("qtj")); +// String btj = Util.null2String(detailData.get("btj")); +// detailData.put("qjrName", empName); +// //请假时间 +// double leaveDuration; +// if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { +// //全天默认8小时 +// leaveDuration = 8; +// } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { +// //半天默认4小时 +// leaveDuration = 4; +// } else{ +// leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); +// } +// log.info("leaveDuration : [{}]", leaveDuration); +// //优先使用的的请假项目是否已被编辑 +// double firstItemEditedDetailSc = editedLeaveInfo.get(empId + "_" + firstItemId + "_" + ksrq) == null ? 0 : Double.parseDouble(editedLeaveInfo.get(empId + "_" + firstItemId + "_" + ksrq)); +// boolean firstItemEditedDetail = editedLeaveInfo.get(empId + "_" + firstItemId + "_" + ksrq) != null; +// //勾选的请假项目是否已被编辑,此处判定包含了优先使用的请假项目编辑记录中的时长大于等于提交请假需求者的时长 +// double checkItemEditedDetailSc = editedLeaveInfo.get(empId + "_" + checkItemId + "_" + ksrq) == null ? 0 : Double.parseDouble(editedLeaveInfo.get(empId + "_" + checkItemId + "_" + ksrq)); +// boolean checkItemEditedDetail = editedLeaveInfo.get(empId + "_" + checkItemId + "_" + ksrq) != null || (firstItemEditedDetail && firstItemEditedDetailSc - leaveDuration >= 0); +// +// leaveDuration = Utils.subtract(leaveDuration, firstItemEditedDetailSc); +// leaveDuration = Utils.subtract(leaveDuration, checkItemEditedDetailSc); +// if (leaveDuration <= 0) { +// continue; +// } +// //存在优先使用假期类型时,且该假期类型不需要进行额度校验 +// if (firstItemNonCheck && !firstItemEditedDetail) { +// detailData.put("qjlx", firstItemId); +// detailData.put("qjlxName", firstItemName); +// detailData.put("qjsc", String.valueOf(leaveDuration)); +// result.add(detailData); +// continue; +// } +// //不存在优先使用假期类型时,勾选的假期类型不需要进行额度校验 +// if (firstItemId == null && checkItemNonCheck && !checkItemEditedDetail) { +// detailData.put("qjlx", checkItemId); +// detailData.put("qjlxName", checkItemName); +// detailData.put("qjsc", String.valueOf(leaveDuration)); +// result.add(detailData); +// continue; +// } +// +// leaveDurationMap.put("leaveDuration", leaveDuration); +// //存在优先使用假期类型时,但是需要进行额度校验 +// if (canUseFirstJqyeInfo != null && canUseFirstJqyeInfo.size() > 0 && firstItemHaveDuration && !firstItemEditedDetail) { +// dealLeaveDetailWithJqyeInfo(detailData, canUseFirstJqyeInfo, editedUseJqed, leaveDurationMap, ksrq, firstItemId, firstItemName, result); +// if (leaveDurationMap.get("leaveDuration") == 0) { +// //如果同假期类型出现多假期余额拼接配置一条请假明细时,请假明细的时长需要重新设置下 +// //请假明细初始要求时长已配置完成则赋值为初始请假时长,否则为初始时长-剩余未配置时长 +// if (Util.null2String(detailData.get("jqye")).contains(",")) { +// detailData.put("qjsc", String.valueOf(leaveDuration)); +// } +// continue; +// } else { +// firstItemHaveDuration = false; +// if (Util.null2String(detailData.get("jqye")).contains(",")) { +// detailData.put("qjsc", String.valueOf(leaveDuration - leaveDurationMap.get("leaveDuration"))); +// } +// } +// } +// if (!"".equals(Util.null2String(detailData.get("qjlx")))) { +// result.add(new HashMap<>(detailData)); +// detailData.remove("qjlx"); +// detailData.remove("qjlxName"); +// detailData.remove("qjsc"); +// detailData.remove("jqye"); +// } +// //不存在优先使用假期类型,或者优先使用假期类型关联的假期余额用完时 +// //勾选的假期类型不需要进行额度校验 +// if (checkItemNonCheck && !checkItemEditedDetail) { +// detailData.put("qjlx", checkItemId); +// detailData.put("qjlxName", checkItemName); +// detailData.put("qjsc", String.valueOf(leaveDurationMap.get("leaveDuration"))); +// leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDurationMap.get("leaveDuration"))); +// result.add(detailData); +// continue; +// } +// //勾选的假期类型需要进行额度校验 +// boolean checkItemDealSign = true; +// if (!checkItemEditedDetail) { +// checkItemDealSign = dealLeaveDetailWithJqyeInfo(detailData, canUseCheckJqyeInfo, editedUseJqed, leaveDurationMap, ksrq, checkItemId, checkItemName, result); +// } +// if (leaveDurationMap.get("leaveDuration") > 0) { +// String message = empName; +// if (checkItemEditedDetail) { +// //人员id+日期+假期类型三种条件约束唯一性 +// message = message + "_" + ksrq + "已存在一笔该请假类型的请假明细!"; +// } else if(!checkItemDealSign) { +// message = message + "_" + ksrq + "不存在可使用的假期余额,请检查假期余额使用次数和最小使用时长设置!"; +// } else { +// //假期余额不足 +// message = message + "_" + ksrq + "假期余额不足!"; +// } +// errorMessage.add(message); +// matchResultSign = false; +// } +// } +// return matchResultSign ? result : new ArrayList<>(); +// } /** @@ -842,30 +1051,35 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic */ private List> matchHolidayWithPriority(Map editedLeaveInfo, List checkAmountJqIdList, List errorMessage, String empId, String empName, Map>> canUseJqyeInfo, List> holidayPriorityItemList, Map editedUseJqed, - Map editedUseJqlxWithEmp, List> leaveDetailList, List> editedLeaveInfoList) { + Map editedUseJqlxWithEmp, List> leaveDetailList, List> editedLeaveInfoList, + Map jbIdToHsdw, Map dateToRatedHours) { List> result = new ArrayList<>(); //记录分配假期余额的结果 boolean matchResultSign = true; //此次遍历请假总时长 - double totalLeaveDuration = 0; + double totalLeaveHours = 0; + double totalLeaveDays = 0; for (Map detailData : leaveDetailList) { String qtj = Util.null2String(detailData.get("qtj")); String btj = Util.null2String(detailData.get("btj")); //请假时间 - double leaveDuration; + double leaveHours; if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { //全天默认8小时 - leaveDuration = 8; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "8")); + totalLeaveDays = totalLeaveDays + 1; } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { //半天默认4小时 - leaveDuration = 4; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "4")); + totalLeaveDays = totalLeaveDays + 0.5; } else { - leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); + leaveHours = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); } - totalLeaveDuration = totalLeaveDuration + leaveDuration; + totalLeaveHours = totalLeaveHours + leaveHours; } Map leaveDurationMap = new HashMap<>(); - leaveDurationMap.put("totalLeaveDuration", totalLeaveDuration); + leaveDurationMap.put("totalLeaveHours", totalLeaveHours); + leaveDurationMap.put("totalLeaveDays", totalLeaveDays); //遍历关联请假余额id和假期类型id for (Map detailData : leaveDetailList) { String ksrq = Util.null2String(detailData.get("ksrq")); @@ -873,34 +1087,42 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String btj = Util.null2String(detailData.get("btj")); detailData.put("qjrName", empName); //请假时间 - double leaveDuration; + double leaveHours; + double leaveDays = 0; if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { //全天默认8小时 - leaveDuration = 8; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "8")); + leaveDays = 1; } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { //半天默认4小时 - leaveDuration = 4; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "4")); + leaveDays = 0.5; } else{ - leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); + leaveHours = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); } //单日假期“全局唯一性”约束校验 - boolean dailyCheckSign = checkDailyLeaveLicense(empId, empName, detailData, editedLeaveInfoList, leaveDuration, errorMessage); + boolean dailyCheckSign = checkDailyLeaveLicense(empId, empName, detailData, editedLeaveInfoList, leaveHours, errorMessage, dateToRatedHours, jbIdToHsdw); if (!dailyCheckSign) { - leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDuration)); + leaveDurationMap.put("totalLeaveHours", Utils.subtract(leaveDurationMap.get("totalLeaveHours"), leaveHours)); + leaveDurationMap.put("totalLeaveDays", Utils.subtract(leaveDurationMap.get("totalLeaveDays"), leaveDays)); continue; } - log.info("leaveDuration : [{}]", leaveDuration); - leaveDurationMap.put("leaveDuration", leaveDuration); + log.info("leaveHours : [{}]", leaveHours); + log.info("leaveDays : [{}]", leaveDays); + leaveDurationMap.put("leaveHours", leaveHours); + leaveDurationMap.put("leaveDays", leaveDays); //20241021逻辑变更,按照假期项目级联优先级,由后往前依次分配请假时长 List> jqyeList; String jqlxId; String jqlxName; + String hsdw; boolean jqlxEdited = false; boolean dealSign = true; for (Map jqlxItem : holidayPriorityItemList) { jqlxId = Util.null2String(jqlxItem.get("id")); jqlxName = Util.null2String(jqlxItem.get("mc")); + hsdw = Util.null2String(jqlxItem.get("hsdw")); jqyeList = canUseJqyeInfo.get(jqlxId); Double jqlxEditedUseSc = editedUseJqlxWithEmp.getOrDefault(jqlxId + "_" + empId, (double) 0); //使用的的请假项目是否已被编辑 @@ -910,33 +1132,45 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic jqlxEdited = true; continue; } - leaveDuration = leaveDurationMap.get("leaveDuration"); + leaveHours = leaveDurationMap.get("leaveHours"); + leaveDays = leaveDurationMap.get("leaveDays"); //使用的假期项目需要额度校验的话 if (checkAmountJqIdList.contains(jqlxId)) { - leaveDurationMap.put("leaveDuration", leaveDuration); - dealSign = dealLeaveDetailWithJqyeInfo(detailData, jqyeList, editedUseJqed, leaveDurationMap, ksrq, jqlxId, jqlxName, result); + + dealSign = dealLeaveDetailWithJqyeInfo(detailData, jqyeList, editedUseJqed, leaveDurationMap, ksrq, jqlxId, jqlxName, result, dateToRatedHours); if (!dealSign) { continue; } - if (leaveDurationMap.get("leaveDuration") == 0) { + double leaveDuration; + double initialLeaveDuration; + if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { + leaveDuration = leaveDurationMap.get("leaveDays"); + initialLeaveDuration = leaveDays; + } else { + leaveDuration = leaveDurationMap.get("leaveHours"); + initialLeaveDuration = leaveHours; + } + if (leaveDuration == 0) { //如果同假期类型出现多假期余额拼接配置一条请假明细时,请假明细的时长需要重新设置下 //请假明细初始要求时长已配置完成则赋值为初始请假时长,否则为初始时长-剩余未配置时长 if (Util.null2String(detailData.get("jqye")).contains(",")) { - detailData.put("qjsc", String.valueOf(leaveDuration)); + detailData.put("qjsc", String.valueOf(initialLeaveDuration)); } break; } else { if (Util.null2String(detailData.get("jqye")).contains(",")) { - detailData.put("qjsc", String.valueOf(leaveDuration - leaveDurationMap.get("leaveDuration"))); + detailData.put("qjsc", String.valueOf(initialLeaveDuration - leaveDuration)); } } } else { detailData.put("qjlx", jqlxId); detailData.put("qjlxName", jqlxName); - detailData.put("qjsc", String.valueOf(leaveDuration)); + detailData.put("qjsc", hsdw.equals(AccountingUnitEnum.DAY.getKey()) ? String.valueOf(leaveDays) : String.valueOf(leaveHours)); result.add(detailData); - leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDurationMap.get("leaveDuration"))); - leaveDurationMap.put("leaveDuration", (double) 0); + leaveDurationMap.put("totalLeaveDays", Utils.subtract(leaveDurationMap.get("totalLeaveDays"), leaveDurationMap.get("leaveDays"))); + leaveDurationMap.put("leaveDays", (double) 0); + leaveDurationMap.put("totalLeaveHours", Utils.subtract(leaveDurationMap.get("totalLeaveHours"), leaveDurationMap.get("leaveHours"))); + leaveDurationMap.put("leaveHours", (double) 0); break; } if (!"".equals(Util.null2String(detailData.get("qjlx")))) { @@ -948,7 +1182,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } } - if (leaveDurationMap.get("leaveDuration") > 0) { + if (leaveDurationMap.get("leaveHours") > 0) { String message = empName; if (jqlxEdited) { //人员id+日期+假期类型三种条件约束唯一性 @@ -981,30 +1215,35 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic */ private List> matchHolidayWithDatePriority(Map editedLeaveInfo, List checkAmountJqIdList, List errorMessage, String empId, String empName, List> canUseJqyeList, List> holidayPriorityItemList, Map editedUseJqed, - Map editedUseJqlxWithEmp, List> leaveDetailList, List> editedLeaveInfoList) { + Map editedUseJqlxWithEmp, List> leaveDetailList, List> editedLeaveInfoList, + Map jbIdToHsdw, Map dateToRatedHours) { List> result = new ArrayList<>(); //记录分配假期余额的结果 boolean matchResultSign = true; //此次遍历请假总时长 - double totalLeaveDuration = 0; + double totalLeaveHours = 0; + double totalLeaveDays = 0; for (Map detailData : leaveDetailList) { String qtj = Util.null2String(detailData.get("qtj")); String btj = Util.null2String(detailData.get("btj")); //请假时间 - double leaveDuration; + double leaveHours; if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { //全天默认8小时 - leaveDuration = 8; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "8")); + totalLeaveDays = totalLeaveDays + 1; } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { //半天默认4小时 - leaveDuration = 4; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "4")); + totalLeaveDays = totalLeaveDays + 0.5; } else { - leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); + leaveHours = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); } - totalLeaveDuration = totalLeaveDuration + leaveDuration; + totalLeaveHours = totalLeaveHours + leaveHours; } Map leaveDurationMap = new HashMap<>(); - leaveDurationMap.put("totalLeaveDuration", totalLeaveDuration); + leaveDurationMap.put("totalLeaveHours", totalLeaveHours); + leaveDurationMap.put("totalLeaveDays", totalLeaveDays); //遍历关联请假余额id和假期类型id for (Map detailData : leaveDetailList) { String ksrq = Util.null2String(detailData.get("ksrq")); @@ -1012,37 +1251,46 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String btj = Util.null2String(detailData.get("btj")); detailData.put("qjrName", empName); //请假时间 - double leaveDuration; + double leaveHours; + double leaveDays = 0; if (qtj.equals(CheckBoxEnum.CHECKED.getKey())) { //全天默认8小时 - leaveDuration = 8; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "8")); + leaveDays = 1; } else if (btj.equals(CheckBoxEnum.CHECKED.getKey())) { //半天默认4小时 - leaveDuration = 4; + leaveHours = Double.parseDouble(detailData.getOrDefault("qjscHours", "4")); + leaveDays = 0.5; } else{ - leaveDuration = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); + leaveHours = Double.parseDouble(Util.null2String(detailData.get("qjsc"))); } //单日假期“全局唯一性”约束校验 - boolean dailyCheckSign = checkDailyLeaveLicense(empId, empName, detailData, editedLeaveInfoList, leaveDuration, errorMessage); + boolean dailyCheckSign = checkDailyLeaveLicense(empId, empName, detailData, editedLeaveInfoList, leaveHours, errorMessage, dateToRatedHours, jbIdToHsdw); if (!dailyCheckSign) { - leaveDurationMap.put("totalLeaveDuration", Utils.subtract(leaveDurationMap.get("totalLeaveDuration"), leaveDuration)); + + leaveDurationMap.put("totalLeaveHours", Utils.subtract(leaveDurationMap.get("totalLeaveHours"), leaveHours)); + leaveDurationMap.put("totalLeaveDays", Utils.subtract(leaveDurationMap.get("totalLeaveDays"), leaveDays)); continue; } - log.info("leaveDuration : [{}]", leaveDuration); - leaveDurationMap.put("leaveDuration", leaveDuration); + log.info("leaveHours : [{}]", leaveHours); + log.info("leaveDays : [{}]", leaveDays); + leaveDurationMap.put("leaveHours", leaveHours); + leaveDurationMap.put("leaveDays", leaveDays); //20241107逻辑变更,按照假期余额延长失效日期+假期项目级联优先级,(失效日期越早+优先级越高)依次分配请假时长 Map jqlxIdToNameInfo = holidayPriorityItemList.stream().collect(Collectors.toMap(e->Util.null2String(e.get("id")),e->Util.null2String(e.get("mc")))); - dealLeaveDetailWithAllJqye(detailData, canUseJqyeList, editedUseJqed, leaveDurationMap, ksrq, result, jqlxIdToNameInfo, editedLeaveInfo, editedUseJqlxWithEmp, empId); + dealLeaveDetailWithAllJqye(detailData, canUseJqyeList, editedUseJqed, leaveDurationMap, ksrq, result, jqlxIdToNameInfo, editedLeaveInfo, editedUseJqlxWithEmp, empId, dateToRatedHours); //额度假匹配结束,如果还有请假时长未分配,筛选出假期中非额度假的假期类型来分配请假时长 - leaveDuration = leaveDurationMap.get("leaveDuration"); - if (leaveDuration > 0) { + leaveHours = leaveDurationMap.get("leaveHours"); + leaveDays = leaveDurationMap.get("leaveDays"); + if (leaveHours > 0) { holidayPriorityItemList = holidayPriorityItemList.stream().filter(f -> !checkAmountJqIdList.contains(f.get("id").toString())).collect(Collectors.toList()); if (holidayPriorityItemList.size() == 0) { errorMessage.add(empName + "_" + ksrq + "假期余额不足!"); matchResultSign = false; } boolean jqlxEdited = false; + String hsdw; for (Map holidayItem : holidayPriorityItemList) { Double jqlxEditedUseSc = editedUseJqlxWithEmp.getOrDefault(holidayItem.get("id") + "_" + empId, (double) 0); //使用的的请假项目是否已被编辑 @@ -1052,21 +1300,23 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic jqlxEdited = true; continue; } + hsdw = Util.null2String(holidayItem.get("hsdw")); detailData.put("qjlx", holidayPriorityItemList.get(0).get("id").toString()); detailData.put("qjlxName", jqlxIdToNameInfo.get(holidayPriorityItemList.get(0).get("id").toString())); - detailData.put("qjsc", leaveDurationMap.get("leaveDuration").toString()); + detailData.put("qjsc", hsdw.equals(AccountingUnitEnum.DAY.getKey()) ? String.valueOf(leaveDays) : String.valueOf(leaveHours)); detailData.put("jqye", ""); result.add(detailData); - leaveDuration = 0; + leaveHours = 0; + break; } - if (leaveDuration > 0) { + if (leaveHours > 0) { String message = empName; if (jqlxEdited) { //人员id+日期+假期类型三种条件约束唯一性 message = message + "_" + ksrq + "本流程中已存在一笔该请假类型的请假明细!"; } else { //假期余额不足 - message = message + "_" + ksrq + "假期余额不足!"; + message = message + "_" + ksrq + "假期余额不足!"; } errorMessage.add(message); matchResultSign = false; @@ -1079,7 +1329,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic private boolean checkDailyLeaveLicense(String empId, String empName, Map detailData, List> editedLeaveInfoList, - double leaveDuration, List errorMessage) { + double leaveHours, List errorMessage, Map dateToRatedHours, Map jbIdToHsdw) { //判断当前请假信息属于哪一种请假方式(全天、半天、指定时长、指定区间) String leaveMode = ""; if (!"".equals(Util.null2String(detailData.get("kssj")))) { @@ -1161,9 +1411,16 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } //然后判断其他请假方式是由已经存在记录,结合该类请假记录的已有请假时长之和判断 if (otherLeaveList.size() > 0) { - existLeaveSc = otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum(); - if (existLeaveSc + leaveDuration > 8) { - message = message + "_" + ksrq + "已存在共计" + existLeaveSc + "小时的请假记录, 新申请假期累计后已超过8小时!"; +// existLeaveSc = otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum(); + existLeaveSc = otherLeaveList.stream().mapToDouble(e-> { + if (jbIdToHsdw.get(e.get("jqlx").toString()).equals(AccountingUnitEnum.DAY.getKey())) { + return Double.parseDouble(e.getOrDefault("qjsc", "0").toString()) * dateToRatedHours.getOrDefault(ksrq, 8.0); + } + return Double.parseDouble(e.getOrDefault("qjsc", "0").toString()); + }).sum(); + if (existLeaveSc + leaveHours > dateToRatedHours.getOrDefault(ksrq, 8.0)) { + message = message + "_" + ksrq + "已存在共计" + existLeaveSc + + "小时的请假记录, 新申请假期累计后已超过当天上班额定时长" + dateToRatedHours.getOrDefault(ksrq, 8.0) + "小时!"; errorMessage.add(message); return false; } @@ -1236,9 +1493,16 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } //然后判断其他请假方式是由已经存在记录,结合该类请假记录的已有请假时长之和判断 if (otherLeaveList.size() > 0) { - existLeaveSc = existLeaveSc + otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum(); - if (existLeaveSc + leaveDuration > 8) { - message = message + "_" + ksrq + "已存在当天请假记录和当前流程已编辑请假明细共计" + existLeaveSc + "小时的请假记录, 新申请假期累计后已超过8小时!"; +// existLeaveSc = existLeaveSc + otherLeaveList.stream().mapToDouble(e->Double.parseDouble(e.getOrDefault("qjsc", "0").toString())).sum(); + existLeaveSc = otherLeaveList.stream().mapToDouble(e-> { + if (jbIdToHsdw.get(e.get("qjlx").toString()).equals(AccountingUnitEnum.DAY.getKey())) { + return Double.parseDouble(e.getOrDefault("qjsc", "0").toString()) * dateToRatedHours.getOrDefault(ksrq, 8.0); + } + return Double.parseDouble(e.getOrDefault("qjsc", "0").toString()); + }).sum(); + if (existLeaveSc + leaveHours > dateToRatedHours.getOrDefault(ksrq, 8.0)) { + message = message + "_" + ksrq + "已存在当天请假记录和当前流程已编辑请假明细共计" + existLeaveSc + + "小时的请假记录, 新申请假期累计后已超过当天上班额定时长" + dateToRatedHours.getOrDefault(ksrq, 8.0) + "小时!"; errorMessage.add(message); return false; } @@ -1251,9 +1515,11 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic private boolean dealLeaveDetailWithJqyeInfo(Map detailData, List> canUseJqyeInfo, Map editedUseJqed, Map leaveDurationMap, - String ksrq, String itemId, String itemName, List> result) { - double totalLeaveDuration = leaveDurationMap.get("totalLeaveDuration"); - double leaveDuration = leaveDurationMap.get("leaveDuration"); + String ksrq, String itemId, String itemName, List> result, Map dateToRatedHours) { + double totalLeaveHours = leaveDurationMap.get("totalLeaveHours"); + double totalLeaveDays = leaveDurationMap.get("totalLeaveDays"); + double leaveHours = leaveDurationMap.get("leaveHours"); + double leaveDays = leaveDurationMap.get("leaveDays"); //假期类型相关的假期余额记录 List> holidayBalancefilterList = new ArrayList<>(); for (Map map : canUseJqyeInfo){ @@ -1264,18 +1530,26 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic if (holidayBalancefilterList.size() == 0) { return false; } - //使用的假期类型的额度单位 -// String eddw = Util.null2String(holidayBalancefilterList.get(0).get("eddw")); -// int multipleNum = eddw.equals(AccountingUnitEnum.DAY.getKey()) ? 8 : 1; + //使用的假期类型的核算单位 String hsdw = Util.null2String(holidayBalancefilterList.get(0).get("hsdw")); - int multipleNum = hsdw.equals(AccountingUnitEnum.DAY.getKey()) ? 8 : 1; + //20241118需求变更,全天、半天时长根据班次信息获取,以下请假时长分配逻辑的执行前提必须遵守“核算单位为‘天’的假期只能申请全天假、半天假!” + //所以,只有在全天假和半天假时,leaveDurationMap中才会有请假天数信息;其他请假方式则会请假天数和请假小时数都有 + double totalLeaveDuration; + double leaveDuration; + if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { + totalLeaveDuration = totalLeaveDays; + leaveDuration = leaveDays; + } else { + totalLeaveDuration = totalLeaveHours; + leaveDuration = leaveHours; + } for (Map holidayBalance : holidayBalancefilterList) { //1-如果已编辑的请假明细中已有该假期余额id的记录,则满足最小使用时长;如果result的请假明细中已有该假期余额id的记录,则满足最小使用时长 boolean minLeaveDurationSign = editedUseJqed.get(holidayBalance.get("id").toString()) != null || result.stream().anyMatch(map -> itemId.equals(map.get("qjlx"))); //2-如果编辑记录中不存在,则需要判断是否满足最小使用时长 if (!minLeaveDurationSign) { String minLeaveDuration = Util.null2String(holidayBalance.get("minLeaveDuration")); - minLeaveDurationSign = "".equals(minLeaveDuration) || totalLeaveDuration >= Double.parseDouble(minLeaveDuration) * multipleNum; + minLeaveDurationSign = "".equals(minLeaveDuration) || totalLeaveDuration >= Double.parseDouble(minLeaveDuration); } //不满足最小使用时长,直接执行下一条 if (!minLeaveDurationSign) { @@ -1283,7 +1557,6 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } //额定未休时长 double wxsc = "".equals(Util.null2String(holidayBalance.get("wxsc"))) ? 0 : Double.parseDouble(holidayBalance.get("wxsc").toString()); - wxsc = multipleNum * wxsc; if (leaveDuration > 0 && wxsc > 0) { detailData.put("qjlx", itemId); detailData.put("qjlxName", itemName); @@ -1305,8 +1578,6 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } else { detailData.put("qjsc", String.valueOf(leaveDuration)); wxsc = Utils.subtract(wxsc, leaveDuration); - //可能存在倍数转换 - wxsc = Utils.divide(wxsc, multipleNum); totalLeaveDuration = Utils.subtract(totalLeaveDuration, leaveDuration); if ("".equals(jqyeId)) { detailData.put("jqye", holidayBalance.get("id").toString() + "_" + leaveDuration); @@ -1322,17 +1593,32 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic holidayBalance.put("wxsc", wxsc); } } - leaveDurationMap.put("totalLeaveDuration", totalLeaveDuration); - leaveDurationMap.put("leaveDuration", leaveDuration); + + if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { + //假别核算单位为‘天’时,需要更新leaveDurationMap中的请假天数和请假小时数 + leaveDurationMap.put("totalLeaveDays", totalLeaveDuration); + leaveDurationMap.put("leaveDays", leaveDuration); + double ratedDayHours = dateToRatedHours.getOrDefault(detailData.get("ksrq"), 8.0); + leaveDurationMap.put("totalLeaveHours", totalLeaveHours - (leaveDays - leaveDuration) * ratedDayHours); + leaveDurationMap.put("leaveHours", leaveHours - (leaveDays - leaveDuration) * ratedDayHours); + } else { + //假别核算单位为‘小时’时,只需要更新leaveDurationMap中的请假小时数 + leaveDurationMap.put("totalLeaveHours", totalLeaveDuration); + leaveDurationMap.put("leaveHours", leaveDuration); + } + return true; } private void dealLeaveDetailWithAllJqye(Map detailData, List> canUseJqyeList, Map editedUseJqed, Map leaveDurationMap, String ksrq, List> result, Map jqlxIdToNameInfo, - Map editedLeaveInfo, Map editedUseJqlxWithEmp, String empId) { - double totalLeaveDuration = leaveDurationMap.get("totalLeaveDuration"); - double leaveDuration = leaveDurationMap.get("leaveDuration"); + Map editedLeaveInfo, Map editedUseJqlxWithEmp, String empId, Map dateToRatedHours) { + + double totalLeaveHours = leaveDurationMap.get("totalLeaveHours"); + double totalLeaveDays = leaveDurationMap.get("totalLeaveDays"); + double leaveHours = leaveDurationMap.get("leaveHours"); + double leaveDays = leaveDurationMap.get("leaveDays"); List> simpleResult = new ArrayList<>(); //假期余额记录 List> holidayBalancefilterList = new ArrayList<>(); @@ -1346,7 +1632,17 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } //使用的假期类型的额度单位 String hsdw = Util.null2String(holidayBalancefilterList.get(0).get("hsdw")); - int multipleNum = hsdw.equals(AccountingUnitEnum.DAY.getKey()) ? 8 : 1; + //20241118需求变更,全天、半天时长根据班次信息获取,以下请假时长分配逻辑的执行前提必须遵守“核算单位为‘天’的假期只能申请全天假、半天假!” + //所以,只有在全天假和半天假时,leaveDurationMap中才会有请假天数信息;其他请假方式则会请假天数和请假小时数都有 + double totalLeaveDuration; + double leaveDuration; + if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { + totalLeaveDuration = totalLeaveDays; + leaveDuration = leaveDays; + } else { + totalLeaveDuration = totalLeaveHours; + leaveDuration = leaveHours; + } boolean jqlxEdited; for (Map holidayBalance : holidayBalancefilterList) { String jqlxId = holidayBalance.get("jqid").toString(); @@ -1362,7 +1658,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic //2-如果编辑记录中不存在,则需要判断是否满足最小使用时长 if (!minLeaveDurationSign) { String minLeaveDuration = Util.null2String(holidayBalance.get("minLeaveDuration")); - minLeaveDurationSign = "".equals(minLeaveDuration) || totalLeaveDuration >= Double.parseDouble(minLeaveDuration) * multipleNum; + minLeaveDurationSign = "".equals(minLeaveDuration) || totalLeaveDuration >= Double.parseDouble(minLeaveDuration); } //不满足最小使用时长,直接执行下一条 if (!minLeaveDurationSign) { @@ -1370,7 +1666,6 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } //额定未休时长 double wxsc = "".equals(Util.null2String(holidayBalance.get("wxsc"))) ? 0 : Double.parseDouble(holidayBalance.get("wxsc").toString()); - wxsc = multipleNum * wxsc; if (leaveDuration > 0 && wxsc > 0) { detailData.put("qjlx", jqlxId); detailData.put("qjlxName", jqlxIdToNameInfo.get(jqlxId)); @@ -1386,8 +1681,7 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } else { detailData.put("qjsc", String.valueOf(leaveDuration)); wxsc = Utils.subtract(wxsc, leaveDuration); - //可能存在倍数转换 - wxsc = Utils.divide(wxsc, multipleNum); + totalLeaveDuration = Utils.subtract(totalLeaveDuration, leaveDuration); detailData.put("jqye", holidayBalance.get("id").toString() + "_" + leaveDuration); leaveDuration = 0; @@ -1410,9 +1704,18 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic } } - - leaveDurationMap.put("totalLeaveDuration", totalLeaveDuration); - leaveDurationMap.put("leaveDuration", leaveDuration); + if (hsdw.equals(AccountingUnitEnum.DAY.getKey())) { + //假别核算单位为‘天’时,需要更新leaveDurationMap中的请假天数和请假小时数 + leaveDurationMap.put("totalLeaveDays", totalLeaveDuration); + leaveDurationMap.put("leaveDays", leaveDuration); + double ratedDayHours = dateToRatedHours.getOrDefault(detailData.get("ksrq"), 8.0); + leaveDurationMap.put("totalLeaveHours", totalLeaveHours - (leaveDays - leaveDuration) * ratedDayHours); + leaveDurationMap.put("leaveHours", leaveHours - (leaveDays - leaveDuration) * ratedDayHours); + } else { + //假别核算单位为‘小时’时,只需要更新leaveDurationMap中的请假小时数 + leaveDurationMap.put("totalLeaveHours", totalLeaveDuration); + leaveDurationMap.put("leaveHours", leaveDuration); + } } @@ -1467,16 +1770,9 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic String hsdw = Util.null2String(holidayItem.get("hsdw")); //假期额度的额度单位,0-天、1-小时 String eddw = Util.null2String(jqedInfo.get("eddw")); - int multiple = 1; - if (eddw.equals(AccountingUnitEnum.DAY.getKey())) { - multiple = 8; - } - //单次最小休时长 + //单次最小休时长,20241118需求变更,时长不进行倍率转换,按照原本核算单位进行收集 String minDuration = Util.null2String(jqedInfo.get("dczskxsc")); - Double minLeaveDuration = null; - if (!"".equals(eddw) && !"".equals(minDuration)) { - minLeaveDuration = Double.parseDouble(minDuration) * multiple; - } + Double minLeaveDuration = !"".equals(minDuration) ? Double.parseDouble(minDuration) : null; //额度可修次数 String allowLeaveNumStr = Util.null2String(jqedInfo.get("edbxdcxw")); if (!"".equals(allowLeaveNumStr) && holidayBalanceList.size() > 0) { @@ -1515,16 +1811,17 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic for (Map holidayBalance : holidayBalanceList) { String jqyeId = Util.null2String(holidayBalance.get("id")); if (!unableUseJqyeIdList.contains(jqyeId)) { - double wxsc = Utils.convertDouble(holidayBalance.get("wxsc")) * multiple; + //20241118需求变更,时长不进行核算单位倍率转换,按照原本核算单位进行收集 + double wxsc = Utils.convertDouble(holidayBalance.get("wxsc")); //如果该条假期余额可以预支,则在原有未休时长基础上增加预支时长 if ("1".equals(allowAdvance) && maxYqsxrqMap != null && Util.null2String(maxYqsxrqMap.get("id")).equals(jqyeId)) { - wxsc = wxsc + Utils.convertDouble(advanceSc) * multiple; + wxsc = wxsc + Utils.convertDouble(advanceSc); } double editedUseSc = Utils.convertDouble(editedUseJqed.get(jqyeId)); double realWxsc = wxsc - editedUseSc; if ((minLeaveDuration == null || wxsc >= minLeaveDuration) && realWxsc > 0) { - holidayBalance.put("wxsc", Utils.divide(realWxsc, multiple)); - holidayBalance.put("minLeaveDuration", minLeaveDuration == null ? null : Utils.divide(minLeaveDuration, multiple)); + holidayBalance.put("wxsc", realWxsc); + holidayBalance.put("minLeaveDuration", minLeaveDuration); holidayBalance.put("eddw", eddw); holidayBalance.put("hsdw", hsdw); holidayBalance.put("jbPriorityValue", jbPriorityValue); diff --git a/workflow/request/hrmattendance/HrmjucailAskForLeave_e9.jsp b/workflow/request/hrmattendance/HrmjucailAskForLeave_e9.jsp index 5ab40bc..42654e9 100644 --- a/workflow/request/hrmattendance/HrmjucailAskForLeave_e9.jsp +++ b/workflow/request/hrmattendance/HrmjucailAskForLeave_e9.jsp @@ -19,6 +19,9 @@ jssj: WfForm.getFieldValue(WfForm.convertFieldNameToId("jssj")), cxjqj: WfForm.getFieldValue(WfForm.convertFieldNameToId("cxjqj")), yesygz: WfForm.getFieldValue(WfForm.convertFieldNameToId("yesygz")), + sxwxz: WfForm.getFieldValue(WfForm.convertFieldNameToId("sxwxz")), + kssd: WfForm.getFieldValue(WfForm.convertFieldNameToId("kssd")), + jssd: WfForm.getFieldValue(WfForm.convertFieldNameToId("jssd")), qjsc: WfForm.getFieldValue(WfForm.convertFieldNameToId("qjsc")) } diff --git a/workflow/request/hrmattendance/HrmjucailBatchAskForLeave_e9.jsp b/workflow/request/hrmattendance/HrmjucailBatchAskForLeave_e9.jsp index 05a1997..33ba1b9 100644 --- a/workflow/request/hrmattendance/HrmjucailBatchAskForLeave_e9.jsp +++ b/workflow/request/hrmattendance/HrmjucailBatchAskForLeave_e9.jsp @@ -20,6 +20,9 @@ jssj: WfForm.getFieldValue(WfForm.convertFieldNameToId("jssj")), cxjqj: WfForm.getFieldValue(WfForm.convertFieldNameToId("cxjqj")), yesygz: WfForm.getFieldValue(WfForm.convertFieldNameToId("yesygz")), + sxwxz: WfForm.getFieldValue(WfForm.convertFieldNameToId("sxwxz")), + kssd: WfForm.getFieldValue(WfForm.convertFieldNameToId("kssd")), + jssd: WfForm.getFieldValue(WfForm.convertFieldNameToId("jssd")), qjsc: WfForm.getFieldValue(WfForm.convertFieldNameToId("qjsc")) }