Browse Source

Merge remote-tracking branch 'origin/master'

jtd 2 days ago
parent
commit
2f0abb77c1
17 changed files with 580 additions and 41 deletions
  1. 2 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
  2. 1 1
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/hbp/formplugin/web/coordination/EmpChangeCoordinationListTplPluginEx.java
  3. 1 1
      code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/AdjFileServiceHelper.java
  4. 1 2
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/excells/plugin/operate/PushAdjustOpPlugin.java
  5. 372 24
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/form/recgen/IntJobPostFormPlugin.java
  6. 43 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostAuditedOpPlugin.java
  7. 1 1
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/file/PersonPosFileSaveOpPlugin.java
  8. 2 2
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/task/PsmsAdjustSalaryTask.java
  9. 2 2
      code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/salary/PushAdjustOpPlugin.java
  10. 2 2
      code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/salary/SalaryAdjOpPlugin.java
  11. 14 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordExtRegister.java
  12. 85 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurVerifBillBeforeSaveHandlerEx.java
  13. 9 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/formplugin/web/coordination/HCSIEmpCoordVerifBillEditEx.java
  14. 8 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/mservice/SwcService.java
  15. 10 1
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/mservice/api/ISwcService.java
  16. 1 1
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/servicehelper/ServiceFactory.java
  17. 26 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcss/formplugin/IncomeProofBillExPlugin.java

+ 2 - 0
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java

@@ -117,6 +117,8 @@ public class FormConstant {
     public static final String BD_EXRATETABLE = "bd_exratetable";
     /** 频度 实体标识 */
     public static final String HSBS_CALFREQUENCY = "hsbs_calfrequency";
+    /** 考核结果实体标识 */
+    public static final String NCKD_APPRAISALRESULT = "nckd_appraisalresult";
     /**
      * 定调薪类型 默认值  用于  定调薪清单处理
      * */

+ 1 - 1
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hbp/formplugin/web/coordination/EmpChangeCoordinationListTplPluginEx.java → code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/hbp/formplugin/web/coordination/EmpChangeCoordinationListTplPluginEx.java

@@ -1,4 +1,4 @@
-package nckd.jxccl.hr.hbp.formplugin.web.coordination;
+package nckd.jxccl.base.common.hbp.formplugin.web.coordination;
 
 import kd.bos.dataentity.serialization.SerializationUtils;
 import kd.bos.form.plugin.AbstractFormPlugin;

+ 1 - 1
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/AdjFileServiceHelper.java

@@ -86,7 +86,7 @@ public class AdjFileServiceHelper {
             adjRecordParams.put("selprops", "salarystdv.rankentry.rank.id,salarystdv.rankentry.rank.name,salarystdv.rankentry.rank.number,salarystdv.rankentry.rank.index,salarystdv.rankentry.frankindex,company.id,company.name,hcdmorg.id,");
             //查询定调薪记录
             //hcdm_decadjrecor
-            Map<String, Object> lastDecAdjRecordMap = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcHCDMService", "getLastDecAdjRecords", adjRecordParams);
+            Map<String, Object> lastDecAdjRecordMap = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "getLastDecAdjRecords", adjRecordParams);
             if (ConvertUtil.toBoolean(lastDecAdjRecordMap.get("success"))) {
                 List<Map> datas = ConvertUtil.toList(lastDecAdjRecordMap.get("data"), ArrayList::new);
                 for (Map data : datas) {

+ 1 - 2
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/excells/plugin/operate/PushAdjustOpPlugin.java

@@ -17,7 +17,6 @@ import kd.bos.logging.LogFactory;
 import kd.bos.servicehelper.DispatchServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.sdk.plugin.Plugin;
-import kd.sdk.swc.hcdm.business.helper.HCDMApplyBillServiceHelper;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.common.exception.ValidationException;
 import nckd.jxccl.base.common.utils.ConvertUtil;
@@ -181,7 +180,7 @@ public class PushAdjustOpPlugin extends AbstractOperationServicePlugIn implement
             List<DynamicObject> saveDynamicObjects = new ArrayList<>();
             TXHandle tx = TX.requiresNew();
             try {
-                Map<String, Object> result = HCDMApplyBillServiceHelper.saveDraftApplyBill(papams);
+                Map<String, Object> result = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "saveDraftApplyBill", papams);
                 logger.info("推送定调薪结果:{}", JSON.toJSONString(result));
 
                 if (!ConvertUtil.toBoolean(result.get("success")) || result.get("data") == null || ConvertUtil.toList(result.get("data")).isEmpty()) {

+ 372 - 24
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/form/recgen/IntJobPostFormPlugin.java

@@ -1,11 +1,21 @@
 package nckd.jxccl.hr.ijp.plugin.form.recgen;
 
+import com.google.common.collect.Lists;
 import kd.bos.common.enums.EnableEnum;
+import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.QueryEntityType;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.ConfirmTypes;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
 import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
 import kd.bos.form.plugin.AbstractFormPlugin;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
@@ -13,16 +23,27 @@ import kd.bos.servicehelper.QueryServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRQueryEntityHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.enums.AppraisalResultEnum;
 import nckd.jxccl.base.common.utils.ConvertUtil;
 import nckd.jxccl.base.common.utils.DateUtil;
 import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.hrpi.helper.EmpPosOrgRelHelper;
 import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
 import nckd.jxccl.hr.ijp.common.IntJobPostConstant;
+import nckd.jxccl.hr.psms.common.PerfRankMgmtConstant;
 import org.apache.commons.lang3.StringUtils;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -34,6 +55,16 @@ import java.util.stream.Collectors;
 */
 public class IntJobPostFormPlugin extends AbstractFormPlugin implements Plugin {
 
+    // 常量定义
+    private static final int FIVE_YEARS = 5;
+    private static final String[] POST_TYPES = {"JTCC_1002", "1010_S"};
+    private static final String PERF_MANAGER_ENTRY = "nckd_perfmanagerentry";
+    private static final String PERF_MANAGER = "nckd_perfmanager";
+    private static final String APPRAISAL_RESULT = "nckd_appraisalresult";
+    private static final String APPRAISAL_YEAR = "nckd_appraisalyear";
+    private static final String PERSON_FIELD = FormConstant.NCKD_PERSON;
+    private static final String[] PERFORMANCE_EVALUATION_TYPES = {"JTCC_1002", "1010_S"}; // 任职类型:上挂/全职任职
+    
     @Override
     public void afterDoOperation(AfterDoOperationEventArgs evt) {
         if(evt.getOperationResult() != null && evt.getOperationResult().isSuccess()){
@@ -46,26 +77,135 @@ public class IntJobPostFormPlugin extends AbstractFormPlugin implements Plugin {
                 }else if(org == null){
                     this.getView().showTipNotification("请先选择二级单位!");
                 }else{
-                    if("A".equalsIgnoreCase(talentType)){
-                        getExcellentEmp();
-                    }else if("B".equalsIgnoreCase(talentType)){
+                    switch (talentType.toUpperCase()) {
+                        case "A":
+                            getExcellentEmp();
+                            break;
+                        case "C":
+                            getPerformanceEndEmployees();
+                            break;
+                        default:
+                            // 其他类型暂不处理
+                            break;
+                    }
+                }
+            }
+        }
+    }
 
-                    }else{
+    @Override
+    public void beforePropertyChanged(PropertyChangedArgs e) {
+        String name = e.getProperty().getName();
+        if (PerfRankMgmtConstant.NCKD_ORG.equalsIgnoreCase(name) || IntJobPostConstant.NCKD_TALENTTYPE.equalsIgnoreCase(name)) {
+            ChangeData[] changeSet = e.getChangeSet();
+            Object oldValue = changeSet[0].getOldValue();
+            Object newValue = changeSet[0].getNewValue();
+            if(!Objects.equals(newValue, oldValue)) {
+                DynamicObjectCollection entryEntities = getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_ENTRYENTITY);
+                boolean hasNonEmptyPerson = entryEntities.stream()
+                        .anyMatch(entry -> entry.getDynamicObject(PerfRankMgmtConstant.NCKD_PERSON) != null);
+                if(hasNonEmptyPerson) {
+                    // 直接弹出确认框,无需回滚
+                    // 表单字段修改前交互
+                    this.getView().showConfirm(
+                            "确认修改【二级组织或员工类别】吗?",
+                            "请注意:修改【二级组织或员工类别】会导致员工范围变化会清空现有员工信息。您需要在之后重新生成。确认要修改吗?",
+                            MessageBoxOptions.OKCancel,
+                            ConfirmTypes.Delete,
+                            new ConfirmCallBackListener(PerfRankMgmtConstant.NCKD_ORG, this)
+                    );
+                }
+            }
+        }
+    }
 
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String name = e.getProperty().getName();
+        if (PerfRankMgmtConstant.NCKD_PERSON.equalsIgnoreCase(name)) {
+            String talentType = ConvertUtil.toStr(this.getModel().getValue(IntJobPostConstant.NCKD_TALENTTYPE));
+            ChangeData[] changeSet = e.getChangeSet();
+            int rowIndex = changeSet[0].getRowIndex();
+            Object oldValue = changeSet[0].getOldValue();
+            Object newValue = changeSet[0].getNewValue();
+            if(!Objects.equals(newValue, oldValue) && "B".equalsIgnoreCase(talentType)) {
+                // 获取考核结果信息
+                LocalDateTime lastYear = DateUtil.minusYears(DateUtil.now(), 1);
+                LocalDateTime beforeLastYear = DateUtil.minusYears(DateUtil.now(), 2);
+                DynamicObject person = ConvertUtil.toDynamicObject(newValue);
+                Map<Long, List<DynamicObject>> perfManagerMap = getPerformanceEvaluationResults(Lists.newArrayList(person.getLong(FormConstant.ID_KEY)));
+                if(perfManagerMap != null && perfManagerMap.get(person.getLong(FormConstant.ID_KEY)) != null){
+                    List<DynamicObject> perfManagerList = perfManagerMap.get(person.getLong(FormConstant.ID_KEY));
+                    for (DynamicObject perfManager : perfManagerList) {
+                        Date appraisalYear = perfManager.getDate(APPRAISAL_YEAR);
+                        long appraisalResultId = perfManager.getLong(String.join(".", APPRAISAL_RESULT, FormConstant.ID_KEY));
+                        String appraisalResultName = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NAME_KEY));
+                        String appraisalResultNumber = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NUMBER_KEY));
+                        DynamicObject appraisalResult = EntityHelper.newEntity(FormConstant.NCKD_APPRAISALRESULT, appraisalResultId);
+                        appraisalResult.set(FormConstant.NAME_KEY, appraisalResultName);
+                        appraisalResult.set(FormConstant.NUMBER_KEY, appraisalResultNumber);
+                        if(lastYear.getYear() == DateUtil.getYear(appraisalYear)) {
+                            this.getModel().setValue(IntJobPostConstant.NCKD_APPRAISALRESULT, appraisalResult);
+                        }
+                        if(beforeLastYear.getYear() == DateUtil.getYear(appraisalYear)) {
+                            this.getModel().setValue(IntJobPostConstant.NCKD_BEFORELAST, appraisalResult);
+                        }
                     }
                 }
+
+
+            }
+        }
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent evt) {
+        super.confirmCallBack(evt);
+        if(PerfRankMgmtConstant.NCKD_ORG.equalsIgnoreCase(evt.getCallBackId())){
+            // 用户确认:允许修改继续,并清空分录
+            if (evt.getResult() == MessageBoxResult.Yes) {
+                DynamicObjectCollection entryEntities = getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_ENTRYENTITY);
+                entryEntities.clear();
+                this.getModel().updateEntryCache(entryEntities);
+                this.getView().updateView(PerfRankMgmtConstant.NCKD_ENTRYENTITY);
             }
         }
     }
 
-    //获取优秀生员工
-    //本单位工作(工作信息-进本单位时间)满5年,距法定退休年龄(工作信息-新法定退休日期)超过5年且上年度员工绩效考核为优秀的所有员工
+    /**
+     * 获取优秀生员工
+     * 本单位工作(工作信息-进本单位时间)满5年,距法定退休年龄(工作信息-新法定退休日期)超过5年且上年度员工绩效考核为优秀的所有员工
+     * @return: void
+     * @author W.Y.C
+     * @date: 2026/01/08 15:46
+     */
     private void getExcellentEmp(){
         DynamicObject org = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(IntJobPostConstant.NCKD_ORG));
+        
+        // 获取满足基本条件的员工
+        Map<Long, DynamicObject> personMap = getBasicEmployeeCondition(org, "A");
+        
+        // 获取考核结果信息
+        Map<Long, List<DynamicObject>> perfManagerMap = getPerformanceEvaluationResults(personMap.keySet());
+        
+        // 处理员工数据,筛选符合条件的优秀员工
+        List<PersonData> personDataList = processExcellentEmployeeData(perfManagerMap);
+        
+        // 更新界面显示
+        updateEntryEntity(personDataList);
+    }
+
+    /**
+     * 获取满足基本条件的员工
+     * @param org 组织信息
+     * @param talentType 类型
+     * @return 员工信息映射
+     */
+    private Map<Long, DynamicObject> getBasicEmployeeCondition(DynamicObject org, String talentType) {
         //前5年
-        LocalDateTime firstFiveYears = DateUtil.minusYears(DateUtil.now(), 5);
+        LocalDateTime fiveYearsAgo = DateUtil.minusYears(DateUtil.now(), FIVE_YEARS);
         //后5年
-        LocalDateTime fiveYearsLater = DateUtil.addYears(DateUtil.now(), 5);
+        LocalDateTime fiveYearsLater = DateUtil.addYears(DateUtil.now(), FIVE_YEARS);
 
         QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
                 .add(FormConstant.ID_KEY)
@@ -78,18 +218,29 @@ public class IntJobPostFormPlugin extends AbstractFormPlugin implements Plugin {
         QFilter qFilter = new QFilter(String.join(".", FormConstant.ADMINORG, FormConstant.NCKD_SECONDORG), QCP.equals, org.getLong(FormConstant.ID_KEY))
                 .and(QFilterCommonHelper.getValidDateFilter(FormConstant.STARTDATE, FormConstant.ENDDATE))
                 //任职类型:上挂/全职任职
-                .and(String.join( ".", FormConstant.POSTYPE, FormConstant.NUMBER_KEY), QCP.in,new String[]{"JTCC_1002", "1010_S"})
+                .and(String.join(".", FormConstant.POSTYPE, FormConstant.NUMBER_KEY), QCP.in, PERFORMANCE_EVALUATION_TYPES)
                 //在职人员
-                .and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_HIRED), QCP.equals, EnableEnum.YES.getCode())
-                //进本单位满5年
-                .and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.STARTDATE), QCP.less_equals, DateUtil.toDate(firstFiveYears));
-                //新法定退休日期超过5年条件,或退休日期为空
-        QFilter lanRetDtFilter = new QFilter(String.join(".", FormConstant.HRPI_PERSERLEN, FormConstant.NCKD_NEWPLANRETDT), QCP.is_null,null)
+                .and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_HIRED), QCP.equals, EnableEnum.YES.getCode());
+        if(talentType.equalsIgnoreCase("A")) {
+            //进本单位满5年
+            qFilter.and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.STARTDATE), QCP.less_equals, DateUtil.toDate(fiveYearsAgo));
+        }
+
+        //新法定退休日期超过5年条件,或退休日期为空
+        QFilter retirementDateFilter = new QFilter(String.join(".", FormConstant.HRPI_PERSERLEN, FormConstant.NCKD_NEWPLANRETDT), QCP.is_null, null)
                 .or(String.join(".", FormConstant.HRPI_PERSERLEN, FormConstant.NCKD_NEWPLANRETDT), QCP.large_equals, DateUtil.toDate(fiveYearsLater));
-        qFilter.and(lanRetDtFilter);
+        qFilter.and(retirementDateFilter);
+        
         QueryEntityType queryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityType("personfilequery");
         DynamicObjectCollection personList = HRQueryEntityHelper.getInstance().getQueryDyoColl(queryEntityType, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter}, queryFieldBuilder.buildOrder());
-        Map<Long, DynamicObject> personMap = personList.stream()
+        
+        // 调试信息,仅在开发阶段使用
+        // for (DynamicObject dynamicObject : personList) {
+        //     String number = dynamicObject.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.NUMBER_KEY));
+        //     System.out.println(number);
+        // }
+        
+        return personList.stream()
                 .collect(Collectors.groupingBy(
                         obj -> obj.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY))
                 ))
@@ -99,21 +250,218 @@ public class IntJobPostFormPlugin extends AbstractFormPlugin implements Plugin {
                         Map.Entry::getKey,
                         entry -> entry.getValue().get(0) // 由于已按日期降序排列,取第一条即为最新
                 ));
+    }
 
-        //获取上年和上上年考核结果
+    /**
+     * 获取绩效考核结果
+     * @param personList 员工ID
+     * @return 绩效考核结果映射
+     */
+    private Map<Long, List<DynamicObject>> getPerformanceEvaluationResults(Collection<Long> personList) {
         QueryFieldBuilder perfManagerQueryFieldBuilder = QueryFieldBuilder.create()
-                .addIdNumberName("nckd_appraisalresult")
-                .add("nckd_appraisalyear");
+                .addIdNumberName(PERF_MANAGER, FormConstant.NCKD_PERSON)
+                .addIdNumberName(APPRAISAL_RESULT)
+                .add(APPRAISAL_YEAR);
 
         Date beginDate = DateUtil.beginOfYear(DateUtil.minusYears(DateUtil.nowDate(), 2));
         Date endDate = DateUtil.endOfYear(DateUtil.minusYears(DateUtil.nowDate(), 1));
-        QFilter perfManagerFilter = new QFilter("nckd_appraisalyear",QCP.large_equals,beginDate)
-                .and("nckd_appraisalyear",QCP.less_equals,endDate)
-                .and(String.join(".", "nckd_perfmanager", FormConstant.NCKD_PERSON), QCP.in, personMap.keySet());
-        DynamicObjectCollection query = QueryServiceHelper.query("nckd_perfmanagerentry", perfManagerQueryFieldBuilder.buildSelect(), new QFilter[]{perfManagerFilter});
-        for (DynamicObject dynamicObject : query) {
+        QFilter perfManagerFilter = new QFilter(APPRAISAL_YEAR, QCP.large_equals, beginDate)
+                .and(APPRAISAL_YEAR, QCP.less_equals, endDate)
+                .and(String.join(".", PERF_MANAGER, FormConstant.NCKD_PERSON), QCP.in, personList);
+        
+        DynamicObjectCollection perfManagerColl = QueryServiceHelper.query(PERF_MANAGER_ENTRY, perfManagerQueryFieldBuilder.buildSelect(), new QFilter[]{perfManagerFilter});
+        
+        return perfManagerColl.stream()
+                .collect(Collectors.groupingBy(perfManager ->
+                        perfManager.getLong(String.join(".", PERF_MANAGER, FormConstant.NCKD_PERSON, FormConstant.ID_KEY))
+                ));
+    }
+
+    /**
+     * 处理优秀员工数据
+     * @param perfManagerMap 绩效考核结果映射
+     * @return 符合条件的员工数据列表
+     */
+    private List<PersonData> processExcellentEmployeeData(Map<Long, List<DynamicObject>> perfManagerMap) {
+        //取出上年度
+        LocalDateTime lastYear = DateUtil.minusYears(DateUtil.now(), 1);
+        LocalDateTime beforeLastYear = DateUtil.minusYears(DateUtil.now(), 2);
+        List<PersonData> personDataList = new ArrayList<>();
+        
+        for (Map.Entry<Long, List<DynamicObject>> perfManagerEntry : perfManagerMap.entrySet()) {
+            Long key = perfManagerEntry.getKey();
+            List<DynamicObject> perfManagerList = perfManagerEntry.getValue();
+            
+            PersonData personData = new PersonData();
+            boolean isExcellent = false;
+            
+            for (DynamicObject perfManager : perfManagerList) {
+                Date appraisalYear = perfManager.getDate(APPRAISAL_YEAR);
+                String appraisalResultNumber = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NUMBER_KEY));
+                Long personId = perfManager.getLong(String.join(".", PERF_MANAGER, FormConstant.NCKD_PERSON, FormConstant.ID_KEY));
+                
+                personData.personId = personId;
+                
+                if(lastYear.getYear() == DateUtil.getYear(appraisalYear)) {
+                    AppraisalResultEnum appraisalResult = AppraisalResultEnum.getByCode(appraisalResultNumber);
+                    if((appraisalResult == AppraisalResultEnum.EXCELLENT || appraisalResult == AppraisalResultEnum.DEEMED_EXCELLENT)) {
+                        isExcellent = true;
+                        personData.appraisalResultId = perfManager.getLong(String.join(".", APPRAISAL_RESULT, FormConstant.ID_KEY));
+                        personData.appraisalResultNumber = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NUMBER_KEY));
+                        personData.appraisalResultName = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NAME_KEY));
+                    }
+                }
+                
+                if(beforeLastYear.getYear() == DateUtil.getYear(appraisalYear)) {
+                    personData.beforeLastResultId = perfManager.getLong(String.join(".", APPRAISAL_RESULT, FormConstant.ID_KEY));
+                    personData.beforeLastResultNumber = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NUMBER_KEY));
+                    personData.beforeLastResultName = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NAME_KEY));
+                }
+            }
+            
+            if(isExcellent) {
+                personDataList.add(personData);
+            }
+        }
+        
+        return personDataList;
+    }
+
+    /**
+     * 获取绩效末等员工
+     * 查询年度绩效考核定格为"不合格"或连续两年定格为"基本合格"的所有员工(距法定退休年龄小于5年(含)的员工除外)
+     * @return:
+     * @author W.Y.C
+     * @date: 2026/01/08 15:47
+     */
+    public void getPerformanceEndEmployees(){
+        DynamicObject org = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(IntJobPostConstant.NCKD_ORG));
+        
+        // 获取满足基本条件的员工
+        Map<Long, DynamicObject> personMap = getBasicEmployeeCondition(org, "C");
+        
+        // 获取考核结果信息
+        Map<Long, List<DynamicObject>> perfManagerMap = getPerformanceEvaluationResults(personMap.keySet());
+        
+        // 处理员工数据,筛选符合条件的绩效末等员工
+        List<PersonData> personDataList = processPerformanceEndEmployeeData(perfManagerMap);
+        
+        // 更新界面显示
+        updateEntryEntity(personDataList);
+    }
+
+    /**
+     * 处理绩效末等员工数据
+     * @param perfManagerMap 绩效考核结果映射
+     * @return 符合条件的员工数据列表
+     */
+    private List<PersonData> processPerformanceEndEmployeeData(Map<Long, List<DynamicObject>> perfManagerMap) {
+        //取出上年度
+        LocalDateTime lastYear = DateUtil.minusYears(DateUtil.now(), 1);
+        LocalDateTime beforeLastYear = DateUtil.minusYears(DateUtil.now(), 2);
+        List<PersonData> personDataList = new ArrayList<>();
+        
+        for (Map.Entry<Long, List<DynamicObject>> perfManagerEntry : perfManagerMap.entrySet()) {
+            Long key = perfManagerEntry.getKey();
+            List<DynamicObject> perfManagerList = perfManagerEntry.getValue();
+            
+            PersonData personData = new PersonData();
+            boolean isUnQualified = false;
+            //连续两年为基本合格
+            int basicallyQualifiedCount = 0;
+            
+            for (DynamicObject perfManager : perfManagerList) {
+                Date appraisalYear = perfManager.getDate(APPRAISAL_YEAR);
+                Long appraisalResultId = perfManager.getLong(String.join(".", APPRAISAL_RESULT, FormConstant.ID_KEY));
+                String appraisalResultNumber = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NUMBER_KEY));
+                String appraisalResultName = perfManager.getString(String.join(".", APPRAISAL_RESULT, FormConstant.NAME_KEY));
+                AppraisalResultEnum appraisalResult = AppraisalResultEnum.getByCode(appraisalResultNumber);
+                Long personId = perfManager.getLong(String.join(".", PERF_MANAGER, FormConstant.NCKD_PERSON, FormConstant.ID_KEY));
+                
+                personData.personId = personId;
+                
+                if(lastYear.getYear() == DateUtil.getYear(appraisalYear)) {
+                    if((appraisalResult == AppraisalResultEnum.UN_QUALIFIED || appraisalResult == AppraisalResultEnum.DEEMED_UNQUALIFIED)
+                            || (appraisalResult == AppraisalResultEnum.BASICALLY_QUALIFIED || appraisalResult == AppraisalResultEnum.DEEMED_BASICALLY_QUALIFIED)) {
+                        if((appraisalResult == AppraisalResultEnum.UN_QUALIFIED || appraisalResult == AppraisalResultEnum.DEEMED_UNQUALIFIED)) {
+                            isUnQualified = true;
+                        } else if(appraisalResult == AppraisalResultEnum.BASICALLY_QUALIFIED || appraisalResult == AppraisalResultEnum.DEEMED_BASICALLY_QUALIFIED) {
+                            basicallyQualifiedCount++;
+                        }
+                        personData.appraisalResultId = appraisalResultId;
+                        personData.appraisalResultNumber = appraisalResultNumber;
+                        personData.appraisalResultName = appraisalResultName;
+                    }
+                }
+                
+                if(beforeLastYear.getYear() == DateUtil.getYear(appraisalYear)) {
+                    if(appraisalResult == AppraisalResultEnum.BASICALLY_QUALIFIED || appraisalResult == AppraisalResultEnum.DEEMED_BASICALLY_QUALIFIED) {
+                        basicallyQualifiedCount++;
+                    }
+                    personData.beforeLastResultId = appraisalResultId;
+                    personData.beforeLastResultNumber = appraisalResultNumber;
+                    personData.beforeLastResultName = appraisalResultName;
+                }
+            }
             
+            if(isUnQualified || basicallyQualifiedCount >= 2) { // 至少2次基本合格
+                personDataList.add(personData);
+            }
         }
+        
+        return personDataList;
+    }
 
+    /**
+     * 更新条目实体
+     * @param personDataList 员工数据列表
+     */
+    private void updateEntryEntity(List<PersonData> personDataList) {
+        if(!personDataList.isEmpty()) {
+            List<Long> personIds = personDataList.stream()
+                    .map(personData -> personData.personId)
+                    .collect(Collectors.toList());
+            Map<Long, DynamicObject> empPosOrgRelMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personIds);
+            DynamicObjectCollection entryEntityColl = this.getModel().getDataEntity(true).getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+            
+            for (PersonData personData : personDataList) {
+                DynamicObject empPosOrgRel = empPosOrgRelMap.get(personData.personId);
+                if(empPosOrgRel != null) {
+                    DynamicObject entry = entryEntityColl.addNew();
+                    entry.set(IntJobPostConstant.NCKD_ISJOG, EnableEnum.NO.getCode());
+                    entry.set(IntJobPostConstant.NCKD_ISENTER, EnableEnum.YES.getCode());
+                    entry.set(FormConstant.NCKD_PERSON, empPosOrgRel.getDynamicObject(FormConstant.EMPLOYEE_KEY));
+                    entry.set(FormConstant.NCKD_DEP, empPosOrgRel.getDynamicObject(FormConstant.ADMINORG));
+                    entry.set(FormConstant.NCKD_POSITION_KEY, empPosOrgRel.getDynamicObject(FormConstant.POSITION_KEY));
+                    
+                    DynamicObject appraisalResult = EntityHelper.newEntity(FormConstant.NCKD_APPRAISALRESULT, personData.appraisalResultId);
+                    appraisalResult.set(FormConstant.NAME_KEY, personData.appraisalResultName);
+                    appraisalResult.set(FormConstant.NUMBER_KEY, personData.appraisalResultNumber);
+                    entry.set(IntJobPostConstant.NCKD_APPRAISALRESULT, appraisalResult);
+
+                    if (personData.beforeLastResultId != null && personData.beforeLastResultId > 0) {
+                        DynamicObject beforeAppraisalResult = EntityHelper.newEntity(FormConstant.NCKD_APPRAISALRESULT, personData.appraisalResultId);
+                        beforeAppraisalResult.set(FormConstant.NAME_KEY, personData.beforeLastResultName);
+                        beforeAppraisalResult.set(FormConstant.NUMBER_KEY, personData.beforeLastResultNumber);
+                        entry.set(IntJobPostConstant.NCKD_BEFORELAST, beforeAppraisalResult);
+                    }
+                }
+            }
+            this.getView().showSuccessNotification("获取成功!");
+            this.getModel().updateEntryCache(entryEntityColl);
+            this.getView().updateView(FormConstant.NCKD_ENTRYENTITY);
+        }else{
+            this.getView().showTipNotification("无符合条件的员工!");
+        }
+    }
+    
+    class PersonData{
+        Long personId;
+        Long appraisalResultId;
+        String appraisalResultNumber;
+        String appraisalResultName;
+        Long beforeLastResultId;
+        String beforeLastResultNumber;
+        String beforeLastResultName;
     }
 }

+ 43 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostAuditedOpPlugin.java

@@ -0,0 +1,43 @@
+package nckd.jxccl.hr.ijp.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+
+/**
+* 内部人力资源市场-三类人员记录生成-审批通过
+* 实体标识:nckd_intjobpost
+* @author W.Y.C
+* @date 2026/1/8 21:34
+* @version 1.0
+*/
+public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            DynamicObjectCollection dynamicObjectCollection = dataEntity.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+        }
+        //1、阶段1:备份原有记录
+        // 条件:单据中要进入市场(CFIsenter=1)的员工 + 他们最新的记录 + 记录来源不是当前单据
+        //目的:为反审批时恢复数据做准备
+
+        //阶段2:关闭原记录
+        //逻辑:一个员工只能有一条活跃记录(FIsSingle=1)
+        //状态变化:1(在市场中) → 4(退出市场)
+
+        //阶段3:创建新记录
+        //新记录状态:FIsSingle=1, CFInsidehrRecordState='1'
+
+        //阶段3:特殊处理
+        //A类员工:有预计退出时间(1年后)
+        //非A类员工:预计退出时间为null
+
+
+
+    }
+}

+ 1 - 1
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/file/PersonPosFileSaveOpPlugin.java

@@ -125,7 +125,7 @@ public class PersonPosFileSaveOpPlugin extends AbstractOperationServicePlugIn im
                         if (!matchParams.isEmpty()) {
                             //获取薪酬项目、薪等、薪档对应金额(入参params的数组下标和出参的数组下标一一对应)
 //                            List<StdTableDataMatchResult> stdTableDataMatchResults = HCDMSalaryStdServiceHelper.matchStdTableData(matchParams);
-                            List<Map<String,Object>> stdTableDataMatchResults = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcHCDMService", "matchStdTableData", matchParams);
+                            List<Map<String,Object>> stdTableDataMatchResults = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "matchStdTableData", matchParams);
                             logger.info("Retrieved {} standard table match results", stdTableDataMatchResults.size());
                             
                             for (int i = 0; i < salaryAdjustmentResultList.size(); i++) {

+ 2 - 2
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/task/PsmsAdjustSalaryTask.java

@@ -18,10 +18,10 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.schedule.executor.AbstractTask;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.DispatchServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.sdk.plugin.Plugin;
-import kd.sdk.swc.hcdm.business.helper.HCDMApplyBillServiceHelper;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.common.enums.psms.AdjustTypeEnum;
 import nckd.jxccl.base.common.enums.psms.TypeStateEnum;
@@ -299,7 +299,7 @@ public class PsmsAdjustSalaryTask extends AbstractTask implements Plugin {
                             papams.put("isUseMatchAmount", Boolean.TRUE);
                             
                             logger.info("准备推送员工 {} 的定调薪申请单", person.getString(FormConstant.NAME_KEY));
-                            Map<String, Object> result = HCDMApplyBillServiceHelper.saveDraftApplyBill(papams);
+                            Map<String, Object> result = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "saveDraftApplyBill", papams);
                             if (!ConvertUtil.toBoolean(result.get("success")) || result.get("data") == null || ConvertUtil.toList(result.get("data")).isEmpty()) {
                                 logger.error("【{}】推送定调薪失败,原因:{}", person.getString(FormConstant.NAME_KEY), JSON.toJSONString(result));
                                 throw new ValidationException("【"+person.getString(FormConstant.NAME_KEY)+"】推送定调薪失败,原因:" + JSON.toJSONString(result));

+ 2 - 2
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/salary/PushAdjustOpPlugin.java

@@ -10,9 +10,9 @@ import kd.bos.entity.plugin.PreparePropertysEventArgs;
 import kd.bos.entity.plugin.args.AfterOperationArgs;
 import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
 import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.servicehelper.DispatchServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.sdk.plugin.Plugin;
-import kd.sdk.swc.hcdm.business.helper.HCDMApplyBillServiceHelper;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.common.exception.ValidationException;
 import nckd.jxccl.base.common.utils.ConvertUtil;
@@ -161,7 +161,7 @@ public class PushAdjustOpPlugin extends AbstractOperationServicePlugIn implement
             if(!applyBillData.isEmpty()) {
                 papams.put("data", applyBillData);
                 papams.put("isUseMatchAmount", Boolean.TRUE);
-                Map<String, Object> result = HCDMApplyBillServiceHelper.saveDraftApplyBill(papams);
+                Map<String, Object> result = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "saveDraftApplyBill", papams);
                 if (!ConvertUtil.toBoolean(result.get("success")) || result.get("data") == null || ConvertUtil.toList(result.get("data")).isEmpty()) {
                     throw new ValidationException("推送定调薪失败,原因:" + JSON.toJSONString(result));
                 }

+ 2 - 2
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/salary/SalaryAdjOpPlugin.java

@@ -250,7 +250,7 @@ public class SalaryAdjOpPlugin extends AbstractOperationServicePlugIn implements
                     adjRecordParams.put("data", dataList);
                     adjRecordParams.put("selprops", "salarystdv.rankentry.rank.id,salarystdv.rankentry.rank.name,salarystdv.rankentry.rank.number,salarystdv.rankentry.rank.index,salarystdv.rankentry.frankindex,company.id,company.name,");
                     //查询定调薪记录
-                    Map<String, Object> lastDecAdjRecordMap = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcHCDMService", "getLastDecAdjRecords", adjRecordParams);
+                    Map<String, Object> lastDecAdjRecordMap = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "getLastDecAdjRecords", adjRecordParams);
                     if (ConvertUtil.toBoolean(lastDecAdjRecordMap.get("success"))) {
                         List<Map> datas = ConvertUtil.toList(lastDecAdjRecordMap.get("data"), ArrayList::new);
                         for (Map data : datas) {
@@ -369,7 +369,7 @@ public class SalaryAdjOpPlugin extends AbstractOperationServicePlugIn implements
                             stdTableDataMatchParam.put("rankId", newSalaryRank.getLong(FormConstant.ID_KEY));
                             matchParams.add(stdTableDataMatchParam);
                             //获取薪酬项目、薪等、薪档对应金额
-                            List<Map<String,Object>> stdTableDataMatchResults = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcHCDMService", "matchStdTableData", matchParams);
+                            List<Map<String,Object>> stdTableDataMatchResults = DispatchServiceHelper.invokeService("nckd.jxccl.swc.hcdm.servicehelper", "hcdm", "ISwcService", "matchStdTableData", matchParams);
                             if (!stdTableDataMatchResults.isEmpty()) {
                                 result.amount = ConvertUtil.toBigDecimal(stdTableDataMatchResults.get(0).get("amount"));
                             }

+ 14 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurCoordExtRegister.java

@@ -0,0 +1,14 @@
+package nckd.jxccl.sit.hcsi.business.coordination.api;
+
+import kd.hr.hbp.business.coordination.api.ext.CoordExtRegister;
+import kd.hr.hbp.business.coordination.model.CoordContext;
+import kd.hr.hbp.business.coordination.model.VerifBillStageEnum;
+
+public class SinsurCoordExtRegister implements CoordExtRegister {
+
+    @Override
+    public void registerHandler(CoordContext context) {
+        CoordExtRegister.super.registerHandler(context);
+        context.addVerifyBillBeforeSaveHandler(VerifBillStageEnum.AFTER_RULE_EXECUTE, new SinsurVerifBillBeforeSaveHandlerEx());
+    }
+}

+ 85 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/sit/hcsi/business/coordination/api/SinsurVerifBillBeforeSaveHandlerEx.java

@@ -0,0 +1,85 @@
+package nckd.jxccl.sit.hcsi.business.coordination.api;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.hr.hbp.business.coordination.api.ext.VerifBillBeforeSaveHandler;
+import kd.hr.hbp.business.coordination.model.CoordContext;
+import kd.hr.hbp.business.coordination.model.VerifBillStageEnum;
+import nckd.jxccl.sit.hcsi.utils.SITCoordinationUtils;
+
+import java.util.Map;
+
+/**
+ * @author: Tyx
+ * @date: 2026/01/08
+ * @description: 社保核定单保存前携带险种基数信息
+ */
+public class SinsurVerifBillBeforeSaveHandlerEx implements VerifBillBeforeSaveHandler {
+
+    private static final Log log = LogFactory.getLog(SinsurVerifBillBeforeSaveHandlerEx.class);
+
+    /**
+     * 社保核定单保存前方法:<p>
+     * 适用单据:核定单类型 = 社保 and 变动大类 = 调动 and 流动类型 = 流入 and 是否拆单 = 否
+     * @param dynamicObjects
+     * @param verifBillStageEnum
+     * @param coordContext
+     * @return
+     */
+    @Override
+    public Map<String, Object> beforeSave(DynamicObject[] dynamicObjects, VerifBillStageEnum verifBillStageEnum, CoordContext coordContext) {
+        // log.info("-------- 核定单 beforeSave 处理条数:" + dynamicObjects.length);
+
+        for (DynamicObject bill : dynamicObjects) {
+            if(checkIsNeedSiBaseInfo(bill)) {
+                dealSiBaseInfo(bill);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 判断当前核定单是否需要处理
+     * @param bill
+     * @return
+     */
+    public boolean checkIsNeedSiBaseInfo (DynamicObject bill) {
+        boolean isNeed = false;
+        boolean isSplit = bill.getBoolean("nckd_issplit");
+
+        // 协作业务对象
+        String objectNumber = bill.getDynamicObject("coordbizobject").getString("number");
+
+        DynamicObject ruleParam = bill.getDynamicObject("coordruleparam");
+        // 获取到变动大类和变动类型
+        String chgNumber = ruleParam.getString("chgevent_z.number");
+        String flowType = ruleParam.getString("flowtype_y");
+        if(objectNumber.equals("hcsi_sinsurfile") && !isSplit && chgNumber.equals("1020_S") && flowType.equals("1")) {
+            return true;
+        }
+        return isNeed;
+    }
+
+    /**
+     * 根据员工查询所有社保基数设置,并赋值到单据体中
+     * @param bill
+     */
+    public void dealSiBaseInfo (DynamicObject bill) {
+        DynamicObject ruleParam = bill.getDynamicObject("coordruleparam");
+        DynamicObject employee = ruleParam.getDynamicObject("employee");
+        DynamicObject[] sibaseCols = SITCoordinationUtils.getSiBaseByEmployeeId(employee.getLong("id"));
+        if(sibaseCols.length == 0)
+            return;
+        Map<String, String> fieldsMappingMap = SITCoordinationUtils.getFieldsMappingMap();
+        DynamicObjectCollection entryCols = bill.getDynamicObjectCollection("nckd_entryentity");
+        for(DynamicObject sibase : sibaseCols) {
+            DynamicObject entry = entryCols.addNew();
+            for (String key : fieldsMappingMap.keySet()) {
+                entry.set(fieldsMappingMap.get(key), sibase.get(key));
+            }
+        }
+    }
+
+}

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

@@ -179,6 +179,15 @@ public class HCSIEmpCoordVerifBillEditEx extends AbstractFormPlugin implements P
             QFilter filter = new QFilter("id", QCP.in, getDimensionValueForFilter(sinSurStd, welfareType));
             e.getCustomQFilters().add(filter);
         }
+        // 过滤参保标准
+        else if (HRStringUtils.equals(fieldKey, "sinsurstd_r31")) {
+            DynamicObject welfArePayer = (DynamicObject) model.getValue("welfarepayer_r31");
+            if(ObjectUtils.isEmpty(welfArePayer)) {
+                this.getView().showTipNotification("请先选择“实际参保单位”");
+                e.setCancel(true);
+                return;
+            }
+        }
     }
 
     public List<Long> getDimensionValueForFilter (DynamicObject sinSurStd, DynamicObject welfaretype) {

+ 8 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/mservice/SwcHCDMService.java → code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/mservice/SwcService.java

@@ -3,10 +3,11 @@ package nckd.jxccl.swc.hcdm.mservice;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import kd.sdk.swc.hcdm.business.helper.HCDMAdjFileServiceHelper;
+import kd.sdk.swc.hcdm.business.helper.HCDMApplyBillServiceHelper;
 import kd.sdk.swc.hcdm.business.helper.HCDMSalaryStdServiceHelper;
 import kd.sdk.swc.hcdm.common.dto.stdtab.match.StdTableDataMatchParam;
 import kd.sdk.swc.hcdm.common.dto.stdtab.match.StdTableDataMatchResult;
-import nckd.jxccl.swc.hcdm.mservice.api.ISwcHCDMService;
+import nckd.jxccl.swc.hcdm.mservice.api.ISwcService;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -20,7 +21,7 @@ import java.util.stream.Collectors;
  * @date 2026/1/7 21:37
  * @version 1.0
  */
-public class SwcHCDMService implements ISwcHCDMService {
+public class SwcService implements ISwcService {
     @Override
     public Map<String, Object> getLastDecAdjRecords(Map<String, Object> param) {
         return HCDMAdjFileServiceHelper.getLastDecAdjRecords(param);
@@ -38,4 +39,9 @@ public class SwcHCDMService implements ISwcHCDMService {
                 .map(r -> (Map<String, Object>) JSON.toJSON(r)) // 返回 JSONObject,兼容 Map
                 .collect(Collectors.toList());
     }
+
+    @Override
+    public Map<String, Object> saveDraftApplyBill(Map<String, Object> param) {
+        return HCDMApplyBillServiceHelper.saveDraftApplyBill(param);
+    }
 }

+ 10 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/mservice/api/ISwcHCDMService.java → code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/mservice/api/ISwcService.java

@@ -9,7 +9,7 @@ import java.util.Map;
 * @date 2026/1/7 21:37
 * @version 1.0
 */
-public interface ISwcHCDMService {
+public interface ISwcService {
 
     /**
      * 获取上一次定调薪信息
@@ -28,4 +28,13 @@ public interface ISwcHCDMService {
      * @date: 2026/01/07 22:12
      */
     List<Map<String,Object>> matchStdTableData(List<Map<String,Object>> params);
+
+    /**
+     * 保存草稿状态的定调薪申请单
+     * @param param
+     * @return: java.util.Map<java.lang.String, java.lang.Object>
+     * @author W.Y.C
+     * @date: 2026/01/08 21:58
+     */
+    Map<String, Object> saveDraftApplyBill(Map<String, Object> param);
 }

+ 1 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/servicehelper/ServiceFactory.java

@@ -16,7 +16,7 @@ public class ServiceFactory {
 
     private static final Map<String, String> SERVICE_MAP = new HashMap<String, String>() {
         {
-            this.put("ISwcHCDMService", "nckd.jxccl.swc.hcdm.mservice.SwcHCDMService");
+            this.put("ISwcService", "nckd.jxccl.swc.hcdm.mservice.SwcService");
         }
     };
 

+ 26 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcss/formplugin/IncomeProofBillExPlugin.java

@@ -4,9 +4,11 @@ import kd.bos.algo.DataSet;
 import kd.bos.bill.AbstractBillPlugIn;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.StringUtils;
 import kd.bos.db.DB;
 import kd.bos.db.DBRoute;
 import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.entity.param.CustomParam;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.operate.FormOperate;
@@ -37,7 +39,9 @@ public class IncomeProofBillExPlugin extends AbstractBillPlugIn {
     private static String IncomeProofBill_SalaryItems;
     private static final Log logger = LogFactory.getLog(IncomeProofBillExPlugin.class);
 
-    public void initialize() {
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
 
         CustomParam customParam = new CustomParam();
         customParam.getSearchKeySet().add("INCOMEPROOFBILL_CUSTOMITEMS");
@@ -46,9 +50,9 @@ public class IncomeProofBillExPlugin extends AbstractBillPlugIn {
         IncomeProofBill_CustomItems  = cusTomMap.get("INCOMEPROOFBILL_CUSTOMITEMS");
         IncomeProofBill_SalaryItems  = cusTomMap.get("INCOMEPROOFBILL_SALARYITEMS");
 
+        this.getView().setEnable(Boolean.FALSE, "nckd_daterange");
     }
 
-
     @Override
     public void beforeDoOperation(BeforeDoOperationEventArgs args) {
 
@@ -85,6 +89,26 @@ public class IncomeProofBillExPlugin extends AbstractBillPlugIn {
         }
     }
 
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        String fieldKey = e.getProperty().getName();
+
+        if(StringUtils.equals(this.getPageCache().get("noChange"), "true")){
+            return;
+        }
+
+        if (StringUtils.equals("nckd_startdate", fieldKey) || StringUtils.equals("nckd_enddate", fieldKey)){
+            IDataModel model = this.getModel();
+            int rowCount = model.getEntryRowCount("entryentity");
+            this.getPageCache().put("noChange", "true");
+            for(int i = 0; i < rowCount; i++) {
+                model.setValue("checkvalue", BigDecimal.ZERO.toString(), i);
+            }
+            this.getPageCache().put("noChange", "false");
+        }
+    }
+
     /**
      * 根据薪员工 +日期范围获取薪资明细
      * @return  DynamicObjectCollection