浏览代码

feat(coordination): 增强员工变动处理核定单的维度值计算逻辑

- 新增 `HCSIEmpCoordVerifBillEditEx` 类以支持参保标准变更时自动更新子单据体维度值
- 在 `SinSurEmpChgCoordBatchEditPluginEx` 中优化子单据体行索引获取逻辑
- 改进参保标准信息缓存机制,确保数据一致性
- 更新 `SITCoordinationUtils` 工具类以兼容空的险种维度情况
- 修复当险种维度为空时无法正确设置默认保险项目的缺陷
- 统一处理参保项目值设置逻辑,增强代码健壮性
Tyx 1 周之前
父节点
当前提交
d208885e9b

+ 109 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/coordination/HCSIEmpCoordVerifBillEditEx.java

@@ -0,0 +1,109 @@
+package nckd.jxccl.sit.hcsi.formplugin.web.coordination;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.hr.hbp.common.cache.HRPageCache;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.plugin.Plugin;
+import kd.sdk.sit.sitbp.business.helper.SITBPServiceHelper;
+import kd.sdk.sit.sitbp.common.StdResultInfoDTO;
+import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
+import nckd.jxccl.sit.hcsi.utils.SITCoordinationUtils;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Tyx 2025-12-05
+ * 员工变动处理核定单 【nckd_hpdi_empcoordver_ext】
+ */
+public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        IDataModel model = this.getModel();
+        String key = e.getProperty().getName();
+        // 如果是 参保标准 / 险种 / 险种维度发生变化,需要去取参保标准中的标准维度值
+        // 如果是 险种 / 险种维度发生变化,只需要修改当前子单据体的数据
+        if(HRStringUtils.equalsAny(key, "nckd_welfaretype", "nckd_sinsurdimension")) {
+            int rowIndex = model.getEntryCurrentRowIndex("nckd_entryentity");
+            DynamicObject sinSurStd = (DynamicObject) model.getValue("sinsurstd_r31");
+            getStdInfoAndStdDimfromCache(sinSurStd);
+            DynamicObject welfaretype = (DynamicObject) model.getValue("nckd_welfaretype", rowIndex);
+            DynamicObject sinSurDimension = (DynamicObject) model.getValue("nckd_sinsurdimension", rowIndex);
+            getDimensionValue(sinSurStd, welfaretype, sinSurDimension, rowIndex);
+        }
+        else if (HRStringUtils.equals(key, "sinsurstd_r31")) {
+            Object newValue = e.getChangeSet()[0].getNewValue();
+            if(!ObjectUtils.isEmpty(newValue)) {
+                getStdInfoAndStdDimfromCache((DynamicObject) newValue);
+                getDimensionValue((DynamicObject) newValue);
+            }
+        }
+    }
+
+    /**
+     * 参保标准修改的情况下,把当前单据体下数据也改一下
+     * @param sinSurStd
+     */
+    public void getDimensionValue(DynamicObject sinSurStd) {
+        DynamicObjectCollection entryCols = this.getModel().getDataEntity(true).getDynamicObjectCollection("nckd_entryentity");
+        for(int i = 0 ; i < entryCols.size(); i++) {
+            DynamicObject subEntry = entryCols.get(i);
+            DynamicObject welfaretype = subEntry.getDynamicObject("nckd_welfaretype");
+            DynamicObject sinSurDimension = subEntry.getDynamicObject("nckd_sinsurdimension");
+            getDimensionValue(sinSurStd, welfaretype, sinSurDimension, i);
+        }
+    }
+
+    /**
+     * 子单据体获取并设置维度值
+     * @param sinSurStd
+     * @param welfaretype
+     * @param sinSurDimension
+     */
+    public void getDimensionValue(DynamicObject sinSurStd, DynamicObject welfaretype, DynamicObject sinSurDimension, int rowIndex) {
+        IDataModel model = this.getModel();
+        HRPageCache pageCache = new HRPageCache(this.getView());
+        String cacheKey = String.valueOf(sinSurStd.getLong("id"));
+        StdResultInfoDTO stdResultInfoDTO = pageCache.get(cacheKey, StdResultInfoDTO.class);
+
+        if(welfaretype == null)
+            return;
+
+        SITCoordinationUtils SITCoordinationUtils = new SITCoordinationUtils();
+        Map result = SITCoordinationUtils.dealStdResult(stdResultInfoDTO, sinSurStd, welfaretype, sinSurDimension);
+
+        Set<Long> keySet = SitConstant.INSURANCE_PAY_BASE_CONSTANTS.keySet();
+        for (Long key : keySet) {
+            if(result.get(key) == null) {
+                model.setValue(SitConstant.INSURANCE_PAY_BASE_CONSTANTS.get(key), null, rowIndex);
+            }
+            else {
+                model.setValue(SitConstant.INSURANCE_PAY_BASE_CONSTANTS.get(key), result.get(key), rowIndex);
+            }
+        }
+    }
+
+    /**
+     * 从缓存中获取参保标准的信息,如果没有缓存则生成缓存
+     * @param sinSurStd
+     * @return
+     */
+    public void getStdInfoAndStdDimfromCache (DynamicObject sinSurStd) {
+        HRPageCache pageCache = new HRPageCache(this.getView());
+        String cacheKey = String.valueOf(sinSurStd.getLong("id"));
+        StdResultInfoDTO stdResultInfoDTO = pageCache.get(cacheKey, StdResultInfoDTO.class);
+        if(stdResultInfoDTO == null) {
+            stdResultInfoDTO = SITBPServiceHelper.getStdInfoAndStdDim(Arrays.asList(sinSurStd.getLong("id"))).get(sinSurStd.getLong("id"));
+            pageCache.put(cacheKey, stdResultInfoDTO);
+        }
+    }
+
+}

+ 26 - 3
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/coordination/SinSurEmpChgCoordBatchEditPluginEx.java

@@ -90,7 +90,7 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
             int rowIndex = model.getEntryCurrentRowIndex("entryentity");
             DynamicObject sinSurStd = (DynamicObject) model.getValue("sinsurstd_r31", rowIndex);
             getStdInfoAndStdDimfromCache(sinSurStd);
-            int subRowIndex = e.getChangeSet()[0].getRowIndex();
+            int subRowIndex = model.getEntryCurrentRowIndex("nckd_subentryentity");
             DynamicObject welfaretype = (DynamicObject) model.getValue("nckd_welfaretype", subRowIndex);
             DynamicObject sinSurDimension = (DynamicObject) model.getValue("nckd_sinsurdimension", subRowIndex);
             getDimensionValue(sinSurStd, welfaretype, sinSurDimension, rowIndex, subRowIndex);
@@ -100,6 +100,8 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
             Object newValue = e.getChangeSet()[0].getNewValue();
             if(!ObjectUtils.isEmpty(newValue)) {
                 getStdInfoAndStdDimfromCache((DynamicObject) newValue);
+                int rowIndex = model.getEntryCurrentRowIndex("entryentity");
+                getDimensionValue((DynamicObject) newValue, rowIndex);
             }
         }
     }
@@ -119,6 +121,22 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         }
     }
 
+    /**
+     * 参保标准修改的情况下,把当前单据体下的子单据体的数据改一下
+     * @param sinSurStd
+     * @param rowIndex
+     */
+    public void getDimensionValue(DynamicObject sinSurStd, int rowIndex) {
+        DynamicObject entry = this.getModel().getEntryRowEntity("entryentity", rowIndex);
+        DynamicObjectCollection subEntryCols = entry.getDynamicObjectCollection("nckd_subentryentity");
+        for(int i = 0 ; i < subEntryCols.size(); i++) {
+            DynamicObject subEntry = subEntryCols.get(i);
+            DynamicObject welfaretype = subEntry.getDynamicObject("nckd_welfaretype");
+            DynamicObject sinSurDimension = subEntry.getDynamicObject("nckd_sinsurdimension");
+            getDimensionValue(sinSurStd, welfaretype, sinSurDimension, rowIndex, i);
+        }
+    }
+
     /**
      * 子单据体获取并设置维度值
      * @param sinSurStd
@@ -132,7 +150,7 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         String cacheKey = String.valueOf(sinSurStd.getLong("id"));
         StdResultInfoDTO stdResultInfoDTO = pageCache.get(cacheKey, StdResultInfoDTO.class);
 
-        if(welfaretype == null || sinSurDimension == null)
+        if(welfaretype == null)
             return;
 
         SITCoordinationUtils SITCoordinationUtils = new SITCoordinationUtils();
@@ -140,7 +158,12 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
 
         Set<Long> keySet = SitConstant.INSURANCE_PAY_BASE_CONSTANTS.keySet();
         for (Long key : keySet) {
-            model.setValue(SitConstant.INSURANCE_PAY_BASE_CONSTANTS.get(key), result.get(key), rowIndex, subRowIndex);
+            if(result.get(key) == null) {
+                model.setValue(SitConstant.INSURANCE_PAY_BASE_CONSTANTS.get(key), null, subRowIndex, rowIndex);
+            }
+            else {
+                model.setValue(SitConstant.INSURANCE_PAY_BASE_CONSTANTS.get(key), result.get(key), subRowIndex, rowIndex);
+            }
         }
     }
 

+ 12 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/utils/SITCoordinationUtils.java

@@ -24,7 +24,10 @@ public class SITCoordinationUtils {
         List<StdResultInfoDTO.StdInsurTypeResultInfoDTO> stdInsurTypeResultInfoDTOS = stdResultInfoDTO.getStdInsurTypeResultInfoDTOS();
         // 根据 insurTypeId 和 baseDataId 查找目标数据
         Long insurTypeId = welfaretype.getLong("id"); // 险种ID
-        Long baseDataId = sinSurDimension.getLong("id"); // 险种维度ID
+        Long baseDataId = 0L;
+        if(sinSurDimension != null) {
+            baseDataId = sinSurDimension.getLong("id");
+        }
 
         Map<Long, Object> result = new HashMap<>();
 
@@ -36,7 +39,7 @@ public class SITCoordinationUtils {
                 if (stdDimRlslnfos != null) {
                     for (StdResultInfoDTO.StdDimRsInfo stdDimRlslnfo : stdDimRlslnfos) {
                         List<StdDimDTO> stdDimDTOs = stdDimRlslnfo.getStdDimDTOs();
-                        if (stdDimDTOs != null) {
+                        if (stdDimDTOs.size() > 0) {
                             for (StdDimDTO stdDimDTO : stdDimDTOs) {
                                 // 查找匹配的 baseDataId
                                 if(stdDimDTO.getBaseDataId().equals(baseDataId)) {
@@ -48,6 +51,13 @@ public class SITCoordinationUtils {
                                 }
                             }
                         }
+                        else if (stdDimDTOs.size() == 0 && baseDataId == 0L){
+                            List<StdInsuranceItemDTO> list = stdDimRlslnfo.getStdInsuranceItemDTOs();
+                            for (StdInsuranceItemDTO itemDTO : list) {
+                                BigDecimal itemValue = itemDTO.getItemValue() == null ? BigDecimal.ZERO : itemDTO.getItemValue();
+                                result.put(itemDTO.getInsurPropId(), itemValue);
+                            }
+                        }
                     }
                 }
             }