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.

362 lines
20 KiB
Java

package com.engine.attendance.vacation.job.holidaygeneration.tactics;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.QuotaChangeMethodEnum;
import com.engine.attendance.enums.StartingUnitEnum;
import com.engine.attendance.vacation.util.VocationCommonUtil;
import com.engine.common.util.DateUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import weaver.hrm.User;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
* 循环单次发放全额
*/
@Slf4j
public class SinglePaymentInFullWay implements HolidayGenerationWay {
@Override
public boolean support(int personClassfiy) {
if (personClassfiy == 0) {
return true;
}
return false;
}
@Override
public Map<String,Object> compute(Map<String, Object> data) {
String userId = Util.null2String(data.get("userId"));
String releaseDate = Util.null2String(data.get("releaseDate"));
String cover = Util.null2String(data.get("cover"));
String isOneTime = Util.null2String(data.get("isOneTime"));
if ("".equals(releaseDate)) {
releaseDate = DateUtil.getCurrentTime();
}
List<Map<String, Object>> vocationList = (List<Map<String, Object>>) data.get("vocationList");
//起算日期
String qsrq = Util.null2String(vocationList.get(0).get("qsrqValue"));
//额度有效期间
String edyxqsz = Util.null2String(vocationList.get(0).get("edyxqsz"));
//额度有效期间单位
String edyxq = Util.null2String(vocationList.get(0).get("edyxq"));
//累计承认工龄月份数栏位值
String ljcrglyfslwz = Util.null2String(vocationList.get(0).get("ljcrglyfslwzValue"));
//依据字段
String yjzd = Util.null2String(vocationList.get(0).get("yjzdValue"));
//调整起算日期策略
String dzqsrq = Util.null2String(vocationList.get(0).get("dzqsrq"));
//分割日期
String fgrq = Util.null2String(vocationList.get(0).get("fgrq"));
//提前执行发放操作的天数
String dqtqffts = Util.null2String(vocationList.get(0).get("dqtqffts"));
//执行发放的时间点
String ffdtffsj = Util.null2String(vocationList.get(0).get("ffdtffsj"));
//入职当期额度按比例折算
String rzdqedablzs = Util.null2String(vocationList.get(0).get("rzdqedablzs"));
//首次获得额度按比例折算
String schdedablzs = Util.null2String(vocationList.get(0).get("schdedablzs"));
//额度变更时额度处理方式
String edbgsedclfs = Util.null2String(vocationList.get(0).get("edbgsedclfs"));
//额度单位
String eddw = Util.null2String(vocationList.get(0).get("edbgsedclfs"));
//尾数处理
String wscl = Util.null2String(vocationList.get(0).get("wscl"));
//首次获得额度控制生效日期
String schdedkzsxrq = Util.null2String(vocationList.get(0).get("schdedkzsxrq"));
if (!"1".equals(isOneTime)){
qsrq = VocationCommonUtil.getAfterAdjustTime(qsrq, dzqsrq, fgrq);
for (Map<String, Object> vocationMap : vocationList) {
vocationMap.put("qsrqValue", qsrq);
}
}
if (DateUtil.getTime(releaseDate).compareTo(DateUtil.getTime(qsrq)) < 0){
//releaseDate=qsrq;
return Maps.newHashMap();
}
//相差天数
int betweenDays = DateUtil.getBetWeenDays(qsrq, releaseDate.split(" ")[0]);
//相差月份
int betweenMonth = DateUtil.getBetWeenMonths(qsrq, releaseDate.split(" ")[0]);
//总工龄天数
int allWorkDays = Double.valueOf(ljcrglyfslwz).intValue() * 30 + betweenDays;
//总月数
int allMonths = betweenMonth + Double.valueOf(ljcrglyfslwz).intValue();
Map<String, Object> insertHoliDayParam = VocationCommonUtil.getInsertHoliDayParam(vocationList.get(0), userId, qsrq, releaseDate);
// List<Map<String,Object>> dataList = VocationCommonUtil.ifexist("uf_jcl_kq_jqye", insertHoliDayParam);
List<Map<String,Object>> dataList = new ArrayList<>();
//已存在数据且不覆盖
if (dataList.size()>0 && !"1".equals(cover)) {
return insertHoliDayParam;
}
String sxrq = insertHoliDayParam.get("sxrq").toString();
//实际休息时长
double restTime = 0;
//工龄小于1年的新员工,且额度有效期单位为自然年
if (allMonths < 12 && edyxq.equals(StartingUnitEnum.NATURAL_YEAR.getKey())) {
// Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, 0, yjzd);
//
// //额定休息时长
// double edktsc = Double.valueOf(vocationMap.get("edktsc") == null? "0" :Util.null2String(vocationMap.get("edktsc")));
if (QuotaChangeMethodEnum.CONVERT.getKey().equals(edbgsedclfs) || CheckBoxEnum.CHECKED.getKey().equals(schdedablzs)) {
// if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年和发生日期在同一年,生成假期在下一年
// int days = DateUtil.getBetWeenDays(qsrq, qsrq.split("-")[0] + "-12-31") + 1;
// int yearDays = DateUtil.getDays(qsrq, Calendar.DAY_OF_YEAR);
// restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl);
// } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年和发生日期在同一年,生成假期为起算年的当年
// int days = Double.valueOf(ljcrglyfslwz).intValue() * 30;
// int yearDays = DateUtil.getDays(DateUtil.beforeYear(releaseDate,1,DateUtil.yyyyMMdd), Calendar.DAY_OF_YEAR);
// restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl);
// } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年在发生日期的上一年,起算年的后一年
// int days = DateUtil.getBetWeenDays(qsrq, qsrq.split("-")[0] + "-12-31") + 1;
// int yearDays = DateUtil.getDays(qsrq, Calendar.DAY_OF_YEAR);
// restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl);
// } else if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年在发生日期的上一年,生成假期为起算年的后第二年
// restTime = edktsc;
// }
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT);
} else {
// restTime = edktsc;
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.NO_CONVERT);
}
if (CheckBoxEnum.CHECKED.getKey().equals(schdedkzsxrq)) {
int seniority = "".equals(ljcrglyfslwz)?0:Double.valueOf(ljcrglyfslwz).intValue();
String divideTime = DateUtil.beforeMonth(qsrq,seniority);
divideTime = sxrq.split("-")[0]+"-"+divideTime.split("-")[1]+"-"+divideTime.split("-")[2];
insertHoliDayParam.put("sxrq", divideTime);
dataList = VocationCommonUtil.ifexist("uf_jcl_kq_jqye", insertHoliDayParam);
//已存在数据且不覆盖
if (dataList.size()>0 && !"1".equals(cover)) {
return insertHoliDayParam;
}
}
insertHoliDayParam.put("ktsc", restTime);
} else if (allMonths >= 12 && edyxq.equals(StartingUnitEnum.NATURAL_YEAR.getKey())) {
//入职不满一年,且入职当期额度按比例折算
if (CheckBoxEnum.CHECKED.getKey().equals(rzdqedablzs) && betweenMonth < 12
&& sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
//起算年和发生日期在同一年,生成假期为起算年的当年
// Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, Double.valueOf(ljcrglyfslwz).intValue() / 12, yjzd);
// double edktsc = Double.valueOf(vocationMap.get("edktsc").toString());
// int days = DateUtil.getBetWeenDays(qsrq, releaseDate.split(" ")[0]) + 1;
// int yearDays = DateUtil.getDays(qsrq, Calendar.DAY_OF_YEAR);
// restTime = VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl);
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT);
} else {
//
// if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年和发生日期在同一年,生成假期在下一年
// //betweenMonth = DateUtil.getBetWeenMonths(qsrq,qsrq.split("-")[0] + "-12-31");
// betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
//
// } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年和发生日期在同一年,生成假期为发生日期的当年
// betweenMonth=0;
//
// } else if (sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年在发生日期的之前,生成假期为发生日期的当年
// //betweenMonth = DateUtil.getBetWeenMonths(qsrq,DateUtil.beforeYear(releaseDate,1,DateUtil.yyyy) + "-12-31");
// betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
//
// } else if (!sxrq.split("-")[0].equals(releaseDate.split("-")[0]) && !releaseDate.split("-")[0].equals(qsrq.split("-")[0])) {
// //起算年在发生日期的之前,生成假期为发生日期的下一年
// //betweenMonth = DateUtil.getBetWeenMonths(qsrq,releaseDate.split("-")[0] + "-12-31");
// betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
//
// }
// allMonths = betweenMonth + Double.valueOf(ljcrglyfslwz).intValue();
// int intervalYear = allMonths/12;
// Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, intervalYear / 12, yjzd);
// double edktsc = Double.valueOf(vocationMap.get("edktsc").toString());
if (QuotaChangeMethodEnum.CONVERT.getKey().equals(edbgsedclfs)) {
// Map<String, Object> beforeVocationMap = VocationCommonUtil.getVocationMap(vocationList, intervalYear - 1, yjzd);
// if (!beforeVocationMap.get("detailid").equals(vocationMap.get("detailid"))) {
// //考虑残年情况
// double beforeEdktsc = Double.valueOf(beforeVocationMap.get("edktsc").toString());
// int needBackMonths = (intervalYear - 1) * 12 - Double.valueOf(ljcrglyfslwz).intValue();
//
// String middleTime = releaseDate.split("-")[0] + "-" + DateUtil.nextMonth(qsrq, needBackMonths, DateUtil.yyyyMMdd).split("-")[1] + "-" + qsrq.split("-")[2];
// int beforeDays = DateUtil.getBetWeenDays(releaseDate.split("-")[0] + "-01-01", middleTime);
// int afterDays = DateUtil.getBetWeenDays(middleTime, releaseDate.split("-")[0] + "-12-31");
//
// int yearDays = DateUtil.getDays(releaseDate, Calendar.DAY_OF_YEAR);
// restTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beforeEdktsc, wscl) + VocationCommonUtil.computeRestDays(afterDays, yearDays, edktsc, wscl);
// } else {
// restTime = edktsc;
// }
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT);
} else if (QuotaChangeMethodEnum.NO_CONVERT.getKey().equals(edbgsedclfs)) {
// restTime = edktsc;
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.NO_CONVERT);
}
}
} else if (edyxq.equals(StartingUnitEnum.STARTING_YEAR.getKey())) {
int betweenYear = DateUtil.getBetWeenYears(qsrq,releaseDate.split(" ")[0]);
//起算年
allMonths = Double.valueOf(ljcrglyfslwz).intValue();
int intervalYear = allMonths / 12+betweenYear;
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, intervalYear, yjzd);
restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
} else if (edyxq.equals(StartingUnitEnum.NATURAL_MONTH.getKey())){
//自然月
betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
if (DateUtil.getTime(sxrq).compareTo(DateUtil.getTime(qsrq)) <=0){
betweenMonth = 0;
}
allMonths = betweenMonth+Double.valueOf(ljcrglyfslwz).intValue();
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allMonths, yjzd);
restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
} else if (edyxq.equals(StartingUnitEnum.STARTING_MONTH.getKey())){
//起算月
betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
allMonths = betweenMonth+Double.valueOf(ljcrglyfslwz).intValue();
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allMonths, yjzd);
restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
} else if (edyxq.equals(StartingUnitEnum.NATURAL_WEEK.getKey())){
//起自然周
betweenDays = DateUtil.getBetWeenDays(qsrq,sxrq)+1;
if (DateUtil.getTime(sxrq).compareTo(DateUtil.getTime(qsrq)) <=0){
betweenDays = 0;
}
allWorkDays = Double.valueOf(ljcrglyfslwz).intValue()*30+betweenDays;
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allWorkDays/7, yjzd);
restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
} else if (edyxq.equals(StartingUnitEnum.STARTING_WEEK.getKey())){
//起算周
betweenDays = DateUtil.getBetWeenDays(qsrq,sxrq)+1;
if (betweenDays <=7){
betweenDays=0;
}
allWorkDays = Double.valueOf(ljcrglyfslwz).intValue()*30+betweenDays;
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allWorkDays/7, yjzd);
restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
} else if (edyxq.equals(StartingUnitEnum.NATURAL_DAY.getKey())){
//自然天
betweenDays = DateUtil.getBetWeenDays(qsrq,sxrq)+1;
allWorkDays = Double.valueOf(ljcrglyfslwz).intValue()*30+betweenDays;
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allWorkDays, yjzd);
restTime = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
}
insertHoliDayParam.put("ktsc", restTime);
if (!"1".equals(isOneTime)){
VocationCommonUtil.updateHolidayBalance("uf_jcl_kq_jqye", insertHoliDayParam,dataList);
}
return insertHoliDayParam;
}
public double getRestTime(Map<String, Object> insertHoliDayParam,List<Map<String, Object>> vocationList,QuotaChangeMethodEnum changeMethodEnum){
String sxrq = insertHoliDayParam.get("sxrq").toString();
String qsrq = Util.null2String(vocationList.get(0).get("qsrqValue"));
String nextSxrq = DateUtil.nextYear(sxrq,1,DateUtil.yyyyMMdd);
//累计承认工龄月份数栏位值
String ljcrglyfslwz = Util.null2String(vocationList.get(0).get("ljcrglyfslwzValue"));
//依据字段
String yjzd = Util.null2String(vocationList.get(0).get("yjzdValue"));
//尾数处理
String wscl = Util.null2String(vocationList.get(0).get("wscl"));
int seniority = "".equals(ljcrglyfslwz)?0:Double.valueOf(ljcrglyfslwz).intValue();
double restTime=0.0;
//折算
if (changeMethodEnum == QuotaChangeMethodEnum.CONVERT){
int beginYearMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
if (beginYearMonth < 0){
beginYearMonth = 0;
}
beginYearMonth = beginYearMonth+seniority;
int endYearMonth = DateUtil.getBetWeenMonths(qsrq,nextSxrq);
endYearMonth = endYearMonth+seniority;
int beginYear = beginYearMonth/12;
int endYear = endYearMonth/12;
int endYearRemainder = endYearMonth%12;
Map<String,Object> beginYearmap = VocationCommonUtil.getVocationMap(vocationList, beginYear, yjzd);
Map<String,Object> endYearmap = VocationCommonUtil.getVocationMap(vocationList, endYear, yjzd);
double beginEdktsc = Double.valueOf(beginYearmap.get("edktsc") == null? "0" :Util.null2String(beginYearmap.get("edktsc")));
double endEdktsc = Double.valueOf(endYearmap.get("edktsc") == null? "0" :Util.null2String(endYearmap.get("edktsc")));
//残年分割日期
String divideTime = DateUtil.beforeMonth(qsrq,seniority);
divideTime = sxrq.split("-")[0]+"-"+divideTime.split("-")[1]+"-"+divideTime.split("-")[2];
int yearDays = DateUtil.getDays(sxrq, Calendar.DAY_OF_YEAR);
if (beginEdktsc == endEdktsc){
//当前后额定可休时长一样时,代表没有残年情况
if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >0){
int days = DateUtil.getBetWeenDays(qsrq,nextSxrq);
restTime = VocationCommonUtil.computeRestDays(days, yearDays, endEdktsc, wscl);
}else {
restTime = beginEdktsc;
}
}else {
//考虑残年
if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >0){
if (DateUtil.getTime(divideTime).compareTo(DateUtil.getTime(qsrq)) >=0){
int beforeDays = DateUtil.getBetWeenDays(qsrq,divideTime);
int afterDays = DateUtil.getBetWeenDays(divideTime,nextSxrq)+1;
double beforeRestTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl);
double afterRestTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl);
restTime = beforeRestTime+afterRestTime;
}else {
int afterDays = DateUtil.getBetWeenDays(qsrq,nextSxrq);
restTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl);
}
}else {
int beforeDays = DateUtil.getBetWeenDays(sxrq,divideTime);
int afterDays = DateUtil.getBetWeenDays(divideTime,nextSxrq)+1;
double beforeRestTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl);
double afterRestTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl);
restTime = beforeRestTime+afterRestTime;
}
}
}else {
//不折算
int beginYearMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
if (beginYearMonth < 0){
beginYearMonth = 0;
}
beginYearMonth = beginYearMonth+seniority;
int beginYear = beginYearMonth/12;
Map<String,Object> beginYearmap = VocationCommonUtil.getVocationMap(vocationList, beginYear, yjzd);
double beginEdktsc = Double.valueOf(beginYearmap.get("edktsc") == null? "0" :Util.null2String(beginYearmap.get("edktsc")));
restTime=beginEdktsc;
}
return restTime;
}
}