Kaynağa Gözat

feat(hcsi): 实现社保基数调整与拆单功能

- 新增 AdjustSIBaseFormPlugin 表单插件,支持查询和调整社保基数
- 新增 AdjustSIBaseService 服务类,处理社保档案、基数及收入统计数据
- 新增 SIBaseListEx 列表插件,用于打开调整页面
- 修改 SIBaseSaveOpEx 操作插件,增强保存事务控制与异常处理
- 新增 SinsurCoordSplitService 拆单服务类,实现核定单按参保单位拆分逻辑
- 新增 SinsurEmpCoordSplitOp 操作插件,支持社保变动单拆单操作
- 更新常量类 SitConstant,增加 SIBASE_HELPER 和 COORDVERIFYBILL_HELPER
- 优化 AnnualIncomeCalculateService 查询条件,加入版本与数据状态过滤
- 修复 OutImportTaskGuideExportService 下拉框选项长度超限问题
- 改进 SinSurEmpChgCoordBatchEditPluginEx 批量编辑插件,支持拆单操作
- 完善 SinsurCoordBizSaveHandler 核定单保存逻辑,确保参保单位一致性
Tyx 6 saat önce
ebeveyn
işleme
c813661230

+ 3 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/annualincome/AnnualIncomeCalculateService.java

@@ -8,6 +8,7 @@ import kd.bos.form.IFormView;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
 import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
 
 import java.math.BigDecimal;
@@ -170,6 +171,8 @@ public class AnnualIncomeCalculateService {
 
     public Map<Long, DynamicObject> getSinSurFile() {
         QFilter filter = new QFilter("welfarepayer.id", QCP.equals, welfarePayer.getLong("id"));
+        filter.and(QFilterCommonHelper.getCurrentVersionFilter());
+        filter.and(QFilterCommonHelper.getDataStatusFilter());
         DynamicObjectCollection cols = SitConstant.SINSURFILE_HELPER.queryOriginalCollection("id,employee.id,org.id", new QFilter[]{filter});
         return cols.stream().collect(Collectors.toMap((dyx) -> {
             return dyx.getLong("employee.id");

+ 181 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/SinsurCoordSplitService.java

@@ -0,0 +1,181 @@
+package nckd.jxccl.sit.hcsi.business.coordination;
+
+
+import com.kingdee.bos.framework.core.exception.BizException;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.exception.KDBizException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.org.utils.DynamicObjectUtils;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Tyx 2025-12-15
+ * 社保变动单拆单帮助类
+ */
+public class SinsurCoordSplitService {
+
+    private static final Log logger = LogFactory.getLog(SinsurCoordSplitService.class);
+    Long billId;
+    DynamicObject bill;
+
+    public SinsurCoordSplitService(Long billId, DynamicObject bill) {
+        this.billId = billId;
+        this.bill = bill;
+    }
+
+    /**
+     * <p> 执行拆单
+     * <p> 根据参保单位判断:
+     * <p> 1.单头和分录参保单位的交集部分 直接调用标品的提交生效
+     * <p> 2.单头和分录参保单位的差集部分 生成新的核定单
+     */
+    public void doSplit () {
+        // DynamicObject bill = SitConstant.COORDVERIFYBILL_HELPER.loadOne(billId);
+        // 单头参保单位
+        Long welfArePayerId = bill.getLong("welfarepayer_r31.id");
+        // 分录
+        DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+        // 根据参保单位分组
+        Map<Long, List<DynamicObject>> welfGroupMap = entryCols.stream()
+                .filter(obj -> obj.getLong("nckd_welfarepayer.id") != welfArePayerId)
+                .collect(Collectors.groupingBy(obj -> obj.getLong("nckd_welfarepayer.id")));
+        doCopy(bill, welfGroupMap);
+    }
+
+    /**
+     * 复制单据
+     */
+    public void doCopy(DynamicObject bill, Map<Long, List<DynamicObject>> welfGroupMap) {
+        DynamicObjectCollection newBillCol = new DynamicObjectCollection();
+        for (Long welfId : welfGroupMap.keySet()) {
+            List<DynamicObject> entryList = welfGroupMap.get(welfId);
+            DynamicObject newBill = SitConstant.COORDVERIFYBILL_HELPER.generateEmptyDynamicObject(SitConstant.COORDVERIFYBILL_HELPER.getEntityName());
+            // 忽略字段
+            Set<String> ignoreFields = getIgnoreFields();
+            // 复制
+            DynamicObjectUtils.copy(bill, newBill, ignoreFields);
+            // 复制后处理相关字段
+            newBill.set("dealresult", "0");
+            newBill.set("nckd_issplit", true);
+            newBill.set("nckd_sourcebillid", bill.getLong("id"));
+            // 处理分录数据
+            DynamicObjectCollection entryCols = newBill.getDynamicObjectCollection("nckd_entryentity");
+            entryCols.clear();
+            for (DynamicObject oldEntry : entryList) {
+                DynamicObject newEntry = entryCols.addNew();
+                DynamicObjectUtils.copy(oldEntry, newEntry);
+                newBill.set("welfarepayer_r31", oldEntry.getDynamicObject("nckd_welfarepayer"));
+                newBill.set("welfarepayertheory_r31", oldEntry.getDynamicObject("nckd_welfarepayertheory"));
+            }
+            newBillCol.add(newBill);
+        }
+        if(newBillCol.size() > 0) {
+            OperationResult result = SaveServiceHelper.saveOperate(SitConstant.COORDVERIFYBILL_HELPER.getEntityName(), newBillCol.stream().toArray(DynamicObject[]::new), OperateOption.create());
+            if(!result.isSuccess()) {
+                throw new KDBizException(result.getMessage());
+            }
+            //SitConstant.COORDVERIFYBILL_HELPER.save(newBillCol);
+        }
+        // 判断下当前单据是否有需要生效的数据
+        Long welfArePayerId = bill.getLong("welfarepayer_r31.id");
+        DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+        List<DynamicObject> welfGroupCurList = entryCols.stream()
+                .filter(obj -> obj.getLong("nckd_welfarepayer.id") == welfArePayerId)
+                .collect(Collectors.toList());
+        // 如果分录中有跟表头参保单位一样的数据 则调用标品的提交生效
+        if(welfGroupCurList.size() > 0) {
+            doSubmitEffect(bill);
+        }
+        // 否则直接反写源单成无需处理
+        else {
+            writeBackSourceBill(bill);
+        }
+    }
+
+    /**
+     * 复制单据时排除的字段
+     * @return
+     */
+    private Set<String> getIgnoreFields() {
+        Set<String> ignoreFields = new HashSet<String>();
+        ignoreFields.add("dealresult");
+        ignoreFields.add("failmsg");
+        ignoreFields.add("sinsurstd_r31");
+        return ignoreFields;
+    }
+
+
+    /**
+     * 调用标品的确认生效
+     *
+     * @param bill
+     * @return
+     */
+    public void doSubmitEffect (DynamicObject bill) {
+        if("0".equals(bill.getString("dealresult")) ) {
+            OperateOption option = OperateOption.create();
+            OperationResult result = OperationServiceHelper.executeOperate("confirmeffect", "hpdi_empcoordverifbill3", new DynamicObject[]{bill}, option);
+            if (!result.isSuccess()) {
+                String errorMessage = result.getAllErrorInfo().stream()
+                        .map(dyx -> dyx.getMessage())
+                        .collect(Collectors.joining(", "));
+                throw new KDBizException(errorMessage);
+            }
+        }
+    }
+
+    /**
+     * 反写源单, 把源单设置成无需处理
+     * @param bill
+     */
+    public void writeBackSourceBill (DynamicObject bill) {
+        bill.set("dealresult", "9");
+    }
+
+    /**
+     * 判断是否需要拆单
+     * @return
+     */
+    public boolean isNeedSplit () {
+        boolean isNeedSplit = true;
+        // DynamicObject bill = getCoordVerifyBillDyn();
+        // 拆分单据直接返回true
+        if(bill.getBoolean("nckd_issplit")) {
+            return false;
+        }
+        // 获取到变动大类
+        DynamicObject ruleParam = bill.getDynamicObject("coordruleparam");
+        String chgNumber = ruleParam.getString("chgevent_z.number");
+        // 非调动的情况下不需要拆单
+        if(!chgNumber.equals("1020_S")) {
+            return false;
+        }
+        // 获取到流动类型
+        String flowType = ruleParam.getString("flowtype_y");
+        // 非流入的情况下不需要拆单
+        if(!flowType.equals("1")) {
+            return false;
+        }
+        return isNeedSplit;
+    }
+
+    /**
+     * 获取社保员工变动处理单数据包
+     * @return
+     */
+    public DynamicObject getCoordVerifyBillDyn () {
+        return SitConstant.COORDVERIFYBILL_HELPER.loadOne(billId);
+    }
+}

+ 23 - 23
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordBizSaveHandler.java

@@ -16,10 +16,8 @@ import kd.hr.hbp.business.coordination.model.CoordBizContext;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import nckd.jxccl.sit.hcsi.business.importtaskguide.ImportTaskGuideImportService;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Tyx 2025-10-28
@@ -64,40 +62,42 @@ public class SinsurCoordBizSaveHandler implements CoordBizSaveHandler {
             Long fileId = sinsurFile.getLong("id");
             // 获取核定单分录数据
             DynamicObjectCollection entryCols = dynamicObject.getDynamicObjectCollection("nckd_entryentity");
-            for (DynamicObject entry : entryCols) {
+
+            // 只处理分录数据中实际参保单位与单头一致的数据
+            Long welfarePayerId = dynamicObject.getLong("welfarepayer_r31.id");
+            List<DynamicObject> list = entryCols.stream().filter(entry -> entry.getLong("nckd_welfarepayer.id") == welfarePayerId).collect(Collectors.toList());
+            for (DynamicObject entry : list) {
                 // 新建数据包
                 DynamicObject dyn = BusinessDataServiceHelper.newDynamicObject(SIBASE_ENTITY);
-                // 设置字段,单独处理下档案,计薪人员,参保单位,其余字段从fieldMap从处理;
+                // 设置字段,单独处理下档案,计薪人员,实际参保单位,理论参保单位】其余字段从fieldMap从处理;
                 dyn.set("sinsurfile", sinsurFile);
                 dyn.set("employee", sinsurFile.getDynamicObject("employee"));
                 dyn.set("welfarepayer", sinsurFile.getDynamicObject("welfarepayer"));
+                dyn.set("nckd_welfarepayertheory", sinsurFile.getDynamicObject("welfarepayertheory"));
                 dyn.set("id", Uuid.create());
                 Iterator it = fieldMap.keySet().iterator();
-                while(it.hasNext()) {
+                while (it.hasNext()) {
                     String key = it.next().toString();
                     dyn.set(fieldMap.get(key), entry.get(key));
                 }
                 sibaseCols.add(dyn);
             }
-            OperationResult result = SaveServiceHelper.saveOperate(SIBASE_ENTITY, sibaseCols.stream().toArray(DynamicObject[]::new), OperateOption.create());
-            // 标品SinSurFileCoordServiceHelper.saveBizObject方法中,判断success写反了,这里暂时反着写,后续等标品调整
-            // TODO
-            if(result.isSuccess()) {
-                returnMap.put("success",false);
+            if (sibaseCols.size() > 0) {
+                OperationResult result = SaveServiceHelper.saveOperate(SIBASE_ENTITY, sibaseCols.stream().toArray(DynamicObject[]::new), OperateOption.create());
+                // 标品SinSurFileCoordServiceHelper.saveBizObject方法中,判断success写反了,这里暂时反着写,后续等标品调整
+                // TODO
+                if (result.isSuccess()) {
+                    returnMap.put("success", false);
+                } else {
+                    throw new KDBizException("-------- 险种基数保存失败:" + result.getMessage());
+                    //returnMap.put("success",true);
+                    //returnMap.put("msg", result.getMessage());
+                }
+                log.info("-------- bizSaveHandler result = " + result + " --------");
             }
             else {
-                throw new KDBizException("-------- 险种基数保存失败:" + result.getMessage());
-                //returnMap.put("success",true);
-                //returnMap.put("msg", result.getMessage());
+                returnMap.put("success", false);
             }
-//            if(result.isSuccess()) {
-//                returnMap.put("success",true);
-//            }
-//            else {
-//                returnMap.put("success",false);
-//                returnMap.put("msg", result.getMessage());
-//            }
-            log.info("-------- bizSaveHandler result = " + result + " --------");
         }
         return returnMap;
     }

+ 111 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/file/attach/AdjustSIBaseService.java

@@ -0,0 +1,111 @@
+package nckd.jxccl.sit.hcsi.business.file.attach;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.JoinType;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class AdjustSIBaseService {
+
+    private static final Log logger = LogFactory.getLog(AdjustSIBaseService.class);
+    DynamicObject welfarePayer;
+    Date year;
+
+    public AdjustSIBaseService(DynamicObject welfarePayer, Date year) {
+        this.welfarePayer = welfarePayer;
+        this.year = year;
+    }
+
+    /**
+     * <p>执行查询方法
+     * <p>1.查询参保单位下所有员工
+     * <p>2.查询员工现在各险种的基数
+     * <p>3.查询员工的年收入证明统计单, 时间 = year, 单据状态 = 已确认
+     *
+     * @return
+     */
+    public DataSet query() {
+        // 查询社保档案 keySet为employee.id
+        Map<Long, DynamicObject> sinsurFileMap = querySinsurFileDyns();
+        List<Long> employeeIds = sinsurFileMap.keySet().stream().collect(Collectors.toList());
+        // 根据employeeIds 查询员工现在各险种的基数
+        DataSet SIBaseDs = querySIBaseDyns(employeeIds);
+        // 查询员工的年收入证明统计单, 时间 = year, 单据状态 = 已确认
+        DataSet incomeBillDs = queryIncomeBillDyns(employeeIds);
+        // 根据employeeIds处理数据
+        return dealData(sinsurFileMap, SIBaseDs, incomeBillDs);
+    }
+
+
+    /**
+     * 处理数据
+     *
+     * @param sinsurFileMap
+     * @param SIBaseDs
+     * @param incomeBillDs
+     * @return
+     */
+    public DataSet dealData(Map<Long, DynamicObject> sinsurFileMap, DataSet SIBaseDs, DataSet incomeBillDs) {
+        String[] leftFields = new String[]{"nckd_employee.id as employeeId", "nckd_totalamount as totalamount"};
+        String[] rightFields = new String[]{"sinsurfile.id as sinsurfileId", "welfaretype.id as welfaretypeId", "paybaseofemployee", "paybaseofcompany", "nckd_sinsurdimension.id as sinsurdimensionId"};
+        return incomeBillDs.join(SIBaseDs, JoinType.INNER).on("nckd_employee.id", "employee.id").select(leftFields, rightFields).finish();
+    }
+
+
+
+    /**
+     * 查询社保档案
+     * @return
+     */
+    public Map<Long, DynamicObject> querySinsurFileDyns() {
+        QFilter filter = new QFilter("welfarepayer.id", QCP.equals, welfarePayer.getLong("id"));
+        filter.and(QFilterCommonHelper.getCurrentVersionFilter());
+        filter.and(QFilterCommonHelper.getDataStatusFilter());
+        DynamicObjectCollection cols = SitConstant.SINSURFILE_HELPER.queryOriginalCollection("id,employee.id,org.id", new QFilter[]{filter});
+        return cols.stream().collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("employee.id");
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+    }
+
+    /**
+     * 查询员工现在各险种的基数
+     *
+     * @param employeeIds
+     * @return
+     */
+    public DataSet querySIBaseDyns(List<Long> employeeIds) {
+        QFilter filter = new QFilter("employee.id", QCP.in, employeeIds);
+        filter.and("iscurrentdata", QCP.equals, "1");
+        filter.and("insured", QCP.equals, true);
+        String selectFields = "sinsurfile.id, employee.id, welfaretype.id, paybaseofemployee, paybaseofcompany, nckd_sinsurdimension.id";
+        return SitConstant.SIBASE_HELPER.queryDataSet("AdjustSIBaseService-querySIBase",selectFields, new QFilter[]{filter});
+    }
+
+    /**
+     * 根据employeeIds+年度查询员工年收入证明统计单数据
+     *
+     * @param employeeIds
+     * @return
+     */
+    private DataSet queryIncomeBillDyns(List<Long> employeeIds) {
+        QFilter filter = new QFilter("nckd_employee.id", QCP.in, employeeIds);
+        filter.and("nckd_year", QCP.equals, year);
+        filter.and("billstatus", QCP.in, new HashSet<>(Arrays.asList("C", "H")));
+        String selectFields = "nckd_employee.id, nckd_totalamount";
+        return SitConstant.SITINCOMEBILL_HELPER.queryDataSet("AdjustSIBaseService-queryIncomeBill", selectFields, new QFilter[]{filter});
+    }
+
+}

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

@@ -8,6 +8,8 @@ import java.util.Map;
 public class SitConstant {
     /*社保档案*/
     public static final HRBaseServiceHelper SINSURFILE_HELPER = new HRBaseServiceHelper("hcsi_sinsurfile");
+    /*险种基数设置*/
+    public static final HRBaseServiceHelper SIBASE_HELPER = new HRBaseServiceHelper("hcsi_sibase");
     /*业务项目*/
     public static final HRBaseServiceHelper BIZITEM_HELPER = new HRBaseServiceHelper("hsbs_bizitem");
     /* 社保核算任务-明细人员 */
@@ -32,6 +34,8 @@ public class SitConstant {
     public static final HRBaseServiceHelper SINSURSTD_HELPER = new HRBaseServiceHelper("sitbs_sinsurstd");
     /* 参保标准维度结果 */
     public static final HRBaseServiceHelper STDDIMRS_HELPER = new HRBaseServiceHelper("sitbs_stddimrs");
+    /* 社保员工变动处理单 */
+    public static final HRBaseServiceHelper COORDVERIFYBILL_HELPER = new HRBaseServiceHelper("hpdi_empcoordverifbill3");
 
     public static final Long PAY_BASE_OF_EMPLOYEE_ID = 1010L;
     public static final String PAY_BASE_OF_EMPLOYEE_KEY = "nckd_paybaseofemployee";

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

@@ -1,5 +1,6 @@
 package nckd.jxccl.sit.hcsi.formplugin.web.coordination;
 
+import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.serialization.SerializationUtils;
@@ -7,6 +8,7 @@ import kd.bos.dataentity.utils.ObjectUtils;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.datamodel.IDataModel;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.form.control.EntryGrid;
 import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
@@ -19,6 +21,7 @@ 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.bos.servicehelper.operation.OperationServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.util.HRStringUtils;
 import kd.sdk.plugin.Plugin;
@@ -217,6 +220,10 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
                 this.getView().showTipNotification("请先维护险种基数!");
             }
         }
+        else if(HRStringUtils.equals(operateKey, "donothing_split")) {
+
+        }
+
 
     }
 
@@ -231,6 +238,20 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         else if(HRStringUtils.equals(operateKey, "batchsetting")){
             doBatchSetting();
         }
+        else if(HRStringUtils.equals(operateKey, "donothing_split")) {
+            doSplit();
+        }
+    }
+
+    /**
+     * 拆分
+     */
+    private void doSplit() {
+        List<Long> selectIds = this.getSelectIds();
+        List<String> queryFields = this.getQueryFields();
+        HRBaseServiceHelper helper = new HRBaseServiceHelper(this.getEntityNumber());
+        DynamicObject[] billCols = helper.load(String.join(",", queryFields), new QFilter[]{new QFilter("id", "in", this.getSelectIds())});
+        OperationResult result = OperationServiceHelper.executeOperate("donothing_split", this.getEntityNumber(), billCols, OperateOption.create());
     }
 
     /**
@@ -344,6 +365,8 @@ public class SinSurEmpChgCoordBatchEditPluginEx extends AbstractFormPlugin imple
         queryFields.remove("adminorg");
         queryFields.remove("position");
         queryFields.addAll(defaultQueryFields);
+        queryFields.add("nckd_issplit");
+        queryFields.add("nckd_sourcebillid");
         Set<String> fields = this.getEntryFields();
         queryFields.addAll(fields.stream().map(field -> "nckd_entryentity." + field).collect(Collectors.toList()));
         return new ArrayList(queryFields);

+ 181 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/file/attach/AdjustSIBaseFormPlugin.java

@@ -0,0 +1,181 @@
+package nckd.jxccl.sit.hcsi.formplugin.web.file.attach;
+
+import com.kingdee.util.Uuid;
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.datamodel.AbstractFormDataModel;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.TableValueSetter;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.sit.hcsi.business.file.attach.AdjustSIBaseService;
+import nckd.jxccl.sit.hcsi.common.constant.SitConstant;
+
+import java.util.*;
+
+/**
+ * 动态表单插件
+ */
+public class AdjustSIBaseFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    private static Map<String, String> fieldMap = new HashMap<String, String>();
+    static {
+        fieldMap.put("nckd_welfaretype","welfaretype");
+        fieldMap.put("nckd_paybaseofemployee","paybaseofemployee");
+        fieldMap.put("nckd_paybaseofcompany","paybaseofcompany");
+        fieldMap.put("nckd_startdate","startdate");
+        fieldMap.put("nckd_enddate","enddate");
+        fieldMap.put("nckd_description","description");
+        fieldMap.put("nckd_sinsurdimension","nckd_sinsurdimension");
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate formOperate = (FormOperate)args.getSource();
+        String opKey = formOperate.getOperateKey();
+        switch (opKey) {
+            case "donothing_query":
+                queryVerify(args);
+                break;
+            case "donothing_adjust":
+                adjustVerify(args);
+                break;
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        String opKey = afterDoOperationEventArgs.getOperateKey();
+        switch(opKey) {
+            case "donothing_query":
+                doQuery();
+                break;
+            case "donothing_adjust":
+                if(afterDoOperationEventArgs.getOperationResult().isSuccess()) {
+                    doAdjust();
+                }
+        }
+    }
+
+    /**
+     * 执行查询方法
+     */
+    public void doQuery() {
+        IDataModel model = this.getModel();
+        DynamicObject dyn = model.getDataEntity(true);
+        DynamicObject welfarePayer = dyn.getDynamicObject("nckd_welfarepayer");
+        Date year = dyn.getDate("nckd_year");
+        // 删除分录
+        this.getModel().deleteEntryData("nckd_entryentity");
+
+        AdjustSIBaseService service = new AdjustSIBaseService(welfarePayer, year);
+        DataSet dataSet = service.query();
+        handleData(dataSet);
+    }
+
+    public void handleData(DataSet dataSet) {
+        TableValueSetter setter = new TableValueSetter();
+        int rowIndex = 0;
+        AbstractFormDataModel model = (AbstractFormDataModel) this.getModel();
+        while(dataSet.hasNext()) {
+            Row rowData = dataSet.next();
+            setter.set("nckd_sinsurfile", rowData.getLong("sinsurfileId"), rowIndex);
+            setter.set("nckd_employee", rowData.getLong("employeeId"), rowIndex);
+            setter.set("nckd_welfaretype", rowData.getLong("welfaretypeId"), rowIndex);
+            setter.set("nckd_yearamount", rowData.getBigDecimal("totalamount"), rowIndex);
+            setter.set("nckd_paybaseofemployee", rowData.getBigDecimal("paybaseofemployee"), rowIndex);
+            setter.set("nckd_paybaseofcompany", rowData.getBigDecimal("paybaseofcompany"), rowIndex);
+            setter.set("nckd_sinsurdimension", rowData.getLong("sinsurdimensionId"), rowIndex);
+            rowIndex++;
+        }
+        model.beginInit();
+        model.batchCreateNewEntryRow("nckd_entryentity", setter);
+        model.endInit();
+        this.getView().updateView("nckd_entryentity");
+    }
+
+    /**
+     * 执行调整方法
+     */
+    public void doAdjust() {
+        IDataModel model = this.getModel();
+        DynamicObject dyn = model.getDataEntity(true);
+        DynamicObjectCollection entryCols = dyn.getDynamicObjectCollection("nckd_entryentity");
+        if(entryCols.size() > 0) {
+            DynamicObjectCollection sibaseCols = new DynamicObjectCollection();
+            for(DynamicObject entry : entryCols) {
+                DynamicObject bill = BusinessDataServiceHelper.newDynamicObject(SitConstant.SIBASE_HELPER.getEntityName());
+                bill.set("welfarepayer", dyn.getDynamicObject("nckd_welfarepayer"));
+                bill.set("welfaretype", entry.getDynamicObject("nckd_welfaretype"));
+                bill.set("sinsurfile", entry.getDynamicObject("nckd_sinsurfile"));
+                bill.set("employee", entry.getDynamicObject("nckd_employee"));
+                bill.set("insured", true);
+                bill.set("startdate", entry.getDate("nckd_effectdate"));
+                bill.set("enddate", entry.getDate("nckd_effectdate"));
+                bill.set("nckd_sinsurdimension", entry.getDynamicObject("nckd_sinsurdimension"));
+                bill.set("paybaseofemployee", entry.getBigDecimal("nckd_yearamount"));
+                bill.set("paybaseofcompany", entry.getBigDecimal("nckd_yearamount"));
+                bill.set("id", Uuid.create());
+                sibaseCols.add(bill);
+            }
+            OperationResult result = SaveServiceHelper.saveOperate(SitConstant.SIBASE_HELPER.getEntityName(), sibaseCols.stream().toArray(DynamicObject[]::new), OperateOption.create());
+            if(result.isSuccess()) {
+                this.getView().showTipNotification("调整成功!",3000);
+            }
+            else {
+                this.getView().showMessage("调整出错:" + result.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 查询前校验
+     * @param args
+     */
+    public void queryVerify(BeforeDoOperationEventArgs args) {
+        IDataModel model = this.getModel();
+        Object welfarepayer = model.getValue("nckd_welfarepayer");
+        Object year = model.getValue("nckd_year");
+        if(ObjectUtils.isEmpty(welfarepayer)) {
+            this.getView().showTipNotification("请选择参保单位!",3000);
+            args.setCancel(true);
+        }
+        if(ObjectUtils.isEmpty(year)) {
+            this.getView().showTipNotification("请选择收入年度!", 3000);
+            args.setCancel(true);
+        }
+    }
+
+    /**
+     * 调整前校验
+     * @param args
+     */
+    public void adjustVerify(BeforeDoOperationEventArgs args) {
+        IDataModel model = this.getModel();
+        int rowCount = model.getEntryRowCount("nckd_entryentity");
+        if(rowCount == 0) {
+            this.getView().showTipNotification("不存在调整的数据",3000);
+            args.setCancel(true);
+        }
+    }
+
+
+
+}

+ 56 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/file/attach/SIBaseListEx.java

@@ -0,0 +1,56 @@
+package nckd.jxccl.sit.hcsi.formplugin.web.file.attach;
+
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.sdk.plugin.Plugin;
+
+/**
+ * 标准单据列表插件
+ */
+public class SIBaseListEx extends AbstractListPlugin implements Plugin {
+
+    private static final Log logger = LogFactory.getLog(SIBaseListEx.class);
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate formOperate = (FormOperate)args.getSource();
+        String opKey = formOperate.getOperateKey();
+        switch (opKey) {
+            case "donothing_adjust":
+                this.opeanAdjustPage();
+                break;
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+    }
+
+    private void opeanAdjustPage() {
+        FormShowParameter formShowParameter = new FormShowParameter();
+        formShowParameter.setShowTitle(true);
+        formShowParameter.setFormId("nckd_adjustsibase");
+        formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
+        formShowParameter.setCloseCallBack(new CloseCallBack(this, "adjustSIBase"));
+        this.getView().showForm(formShowParameter);
+    }
+
+    @Override
+    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
+        super.closedCallBack(closedCallBackEvent);
+        String actionId = closedCallBackEvent.getActionId();
+        if ("adjustSIBase".equals(actionId)) {
+
+        }
+    }
+}

+ 57 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/opplugin/web/coordination/SinsurEmpCoordSplitOp.java

@@ -0,0 +1,57 @@
+package nckd.jxccl.sit.hcsi.opplugin.web.coordination;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.sit.hcsi.business.coordination.SinsurCoordSplitService;
+
+/**
+ * 单据操作插件
+ */
+public class SinsurEmpCoordSplitOp extends AbstractOperationServicePlugIn implements Plugin {
+
+    private static final Log logger = LogFactory.getLog(SinsurEmpCoordSplitOp.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+        DynamicObject[] bills = e.getDataEntities();
+        for(DynamicObject bill : bills) {
+            SinsurCoordSplitService service = new SinsurCoordSplitService(bill.getLong("id"), bill);
+            if(service.isNeedSplit()) {
+                service.doSplit();
+            }
+            else {
+                OperateOption option = OperateOption.create();
+                OperationResult result = OperationServiceHelper.executeOperate("confirmeffect", "hpdi_empcoordverifbill3", new DynamicObject[]{bill}, option);
+                logger.info("标品提交生效结果:" + result.isSuccess());
+
+            }
+        }
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+    }
+}

+ 16 - 4
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/opplugin/web/file/attach/SIBaseSaveOpEx.java

@@ -1,10 +1,13 @@
 package nckd.jxccl.sit.hcsi.opplugin.web.file.attach;
 
+import com.kingdee.bos.framework.core.exception.BizException;
 import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
 import kd.bos.entity.plugin.PreparePropertysEventArgs;
 import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
@@ -23,7 +26,7 @@ import java.util.stream.Collectors;
  */
 public class SIBaseSaveOpEx extends AbstractOperationServicePlugIn implements Plugin {
 
-    private static final Log log = LogFactory.getLog(SIBaseSaveOpEx.class);
+    private static final Log logger = LogFactory.getLog(SIBaseSaveOpEx.class);
 
     @Override
     public void onPreparePropertys(PreparePropertysEventArgs e) {
@@ -32,8 +35,8 @@ public class SIBaseSaveOpEx extends AbstractOperationServicePlugIn implements Pl
     }
 
     @Override
-    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
-        super.afterExecuteOperationTransaction(e);
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
         DynamicObject[] bills = e.getDataEntities();
         // 根据社保档案ID进行分组:
         Map<Long, List<DynamicObject>> billsMap = Arrays.stream(bills)
@@ -54,8 +57,17 @@ public class SIBaseSaveOpEx extends AbstractOperationServicePlugIn implements Pl
                 String fieldKey = welfAreTypeDyn.getString("nckd_sinsurfilefields");
                 sinsurFileDyn.set(fieldKey, siBase.getLong("nckd_sinsurdimension.id"));
             }
-            SaveServiceHelper.saveOperate("hcsi_sinsurfile", new DynamicObject[]{sinsurFileDyn}, OperateOption.create());
+            OperationResult result = SaveServiceHelper.saveOperate("hcsi_sinsurfile", new DynamicObject[]{sinsurFileDyn}, OperateOption.create());
+            if(!result.isSuccess()) {
+                logger.info("-------- 保存基数设置结果:" + result.getMessage());
+                logger.info("-------- 保存基数设置错误:" + result.getAllErrorOrValidateInfo());
+                throw new BizException("-------- 保存基数设置失败:" + result.getMessage());
+            }
         }
+    }
 
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
     }
 }

+ 9 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/business/outdata/OutImportTaskGuideExportService.java

@@ -220,6 +220,15 @@ public class OutImportTaskGuideExportService {
     }
 
     private void setDataValidation(SXSSFSheet sheet, String[] options, int columnIndex, int firstDataRowIndex) {
+
+        // 检查选项总长度是否超过限制
+        String optionsString = String.join(",", options);
+        if (optionsString.length() > 255) {
+            // 如果超过255字符限制,则不创建下拉列表或采用其他方式处理
+            logger.warn("Dropdown options exceed 255 characters limit, skipping validation for column: " + columnIndex);
+            return;
+        }
+
         // 创建下拉列表约束
         DataValidationHelper validationHelper = sheet.getDataValidationHelper();
         DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(options);