Просмотр исходного кода

Merge branch 'refs/heads/feat-swc-mas_1.0'

wyc 1 день назад
Родитель
Сommit
edf50d4416
15 измененных файлов с 760 добавлено и 70 удалено
  1. 2 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
  2. 0 31
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/enums/ProjectCategoryEnum.java
  3. 40 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/enums/mas/ProjectCategoryEnum.java
  4. 4 2
      code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/salary/PushAdjustOpPlugin.java
  5. 22 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/common/MasConstant.java
  6. 163 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/assessmentmgm/EntldrMgrPerfAssmtFormPlugin.java
  7. 142 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/assessmentmgm/EntldrMgrTermAssmtFormPlugin.java
  8. 5 8
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/SubCoHeadServiceListPlugin.java
  9. 8 7
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/TenurePersonListListPlugin.java
  10. 0 3
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/EntldrMidlongApprFormPlugin.java
  11. 1 5
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/EntldrTermBonusApprFormPlugin.java
  12. 187 3
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/EntleaderAnlSalStdFormPlugin.java
  13. 156 4
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/SubcorpChiefSalStdFormPlugin.java
  14. 0 7
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/empmgt/TenurePersonListOpPlugin.java
  15. 30 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/empmgt/base/DeferPayRatioConfValidator.java

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

@@ -76,6 +76,8 @@ public class FormConstant {
     public static final String NCKD_HBSS_LEGPOSTLV = "nckd_hbss_legpostlv";
     /** 岗位管理层级 */
     public static final String NCKD_HPFS_POSTLEVEL = "nckd_hpfs_postlevel";
+    /** 任期 */
+    public static final String NCKD_HPFS_TERM = "nckd_hpfs_term";
 
     //====================================== 标品op ======================================
     /** 确认框确认按钮 */

+ 0 - 31
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/enums/ProjectCategoryEnum.java

@@ -1,31 +0,0 @@
-package nckd.jxccl.base.common.enums;
-
-/**
-* 【薪酬福利云】-项目分类枚举
-* @author W.Y.C
-* @date 2025/7/14 14:25
-* @version 1.0
-*/
-public enum ProjectCategoryEnum {
-
-    BASIC_YEARLY("01", "基本年薪"),
-    PERFORMANCE_YEARLY("02", "绩效年薪"),
-    ITEM_AWARD("03", "单项奖"),
-    TERM_INCENTIVE("04", "任期激励"),
-    LONGTERM_INCENTIVE("05", "中长期激励");
-    private final String code;
-    private final String name;
-
-    ProjectCategoryEnum(String code, String name) {
-        this.code = code;
-        this.name = name;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public String getName() {
-        return name;
-    }
-}

+ 40 - 0
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/enums/mas/ProjectCategoryEnum.java

@@ -0,0 +1,40 @@
+package nckd.jxccl.base.common.enums.mas;
+
+/**
+* 【薪酬福利云】-一级项目分类枚举
+* @author W.Y.C
+* @date 2025/7/14 14:25
+* @version 1.0
+*/
+public enum ProjectCategoryEnum {
+
+    /*年度薪酬**/
+    YEARLY_SALARY("01", "年度薪酬"),
+    /*任期激励**/
+    TERM_INCENTIVE("02", "任期激励"),
+    /*中长期激励**/
+    LONGTERM_INCENTIVE("03", "中长期激励"),
+
+    /*基本年薪**/
+    BASIC_YEARLY_SALARY("01", "基本年薪"),
+    /*绩效年薪**/
+    PERFORMANCE_YEARLY_SALARY("02", "绩效年薪"),
+    /*单项奖**/
+    ITEM_AWARD("03", "单项奖");
+
+    private final String code;
+    private final String name;
+
+    ProjectCategoryEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

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

@@ -144,14 +144,16 @@ public class PushAdjustOpPlugin extends AbstractOperationServicePlugIn implement
                 applyBillEntry.put("amount", pushAdjust.getBigDecimal(SalAdjTrackerConstant.NCKD_MONEY));
 //            applyBillEntry.put("nckd_postgrade", salaryfile.getLong("position.nckd_postgrade.id"));  //岗级
                 applyBillEntry.put("position", positionId);
-                applyBillEntry.put("salarygrade", pushAdjust.getDynamicObject(SalAdjTrackerConstant.NCKD_SALARYGRADE));
-                applyBillEntry.put("salaryrank", pushAdjust.getDynamicObject(SalAdjTrackerConstant.NCKD_SALARYRANK));
+
+                applyBillEntry.put("salarygrade", pushAdjust.getLong(String.join(".",SalAdjTrackerConstant.NCKD_SALARYGRADE,FormConstant.ID_KEY)));
+                applyBillEntry.put("salaryrank", pushAdjust.getLong(String.join(".",SalAdjTrackerConstant.NCKD_SALARYRANK,FormConstant.ID_KEY)));
                 applyBillEntry.put("reason", pushAdjust.getString(SalAdjTrackerConstant.NCKD_WAGEEXPLAIN));
                 applyBillEntryData.add(applyBillEntry);
                 applyBill.put("applybillent", applyBillEntryData);
                 applyBillData.add(applyBill);
             }
             papams.put("data", applyBillData);
+            papams.put("isUseMatchAmount", Boolean.TRUE);
             Map<String, Object> result = HCDMApplyBillServiceHelper.saveDraftApplyBill(papams);
             if (!ConvertUtil.toBoolean(result.get("success"))) {
                 throw new ValidationException("推送定调薪失败,原因:" + result.get("message").toString());

+ 22 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/common/MasConstant.java

@@ -150,6 +150,10 @@ public class MasConstant extends FormConstant {
     /** 支付金额10 */    public static final String NCKD_PAYAMOUNT10 = "nckd_payamount10";
     /** 子企业负责人薪酬结构(分录) */
     public static final String NCKD_SUBCORPSALARYENTRY = "nckd_subcorpsalaryentry";
+    /** 核定标准 */
+    public static final String NCKD_APPRSTD = "nckd_apprstd";
+    /** 延期支付总金额 */
+    public static final String NCKD_DEFERPAYTOTALAMT = "nckd_deferpaytotalamt";
     /*-------------------------------------- 子企业负责人薪酬结构常量类 begin --------------------------------------*/
 
 
@@ -166,4 +170,22 @@ public class MasConstant extends FormConstant {
     /*-------------------------------------- 任期人员名单 end --------------------------------------*/
 
 
+    /*-------------------------------------- 延期支付比例 begin --------------------------------------*/
+    /** 延期支付比例-实体标识 */
+    public static final String DEFERPAYRATOCONF_ENTITYID = "nckd_deferpayratioconf";
+    /** 兑现比例 */
+    public static final String NCKD_PAYOUTRATIO = "nckd_payoutratio";
+    /** 兑现金额 */
+    public static final String NCKD_PAYOUTMONEY = "nckd_payoutmoney";
+    /** 兑现年份 */
+    public static final String NCKD_TIMES = "nckd_times";
+    /** 延期支付比例 */
+    public static final String NCKD_DEFERPAYRATIO = "nckd_deferpayratio";
+    /** 延期支付金额 */
+    public static final String NCKD_DEFERPAYMONEY = "nckd_deferpaymoney";
+    /** 支付总年数 */
+    public static final String NCKD_PAYOUTTIMES = "nckd_payouttimes";
+    /*-------------------------------------- 延期支付比例 end --------------------------------------*/
+
+
 }

+ 163 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/assessmentmgm/EntldrMgrPerfAssmtFormPlugin.java

@@ -0,0 +1,163 @@
+package nckd.jxccl.swc.mas.plugin.form.assessmentmgm;
+
+import kd.bos.common.enums.EnableEnum;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.constant.StatusEnum;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.utils.ConvertUtil;
+import nckd.jxccl.base.common.utils.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.swc.mas.common.MasConstant;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+* 企业负责人经理层业绩考核-表单插件
+* 实体标识:nckd_entldrmgrperfassmt
+* @author W.Y.C
+* @date 2025/12/2 18:31
+* @version 1.0
+*/
+public class EntldrMgrPerfAssmtFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        int rowIndex = changeSet[0].getRowIndex();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if(Stream.of(MasConstant.NCKD_PAYUNIT, MasConstant.NCKD_LAWENTITY, MasConstant.NCKD_YEAR)
+                .anyMatch(op -> op.equalsIgnoreCase(fieldKey))){
+            if(!Objects.equals(oldValue, newValue)){
+                DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
+                load();
+            }
+        }
+    }
+
+    private void load(){
+
+        DynamicObject payUnit = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_PAYUNIT));
+        DynamicObject lawEntity =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_LAWENTITY));
+        Date year = ConvertUtil.toDate(this.getModel().getValue(MasConstant.NCKD_YEAR));
+        if(payUnit != null && lawEntity != null && year != null){
+
+            LocalDateTime localDateTime = DateUtil.toLocalDateTime(year);
+            LocalDateTime beginOfYear = DateUtil.beginOfYear(localDateTime);
+            LocalDateTime endOfYear = DateUtil.endOfYear(localDateTime);
+
+            QFilter filter = new QFilter(MasConstant.NCKD_PAYUNIT, QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_LAWENTITY, QCP.equals, lawEntity.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                    .and(MasConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                    .and(FormConstant.STATUS, QCP.in, new String[]{StatusEnum.C.toString(), StatusEnum.B.toString()});
+
+            //====================================== 获取子企业负责人任职情况 begin ======================================
+            QueryFieldBuilder subCoHeadServiceQueryFieldBuilder = QueryFieldBuilder.create()
+                    .add(MasConstant.NCKD_EMPLOYEE)
+                    .add(MasConstant.NCKD_POSNAME)
+                    .add(MasConstant.NCKD_SERVICEMONTHS)
+                    .add(MasConstant.NCKD_ISDIRCADRE)
+                    .add(MasConstant.NCKD_ISPROFMAN)
+                    .add(MasConstant.NCKD_ISMANAGER)
+                    .add(MasConstant.NCKD_POSTLEVEL)
+                    .add(MasConstant.NCKD_SALNEGOT)
+                    .add(MasConstant.NCKD_SALCALCPOST)
+                    .add(MasConstant.NCKD_YEAR)
+                    .add(MasConstant.NCKD_STARTDATE)
+                    .add(MasConstant.NCKD_ENDDATE);
+            DynamicObject[] dbSubCoHeadServiceArray = BusinessDataServiceHelper.load(MasConstant.SUBCOHEADSERVICE_ENTITYID, subCoHeadServiceQueryFieldBuilder.buildSelect(), new QFilter[]{filter});
+            if(dbSubCoHeadServiceArray == null || dbSubCoHeadServiceArray.length == 0){
+                this.getView().showTipNotification("未加载到数据,根据【所属二级单位】、【法人组织】及【年度】未加载到对应“子企业负责人任职情况”数据!");
+            }
+            DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
+            entryEntities.clear();
+            if(dbSubCoHeadServiceArray != null && dbSubCoHeadServiceArray.length > 0) {
+                // 获取所有人员ID
+                List<Long> employeeIds = Arrays.stream(dbSubCoHeadServiceArray)
+                        .map(obj -> obj.getDynamicObject(MasConstant.NCKD_EMPLOYEE).getLong(FormConstant.ID_KEY))
+                        .collect(Collectors.toList());
+                //====================================== 获取子企业负责人任职情况 end ======================================
+
+                //查询企业负责人信息
+                QueryFieldBuilder entHeadFieldBuilder = QueryFieldBuilder.create()
+                        .add(MasConstant.ID_KEY)
+                        .add(MasConstant.STARTDATE)
+                        .add(MasConstant.ENDDATE)
+                        .addIdNumberName(MasConstant.NCKD_TERM)
+                        .addIdNumberName(MasConstant.EMPLOYEE_KEY)
+                        .orderDesc(MasConstant.STARTDATE, MasConstant.ENDDATE);
+                //用于判断该批人员是否为:实行任期制和契约化管理
+                QFilter allEntHeadFilter = new QFilter(FormConstant.EMPLOYEE_KEY, QCP.in, employeeIds)
+                        //是否实行任期制和契约化管理
+                        .and(MasConstant.NCKD_TERMCONT, QCP.equals, EnableEnum.YES.getCode());
+                //查询出人员所有的企业负责人信息
+                DynamicObjectCollection allEntHeadQuery = QueryServiceHelper.query(FormConstant.NCKD_HRPI_ENTHEAD, entHeadFieldBuilder.buildSelect(), new QFilter[]{allEntHeadFilter});
+                Map<Long, List<DynamicObject>> groupedEntHeadQuery = allEntHeadQuery.stream()
+                        .collect(Collectors.groupingBy(
+                                obj -> obj.getLong(String.join(".", MasConstant.EMPLOYEE_KEY, FormConstant.ID_KEY))
+                        ));
+
+
+                if (dbSubCoHeadServiceArray != null && dbSubCoHeadServiceArray.length > 0) {
+                    for (DynamicObject dbSubCorpSalary : dbSubCoHeadServiceArray) {
+                        DynamicObject employee = dbSubCorpSalary.getDynamicObject(MasConstant.NCKD_EMPLOYEE);
+                        List<DynamicObject> entHead = groupedEntHeadQuery.get(employee.getLong(FormConstant.ID_KEY));
+                        // 根据 STARTDATE 和 ENDDATE 查找在 NCKD_STARTDATE 和 NCKD_ENDDATE 范围内的数据,取最新一条
+                        Date dbYear = dbSubCorpSalary.getDate(MasConstant.NCKD_YEAR);
+                        // 筛选出在dbYear范围内的记录,然后取STARTDATE最新的那一条
+                        Optional<DynamicObject> latestEntHead = Optional.empty();
+                        if (entHead != null && !entHead.isEmpty()) {
+                            LocalDateTime dbYearBegin = DateUtil.beginOfYear(DateUtil.toLocalDateTime(dbYear));
+                            LocalDateTime dbYearEnd = DateUtil.endOfYear(DateUtil.toLocalDateTime(dbYear));
+
+                            latestEntHead = entHead.stream()
+                                    .filter(record -> {
+                                        Date startDate = record.getDate(MasConstant.STARTDATE);
+                                        Date endDate = record.getDate(MasConstant.ENDDATE);
+                                        // 判断记录是否在当年范围内
+                                        return startDate != null && !startDate.after(DateUtil.toDate(dbYearEnd)) &&
+                                                (endDate == null || !endDate.before(DateUtil.toDate(dbYearBegin)));
+                                    })
+                                    .max(Comparator.comparing(record -> record.getDate(MasConstant.STARTDATE),
+                                            Comparator.nullsFirst(Comparator.naturalOrder())));
+                        }
+                        if (latestEntHead.isPresent()) {
+                            DynamicObject entry = entryEntities.addNew();
+                            entry.set(MasConstant.NCKD_EMPLOYEE, dbSubCorpSalary.get(MasConstant.NCKD_EMPLOYEE));
+                            entry.set(MasConstant.NCKD_POSNAME, dbSubCorpSalary.get(MasConstant.NCKD_POSNAME));
+                            entry.set(MasConstant.NCKD_STARTDATE, dbSubCorpSalary.get(MasConstant.NCKD_STARTDATE));
+                            entry.set(MasConstant.NCKD_ENDDATE, dbSubCorpSalary.get(MasConstant.NCKD_ENDDATE));
+                        }
+
+                    }
+                    this.getView().showSuccessNotification("数据加载成功!");
+                } else {
+                    this.getView().showTipNotification("未加载到数据,根据【所属二级单位】、【法人组织】及【任期区间】未加载到对应“子企业负责人薪酬结构”数据!");
+                }
+            }
+            getModel().updateEntryCache(entryEntities);
+            getView().updateView(FormConstant.NCKD_ENTRYENTITY);
+
+        }
+    }
+}

+ 142 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/assessmentmgm/EntldrMgrTermAssmtFormPlugin.java

@@ -0,0 +1,142 @@
+package nckd.jxccl.swc.mas.plugin.form.assessmentmgm;
+
+import kd.bos.common.enums.EnableEnum;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.constant.StatusEnum;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.utils.ConvertUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.swc.mas.common.MasConstant;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+* 企业负责人经理层任期考核-表单插件
+* 实体标识:nckd_entldrmgrtermassmt
+* @author W.Y.C
+* @date 2025/12/2 19:49
+* @version 1.0
+*/
+public class EntldrMgrTermAssmtFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        int rowIndex = changeSet[0].getRowIndex();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if(Stream.of(MasConstant.NCKD_PAYUNIT, MasConstant.NCKD_LAWENTITY, MasConstant.NCKD_TERM)
+                .anyMatch(op -> op.equalsIgnoreCase(fieldKey))){
+            if(!Objects.equals(oldValue, newValue)){
+                DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
+                load();
+            }
+        }
+    }
+
+
+    private void load(){
+        DynamicObject payUnit = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_PAYUNIT));
+        DynamicObject lawEntity =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_LAWENTITY));
+        DynamicObject term =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_TERM));
+        if(payUnit != null && lawEntity != null && term != null){
+            //====================================== 获取任期人员名单 begin ======================================
+            QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                    .addIdNumberName(MasConstant.NCKD_PAYUNIT)
+                    .addIdNumberName(MasConstant.NCKD_LAWENTITY)
+                    .addIdNumberName(MasConstant.NCKD_TERM)
+                    .addIdNumberName(MasConstant.NCKD_EMPLOYEE)
+                    .add(FormConstant.NCKD_STARTDATE)
+                    .add(FormConstant.NCKD_ENDDATE)
+                    .add(MasConstant.NCKD_POSNAME)
+                    .add(MasConstant.NCKD_SERVICEMONTHS);
+
+            QFilter qFilter = new QFilter(MasConstant.NCKD_PAYUNIT, QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_LAWENTITY, QCP.equals, lawEntity.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_TERM, QCP.equals, term.getLong(FormConstant.ID_KEY))
+                    .and(FormConstant.STATUS, QCP.in, new String[]{StatusEnum.C.toString(), StatusEnum.B.toString()});
+            DynamicObject[] dbSubCorpSalaryArray = BusinessDataServiceHelper.load(MasConstant.TENUREPERSONLIST_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter});
+            // 获取所有人员ID
+            List<Long> employeeIds = Arrays.stream(dbSubCorpSalaryArray)
+                    .map(obj -> obj.getDynamicObject(MasConstant.NCKD_EMPLOYEE).getLong(FormConstant.ID_KEY))
+                    .collect(Collectors.toList());
+            //====================================== 获取任期人员名单 end ======================================
+
+            //====================================== 查询企业负责人信息 begin ======================================
+            //查询企业负责人信息
+            QueryFieldBuilder entHeadFieldBuilder = QueryFieldBuilder.create()
+                    .add(MasConstant.ID_KEY)
+                    .add(MasConstant.NCKD_TERM)
+                    .add(MasConstant.STARTDATE)
+                    .add(MasConstant.ENDDATE)
+                    .addIdNumberName(MasConstant.NCKD_TERM)
+                    .addIdNumberName(MasConstant.EMPLOYEE_KEY)
+                    .orderDesc(MasConstant.STARTDATE, MasConstant.ENDDATE);
+            //用于判断该批人员是否为:实行任期制和契约化管理
+            QFilter allEntHeadFilter = new QFilter(FormConstant.EMPLOYEE_KEY, QCP.in, employeeIds)
+                    //是否实行任期制和契约化管理
+                    .and(MasConstant.NCKD_TERMCONT, QCP.equals, EnableEnum.YES.getCode());
+            //查询出人员所有的企业负责人信息
+            DynamicObjectCollection allEntHeadQuery = QueryServiceHelper.query(FormConstant.NCKD_HRPI_ENTHEAD, entHeadFieldBuilder.buildSelect(), new QFilter[]{allEntHeadFilter});
+            Map<Long, List<DynamicObject>> groupedEntHeadQuery = allEntHeadQuery.stream()
+                    .collect(Collectors.groupingBy(
+                            obj -> obj.getLong(String.join(".", MasConstant.EMPLOYEE_KEY, FormConstant.ID_KEY))
+                    ));
+            //====================================== 查询企业负责人信息 end ======================================
+
+
+            DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
+            entryEntities.clear();
+            if(dbSubCorpSalaryArray != null && dbSubCorpSalaryArray.length > 0) {
+                for (DynamicObject dbSubCorpSalary : dbSubCorpSalaryArray) {
+                    long dbSubCorpSalaryTermId = dbSubCorpSalary.getLong(String.join(".", MasConstant.NCKD_TERM, MasConstant.ID_KEY));
+                    DynamicObject employee = dbSubCorpSalary.getDynamicObject(MasConstant.NCKD_EMPLOYEE);
+                    List<DynamicObject> entHead = groupedEntHeadQuery.get(employee.getLong(FormConstant.ID_KEY));
+                    Optional<DynamicObject> latestEntHead = Optional.empty();
+                    if (entHead != null && !entHead.isEmpty()) {
+
+                        latestEntHead = entHead.stream()
+                                .filter(record -> {
+                                    long termId = record.getLong(String.join(".", MasConstant.NCKD_TERM, MasConstant.ID_KEY));
+                                    // 判断记录是否在当年范围内
+                                    return termId == dbSubCorpSalaryTermId;
+                                })
+                                .max(Comparator.comparing(record -> record.getDate(MasConstant.STARTDATE),
+                                        Comparator.nullsFirst(Comparator.naturalOrder())));
+                    }
+                    if (latestEntHead.isPresent()) {
+                        DynamicObject entry = entryEntities.addNew();
+                        entry.set(MasConstant.NCKD_EMPLOYEE, dbSubCorpSalary.get(MasConstant.NCKD_EMPLOYEE));
+                        entry.set(MasConstant.NCKD_POSNAME, dbSubCorpSalary.get(MasConstant.NCKD_POSNAME));
+                        entry.set(MasConstant.NCKD_STARTDATE, dbSubCorpSalary.get(MasConstant.NCKD_STARTDATE));
+                        entry.set(MasConstant.NCKD_ENDDATE, dbSubCorpSalary.get(MasConstant.NCKD_ENDDATE));
+                    }
+                }
+                this.getView().showSuccessNotification("数据加载成功!");
+            }else{
+                this.getView().showTipNotification("未加载到数据,根据【所属二级单位】、【法人组织】及【任期区间】未加载到对应“任期人员名单”数据!");
+            }
+
+            getModel().updateEntryCache(entryEntities);
+            getView().updateView(FormConstant.NCKD_ENTRYENTITY);
+
+        }
+    }
+}

+ 5 - 8
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/SubCoHeadServiceListPlugin.java

@@ -6,8 +6,6 @@ import kd.bos.context.RequestContext;
 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.MainEntityType;
 import kd.bos.entity.constant.StatusEnum;
 import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.form.CloseCallBack;
@@ -23,7 +21,6 @@ import kd.bos.mvc.SessionManager;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.QueryServiceHelper;
-import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.hr.hbp.common.model.AuthorizedOrgResultWithSub;
 import kd.sdk.hr.hbp.business.helper.permission.HRPermissionServiceHelper;
@@ -161,7 +158,7 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
         QueryFieldBuilder partyPoshFieldBuilder = QueryFieldBuilder.create()
                 .add(MasConstant.STARTDATE)
                 .add(MasConstant.ENDDATE)
-                .add(MasConstant.NCKD_PAYUNIT)
+                .addIdNumberName(MasConstant.NCKD_PAYUNIT)
                 //变动时间
                 .add(MasConstant.NCKD_CHANGETIME)
                 .add(MasConstant.NCKD_POSNAME)
@@ -177,7 +174,7 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
                 .orderDesc(MasConstant.STARTDATE, MasConstant.ENDDATE);
         QFilter allPartyPoshFilter = new QFilter(MasConstant.EMPLOYEE_KEY, QCP.not_in, employeeIds);
         if(!payUnitIdList.isEmpty()){
-            allPartyPoshFilter.and(String.join(MasConstant.NCKD_PAYUNIT,FormConstant.ID_KEY), QCP.in, payUnitIdList);
+            allPartyPoshFilter.and(String.join(".",MasConstant.NCKD_PAYUNIT,FormConstant.ID_KEY), QCP.in, payUnitIdList);
         }
         DynamicObjectCollection allPartyPoshQuery = QueryServiceHelper.query(FormConstant.NCKD_HRPI_PARTYPOSH, partyPoshFieldBuilder.buildSelect(), new QFilter[]{allPartyPoshFilter});
         //按员工ID分组
@@ -318,13 +315,15 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
                 ))));
 
 
+        /*//获取组织
         List<Long> createOrgList = BaseDataServiceHelper.getCreateOrgList(MasConstant.SUBCOHEADSERVICE_ENTITYID);
         MainEntityType bosOrgEntityType = EntityMetadataCache.getDataEntityType(FormConstant.BOS_ORG);
         DynamicObject org = new DynamicObject(bosOrgEntityType);
         if (!createOrgList.isEmpty()) {
             org.set(FormConstant.ID_KEY, createOrgList.get(0));
         }
-        String ctrlStrategy = BaseDataServiceHelper.getBdCtrlStrgy(MasConstant.SUBCOHEADSERVICE_ENTITYID,org.getLong(FormConstant.ID_KEY)+"");
+        //获取控制策略
+        String ctrlStrategy = BaseDataServiceHelper.getBdCtrlStrgy(MasConstant.SUBCOHEADSERVICE_ENTITYID,org.getLong(FormConstant.ID_KEY)+"");*/
         //构建子企业负责人任职情况实体
         List<DynamicObject> saveSubCoHeadServiceList = new ArrayList<>();
         for (Map.Entry<Long, DynamicObject> entHeadRecordEntry : entHeadRecordMap.entrySet()) {
@@ -333,8 +332,6 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
             //党政履历
             DynamicObject partyPosh = latestPartyPoshRecordMap.get(entHeadRecordEntry.getKey());
             DynamicObject newSubCoHeadService = EntityHelper.newEntity(MasConstant.SUBCOHEADSERVICE_ENTITYID);
-            newSubCoHeadService.set(FormConstant.CREATEORG_KEY,org);
-            newSubCoHeadService.set(FormConstant.CTRLSTRATEGY_KEY,ctrlStrategy);
             newSubCoHeadService.set(MasConstant.NCKD_YEAR,DateUtil.toDate(beginYear));
             newSubCoHeadService.set(MasConstant.NCKD_EMPLOYEE,entHeadRecordEntry.getKey());
             newSubCoHeadService.set(MasConstant.STATUS, StatusEnum.B.toString());

+ 8 - 7
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/TenurePersonListListPlugin.java

@@ -132,8 +132,8 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
                 .add(MasConstant.NCKD_APPRDOCNO)
                 .add(MasConstant.NCKD_ISDIRCADRE)
                 .addIdNumberName(MasConstant.NCKD_ORGPOSGRD)
-                .add(MasConstant.EMPLOYEE_KEY)
-                .addIdNumberName(MasConstant.NCKD_ORG)
+                .addIdNumberName(MasConstant.EMPLOYEE_KEY)
+                .addIdNumberName(MasConstant.NCKD_PAYUNIT)
                 .orderDesc(MasConstant.STARTDATE, MasConstant.ENDDATE);
         QFilter allPartyPoshFilter = new QFilter(MasConstant.EMPLOYEE_KEY, QCP.not_in, employeeIds);
         //TODO 法人岗位层级为高管;
@@ -191,8 +191,8 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
                 .add(MasConstant.ID_KEY)
                 .add(MasConstant.STARTDATE)
                 .add(MasConstant.ENDDATE)
-                .add(MasConstant.NCKD_TERM)
-                .add(MasConstant.EMPLOYEE_KEY)
+                .addIdNumberName(MasConstant.NCKD_TERM)
+                .addIdNumberName(MasConstant.EMPLOYEE_KEY)
                 .orderDesc(MasConstant.STARTDATE, MasConstant.ENDDATE);
 
         //查询下一段的企业负责人信息;用于后续逻辑查找下一段的负责人信息
@@ -274,7 +274,6 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
             //党政履历
             DynamicObject partyPosh = latestPartyPoshRecordMap.get(entHeadRecordEntry.getKey());
             DynamicObject newSubCoHeadService = EntityHelper.newEntity(MasConstant.TENUREPERSONLIST_ENTITYID);
-            newSubCoHeadService.set(MasConstant.NCKD_EMPLOYEE,entHeadRecordEntry.getKey());
             newSubCoHeadService.set(MasConstant.STATUS, StatusEnum.B.toString());
             newSubCoHeadService.set(MasConstant.ENABLE, EnableEnum.YES.getCode());
 
@@ -288,7 +287,7 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
                     employee.set(FormConstant.NAME_KEY, partyPosh.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.NAME_KEY)));
                 }
                 //所属二级单位(发薪单位)
-                long payOrgId = partyPosh.getLong(String.join(".", FormConstant.NCKD_ORG, FormConstant.ID_KEY));
+                long payOrgId = partyPosh.getLong(String.join(".", MasConstant.NCKD_PAYUNIT, FormConstant.ID_KEY));
                 DynamicObject payOrg = EntityHelper.newEntity(FormConstant.ADMINORGHR_ENTITYID, payOrgId);
                 newSubCoHeadService.set(MasConstant.NCKD_PAYUNIT, payOrg);
                 //职务
@@ -332,7 +331,9 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
                     employee.set(FormConstant.NAME_KEY, entHead.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.NAME_KEY)));
                 }
                 //任期区间
-                newSubCoHeadService.set(MasConstant.NCKD_TERM,entHead.get(MasConstant.NCKD_TERM));
+                long termId = entHead.getLong(String.join(".", MasConstant.NCKD_TERM, FormConstant.ID_KEY));
+                DynamicObject dbTerm = EntityHelper.newEntity(MasConstant.NCKD_HPFS_TERM, termId);
+                newSubCoHeadService.set(MasConstant.NCKD_TERM,dbTerm);
 
             }
             //员工信息

+ 0 - 3
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/EntldrMidlongApprFormPlugin.java

@@ -3,8 +3,6 @@ package nckd.jxccl.swc.mas.plugin.form.incentivemgmt;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.constant.StatusEnum;
-import kd.bos.entity.datamodel.RowDataEntity;
-import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.form.plugin.AbstractFormPlugin;
@@ -17,7 +15,6 @@ import nckd.jxccl.base.common.utils.ConvertUtil;
 import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.swc.mas.common.MasConstant;
 
-import java.util.EventObject;
 import java.util.Objects;
 import java.util.stream.Stream;
 

+ 1 - 5
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/EntldrTermBonusApprFormPlugin.java

@@ -13,14 +13,10 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
-import nckd.jxccl.base.common.enums.ProjectCategoryEnum;
 import nckd.jxccl.base.common.utils.ConvertUtil;
-import nckd.jxccl.base.common.utils.DateUtil;
 import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.swc.mas.common.MasConstant;
 
-import java.time.LocalDateTime;
-import java.util.Date;
 import java.util.EventObject;
 import java.util.Objects;
 import java.util.stream.Stream;
@@ -106,7 +102,7 @@ public class EntldrTermBonusApprFormPlugin extends AbstractFormPlugin implements
                 }
                 this.getView().showSuccessNotification("数据加载成功!");
             }else{
-                this.getView().showTipNotification("未加载到数据,根据【所属二级单位】、【法人组织】及【任期区间】未加载到对应“子企业负责人薪酬结构”数据!");
+                this.getView().showTipNotification("未加载到数据,根据【所属二级单位】、【法人组织】及【任期区间】未加载到对应“任期人员名单”数据!");
             }
             for (int rowIndex = 0; rowIndex < entryEntities.size(); rowIndex++) {
                 DynamicObject entry = entryEntities.get(rowIndex);

+ 187 - 3
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/EntleaderAnlSalStdFormPlugin.java

@@ -3,6 +3,7 @@ package nckd.jxccl.swc.mas.plugin.form.structappr;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.constant.StatusEnum;
+import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.form.plugin.AbstractFormPlugin;
@@ -11,15 +12,23 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
-import nckd.jxccl.base.common.enums.ProjectCategoryEnum;
+import nckd.jxccl.base.common.enums.mas.ProjectCategoryEnum;
 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.orm.helper.QFilterCommonHelper;
 import nckd.jxccl.swc.mas.common.MasConstant;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.EventObject;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
@@ -31,7 +40,20 @@ import java.util.stream.Stream;
 */
 public class EntleaderAnlSalStdFormPlugin extends AbstractFormPlugin implements Plugin {
 
+    @Override
+    public void afterBindData(EventObject e) {
+        DynamicObjectCollection entryCollection = this.getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
+        for (int rowIndex = 0; rowIndex < entryCollection.size(); rowIndex++) {
+            DynamicObject entry = entryCollection.get(rowIndex);
+            int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+            initOperateOption(installmentYears,rowIndex);
+        }
+    }
 
+    @Override
+    public void afterAddRow(AfterAddRowEventArgs e) {
+        initOperateOption(0,e.getInsertRow());
+    }
     @Override
     public void propertyChanged(PropertyChangedArgs e) {
         String fieldKey = e.getProperty().getName();
@@ -39,12 +61,113 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractFormPlugin implements
         int rowIndex = changeSet[0].getRowIndex();
         Object oldValue = changeSet[0].getOldValue();
         Object newValue = changeSet[0].getNewValue();
-        if(Stream.of(MasConstant.NCKD_PAYUNIT, MasConstant.NCKD_LAWENTITY, MasConstant.NCKD_YEAR)
+        if(MasConstant.NCKD_INSTALLMENTYEARS.equalsIgnoreCase(fieldKey)){
+            if(!Objects.equals(oldValue, newValue)){
+                initOperateOption(ConvertUtil.toInt(newValue),rowIndex);
+            }
+        }else if(Stream.of(MasConstant.NCKD_PAYUNIT, MasConstant.NCKD_LAWENTITY, MasConstant.NCKD_YEAR)
                 .anyMatch(op -> op.equalsIgnoreCase(fieldKey))){
             if(!Objects.equals(oldValue, newValue)){
                 DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
                 load();
             }
+        }else if(MasConstant.NCKD_APPRSTD.equalsIgnoreCase(fieldKey)){
+            DynamicObject payUnit = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_PAYUNIT));
+            DynamicObject lawEntity =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_LAWENTITY));
+            DynamicObject projectCategory =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_PROJECTCATEGORY));
+            Date year = ConvertUtil.toDate(this.getModel().getValue(MasConstant.NCKD_YEAR));
+            //判断“核定标准”是否大于0
+            BigDecimal apprStd = ConvertUtil.toBigDecimal(newValue);
+            if(apprStd != null && apprStd.compareTo(BigDecimal.ZERO) > 0) {
+                if (payUnit != null && lawEntity != null && year != null && projectCategory != null) {
+                    if (!Objects.equals(oldValue, newValue)) {
+                        //计算:延期支付总金额、支付年份1、支付年份1....
+                        //====================================== 获取延期支付比例 begin ======================================
+                        LocalDateTime localDateTime = DateUtil.toLocalDateTime(year);
+                        LocalDateTime beginOfYear = DateUtil.beginOfYear(localDateTime);
+                        LocalDateTime endOfYear = DateUtil.endOfYear(localDateTime);
+
+                        QueryFieldBuilder deferPayRatoConfQueryFieldBuilder = QueryFieldBuilder.create()
+                                .add(MasConstant.NCKD_PROJECTCATEGORY)
+                                .addIdNumberName(MasConstant.NCKD_PAYUNIT)
+                                .addIdNumberName(MasConstant.NCKD_DEFERPAYMONEY)
+                                .add(MasConstant.NCKD_DEFERPAYRATIO)
+                                .add(MasConstant.NCKD_DEFERPAYRATIO)
+                                .add(MasConstant.NCKD_PAYOUTTIMES)
+                                .add(MasConstant.NCKD_YEAR)
+                                .add(FormConstant.NCKD_ENTRYENTITY)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TIMES)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PAYOUTRATIO)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PAYOUTMONEY)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYITEM)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYDESC)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TERMPAYDESC)
+                                .orderDesc(MasConstant.CREATE_TIME_KEY)
+                                .orderAsc(String.join(".",FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TIMES));
+                        QFilter deferPayRatoConfFilter = new QFilter(MasConstant.NCKD_PAYUNIT, QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                                .and(MasConstant.NCKD_LAWENTITY, QCP.equals, lawEntity.getLong(FormConstant.ID_KEY))
+                                .and(MasConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                                .and(MasConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                                .and(QFilterCommonHelper.getEnableFilter());
+                        DynamicObject[] dbDeferPayRatoConfArray = BusinessDataServiceHelper.load(MasConstant.DEFERPAYRATOCONF_ENTITYID, deferPayRatoConfQueryFieldBuilder.buildSelect(), new QFilter[]{deferPayRatoConfFilter});
+                        Map<String, List<DynamicObject>> dbDeferPayRatoConfMap = Arrays.stream(dbDeferPayRatoConfArray)
+                                .collect(Collectors.groupingBy(obj -> {
+                                    DynamicObject dbProjectCategory = obj.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
+                                    if (dbProjectCategory != null) {
+                                        return dbProjectCategory.getString(FormConstant.NUMBER_KEY);
+                                    }
+                                    return ""; // 处理无项目分类的情况
+                                }));
+                        List<DynamicObject> dbDeferPayRatoConfList = dbDeferPayRatoConfMap.get(projectCategory.getString(FormConstant.NUMBER_KEY));
+
+                        if (dbDeferPayRatoConfList != null && !dbDeferPayRatoConfList.isEmpty()) {
+                            DynamicObject deferPayRatoConf = dbDeferPayRatoConfList.get(0);
+                            //延期支付比例(%)
+                            BigDecimal deferPayRatio = deferPayRatoConf.getBigDecimal(MasConstant.NCKD_DEFERPAYRATIO);
+                            //延期支付金额
+                            BigDecimal deferPayMoney = deferPayRatoConf.getBigDecimal(MasConstant.NCKD_DEFERPAYMONEY);
+                            LocalDateTime beginYear = DateUtil.toLocalDateTime(deferPayRatoConf.getDate(MasConstant.NCKD_YEAR));
+                            BigDecimal deferPayTotalAmt;
+                            if(deferPayMoney != null && deferPayMoney.compareTo(BigDecimal.ZERO) > 0){
+                                //优先使用【延期支付金额】
+                                deferPayTotalAmt = deferPayMoney;
+                            }else {
+                                //核算标准*延期支付比例/100
+                                deferPayTotalAmt = apprStd.multiply(deferPayRatio.divide(new BigDecimal(100), 2, RoundingMode.DOWN));
+                            }
+                            this.getModel().setValue(MasConstant.NCKD_DEFERPAYTOTALAMT, deferPayTotalAmt,rowIndex);
+                            DynamicObjectCollection entryColl = deferPayRatoConf.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+                            int i = 0;
+                            for (DynamicObject entry : entryColl) {
+                                int times = entry.getInt(MasConstant.NCKD_TIMES);
+                                //兑现比例(%)
+                                BigDecimal payoutRatio = entry.getBigDecimal(MasConstant.NCKD_PAYOUTRATIO);
+                                //兑现金额
+                                BigDecimal payoutMoney = entry.getBigDecimal(MasConstant.NCKD_PAYOUTMONEY);
+                                BigDecimal payaMount;
+                                if(payoutMoney != null && payoutMoney.compareTo(BigDecimal.ZERO) > 0){
+                                    //优先使用【兑现金额】
+                                    payaMount = payoutMoney;
+                                }else{
+                                    //延期支付总金额*兑现比例
+                                    payaMount = deferPayTotalAmt.multiply(payoutRatio.divide(new BigDecimal(100), 2, RoundingMode.DOWN));
+                                }
+                                if(i != 0){
+                                    beginYear = DateUtil.addYears(beginYear, 1);
+                                }
+                                this.getModel().setValue(MasConstant.NCKD_PAYYEAR+(i+1), DateUtil.toDate(beginYear),rowIndex);
+                                this.getModel().setValue(MasConstant.NCKD_PAYAMOUNT+(i+1), payaMount,rowIndex);
+                                i++;
+                            }
+
+                        }
+                        //====================================== 获取延期支付比例 end ======================================
+
+                    }
+                }
+            }else{
+                this.getModel().setValue(MasConstant.NCKD_DEFERPAYTOTALAMT, null);
+            }
         }
     }
 
@@ -96,6 +219,32 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractFormPlugin implements
                 this.getView().showTipNotification("未加载到数据,根据【所属二级单位】、【法人组织】及【年度】未加载到对应“子企业负责人薪酬结构”数据!");
             }
             //====================================== 获取子企业负责人薪酬结构 end ======================================
+            //====================================== 获取延期支付比例 begin ======================================
+            QueryFieldBuilder deferPayRatoConfQueryFieldBuilder = QueryFieldBuilder.create()
+                    .addIdNumberName(MasConstant.NCKD_PROJECTCATEGORY)
+                    .addIdNumberName(MasConstant.NCKD_PAYUNIT)
+                    .addIdNumberName(MasConstant.NCKD_LAWENTITY)
+                    .add(MasConstant.NCKD_DEFERPAYRATIO)
+                    .add(MasConstant.NCKD_PAYOUTTIMES)
+                    .add(MasConstant.NCKD_YEAR)
+                    .orderDesc(MasConstant.CREATE_TIME_KEY);
+            QFilter deferPayRatoConfFilter = new QFilter(MasConstant.NCKD_PAYUNIT, QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_LAWENTITY, QCP.equals, lawEntity.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                    .and(MasConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                    .and(QFilterCommonHelper.getEnableFilter());
+            DynamicObject[] dbDeferPayRatoConfArray = BusinessDataServiceHelper.load(MasConstant.DEFERPAYRATOCONF_ENTITYID, deferPayRatoConfQueryFieldBuilder.buildSelect(), new QFilter[]{deferPayRatoConfFilter});
+            Map<String, List<DynamicObject>> dbDeferPayRatoConfMap = Arrays.stream(dbDeferPayRatoConfArray)
+                    .collect(Collectors.groupingBy(obj -> {
+                        DynamicObject projectCategory = obj.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
+                        if (projectCategory != null) {
+                            return projectCategory.getString(FormConstant.NUMBER_KEY);
+                        }
+                        return ""; // 处理无项目分类的情况
+                    }));
+            //====================================== 获取延期支付比例 end ======================================
+
+
             DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
             entryEntities.clear();
             //====================================== 构建分录数据 begin ======================================
@@ -106,8 +255,9 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractFormPlugin implements
                         for (DynamicObject dbEntryEntity : dbEntryColl) {
                             DynamicObject projectCategory = dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
                             String projectCategoryNumber = projectCategory.getString(FormConstant.NUMBER_KEY);
-                            if(!projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.TERM_INCENTIVE.getCode()) && !projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.LONGTERM_INCENTIVE.getCode())) {
+                            if(projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode())) {
                                 DynamicObject entry = entryEntities.addNew();
+                                entry.set(MasConstant.NCKD_PROJECTCATEGORY, dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY));
                                 entry.set(MasConstant.NCKD_EMPLOYEE, dbSubCoHeadService.get(MasConstant.NCKD_EMPLOYEE));
                                 entry.set(MasConstant.NCKD_POSNAME, dbSubCoHeadService.get(MasConstant.NCKD_POSNAME));
                                 entry.set(MasConstant.NCKD_SERVICEMONTHS, dbSubCoHeadService.get(MasConstant.NCKD_SERVICEMONTHS));
@@ -117,6 +267,13 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractFormPlugin implements
                                 entry.set(MasConstant.NCKD_POSTLEVEL, dbSubCoHeadService.get(MasConstant.NCKD_POSTLEVEL));
                                 entry.set(MasConstant.NCKD_SALNEGOT, dbSubCoHeadService.get(MasConstant.NCKD_SALNEGOT));
                                 entry.set(MasConstant.NCKD_SALARYITEM, dbEntryEntity.get(MasConstant.NCKD_SALARYITEM));
+                                entry.set(MasConstant.NCKD_DEFERREDPAYITEM, dbEntryEntity.getBoolean(MasConstant.NCKD_DEFERREDPAYITEM));
+                                //根据【项目分类】获取延期支付比例配置
+                                List<DynamicObject> dbDeferPayRatoConfList = dbDeferPayRatoConfMap.get(projectCategoryNumber);
+                                if(dbDeferPayRatoConfList != null && !dbDeferPayRatoConfList.isEmpty()){
+                                    DynamicObject dbDeferPayRatoConf = dbDeferPayRatoConfList.get(0);
+                                    entry.set(MasConstant.NCKD_INSTALLMENTYEARS, dbDeferPayRatoConf.getInt(MasConstant.NCKD_PAYOUTTIMES));
+                                }
                             }
                         }
 
@@ -125,9 +282,36 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractFormPlugin implements
                 this.getView().showSuccessNotification("数据加载成功!");
             }
             //====================================== 构建分录数据 end ======================================
+            for (int rowIndex = 0; rowIndex < entryEntities.size(); rowIndex++) {
+                DynamicObject entry = entryEntities.get(rowIndex);
+                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                initOperateOption(installmentYears,rowIndex);
+            }
             getModel().updateEntryCache(entryEntities);
             getView().updateView(FormConstant.NCKD_ENTRYENTITY);
 
         }
     }
+
+    /**
+     * 设置支付N锁定或解锁
+     * @param installmentYears 分期支付年
+     * @param rowIndex 行索引
+     * @return: void
+     * @author W.Y.C
+     * @date: 2025/11/29 20:48
+     */
+    private void initOperateOption(int installmentYears, int rowIndex) {
+        if(rowIndex > -1) {
+            for (int i = 1; i <= 10; i++) {
+                this.getView().setEnable(false, rowIndex, MasConstant.NCKD_PAYYEAR + i);
+                this.getView().setEnable(false, rowIndex, MasConstant.NCKD_PAYAMOUNT + i);
+            }
+            for (int i = 1; i <= installmentYears; i++) {
+                this.getView().setEnable(true, rowIndex, MasConstant.NCKD_PAYYEAR + i);
+                this.getView().setEnable(true, rowIndex, MasConstant.NCKD_PAYAMOUNT + i);
+
+            }
+        }
+    }
 }

+ 156 - 4
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/SubcorpChiefSalStdFormPlugin.java

@@ -12,16 +12,23 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
-import nckd.jxccl.base.common.enums.ProjectCategoryEnum;
+import nckd.jxccl.base.common.enums.mas.ProjectCategoryEnum;
 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.orm.helper.QFilterCommonHelper;
 import nckd.jxccl.swc.mas.common.MasConstant;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.EventObject;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
@@ -66,6 +73,103 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractFormPlugin implements
                 DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
                 load();
             }
+        }else if(MasConstant.NCKD_APPRSTD.equalsIgnoreCase(fieldKey)){
+            DynamicObject payUnit = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_PAYUNIT));
+            DynamicObject lawEntity =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_LAWENTITY));
+            DynamicObject projectCategory =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_PROJECTCATEGORY));
+            Date year = ConvertUtil.toDate(this.getModel().getValue(MasConstant.NCKD_YEAR));
+            //判断“核定标准”是否大于0
+            BigDecimal apprStd = ConvertUtil.toBigDecimal(newValue);
+            if(apprStd != null && apprStd.compareTo(BigDecimal.ZERO) > 0) {
+                if (payUnit != null && lawEntity != null && year != null && projectCategory != null) {
+                    if (!Objects.equals(oldValue, newValue)) {
+                        //计算:延期支付总金额、支付年份1、支付年份1....
+                        //====================================== 获取延期支付比例 begin ======================================
+                        LocalDateTime localDateTime = DateUtil.toLocalDateTime(year);
+                        LocalDateTime beginOfYear = DateUtil.beginOfYear(localDateTime);
+                        LocalDateTime endOfYear = DateUtil.endOfYear(localDateTime);
+
+                        QueryFieldBuilder deferPayRatoConfQueryFieldBuilder = QueryFieldBuilder.create()
+                                .add(MasConstant.NCKD_PROJECTCATEGORY)
+                                .addIdNumberName(MasConstant.NCKD_PAYUNIT)
+                                .addIdNumberName(MasConstant.NCKD_DEFERPAYMONEY)
+                                .add(MasConstant.NCKD_DEFERPAYRATIO)
+                                .add(MasConstant.NCKD_DEFERPAYRATIO)
+                                .add(MasConstant.NCKD_PAYOUTTIMES)
+                                .add(MasConstant.NCKD_YEAR)
+                                .add(FormConstant.NCKD_ENTRYENTITY)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TIMES)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PAYOUTRATIO)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PAYOUTMONEY)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYITEM)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYDESC)
+                                .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TERMPAYDESC)
+                                .orderDesc(MasConstant.CREATE_TIME_KEY)
+                                .orderAsc(String.join(".",FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TIMES));
+                        QFilter deferPayRatoConfFilter = new QFilter(MasConstant.NCKD_PAYUNIT, QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                                .and(MasConstant.NCKD_LAWENTITY, QCP.equals, lawEntity.getLong(FormConstant.ID_KEY))
+                                .and(MasConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                                .and(MasConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                                .and(QFilterCommonHelper.getEnableFilter());
+                        DynamicObject[] dbDeferPayRatoConfArray = BusinessDataServiceHelper.load(MasConstant.DEFERPAYRATOCONF_ENTITYID, deferPayRatoConfQueryFieldBuilder.buildSelect(), new QFilter[]{deferPayRatoConfFilter});
+                        Map<String, List<DynamicObject>> dbDeferPayRatoConfMap = Arrays.stream(dbDeferPayRatoConfArray)
+                                .collect(Collectors.groupingBy(obj -> {
+                                    DynamicObject dbProjectCategory = obj.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
+                                    if (dbProjectCategory != null) {
+                                        return dbProjectCategory.getString(FormConstant.NUMBER_KEY);
+                                    }
+                                    return ""; // 处理无项目分类的情况
+                                }));
+                        List<DynamicObject> dbDeferPayRatoConfList = dbDeferPayRatoConfMap.get(projectCategory.getString(FormConstant.NUMBER_KEY));
+
+                        if (dbDeferPayRatoConfList != null && !dbDeferPayRatoConfList.isEmpty()) {
+                            DynamicObject deferPayRatoConf = dbDeferPayRatoConfList.get(0);
+                            //延期支付比例(%)
+                            BigDecimal deferPayRatio = deferPayRatoConf.getBigDecimal(MasConstant.NCKD_DEFERPAYRATIO);
+                            //延期支付金额
+                            BigDecimal deferPayMoney = deferPayRatoConf.getBigDecimal(MasConstant.NCKD_DEFERPAYMONEY);
+                            LocalDateTime beginYear = DateUtil.toLocalDateTime(deferPayRatoConf.getDate(MasConstant.NCKD_YEAR));
+                            BigDecimal deferPayTotalAmt;
+                            if(deferPayMoney != null && deferPayMoney.compareTo(BigDecimal.ZERO) > 0){
+                                //优先使用【延期支付金额】
+                                deferPayTotalAmt = deferPayMoney;
+                            }else {
+                                //核算标准*延期支付比例/100
+                                deferPayTotalAmt = apprStd.multiply(deferPayRatio.divide(new BigDecimal(100), 2, RoundingMode.DOWN));
+                            }
+                            this.getModel().setValue(MasConstant.NCKD_DEFERPAYTOTALAMT, deferPayTotalAmt,rowIndex);
+                            DynamicObjectCollection entryColl = deferPayRatoConf.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+                            int i = 0;
+                            for (DynamicObject entry : entryColl) {
+                                int times = entry.getInt(MasConstant.NCKD_TIMES);
+                                //兑现比例(%)
+                                BigDecimal payoutRatio = entry.getBigDecimal(MasConstant.NCKD_PAYOUTRATIO);
+                                //兑现金额
+                                BigDecimal payoutMoney = entry.getBigDecimal(MasConstant.NCKD_PAYOUTMONEY);
+                                BigDecimal payaMount;
+                                if(payoutMoney != null && payoutMoney.compareTo(BigDecimal.ZERO) > 0){
+                                    //优先使用【兑现金额】
+                                    payaMount = payoutMoney;
+                                }else{
+                                    //延期支付总金额*兑现比例
+                                    payaMount = deferPayTotalAmt.multiply(payoutRatio.divide(new BigDecimal(100), 2, RoundingMode.DOWN));
+                                }
+                                if(i != 0){
+                                    beginYear = DateUtil.addYears(beginYear, 1);
+                                }
+                                this.getModel().setValue(MasConstant.NCKD_PAYYEAR+(i+1), DateUtil.toDate(beginYear),rowIndex);
+                                this.getModel().setValue(MasConstant.NCKD_PAYAMOUNT+(i+1), payaMount,rowIndex);
+                                i++;
+                            }
+
+                        }
+                        //====================================== 获取延期支付比例 end ======================================
+
+                    }
+                }
+            }else{
+                this.getModel().setValue(MasConstant.NCKD_DEFERPAYTOTALAMT, null);
+            }
         }
     }
 
@@ -74,12 +178,15 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractFormPlugin implements
         DynamicObject lawEntity =  ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(MasConstant.NCKD_LAWENTITY));
         Date year = ConvertUtil.toDate(this.getModel().getValue(MasConstant.NCKD_YEAR));
         if(payUnit != null && lawEntity != null && year != null){
+
+            //====================================== 获取子企业负责人薪酬结构 begin ======================================
             QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
                     .addIdNumberName(MasConstant.NCKD_PAYUNIT)
                     .addIdNumberName(MasConstant.NCKD_LAWENTITY)
                     .add(MasConstant.NCKD_YEAR)
                     .add(FormConstant.NCKD_ENTRYENTITY)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY)
+                    .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_SALARYITEM)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYITEM)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYDESC)
@@ -94,6 +201,43 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractFormPlugin implements
                     .and(MasConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
                     .and(FormConstant.STATUS, QCP.in, new String[]{StatusEnum.C.toString(), StatusEnum.B.toString()});
             DynamicObject[] dbSubCorpSalaryArray = BusinessDataServiceHelper.load(MasConstant.SUBCORPSALARY_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter});
+            //====================================== 获取子企业负责人薪酬结构 end ======================================
+
+
+            //====================================== 获取延期支付比例 begin ======================================
+            QueryFieldBuilder deferPayRatoConfQueryFieldBuilder = QueryFieldBuilder.create()
+                    .addIdNumberName(MasConstant.NCKD_PROJECTCATEGORY)
+                    .addIdNumberName(MasConstant.NCKD_PAYUNIT)
+                    .addIdNumberName(MasConstant.NCKD_LAWENTITY)
+                    .add(MasConstant.NCKD_DEFERPAYRATIO)
+                    .add(MasConstant.NCKD_PAYOUTTIMES)
+                    .add(MasConstant.NCKD_YEAR)
+                   /* .add(FormConstant.NCKD_ENTRYENTITY)
+                    .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TIMES)
+                    .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PAYOUTRATIO)
+                    .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYITEM)
+                    .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYDESC)
+                    .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TERMPAYDESC)*/
+                    .orderDesc(MasConstant.CREATE_TIME_KEY);
+            QFilter deferPayRatoConfFilter = new QFilter(MasConstant.NCKD_PAYUNIT, QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_LAWENTITY, QCP.equals, lawEntity.getLong(FormConstant.ID_KEY))
+                    .and(MasConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                    .and(MasConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                    .and(QFilterCommonHelper.getEnableFilter());
+            DynamicObject[] dbDeferPayRatoConfArray = BusinessDataServiceHelper.load(MasConstant.DEFERPAYRATOCONF_ENTITYID, deferPayRatoConfQueryFieldBuilder.buildSelect(), new QFilter[]{deferPayRatoConfFilter});
+            Map<String, List<DynamicObject>> dbDeferPayRatoConfMap = Arrays.stream(dbDeferPayRatoConfArray)
+                    .collect(Collectors.groupingBy(obj -> {
+                        DynamicObject projectCategory = obj.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
+                        if (projectCategory != null) {
+                            return projectCategory.getString(FormConstant.NUMBER_KEY);
+                        }
+                        return ""; // 处理无项目分类的情况
+                    }));
+            //====================================== 获取延期支付比例 end ======================================
+
+
+
+
             DynamicObjectCollection entryEntities = getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
             entryEntities.clear();
             if(dbSubCorpSalaryArray != null && dbSubCorpSalaryArray.length > 0) {
@@ -103,13 +247,21 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractFormPlugin implements
                     for (DynamicObject dbEntryEntity : dbEntryColl) {
                         DynamicObject projectCategory = dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
                         String projectCategoryNumber = projectCategory.getString(FormConstant.NUMBER_KEY);
-                        if(!projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.TERM_INCENTIVE.getCode()) && !projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.LONGTERM_INCENTIVE.getCode())) {
+                        //只取分类为“年度薪酬”的数据
+                        if(projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode())) {
                             DynamicObject entry = entryEntities.addNew();
                             entry.set(MasConstant.NCKD_PROJECTCATEGORY, dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY));
                             entry.set(MasConstant.NCKD_SALARYITEM, dbEntryEntity.getDynamicObject(MasConstant.NCKD_SALARYITEM));
                             entry.set(MasConstant.NCKD_DEFERREDPAYITEM, dbEntryEntity.getBoolean(MasConstant.NCKD_DEFERREDPAYITEM));
-                            entry.set(MasConstant.NCKD_DEFERREDPAYDESC, dbEntryEntity.getString(MasConstant.NCKD_DEFERREDPAYDESC));
-                            entry.set(MasConstant.NCKD_TERMPAYDESC, dbEntryEntity.getString(MasConstant.NCKD_TERMPAYDESC));
+
+                            //根据【项目分类】获取延期支付比例配置
+                            List<DynamicObject> dbDeferPayRatoConfList = dbDeferPayRatoConfMap.get(projectCategoryNumber);
+                            if(dbDeferPayRatoConfList != null && !dbDeferPayRatoConfList.isEmpty()){
+                                DynamicObject dbDeferPayRatoConf = dbDeferPayRatoConfList.get(0);
+                                entry.set(MasConstant.NCKD_INSTALLMENTYEARS, dbDeferPayRatoConf.getInt(MasConstant.NCKD_PAYOUTTIMES));
+                            }
+                            /*entry.set(MasConstant.NCKD_DEFERREDPAYDESC, dbEntryEntity.getString(MasConstant.NCKD_DEFERREDPAYDESC));
+                            entry.set(MasConstant.NCKD_TERMPAYDESC, dbEntryEntity.getString(MasConstant.NCKD_TERMPAYDESC));*/
                         }
                     }
                 }

+ 0 - 7
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/empmgt/TenurePersonListOpPlugin.java

@@ -6,7 +6,6 @@ import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
 import kd.bos.entity.plugin.AddValidatorsEventArgs;
 import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
 import kd.bos.entity.validate.AbstractValidator;
-import kd.bos.entity.validate.ValidatePriority;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.common.utils.ConvertUtil;
@@ -25,12 +24,6 @@ public class TenurePersonListOpPlugin extends AbstractOperationServicePlugIn imp
         //通过“载入党政职务履历”
         Boolean isLoad = ConvertUtil.toBoolean(this.getOption().getVariableValue("load", "false"));
         e.addValidator(new AbstractValidator() {
-
-            @Override
-            public void setValidatePriority(ValidatePriority validatePriority) {
-                super.setValidatePriority(ValidatePriority.Last);
-            }
-
             @Override
             public void validate() {
                 String operateKey = this.getOperateKey();

+ 30 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/empmgt/base/DeferPayRatioConfValidator.java

@@ -0,0 +1,30 @@
+package nckd.jxccl.swc.mas.plugin.operate.empmgt.base;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.validate.AbstractValidator;
+import nckd.jxccl.swc.mas.common.MasConstant;
+
+/**
+* 延期支付比例
+* 实体标识:nckd_deferpayratioconf
+* @author W.Y.C
+* @date 2025/12/2 14:59
+* @version 1.0
+*/
+public class DeferPayRatioConfValidator extends AbstractValidator {
+
+    @Override
+    public void validate() {
+        for (ExtendedDataEntity dataEntity : this.getDataEntities()) {
+            DynamicObject data = dataEntity.getDataEntity();
+            int payoutTimes = data.getInt(MasConstant.NCKD_PAYOUTTIMES);
+            DynamicObjectCollection dynamicObjectCollection = data.getDynamicObjectCollection(MasConstant.NCKD_ENTRYENTITY);
+            if(dynamicObjectCollection.size() != payoutTimes){
+                this.addFatalErrorMessage(dataEntity,"【兑现比例】数量必须跟【支付总年数】一致");
+            }
+
+        }
+    }
+}