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.

372 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 weaver.general.TimeUtil;
import weaver.general.Util;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
* 循环按间隔时长折算发放
*/
public class ByIntervalPayMentWay implements HolidayGenerationWay{
@Override
public boolean support(int personClassfiy) {
if (personClassfiy == 2){
return true;
}
return false;
}
@Override
public void 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"));
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("qsrq"));
//额度有效期间
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("ljcrglyfslwz"));
//依据字段
String yjzd = Util.null2String(vocationList.get(0).get("yjzd"));
//调整起算日期策略
String dzqsrq = Util.null2String(vocationList.get(0).get("dzqsrq"));
//分割日期
String fgrq = Util.null2String(vocationList.get(0).get("fgrq"));
//提前执行发放操作的天数
int dqtqffts = Integer.valueOf(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"));
qsrq = VocationCommonUtil.getAfterAdjustTime(qsrq, dzqsrq, fgrq);
for (Map<String, Object> vocationMap : vocationList) {
vocationMap.put("qsrq", qsrq);
}
if (DateUtil.getTime(releaseDate).compareTo(DateUtil.getTime(qsrq)) < 0){
releaseDate=qsrq;
}
//相差天数
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);
String sxrq = insertHoliDayParam.get("sxrq").toString();
String jzrq = insertHoliDayParam.get("jzrq").toString();
//实际休息时长
double restTime = 0;
//工龄小于1年的新员工,且额度有效期单位为自然年
if (allMonths < 12 && edyxq.equals(StartingUnitEnum.NATURAL_YEAR.getKey())) {
if (QuotaChangeMethodEnum.CONVERT.getKey().equals(edbgsedclfs) || CheckBoxEnum.CHECKED.getKey().equals(schdedablzs)) {
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT,releaseDate);
}else {
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.NO_CONVERT,releaseDate);
}
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);
}
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])) {
//入职不满一年,且入职当期额度按比例折算
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT,releaseDate);
}else {
if (QuotaChangeMethodEnum.CONVERT.getKey().equals(edbgsedclfs)) {
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.CONVERT,releaseDate);
} else if (QuotaChangeMethodEnum.NO_CONVERT.getKey().equals(edbgsedclfs)) {
restTime = getRestTime(insertHoliDayParam,vocationList,QuotaChangeMethodEnum.NO_CONVERT,releaseDate);
}
}
}else if (edyxq.equals(StartingUnitEnum.STARTING_YEAR.getKey())) {
//起算年
String startTime = releaseDate.split("-")[0]+"-"+qsrq.split("-")[1]+"-"+qsrq.split("-")[2];
String beforeEndTime = DateUtil.beforeDay(startTime,1);
String criticalTime = DateUtil.beforeDay(beforeEndTime,dqtqffts+1);
if (releaseDate.split(" ")[0].equals(criticalTime)){
releaseDate = beforeEndTime;
}
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);
double edktsc = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
int days = 0;
if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >=0){
days = DateUtil.getBetWeenDays(qsrq,releaseDate.split(" ")[0])+1;
}else {
days = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
}
if (days<0){
days = 0;
}
int yearDays = DateUtil.getDays(sxrq, Calendar.DAY_OF_YEAR);
restTime=VocationCommonUtil.computeRestDays(days, yearDays, edktsc, wscl);
} else if (edyxq.equals(StartingUnitEnum.NATURAL_MONTH.getKey())){
//自然月
int beforeDays = DateUtil.getDays(releaseDate,Calendar.DAY_OF_MONTH);
String criticalTime = DateUtil.beforeDay(releaseDate.split("-")[0]+"-"+releaseDate.split("-")[1]+"-"+beforeDays,dqtqffts+1);
if (releaseDate.split(" ")[0].equals(criticalTime)){
releaseDate = releaseDate.split("-")[0]+"-"+releaseDate.split("-")[1]+"-"+beforeDays;
}
betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
allMonths = betweenMonth+Double.valueOf(ljcrglyfslwz).intValue();
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allMonths, yjzd);
int days = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
if (days <0){
days=0;
}
int monthDays = DateUtil.getDays(sxrq,Calendar.DAY_OF_MONTH);
double edktsc = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
restTime = VocationCommonUtil.computeRestDays(days, monthDays, edktsc, wscl);
} else if (edyxq.equals(StartingUnitEnum.STARTING_MONTH.getKey())){
///起算月
String beforeEndTime = DateUtil.beforeDay(sxrq,1);
String criticalTime = DateUtil.beforeDay(beforeEndTime,dqtqffts+1);
if (releaseDate.split(" ")[0].equals(criticalTime)){
releaseDate = beforeEndTime;
}
betweenMonth = DateUtil.getBetWeenMonths(qsrq,sxrq);
allMonths = betweenMonth+Double.valueOf(ljcrglyfslwz).intValue();
Map<String, Object> vocationMap = VocationCommonUtil.getVocationMap(vocationList, allMonths, yjzd);
double edktsc = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
int days = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
if (days <0){
days=0;
}
int monthDays = DateUtil.getBetWeenDays(sxrq,jzrq)+1;
restTime = VocationCommonUtil.computeRestDays(days, monthDays, edktsc, wscl);
} else if (edyxq.equals(StartingUnitEnum.NATURAL_WEEK.getKey())){
//起自然周
int dayOfWeek = TimeUtil.getDayOfWeek(releaseDate);
if (dayOfWeek == 0){
dayOfWeek = 7;
}
String time = releaseDate.split("-")[0]+"-"+releaseDate.split("-")[1] +"-"+releaseDate.split(" ")[0].split("-")[2];
String beforeJxrq = DateUtil.AfterDay(time,8-dayOfWeek);
String criticalTime = DateUtil.beforeDay(beforeJxrq,dqtqffts+1);
if (releaseDate.split(" ")[0].equals(criticalTime)){
releaseDate = beforeJxrq;
}
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);
double edktsc = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
int days = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
if (days <0){
days=0;
}
int monthDays = 7;
restTime = VocationCommonUtil.computeRestDays(days, monthDays, edktsc, wscl);
} else if (edyxq.equals(StartingUnitEnum.STARTING_WEEK.getKey())){
//起算周
String time = releaseDate.split("-")[0]+"-"+releaseDate.split("-")[1] +"-"+releaseDate.split(" ")[0].split("-")[2];
int day = DateUtil.getBetWeenDays(qsrq,time);
int residueDays = day%7;
String beforeSxrq = DateUtil.beforeDay(time,residueDays);
String beforeEndTime = DateUtil.AfterDay(beforeSxrq,6);
String criticalTime = DateUtil.beforeDay(beforeEndTime,dqtqffts+1);
if (releaseDate.split(" ")[0].equals(criticalTime)){
releaseDate = beforeEndTime;
}
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);
int days = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
if (days <0){
days=0;
}
double edktsc = vocationMap.size()>0?Double.valueOf(vocationMap.get("edktsc").toString()):0;
int monthDays = 7;
restTime = VocationCommonUtil.computeRestDays(days, monthDays, edktsc, wscl);
} 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);
VocationCommonUtil.updateHolidayBalance("uf_jcl_kq_jqye", insertHoliDayParam,new ArrayList<>());
}
public double getRestTime(Map<String, Object> insertHoliDayParam,List<Map<String, Object>> vocationList,QuotaChangeMethodEnum changeMethodEnum,String releaseDate){
String sxrq = insertHoliDayParam.get("sxrq").toString();
String qsrq = Util.null2String(vocationList.get(0).get("qsrq"));
String nextSxrq = DateUtil.nextYear(sxrq,1,DateUtil.yyyyMMdd);
//累计承认工龄月份数栏位值
String ljcrglyfslwz = Util.null2String(vocationList.get(0).get("ljcrglyfslwz"));
//依据字段
String yjzd = Util.null2String(vocationList.get(0).get("yjzd"));
//尾数处理
String wscl = Util.null2String(vocationList.get(0).get("wscl"));
//提前执行发放操作的天数
int dqtqffts = Integer.valueOf(Util.null2String(vocationList.get(0).get("dqtqffts")));
//执行发放的时间点
String ffdtffsj = Util.null2String(vocationList.get(0).get("ffdtffsj"));
int seniority = "".equals(ljcrglyfslwz)?0:Double.valueOf(ljcrglyfslwz).intValue();
String nowEndYearTime = releaseDate.split("-")[0]+"-12-31";
if (DateUtil.getTime(releaseDate).compareTo(DateUtil.getTime(sxrq)) <0){
return 0;
}
//临界时间点,直接发放全年
String criticalTime = DateUtil.beforeDay(nowEndYearTime,dqtqffts+1);
if (releaseDate.split(" ")[0].equals(criticalTime)){
releaseDate = nowEndYearTime;
}
int yearDays = DateUtil.getDays(sxrq, Calendar.DAY_OF_YEAR);
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;
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];
//当前后额定可休时长一样时,代表没有残年情况
if (beginEdktsc == endEdktsc){
if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >=0){
//新员工入职
int days = DateUtil.getBetWeenDays(qsrq,releaseDate.split(" ")[0])+1;
restTime = VocationCommonUtil.computeRestDays(days, yearDays, endEdktsc, wscl);
}else {
int days = DateUtil.getTime(releaseDate).getDayOfYear();
restTime = VocationCommonUtil.computeRestDays(days, yearDays, endEdktsc, wscl);
}
}else {
//考虑残年
if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >=0){
//新员工入职
if (DateUtil.getTime(divideTime).compareTo(DateUtil.getTime(qsrq)) >=0){
if (DateUtil.getTime(releaseDate).compareTo(DateUtil.getTime(divideTime)) >=0){
int beforeDays = DateUtil.getBetWeenDays(qsrq,divideTime);
double beforeRestTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl);
int afterDays = DateUtil.getBetWeenDays(divideTime,releaseDate.split(" ")[0])+1;
double afterRestTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl);
restTime = beforeRestTime+afterRestTime;
}else {
int beforeDays = DateUtil.getBetWeenDays(qsrq,releaseDate.split(" ")[0])+1;
restTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl);
}
}else {
int afterDays = DateUtil.getBetWeenDays(qsrq,releaseDate.split(" ")[0])+1;
restTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl);
}
}else {
if (DateUtil.getTime(releaseDate).compareTo(DateUtil.getTime(divideTime)) >=0){
int beforeDays = DateUtil.getBetWeenDays(sxrq,divideTime);
double beforeRestTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl);
int afterDays = DateUtil.getBetWeenDays(divideTime,releaseDate.split(" ")[0])+1;
double afterRestTime = VocationCommonUtil.computeRestDays(afterDays, yearDays, endEdktsc, wscl);
restTime = beforeRestTime+afterRestTime;
}else {
int beforeDays = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
restTime = VocationCommonUtil.computeRestDays(beforeDays, yearDays, beginEdktsc, wscl);
}
}
}
}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")));
int days = 0;
if (DateUtil.getTime(qsrq).compareTo(DateUtil.getTime(sxrq)) >=0){
days = DateUtil.getBetWeenDays(qsrq,releaseDate.split(" ")[0])+1;
}else {
days = DateUtil.getBetWeenDays(sxrq,releaseDate.split(" ")[0])+1;
}
restTime=VocationCommonUtil.computeRestDays(days, yearDays, beginEdktsc, wscl);
}
return restTime;
}
}