diff --git a/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java b/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java index 7c49d77..2448b5d 100644 --- a/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java +++ b/src/com/engine/attendance/workflow/service/impl/AllowanceServiceImpl.java @@ -2,6 +2,8 @@ package com.engine.attendance.workflow.service.impl; import com.engine.attendance.enums.AccountingUnitEnum; import com.engine.attendance.enums.AttendanceItemTypeEnum; +import com.engine.attendance.enums.ClassBelongToEnum; +import com.engine.attendance.enums.ClassSegmentTypeEnum; import com.engine.attendance.workflow.service.AllowanceService; import com.engine.common.util.CommonUtil; import com.engine.common.util.DateUtil; @@ -207,6 +209,10 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { Map jtKqxmUnitInfo = collectKqxmUnitInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey()); //获取津贴类型的考勤项目,并构建项目id和核算量映射关系 Map jtKqxmCountScaleInfo = collectKqxmCountScaleInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey()); + //获取班次对应的班段明细数据 + Map>> shiftIdToDetailInfo = collectShiftIdToDetailInfo(); + //获取班次对应的开始时间 + Map shiftIdToStartInfo = collectShiftIdToStartInfo(); //遍历出勤结果 for (Map map : cqData) { String empId = map.get("ygid").toString(); @@ -235,8 +241,10 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { double countMinutes = 0; //出勤时长 double cqsc = Util.null2String(map.get("cqsc")).equals("") ? 0 : Double.parseDouble(map.get("cqsc").toString()); + //出勤日期 + String cqRq = Util.null2String(map.get("rq")); //获取班次班段时间范围,todo,出勤结果中班次班段数据要考虑到跨天情况 - List> bcTimeRangeList = collectBcTimeRangeInfo(Util.null2String(map.get("bcbdxx"))); + List> bcTimeRangeList = collectBcTimeRangeInfo(shiftIdToDetailInfo.get(bc), cqRq); //遍历该出勤结果中班次、人员都关联的津贴项目 for(String allowanceId : allowanceIdsByBc) { Map allowanceInfo = allowanceIdWithKqxmInfo.get(allowanceId); @@ -248,8 +256,6 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { } //是否需要审核标识,,0-否,1-是 String checkSign = Util.null2String(allowanceInfo.get("sfxysh")); - //出勤日期 - String cqRq = Util.null2String(map.get("rq")); //正常工作时长计入核算量_标识,0-否,1-是 String includeDailyWorkHours = Util.null2String(allowanceInfo.get("ljbcngzsj")); //检查特定时间点是否在岗_标识,0-否,1-是 @@ -257,7 +263,7 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { //特定在岗时间点 String onDutyTime = Util.null2String(allowanceInfo.get("sjd")); //判断特定在岗时间点指向日期 - String onDutyDate = getOnDutyDate(bcTimeRangeList, onDutyTime, cqRq); + String onDutyDate = getOnDutyDate(shiftIdToStartInfo.get(bc), onDutyTime, cqRq); //时间点之前的时长也计入核算量_标识,0-否,1-是 String includeHoursBeforeDutyTime = Util.null2String(allowanceInfo.get("jljxysjdzqdsc")); //起算分钟数(不包含) @@ -366,27 +372,45 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { return allowanceInfoList; } + private Map collectShiftIdToStartInfo() { + Map shiftIdToStartInfo = new HashMap<>(); + String sql = "select * from uf_jcl_kq_bcxx"; + List> data = DbTools.getSqlToList(sql); + for (Map item : data) { + shiftIdToStartInfo.put(item.get("id").toString(), item.get("kssj").toString()); + } + return shiftIdToStartInfo; + } /** - * 获取当前出勤数据指向的津贴所属日期 - * @param bcTimeRangeList 班次班段时间区间 + * 获取班次明细表中班段类型为工作时段的数据,并映射成key为班次id的对象 + * @return + */ + private Map>> collectShiftIdToDetailInfo() { + Map>> shiftIdToDetailInfo = new HashMap<>(); + String sql = "select * from uf_jcl_kq_bcxx_dt1 where bdlx = " + ClassSegmentTypeEnum.WORK_TIME.getKey(); + List> detailList = DbTools.getSqlToList(sql); + if (detailList.size() > 0) { + shiftIdToDetailInfo = detailList.stream().collect(Collectors.groupingBy( + map -> (String) map.get("mainid"), + Collectors.mapping(map -> map, Collectors.toList()))); + } + return shiftIdToDetailInfo; + + } + + + /** + * 特定在岗时间点指向日期 + * @param bcStartTime 班次开始时间 * @param onDutyTime 特殊在岗时间点 * @param cqRq 出勤结果中出勤日期 * @return */ - private String getOnDutyDate(List> bcTimeRangeList, String onDutyTime, String cqRq) { + private String getOnDutyDate(String bcStartTime, String onDutyTime, String cqRq) { boolean currentDateSign = false; - if (!onDutyTime.equals("")) { - for (Map bcTime : bcTimeRangeList) { - if (currentDateSign) { - break; - } - if (onDutyTime.compareTo(bcTime.get("startTime")) >= 0) { - currentDateSign = true; - } - } - } else { - return cqRq; + if ("".equals(onDutyTime) || onDutyTime.compareTo(bcStartTime) >= 0) { + currentDateSign = true; } if (currentDateSign) { return cqRq; @@ -419,9 +443,9 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { for (Map bcTime : bcTimeRangeList) { String realStartTime = ""; String realEndTime = ""; - //给班次时间拼接下出勤日期 - String startTime = cqRq + " " + bcTime.get("startTime"); - String endTime = cqRq + " " + bcTime.get("endTime"); + //取班次开始和结束时间 + String startTime = bcTime.get("startTime"); + String endTime = bcTime.get("endTime"); for (Map jcTime : jcInfoList) { String signInTime = jcTime.get("signIn"); String signOutTime = jcTime.get("signOut"); @@ -478,39 +502,72 @@ public class AllowanceServiceImpl extends Service implements AllowanceService { List endInfoList = Arrays.asList(endTime.split("\\s+|-|:")); LocalDateTime dateTime1 = LocalDateTime.of(Integer.parseInt(startInfoList.get(0)), - Integer.parseInt(replaceFirstChar(startInfoList.get(1),"0", "")), - Integer.parseInt(replaceFirstChar(startInfoList.get(2),"0", "")), - Integer.parseInt(replaceFirstChar(startInfoList.get(3),"0", "")), - Integer.parseInt(replaceFirstChar(startInfoList.get(4),"0", ""))); + Integer.parseInt(replaceFirstChar(startInfoList.get(1),"0")), + Integer.parseInt(replaceFirstChar(startInfoList.get(2),"0")), + Integer.parseInt(replaceFirstChar(startInfoList.get(3),"0")), + Integer.parseInt(replaceFirstChar(startInfoList.get(4),"0"))); LocalDateTime dateTime2 = LocalDateTime.of(Integer.parseInt(endInfoList.get(0)), - Integer.parseInt(replaceFirstChar(endInfoList.get(1),"0", "")), - Integer.parseInt(replaceFirstChar(endInfoList.get(2),"0", "")), - Integer.parseInt(replaceFirstChar(endInfoList.get(3),"0", "")), - Integer.parseInt(replaceFirstChar(endInfoList.get(4),"0", ""))); + Integer.parseInt(replaceFirstChar(endInfoList.get(1),"0")), + Integer.parseInt(replaceFirstChar(endInfoList.get(2),"0")), + Integer.parseInt(replaceFirstChar(endInfoList.get(3),"0")), + Integer.parseInt(replaceFirstChar(endInfoList.get(4),"0"))); Duration duration = Duration.between(dateTime1, dateTime2); // 获取分钟数 return duration.toMinutes(); } - public static String replaceFirstChar(String original, String target, String replacement) { + public static String replaceFirstChar(String original, String target) { int index = original.indexOf(target); - if (index == -1) { + if ("00".equals(original) || index == -1) { return original; // 如果没有找到目标字符,返回原字符串 + } else if (index == 0) { + return original.substring(1); + } else { + return original; } - return original.substring(0, index) + replacement + original.substring(index + 1); } - private List> collectBcTimeRangeInfo(String bcbdxx) { + /** + * 根据班次班段详细数据中 + * 班段类型、归属日、班段开始结束时间获取班段中多个年月日时分的时间点 + * @return + */ + private List> collectBcTimeRangeInfo(List> bcDetailList, String cqRq) { List> timeRangeInfo = new ArrayList<>(); - if (!bcbdxx.equals("")) { - List rangeList = Arrays.asList(bcbdxx.split("\\|")); +// if (!bcbdxx.equals("")) { +// List rangeList = Arrays.asList(bcbdxx.split("\\|")); +// Map itemMap; +// for (String range : rangeList) { +// String[] timeInfo = range.split("-"); +// itemMap = new HashMap<>(); +// itemMap.put("startTime", timeInfo[0]); +// itemMap.put("endTime", timeInfo[1]); +// timeRangeInfo.add(itemMap); +// } +// } + if (bcDetailList != null && bcDetailList.size() > 0) { + String bcDate = ""; Map itemMap; - for (String range : rangeList) { - String[] timeInfo = range.split("-"); - itemMap = new HashMap<>(); - itemMap.put("startTime", timeInfo[0]); - itemMap.put("endTime", timeInfo[1]); - timeRangeInfo.add(itemMap); + for (Map detailItem : bcDetailList) { + bcDate = cqRq; + String belongDayType = Util.null2String(detailItem.get("gsrq")); + String startTime = Util.null2String(detailItem.get("kssj")); + String endTime = Util.null2String(detailItem.get("jssj")); + if (belongDayType.equals(ClassBelongToEnum.YESTERDAY.getKey())) { + bcDate = DateUtil.beforeDay(bcDate,1); + } else if (belongDayType.equals(ClassBelongToEnum.NEXTDAY.getKey())) { + bcDate = DateUtil.AfterDay(bcDate,1); + } + if (!"".equals(startTime) && !"".equals(endTime)) { + itemMap = new HashMap<>(); + itemMap.put("startTime", bcDate + " " + startTime); + if (startTime.compareTo(endTime) >= 0) { + itemMap.put("endTime", DateUtil.AfterDay(bcDate,1) + " " + endTime); + } else { + itemMap.put("endTime", bcDate + " " + endTime); + } + timeRangeInfo.add(itemMap); + } } } return timeRangeInfo;