소스 검색

feat(swc): 增加特殊工种退休计算逻辑并优化数据查询

- 在 BuildApplyBillOpPlugin 中增加员工姓名字段和薪酬管理组织字段
- 重构 DelayedRetirementDateCalcTask 数据查询方法,提高代码复用性
- 新增特殊工种累计月份判断逻辑,满足条件则提前五年退休
- 完善薪资调整校验规则,区分不同错误提示信息
- 添加获取特殊工种记录、干部信息和员工基础信息的方法
- 优化原有查询逻辑,减少重复代码提升性能
turborao 1 주 전
부모
커밋
6f042d5053

+ 5 - 7
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/init/plugin/operate/BuildApplyBillOpPlugin.java

@@ -2,11 +2,7 @@ package nckd.jxccl.swc.init.plugin.operate;
 
 import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
-import kd.bos.dataentity.entity.DynamicObjectCollection;
-import kd.bos.entity.EntityMetadataCache;
-import kd.bos.entity.MainEntityType;
-import kd.bos.entity.datamodel.ListSelectedRowCollection;
-import kd.bos.entity.operate.result.OperationResult;
+
 import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
 import kd.bos.entity.plugin.AddValidatorsEventArgs;
 import kd.bos.entity.plugin.PreparePropertysEventArgs;
@@ -16,8 +12,6 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.sdk.plugin.Plugin;
 import kd.sdk.swc.hcdm.business.helper.HCDMApplyBillServiceHelper;
-
-
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -33,6 +27,7 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
      * 员工待定调薪清单  员工ID
      */
     private static final String EmployeesField = "nckd_employeefield.id";
+    private static final String EmployeesNameField = "nckd_employeefield.name";
     private static final String BillTypeField = "nckd_billtype";
 
     /**
@@ -42,10 +37,13 @@ public class BuildApplyBillOpPlugin extends AbstractOperationServicePlugIn imple
     @Override
     public void onPreparePropertys(PreparePropertysEventArgs e) {
         e.getFieldKeys().add(EmployeesField);
+        e.getFieldKeys().add(EmployeesNameField);
         e.getFieldKeys().add(BillTypeField);
         e.getFieldKeys().add("nckd_newposition.id");
         e.getFieldKeys().add("nckd_newsalaryrank.id");
         e.getFieldKeys().add("nckd_newhradminorg.id");
+        e.getFieldKeys().add("nckd_hrorg.id");
+
     }
 
     @Override

+ 8 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/init/plugin/operate/SalaryAdjDelivaryDateValidator.java

@@ -28,12 +28,18 @@ public class SalaryAdjDelivaryDateValidator extends AbstractValidator {
 
         ExtendedDataEntity[] dataEntities = this.getDataEntities();//获取操作执行时的所有单据数据的集合
         String billType = "";
+        String hrorgid = "";   ///薪酬管理组织
         for(ExtendedDataEntity obj :dataEntities) {
             DynamicObject bill = obj.getDataEntity();//获取当前单据的数据包
+            String employeeName = bill.getString("nckd_employeefield.name");
             if(StringUtils.isNotEmpty(billType) && !billType.equals(bill.getString("nckd_billtype"))){
-                this.addErrorMessage(obj,"定调薪类型不一致,请重新选择!");
+                this.addErrorMessage(obj,"员工:" + employeeName + ",定调薪类型不一致,请重新选择!");
+            }
+            if(StringUtils.isNotEmpty(hrorgid) && !hrorgid.equals(bill.getString("nckd_hrorg.id"))){
+                this.addErrorMessage(obj,"员工:" + employeeName + ",薪酬管理组织不一致,请重新选择!");
             }
             billType = bill.getString("nckd_billtype");
+            hrorgid = bill.getString("nckd_hrorg.id");
 
             Long employeeId = bill.getLong("nckd_employeefield.id");
             QFilter qFilter = new QFilter("employeev.boid", QCP.equals, employeeId);
@@ -42,7 +48,7 @@ public class SalaryAdjDelivaryDateValidator extends AbstractValidator {
             String selectField = "id,employeev.boid,coordruleparam.chgevent_z.id,dealresult";
             DynamicObject employeesFiles = QueryServiceHelper.queryOne(EmpChangeBill, selectField, new QFilter[]{qFilter,qFilter1,qFilter2});
             if(EmptyUtil.isEmpty(employeesFiles) ){
-                this.addErrorMessage(obj,"员工定调薪档案不存在,请先完成员工变动及处理!");
+                this.addErrorMessage(obj,"员工:" + employeeName + ",定调薪档案不存在,请先完成员工变动及处理!");
             }
         }
     }

+ 92 - 27
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/init/plugin/other/DelayedRetirementDateCalcTask.java

@@ -16,6 +16,7 @@ import kd.bos.util.StringUtils;
 import kd.sdk.plugin.Plugin;
 
 
+import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.Period;
@@ -254,35 +255,13 @@ public class DelayedRetirementDateCalcTask  extends AbstractTask implements Plug
         List<Long> employeeIDs = employeeFileMaps.keySet().stream().collect(Collectors.toList());
 
         ///查询 干部信息
-        QFilter filter7 = new QFilter("iscurrentdata", QCP.equals, true); // 启用
-        //QFilter filter8 = new QFilter("datastatus", QCP.equals, "1"); // 启用
-        QFilter filter9 = new QFilter("employee.id", QCP.in, employeeIDs);
+        Map<Long, DynamicObject> empposorgreMap = getEmpposorgrel(employeeIDs);
 
-        String selectFields1 = "id,employee.id,employee.number,position.nckd_jobseq.number";
-        DynamicObjectCollection empposorgreDyns = QueryServiceHelper.query("hrpi_empposorgrel", selectFields1, new QFilter[]{filter7 ,filter9});
-
-        Map<Long, DynamicObject> empposorgreMap = (Map)empposorgreDyns.stream().collect(Collectors.toMap((obj) -> {
-            return obj.getLong("employee.id");
-        }, (obj) -> {
-            return obj;
-        }, (k1, k2) -> {
-            return k1;
-        }));
-
-        QFilter filter11 = new QFilter("iscurrentversion", QCP.equals, true); // 启用
-        QFilter filter12 = new QFilter("datastatus", QCP.equals, "1"); // 启用
-        QFilter filter13 = new QFilter("id", QCP.in, employeeIDs);
         // 查人员基础信息中的性别
-        String selectFields2="id,number,name,birthday,gender.masterid";
-        DynamicObjectCollection personDyns = QueryServiceHelper.query("hrpi_employee", selectFields2,new QFilter[]{filter11, filter12, filter13});
+        Map<Long, DynamicObject> personMap = getEmployeeInfo(employeeIDs);
 
-        Map<Long, DynamicObject> personMap = (Map)personDyns.stream().collect(Collectors.toMap((obj) -> {
-            return obj.getLong("id");
-        }, (obj) -> {
-            return obj;
-        }, (k1, k2) -> {
-            return k1;
-        }));
+        //查询特殊工种的计算
+        Map<Long, DynamicObject> specialWorkersMap = getSpecialWorkers(employeeIDs);
 
         ArrayList<DynamicObject> perList = new ArrayList<>();
         for (DynamicObject data : datas) {
@@ -319,12 +298,31 @@ public class DelayedRetirementDateCalcTask  extends AbstractTask implements Plug
             if(personBirthday != null && gender != 0 ){
 
                 LocalDate originalRetirementDate = retirementCalculator(personBirthday,gender,jobType);
+                /**
+                 * 判断特殊工种的退休时间
+                 */
+                DynamicObject specialWorkers = specialWorkersMap.get(personId);
+                boolean isSpecial = false;
+                if(specialWorkers != null) {
+                    BigDecimal totalMon = specialWorkers.getBigDecimal("nckd_totalmon");
+                    if (totalMon != null && totalMon.compareTo(BigDecimal.ONE) >= 0) {
+                        isSpecial = true;
+                    }
+                }
+                if(isSpecial){
+                    // 计算提前5年的退休日期
+                    originalRetirementDate = originalRetirementDate.minusYears(5);
+                }
                 Date originalRetirementDate1 = Date.from(originalRetirementDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
                 if(originalRetirementDate1 != null) {
                     data.set("nckd_legaldate", originalRetirementDate1);
                 }
 
                 LocalDate delayedRetirementDate = delayedRetirementCalculator(personBirthday,gender,jobType);
+                if(isSpecial){
+                    // 计算提前5年的退休日期
+                    delayedRetirementDate = delayedRetirementDate.minusYears(5);
+                }
                 if(delayedRetirementDate != null ) {
                     Date delayedRetirementDate1 = Date.from(delayedRetirementDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
                     data.set("nckd_newlegaldate", delayedRetirementDate1);
@@ -469,7 +467,74 @@ public class DelayedRetirementDateCalcTask  extends AbstractTask implements Plug
      * 若员工在特殊工种累计任职时长超过该特殊工种规定的可提前退休标准,可在规定的退休年龄基础上提前5年退休。
      * 若涉及到多段特殊工种任职,须进行折算统计,举例如下:某员工涉及三段特殊工种任职,分别是3年,6年,1年,
      * 对应特殊工种可天退休标准为8、9、10,则3/8+6/9+1/10=1.141666667,结果大于1,符合条件,反之就不符合。
-     * /
+     * nckd_totalmon字段 已处理以上计算,直接取字段结果
+     */
+     public Map<Long, DynamicObject>  getSpecialWorkers(List<Long> employeeIDs){
+
+         QFilter filter11 = new QFilter("iscurrentdata", QCP.equals, "1"); // 启用
+         QFilter filter13 = new QFilter("employee.id", QCP.in, employeeIDs);
+         // 查人员基础信息中的性别
+         String selectFields2="id,employee.id,nckd_totalmon";
+         DynamicObjectCollection personDyns = QueryServiceHelper.query("nckd_hrpi_specwrklog", selectFields2,new QFilter[]{filter11, filter13});
+
+         Map<Long, DynamicObject> specialWorkersMap = (Map)personDyns.stream().collect(Collectors.toMap((obj) -> {
+             return obj.getLong("employee.id");
+         }, (obj) -> {
+             return obj;
+         }, (k1, k2) -> {
+             return k1;
+         }));
+
+         return specialWorkersMap;
+     }
+
+     /**
+     * 获取干部信息
+     * @param employeeIDs
+     * @return
+     */
+     public Map<Long, DynamicObject> getEmpposorgrel(List<Long> employeeIDs){
+
+         QFilter filter7 = new QFilter("iscurrentdata", QCP.equals, "1"); // 启用
+         QFilter filter9 = new QFilter("employee.id", QCP.in, employeeIDs);
+
+         String selectFields1 = "id,employee.id,employee.number,position.nckd_jobseq.number";
+         DynamicObjectCollection empposorgreDyns = QueryServiceHelper.query("hrpi_empposorgrel", selectFields1, new QFilter[]{filter7 ,filter9});
+
+         Map<Long, DynamicObject> empposorgreMap = (Map)empposorgreDyns.stream().collect(Collectors.toMap((obj) -> {
+             return obj.getLong("employee.id");
+         }, (obj) -> {
+             return obj;
+         }, (k1, k2) -> {
+             return k1;
+         }));
+
+         return empposorgreMap;
+     }
+     /**
+     * 获取员工性别
+     * @param employeeIDs
+     * @return
+     */
+     public Map<Long, DynamicObject> getEmployeeInfo(List<Long> employeeIDs){
+         QFilter filter11 = new QFilter("iscurrentversion", QCP.equals, "1"); // 启用
+         QFilter filter12 = new QFilter("datastatus", QCP.equals, "1"); // 启用
+         QFilter filter13 = new QFilter("id", QCP.in, employeeIDs);
+         // 查人员基础信息中的性别
+         String selectFields2="id,number,name,birthday,gender.masterid";
+         DynamicObjectCollection personDyns = QueryServiceHelper.query("hrpi_employee", selectFields2,new QFilter[]{filter11, filter12, filter13});
+
+         Map<Long, DynamicObject> personMap = (Map)personDyns.stream().collect(Collectors.toMap((obj) -> {
+             return obj.getLong("id");
+         }, (obj) -> {
+             return obj;
+         }, (k1, k2) -> {
+             return k1;
+         }));
+
+         return personMap;
+
+     }
 
     /**
      * 计算年龄