2022-09-26 14:52:34 +08:00
|
|
|
|
package com.engine.bjcj220907.service.impl;
|
|
|
|
|
|
|
|
|
|
|
|
import com.engine.bjcj220907.dao.MonthBonusDAO;
|
2022-09-26 18:36:45 +08:00
|
|
|
|
import com.engine.bjcj220907.dao.OverseasAllowanceDAO;
|
|
|
|
|
|
import com.engine.bjcj220907.entity.JWJT;
|
2022-09-26 14:52:34 +08:00
|
|
|
|
import com.engine.bjcj220907.entity.JwCZInfo;
|
|
|
|
|
|
import com.engine.bjcj220907.entity.JwCZInfoDetail;
|
2022-09-27 10:36:21 +08:00
|
|
|
|
import com.engine.bjcj220907.entity.XcdjJwjtParam;
|
2022-09-26 14:52:34 +08:00
|
|
|
|
import com.engine.bjcj220907.service.OverseasAllowanceCountService;
|
2022-09-26 17:04:07 +08:00
|
|
|
|
import com.engine.bjcj220907.utils.BjcjCommonUtils;
|
2022-09-26 14:52:34 +08:00
|
|
|
|
import weaver.general.BaseBean;
|
|
|
|
|
|
|
2022-09-27 14:34:54 +08:00
|
|
|
|
import java.util.*;
|
2022-09-26 17:04:07 +08:00
|
|
|
|
import java.util.stream.Collectors;
|
2022-09-26 14:52:34 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/09/26 14:03
|
|
|
|
|
|
* @description 境外津贴
|
|
|
|
|
|
*/
|
|
|
|
|
|
public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCountService {
|
|
|
|
|
|
|
|
|
|
|
|
BaseBean baseBean = new BaseBean();
|
|
|
|
|
|
|
|
|
|
|
|
public MonthBonusDAO getMonthBonusDAO(){
|
|
|
|
|
|
return new MonthBonusDAO();
|
|
|
|
|
|
}
|
2022-09-26 18:36:45 +08:00
|
|
|
|
|
|
|
|
|
|
public OverseasAllowanceDAO getOverseasAllowanceDAO(){
|
|
|
|
|
|
return new OverseasAllowanceDAO();
|
|
|
|
|
|
}
|
2022-09-26 14:52:34 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @description 计算境外津贴
|
|
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/9/26 14:06
|
|
|
|
|
|
*/
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void countOverseasAllowance(Calendar countCal) {
|
|
|
|
|
|
// 境外津贴包含:境外津贴(天标准)+境外工龄补贴(月标准)+艰苦地区补贴(天标准)
|
|
|
|
|
|
// 获取境外津贴(天标准) --计算当月应常驻天数
|
|
|
|
|
|
// 获取所有人的境外常驻信息
|
|
|
|
|
|
List<JwCZInfoDetail> czInfos = getMonthBonusDAO().getCZInfo();
|
|
|
|
|
|
baseBean.writeLog("获取所有人的境外常驻信息,共:"+czInfos.size());
|
|
|
|
|
|
// 将境外常驻信息格式化
|
|
|
|
|
|
List<JwCZInfo> jwCZInfos = MonthBonusCountServiceImpl.formatJwCZInfo(czInfos);
|
|
|
|
|
|
baseBean.writeLog("将境外常驻信息格式化");
|
2022-09-26 17:04:07 +08:00
|
|
|
|
// 考勤开始日期
|
|
|
|
|
|
Calendar startAttendanceCal = BjcjCommonUtils.getStartAttendanceCal(countCal.getTime());
|
|
|
|
|
|
// 考勤结束日期
|
|
|
|
|
|
Calendar endAttendanceCal = BjcjCommonUtils.getEndAttendanceCal(countCal.getTime());
|
2022-09-27 10:36:21 +08:00
|
|
|
|
baseBean.writeLog("考勤开始日期:"+startAttendanceCal.getTime()+",考勤结束日期:"+endAttendanceCal);
|
2022-09-26 17:04:07 +08:00
|
|
|
|
// 如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数
|
2022-09-26 18:36:45 +08:00
|
|
|
|
List<JWJT> results = getCZInfosAndCZDays(jwCZInfos, startAttendanceCal, endAttendanceCal);
|
2022-09-27 14:34:54 +08:00
|
|
|
|
baseBean.writeLog("获取用户在考勤周期内存在境外常驻信息过滤出来,并且计算当月境外应常驻天数及境内工作天数:"+results.size());
|
2022-09-27 10:36:21 +08:00
|
|
|
|
// 计算考勤所属月员工的薪酬等级,获取相应的境外津贴标准
|
2022-09-26 18:36:45 +08:00
|
|
|
|
List<String> users = results.stream().map(i -> i.getUser()).collect(Collectors.toList());
|
2022-09-27 10:36:21 +08:00
|
|
|
|
Map<Integer, XcdjJwjtParam> usersXSDJ = getOverseasAllowanceDAO().getXCDJByUsers(startAttendanceCal);
|
|
|
|
|
|
baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准:"+usersXSDJ.size());
|
|
|
|
|
|
//
|
2022-09-26 14:52:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-26 17:04:07 +08:00
|
|
|
|
/**
|
2022-09-27 14:34:54 +08:00
|
|
|
|
* @description 获取用户在考勤周期内存在境外常驻信息过滤出来,并且计算当月境外应常驻天数及境内工作天数
|
2022-09-26 17:04:07 +08:00
|
|
|
|
* @return List<JwCZInfo>
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/9/26 16:29
|
|
|
|
|
|
*/
|
2022-09-26 18:36:45 +08:00
|
|
|
|
public List<JWJT> getCZInfosAndCZDays(List<JwCZInfo> jwCZInfos,Calendar startAttendanceCal,Calendar endAttendanceCal){
|
|
|
|
|
|
ArrayList<JWJT> results = new ArrayList<>();
|
|
|
|
|
|
jwCZInfos.stream().filter(czInfo -> {
|
2022-09-27 14:34:54 +08:00
|
|
|
|
if(czInfo.getXm().equals("1462")){
|
|
|
|
|
|
System.out.println("H");
|
|
|
|
|
|
}
|
2022-09-26 17:04:07 +08:00
|
|
|
|
List<JwCZInfoDetail> czDetails = czInfo.getInfos();
|
|
|
|
|
|
// 用于存储计算到哪一天的日期
|
|
|
|
|
|
Calendar c = Calendar.getInstance();
|
|
|
|
|
|
c.setTime(endAttendanceCal.getTime());
|
|
|
|
|
|
Calendar[] countDay = {c};
|
|
|
|
|
|
int[] ycq = {0};
|
2022-09-27 14:34:54 +08:00
|
|
|
|
int[] gnycq ={0};
|
|
|
|
|
|
List<Date> details = new ArrayList<>();
|
2022-09-26 17:04:07 +08:00
|
|
|
|
for (int i = 0; i < czDetails.size(); i++) {
|
|
|
|
|
|
JwCZInfoDetail detail = czDetails.get(i);
|
|
|
|
|
|
if (detail.getLx() == 0 && (detail.getJwczksrq().before(endAttendanceCal.getTime()) || detail.getJwczksrq().equals(endAttendanceCal.getTime()))) {
|
|
|
|
|
|
// 涉及考勤周期内的开始常驻
|
|
|
|
|
|
if (detail.getJwczksrq().after(startAttendanceCal.getTime())) {
|
|
|
|
|
|
// 开始常驻日期在 考勤开始日期后,结束日期前
|
|
|
|
|
|
int days = BjcjCommonUtils.getDays(detail.getJwczksrq(), endAttendanceCal.getTime());
|
|
|
|
|
|
ycq[0] += days;
|
|
|
|
|
|
countDay[0].setTime(detail.getJwczksrq());
|
|
|
|
|
|
countDay[0].add(Calendar.DATE, -1);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 开始常驻日期在 考勤开始日期前(应出勤日期为自然日)
|
|
|
|
|
|
int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime());
|
2022-09-27 14:34:54 +08:00
|
|
|
|
// czInfo.setYczDays(days);
|
|
|
|
|
|
JWJT build = JWJT.builder().user(czInfo.getXm()).jwycq(days).gngzts(0.0).build();
|
2022-09-26 18:36:45 +08:00
|
|
|
|
results.add(build);
|
2022-09-26 17:04:07 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (detail.getLx() == 1 &&
|
|
|
|
|
|
((detail.getJwczksrq().before(endAttendanceCal.getTime()) || detail.getJwczksrq().equals(endAttendanceCal.getTime()))
|
|
|
|
|
|
&& (detail.getJwczjsrq().after(startAttendanceCal.getTime()) || detail.getJwczjsrq().equals(startAttendanceCal.getTime())))) {
|
|
|
|
|
|
// 涉及考勤周期内的结束常驻
|
2022-09-27 14:34:54 +08:00
|
|
|
|
// 将区间转换为记录
|
|
|
|
|
|
Calendar starCal = Calendar.getInstance();
|
|
|
|
|
|
starCal.setTime(detail.getJwczksrq());
|
|
|
|
|
|
while (starCal.getTime().before(detail.getJwczjsrq()) || starCal.getTime().equals(detail.getJwczjsrq())) {
|
|
|
|
|
|
details.add(starCal.getTime());
|
|
|
|
|
|
starCal.add(Calendar.DAY_OF_YEAR, 1);
|
2022-09-26 17:04:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-09-27 14:34:54 +08:00
|
|
|
|
if (i == czDetails.size() - 1) {
|
|
|
|
|
|
// 已经将所有考勤周期内境外常驻的区间时间转换为记录
|
|
|
|
|
|
Calendar aCal = Calendar.getInstance();
|
|
|
|
|
|
aCal.setTime(countDay[0].getTime());
|
|
|
|
|
|
aCal.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
|
|
|
aCal.set(Calendar.MINUTE, 0);
|
|
|
|
|
|
aCal.set(Calendar.SECOND, 0);
|
|
|
|
|
|
aCal.set(Calendar.MILLISECOND, 0);
|
|
|
|
|
|
if(details.size()==0 && countDay[0].getTime().equals(endAttendanceCal.getTime())){
|
|
|
|
|
|
// 该考勤周期内员工没有境外常驻信息
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
while (startAttendanceCal.getTime().before(aCal.getTime()) || startAttendanceCal.getTime().equals(aCal.getTime())){
|
|
|
|
|
|
if(details.contains(aCal.getTime())){
|
|
|
|
|
|
// 存在境外记录
|
|
|
|
|
|
ycq[0]++;
|
|
|
|
|
|
aCal.add(Calendar.DATE,-1);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
// 没有境外记录,判断是否是工作日
|
|
|
|
|
|
if( (aCal.get(Calendar.DAY_OF_WEEK) != 1) && (aCal.get(Calendar.DAY_OF_WEEK)!=7) ){
|
|
|
|
|
|
// 是工作日
|
|
|
|
|
|
gnycq[0]++;
|
|
|
|
|
|
}
|
|
|
|
|
|
aCal.add(Calendar.DATE,-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
JWJT build = JWJT.builder().user(czInfo.getXm()).jwycq(ycq[0]).gngzts(gnycq[0]).build();
|
2022-09-26 18:36:45 +08:00
|
|
|
|
results.add(build);
|
2022-09-26 17:04:07 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
2022-09-27 14:34:54 +08:00
|
|
|
|
}).collect(Collectors.toList());
|
2022-09-26 18:36:45 +08:00
|
|
|
|
return results;
|
2022-09-26 17:04:07 +08:00
|
|
|
|
}
|
2022-09-26 14:52:34 +08:00
|
|
|
|
|
|
|
|
|
|
}
|