考勤,出勤津贴数据生成功能变更,适配出勤结果中进出时间格式变化

zm_dev
sy 12 months ago
parent a270e20e92
commit 4208d755ad

@ -13,7 +13,9 @@ import weaver.general.BaseBean;
import weaver.general.Util;
import java.time.Duration;
import java.time.LocalTime;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -29,6 +31,12 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
Map<String, Object> result = new HashMap<>();
try {
//获取指定生成的人员id列表如果没有则生成所有人
String checkEmpIds = Util.null2String(params.get("empIds"));
List<String> checkEmpIdList = new ArrayList<>();
if (!checkEmpIds.equals("")) {
checkEmpIdList = Arrays.asList(checkEmpIds.split(","));
}
//获取modeId考勤方案的modeId
Map<String,String> formmodeIdMap = Utils.getFormmodeIdMap();
String modeId = formmodeIdMap.get("uf_jcl_kq_kqfa");
@ -55,9 +63,6 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
String dataId = map.get("id").toString();
//获取方案适用的人员id列表
List<String> empIdList = CommonUtil.getEmpIds(dataId, modeId);
bs.writeLog("dataId : " + dataId);
bs.writeLog("modeId : " + modeId);
bs.writeLog("empIdList : " + empIdList);
//获取津贴类型的考勤项目
String dtSql = "select * from uf_jcl_kq_kqfa_dt1 a left join uf_jcl_kq_kqxm b on b.id = a.kqxm where a.mainid = " + dataId
+ " and b.xmlx = " + AttendanceItemTypeEnum.ALLOWANCE.getKey();
@ -113,15 +118,15 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
});
}
}
bs.writeLog("targetEmpIdList : " + targetEmpIdList);
bs.writeLog("targetAllowanceIdList : " + targetAllowanceIdList);
bs.writeLog("targetBcIdList : " + targetBcIdList);
//获取出勤结果,遍历处理津贴信息
String startDate = Util.null2String(params.get("startDate"));
String endDate = Util.null2String(params.get("endDate"));
List<Map<String, Object>> cqData = new ArrayList<>();
//如果入参中选中了人员,则只处理选中的人
if (checkEmpIdList.size() > 0) {
List<String> finalCheckEmpIdList = checkEmpIdList;
targetEmpIdList = targetEmpIdList.stream().filter(f -> finalCheckEmpIdList.contains(f)).collect(Collectors.toList());
}
if (targetEmpIdList.size() > 0 && targetBcIdList.size() > 0) {
//去重
targetBcIdList = targetBcIdList.stream().distinct().collect(Collectors.toList());
@ -131,9 +136,6 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
cqData = DbTools.getSqlToList(cqSql);
}
bs.writeLog("cqData_size : " + cqData.size());
bs.writeLog("empIdWithAllowanceInfo : " + empIdWithAllowanceInfo);
bs.writeLog("bcWithAllowanceInfo : " + bcWithAllowanceInfo);
bs.writeLog("allowanceIdWithKqxmInfo : " + allowanceIdWithKqxmInfo);
//获取待新增的津贴数据
List<Map<String, String>> allowanceInfoList = createAllowanceInfo(cqData, empIdWithAllowanceInfo, bcWithAllowanceInfo, allowanceIdWithKqxmInfo);
bs.writeLog("allowanceInfoList_size : " + allowanceInfoList.size());
@ -188,13 +190,10 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
Map<String, String> allowanceInfoItem;
//获取加班类型的考勤项目并构建项目id和核算单位映射关系
Map<String, String> jbKqxmUnitInfo = collectKqxmUnitInfo(AttendanceItemTypeEnum.WORK_OVERTIME.getKey());
bs.writeLog("jbKqxmUnitInfo : " + jbKqxmUnitInfo);
//获取津贴类型的考勤项目并构建项目id和核算单位映射关系
Map<String, String> jtKqxmUnitInfo = collectKqxmUnitInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey());
bs.writeLog("jtKqxmUnitInfo : " + jtKqxmUnitInfo);
//获取津贴类型的考勤项目并构建项目id和核算量映射关系
Map<String, String> jtKqxmCountScaleInfo = collectKqxmCountScaleInfo(AttendanceItemTypeEnum.ALLOWANCE.getKey());
bs.writeLog("jtKqxmCountScaleInfo : " + jtKqxmCountScaleInfo);
//遍历出勤结果
for (Map<String, Object> map : cqData) {
String empId = map.get("ygid").toString();
@ -214,10 +213,8 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
}
//收集下出勤结果中项目1-8存在的项目id
List<String> kqxmIdsWithCq = collectKqxmIdsByCq(map);
bs.writeLog("kqxmIdsWithCq : " + kqxmIdsWithCq);
//收集下出勤结果中进出时间,仅收集进出两个时间点都有的数据
List<Map<String, String>> jcInfoList = collectJcInfoByCq(map);
bs.writeLog("jcInfoList : " + jcInfoList);
//收集下出勤结果中项目1-8中累积的加班时长处理成分钟数
Integer overtimeMinutes = collectOvertimeMinutes(map, jbKqxmUnitInfo);
bs.writeLog("overtimeMinutes : " + overtimeMinutes);
@ -227,23 +224,25 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
double cqsc = Util.null2String(map.get("cqsc")).equals("") ? 0 : Double.parseDouble(map.get("cqsc").toString());
//获取班次班段时间范围
List<Map<String, String>> bcTimeRangeList = collectBcTimeRangeInfo(Util.null2String(map.get("bcbdxx")));
bs.writeLog("bcTimeRangeList : " + bcTimeRangeList);
//遍历该出勤结果中班次、人员都关联的津贴项目
for(String allowanceId : allowanceIdsByBc) {
Map<String, Object> allowanceInfo = allowanceIdWithKqxmInfo.get(allowanceId);
bs.writeLog("allowanceInfo : " + allowanceInfo);
//项目1-8中出现以下考勤项目时津贴失效
String banKqxm = Util.null2String(allowanceInfo.get("bxsdxm"));
List<String> banKqxmList = new ArrayList<>();
if (!banKqxm.equals("")) {
banKqxmList = Arrays.asList(banKqxm.split(","));
}
//出勤日期
String cqRq = Util.null2String(map.get("rq"));
//正常工作时长计入核算量_标识,0-否1-是
String includeDailyWorkHours = Util.null2String(allowanceInfo.get("ljbcngzsj"));
//检查特定时间点是否在岗_标识,0-否1-是
String checkOneTimeOnDuty = Util.null2String(allowanceInfo.get("xysjd"));
//特定在岗时间点
String onDutyTime = Util.null2String(allowanceInfo.get("sjd"));
//判断特定在岗时间点指向日期
String onDutyDate = getOnDutyDate(bcTimeRangeList, onDutyTime, cqRq);
//时间点之前的时长也计入核算量_标识,0-否1-是
String includeHoursBeforeDutyTime = Util.null2String(allowanceInfo.get("jljxysjdzqdsc"));
//起算分钟数(不包含)
@ -267,8 +266,10 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
//2-如果勾选“检查特定时间点是否在岗”,则需要判断员工当天“须要在岗的时间点”所设置的时间员工是否在岗
if (checkOneTimeOnDuty.equals("1") && !onDutyTime.equals("")) {
boolean onDuty = false;
//将特殊在岗时间点拼接上日期
String onDutyTimeWithDate = onDutyDate + " " + onDutyTime;
for (Map<String, String> jcInfo : jcInfoList) {
if (onDutyTime.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTime.compareTo(jcInfo.get("signOut")) <= 0) {
if (onDutyTimeWithDate.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTimeWithDate.compareTo(jcInfo.get("signOut")) <= 0) {
onDuty = true;
break;
}
@ -289,7 +290,7 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
countMinutes = countMinutes + cqsc * 60;
}
} else {
countMinutes = getMinutesWithAfterPointTime(bcTimeRangeList, jcInfoList, overtimeMinutes, onDutyTime, includeDailyWorkHours);
countMinutes = getMinutesWithAfterPointTime(cqRq, bcTimeRangeList, jcInfoList, overtimeMinutes, onDutyTimeWithDate, includeDailyWorkHours);
}
} else {
//未勾选“检查特定时间点是否在岗”
@ -331,13 +332,13 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
allowanceInfoItem = new HashMap<>();
allowanceInfoItem.put("szjg", Util.null2String(map.get("szjg")));
allowanceInfoItem.put("yg", Util.null2String(map.get("ygid")));
allowanceInfoItem.put("rq", Util.null2String(map.get("rq")));
allowanceInfoItem.put("rq", cqRq);
allowanceInfoItem.put("bc", Util.null2String(map.get("bc")));
allowanceInfoItem.put("jtlx", allowanceId);
if (!allowanceUnit.equals(AccountingUnitEnum.ONCE.getKey())) {
allowanceInfoItem.put("sc", String.format("%.2f", sc));
} else {
allowanceInfoItem.put("sc", "0");
allowanceInfoItem.put("sc", "1");
}
allowanceInfoList.add(allowanceInfoItem);
}
@ -348,17 +349,49 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
return allowanceInfoList;
}
/**
*
* @param bcTimeRangeList
* @param onDutyTime
* @param cqRq
* @return
*/
private String getOnDutyDate(List<Map<String, String>> bcTimeRangeList, 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 (currentDateSign) {
return cqRq;
} else {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 时间格式
LocalDate date = LocalDate.parse(cqRq, formatter); // 解析为LocalDate对象
LocalDate nextDay = date.plusDays(1); // 将日期加一天
return nextDay.format(formatter);
}
}
/**
*
*
* 1-
* 2-
* @param overtimeMinutes
* @param onDutyTime
* @param onDutyTimeWithDate
* @return
*/
private double getMinutesWithAfterPointTime(List<Map<String, String>> bcTimeRangeList, List<Map<String, String>> jcInfoList,
Integer overtimeMinutes, String onDutyTime, String includeDailyWorkHours) {
private double getMinutesWithAfterPointTime(String cqRq, List<Map<String, String>> bcTimeRangeList, List<Map<String, String>> jcInfoList,
Integer overtimeMinutes, String onDutyTimeWithDate, String includeDailyWorkHours) {
double bcOnDutyMinutes = 0;
double realOverWorkMinutes = 0;
if (includeDailyWorkHours.equals("1")) {
@ -369,8 +402,9 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
for (Map<String, String> bcTime : bcTimeRangeList) {
String realStartTime = "";
String realEndTime = "";
String startTime = bcTime.get("startTime");
String endTime = bcTime.get("endTime");
//给班次时间拼接下出勤日期
String startTime = cqRq + " " + bcTime.get("startTime");
String endTime = cqRq + " " + bcTime.get("endTime");
for (Map<String, String> jcTime : jcInfoList) {
String signInTime = jcTime.get("signIn");
String signOutTime = jcTime.get("signOut");
@ -400,19 +434,19 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
}
//遍历获取班次班段时间内的累计时长(某一在岗时间点之后的时间)
for (Map<String, String> bcRealTimeInfo : bcRealOnDutyTimeRange) {
if (onDutyTime.compareTo(bcRealTimeInfo.get("startTime")) <= 0) {
if (onDutyTimeWithDate.compareTo(bcRealTimeInfo.get("startTime")) <= 0) {
bcOnDutyMinutes = bcOnDutyMinutes + getMinutesByTwo(bcRealTimeInfo.get("startTime"), bcRealTimeInfo.get("endTime"));
} else if (onDutyTime.compareTo(bcRealTimeInfo.get("startTime")) >= 0 && onDutyTime.compareTo(bcRealTimeInfo.get("endTime")) <= 0) {
bcOnDutyMinutes = bcOnDutyMinutes + getMinutesByTwo(onDutyTime, bcRealTimeInfo.get("endTime"));
} else if (onDutyTimeWithDate.compareTo(bcRealTimeInfo.get("startTime")) >= 0 && onDutyTimeWithDate.compareTo(bcRealTimeInfo.get("endTime")) <= 0) {
bcOnDutyMinutes = bcOnDutyMinutes + getMinutesByTwo(onDutyTimeWithDate, bcRealTimeInfo.get("endTime"));
}
}
}
//判断在岗时间点和加班时间区间的关系,即进出打卡记录是否与在岗时间点有包含关系,分情况累计时间
for (Map<String, String> jcInfo : jcInfoList) {
if (onDutyTime.compareTo(jcInfo.get("signIn")) <= 0) {
if (onDutyTimeWithDate.compareTo(jcInfo.get("signIn")) <= 0) {
realOverWorkMinutes = realOverWorkMinutes + getMinutesByTwo(jcInfo.get("signIn"), jcInfo.get("signOut"));
} else if (onDutyTime.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTime.compareTo(jcInfo.get("signOut")) <= 0) {
realOverWorkMinutes = realOverWorkMinutes + getMinutesByTwo(onDutyTime, jcInfo.get("signOut"));
} else if (onDutyTimeWithDate.compareTo(jcInfo.get("signIn")) >= 0 && onDutyTimeWithDate.compareTo(jcInfo.get("signOut")) <= 0) {
realOverWorkMinutes = realOverWorkMinutes + getMinutesByTwo(onDutyTimeWithDate, jcInfo.get("signOut"));
}
}
//实际加班时长累计的核算分钟数不可以超过项目1-8累计的加班时长分钟数
@ -423,12 +457,31 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
}
private double getMinutesByTwo(String startTime, String endTime) {
LocalTime time1 = LocalTime.of(Integer.parseInt(startTime.split(":")[0]), Integer.parseInt(startTime.split(":")[1]));
LocalTime time2 = LocalTime.of(Integer.parseInt(endTime.split(":")[0]), Integer.parseInt(endTime.split(":")[1]));
Duration duration = Duration.between(time1, time2);
List<String> startInfoList = Arrays.asList(startTime.split("\\s+|-|:"));
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", "")));
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", "")));
Duration duration = Duration.between(dateTime1, dateTime2);
// 获取分钟数
return duration.toMinutes();
}
public static String replaceFirstChar(String original, String target, String replacement) {
int index = original.indexOf(target);
if (index == -1) {
return original; // 如果没有找到目标字符,返回原字符串
}
return original.substring(0, index) + replacement + original.substring(index + 1);
}
private List<Map<String, String>> collectBcTimeRangeInfo(String bcbdxx) {
List<Map<String, String>> timeRangeInfo = new ArrayList<>();
@ -489,140 +542,36 @@ public class AllowanceServiceImpl extends Service implements AllowanceService {
private List<Map<String, String>> collectJcInfoByCq(Map<String, Object> cqMap) {
List<Map<String, String>> jcInfoList = new ArrayList<>();
String j1 = Util.null2String(cqMap.get("j1"));
String j2 = Util.null2String(cqMap.get("j2"));
String j3 = Util.null2String(cqMap.get("j3"));
String j4 = Util.null2String(cqMap.get("j4"));
String j5 = Util.null2String(cqMap.get("j5"));
String j6 = Util.null2String(cqMap.get("j6"));
String j7 = Util.null2String(cqMap.get("j7"));
String j8 = Util.null2String(cqMap.get("j8"));
String c1 = Util.null2String(cqMap.get("c1"));
String c2 = Util.null2String(cqMap.get("c2"));
String c3 = Util.null2String(cqMap.get("c3"));
String c4 = Util.null2String(cqMap.get("c4"));
String c5 = Util.null2String(cqMap.get("c5"));
String c6 = Util.null2String(cqMap.get("c6"));
String c7 = Util.null2String(cqMap.get("c7"));
String c8 = Util.null2String(cqMap.get("c8"));
String singIn = "";
String signOut = "";
Map<String, String> itemMap;
if (!j1.equals("") && !c1.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j1.substring(0, 5));
itemMap.put("signOut", c1.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j2.equals("") && !c2.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j2.substring(0, 5));
itemMap.put("signOut", c2.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j3.equals("") && !c3.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j3.substring(0, 5));
itemMap.put("signOut", c3.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j4.equals("") && !c4.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j4.substring(0, 5));
itemMap.put("signOut", c4.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j5.equals("") && !c5.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j5.substring(0, 5));
itemMap.put("signOut", c5.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j6.equals("") && !c6.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j6.substring(0, 5));
itemMap.put("signOut", c6.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j7.equals("") && !c7.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j7.substring(0, 5));
itemMap.put("signOut", c7.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
}
if (!j8.equals("") && !c8.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", j8.substring(0, 5));
itemMap.put("signOut", c8.substring(0, 5));
jcInfoList.add(itemMap);
} else {
return jcInfoList;
for (int i = 1; i <= 8; i++) {
singIn = Util.null2String(cqMap.get("j" + i));
signOut = Util.null2String(cqMap.get("c" + i));
if (!singIn.equals("") && !signOut.equals("")) {
itemMap = new HashMap<>();
itemMap.put("signIn", singIn.substring(0, 16));
itemMap.put("signOut", signOut.substring(0, 16));
jcInfoList.add(itemMap);
} else if (singIn.equals("") && signOut.equals("")){
break;
}
}
return jcInfoList;
}
private List<String> collectKqxmIdsByCq(Map<String, Object> cqMap) {
List<String> kqxmIdsWithCq = new ArrayList<>();
String xm1 = Util.null2String(cqMap.get("xm1"));
String xm2 = Util.null2String(cqMap.get("xm2"));
String xm3 = Util.null2String(cqMap.get("xm3"));
String xm4 = Util.null2String(cqMap.get("xm4"));
String xm5 = Util.null2String(cqMap.get("xm5"));
String xm6 = Util.null2String(cqMap.get("xm6"));
String xm7 = Util.null2String(cqMap.get("xm7"));
String xm8 = Util.null2String(cqMap.get("xm8"));
if (!xm1.equals("")) {
kqxmIdsWithCq.add(xm1);
} else {
return kqxmIdsWithCq;
}
if (!xm2.equals("")) {
kqxmIdsWithCq.add(xm2);
} else {
return kqxmIdsWithCq;
}
if (!xm3.equals("")) {
kqxmIdsWithCq.add(xm3);
} else {
return kqxmIdsWithCq;
}
if (!xm4.equals("")) {
kqxmIdsWithCq.add(xm4);
} else {
return kqxmIdsWithCq;
}
if (!xm5.equals("")) {
kqxmIdsWithCq.add(xm5);
} else {
return kqxmIdsWithCq;
}
if (!xm6.equals("")) {
kqxmIdsWithCq.add(xm6);
} else {
return kqxmIdsWithCq;
}
if (!xm7.equals("")) {
kqxmIdsWithCq.add(xm7);
} else {
return kqxmIdsWithCq;
}
if (!xm8.equals("")) {
kqxmIdsWithCq.add(xm8);
} else {
return kqxmIdsWithCq;
String xmId = "";
for (int i = 1; i <= 8; i++) {
xmId = Util.null2String(cqMap.get("xm" + i));
if (!xmId.equals("")) {
kqxmIdsWithCq.add(xmId);
} else {
break;
}
}
return kqxmIdsWithCq;
}
}

Loading…
Cancel
Save