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;
|
2022-09-27 21:19:37 +08:00
|
|
|
|
import com.engine.bjcj220907.entity.*;
|
|
|
|
|
|
import com.engine.bjcj220907.service.GetKQ4OverseasAllowanceCountService;
|
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-27 21:19:37 +08:00
|
|
|
|
import com.engine.common.util.ServiceUtil;
|
|
|
|
|
|
import com.engine.core.impl.Service;
|
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 境外津贴
|
|
|
|
|
|
*/
|
2022-09-27 21:19:37 +08:00
|
|
|
|
public class OverseasAllowanceCountServiceImpl extends Service implements OverseasAllowanceCountService {
|
2022-09-26 14:52:34 +08:00
|
|
|
|
|
|
|
|
|
|
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-27 21:19:37 +08:00
|
|
|
|
|
|
|
|
|
|
private GetKQ4OverseasAllowanceCountService GetKQ4OverseasAllowanceCountService() {
|
|
|
|
|
|
return ServiceUtil.getService(GetKQ4OverseasAllowanceCountServiceImpl.class,user);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
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) {
|
|
|
|
|
|
// 境外津贴包含:境外津贴(天标准)+境外工龄补贴(月标准)+艰苦地区补贴(天标准)
|
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-28 18:09:50 +08:00
|
|
|
|
// 获取境外津贴(天标准) --计算当月应常驻天数
|
|
|
|
|
|
// 获取所有人的境外常驻信息
|
|
|
|
|
|
List<JwCZInfoDetail> czInfos = getOverseasAllowanceDAO().getCZInfo(startAttendanceCal.getTime(),endAttendanceCal.getTime());
|
|
|
|
|
|
baseBean.writeLog("获取所有人的境外常驻信息,共:"+czInfos.size());
|
2022-09-28 15:58:46 +08:00
|
|
|
|
// 将境外常驻信息格式化
|
|
|
|
|
|
List<JwCZInfo> jwCZInfos = formatJwCZInfo(czInfos,startAttendanceCal,endAttendanceCal);
|
2022-10-23 22:27:09 +08:00
|
|
|
|
baseBean.writeLog("将境外常驻信息格式化,共:"+jwCZInfos.size());
|
|
|
|
|
|
// 如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数及境内工作天数
|
2022-09-28 17:36:07 +08:00
|
|
|
|
List<JWJT> results = new ArrayList<>();
|
|
|
|
|
|
jwCZInfos = getCZInfosAndCZDays(jwCZInfos, startAttendanceCal, endAttendanceCal,results);
|
2022-09-28 15:58:46 +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-10-23 22:27:09 +08:00
|
|
|
|
Map<Integer, XcdjJwjtParam> usersXCDJ = getOverseasAllowanceDAO().getXCDJByUsers(users,startAttendanceCal);
|
|
|
|
|
|
baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准、四项补贴合计,共:"+usersXCDJ.size());
|
|
|
|
|
|
// 获取考勤员工的公务回国天数 及 缺勤日期
|
2022-09-27 21:19:37 +08:00
|
|
|
|
Attend4MonthBonus build = Attend4MonthBonus.builder().beginDate(startAttendanceCal.getTime()).endDate(endAttendanceCal.getTime()).build();
|
2022-10-23 22:27:09 +08:00
|
|
|
|
Map<String, Object> kqDatas = GetKQ4OverseasAllowanceCountService().getKQDatas(build,users);
|
|
|
|
|
|
baseBean.writeLog("调用考勤接口获取公务回国天数 及 缺勤日期:"+kqDatas);
|
|
|
|
|
|
// 获取员工公务回国国内工作日天数
|
|
|
|
|
|
Map<Integer, List<JwCZInfoDetail>> gwhgInfos = getOverseasAllowanceDAO().getGwhg();
|
|
|
|
|
|
baseBean.writeLog("获取年假建模中所有公务回国信息,共:"+gwhgInfos.size());
|
|
|
|
|
|
// 过滤考勤周期内的公务回国信息,并计算出国内工作日天数
|
|
|
|
|
|
Map<Integer, Integer> validGwhgAndCountWorkdays = getValidGwhgAndCountWorkdays(gwhgInfos, startAttendanceCal.getTime(), endAttendanceCal.getTime());
|
|
|
|
|
|
baseBean.writeLog("过滤考勤周期内的公务回国信息,并计算出国内工作日天数:"+validGwhgAndCountWorkdays);
|
|
|
|
|
|
// 封装计算薪酬等级、境外津贴标准、考勤天数、四项补助合计、公务回国国内工作日天数
|
|
|
|
|
|
getXcdjAndJwjtbz(results,usersXCDJ,kqDatas,validGwhgAndCountWorkdays,jwCZInfos);
|
2022-09-28 15:58:46 +08:00
|
|
|
|
baseBean.writeLog("封装薪酬等级、境外津贴标准、考勤天数、境外实际常驻天数并计算实出勤天数、境外津贴,共:"+results.size());
|
2022-09-29 16:34:37 +08:00
|
|
|
|
// 处理第三国出差(2)、境外国内出差(3)艰苦地区补贴
|
2022-09-29 14:48:25 +08:00
|
|
|
|
Map<Integer, List<JwCZInfoDetail>> dsgccJkdq = getOverseasAllowanceDAO().getDsgcc();
|
2022-09-29 18:07:09 +08:00
|
|
|
|
baseBean.writeLog("获取第三国出差(2)、境外国内出差(3)艰苦地区补贴,共:"+dsgccJkdq.size());
|
2022-10-24 18:01:00 +08:00
|
|
|
|
baseBean.writeLog("第三国出差(2)、境外国内出差(3)艰苦地区补贴:"+dsgccJkdq);
|
2022-09-29 16:34:37 +08:00
|
|
|
|
// 封装第三国出差数、境外国内出差据到result中
|
2022-09-29 14:48:25 +08:00
|
|
|
|
getDsgcc(results,dsgccJkdq,startAttendanceCal.getTime(),endAttendanceCal.getTime());
|
2022-10-24 18:01:00 +08:00
|
|
|
|
// 计算艰苦地区补贴合计
|
|
|
|
|
|
coutJkdqbthj(results);
|
2022-09-29 18:07:09 +08:00
|
|
|
|
// 四项补贴合计(天标准)*(公务回国工作日天数+境外国内出差工作日天数+国内工作日天数)
|
|
|
|
|
|
countSxbthj(results);
|
2022-10-24 18:01:00 +08:00
|
|
|
|
baseBean.writeLog("计算四项补贴合计:"+results.size());
|
|
|
|
|
|
// 将结果插入建模表中
|
|
|
|
|
|
getOverseasAllowanceDAO().insertOverseasAllowance(results);
|
|
|
|
|
|
baseBean.writeLog("将结果插入建模表中");
|
2022-09-29 18:07:09 +08:00
|
|
|
|
}
|
2022-09-29 16:34:37 +08:00
|
|
|
|
|
2022-10-24 18:01:00 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @description 计算艰苦地区补贴合计
|
|
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/10/24 14:11
|
|
|
|
|
|
*/
|
|
|
|
|
|
private void coutJkdqbthj(List<JWJT> results) {
|
|
|
|
|
|
results.stream().forEach(result->{
|
|
|
|
|
|
double[] total={0.0};
|
|
|
|
|
|
List<JKDQBT> jkdqbts = result.getJkdqbts();
|
|
|
|
|
|
jkdqbts.stream().forEach(j -> {
|
|
|
|
|
|
total[0]=total[0]+j.getJkdqbt();
|
|
|
|
|
|
});
|
|
|
|
|
|
result.setJkdqbthj(total[0]);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2022-09-29 16:34:37 +08:00
|
|
|
|
|
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-28 17:36:07 +08:00
|
|
|
|
public List<JwCZInfo> getCZInfosAndCZDays(List<JwCZInfo> jwCZInfos,Calendar startAttendanceCal,Calendar endAttendanceCal,List<JWJT> results ){
|
|
|
|
|
|
List<JwCZInfo> collect = jwCZInfos.stream().filter(czInfo -> {
|
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-28 17:36:07 +08:00
|
|
|
|
int[] gnycq = {0};
|
2022-09-27 14:34:54 +08:00
|
|
|
|
List<Date> details = new ArrayList<>();
|
2022-09-29 11:22:33 +08:00
|
|
|
|
ArrayList<JKDQBT> jkdqbts = 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);
|
2022-09-29 11:22:33 +08:00
|
|
|
|
// 存入常驻天数用于计算艰苦地区补贴
|
|
|
|
|
|
// int days1 = BjcjCommonUtils.getDays(detail.getJwczksrq(), endAttendanceCal.getTime());
|
|
|
|
|
|
detail.setDays(days);
|
2022-10-24 18:01:00 +08:00
|
|
|
|
JKDQBT jk = JKDQBT.builder().lx(detail.getLx()).days(days).jkdq(detail.getJkdq()).jkdqbtbz(detail.getJkdqbtbz()).jkdqbt((days*detail.getJkdqbtbz())).build();
|
2022-09-29 11:22:33 +08:00
|
|
|
|
jkdqbts.add(jk);
|
2022-09-26 17:04:07 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
// 开始常驻日期在 考勤开始日期前(应出勤日期为自然日)
|
|
|
|
|
|
int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime());
|
2022-09-29 11:22:33 +08:00
|
|
|
|
// 存入常驻天数用于计算艰苦地区补贴
|
|
|
|
|
|
// int days1 = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime());
|
|
|
|
|
|
detail.setDays(days);
|
2022-10-24 18:01:00 +08:00
|
|
|
|
JKDQBT jk = JKDQBT.builder().lx(detail.getLx()).days(days).jkdq(detail.getJkdq()).jkdqbtbz(detail.getJkdqbtbz()).jkdqbt((days*detail.getJkdqbtbz())).build();
|
|
|
|
|
|
JWJT build = JWJT.builder().user(czInfo.getXm()).sfzh(czInfo.getSfzh()).jwycq(days).gngzts(0.0).kqMonth(endAttendanceCal.getTime()).jwgl(czInfo.getJsglts()).jwglbtybz(czInfo.getGlbtybz()).jwglbtrbz(czInfo.getGlbtrbz()).build();
|
2022-09-29 11:22:33 +08:00
|
|
|
|
ArrayList<JKDQBT> jkdqbtList = new ArrayList<>();
|
|
|
|
|
|
jkdqbtList.add(jk);
|
|
|
|
|
|
build.setJkdqbts(jkdqbtList);
|
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-29 11:22:33 +08:00
|
|
|
|
// 修正常驻开始时间和结束时间
|
|
|
|
|
|
Calendar countStartCal = Calendar.getInstance();
|
|
|
|
|
|
countStartCal.setTime(detail.getJwczksrq());
|
|
|
|
|
|
Calendar countEndCal = Calendar.getInstance();
|
|
|
|
|
|
countEndCal.setTime(detail.getJwczjsrq());
|
|
|
|
|
|
if(countStartCal.getTime().before(startAttendanceCal.getTime())){
|
|
|
|
|
|
countStartCal.setTime(startAttendanceCal.getTime());
|
|
|
|
|
|
}
|
|
|
|
|
|
if(countEndCal.getTime().after(endAttendanceCal.getTime())){
|
|
|
|
|
|
countEndCal.setTime(endAttendanceCal.getTime());
|
|
|
|
|
|
}
|
|
|
|
|
|
int days = BjcjCommonUtils.getDays(countStartCal.getTime(), countEndCal.getTime());
|
|
|
|
|
|
detail.setDays(days);
|
2022-10-24 18:01:00 +08:00
|
|
|
|
JKDQBT jk = JKDQBT.builder().lx(detail.getLx()).days(days).jkdq(detail.getJkdq()).jkdqbtbz(detail.getJkdqbtbz()).jkdqbt((days*detail.getJkdqbtbz())).build();
|
2022-09-29 11:22:33 +08:00
|
|
|
|
jkdqbts.add(jk);
|
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);
|
2022-09-28 17:36:07 +08:00
|
|
|
|
if (details.size() == 0 && countDay[0].getTime().equals(endAttendanceCal.getTime())) {
|
2022-09-27 14:34:54 +08:00
|
|
|
|
// 该考勤周期内员工没有境外常驻信息
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2022-09-28 17:36:07 +08:00
|
|
|
|
while (startAttendanceCal.getTime().before(aCal.getTime()) || startAttendanceCal.getTime().equals(aCal.getTime())) {
|
|
|
|
|
|
if (details.contains(aCal.getTime())) {
|
2022-09-27 14:34:54 +08:00
|
|
|
|
// 存在境外记录
|
|
|
|
|
|
ycq[0]++;
|
2022-09-28 17:36:07 +08:00
|
|
|
|
aCal.add(Calendar.DATE, -1);
|
|
|
|
|
|
} else {
|
2022-09-27 14:34:54 +08:00
|
|
|
|
// 没有境外记录,判断是否是工作日
|
2022-09-28 17:36:07 +08:00
|
|
|
|
if ((aCal.get(Calendar.DAY_OF_WEEK) != 1) && (aCal.get(Calendar.DAY_OF_WEEK) != 7)) {
|
2022-09-27 14:34:54 +08:00
|
|
|
|
// 是工作日
|
|
|
|
|
|
gnycq[0]++;
|
|
|
|
|
|
}
|
2022-09-28 17:36:07 +08:00
|
|
|
|
aCal.add(Calendar.DATE, -1);
|
2022-09-27 14:34:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-10-24 18:01:00 +08:00
|
|
|
|
JWJT build = JWJT.builder().user(czInfo.getXm()).sfzh(czInfo.getSfzh()).jwycq(ycq[0]).gngzts(gnycq[0]).kqMonth(endAttendanceCal.getTime()).jwgl(czInfo.getJsglts()).jwglbtybz(czInfo.getGlbtybz()).jwglbtrbz(czInfo.getGlbtrbz()).build();
|
2022-09-29 11:22:33 +08:00
|
|
|
|
build.setJkdqbts(jkdqbts);
|
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-28 17:36:07 +08:00
|
|
|
|
return collect;
|
2022-09-26 17:04:07 +08:00
|
|
|
|
}
|
2022-09-26 14:52:34 +08:00
|
|
|
|
|
2022-09-28 15:58:46 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @description 将获取到的缺勤天数(请假)、公务回国天数、薪酬等级与境外津贴标准与人员对应并计算出实出勤天数
|
2022-09-27 21:19:37 +08:00
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/9/27 15:37
|
|
|
|
|
|
*/
|
2022-10-23 22:27:09 +08:00
|
|
|
|
public void getXcdjAndJwjtbz(List<JWJT> results ,Map<Integer, XcdjJwjtParam> usersXSDJ,Map<String, Object> kqDatas,Map<Integer, Integer> validGwhgAndCountWorkdays,List<JwCZInfo> jwCZInfos){
|
|
|
|
|
|
Map<String, List<JwCZInfoDetail>> czInfos = jwCZInfos.stream().collect(Collectors.toMap(JwCZInfo::getXm, JwCZInfo::getInfos));
|
2022-09-27 21:19:37 +08:00
|
|
|
|
results.stream().forEach(item-> {
|
|
|
|
|
|
XcdjJwjtParam param = usersXSDJ.get(Integer.valueOf(item.getUser()));
|
|
|
|
|
|
item.setXcdj(param.getXcdj());
|
|
|
|
|
|
item.setJwjtbz(param.getJwjtbz());
|
2022-09-29 18:07:09 +08:00
|
|
|
|
item.setSxbzhjbz(param.getSxbzhj());
|
2022-09-30 09:35:29 +08:00
|
|
|
|
item.setSxbzhjrbz(param.getSxbzhj()/21.75);
|
2022-09-28 15:58:46 +08:00
|
|
|
|
if(kqDatas.get(item.getUser() + "-qq") == null){
|
|
|
|
|
|
// 目前该员工没有考勤数据
|
2022-10-23 22:27:09 +08:00
|
|
|
|
item.setGnQq(0.0);
|
|
|
|
|
|
item.setJwQq(0.0);
|
2022-09-28 15:58:46 +08:00
|
|
|
|
item.setGwhg(0.0);
|
|
|
|
|
|
baseBean.writeLog("员工" +item.getUser()+"没有考勤数据!请核对考勤报表");
|
|
|
|
|
|
}else{
|
2022-10-23 22:27:09 +08:00
|
|
|
|
List<Date> qqDate =(List <Date>) kqDatas.get(item.getUser() + "-qq");
|
|
|
|
|
|
double gnQqDays=0.0;
|
|
|
|
|
|
double jwQqDays=0.0;
|
|
|
|
|
|
// 判断是境内缺勤还是境外缺勤
|
|
|
|
|
|
List<JwCZInfoDetail> jwCZInfoDetails = czInfos.get(item.getUser());
|
|
|
|
|
|
if(jwCZInfoDetails != null && jwCZInfoDetails.size()>0){
|
|
|
|
|
|
for(Date d : qqDate){
|
|
|
|
|
|
Boolean flag = false;
|
|
|
|
|
|
for(int i=0; (i<jwCZInfoDetails.size() && flag == false) ;i++){
|
|
|
|
|
|
JwCZInfoDetail detail = jwCZInfoDetails.get(i);
|
|
|
|
|
|
Calendar k = Calendar.getInstance();
|
|
|
|
|
|
k.setTime(detail.getJwczksrq());
|
|
|
|
|
|
setLastMinute(k);
|
|
|
|
|
|
detail.setJwczksrq(k.getTime());
|
|
|
|
|
|
if(detail.getJwczjsrq() != null){
|
|
|
|
|
|
Calendar j = Calendar.getInstance();
|
|
|
|
|
|
j.setTime(detail.getJwczjsrq());
|
|
|
|
|
|
setLastMinute(j);
|
|
|
|
|
|
detail.setJwczjsrq(j.getTime());
|
|
|
|
|
|
}
|
|
|
|
|
|
if(detail.getLx()==0){
|
|
|
|
|
|
// 开始常驻
|
|
|
|
|
|
if(detail.getJwczksrq().before(d) || detail.getJwczksrq().equals(d)){
|
|
|
|
|
|
// 在境外常驻期内的缺勤
|
|
|
|
|
|
jwQqDays++;
|
|
|
|
|
|
flag=true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}else {
|
|
|
|
|
|
// 结束常驻
|
|
|
|
|
|
if(detail.getJwczjsrq().before(d)){
|
|
|
|
|
|
// 境外常驻结束日期在缺勤日前
|
|
|
|
|
|
gnQqDays++;
|
|
|
|
|
|
flag=true;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(BjcjCommonUtils.isBetween(d,detail.getJwczksrq(),detail.getJwczjsrq())){
|
|
|
|
|
|
// 在境外常驻期内的缺勤
|
|
|
|
|
|
jwQqDays++;
|
|
|
|
|
|
flag=true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if( (i+1 == jwCZInfoDetails.size()) && (flag == false)){
|
|
|
|
|
|
gnQqDays++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
item.setGnQq(gnQqDays);
|
|
|
|
|
|
item.setJwQq(jwQqDays);
|
|
|
|
|
|
item.setGwhg((Double) kqDatas.get(item.getUser()+"-gwhg"));
|
2022-09-28 15:58:46 +08:00
|
|
|
|
}
|
2022-10-23 22:27:09 +08:00
|
|
|
|
item.setJwscq(item.getJwycq()-item.getJwQq()-item.getGwhg());
|
2022-10-24 18:01:00 +08:00
|
|
|
|
item.setGnscq(item.getGngzts() - item.getGnQq());
|
2022-09-28 15:58:46 +08:00
|
|
|
|
item.setJwjt(item.getJwscq()*item.getJwjtbz());
|
2022-10-23 22:27:09 +08:00
|
|
|
|
if(validGwhgAndCountWorkdays.containsKey(Integer.valueOf(item.getUser()))){
|
|
|
|
|
|
// 该员工有公务回国数据
|
|
|
|
|
|
Integer workDays = validGwhgAndCountWorkdays.get(Integer.valueOf(item.getUser()));
|
|
|
|
|
|
item.setGwhgWorkdays(workDays);
|
|
|
|
|
|
}
|
2022-09-27 21:19:37 +08:00
|
|
|
|
});
|
|
|
|
|
|
}
|
2022-09-28 15:58:46 +08:00
|
|
|
|
|
2022-10-23 22:27:09 +08:00
|
|
|
|
private void setLastMinute(Calendar c){
|
|
|
|
|
|
c.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
|
|
|
c.set(Calendar.MINUTE, 59);
|
|
|
|
|
|
c.set(Calendar.SECOND, 59);
|
|
|
|
|
|
c.set(Calendar.MILLISECOND, 999);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-09-28 15:58:46 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @description 境外常驻信息格式化
|
|
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/9/28 17:07
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static List<JwCZInfo> formatJwCZInfo(List<JwCZInfoDetail> czInfos,Calendar startAttendanceCal,Calendar endAttendanceCal) {
|
|
|
|
|
|
Map<String, List<JwCZInfoDetail>> groupByName = czInfos.stream().collect(Collectors.groupingBy(item -> item.getXm()));
|
|
|
|
|
|
int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime());
|
|
|
|
|
|
List<JwCZInfo> formatJwCZInfos = new ArrayList<>();
|
|
|
|
|
|
for (Map.Entry<String, List<JwCZInfoDetail>> entry : groupByName.entrySet()) {
|
|
|
|
|
|
List<JwCZInfoDetail> values = entry.getValue();
|
2022-10-24 18:01:00 +08:00
|
|
|
|
JwCZInfo build = new JwCZInfo().builder().xm(values.get(0).getXm()).sfzh(values.get(0).getSfzh()).jsglts(values.get(0).getJsglts())
|
2022-10-12 21:27:46 +08:00
|
|
|
|
.glbtybz(values.get(0).getGlbtybz()).glbtrbz(values.get(0).getGlbtybz()/days)
|
|
|
|
|
|
.infos(entry.getValue()).build();
|
2022-09-28 15:58:46 +08:00
|
|
|
|
formatJwCZInfos.add(build);
|
|
|
|
|
|
}
|
|
|
|
|
|
return formatJwCZInfos;
|
|
|
|
|
|
}
|
2022-09-29 14:48:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2022-10-23 22:27:09 +08:00
|
|
|
|
* @description 封装第三国出差和境外国内出差数据到results中
|
2022-09-29 14:48:25 +08:00
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/9/28 17:07
|
|
|
|
|
|
*/
|
2022-09-29 16:34:37 +08:00
|
|
|
|
public void getDsgcc(List<JWJT> results,Map<Integer, List<JwCZInfoDetail>> dsgccJkdq,Date startAttendance,Date endAttendance) {
|
2022-09-29 14:48:25 +08:00
|
|
|
|
results.stream().forEach(jwjt->{
|
|
|
|
|
|
Integer user = Integer.valueOf(jwjt.getUser());
|
|
|
|
|
|
if(dsgccJkdq.containsKey(user)){
|
|
|
|
|
|
// 该员工存在第三国出差数据
|
2022-09-29 16:34:37 +08:00
|
|
|
|
List<JwCZInfoDetail> jwCZInfoDetails = dsgccJkdq.get(user);
|
|
|
|
|
|
for(int i=0; i < jwCZInfoDetails.size(); i++){
|
|
|
|
|
|
JwCZInfoDetail detail = jwCZInfoDetails.get(i);
|
|
|
|
|
|
if ((detail.getJwczksrq().before(endAttendance) || detail.getJwczksrq().equals(endAttendance))
|
|
|
|
|
|
&& (detail.getJwczjsrq().after(startAttendance) || detail.getJwczjsrq().equals(startAttendance))) {
|
|
|
|
|
|
// 在考勤周期内的第三国出差数据
|
|
|
|
|
|
// 修正常驻开始时间和结束时间
|
|
|
|
|
|
Calendar countStartCal = Calendar.getInstance();
|
|
|
|
|
|
countStartCal.setTime(detail.getJwczksrq());
|
|
|
|
|
|
Calendar countEndCal = Calendar.getInstance();
|
|
|
|
|
|
countEndCal.setTime(detail.getJwczjsrq());
|
|
|
|
|
|
if(countStartCal.getTime().before(startAttendance)){
|
|
|
|
|
|
countStartCal.setTime(startAttendance);
|
|
|
|
|
|
}
|
|
|
|
|
|
if(countEndCal.getTime().after(endAttendance)){
|
|
|
|
|
|
countEndCal.setTime(endAttendance);
|
|
|
|
|
|
}
|
|
|
|
|
|
int days = BjcjCommonUtils.getDays(countStartCal.getTime(), countEndCal.getTime());
|
2022-10-24 18:01:00 +08:00
|
|
|
|
JKDQBT jk = JKDQBT.builder().lx(detail.getLx()).days(days).jkdq(detail.getJkdq()).jkdqbtbz(detail.getJkdqbtbz()).jkdqbt((days * detail.getJkdqbtbz())).build();
|
2022-09-29 16:34:37 +08:00
|
|
|
|
jwjt.getJkdqbts().add(jk);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-09-29 14:48:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2022-09-29 18:07:09 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @description 计算四项补助合计 = 四项补贴合计(天标准)*(公务回国工作日天数+国内工作日天数)
|
|
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/9/29 17:59
|
|
|
|
|
|
*/
|
|
|
|
|
|
private void countSxbthj(List<JWJT> results) {
|
2022-09-30 09:35:29 +08:00
|
|
|
|
results.stream().forEach(result->{
|
2022-10-23 22:27:09 +08:00
|
|
|
|
// 获取员工的公务回国工作日天数和国内工作日天数 * 四项补助日标准
|
2022-10-24 18:01:00 +08:00
|
|
|
|
result.setSxbzhj((result.getGnscq()+result.getGwhgWorkdays()) * result.getSxbzhjrbz());
|
2022-09-29 18:07:09 +08:00
|
|
|
|
});
|
|
|
|
|
|
}
|
2022-10-23 22:27:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @description 过滤考勤周期内的公务回国信息,并计算出国内工作日天数
|
|
|
|
|
|
* @return void
|
|
|
|
|
|
* @author Harryxzy
|
|
|
|
|
|
* @date 2022/10/21 9:47
|
|
|
|
|
|
*/
|
|
|
|
|
|
private Map<Integer,Integer> getValidGwhgAndCountWorkdays(Map<Integer, List<JwCZInfoDetail>> gwhgInfos, Date startAttendance, Date endAttendance) {
|
|
|
|
|
|
Map<Integer,Integer> result = new HashMap();
|
|
|
|
|
|
for(Map.Entry<Integer,List<JwCZInfoDetail>> entrySet : gwhgInfos.entrySet()){
|
|
|
|
|
|
List<JwCZInfoDetail> values = entrySet.getValue();
|
|
|
|
|
|
values.stream().forEach(value ->{
|
|
|
|
|
|
if( (value.getJwczksrq().before(endAttendance) || value.getJwczksrq().equals(endAttendance))
|
|
|
|
|
|
&& (value.getJwczjsrq().after(startAttendance) || value.getJwczjsrq().equals(startAttendance)) ){
|
|
|
|
|
|
// 在考勤周期内的公务回国,计算国内工作天数
|
|
|
|
|
|
Calendar countCal = Calendar.getInstance();
|
|
|
|
|
|
if(value.getJwczjsrq().after(endAttendance)){
|
|
|
|
|
|
countCal.setTime(endAttendance);
|
|
|
|
|
|
}else {
|
|
|
|
|
|
countCal.setTime(value.getJwczjsrq());
|
|
|
|
|
|
}
|
|
|
|
|
|
Calendar countStarCal = Calendar.getInstance();
|
|
|
|
|
|
if(value.getJwczksrq().before(startAttendance)){
|
|
|
|
|
|
countStarCal.setTime(startAttendance);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
countStarCal.setTime(value.getJwczksrq());
|
|
|
|
|
|
}
|
|
|
|
|
|
int workDays=0;
|
|
|
|
|
|
while (countCal.getTime().after(countStarCal.getTime()) || countCal.getTime().equals(countStarCal.getTime())){
|
|
|
|
|
|
// 判断是否是工作日
|
|
|
|
|
|
if((countCal.get(Calendar.DAY_OF_WEEK) != 1) && (countCal.get(Calendar.DAY_OF_WEEK)!=7)){
|
|
|
|
|
|
workDays++;
|
|
|
|
|
|
}
|
|
|
|
|
|
countCal.add(Calendar.DATE,-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
if(result.containsKey(entrySet.getKey())){
|
|
|
|
|
|
Integer integer = result.get(entrySet.getKey());
|
|
|
|
|
|
result.put(entrySet.getKey(), integer + workDays);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
result.put(entrySet.getKey(), workDays);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2022-09-29 18:07:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
2022-09-26 14:52:34 +08:00
|
|
|
|
}
|