考勤,出勤津贴数据生成功能中班次班段数据处理逻辑变更,直接从班次明细表中获取

zm_dev
sy 11 months ago
parent d759111b82
commit 118dfa9a65

@ -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<String, String> jtKqxmUnitInfo = collectKqxmUnitInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey());
//获取津贴类型的考勤项目并构建项目id和核算量映射关系
Map<String, String> jtKqxmCountScaleInfo = collectKqxmCountScaleInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey());
//获取班次对应的班段明细数据
Map<String, List<Map<String, Object>>> shiftIdToDetailInfo = collectShiftIdToDetailInfo();
//获取班次对应的开始时间
Map<String, String> shiftIdToStartInfo = collectShiftIdToStartInfo();
//遍历出勤结果
for (Map<String, Object> 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<Map<String, String>> bcTimeRangeList = collectBcTimeRangeInfo(Util.null2String(map.get("bcbdxx")));
List<Map<String, String>> bcTimeRangeList = collectBcTimeRangeInfo(shiftIdToDetailInfo.get(bc), cqRq);
//遍历该出勤结果中班次、人员都关联的津贴项目
for(String allowanceId : allowanceIdsByBc) {
Map<String, Object> 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<String, String> collectShiftIdToStartInfo() {
Map<String, String> shiftIdToStartInfo = new HashMap<>();
String sql = "select * from uf_jcl_kq_bcxx";
List<Map<String, Object>> data = DbTools.getSqlToList(sql);
for (Map<String, Object> item : data) {
shiftIdToStartInfo.put(item.get("id").toString(), item.get("kssj").toString());
}
return shiftIdToStartInfo;
}
/**
*
* @param bcTimeRangeList
* keyid
* @return
*/
private Map<String, List<Map<String, Object>>> collectShiftIdToDetailInfo() {
Map<String, List<Map<String, Object>>> shiftIdToDetailInfo = new HashMap<>();
String sql = "select * from uf_jcl_kq_bcxx_dt1 where bdlx = " + ClassSegmentTypeEnum.WORK_TIME.getKey();
List<Map<String, Object>> 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<Map<String, String>> bcTimeRangeList, String onDutyTime, String cqRq) {
private String getOnDutyDate(String bcStartTime, String onDutyTime, String cqRq) {
boolean currentDateSign = false;
if (!onDutyTime.equals("")) {
for (Map<String, String> 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<String, String> 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<String, String> jcTime : jcInfoList) {
String signInTime = jcTime.get("signIn");
String signOutTime = jcTime.get("signOut");
@ -478,39 +502,72 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
List<String> 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<Map<String, String>> collectBcTimeRangeInfo(String bcbdxx) {
/**
*
*
* @return
*/
private List<Map<String, String>> collectBcTimeRangeInfo(List<Map<String, Object>> bcDetailList, String cqRq) {
List<Map<String, String>> timeRangeInfo = new ArrayList<>();
if (!bcbdxx.equals("")) {
List<String> rangeList = Arrays.asList(bcbdxx.split("\\|"));
// if (!bcbdxx.equals("")) {
// List<String> rangeList = Arrays.asList(bcbdxx.split("\\|"));
// Map<String, String> 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<String, String> 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<String, Object> 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;

Loading…
Cancel
Save