From dacf938826fcb91f8265ccc67a8d466fdc76bfc0 Mon Sep 17 00:00:00 2001 From: Chengliang <1546584672@qq.com> Date: Wed, 27 Nov 2024 18:06:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=E5=B0=81=E8=B4=A6=20?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E8=A1=A81=E5=80=92=E4=BC=91=20=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E8=A1=A82=E8=B0=83=E4=BC=91=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/MainTest.java | 22 ++- .../aisin/cron/KqCloseAccountUpdateCrob.java | 176 +++++++++++++++++- .../aisin/cron/KqConfirmWfCrob.java | 3 +- .../cron/entity/CompensatoryLeaveDetail.java | 31 +++ .../aisin/cron/entity/OffLeaveDetail.java | 41 ++++ 5 files changed, 266 insertions(+), 7 deletions(-) create mode 100644 src/weaver/interfaces/aisin/cron/entity/CompensatoryLeaveDetail.java create mode 100644 src/weaver/interfaces/aisin/cron/entity/OffLeaveDetail.java diff --git a/src/test/MainTest.java b/src/test/MainTest.java index 1c068f7..999d74c 100644 --- a/src/test/MainTest.java +++ b/src/test/MainTest.java @@ -1,11 +1,16 @@ package test; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import weaver.general.TimeUtil; +import weaver.general.Util; import weaver.interfaces.aisin.cron.KqConfirmWfCrob; import java.time.LocalDate; import java.time.YearMonth; import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; /** * @Author weaver_cl @@ -16,10 +21,19 @@ import java.time.format.DateTimeFormatter; public class MainTest { public static void main(String[] args) { - String currentDate = TimeUtil.getCurrentDateString(); - String currentTime = TimeUtil.getOnlyCurrentTimeString(); - System.out.println(currentDate); - System.out.println(currentTime); + String sql_b = ""; + String sql_c = ""; + String ruleId = "4"; + String searchYear ="2024"; + String currentDate = "10"; + sql_b = "select resourceId,sum(tiaoxiuamount) alltiaoxiuamountB,sum(extraAmount) allExtraAmountB,sum(baseAmount) allBaseAmountB,sum(usedAmount) allUsedAmountB from KQ_BalanceOfLeave where (isDelete is null or isDelete<>1) and leaveRulesId=" + ruleId + " and belongYear='" + searchYear + "' and (expirationDate is null or expirationDate='' or expirationDate>='" + currentDate + "') group by resourceId,leaveRulesId,belongYear "; + sql_c = "select resourceId,sum(tiaoxiuamount) alltiaoxiuamountC,sum(extraAmount) allExtraAmountC,sum(baseAmount) allBaseAmountC,sum(usedAmount) allUsedAmountC from KQ_BalanceOfLeave where (isDelete is null or isDelete<>1) and leaveRulesId=" + ruleId + " and belongYear='" + searchYear + "' and (expirationDate is not null and expirationDate<>'' and expirationDate<'" + currentDate + "') group by resourceId,leaveRulesId,belongYear "; + String backFields = " a.id,a.dspOrder,a.lastName,a.workcode,a.subCompanyId1,a.departmentId,a.companyStartDate,a.workStartDate,a.id resourceId," + ruleId + " as leaveRulesId,0 as allTotalAmount,0 as allUsedAmount,0 as allInvalidAmount,0 as allRestAmount,0 as detailShow," + + "b.allBaseAmountB,b.alltiaoxiuamountB,b.allExtraAmountB,b.allUsedAmountB,c.alltiaoxiuamountC,c.allBaseAmountC,c.allExtraAmountC,c.allUsedAmountC "; + String sqlFrom = " from HrmResource a left join (" + sql_b + ") b on a.id=b.resourceId left join (" + sql_c + ") c on a.id=c.resourceId "; + String sqlWhere = " where 1=1 and a.status in (0,1,2,3) "; + + System.out.println("select "+backFields+sqlFrom+sqlWhere); } public static String firstDayOfMonth(String yearMonthStr) { diff --git a/src/weaver/interfaces/aisin/cron/KqCloseAccountUpdateCrob.java b/src/weaver/interfaces/aisin/cron/KqCloseAccountUpdateCrob.java index 44218d3..5d05380 100644 --- a/src/weaver/interfaces/aisin/cron/KqCloseAccountUpdateCrob.java +++ b/src/weaver/interfaces/aisin/cron/KqCloseAccountUpdateCrob.java @@ -1,12 +1,25 @@ package weaver.interfaces.aisin.cron; +import com.engine.kq.biz.KQLeaveRulesBiz; +import com.engine.kq.biz.KQReportBiz; +import com.engine.kq.util.KQDurationCalculatorUtil; +import com.engine.kq.util.KQTransMethod; import weaver.conn.RecordSet; +import weaver.general.BaseBean; import weaver.general.TimeUtil; import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.aisin.cron.entity.CompensatoryLeaveDetail; +import weaver.interfaces.aisin.cron.entity.OffLeaveDetail; import weaver.interfaces.schedule.BaseCronJob; import java.time.LocalDate; +import java.time.YearMonth; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @Author liang.cheng @@ -20,12 +33,20 @@ public class KqCloseAccountUpdateCrob extends BaseCronJob { public void execute() { RecordSet rs = new RecordSet(); + BaseBean bb = new BaseBean(); String currentDate = TimeUtil.getCurrentDateString(); String kqMonth = getKqMonth(); + String jsTableName = bb.getPropValue("aisinsecond", "jsTableName"); + String dxRuleId = bb.getPropValue("aisinsecond", "dxRuleId"); - rs.executeQuery("select fzksrq,fzjsrq from uf_atbpkqfz where fzny = ?",kqMonth); + + String firstDayOfMonth = firstDayOfMonth(kqMonth); + String lastDayOfMonth = lastDayOfMonth(kqMonth); + + rs.executeQuery("select id,fzksrq,fzjsrq from uf_atbpkqfz where fzny = ?",kqMonth); rs.next(); + String id = Util.null2String(rs.getString("id")); String fzksrq = Util.null2String(rs.getString("fzksrq")); String fzjsrq = Util.null2String(rs.getString("fzjsrq")); @@ -36,7 +57,88 @@ public class KqCloseAccountUpdateCrob extends BaseCronJob { //结束日期 更新结算完成 if (currentDate.equals(fzjsrq)) { - //更新明细表 + + String subcompanyid = bb.getPropValue("aisinsecond", "subcompanyid"); + //防止多次执行,执行前先判断是否已有考勤月明细数据 + rs.executeQuery("select count(1) as sums from "+jsTableName+"_dt1 where mainid = ?",id); + rs.next(); + int sums = Util.getIntValue(rs.getString("sums")); + if (sums > 0) { + return; + } + //更新明细表1 + List offLeaveDetails = new ArrayList<>(); + KQReportBiz kqReportBiz = new KQReportBiz(); + User user = new User(); + user.setUid(1); + String json = String.format("{\"fromDate\":\"%s\",\"toDate\":\"%s\",\"subCompanyId\":\"%s\"}", firstDayOfMonth, lastDayOfMonth,subcompanyid); + Map params = new HashMap(2){{ + put("data",json); + }}; + Map flowOverTimeDataNew = kqReportBiz.getFlowOverTimeDataNew(params, user); + + rs.executeQuery("select id,workcode,departmentid from HrmResource where subcompanyid1 = ? and status < 4",subcompanyid); + while (rs.next()) { + offLeaveDetails.add(OffLeaveDetail.builder() + .resourceId(Util.getIntValue(rs.getString("id"))) + .workcode(Util.null2String(rs.getString("workcode"))) + .depetId(Util.getIntValue(rs.getString("departmentid"))) + .build()); + } + + offLeaveDetails.forEach(e -> { + double workingDayOvertime_4leave = Util.getDoubleValue(Util.null2String(flowOverTimeDataNew.get(e.getResourceId()+"|workingDayOvertime_4leave"))); + workingDayOvertime_4leave = workingDayOvertime_4leave<0?0:workingDayOvertime_4leave; + double restDayOvertime_4leave = Util.getDoubleValue(Util.null2String(flowOverTimeDataNew.get(e.getResourceId()+"|restDayOvertime_4leave"))); + restDayOvertime_4leave = restDayOvertime_4leave<0?0:restDayOvertime_4leave; + double holidayOvertime_4leave = Util.getDoubleValue(Util.null2String(flowOverTimeDataNew.get(e.getResourceId()+"|holidayOvertime_4leave"))); + holidayOvertime_4leave = holidayOvertime_4leave<0?0:holidayOvertime_4leave; + + double workingDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(flowOverTimeDataNew.get(e.getResourceId()+"|workingDayOvertime_nonleave"))); + workingDayOvertime_nonleave = workingDayOvertime_nonleave<0?0:workingDayOvertime_nonleave; + double restDayOvertime_nonleave = Util.getDoubleValue(Util.null2String(flowOverTimeDataNew.get(e.getResourceId()+"|restDayOvertime_nonleave"))); + restDayOvertime_nonleave = restDayOvertime_nonleave<0?0:restDayOvertime_nonleave; + double holidayOvertime_nonleave = Util.getDoubleValue(Util.null2String(flowOverTimeDataNew.get(e.getResourceId()+"|holidayOvertime_nonleave"))); + holidayOvertime_nonleave = holidayOvertime_nonleave<0?0:holidayOvertime_nonleave; + + String workDayHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(workingDayOvertime_4leave+workingDayOvertime_nonleave)); + String restDayHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(restDayOvertime_4leave+restDayOvertime_nonleave)); + String holidayHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf(holidayOvertime_4leave+holidayOvertime_nonleave)); + + e.setWorkDayHours(workDayHours); + e.setRestDayHours(restDayHours); + e.setHolidayHours(holidayHours); + + String salaryHours = KQDurationCalculatorUtil.getDurationRound(String.valueOf( + 1.5*(workingDayOvertime_4leave+workingDayOvertime_nonleave) + 2*(restDayOvertime_4leave+restDayOvertime_nonleave) + 3*(holidayOvertime_4leave+holidayOvertime_nonleave) + )); + e.setSalaryHours(salaryHours); + + + + }); + + + //更新明细表2 + //1.结算申请流程已归档数 + List csLeaveDetails = new ArrayList<>(); + rs.executeQuery("select ryxm,sum(bcsqjsylxss) as remain from "+jsTableName+" a \n" + + " left join workflow_requestbase b on a.requestId = b.requestid and b.currentnodetype = 3\n" + + " where a.sqrq >= '"+firstDayOfMonth+"' and a.sqrq <= '"+lastDayOfMonth+"' group by ryxm"); + while (rs.next()) { + csLeaveDetails.add(CompensatoryLeaveDetail.builder() + .resourceId(Util.getIntValue(rs.getString("ryxm"))) + .workflowHours(Util.null2String(rs.getString("remain"))) + .build()); + } + + csLeaveDetails.forEach(e -> { + compensatoryLeave(e,kqMonth); + rs.executeUpdate("insert into "+jsTableName+"_dt2 (mainid,ygxm,yggh,zylxss,ysyxss,syxss,bysqjsdylxss) values(?,?,?,?,?,?,?)",id, + e.getResourceId(),e.getWorkcode(),e.getAllHours(),e.getUseHours(),e.getRemainHours(),e.getWorkflowHours()); + }); + + rs.executeUpdate("update uf_atbpkqfz set kqjszt = 2 where fzny = ?",kqMonth); } @@ -48,4 +150,74 @@ public class KqCloseAccountUpdateCrob extends BaseCronJob { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); return previousMonthDate.format(formatter); } + + private String firstDayOfMonth(String yearMonthStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter); + LocalDate firstDayOfMonth = yearMonth.atDay(1); + return firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } + + + private String lastDayOfMonth(String yearMonthStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); + YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter); + LocalDate lastDayOfMonth = yearMonth.atEndOfMonth(); + return lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } + + /** + * 调休假 + * @param compensatoryLeave + */ + private void compensatoryLeave(CompensatoryLeaveDetail compensatoryLeave,String kqMonth){ + RecordSet rs = new RecordSet(); + BaseBean bb = new BaseBean(); + String txRuleId = bb.getPropValue("aisinsecond", "txRuleId"); + KQTransMethod kqTransMethod = new KQTransMethod(); + String year = kqMonth.substring(0, 4); + String month = kqMonth.substring(5, 7); + + rs.executeQuery("select a.baseAmount,a.usedAmount,b.workcode from kq_balanceOfLeave a left join HrmResource b\n" + + " on a.resourceId = b.id where a.leaveRulesId = "+txRuleId+" and (a.isDelete is null or a.isDelete<>1)\n" + + " and a.belongYear = '"+year+"' and a.belongMonth = '"+month+"' and a.resourceId = ?",compensatoryLeave.getResourceId()); + + if (rs.next()) { + String baseAmount = kqTransMethod.getOriginalShow(Util.null2String(rs.getString("baseAmount"))); + String usedAmount = kqTransMethod.getOriginalShow(Util.null2String(rs.getString("usedAmount"))); + compensatoryLeave.setWorkcode(Util.null2String(rs.getString("workcode"))); + compensatoryLeave.setAllHours(baseAmount); + compensatoryLeave.setUseHours(usedAmount); + compensatoryLeave.setRemainHours(getRemainHours(baseAmount,usedAmount)); + } + } + + /** + * 倒休假 + */ + private void flowWorkMonth(OffLeaveDetail offLeaveDetail,String kqMonth) { + RecordSet rs = new RecordSet(); + BaseBean bb = new BaseBean(); + String dxRuleId = bb.getPropValue("aisinsecond", "dxRuleId"); + KQTransMethod kqTransMethod = new KQTransMethod(); + String year = kqMonth.substring(0, 4); + String month = kqMonth.substring(5, 7); + /*判断该假期类型是否属于 调休 的类型(暂不支持一个请假类型下既存在"加班时长自动计入余额"的余额发放方式,又存在其他发放方式)*/ + boolean isTiaoXiu = KQLeaveRulesBiz.isTiaoXiu(dxRuleId); + + /*如果属于调休,需求默认是属于调休 此处增加一层判断*/ + if (isTiaoXiu) { + + + } + } + + + private String getRemainHours(String baseHour, String usedHour) { + String remainHours = "0.00"; + double baseHours = Util.getDoubleValue(baseHour, 0.00); + double usedHours = Util.getDoubleValue(usedHour, 0.00); + remainHours = String.format("%.2f", baseHours - usedHours); + return remainHours; + } } diff --git a/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java b/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java index ad3ef23..b4e5bdd 100644 --- a/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java +++ b/src/weaver/interfaces/aisin/cron/KqConfirmWfCrob.java @@ -40,7 +40,8 @@ public class KqConfirmWfCrob extends BaseCronJob { String tableName = bb.getPropValue("aisinsecond", "tableName"); String currentDate = DateUtil.getCurrentDate(); String kqMonth = getKqMonth(); - + //测试使用 + //String kqMonth = "2024-11"; List resourceList = new ArrayList<>(); //1.获取指定分部下 类型为排班制的 考勤组 diff --git a/src/weaver/interfaces/aisin/cron/entity/CompensatoryLeaveDetail.java b/src/weaver/interfaces/aisin/cron/entity/CompensatoryLeaveDetail.java new file mode 100644 index 0000000..ac21ef4 --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/CompensatoryLeaveDetail.java @@ -0,0 +1,31 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/11/27 9:26 AM + * @Description: 调休假结算表 明细表2 + * @Version 1.0 + */ +@Data +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class CompensatoryLeaveDetail { + + private String workcode; + + private Integer resourceId; + + private String allHours; + + private String useHours; + + private String remainHours; + + private String workflowHours; +} diff --git a/src/weaver/interfaces/aisin/cron/entity/OffLeaveDetail.java b/src/weaver/interfaces/aisin/cron/entity/OffLeaveDetail.java new file mode 100644 index 0000000..5194b4f --- /dev/null +++ b/src/weaver/interfaces/aisin/cron/entity/OffLeaveDetail.java @@ -0,0 +1,41 @@ +package weaver.interfaces.aisin.cron.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author liang.cheng + * @Date 2024/11/27 9:26 AM + * @Description: 倒休假结算表 明细表1 + * @Version 1.0 + */ +@Data +@NoArgsConstructor +@Builder +@AllArgsConstructor +public class OffLeaveDetail { + + private String workcode; + + private Integer resourceId; + + private Integer depetId; + + private String workDayHours; + + private String restDayHours; + + private String holidayHours; + + private String salaryHours; + + private String useHours; + + private String salaryRemianHours; + + private String remainHours; + + +}