fix-国内外缺勤

This commit is contained in:
Harryxzy 2022-10-23 22:27:09 +08:00
parent c0b151bcbb
commit e00115028c
7 changed files with 224 additions and 62 deletions

View File

@ -26,7 +26,6 @@ public class OverseasAllowanceDAO {
*/
public List<JwCZInfoDetail> getCZInfo(Date startAttendanceCal,Date endAttendanceCal) {
RecordSet rs = new RecordSet();
//TODO 修改sqluf_bjcjtestgl
String sql="select xm,jwgzksrq,jwgzjsrq,lx,jsglts,g.jwglbtbz,jwgzdw1, a.btbz dqbtbz " +
"from UF_NJJMB_DT1 d LEFT JOIN UF_NJJMB m on d.MAINID=m.id " +
"LEFT JOIN UF_DQBTBZ a on d.jwgzdw1=a.id "+
@ -84,7 +83,7 @@ public class OverseasAllowanceDAO {
StringBuilder sb =new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if(users != null && users.size()>0){
sb = new StringBuilder("select h.id,z.gj,z.xd,z.sxrq,d.xcdj,jwjtbz,cb+lb+txf+wcbz sxbzhj FROM hrmresource h LEFT JOIN uf_xczjbd z on h.id=z.xm and sxrq <= '" +sdf.format(startAttendanceCal.getTime()) +
sb = new StringBuilder("select h.id,z.gj,z.xd,z.sxrq,d.xcdj,jwjtbz,sxbthj FROM hrmresource h LEFT JOIN uf_xczjbd z on h.id=z.xm and sxrq <= '" +sdf.format(startAttendanceCal.getTime()) +
"' LEFT JOIN uf_xcdj d on d.gj=z.gj and d.xd=z.xd WHERE h.id IN ( ");
for(int i=0;i<users.size();i++){
sb.append(users.get(i));
@ -100,7 +99,7 @@ public class OverseasAllowanceDAO {
int xm = rs.getInt("id");
String xcdjStr = rs.getString("XCDJ");
double jwjtbz = rs.getDouble("jwjtbz");
double sxbzhj = rs.getDouble("sxbzhj");
double sxbzhj = rs.getDouble("sxbthj");
if(sxbzhj == -1){
sxbzhj = 0.0;
}
@ -158,6 +157,43 @@ public class OverseasAllowanceDAO {
}
/**
* @description 获取公务回国信息
* @return Map<Integer,List<JwCZInfoDetail>>
* @author Harryxzy
* @date 2022/10/20 17:29
*/
public Map<Integer, List<JwCZInfoDetail>> getGwhg() {
RecordSet rs = new RecordSet();
String sql = " select xm,lx,jwgzksrq,jwgzjsrq from UF_NJJMB n left JOIN UF_NJJMB_DT1 d on n.id=d.MAINID WHERE lx =6";
HashMap<Integer, List<JwCZInfoDetail>> gwhg = new HashMap<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
rs.execute(sql);
while (rs.next()){
try {
String jwgzksrqStr = rs.getString("jwgzksrq");
Date jwgzksrq=null;
String jwgzjsrqStr = rs.getString("jwgzjsrq");
Date jwgzjsrq=null;
int xm = rs.getInt("xm");
if(jwgzksrqStr!=null && jwgzksrqStr.length()!=0){
jwgzksrq = sdf.parse(jwgzksrqStr);
}
if(jwgzjsrqStr!=null && jwgzjsrqStr.length()!=0){
jwgzjsrq = sdf.parse(jwgzjsrqStr);
}
JwCZInfoDetail build = JwCZInfoDetail.builder().lx(rs.getInt("lx")).jwczksrq(jwgzksrq).jwczjsrq(jwgzjsrq).build();
if(gwhg.containsKey(xm)){
gwhg.get(xm).add(build);
}else {
ArrayList<JwCZInfoDetail> list = new ArrayList<>();
list.add(build);
gwhg.put(xm,list);
}
}catch (Exception e){
baseBean.writeLog(e);
}
}
return gwhg;
}
}

View File

@ -45,9 +45,14 @@ public class JWJT {
private double gngzts;
/**
* 缺勤天数(请假)
* 国内缺勤天数(请假)
*/
private double qq;
private double gnQq;
/**
* 境外缺勤天数(请假)
*/
private double jwQq;
/**
* 公务回国天数包含周末

View File

@ -25,7 +25,7 @@ public class JwCZInfoDetail {
private String xm;
/**
* 类型 0开始常驻1结束常驻
* 类型 0开始常驻1结束常驻 6公务回国
*/
private Integer lx;

View File

@ -2,6 +2,7 @@ package com.engine.bjcj220907.service;
import com.engine.bjcj220907.entity.Attend4MonthBonus;
import java.util.List;
import java.util.Map;
/**
@ -17,5 +18,5 @@ public interface GetKQ4OverseasAllowanceCountService {
* @author Harryxzy
* @date 2022/9/27 15:58
*/
Map<String,Double> getKQDatas(Attend4MonthBonus attend4MonthBonus);
Map<String,Object> getKQDatas(Attend4MonthBonus attend4MonthBonus, List<String> users);
}

View File

@ -1,6 +1,5 @@
package com.engine.bjcj220907.service.impl;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSONObject;
import com.engine.bjcj220907.entity.Attend4MonthBonus;
import com.engine.bjcj220907.service.GetKQ4OverseasAllowanceCountService;
@ -9,10 +8,7 @@ import com.engine.kq.cmd.report.GetKQReportCmd;
import com.weaver.general.BaseBean;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* @author Harryxzy
@ -29,12 +25,12 @@ public class GetKQ4OverseasAllowanceCountServiceImpl extends Service implements
* @date 2022/9/27 15:58
*/
@Override
public Map<String, Double> getKQDatas(Attend4MonthBonus attend4MonthBonus) {
public Map<String, Object> getKQDatas(Attend4MonthBonus attend4MonthBonus,List<String> users) {
baseBean.writeLog("开始获取考勤数据,参数{}", attend4MonthBonus);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM");
// SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM");
List<Map> columnsList = new ArrayList<>();
List<Map<String, String>> dataList = new ArrayList<>();
List<Map<String, Object>> dataList = new ArrayList<>();
try {
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("typeselect", "6");
@ -54,46 +50,55 @@ public class GetKQ4OverseasAllowanceCountServiceImpl extends Service implements
baseBean.writeLog("GetKQReportCmd执行成功");
// 获取列数据
columnsList = (List<Map>) execute.get("columns");
List c = new ArrayList();
String[] gwhgDataIndex={""};
columnsList.stream().forEach(column->{
if(column.get("title").equals("旷工")){
c.add(column.get("dataIndex"));
}
if(column.get("title").equals("出差及请假")){
List<Map> children =(List<Map>) column.get("children");
children.stream().forEach(i->{
if((!i.get("title").equals("境内年假")) && (!i.get("title").equals("境外年假")) && (!i.get("title").equals("工伤"))){
c.add(i.get("dataIndex"));
}
if(i.get("title").equals("公务回国") ){
gwhgDataIndex[0] =(String) column.get("dataIndex");
}
});
}
});
baseBean.writeLog("计算缺勤列:"+c);
dataList = (List<Map<String, String>>) execute.get("datas");
// 获取每个人的缺勤天数及公务回国天数
Map<String, Double> qqDays = new HashMap<>();
dataList = (List<Map<String, Object>>) execute.get("datas");
// 获取每个人的缺勤日期及公务回国天数
Map<String, Object> qqDays = new HashMap<>();
String[] gwhgS= {""};
Calendar countBeginCal = Calendar.getInstance();
countBeginCal.setTime(attend4MonthBonus.getBeginDate());
Calendar countEndCal = Calendar.getInstance();
countEndCal.setTime(attend4MonthBonus.getEndDate());
List<Date> attDateList = new ArrayList<>();
while (countEndCal.after(countBeginCal) || countEndCal.getTime().equals(countBeginCal.getTime())){
attDateList.add(countEndCal.getTime());
countEndCal.add(Calendar.DATE,-1);
}
baseBean.writeLog("获取缺勤日期为:"+attDateList);
dataList.stream().forEach(i->{
double[] qq={0.0};
c.stream().forEach(j->{
// 累加各种请假天数
qq[0]+=Double.parseDouble(i.get(j));
});
String qqStr = i.get("resourceId") +"-qq";
qqDays.put(qqStr,qq[0]);
String gwhgStr = i.get("resourceId") + "-gwhg";
if(!gwhgDataIndex[0].equals("")){
gwhgS[0] = i.get(gwhgDataIndex[0]);
}else {
gwhgS[0] ="0";
if(users.contains(i.get("resourceId"))){
List<Date> qqDate = new ArrayList<>();
attDateList.stream().forEach(a -> {
Map attCalMap =(Map) i.get(sdf.format(a));
String attCal = (String)attCalMap.get("text");
if( (!attCal.equals("")) && (!attCal.contains("休息")) && (!attCal.equals("")) && ( (attCal.contains("旷工")) || (attCal.contains("事假")) || (attCal.contains("病假")) || (attCal.contains("丧假")) || (attCal.contains("产假")) || (attCal.contains("婚假"))
|| (attCal.contains("探亲假")) || (attCal.contains("陪产假")) || (attCal.contains("待岗")) || (attCal.contains("隔离假")) || (attCal.contains("哺乳假")) || (attCal.contains("产检假")) || (attCal.contains("计划生育假"))
|| (attCal.contains("第三国出差/境外国内出差")) || (attCal.contains("公务回国")) || (attCal.contains("境外出差")) || (attCal.contains("境内出差")) || (attCal.contains("育儿假-境内")) || (attCal.contains("路程假")) || (attCal.contains("育儿假-境外")) ) ){
// 存在缺勤
qqDate.add(a);
}
});
String qqStr = i.get("resourceId") +"-qq";
qqDays.put(qqStr,qqDate);
String gwhgStr = i.get("resourceId") + "-gwhg";
if(!gwhgDataIndex[0].equals("")){
gwhgS[0] = (String) i.get(gwhgDataIndex[0]);
}else {
gwhgS[0] ="0";
}
qqDays.put(gwhgStr,Double.valueOf(gwhgS[0]));
}
qqDays.put(gwhgStr,Double.valueOf(gwhgS[0]));
});
baseBean.writeLog("获取的考勤缺勤及公务回国天数,{}", JSONUtils.toJSONString(qqDays));
return qqDays;
} catch (Exception e) {
baseBean.writeLog("获取考勤数据失败{}", e);

View File

@ -54,23 +54,27 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse
baseBean.writeLog("获取所有人的境外常驻信息,共:"+czInfos.size());
// 将境外常驻信息格式化
List<JwCZInfo> jwCZInfos = formatJwCZInfo(czInfos,startAttendanceCal,endAttendanceCal);
baseBean.writeLog("将境外常驻信息格式化");
// 如果用户在考勤周期内存在境外常驻信息则过滤出来并且计算当月应常驻天数
baseBean.writeLog("将境外常驻信息格式化,共:"+jwCZInfos.size());
// 如果用户在考勤周期内存在境外常驻信息则过滤出来并且计算当月应常驻天数及境内工作天数
List<JWJT> results = new ArrayList<>();
jwCZInfos = getCZInfosAndCZDays(jwCZInfos, startAttendanceCal, endAttendanceCal,results);
baseBean.writeLog("获取用户在考勤周期内存在境外常驻信息过滤出来,并且计算当月境外应常驻天数及境内工作天数,共::"+results.size());
// 计算考勤所属月员工的薪酬等级获取相应的境外津贴标准
List<String> users = results.stream().map(i -> i.getUser()).collect(Collectors.toList());
Map<Integer, XcdjJwjtParam> usersXSDJ = getOverseasAllowanceDAO().getXCDJByUsers(users,startAttendanceCal);
baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准、四项补贴合计,共:"+usersXSDJ.size());
// 获取公务回国天数 缺勤天数
Map<Integer, XcdjJwjtParam> usersXCDJ = getOverseasAllowanceDAO().getXCDJByUsers(users,startAttendanceCal);
baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准、四项补贴合计,共:"+usersXCDJ.size());
// 获取考勤员工的公务回国天数 缺勤日期
Attend4MonthBonus build = Attend4MonthBonus.builder().beginDate(startAttendanceCal.getTime()).endDate(endAttendanceCal.getTime()).build();
Map<String, Double> kqDatas = GetKQ4OverseasAllowanceCountService().getKQDatas(build);
baseBean.writeLog("调用考勤接口获取公务回国天数 及 缺勤天数,共:"+usersXSDJ.size());
// 封装计算薪酬等级境外津贴标准考勤天数四项补助合计
// int days = BjcjCommonUtils.getDays(startAttendanceCal.getTime(), endAttendanceCal.getTime());
getXcdjAndJwjtbz(results,usersXSDJ,kqDatas);
// TODO:验证一下188 陈涛有没有考勤数据 结果不再是0.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);
baseBean.writeLog("封装薪酬等级、境外津贴标准、考勤天数、境外实际常驻天数并计算实出勤天数、境外津贴,共:"+results.size());
// 处理第三国出差(2)境外国内出差3艰苦地区补贴
Map<Integer, List<JwCZInfoDetail>> dsgccJkdq = getOverseasAllowanceDAO().getDsgcc();
@ -80,6 +84,7 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse
// 处理四项补贴月标准
// 四项补贴合计天标准*公务回国工作日天数+境外国内出差工作日天数+国内工作日天数
countSxbthj(results);
baseBean.writeLog("计算四项补贴合计");
}
@ -202,7 +207,8 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse
* @author Harryxzy
* @date 2022/9/27 15:37
*/
public void getXcdjAndJwjtbz(List<JWJT> results ,Map<Integer, XcdjJwjtParam> usersXSDJ,Map<String, Double> kqDatas){
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));
results.stream().forEach(item-> {
XcdjJwjtParam param = usersXSDJ.get(Integer.valueOf(item.getUser()));
item.setXcdj(param.getXcdj());
@ -211,18 +217,79 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse
item.setSxbzhjrbz(param.getSxbzhj()/21.75);
if(kqDatas.get(item.getUser() + "-qq") == null){
// 目前该员工没有考勤数据
item.setQq(0.0);
item.setGnQq(0.0);
item.setJwQq(0.0);
item.setGwhg(0.0);
baseBean.writeLog("员工" +item.getUser()+"没有考勤数据!请核对考勤报表");
}else{
item.setQq(kqDatas.get(item.getUser()+"-qq"));
item.setGwhg(kqDatas.get(item.getUser()+"-gwhg"));
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;
}
// todo 看一下这个时分秒
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"));
}
item.setJwscq(item.getJwycq()-item.getQq()-item.getGwhg());
item.setJwscq(item.getJwycq()-item.getJwQq()-item.getGwhg());
item.setJwjt(item.getJwscq()*item.getJwjtbz());
if(validGwhgAndCountWorkdays.containsKey(Integer.valueOf(item.getUser()))){
// 该员工有公务回国数据
Integer workDays = validGwhgAndCountWorkdays.get(Integer.valueOf(item.getUser()));
item.setGwhgWorkdays(workDays);
}
});
}
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);
}
/**
* @description 境外常驻信息格式化
* @return void
@ -245,7 +312,7 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse
/**
* @description 封装第三国出差数据到results中
* @description 封装第三国出差和境外国内出差数据到results中
* @return void
* @author Harryxzy
* @date 2022/9/28 17:07
@ -289,10 +356,58 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse
*/
private void countSxbthj(List<JWJT> results) {
results.stream().forEach(result->{
// 获取员工的公务回国天数和国内工作日天数 * 四项补助日标准
// 获取员工的公务回国工作日天数和国内工作日天数 * 四项补助日标准
result.setSxbzhj((result.getGngzts()+result.getGwhgWorkdays()) * result.getSxbzhjrbz());
});
}
/**
* @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;
}
}

View File

@ -7,10 +7,10 @@
<map>
<entry key="com.zeroturnaround.jrebel.FormatVersion" value="7.0.0" />
<entry key="jrebelEnabled" value="true" />
<entry key="lastExternalPluginCheckTime" value="1663248149371" />
<entry key="lastExternalPluginCheckTime" value="1666149205549" />
</map>
</option>
<option name="version" value="4" />
<option name="version" value="5" />
</configuration>
</facet>
</component>