You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

733 lines
42 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.engine.jucailinkq.attendance.attendanceanalysis.wrapper;
import com.engine.jucailinkq.attendance.attendanceanalysis.dto.clockpoint.ClockPointDTO;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.*;
import com.engine.jucailinkq.attendance.attendanceanalysis.service.impl.*;
import com.engine.jucailinkq.attendance.enums.*;
import com.engine.jucailinkq.common.util.CommonUtil;
import com.engine.jucailinkq.common.util.DateUtil;
import com.engine.common.util.ServiceUtil;
import com.engine.jucailinkq.common.util.Utils;
import com.engine.core.impl.Service;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
public class UpdateAttendanceResultWrapper extends Service {
private AbnormalAttendanceService beLateService = ServiceUtil.getService(AbnormalAttendanceServiceImpl.class);
private ForgetClockInService forgetClockInService = ServiceUtil.getService(ForgetClockInServiceImpl.class);
private AskForLeaveService askForLeaveService= ServiceUtil.getService(AskForLeaveServiceImpl.class);
private EvectionService evectionService= ServiceUtil.getService(EvectionServiceImpl.class);
private WorkOverTimeService workOverTimeService = ServiceUtil.getService(WorkOverTimeServiceImpl.class);
private ComprehensiveWorkingHourService comprehensiveWorkingHourService = ServiceUtil.getService(ComprehensiveWorkingHourServiceImpl.class);
private AllowanceService allowanceService = ServiceUtil.getService(AllowanceServiceImpl.class);
private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class);
/**
* 记录异常打卡
* */
public List<Map<String,Object>> recordAbnormalClockIn(Map<String,Object> params){
//卡点
List<ClockPointDTO> clcokInTimeDataList = (List<ClockPointDTO>)params.get("clcokInTimeData");
//考勤项目
List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)params.get("attendanceItems");
//排班
List<Map<String, Object>> scheduleResult = (List<Map<String,Object>>)params.get("scheduleResult");
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//人员
String userId = Util.null2String(params.get("userId"));
//请假集合
List<Map<String,Object>> askForLeaveList = (List<Map<String,Object>>)params.get("askForLeaveList");
//请假项目
Map<String,Map<String,Object>> askForLeaveItems = (Map<String,Map<String,Object>>)params.get("askForLeaveItems");
//出差集合
List<Map<String,Object>> evectionList = (List<Map<String,Object>>)params.get("evectionList");
//出差项目
Map<String,Map<String,Object>> evectionItems = (Map<String,Map<String,Object>>)params.get("evectionItems");
//以开始时间分割班次
Map<String,List<Map<String, Object>>> startScheduleResult = scheduleResult.stream().collect(Collectors.groupingBy(e->Utils.getkssjTime(e,analysisDate)));
//以结束时间分割班次
Map<String,List<Map<String, Object>>> endScheduleResult = scheduleResult.stream().collect(Collectors.groupingBy(e->Utils.getjssjTime(e,analysisDate)));
List<Map<String,Object>> resultList = Lists.newArrayList();
for (ClockPointDTO clcokInTimedto :clcokInTimeDataList){
//当天打卡数据
Map<String,Object> clcokInTimeData = clcokInTimedto.getClockTime();
//需要计算的班次打卡时间点
String pointTime = clcokInTimedto.getClassTime();
//start开始打卡时间点end结束打卡时间点
ClockPointEnum pointType = clcokInTimedto.getPointType();
//empty:漏卡equal:打卡时间和班次时间相等before打卡时间在班次时间之前after打卡时间在班次时间之后
ClockPointEnum timeType = clcokInTimedto.getTimeType();
//是否是请假、外出打卡
boolean ifevectionOrAskLeave = false;
if (ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey().equals(clcokInTimedto.getClassSegmentType()) ||
ClassSegmentTypeEnum.EVECTION.getKey().equals(clcokInTimedto.getClassSegmentType())){
ifevectionOrAskLeave = true;
}
//班次
Map<String, Object> classInfo = Maps.newHashMap();
if (ClockPointEnum.START.equals(pointType) && !ifevectionOrAskLeave){
classInfo = startScheduleResult.get(pointTime).get(0);
}else if (ClockPointEnum.END.equals(pointType) && !ifevectionOrAskLeave){
classInfo = endScheduleResult.get(pointTime).get(0);
}else if (ClockPointEnum.START.equals(pointType) && ifevectionOrAskLeave){
classInfo = endScheduleResult.get(pointTime).get(0);
}else if (ClockPointEnum.END.equals(pointType) && ifevectionOrAskLeave){
classInfo = startScheduleResult.get(pointTime).get(0);
}
if (ClockPointEnum.EMPTY.equals(timeType) || clcokInTimeData == null){
//漏卡
Map<String,Object> missCardParams = Maps.newHashMap();
missCardParams.put("classInfo",classInfo);
missCardParams.put("clcokInTimeData",clcokInTimeData);
missCardParams.put("attendanceItems",attendanceItems);
missCardParams.put("analysisDate",analysisDate);
missCardParams.put("userId",userId);
missCardParams.put("point",clcokInTimedto);
missCardParams.put("scheduleResult",scheduleResult);
log.debug("missCardParams classInfo: [{}],clcokInTimeData:[{}]",classInfo,clcokInTimeData);
List<Map<String,Object>> iforgetClockIn = forgetClockInService.forgetClockIn(missCardParams);
if (iforgetClockIn.size() >0){
iforgetClockIn.get(0).put("pointTime",pointTime);
iforgetClockIn.get(0).put("pointType",clcokInTimedto.getPointType());
iforgetClockIn.get(0).put("bdlx",classInfo.get("bdlx"));
iforgetClockIn.get(0).put("clcokInTimeData",clcokInTimeData);
String workfor = Utils.getWorkFor(Util.null2String(classInfo.get("bdlx")));
String zysd = Util.null2String(iforgetClockIn.get(0).get("zysd"));
if (zysd.contains(workfor) || zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())){
iforgetClockIn.get(0).put("record",clcokInTimedto.isRecord());
}else {
iforgetClockIn.get(0).put("record",false);
}
resultList.add(iforgetClockIn.get(0));
}
}else if (ClockPointEnum.START.equals(pointType) && ClockPointEnum.AFTER.equals(timeType)){
//迟到
Map<String,Object> beLateParams = Maps.newHashMap();
beLateParams.put("classInfo",classInfo);
beLateParams.put("clcokInTimeData",clcokInTimeData);
beLateParams.put("attendanceItems",attendanceItems);
beLateParams.put("analysisDate",analysisDate);
beLateParams.put("userId",userId);
beLateParams.put("point",clcokInTimedto);
beLateParams.put("askForLeaveList",askForLeaveList);
beLateParams.put("askForLeaveItems",askForLeaveItems);
beLateParams.put("evectionList",evectionList);
beLateParams.put("evectionItems",evectionItems);
beLateParams.put("scheduleResult",scheduleResult);
log.debug("beLateParams classInfo: [{}],clcokInTimeData:[{}]",classInfo,clcokInTimeData);
List<Map<String,Object>> ifBeLate = beLateService.beLate(beLateParams);
if (ifBeLate.size() > 0){
ifBeLate.get(0).put("pointTime",pointTime);
ifBeLate.get(0).put("pointType",clcokInTimedto.getPointType());
ifBeLate.get(0).put("bdlx",classInfo.get("bdlx"));
ifBeLate.get(0).put("record",clcokInTimedto.isRecord());
ifBeLate.get(0).put("clcokInTimeData",clcokInTimeData);
resultList.add(ifBeLate.get(0));
}
}else if (ClockPointEnum.END.equals(pointType) && ClockPointEnum.BEFORE.equals(timeType)){
//早退
Map<String,Object> leaveEarlyParams = Maps.newHashMap();
leaveEarlyParams.put("classInfo",classInfo);
leaveEarlyParams.put("clcokInTimeData",clcokInTimeData);
leaveEarlyParams.put("attendanceItems",attendanceItems);
leaveEarlyParams.put("analysisDate",analysisDate);
leaveEarlyParams.put("userId",userId);
leaveEarlyParams.put("point",clcokInTimedto);
leaveEarlyParams.put("askForLeaveList",askForLeaveList);
leaveEarlyParams.put("askForLeaveItems",askForLeaveItems);
leaveEarlyParams.put("evectionList",evectionList);
leaveEarlyParams.put("evectionItems",evectionItems);
leaveEarlyParams.put("scheduleResult",scheduleResult);
log.debug("leaveEarlyParams classInfo: [{}],clcokInTimeData:[{}]",classInfo,clcokInTimeData);
List<Map<String,Object>> ifLeaveEarly = beLateService.leaveEarly(leaveEarlyParams);
if (ifLeaveEarly.size() > 0){
ifLeaveEarly.get(0).put("pointTime",pointTime);
ifLeaveEarly.get(0).put("pointType",clcokInTimedto.getPointType());
ifLeaveEarly.get(0).put("bdlx",classInfo.get("bdlx"));
ifLeaveEarly.get(0).put("record",clcokInTimedto.isRecord());
ifLeaveEarly.get(0).put("clcokInTimeData",clcokInTimeData);
resultList.add(ifLeaveEarly.get(0));
}
}
}
if (resultList.size() > 0){
//漏打卡转旷工
Map<String,Object> forgetParam = Maps.newHashMap();
forgetParam.put("abnormalList",resultList);
forgetParam.put("scheduleResult",scheduleResult);
forgetParam.put("attendanceItems",attendanceItems);
forgetParam.put("analysisDate",analysisDate);
resultList = forgetClockInService.forgetConvertAbsenteeism(forgetParam);
}
log.debug("abnormalClockInList : [{}]",resultList);
return resultList;
}
/**
* 记录加班
* @param params
* @return
*/
public Map<String, Object> recordWorkOverTime(Map<String,Object> params){
return workOverTimeService.recordWorkOverTime(params);
}
/**
* 请假
* @param params
* @return
*/
public Map<String, Object> recordAskForLeave(Map<String,Object> params){
//请假项目
Map<String,Map<String,Object>> askForLeaveItems = (Map<String,Map<String,Object>>)params.get("askForLeaveItems");
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//排班
List<Map<String, Object>> scheduleResult = (List<Map<String,Object>>)params.get("scheduleResult");
//请假记录
List<Map<String, Object>> askForLeaveList = (List<Map<String,Object>>)params.get("askForLeaveList");
//异常记录
List<Map<String,Object>> abnormalClockInList = (List<Map<String,Object>>)params.get("abnormalClockInList");
//请假抵消异常
List<Map<String,Object>> offsetAskForLeaveAnomaly = Lists.newArrayList();
//请假-抵消异常
Map<Map<String, Object>,List<Map<String, Object>>> askForLeaveToOffsetAbnomaly = Maps.newHashMap();
Map<String, Object> map = Maps.newHashMap();
List<Map<String, Object>> resultList = Lists.newArrayList();
for (int i=0;i<askForLeaveList.size();i++){
Map<String, Object> resultMap = Maps.newHashMap();
String kssj = askForLeaveList.get(i).get("ksrq") + " "+askForLeaveList.get(i).get("kssj");
String jssj = askForLeaveList.get(i).get("jsrq")+ " "+askForLeaveList.get(i).get("jssj");
//半天请假
String btj = Util.null2String(askForLeaveList.get(i).get("btj"));
//请假时长
String qjsc = Util.null2String(askForLeaveList.get(i).get("qjsc"));
//请假项目
Map<String,Object> askForLeaveItem = askForLeaveItems.get(askForLeaveList.get(i).get("jqlx"));
//自动移除时间区间内的非工作时长
String zdycbcndfgzsd = Util.null2String(askForLeaveItem.get("zdycbcndfgzsd"));
//半天规则
String btgz = Util.null2String(scheduleResult.get(0).get("btgz"));
//同一天可抵消多个异常
String tybcndbjlhbjs = Util.null2String(askForLeaveItem.get("tybcndbjlhbjs"));
//作用时段
String zysd = Util.null2String(askForLeaveItem.get("zysd"));
//核算量
double hsl = Double.valueOf(Util.null2String(askForLeaveItem.get("hsl")));
//额定时长
double edsc = Double.valueOf(scheduleResult.get(0).get("edsc").toString());
//核算单位
String hsdw = Util.null2String(askForLeaveItem.get("hsdw"));
//是否分组呈现
String sffzcx = Util.null2String(askForLeaveItem.get("sffzcx"));
//请假时长分钟数
int qjscMinute = "".equals(qjsc)?0:Double.valueOf(CommonUtil.convertToMinute(hsdw,qjsc,edsc)).intValue();
if (!sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
resultMap.put("item",askForLeaveList.get(i).get("jqlx"));
resultList.add(resultMap);
}
Map<String,Object> param = Maps.newHashMap();
param.put("abnormalClockInList",abnormalClockInList);
param.put("zysd",zysd);
param.put("scheduleResult",scheduleResult);
param.put("analysisDate",analysisDate);
param.put("askForLeaveItem",askForLeaveItem);
double itemduration = 0;
if ("".equals(Util.null2String(askForLeaveList.get(i).get("kssj"))) || "".equals(Util.null2String(askForLeaveList.get(i).get("jssj")))){
//弹性请假,半天请假
if (CheckBoxEnum.CHECKED.getKey().equals(btj) && (btgz.equals(HalfDayRuleREnum.BY_CLASS_SET.getKey()) || btgz.equals(HalfDayRuleREnum.FIXED_DURATION.getKey()))){
//半天请假
Map<String,Object> handleMap = askForLeaveService.askForLeaveByHalfDay(param);
itemduration = Double.valueOf(handleMap.get("itemduration").toString());
abnormalClockInList = (List<Map<String,Object>>)handleMap.get("abnormalClockInList");
List<Map<String,Object>> halfoffsetAskForLeaveAnomaly = (List<Map<String,Object>>)handleMap.get("offsetAskForLeaveAnomaly");
offsetAskForLeaveAnomaly.addAll(halfoffsetAskForLeaveAnomaly);
resultMap.put("itemduration",itemduration);
askForLeaveToOffsetAbnomaly.put(askForLeaveList.get(i),halfoffsetAskForLeaveAnomaly);
resultMap.put("item",askForLeaveList.get(i).get("jqlx"));
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
//拆分半天假
if (halfoffsetAskForLeaveAnomaly.size() > 0){
param.put("halfoffsetAskForLeaveAnomaly",halfoffsetAskForLeaveAnomaly);
List<Map<String,Object>> itemList = askForLeaveService.getSonItemsWhenHalfDay(param);
if (itemList.size() > 0){
resultList.addAll(itemList);
}
}else {
resultList.add(resultMap);
}
}
}else if (!"".equals(qjsc) || (CheckBoxEnum.CHECKED.getKey().equals(btj) && (btgz.equals(HalfDayRuleREnum.HALF_TOTAL_DURATION.getKey()) || btgz.equals(HalfDayRuleREnum.HALF_RATED_DURATION.getKey())))){
if (CheckBoxEnum.CHECKED.getKey().equals(btj)){
if (btgz.equals(HalfDayRuleREnum.HALF_TOTAL_DURATION.getKey())){
qjsc = new BigDecimal(scheduleResult.get(0).get("zgzsc").toString()).divide(new BigDecimal(2),new MathContext(4, RoundingMode.HALF_UP)).toString();
}else{
qjsc = new BigDecimal(scheduleResult.get(0).get("edsc").toString()).divide(new BigDecimal(2),new MathContext(4, RoundingMode.HALF_UP)).toString();
}
}
qjscMinute = "".equals(qjsc)?0:Double.valueOf(Math.ceil(Double.valueOf(qjsc)*60)).intValue();
//时长请假
itemduration = Utils.getItemduration(hsl,hsdw,qjscMinute,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
if (!sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
resultMap.put("itemduration",itemduration);
}
param.put("qjsc",qjsc);
param.put("tybcndbjlhbjs",tybcndbjlhbjs);
if (abnormalClockInList.size()>0){
Map<String,Object> map1 = askForLeaveService.askForLeaveByDurationTime(param);
abnormalClockInList =(List<Map<String,Object>>)map1.get("abnormalClockInList");
List<Map<String,Object>> offsetAskForLeaveAnomalyList = (List<Map<String,Object>>)map1.get("offsetAskForLeaveAnomaly");
offsetAskForLeaveAnomaly.addAll(offsetAskForLeaveAnomalyList);
askForLeaveToOffsetAbnomaly.put(askForLeaveList.get(i),offsetAskForLeaveAnomalyList);
//按时长请假,将标记请假作用的时段上的异常 按标准逻辑进行冲销如果冲销后还有多余时长如请假时长为1.5小时但员工当天有两个时段上各有不到30分钟的异常此时每个时段0.5小时需要冲销多出来的0.5小时放哪里,放到异常多的那个时段上
//有几个抵消异常计入几个请假考勤项目
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
int total = offsetAskForLeaveAnomalyList.stream().mapToInt(e->Integer.valueOf(e.get("betweenMinutes").toString())).sum();
int more = 0;
if (total < qjscMinute){
more = qjscMinute-total;
}
List<Map<String,Object>> sortOffsetAskForLeaveAnomalyList = offsetAskForLeaveAnomalyList.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("betweenMinutes").toString()))).collect(Collectors.toList());
for (int j=0;j<sortOffsetAskForLeaveAnomalyList.size();j++){
//异常班段类型
String bdlx = sortOffsetAskForLeaveAnomalyList.get(i).get("bdlx").toString();
//异常时间
int time = Integer.valueOf(sortOffsetAskForLeaveAnomalyList.get(i).get("betweenMinutes").toString());
if (j == sortOffsetAskForLeaveAnomalyList.size()-1){
time = time+more;
}
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(askForLeaveItem,bdlx);
if (item != null){
itemduration = Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),time,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
Map<String, Object> itemMap = Maps.newHashMap();
itemMap.put("itemduration",itemduration);
itemMap.put("item",item.get("keyid"));
resultList.add(itemMap);
}
}
}
}else {
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(askForLeaveItem,ClassSegmentTypeEnum.WORK_TIME.getKey());
if (item != null){
Map<String, Object> itemMap = Maps.newHashMap();
itemduration = Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),qjscMinute,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
itemMap.put("itemduration",itemduration);
itemMap.put("item",item.get("keyid"));
resultList.add(itemMap);
}
}
}
}
}else {
//按照开始时间,结束时间请假
int timeMinutes = getTimeByWorkFor(zysd,zdycbcndfgzsd,scheduleResult,kssj,jssj,analysisDate);
if (timeMinutes > qjscMinute){
timeMinutes = qjscMinute;
}
log.debug("recordAskForLeave timeMinutes [{}] ,hsl:{},hsdw",timeMinutes,hsl,hsdw);
itemduration = Utils.getItemduration(hsl,hsdw,timeMinutes,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
param.put("kssj",kssj);
param.put("jssj",jssj);
if (abnormalClockInList.size()>0){
Map<String,Object> map1 = askForLeaveService.askForLeaveByTime(param);
abnormalClockInList = (List<Map<String,Object>>)map1.get("abnormalClockInList");
offsetAskForLeaveAnomaly.addAll((List<Map<String,Object>>)map1.get("offsetAskForLeaveAnomaly"));
askForLeaveToOffsetAbnomaly.put(askForLeaveList.get(i),(List<Map<String,Object>>)map1.get("offsetAskForLeaveAnomaly"));
}
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
//按时间区间请假时 将连接的同一类型时段设置一种假别 计算出分钟时长后按核算量算出核算时长及单位即可
Map<String,Object> proportionMap = Utils.getAskLeaveAndEvctionProportion(kssj,jssj,scheduleResult,analysisDate);
for (Map.Entry<String,Object> entry: proportionMap.entrySet()){
String bdlx = entry.getKey();
int betweenTimes = Integer.valueOf(entry.getValue().toString());
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(askForLeaveItem,bdlx);
if (item != null){
Map<String, Object> itemMap = Maps.newHashMap();
itemMap.put("itemduration",Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),betweenTimes,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString())));
itemMap.put("item",item.get("keyid"));
resultList.add(itemMap);
}
}
}else {
resultMap.put("itemduration",itemduration);
}
}
}
map.put("resultList",resultList);
map.put("abnormalClockInList",abnormalClockInList);
map.put("offsetAskForLeaveAnomaly",offsetAskForLeaveAnomaly);
map.put("askForLeaveToOffsetAbnomaly",askForLeaveToOffsetAbnomaly);
return map;
}
/**
* 外出
* @param params
* @return
*/
public Map<String, Object> recordEvection(Map<String,Object> params){
//外出项目
Map<String,Map<String,Object>> evectionItems = (Map<String,Map<String,Object>>)params.get("evectionItems");
//排班
List<Map<String, Object>> scheduleResult = (List<Map<String,Object>>)params.get("scheduleResult");
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//出差记录
List<Map<String, Object>> evectionList = (List<Map<String,Object>>)params.get("evectionList");
//异常记录
List<Map<String,Object>> abnormalClockInList = (List<Map<String,Object>>)params.get("abnormalClockInList");
//外出抵消异常
List<Map<String,Object>> offsetEvectionAnomaly = Lists.newArrayList();
//外出-抵消异常
Map<Map<String, Object>,List<Map<String,Object>>> evectionToOffsetAbnomaly = Maps.newHashMap();
Map<String, Object> map = Maps.newHashMap();
List<Map<String, Object>> resultList = Lists.newArrayList();
log.debug("recordEvection evectionList :[{}]",evectionList);
log.debug("recordEvection evectionItems :[{}]",evectionItems);
for (int i=0;i<evectionList.size();i++){
Map<String, Object> resultMap = Maps.newHashMap();
String kssj = evectionList.get(i).get("ksrq") + " "+evectionList.get(i).get("kssj");
String jssj = evectionList.get(i).get("jsrq")+ " "+evectionList.get(i).get("jssj");
//半天请假
String btj = Util.null2String(evectionList.get(i).get("btcc"));
//出差时长
String ccsc = Util.null2String(evectionList.get(i).get("ccsc"));
//请假项目
Map<String,Object> evectionItem = evectionItems.get(evectionList.get(i).get("cclx"));
//自动移除时间区间内的非工作时长
String zdycbcndfgzsd = Util.null2String(evectionItem.get("zdycbcndfgzsd"));
//半天规则
String btgz = Util.null2String(scheduleResult.get(0).get("btgz"));
//同一天可抵消多个异常
String tybcndbjlhbjs = Util.null2String(evectionItem.get("tybcndbjlhbjs"));
//核算量
double hsl = Double.valueOf(Util.null2String(evectionItem.get("hsl")));
//核算单位
String hsdw = Util.null2String(evectionItem.get("hsdw"));
//作用时间段
String zysd = Util.null2String(evectionItem.get("zysd"));
//是否分组呈现
String sffzcx = Util.null2String(evectionItem.get("sffzcx"));
//额定时长
double edsc = Double.valueOf(scheduleResult.get(0).get("edsc").toString());
//请假时长分钟数
int ccscMinute = "".equals(ccsc)?0:Double.valueOf(CommonUtil.convertToMinute(hsdw,ccsc,edsc)).intValue();
if (!sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
resultList.add(resultMap);
resultMap.put("item",evectionList.get(i).get("cclx"));
}
Map<String,Object> param = Maps.newHashMap();
param.put("abnormalClockInList",abnormalClockInList);
param.put("zysd",zysd);
param.put("scheduleResult",scheduleResult);
param.put("analysisDate",analysisDate);
param.put("evectionItem",evectionItem);
double itemduration = 0;
if ("".equals(Util.null2String(evectionList.get(i).get("kssj"))) || "".equals(Util.null2String(evectionList.get(i).get("jssj")))){
//弹性请假,半天出差
if (CheckBoxEnum.CHECKED.getKey().equals(btj) && (btgz.equals(HalfDayRuleREnum.BY_CLASS_SET.getKey()) || btgz.equals(HalfDayRuleREnum.FIXED_DURATION.getKey()))){
//半天出差
Map<String,Object> handleMap = evectionService.evectionByHalfDay(param);
itemduration = Double.valueOf(handleMap.get("itemduration").toString());
abnormalClockInList = (List<Map<String,Object>>)handleMap.get("abnormalClockInList");
List<Map<String,Object>> halfoffsetEvectionAnomaly = (List<Map<String,Object>>)handleMap.get("offsetEvectionAnomaly");
offsetEvectionAnomaly.addAll(halfoffsetEvectionAnomaly);
resultMap.put("itemduration",itemduration);
evectionToOffsetAbnomaly.put(evectionList.get(i),halfoffsetEvectionAnomaly);
resultMap.put("item",evectionList.get(i).get("cclx"));
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
//拆分出差
if (halfoffsetEvectionAnomaly.size() > 0){
param.put("halfoffsetEvectionAnomaly",halfoffsetEvectionAnomaly);
List<Map<String,Object>> itemList = askForLeaveService.getSonItemsWhenHalfDay(param);
if (itemList.size() > 0){
resultList.addAll(itemList);
}
}else {
resultList.add(resultMap);
}
}
}else if (!"".equals(ccsc) || (CheckBoxEnum.CHECKED.getKey().equals(btj) && (btgz.equals(HalfDayRuleREnum.HALF_TOTAL_DURATION.getKey()) || btgz.equals(HalfDayRuleREnum.HALF_RATED_DURATION.getKey())))){
//时长出差
itemduration = Utils.getItemduration(hsl,hsdw,ccscMinute,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
if (!sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
resultMap.put("itemduration",itemduration);
}
param.put("ccsc",ccsc);
param.put("tybcndbjlhbjs",tybcndbjlhbjs);
if (abnormalClockInList.size()>0){
Map<String,Object> map1 =evectionService.evectionByDurationTime(param);
abnormalClockInList = (List<Map<String,Object>>)map1.get("abnormalClockInList");
List<Map<String,Object>> offsetEvectionAnomalyList = (List<Map<String,Object>>)map1.get("offsetEvectionAnomaly");
offsetEvectionAnomaly.addAll(offsetEvectionAnomalyList);
evectionToOffsetAbnomaly.put(evectionList.get(i),offsetEvectionAnomalyList);
//按时长请假,将标记请假作用的时段上的异常 按标准逻辑进行冲销如果冲销后还有多余时长如请假时长为1.5小时但员工当天有两个时段上各有不到30分钟的异常此时每个时段0.5小时需要冲销多出来的0.5小时放哪里,放到异常多的那个时段上
//有几个抵消异常计入几个请假考勤项目
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
int total = offsetEvectionAnomalyList.stream().mapToInt(e->Integer.valueOf(e.get("betweenMinutes").toString())).sum();
int more = 0;
if (total < ccscMinute){
more = ccscMinute-total;
}
List<Map<String,Object>> sortOffsetEvectionAnomalyList = offsetEvectionAnomalyList.stream().sorted(Comparator.comparing(e->Integer.valueOf(e.get("betweenMinutes").toString()))).collect(Collectors.toList());
for (int j=0;j<sortOffsetEvectionAnomalyList.size();j++){
//异常班段类型
String bdlx = sortOffsetEvectionAnomalyList.get(i).get("bdlx").toString();
//异常时间
int time = Integer.valueOf(sortOffsetEvectionAnomalyList.get(i).get("betweenMinutes").toString());
if (j == sortOffsetEvectionAnomalyList.size()-1){
time = time+more;
}
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(evectionItem,bdlx);
if (item != null){
itemduration = Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),time,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
Map<String, Object> itemMap = Maps.newHashMap();
itemMap.put("itemduration",itemduration);
itemMap.put("item",item.get("keyid"));
resultList.add(itemMap);
}
}
}
}else {
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(evectionItem,ClassSegmentTypeEnum.WORK_TIME.getKey());
if (item != null){
Map<String, Object> itemMap = Maps.newHashMap();
itemduration = Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),ccscMinute,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
itemMap.put("itemduration",itemduration);
itemMap.put("item",item.get("keyid"));
resultList.add(itemMap);
}
}
}
}
}else {
//按照开始时间,结束时间出差
int timeMinutes = getTimeByWorkFor(zysd,zdycbcndfgzsd,scheduleResult,kssj,jssj,analysisDate);
if (timeMinutes > ccscMinute){
timeMinutes = ccscMinute;
}
log.debug("recordEvection timeMinutes [{}] ,hsl:{},hsdw",timeMinutes,hsl,hsdw);
itemduration = Utils.getItemduration(hsl,hsdw,timeMinutes,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString()));
param.put("kssj",kssj);
param.put("jssj",jssj);
if (abnormalClockInList.size()>0){
Map<String,Object> map1 = evectionService.evectionByTime(param);
abnormalClockInList = (List<Map<String,Object>>)map1.get("abnormalClockInList");
offsetEvectionAnomaly.addAll((List<Map<String,Object>>)map1.get("offsetEvectionAnomaly"));
evectionToOffsetAbnomaly.put(evectionList.get(i),(List<Map<String,Object>>)map1.get("offsetEvectionAnomaly"));
}
if (sffzcx.equals(CheckBoxEnum.CHECKED.getKey())){
//按时间区间请假时 将连接的同一类型时段设置一种假别 计算出分钟时长后按核算量算出核算时长及单位即可
Map<String,Object> proportionMap = Utils.getAskLeaveAndEvctionProportion(kssj,jssj,scheduleResult,analysisDate);
for (Map.Entry<String,Object> entry: proportionMap.entrySet()){
String bdlx = entry.getKey();
int betweenTimes = Integer.valueOf(entry.getValue().toString());
Map<String,Object> item = CommonUtil.assembleAskForOrEvectionItem(evectionItem,bdlx);
if (item != null){
Map<String, Object> itemMap = Maps.newHashMap();
itemMap.put("itemduration",Utils.getItemduration(Double.valueOf(Util.null2String(item.get("hsl"))),Util.null2String(item.get("hsdw")),betweenTimes,AccountingUnitEnum.MINUTES,Double.valueOf(scheduleResult.get(0).get("edsc").toString())));
itemMap.put("item",item.get("keyid"));
resultList.add(itemMap);
}
}
}else {
resultMap.put("itemduration",itemduration);
}
}
}
map.put("resultList",resultList);
map.put("abnormalClockInList",abnormalClockInList);
map.put("offsetEvectionAnomaly",offsetEvectionAnomaly);
map.put("evectionToOffsetAbnomaly",evectionToOffsetAbnomaly);
return map;
}
/**
* 没有排班
* @param params
* @return
*/
public Map<String,Object> recordNoClass(Map<String,Object> params){
//分析日期
String analysisDate = Util.null2String(params.get("analysisDate"));
//人员
String userId = Util.null2String(params.get("userId"));
//综合工时
List<Map<String,Object>> workHourItems = (List<Map<String,Object>>)params.get("workHourItems");
//津贴
Map<String,Object> allowanceMap = (Map<String,Object>)params.get("allowanceMap");
List<Map<String,Object>> scheduleDateMap = (List<Map<String,Object>>)params.get("scheduleDateMap");
log.debug("userId : {} ,analysisDate: {} have no class",userId,analysisDate);
Map<String,Object> recordParam = Maps.newHashMap();
recordParam.put("userId",userId);
recordParam.put("analysisDate",analysisDate);
recordParam.put("recordData",Lists.newArrayList());
String rqlx = null;
String sfxx = "";
if (scheduleDateMap != null && scheduleDateMap.size() >0){
rqlx = scheduleDateMap.get(0).get("rqlx").toString();
sfxx = scheduleDateMap.get(0).get("sfxx").toString();
recordParam.put("rqlx",scheduleDateMap.get(0).get("rqlx"));
}else {
rqlx = CommonUtil.getRqlx(userId,analysisDate);
recordParam.put("rqlx",rqlx);
}
recordParam.put("classInfo",Lists.newArrayList());
recordParam.put("recordDataTime",Maps.newHashMap());
recordParam.put("attendanceDuration",0);
recordParam.put("formmodeIdMap",Utils.getFormmodeIdMap());
List<Map<String, Object>> recordDataList = Lists.newArrayList();;
if (allowanceMap.get("ifnotWork") != null){
//次日免班
recordParam.put("cqzt",CheckBoxEnum.UNCHECKED.getKey());
utilService.recordItem(recordParam);
return recordParam;
}
if ((rqlx.equals(DateTypeEnum.WORK_DAY.getKey()) || rqlx.equals(DateTypeEnum.CHANGECLASS.getKey())) && !CheckBoxEnum.CHECKED.getKey().equals(sfxx)){
recordParam.put("cqzt",CheckBoxEnum.CHECKED.getKey());
recordDataList.add(new HashMap(){{
put("item",SystemItemEnum.NO_SCHEDULING.getKey());
put("itemduration","NULL");
}});
}else {
recordParam.put("cqzt",CheckBoxEnum.UNCHECKED.getKey());
recordParam.put("sfxx",CheckBoxEnum.CHECKED.getKey());
recordDataList.add(new HashMap(){{
put("item",SystemItemEnum.REST_DAY.getKey());
put("itemduration","NULL");
}});
}
if (workHourItems != null && workHourItems.size() >0 ){
//核算工时的日期类型
String hsgsdrqlx = Util.null2String(workHourItems.get(0).get("hsgsdrqlx"));
rqlx = Utils.getDateType(analysisDate,Util.null2String(workHourItems.get(0).get("qyrl")));
params.put("workHourItem",workHourItems.get(0));
if (CommonUtil.ifContainStr(hsgsdrqlx,rqlx,",")){
//走综合工时
return comprehensiveWorkingHourService.excuteByWorkHour(params);
}else {
//没有排班
recordParam.put("recordData",recordDataList);
utilService.recordItem(recordParam);
}
}else {
//没有排班
recordParam.put("recordData",recordDataList);
utilService.recordItem(recordParam);
}
return recordParam;
}
/**
* 津贴处理
* @param params
* @return
*/
public Map<String,Object> allowanceHandle(Map<String,Object> params){
return allowanceService.allowanceHandle(params);
}
/**
* 津贴处理
* @param params
* @return
*/
public Map<String,Object> removeAbnormal(Map<String,Object> params){
return allowanceService.removeAbnormal(params);
}
/**
* 根据班次获得请假记录以及请假排班
* @param params
* @return
*/
public Map<String,Object> getAskForLeave(Map<String,Object> params){
return askForLeaveService.getAskForLeave(params);
}
/**
* 根据班次获得出差记录以及出差排班
* @param params
* @return
*/
public Map<String,Object> getEvection(Map<String,Object> params){
return evectionService.getEvection(params);
}
/**
* 休息班次,直接算成成休息
*/
public void recordRest(Map<String,Object> recordParam){
recordParam.put("recordData",Lists.newArrayList());
recordParam.put("recordDataTime",Maps.newHashMap());
recordParam.put("attendanceDuration",0);
recordParam.put("cqzt",CheckBoxEnum.UNCHECKED.getKey());
recordParam.put("sfxx",CheckBoxEnum.CHECKED.getKey());
utilService.recordItem(recordParam);
}
public int getTimeByWorkFor(String zysd,String zdycbcndfgzsd,List<Map<String, Object>> scheduleResult,String kssj,String jssj,String analysisDate){
List<Map<String, Object>> reusltList = scheduleResult.stream().filter(e->(zysd.contains(Utils.getWorkFor(e.get("bdlx").toString())) && !Utils.ifRestClassSegment(e.get("bdlx").toString()) && !Utils.ifAskforOrEvctionClassSegment(e.get("bdlx").toString())) ||
(!CheckBoxEnum.CHECKED.getKey().equals(zdycbcndfgzsd) && Utils.ifRestClassSegment(e.get("bdlx").toString()))).collect(Collectors.toList());
return Utils.removeTime(kssj,jssj,reusltList,analysisDate);
}
}