计算员工境外常驻天数及国内工作日天数

This commit is contained in:
Harryxzy 2022-09-27 14:34:54 +08:00
parent bfd78019a9
commit 35ffa80c36
4 changed files with 56 additions and 35 deletions

View File

@ -22,9 +22,14 @@ public class JWJT {
private String user;
/**
* 应出勤天数
* 境外应常驻天数
*/
private double ycq;
private double jwycq;
/**
* 国内工作天数工作日
*/
private double gngzts;
/**
* 薪酬等级

View File

@ -27,8 +27,8 @@ public class JwCZInfo {
*/
private List<JwCZInfoDetail> infos;
/**
* 考勤月份中境外应常驻天数
*/
private Integer yczDays;
// /**
// * 考勤月份中境外应常驻天数
// */
// private Integer yczDays;
}

View File

@ -10,10 +10,7 @@ import com.engine.bjcj220907.service.OverseasAllowanceCountService;
import com.engine.bjcj220907.utils.BjcjCommonUtils;
import weaver.general.BaseBean;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -55,7 +52,7 @@ public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCount
baseBean.writeLog("考勤开始日期:"+startAttendanceCal.getTime()+",考勤结束日期:"+endAttendanceCal);
// 如果用户在考勤周期内存在境外常驻信息则过滤出来并且计算当月应常驻天数
List<JWJT> results = getCZInfosAndCZDays(jwCZInfos, startAttendanceCal, endAttendanceCal);
baseBean.writeLog("如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数:"+results.size());
baseBean.writeLog("获取用户在考勤周期内存在境外常驻信息过滤出来,并且计算当月境外应常驻天数及境内工作天数:"+results.size());
// 计算考勤所属月员工的薪酬等级获取相应的境外津贴标准
List<String> users = results.stream().map(i -> i.getUser()).collect(Collectors.toList());
Map<Integer, XcdjJwjtParam> usersXSDJ = getOverseasAllowanceDAO().getXCDJByUsers(startAttendanceCal);
@ -64,7 +61,7 @@ public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCount
}
/**
* @description 获取用户在考勤周期内存在境外常驻信息过滤出来并且计算当月应常驻天数
* @description 获取用户在考勤周期内存在境外常驻信息过滤出来并且计算当月境外应常驻天数及境内工作天数
* @return List<JwCZInfo>
* @author Harryxzy
* @date 2022/9/26 16:29
@ -72,13 +69,17 @@ public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCount
public List<JWJT> getCZInfosAndCZDays(List<JwCZInfo> jwCZInfos,Calendar startAttendanceCal,Calendar endAttendanceCal){
ArrayList<JWJT> results = new ArrayList<>();
jwCZInfos.stream().filter(czInfo -> {
if(czInfo.getXm().equals("1462")){
System.out.println("H");
}
List<JwCZInfoDetail> czDetails = czInfo.getInfos();
// 用于存储计算到哪一天的日期
Calendar c = Calendar.getInstance();
c.setTime(endAttendanceCal.getTime());
Calendar[] countDay = {c};
int[] ycq = {0};
boolean[] flag = {false};
int[] gnycq ={0};
List<Date> details = new ArrayList<>();
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()))) {
@ -89,12 +90,11 @@ public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCount
ycq[0] += days;
countDay[0].setTime(detail.getJwczksrq());
countDay[0].add(Calendar.DATE, -1);
flag[0] = true;
} else {
// 开始常驻日期在 考勤开始日期前应出勤日期为自然日
int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime());
czInfo.setYczDays(days);
JWJT build = JWJT.builder().user(czInfo.getXm()).ycq(days).build();
// czInfo.setYczDays(days);
JWJT build = JWJT.builder().user(czInfo.getXm()).jwycq(days).gngzts(0.0).build();
results.add(build);
return true;
}
@ -103,31 +103,47 @@ public class OverseasAllowanceCountServiceImpl implements OverseasAllowanceCount
((detail.getJwczksrq().before(endAttendanceCal.getTime()) || detail.getJwczksrq().equals(endAttendanceCal.getTime()))
&& (detail.getJwczjsrq().after(startAttendanceCal.getTime()) || detail.getJwczjsrq().equals(startAttendanceCal.getTime())))) {
// 涉及考勤周期内的结束常驻
// 修正境外常驻开始日期
Calendar countStartCal = Calendar.getInstance();
countStartCal.setTime(detail.getJwczksrq());
if (detail.getJwczksrq().before(startAttendanceCal.getTime())) {
countStartCal.setTime(startAttendanceCal.getTime());
// 将区间转换为记录
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);
}
// 修正境外常驻结束日期
Calendar countEndCal = Calendar.getInstance();
countEndCal.setTime(detail.getJwczjsrq());
if (detail.getJwczjsrq().after(endAttendanceCal.getTime())) {
countEndCal.setTime(endAttendanceCal.getTime());
}
ycq[0] += BjcjCommonUtils.getDays(countStartCal.getTime(), countEndCal.getTime());
flag[0] = true;
}
if (i == czDetails.size() - 1 && flag[0] == true) {
// 已计算出应出勤天数
czInfo.setYczDays(ycq[0]);
JWJT build = JWJT.builder().user(czInfo.getXm()).ycq(ycq[0]).build();
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();
results.add(build);
return true;
}
}
return false;
});
}).collect(Collectors.toList());
return results;
}

View File

@ -33,7 +33,7 @@ public class OverseasAllowanceCountController {
public void countOverseasAllowance(@Context HttpServletRequest request, @Context HttpServletResponse response) {
User user = HrmUserVarify.getUser(request, response);
Calendar cal = BjcjCommonUtils.getNowCalendar();
cal.add(Calendar.MONTH,-1);
cal.add(Calendar.MONTH,-6);
baseBean.writeLog("开始计算:"+cal.getTime()+"的境外津贴");
new OverseasAllowanceCountServiceImpl().countOverseasAllowance(cal);
}