|
|
|
@ -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 班次班段时间区间
|
|
|
|
|
* 获取班次明细表中班段类型为工作时段的数据,并映射成key为班次id的对象
|
|
|
|
|
* @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;
|
|
|
|
|