Browse Source

feat(coordination): 增加参保标准与险种维度联动控制功能

- 在员工变动处理核定单中实现险种维度根据参保标准和险种动态过滤
- 新增 F7 选择前事件监听器,校验参保标准和险种是否已选择
- 实现参保标准变更时清空子表险种维度值逻辑
- 扩展工具类支持查询参保标准对应的可选险种维度数据
- 更新常量类添加参保标准及维度相关服务助手引用
- 优化空值判断防止参保标准未选择时报错
- 统一处理参保标准维度结果的数据加载和展示逻辑
Tyx 4 days ago
parent
commit
3c10252e11

+ 5 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/common/constant/SitConstant.java

@@ -26,8 +26,12 @@ public class SitConstant {
     public static final HRBaseServiceHelper BIZDATABILLENT_HELPER = new HRBaseServiceHelper("hpdi_bizdatabillent");
     /*业务数据模板*/
     public static final HRBaseServiceHelper BIZITEMGROUP_HELPER = new HRBaseServiceHelper("hsbs_bizitemgroup");
-    /*  */
+    /* 社保期间 */
     public static final HRBaseServiceHelper SINSURPERIOD_HELPER = new HRBaseServiceHelper("sitbs_sinsurperiod");
+    /* 参保标准 */
+    public static final HRBaseServiceHelper SINSURSTD_HELPER = new HRBaseServiceHelper("sitbs_sinsurstd");
+    /* 参保标准维度结果 */
+    public static final HRBaseServiceHelper STDDIMRS_HELPER = new HRBaseServiceHelper("sitbs_stddimrs");
     /*业务数据提报-外单位收入模板编码*/
     public static final String WDWSR_NUMBER = "JT001";
     public static final String SeparatorA = "_A";

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

@@ -5,7 +5,12 @@ 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.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
 import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.common.util.HRStringUtils;
 import kd.sdk.plugin.Plugin;
 import kd.sdk.sit.sitbp.business.helper.SITBPServiceHelper;
@@ -13,19 +18,26 @@ 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.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * Tyx 2025-12-05
  * 员工变动处理核定单 【nckd_hpdi_empcoordver_ext】
  */
-public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements Plugin {
+public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements Plugin, BeforeF7SelectListener {
 
     private static final Map<Long, StdResultInfoDTO> stdResultInfoDTOMap = new HashMap<Long, StdResultInfoDTO>();
 
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        BasedataEdit basedataEdit = this.getView().getControl("nckd_sinsurdimension");
+        if (basedataEdit != null) {
+            basedataEdit.addBeforeF7SelectListener(this);
+        }
+    }
+
     @Override
     public void propertyChanged(PropertyChangedArgs e) {
         super.propertyChanged(e);
@@ -36,6 +48,8 @@ public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements P
         if(HRStringUtils.equalsAny(key, "nckd_welfaretype", "nckd_sinsurdimension")) {
             int rowIndex = model.getEntryCurrentRowIndex("nckd_entryentity");
             DynamicObject sinSurStd = (DynamicObject) model.getValue("sinsurstd_r31");
+            if(ObjectUtils.isEmpty(sinSurStd))
+                return;
             getStdInfoAndStdDimfromCache(sinSurStd);
             DynamicObject welfaretype = (DynamicObject) model.getValue("nckd_welfaretype", rowIndex);
             DynamicObject sinSurDimension = (DynamicObject) model.getValue("nckd_sinsurdimension", rowIndex);
@@ -44,12 +58,16 @@ public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements P
         else if (HRStringUtils.equals(key, "sinsurstd_r31")) {
             Object newValue = e.getChangeSet()[0].getNewValue();
             if(!ObjectUtils.isEmpty(newValue)) {
+                // 因为险种维度会根据参保标准+险种进行过滤,这里把子单据体的险种维度清空
+                clearSubEntryDimension();
                 getStdInfoAndStdDimfromCache((DynamicObject) newValue);
                 getDimensionValue((DynamicObject) newValue);
+                this.getView().updateView("nckd_entryentity");
             }
         }
     }
 
+
     /**
      * 参保标准修改的情况下,把当前单据体下数据也改一下
      * @param sinSurStd
@@ -106,4 +124,51 @@ public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements P
         }
     }
 
+    public void clearSubEntryDimension () {
+        int rowCount = this.getModel().getEntryRowCount("nckd_entryentity");
+        for (int i = 0; i < rowCount; i++) {
+            this.getModel().setValue("nckd_sinsurdimension", null, i);
+        }
+    }
+
+
+    /**
+     * 险种维度选择前根据参保标准+险种过滤险种维度
+     * @param e
+     */
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent e) {
+        String fieldKey = e.getProperty().getName();
+        IDataModel model = this.getModel();
+        if(HRStringUtils.equals(fieldKey, "nckd_sinsurdimension")) {
+            // 行号
+            int rowIndex = e.getRow();
+            // 过滤前判断 参保标准和险种有没有选择
+            DynamicObject sinSurStd = (DynamicObject) model.getValue("sinsurstd_r31");
+            DynamicObject welfareType = (DynamicObject) model.getValue("nckd_welfaretype", rowIndex);
+            if(ObjectUtils.isEmpty(sinSurStd)) {
+                this.getView().showTipNotification("请先选择“参保标准”");
+                e.setCancel(true);
+                return;
+            }
+            else if (ObjectUtils.isEmpty(welfareType)) {
+                this.getView().showTipNotification("请先选择“险种”");
+                e.setCancel(true);
+                return;
+            }
+
+            // 按照参保标准+险种 查询可选择的险种维度
+            QFilter filter = new QFilter("id", QCP.in, getDimensionValueForFilter(sinSurStd, welfareType));
+            e.getCustomQFilters().add(filter);
+        }
+    }
+
+    public List<Long> getDimensionValueForFilter (DynamicObject sinSurStd, DynamicObject welfaretype) {
+        Long sinSurStdId = sinSurStd.getLong("id");
+        Long welfaretypeId = welfaretype.getLong("id");
+        SITCoordinationUtils SITCoordinationUtils = new SITCoordinationUtils();
+        return SITCoordinationUtils.queryDimensionValue(sinSurStdId, welfaretypeId);
+    }
+
+
 }

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

@@ -10,10 +10,14 @@ import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.form.control.EntryGrid;
 import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.field.BasedataEdit;
 import kd.bos.form.field.FieldEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
 import kd.bos.form.operate.AbstractOperate;
 import kd.bos.form.plugin.AbstractFormPlugin;
 import kd.bos.org.utils.DynamicObjectUtils;
+import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.util.HRStringUtils;
@@ -32,7 +36,7 @@ import java.util.stream.Stream;
  * Tyx 2025-10-27
  * 变动核定单表单插件扩展【nckd_hpdi_empcoordbat_ext】
  */
-public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin implements Plugin {
+public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin implements Plugin, BeforeF7SelectListener {
 
     private static final HRBaseServiceHelper COORDBILL_HELPER = new HRBaseServiceHelper("hpdi_empcoordverifbill3");
     private static final List<String> defaultQueryFields = (List) Stream.of("id", "employeev", "assignment", "coordruleparam").collect(Collectors.toList());
@@ -50,6 +54,15 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         showEntryData(billCols);
     }
 
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        BasedataEdit basedataEdit = this.getView().getControl("nckd_sinsurdimension");
+        if (basedataEdit != null) {
+            basedataEdit.addBeforeF7SelectListener(this);
+        }
+    }
+
     private void showEntryData(DynamicObject[] billCols) {
         Set<String> entryFields = this.getEntryFields();
         // 根据ID提取出来
@@ -87,6 +100,8 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         if(HRStringUtils.equalsAny(key, "nckd_welfaretype", "nckd_sinsurdimension")) {
             int rowIndex = model.getEntryCurrentRowIndex("entryentity");
             DynamicObject sinSurStd = (DynamicObject) model.getValue("sinsurstd_r31", rowIndex);
+            if(ObjectUtils.isEmpty(sinSurStd))
+                return;
             getStdInfoAndStdDimfromCache(sinSurStd);
             int subRowIndex = model.getEntryCurrentRowIndex("nckd_subentryentity");
             DynamicObject welfaretype = (DynamicObject) model.getValue("nckd_welfaretype", subRowIndex);
@@ -99,11 +114,21 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
             if(!ObjectUtils.isEmpty(newValue)) {
                 getStdInfoAndStdDimfromCache((DynamicObject) newValue);
                 int rowIndex = model.getEntryCurrentRowIndex("entryentity");
+                // 因为险种维度会根据参保标准+险种进行过滤,这里把子单据体的险种维度清空
+                clearSubEntryDimension(rowIndex);
                 getDimensionValue((DynamicObject) newValue, rowIndex);
             }
         }
     }
 
+    public void clearSubEntryDimension (int rowIndex) {
+        this.getModel().setEntryCurrentRowIndex("entryentity", rowIndex);
+        int rowCount = this.getModel().getEntryRowCount("nckd_subentryentity");
+        for (int i = 0; i < rowCount; i++) {
+            this.getModel().setValue("nckd_sinsurdimension", null, i, rowIndex);
+        }
+    }
+
     /**
      * 从缓存中获取参保标准的信息,如果没有缓存则生成缓存
      * @param sinSurStd
@@ -312,4 +337,40 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         return new ArrayList(queryFields);
     }
 
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent e) {
+        String fieldKey = e.getProperty().getName();
+        IDataModel model = this.getModel();
+        if(HRStringUtils.equals(fieldKey, "nckd_sinsurdimension")) {
+            // 单据体行号
+            int rowIndex = model.getEntryCurrentRowIndex("entryentity");
+            // 子单据体行号
+            int subRowIndex = e.getRow();
+            // 过滤前判断 参保标准和险种有没有选择
+            DynamicObject sinSurStd = (DynamicObject) model.getValue("sinsurstd_r31", rowIndex);
+            DynamicObject welfareType = (DynamicObject) model.getValue("nckd_welfaretype", subRowIndex, rowIndex);
+            if(ObjectUtils.isEmpty(sinSurStd)) {
+                this.getView().showTipNotification("请先选择“参保标准”");
+                e.setCancel(true);
+                return;
+            }
+            else if (ObjectUtils.isEmpty(welfareType)) {
+                this.getView().showTipNotification("请先选择“险种”");
+                e.setCancel(true);
+                return;
+            }
+
+            // 按照参保标准+险种 查询可选择的险种维度
+            QFilter filter = new QFilter("id", QCP.in, getDimensionValueForFilter(sinSurStd, welfareType));
+            e.getCustomQFilters().add(filter);
+        }
+    }
+
+    public List<Long> getDimensionValueForFilter (DynamicObject sinSurStd, DynamicObject welfaretype) {
+        Long sinSurStdId = sinSurStd.getLong("id");
+        Long welfaretypeId = welfaretype.getLong("id");
+        SITCoordinationUtils SITCoordinationUtils = new SITCoordinationUtils();
+        return SITCoordinationUtils.queryDimensionValue(sinSurStdId, welfaretypeId);
+    }
+
 }

+ 32 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/utils/SITCoordinationUtils.java

@@ -1,14 +1,20 @@
 package nckd.jxccl.sit.hcsi.utils;
 
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
 import kd.sdk.sit.sitbp.common.StdDimDTO;
 import kd.sdk.sit.sitbp.common.StdInsuranceItemDTO;
 import kd.sdk.sit.sitbp.common.StdResultInfoDTO;
+import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class SITCoordinationUtils {
 
@@ -78,4 +84,30 @@ public class SITCoordinationUtils {
         return result; // 返回空 map 表示未找到
     }
 
+    public List<Long> queryDimensionValue(Long stdId, Long welfaretypeId) {
+        List<Long> dimIds = new ArrayList<Long>();
+        List<Long> baseDataIds = new ArrayList<Long>();
+        DynamicObject stdDyn = SitConstant.SINSURSTD_HELPER.loadOne(stdId);
+        DynamicObjectCollection entryCols = stdDyn.getDynamicObjectCollection("stdentryentity");
+        for (DynamicObject entry : entryCols) {
+            if(entry.getLong("insurtype.id") != welfaretypeId) {
+                continue;
+            }
+            else {
+                DynamicObjectCollection mulDatas = entry.getDynamicObjectCollection("mulstddimrs");
+                dimIds.addAll(mulDatas.stream().map(obj -> obj.getDynamicObject("fbasedataid").getLong("id")).collect(Collectors.toList()));
+            }
+        }
+
+        if(dimIds.size() > 0) {
+            QFilter filter = new QFilter("id", QCP.in, dimIds);
+            DynamicObjectCollection dynCols = SitConstant.STDDIMRS_HELPER.queryOriginalCollection("dimentryentity.basedata", filter.toArray());
+            baseDataIds.addAll(dynCols.stream().map(dyn -> dyn.getLong("dimentryentity.basedata")).collect(Collectors.toList()));
+        }
+
+        return baseDataIds;
+    }
+
+
+
 }