From e00115028ce6f1a07ecced500953b5add1168cee Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Sun, 23 Oct 2022 22:27:09 +0800 Subject: [PATCH] =?UTF-8?q?fix-=E5=9B=BD=E5=86=85=E5=A4=96=E7=BC=BA?= =?UTF-8?q?=E5=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bjcj220907/dao/OverseasAllowanceDAO.java | 46 +++++- src/com/engine/bjcj220907/entity/JWJT.java | 9 +- .../bjcj220907/entity/JwCZInfoDetail.java | 2 +- .../GetKQ4OverseasAllowanceCountService.java | 3 +- ...tKQ4OverseasAllowanceCountServiceImpl.java | 71 ++++---- .../OverseasAllowanceCountServiceImpl.java | 151 +++++++++++++++--- weaver-bjcj.iml | 4 +- 7 files changed, 224 insertions(+), 62 deletions(-) diff --git a/src/com/engine/bjcj220907/dao/OverseasAllowanceDAO.java b/src/com/engine/bjcj220907/dao/OverseasAllowanceDAO.java index 7d92c60..5107080 100644 --- a/src/com/engine/bjcj220907/dao/OverseasAllowanceDAO.java +++ b/src/com/engine/bjcj220907/dao/OverseasAllowanceDAO.java @@ -26,7 +26,6 @@ public class OverseasAllowanceDAO { */ public List 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> + * @author Harryxzy + * @date 2022/10/20 17:29 + */ + public Map> 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> 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 list = new ArrayList<>(); + list.add(build); + gwhg.put(xm,list); + } + }catch (Exception e){ + baseBean.writeLog(e); + } + } + return gwhg; + } } diff --git a/src/com/engine/bjcj220907/entity/JWJT.java b/src/com/engine/bjcj220907/entity/JWJT.java index 5938221..d534a8a 100644 --- a/src/com/engine/bjcj220907/entity/JWJT.java +++ b/src/com/engine/bjcj220907/entity/JWJT.java @@ -45,9 +45,14 @@ public class JWJT { private double gngzts; /** - * 缺勤天数(请假) + * 国内缺勤天数(请假) */ - private double qq; + private double gnQq; + + /** + * 境外缺勤天数(请假) + */ + private double jwQq; /** * 公务回国天数(包含周末) diff --git a/src/com/engine/bjcj220907/entity/JwCZInfoDetail.java b/src/com/engine/bjcj220907/entity/JwCZInfoDetail.java index 43fe683..fe1f1a9 100644 --- a/src/com/engine/bjcj220907/entity/JwCZInfoDetail.java +++ b/src/com/engine/bjcj220907/entity/JwCZInfoDetail.java @@ -25,7 +25,7 @@ public class JwCZInfoDetail { private String xm; /** - * 类型( 0:开始常驻,1:结束常驻 ) + * 类型( 0:开始常驻,1:结束常驻 6:公务回国) */ private Integer lx; diff --git a/src/com/engine/bjcj220907/service/GetKQ4OverseasAllowanceCountService.java b/src/com/engine/bjcj220907/service/GetKQ4OverseasAllowanceCountService.java index 53d5209..74ba310 100644 --- a/src/com/engine/bjcj220907/service/GetKQ4OverseasAllowanceCountService.java +++ b/src/com/engine/bjcj220907/service/GetKQ4OverseasAllowanceCountService.java @@ -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 getKQDatas(Attend4MonthBonus attend4MonthBonus); + Map getKQDatas(Attend4MonthBonus attend4MonthBonus, List users); } diff --git a/src/com/engine/bjcj220907/service/impl/GetKQ4OverseasAllowanceCountServiceImpl.java b/src/com/engine/bjcj220907/service/impl/GetKQ4OverseasAllowanceCountServiceImpl.java index 56f432e..324b520 100644 --- a/src/com/engine/bjcj220907/service/impl/GetKQ4OverseasAllowanceCountServiceImpl.java +++ b/src/com/engine/bjcj220907/service/impl/GetKQ4OverseasAllowanceCountServiceImpl.java @@ -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 getKQDatas(Attend4MonthBonus attend4MonthBonus) { + public Map getKQDatas(Attend4MonthBonus attend4MonthBonus,List users) { baseBean.writeLog("开始获取考勤数据,参数{}", attend4MonthBonus); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM"); +// SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM"); List columnsList = new ArrayList<>(); - List> dataList = new ArrayList<>(); + List> dataList = new ArrayList<>(); try { Map paramsMap = new HashMap(); paramsMap.put("typeselect", "6"); @@ -54,46 +50,55 @@ public class GetKQ4OverseasAllowanceCountServiceImpl extends Service implements baseBean.writeLog("GetKQReportCmd执行成功"); // 获取列数据 columnsList = (List) 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 children =(List) 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>) execute.get("datas"); - // 获取每个人的缺勤天数、及公务回国天数 - Map qqDays = new HashMap<>(); + dataList = (List>) execute.get("datas"); + // 获取每个人的缺勤日期、及公务回国天数 + Map qqDays = new HashMap<>(); String[] gwhgS= {""}; + Calendar countBeginCal = Calendar.getInstance(); + countBeginCal.setTime(attend4MonthBonus.getBeginDate()); + Calendar countEndCal = Calendar.getInstance(); + countEndCal.setTime(attend4MonthBonus.getEndDate()); + List 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 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); diff --git a/src/com/engine/bjcj220907/service/impl/OverseasAllowanceCountServiceImpl.java b/src/com/engine/bjcj220907/service/impl/OverseasAllowanceCountServiceImpl.java index 918173e..62dbee6 100644 --- a/src/com/engine/bjcj220907/service/impl/OverseasAllowanceCountServiceImpl.java +++ b/src/com/engine/bjcj220907/service/impl/OverseasAllowanceCountServiceImpl.java @@ -54,23 +54,27 @@ public class OverseasAllowanceCountServiceImpl extends Service implements Overse baseBean.writeLog("获取所有人的境外常驻信息,共:"+czInfos.size()); // 将境外常驻信息格式化 List jwCZInfos = formatJwCZInfo(czInfos,startAttendanceCal,endAttendanceCal); - baseBean.writeLog("将境外常驻信息格式化"); - // 如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数 + baseBean.writeLog("将境外常驻信息格式化,共:"+jwCZInfos.size()); + // 如果用户在考勤周期内存在境外常驻信息则过滤出来,并且计算当月应常驻天数及境内工作天数 List results = new ArrayList<>(); jwCZInfos = getCZInfosAndCZDays(jwCZInfos, startAttendanceCal, endAttendanceCal,results); baseBean.writeLog("获取用户在考勤周期内存在境外常驻信息过滤出来,并且计算当月境外应常驻天数及境内工作天数,共::"+results.size()); // 计算考勤所属月员工的薪酬等级,获取相应的境外津贴标准 List users = results.stream().map(i -> i.getUser()).collect(Collectors.toList()); - Map usersXSDJ = getOverseasAllowanceDAO().getXCDJByUsers(users,startAttendanceCal); - baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准、四项补贴合计,共:"+usersXSDJ.size()); - // 获取公务回国天数 及 缺勤天数 + Map usersXCDJ = getOverseasAllowanceDAO().getXCDJByUsers(users,startAttendanceCal); + baseBean.writeLog("获取所有员工考勤所属月的薪酬等级及所对应的境外津贴标准、四项补贴合计,共:"+usersXCDJ.size()); + // 获取考勤员工的公务回国天数 及 缺勤日期 Attend4MonthBonus build = Attend4MonthBonus.builder().beginDate(startAttendanceCal.getTime()).endDate(endAttendanceCal.getTime()).build(); - Map 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 kqDatas = GetKQ4OverseasAllowanceCountService().getKQDatas(build,users); + baseBean.writeLog("调用考勤接口获取公务回国天数 及 缺勤日期:"+kqDatas); + // 获取员工公务回国国内工作日天数 + Map> gwhgInfos = getOverseasAllowanceDAO().getGwhg(); + baseBean.writeLog("获取年假建模中所有公务回国信息,共:"+gwhgInfos.size()); + // 过滤考勤周期内的公务回国信息,并计算出国内工作日天数 + Map validGwhgAndCountWorkdays = getValidGwhgAndCountWorkdays(gwhgInfos, startAttendanceCal.getTime(), endAttendanceCal.getTime()); + baseBean.writeLog("过滤考勤周期内的公务回国信息,并计算出国内工作日天数:"+validGwhgAndCountWorkdays); + // 封装计算薪酬等级、境外津贴标准、考勤天数、四项补助合计、公务回国国内工作日天数 + getXcdjAndJwjtbz(results,usersXCDJ,kqDatas,validGwhgAndCountWorkdays,jwCZInfos); baseBean.writeLog("封装薪酬等级、境外津贴标准、考勤天数、境外实际常驻天数并计算实出勤天数、境外津贴,共:"+results.size()); // 处理第三国出差(2)、境外国内出差(3)艰苦地区补贴 Map> 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 results ,Map usersXSDJ,Map kqDatas){ + public void getXcdjAndJwjtbz(List results ,Map usersXSDJ,Map kqDatas,Map validGwhgAndCountWorkdays,List jwCZInfos){ + Map> 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 qqDate =(List ) kqDatas.get(item.getUser() + "-qq"); + double gnQqDays=0.0; + double jwQqDays=0.0; + // 判断是境内缺勤还是境外缺勤 + List jwCZInfoDetails = czInfos.get(item.getUser()); + if(jwCZInfoDetails != null && jwCZInfoDetails.size()>0){ + for(Date d : qqDate){ + Boolean flag = false; + for(int i=0; (i 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 getValidGwhgAndCountWorkdays(Map> gwhgInfos, Date startAttendance, Date endAttendance) { + Map result = new HashMap(); + for(Map.Entry> entrySet : gwhgInfos.entrySet()){ + List 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; + } } diff --git a/weaver-bjcj.iml b/weaver-bjcj.iml index 3e39e95..83c5fdc 100644 --- a/weaver-bjcj.iml +++ b/weaver-bjcj.iml @@ -7,10 +7,10 @@ - + -