Browse Source

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

# Conflicts:
#	code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
wyc 1 day ago
parent
commit
6400461977
24 changed files with 1883 additions and 3 deletions
  1. 4 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
  2. 28 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/DateUtil.java
  3. 3 3
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/structappr/change/AbstractSalaryStdChgOpPlugin.java
  4. 47 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/business/StmService.java
  5. 229 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/common/StmConstant.java
  6. 0 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/mservice/.gitkeep
  7. 137 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpHqTtlWgBgtAdjFormPlugin.java
  8. 122 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpHqTtlWgBgtSubFormPlugin.java
  9. 123 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpHqTtlWgbGtExecFormPlugin.java
  10. 33 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlQgBgtAdjFormPlugin.java
  11. 124 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlWgBgtExecFormPlugin.java
  12. 291 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlWgBgtSubFormPlugin.java
  13. 37 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/unitst/UnitStBudgetAdjustFormPlugin.java
  14. 218 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/unitst/UnitStBudgetApplyFormPlugin.java
  15. 100 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/grpttlwg/BackGrpHqTtlWgGgtSubOpPlugin.java
  16. 100 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/grpttlwg/BackGrpTtlWgGgtSubOpPlugin.java
  17. 66 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/grpttlwg/GrpTtlWgGgtSubSaveOpPlugin.java
  18. 101 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/unitst/BackUnitStBudgetOpPlugin.java
  19. 63 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/unitst/UnitStBudgetAdjustSaveOpPlugin.java
  20. 57 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/unitst/UnitStBudgetAdjustSubmitEffectOpPlugin.java
  21. 0 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/other/.gitkeep
  22. 0 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/report/.gitkeep
  23. 0 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/workflow/.gitkeep
  24. 0 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/webapi/.gitkeep

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

@@ -135,6 +135,8 @@ public class FormConstant {
     public static final String SUBMIT_OP = "submit";
     /** 撤销 */
     public static final String UNSUBMIT_OP = "unsubmit";
+    /** 提交生效操作 */
+    public static final String SUBMITEFFECT_OP = "submiteffect";
     /** 启用操作 */
     public static final String ENABLE_OP = "enable";
     /** 审核操作 */
@@ -414,5 +416,7 @@ public class FormConstant {
     public static final String BIRTHDAY = "birthday";
     /** 性别 */
     public static final String GENDER = "gender";
+    /** 上级组织 */
+    public static final String PARENTORG_KEY = "parentorg";
 
 }

+ 28 - 0
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/DateUtil.java

@@ -420,6 +420,15 @@ public class DateUtil {
         return dateTime.withMonth(quarterStartMonth).withDayOfMonth(1).toLocalDate().atStartOfDay();
     }
 
+    /**
+     * 获取年份的开始时间
+     *
+     * @param date 日期时间
+     * @return 当年第一天 00:00:00
+     */
+    public static LocalDateTime beginOfYear(Date date) {
+        return beginOfYear(toLocalDateTime(date));
+    }
     /**
      * 获取年份的开始时间
      *
@@ -430,6 +439,16 @@ public class DateUtil {
         return dateTime.withDayOfYear(1).toLocalDate().atStartOfDay();
     }
 
+    /**
+     * 获取日期当天的结束时间(23:59:59.999999999)
+     *
+     * @param date 日期时间
+     * @return 当天的结束时间
+     */
+    public static LocalDateTime endOfDay(Date date) {
+        return endOfDay(toLocalDateTime(date));
+    }
+
     /**
      * 获取日期当天的结束时间(23:59:59.999999999)
      *
@@ -464,6 +483,15 @@ public class DateUtil {
                 .toLocalDate().atTime(LocalTime.MAX);
     }
 
+    /**
+     * 获取年份结束时间
+     *
+     * @param date 日期时间
+     * @return 当年最后一天 23:59:59.999999999
+     */
+    public static LocalDateTime endOfYear(Date date) {
+        return endOfYear(toLocalDateTime(date));
+    }
     /**
      * 获取年份结束时间
      *

+ 3 - 3
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/structappr/change/AbstractSalaryStdChgOpPlugin.java

@@ -116,11 +116,11 @@ public abstract class AbstractSalaryStdChgOpPlugin extends AbstractOperationServ
             OperationResult saveResult = SaveServiceHelper.saveOperate(getEntityId(), load, option);
             if (saveResult != null && !saveResult.isSuccess()) {
                 StringJoiner errorMsg = new StringJoiner(";");
-                for (IOperateInfo error : operationResult.getAllErrorOrValidateInfo()) {
+                for (IOperateInfo error : saveResult.getAllErrorOrValidateInfo()) {
                     errorMsg.add(error.getMessage());
                 }
-                if (!ObjectUtils.isEmpty(operationResult.getMessage())) {
-                    errorMsg.add(operationResult.getMessage());
+                if (!ObjectUtils.isEmpty(saveResult.getMessage())) {
+                    errorMsg.add(saveResult.getMessage());
                 }
                 throw new ValidationException(StrFormatter.format("回写【{}】失败,原因:{}",getEntityName(),errorMsg.toString()));
             }

+ 47 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/business/StmService.java

@@ -0,0 +1,47 @@
+package nckd.jxccl.swc.stm.business;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.utils.ConvertUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+
+/**
+* 工资总额帮助类
+* @author W.Y.C
+* @date 2025/12/9 15:54
+* @version 1.0
+*/
+public class StmService {
+
+    /**
+     * 统计组织下法人单位数量(含下级及去重统计)
+     * @param org 组织
+     * @return: int
+     * @author W.Y.C
+     * @date: 2025/12/09 18:05
+     */
+    public static int countCorpNum(DynamicObject org){
+        DynamicObject adminOrgHr = BusinessDataServiceHelper.loadSingle(FormConstant.ADMINORGHR_ENTITYID, FormConstant.STRUCTLONGNUMBER, new QFilter[]{QFilterCommonHelper.getIdEqFilter(org.getLong(FormConstant.ID_KEY))});
+        QFilter filter = QFilter.like(FormConstant.STRUCTLONGNUMBER, adminOrgHr.getString(FormConstant.STRUCTLONGNUMBER) + "%")
+                .and("corporateorg", QCP.is_notnull,null)
+                .and(QFilterCommonHelper.getCurrentVersionFilter())
+                .and(QFilterCommonHelper.getEnableFilter())
+                .and(QFilterCommonHelper.getStatusFilter())
+                //包含自己
+                .or(FormConstant.ID_KEY,QCP.equals,org.getLong(FormConstant.ID_KEY));
+        QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                .addIdNumberName("corporateorg");
+        DynamicObjectCollection query = QueryServiceHelper.query(FormConstant.ADMINORGHR_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{filter});
+        int count = ConvertUtil.toInt(query.stream()
+                .mapToLong(obj -> obj.getLong(String.join(".", "corporateorg", FormConstant.ID_KEY)))
+                .distinct()
+                .count());
+        return count;
+    }
+}

+ 229 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/common/StmConstant.java

@@ -0,0 +1,229 @@
+package nckd.jxccl.swc.stm.common;
+
+import com.google.common.collect.Lists;
+import nckd.jxccl.base.common.constant.FormConstant;
+
+import java.util.List;
+
+/**
+ * 动态表单插件
+ */
+public class StmConstant extends FormConstant {
+
+    /** 单位工资总额预算申报-实体标识 */
+    public static final String UNITSTBUDGETAPPLY_ENTITYID = "nckd_unitstbudgetapply";
+    /** 填报单位 */
+    public static final String NCKD_PAYUNIT = "nckd_payunit";
+    /** 年度 */
+    public static final String NCKD_YEAR = "nckd_year";
+    /** 利润总额/模拟利润 */
+    public static final String NCKD_TOTALPROFSIM = "nckd_totalprofsim";
+    /** 较上年增长率 */
+    public static final String NCKD_YOYGROWTHRATE = "nckd_yoygrowthrate";
+    /** 净资产收益率 */
+    public static final String NCKD_ROE = "nckd_roe";
+    /** 劳动生产率 */
+    public static final String NCKD_LABOURPROD = "nckd_labourprod";
+    /** 国有资产保保值增值率 */
+    public static final String NCKD_SOAAPPRRATE = "nckd_soaapprrate";
+    /** 人工成本利润率(%) */
+    public static final String NCKD_LABCOSTPROFITRT = "nckd_labcostprofitrt";
+    /** 人事费用率(%) */
+    public static final String NCKD_PERSEXPRATIO = "nckd_persexpratio";
+    /** 职工平均人数(人) */
+    public static final String NCKD_AVGNUM = "nckd_avgnum";
+    /** 直管干部(班子成员) */
+    public static final String NCKD_DMTEAMMEM = "nckd_dmteammem";
+    /** 直管干部(其他) */
+    public static final String NCKD_DMOTHER = "nckd_dmother";
+    /** 职业经理人 */
+    public static final String NCKD_PROFMGR = "nckd_profmgr";
+    /** 非直管干部在岗职工 */
+    public static final String NCKD_NONDIRONPOST = "nckd_nondironpost";
+    /** 不在岗职工 */
+    public static final String NCKD_OFFPOST = "nckd_offpost";
+    /** 工资总额 */
+    public static final String NCKD_TOTALWAGE = "nckd_totalwage";
+    /** 较上年增长率 */
+    public static final String NCKD_YOYRTBGT = "nckd_yoyrtbgt";
+    /** 直管干部(班子成员) */
+    public static final String NCKD_DMTEAMTOTAL = "nckd_dmteamtotal";
+    /** 年度薪酬 */
+    public static final String NCKD_DMTEAMANLBGT = "nckd_dmteamanlbgt";
+    /** 任期激励 */
+    public static final String NCKD_DMTEAMTMBGT = "nckd_dmteamtmbgt";
+    /** 单项工资 */
+    public static final String NCKD_DMTEAMSGBGT = "nckd_dmteamsgbgt";
+    /** 年度薪酬 */
+    public static final String NCKD_DMOTHERANLBGT = "nckd_dmotheranlbgt";
+    /** 任期激励 */
+    public static final String NCKD_DMOTHERTMBGT = "nckd_dmothertmbgt";
+    /** 单项工资 */
+    public static final String NCKD_DMOTHERSGBGT = "nckd_dmothersgbgt";
+    /** 直管干部(其他) */
+    public static final String NCKD_DMOTHERTTOTAL = "nckd_dmotherttotal";
+    /** 职业经理人 */
+    public static final String NCKD_PROFMGRTOTAL = "nckd_profmgrtotal";
+    /** 年度薪酬 */
+    public static final String NCKD_PROFMGRANLBGT = "nckd_profmgranlbgt";
+    /** 任期激励 */
+    public static final String NCKD_PROFMGRTMBGT = "nckd_profmgrtmbgt";
+    /** 单项工资 */
+    public static final String NCKD_PROFMGRSGBGT = "nckd_profmgrsgbgt";
+    /** 非直管干部在岗职工工资 */
+    public static final String NCKD_NONDIRWGBGT = "nckd_nondirwgbgt";
+    /** 不在岗职工 */
+    public static final String NCKD_OFFPOSTBGT = "nckd_offpostbgt";
+    /** 直管干部 */
+    public static final String NCKD_GRPAPPRSGDMBGT = "nckd_grpapprsgdmbgt";
+    /** 职业经理人 */
+    public static final String NCKD_GRPAPPRSGPROFBGT = "nckd_grpapprsgprofbgt";
+    /** 非直管干部 */
+    public static final String NCKD_GRPAPPRSGNONDIRBGT = "nckd_grpapprsgnondirbgt";
+    /** 集团核定单项工资 */
+    public static final String NCKD_GRPAPPRSGNDIRBGT = "nckd_grpapprsgndirbgt";
+    /** 集团核定单项 */
+    public static final String NCKD_GRPAPPRSG = "nckd_grpapprsg";
+    /** 币种 */
+    public static final String NCKD_CURRENCYFIELD = "nckd_currencyfield";
+    /** 管理法人企业户数(户) */
+    public static final String NCKD_MGTELEFIRMCOUNT = "nckd_mgtelefirmcount";
+    /** 直管干部 */
+    public static final String NCKD_PYACCDM = "nckd_pyaccdm";
+    /** 职业经理人 */
+    public static final String NCKD_PYACCPROFMGR = "nckd_pyaccprofmgr";
+    /** 非直管干部 */
+    public static final String NCKD_PYACCNONDIR = "nckd_pyaccnondir";
+    /** 集团核定单项工资 */
+    public static final String NCKD_PYACCGRPAPPRSG = "nckd_pyaccgrpapprsg";
+
+
+    /** 单位工资总额预算申报调整-实体标识 */
+    public static final String UNITSTBUDGETADJUST_ENTITYID = "nckd_unitstbudgetadjust";
+
+    /** 单位工资总额清算和执行情况-实体标识 */
+    public static final String UNITSTSETTLEMENT_ENTITYID = "nckd_unitstsettlement";
+
+
+
+
+
+
+
+    /** 集团工资总额预算申报-实体标识 */
+    public static final String GRPTTLWGBGTSUB_ENTITYID = "nckd_grpttlwgbgtsub";
+    /** 集团工资总额预算申报调整-实体标识 */
+    public static final String GRPTTLWGBGTADJ_ENTITYID = "nckd_grpttlwgbgtadj";
+    /** 集团工资总额执行情况-实体标识 */
+    public static final String GRPTTLWGBGTEXEC_ENTITYID = "nckd_grpttlwgbgtexec";
+    /** 集团本部工资总额预算申报-实体标识 */
+    public static final String GRPHQTTLWGBGTSU_ENTITYID = "nckd_grphqttlwgbgtsub";
+    /** 集团本部工资总额预算申报调整-实体标识 */
+    public static final String GRPHQTTLWGBGTADJ_ENTITYID = "nckd_grphqttlwgbgtadj";
+    /** 集团本部工资总额预算申报调整-实体标识 */
+    public static final String GRPHQTTLWGBGTEXEC_ENTITYID = "nckd_grphqttlwgbgtexec";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_CONCNTLYA = "nckd_concntlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_CONCNTLYE = "nckd_concntlye";
+    /** 本年度预算 */
+    public static final String NCKD_CONCNT = "nckd_concnt";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_LVL2CNTLYA = "nckd_lvl2cntlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_LVL2CNTLYE = "nckd_lvl2cntlye";
+    /** 本年度预算 */
+    public static final String NCKD_LVL2CNT = "nckd_lvl2cnt";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_LVL3CNTLYA = "nckd_lvl3cntlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_LVL3CNTLYE = "nckd_lvl3cntlye";
+    /** 本年度预算 */
+    public static final String NCKD_LVL3CNT = "nckd_lvl3cnt";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_LINKSOAAPPRLYA = "nckd_linksoaapprlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_LINKSOAAPPRLYE = "nckd_linksoaapprlye";
+    /** 本年度预算 */
+    public static final String NCKD_LINKSOAAPPR = "nckd_linksoaappr";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_AVGNUMLYA = "nckd_avgnumlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_AVGNUMLYE = "nckd_avgnumlye";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_ONPSTNUMLYA = "nckd_onpstnumlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_ONPSTNUMLYE = "nckd_onpstnumlye";
+    /** 本年度预算 */
+    public static final String NCKD_ONPSTNUM = "nckd_onpstnum";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_OFFPSTNUMLYA = "nckd_offpstnumlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_OFFPSTNUMLYE = "nckd_offpstnumlye";
+    /** 本年度预算 */
+    public static final String NCKD_OFFPSTNUM = "nckd_offpstnum";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_TTLWGLYA = "nckd_ttlwglya";
+    /** 上年度执行结果 */
+    public static final String NCKD_TTLWGLYE = "nckd_ttlwglye";
+    /** 本年度预算 */
+    public static final String NCKD_TTLWG = "nckd_ttlwg";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_LINKLABPRODLYA = "nckd_linklabprodlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_LINKLABPRODLYE = "nckd_linklabprodlye";
+    /** 本年度预算 */
+    public static final String NCKD_LINKLABPROD = "nckd_linklabprod";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_ONPSTWGLYA = "nckd_onpstwglya";
+    /** 上年度执行结果 */
+    public static final String NCKD_ONPSTWGLYE = "nckd_onpstwglye";
+    /** 本年度预算 */
+    public static final String NCKD_ONPSTWG = "nckd_onpstwg";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_OFFPSTLIVLYA = "nckd_offpstlivlya";
+    /** 上年度执行结果 */
+    public static final String NCKD_OFFPSTLIVLYE = "nckd_offpstlivlye";
+    /** 本年度预算 */
+    public static final String NCKD_OFFPSTLIV = "nckd_offpstliv";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_AVGWAGELYA = "nckd_avgwagelya";
+    /** 上年度执行结果 */
+    public static final String NCKD_AVGWAGELYE = "nckd_avgwagelye";
+    /** 本年度预算 */
+    public static final String NCKD_AVGWAGE = "nckd_avgwage";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_ONPSTAVGWGLYA = "nckd_onpstavgwglya";
+    /** 上年度执行结果 */
+    public static final String NCKD_ONPSTAVGWGLYE = "nckd_onpstavgwglye";
+    /** 本年度预算 */
+    public static final String NCKD_ONPSTAVGWG = "nckd_onpstavgwg";
+    /** 本年度预算 */
+    public static final String NCKD_BGTIDAMT = "nckd_bgtidamt";
+    /** 本年度预算 */
+    public static final String NCKD_LINKIDAMT = "nckd_linkidamt";
+    /** 本年度预算 */
+    public static final String NCKD_SPFCTWG = "nckd_spfctwg";
+    /** 本年度预算 */
+    public static final String NCKD_LINKPROFIDPCT = "nckd_linkprofidpct";
+    /** 本年度预算 */
+    public static final String NCKD_YOYWGIDPCT = "nckd_yoywgidpct";
+    /** 本年度预算 */
+    public static final String NCKD_YOYONPAVGWGPCT = "nckd_yoyonpavgwgpct";
+    /** 本年度预算 */
+    public static final String NCKD_EXSPLWGIDPCT = "nckd_exsplwgidpct";
+    /** 本年度预算 */
+    public static final String NCKD_EXSPLONPAVGWGPCT = "nckd_exsplonpavgwgpct";
+    /** 上年度核准或备案的预算 */
+    public static final String NCKD_LINKPROFLYA = "nckd_linkproflya";
+    /** 上年度执行结果 */
+    public static final String NCKD_LINKPROFLYE = "nckd_linkproflye";
+    /** 本年度预算 */
+    public static final String NCKD_LINKPROF = "nckd_linkprof";
+    /** 本年度预算 */
+    public static final String NCKD_SPFCTNUM = "nckd_spfctnum";
+
+
+    public static final List<String> IGNORE_FIELDS = Lists.newArrayList(NCKD_YEAR,NCKD_PAYUNIT,UNITSTBUDGETAPPLY_ENTITYID,GRPTTLWGBGTSUB_ENTITYID,StmConstant.NCKD_PAYUNIT,String.join( ".", StmConstant.NCKD_PAYUNIT, FormConstant.NAME_KEY));
+    public static final List<String> IGNORE_SUMMARY_FIELDS = Lists.newArrayList(NCKD_DMTEAMTOTAL ,NCKD_DMOTHERTTOTAL ,NCKD_PROFMGRTOTAL,NCKD_TOTALWAGE );
+}

+ 0 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/mservice/.gitkeep


+ 137 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpHqTtlWgBgtAdjFormPlugin.java

@@ -0,0 +1,137 @@
+package nckd.jxccl.swc.stm.plugin.form.grpttlwg;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+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.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.swc.mas.common.MasConstant;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+* 集团本部工资总额预算申报调整
+* 实体标识:nckd_grphqttlwgbgtadj
+* @author W.Y.C
+* @date 2025/12/14 13:53
+* @version 1.0
+*/
+public class GrpHqTtlWgBgtAdjFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if (StmConstant.NCKD_YEAR.equalsIgnoreCase(fieldKey)) {
+            loadData();
+        }
+    }
+
+
+    private void loadData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPHQTTLWGBGTADJ_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 清理现有数据
+                clearExistingData();
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(DateUtil.toLocalDateTime(year));
+                LocalDateTime endOfYear = DateUtil.endOfYear(DateUtil.toLocalDateTime(year));
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.GRPHQTTLWGBGTSU_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团本部工资总额预算申报\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.GRPHQTTLWGBGTSU_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团本部工资总额预算申报\"数据!");
+                    return;
+                }
+
+                copyBudgetData(load[0]);
+                DynamicObject dynamicObject = EntityHelper.newEntity(StmConstant.GRPHQTTLWGBGTSU_ENTITYID, load[0].getLong(StmConstant.ID_KEY));
+                this.getModel().setValue(StmConstant.GRPHQTTLWGBGTSU_ENTITYID, dynamicObject);
+                this.getView().showSuccessNotification("数据加载成功!");
+            }
+        }
+    }
+
+
+    // 提取清理数据逻辑
+    private void clearExistingData() {
+        DataEntityPropertyCollection properties = this.getModel().getDataEntityType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name) && !name.endsWith("ad") && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, null);
+            }
+        }
+    }
+
+    // 提取复制数据逻辑
+    private void copyBudgetData(DynamicObject source) {
+        DataEntityPropertyCollection properties = source.getDynamicObjectType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name) && !name.endsWith("ad") && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, source.get(name));
+            }
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(e.getOperationResult() != null && e.getOperationResult().isSuccess()){
+            String operateKey = e.getOperateKey();
+            if(operateKey.equalsIgnoreCase(StmConstant.SUBMITEFFECT_OP)){
+                if(formId.equalsIgnoreCase(StmConstant.GRPHQTTLWGBGTADJ_ENTITYID)) {
+                    this.getView().showSuccessNotification("回写”集团本部工资总额预算申报“成功!");
+                }
+            }
+        }
+    }
+}

+ 122 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpHqTtlWgBgtSubFormPlugin.java

@@ -0,0 +1,122 @@
+package nckd.jxccl.swc.stm.plugin.form.grpttlwg;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+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.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.swc.mas.common.MasConstant;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+* 集团本部工资总额预算申报
+* 实体标识:nckd_grphqttlwgbgtsub
+* @author W.Y.C
+* @date 2025/12/14 19:17
+* @version 1.0
+*/
+public class GrpHqTtlWgBgtSubFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if (StmConstant.NCKD_YEAR.equalsIgnoreCase(fieldKey)) {
+            loadLastData();
+        }
+    }
+
+    /**
+     * 加载上年度执行情况
+     * @param
+     * @return: void
+     * @author W.Y.C
+     * @date: 2025/12/14 18:59
+     */
+    private void loadLastData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPHQTTLWGBGTSU_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 清理现有数据
+                DataEntityPropertyCollection currentProperties = this.getModel().getDataEntityType().getProperties();
+                for (IDataEntityProperty property : currentProperties) {
+                    String name = property.getName();
+                    if (name.indexOf("nckd_") > -1 && (name.endsWith("lya") || name.endsWith("lye"))) {
+                        this.getModel().setValue(name, null);
+                    }
+                }
+                //ad -> lay
+                //ex -> lye
+
+
+                LocalDateTime lastYear = DateUtil.minusYears(DateUtil.toLocalDateTime(year), 1);
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(lastYear);
+                LocalDateTime endOfYear = DateUtil.endOfYear(lastYear);
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.GRPHQTTLWGBGTEXEC_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到上年度\"集团本部工资总额执行情况\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.GRPHQTTLWGBGTEXEC_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到上年度\"集团本部工资总额执行情况\"数据!");
+                    return;
+                }
+
+                DataEntityPropertyCollection properties = load[0].getDynamicObjectType().getProperties();
+                for (IDataEntityProperty property : properties) {
+                    String name = property.getName();
+                    if (name.indexOf("nckd_") > -1  && (name.endsWith("ad") || name.endsWith("ex"))) {
+                        String currentName = name.replace("ad", "lya").replace("ex", "lye");
+                        if(this.getModel().getDataEntityType().getProperties().containsKey(currentName)) {
+                            this.getModel().setValue(currentName, load[0].get(name));
+                        }
+                    }
+                }
+                this.getView().showSuccessNotification("成功加载上年度\"集团本部工资总额执行情况\"数据!");
+            }
+        }
+    }
+}

+ 123 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpHqTtlWgbGtExecFormPlugin.java

@@ -0,0 +1,123 @@
+package nckd.jxccl.swc.stm.plugin.form.grpttlwg;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+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.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.swc.mas.common.MasConstant;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+* 集团本部工资总额执行情况
+* 实体标识:nckd_grphqttlwgbgtexec
+* @author W.Y.C
+* @date 2025/12/14 15:21
+* @version 1.0
+*/
+public class GrpHqTtlWgbGtExecFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if (StmConstant.NCKD_YEAR.equalsIgnoreCase(fieldKey)) {
+            loadData();
+        }
+    }
+
+
+    private void loadData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPHQTTLWGBGTEXEC_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 清理现有数据
+                clearExistingData();
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(DateUtil.toLocalDateTime(year));
+                LocalDateTime endOfYear = DateUtil.endOfYear(DateUtil.toLocalDateTime(year));
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.GRPHQTTLWGBGTADJ_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团本部工资总额预算申报调整\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.GRPHQTTLWGBGTADJ_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团本部工资总额预算申报调整\"数据!");
+                    return;
+                }
+
+                copyBudgetData(load[0]);
+                DynamicObject dynamicObject = EntityHelper.newEntity(StmConstant.GRPHQTTLWGBGTADJ_ENTITYID, load[0].getLong(StmConstant.ID_KEY));
+                this.getModel().setValue(StmConstant.GRPHQTTLWGBGTADJ_ENTITYID, dynamicObject);
+                this.getView().showSuccessNotification("数据加载成功!");
+            }
+        }
+    }
+
+
+
+    // 提取清理数据逻辑
+    private void clearExistingData() {
+        DataEntityPropertyCollection properties = this.getModel().getDataEntityType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name)  && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, null);
+            }
+        }
+    }
+
+    // 提取复制数据逻辑
+    private void copyBudgetData(DynamicObject source) {
+        DataEntityPropertyCollection properties = source.getDynamicObjectType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name)  && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, source.get(name));
+            }
+        }
+    }
+}

+ 33 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlQgBgtAdjFormPlugin.java

@@ -0,0 +1,33 @@
+package nckd.jxccl.swc.stm.plugin.form.grpttlwg;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+/**
+* nckd_grpttlwgbgtadj
+* 实体标识:集团工资总额预算申报调整
+* @author W.Y.C
+* @date 2025/12/13 18:05
+* @version 1.0
+*/
+public class GrpTtlQgBgtAdjFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(e.getOperationResult() != null && e.getOperationResult().isSuccess()){
+            String operateKey = e.getOperateKey();
+            if(operateKey.equalsIgnoreCase(StmConstant.SUBMITEFFECT_OP)){
+                if(formId.equalsIgnoreCase(StmConstant.GRPTTLWGBGTADJ_ENTITYID)) {
+                    this.getView().showSuccessNotification("回写”集团工资总额预算申报“成功!");
+                }
+            }
+        }
+    }
+
+
+}

+ 124 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlWgBgtExecFormPlugin.java

@@ -0,0 +1,124 @@
+package nckd.jxccl.swc.stm.plugin.form.grpttlwg;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+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.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.swc.mas.common.MasConstant;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+* 集团工资总额执行情况
+* 实体标识:TODO
+* @author W.Y.C
+* @date 2025/12/13 14:54
+* @version 1.0
+*/
+public class GrpTtlWgBgtExecFormPlugin extends AbstractFormPlugin implements Plugin {
+
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if (StmConstant.NCKD_YEAR.equalsIgnoreCase(fieldKey)) {
+            loadData();
+        }
+    }
+
+
+    private void loadData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPTTLWGBGTEXEC_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 清理现有数据
+                clearExistingData();
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(DateUtil.toLocalDateTime(year));
+                LocalDateTime endOfYear = DateUtil.endOfYear(DateUtil.toLocalDateTime(year));
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.GRPTTLWGBGTADJ_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团工资总额预算申报调整\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.GRPTTLWGBGTADJ_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团工资总额预算申报调整\"数据!");
+                    return;
+                }
+
+                copyBudgetData(load[0]);
+                DynamicObject dynamicObject = EntityHelper.newEntity(StmConstant.GRPTTLWGBGTADJ_ENTITYID, load[0].getLong(StmConstant.ID_KEY));
+                this.getModel().setValue(StmConstant.GRPTTLWGBGTADJ_ENTITYID, dynamicObject);
+                this.getView().showSuccessNotification("数据加载成功!");
+            }
+        }
+    }
+
+
+
+    // 提取清理数据逻辑
+    private void clearExistingData() {
+        DataEntityPropertyCollection properties = this.getModel().getDataEntityType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name)  && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, null);
+            }
+        }
+    }
+
+    // 提取复制数据逻辑
+    private void copyBudgetData(DynamicObject source) {
+        DataEntityPropertyCollection properties = source.getDynamicObjectType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name)  && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, source.get(name));
+            }
+        }
+    }
+}

+ 291 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlWgBgtSubFormPlugin.java

@@ -0,0 +1,291 @@
+package nckd.jxccl.swc.stm.plugin.form.grpttlwg;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+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.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.swc.mas.common.MasConstant;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.StringJoiner;
+
+/**
+* 集团工资总额预算申报
+* 实体标识:nckd_grpttlwgbgtsub
+* @author W.Y.C
+* @date 2025/12/12 15:25
+* @version 1.0
+*/
+public class GrpTtlWgBgtSubFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if (StmConstant.NCKD_YEAR.equalsIgnoreCase(fieldKey)) {
+            loadUnitStBudgetApplyData();
+            loadData();
+            loadLastData();
+        }
+    }
+
+
+    private void loadUnitStBudgetApplyData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPTTLWGBGTSUB_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .add(StmConstant.NCKD_DMTEAMMEM)
+                        .add(StmConstant.NCKD_DMOTHER)
+                        .add(StmConstant.NCKD_PROFMGR)
+                        .add(StmConstant.NCKD_NONDIRONPOST)
+                        .add(StmConstant.NCKD_OFFPOST)
+                        .add(StmConstant.NCKD_TOTALWAGE)
+                        .add(StmConstant.NCKD_DMOTHERTTOTAL)
+                        .add(StmConstant.NCKD_PROFMGRTOTAL)
+                        .add(StmConstant.NCKD_NONDIRWGBGT)
+                        .add(StmConstant.NCKD_OFFPOSTBGT)
+                        .addIdNumberName(StmConstant.NCKD_PAYUNIT)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(DateUtil.toLocalDateTime(year));
+                LocalDateTime endOfYear = DateUtil.endOfYear(DateUtil.toLocalDateTime(year));
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.UNITSTBUDGETAPPLY_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                // nckd_onpstnum:职工平均人数(人)-其中:在岗职工
+                java.math.BigDecimal onpStNum = java.math.BigDecimal.ZERO;
+                // nckd_onpstwg:应发工资总额(万元)-其中:在岗职工
+                java.math.BigDecimal onpStWg = java.math.BigDecimal.ZERO;
+                // nckd_offpstliv:不在岗职工生活费
+                java.math.BigDecimal offpStLiv = java.math.BigDecimal.ZERO;
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"单位工资总额预算申报\"数据!");
+                }else{
+                    StringJoiner payUnitNameJoin = new StringJoiner(",");
+                    for (DynamicObject obj : unitStBudgetApplyColl) {
+                        /*10+11+12+13+14
+                        直管干部(班子成员):nckd_dmteammem
+                        直管干部(其他):nckd_dmother
+                        职业经理人:nckd_profmgr
+                        非直管干部在岗职工:nckd_nondironpost
+                        不在岗职工:nckd_offpost*/
+                        onpStNum = onpStNum.add(obj.getBigDecimal(StmConstant.NCKD_DMTEAMMEM) != null ? obj.getBigDecimal(StmConstant.NCKD_DMTEAMMEM) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_DMOTHER) != null ? obj.getBigDecimal(StmConstant.NCKD_DMOTHER) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_PROFMGR) != null ? obj.getBigDecimal(StmConstant.NCKD_PROFMGR) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_NONDIRONPOST) != null ? obj.getBigDecimal(StmConstant.NCKD_NONDIRONPOST) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_OFFPOST) != null ? obj.getBigDecimal(StmConstant.NCKD_OFFPOST) : java.math.BigDecimal.ZERO);
+
+                        /*15+21+25+29
+                        工资总额:nckd_totalwage
+                        直管干部(其他):nckd_dmotherttotal
+                        职业经理人:nckd_profmgrtotal
+                        非直管干部在岗职工工资:nckd_nondirwgbgt*/
+                        onpStWg = onpStWg.add(obj.getBigDecimal(StmConstant.NCKD_TOTALWAGE) != null ? obj.getBigDecimal(StmConstant.NCKD_TOTALWAGE) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_DMOTHERTTOTAL) != null ? obj.getBigDecimal(StmConstant.NCKD_DMOTHERTTOTAL) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_PROFMGRTOTAL) != null ? obj.getBigDecimal(StmConstant.NCKD_PROFMGRTOTAL) : java.math.BigDecimal.ZERO)
+                                .add(obj.getBigDecimal(StmConstant.NCKD_NONDIRWGBGT) != null ? obj.getBigDecimal(StmConstant.NCKD_NONDIRWGBGT) : java.math.BigDecimal.ZERO);
+
+                        /*30
+                        不在岗职工:nckd_offpostbgt*/
+                        offpStLiv = offpStLiv.add(obj.getBigDecimal(StmConstant.NCKD_OFFPOSTBGT) != null ? obj.getBigDecimal(StmConstant.NCKD_OFFPOSTBGT) : java.math.BigDecimal.ZERO);
+
+                        String payUnitName = obj.getString(String.join(".", StmConstant.NCKD_PAYUNIT, FormConstant.NAME_KEY));
+                        payUnitNameJoin.add(payUnitName);
+                    }
+                    this.getView().showSuccessNotification(StrFormatter.format("成功加载单位工资总额【{}】数据!", payUnitNameJoin.toString()));
+                }
+
+                // 设置汇总值到界面
+                this.getModel().setValue(StmConstant.NCKD_ONPSTNUM, onpStNum);
+                this.getModel().setValue(StmConstant.NCKD_ONPSTWG, onpStWg);
+                this.getModel().setValue(StmConstant.NCKD_OFFPSTLIV, offpStLiv);
+                this.getView().updateView(StmConstant.NCKD_ONPSTNUM);
+                this.getView().updateView(StmConstant.NCKD_ONPSTWG);
+                this.getView().updateView(StmConstant.NCKD_OFFPSTLIV);
+
+            }
+        }
+    }
+
+
+    private void loadData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPTTLWGBGTADJ_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 清理现有数据
+                clearExistingData();
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(DateUtil.toLocalDateTime(year));
+                LocalDateTime endOfYear = DateUtil.endOfYear(DateUtil.toLocalDateTime(year));
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.GRPTTLWGBGTSUB_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团工资总额预算申报\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.GRPTTLWGBGTSUB_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到\"集团工资总额预算申报\"数据!");
+                    return;
+                }
+
+                copyBudgetData(load[0]);
+                DynamicObject dynamicObject = EntityHelper.newEntity(StmConstant.GRPTTLWGBGTSUB_ENTITYID, load[0].getLong(StmConstant.ID_KEY));
+                this.getModel().setValue(StmConstant.GRPTTLWGBGTSUB_ENTITYID, dynamicObject);
+                this.getView().showSuccessNotification("数据加载成功!");
+            }
+        }
+    }
+
+    /**
+     * 加载上年度执行情况
+      * @param 
+     * @return: void
+     * @author W.Y.C
+     * @date: 2025/12/14 18:59
+     */
+    private void loadLastData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.GRPTTLWGBGTSUB_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            if (year != null) {
+                // 清理现有数据
+                DataEntityPropertyCollection currentProperties = this.getModel().getDataEntityType().getProperties();
+                for (IDataEntityProperty property : currentProperties) {
+                    String name = property.getName();
+                    if (name.indexOf("nckd_") > -1 && (name.endsWith("lya") || name.endsWith("lye"))) {
+                        this.getModel().setValue(name, null);
+                    }
+                }
+                //ad -> lay
+                //ex -> lye
+
+
+                LocalDateTime lastYear = DateUtil.minusYears(DateUtil.toLocalDateTime(year), 1);
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(lastYear);
+                LocalDateTime endOfYear = DateUtil.endOfYear(lastYear);
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.GRPTTLWGBGTEXEC_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到上年度\"集团工资总额执行情况\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.GRPTTLWGBGTEXEC_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】未加载到上年度\"集团工资总额执行情况\"数据!");
+                    return;
+                }
+
+                DataEntityPropertyCollection properties = load[0].getDynamicObjectType().getProperties();
+                for (IDataEntityProperty property : properties) {
+                    String name = property.getName();
+                    if (name.indexOf("nckd_") > -1  && (name.endsWith("ad") || name.endsWith("ex"))) {
+                        String currentName = name.replace("ad", "lya").replace("ex", "lye");
+                        if(this.getModel().getDataEntityType().getProperties().containsKey(currentName)) {
+                            this.getModel().setValue(currentName, load[0].get(name));
+                        }
+                    }
+                }
+                this.getView().showSuccessNotification("成功加载上年度\"集团工资总额执行情况\"数据!");
+            }
+        }
+    }
+
+    // 提取清理数据逻辑
+    private void clearExistingData() {
+        DataEntityPropertyCollection properties = this.getModel().getDataEntityType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name) && !name.endsWith("ad") && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, null);
+            }
+        }
+    }
+
+    // 提取复制数据逻辑
+    private void copyBudgetData(DynamicObject source) {
+        DataEntityPropertyCollection properties = source.getDynamicObjectType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name) && !name.endsWith("ad") && !name.endsWith("ex") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                this.getModel().setValue(name, source.get(name));
+            }
+        }
+    }
+}

+ 37 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/unitst/UnitStBudgetAdjustFormPlugin.java

@@ -0,0 +1,37 @@
+package nckd.jxccl.swc.stm.plugin.form.unitst;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+/**
+* 单位工资总额预算申报调整
+* 实体标识:nckd_unitstbudgetadjust
+* @author W.Y.C
+* @date 2025/12/11 14:43
+* @version 1.0
+*/
+public class UnitStBudgetAdjustFormPlugin extends AbstractFormPlugin implements Plugin {
+
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(e.getOperationResult() != null && e.getOperationResult().isSuccess()){
+            String operateKey = e.getOperateKey();
+            if(operateKey.equalsIgnoreCase(StmConstant.SUBMITEFFECT_OP)){
+                if(formId.equalsIgnoreCase(StmConstant.UNITSTBUDGETADJUST_ENTITYID)) {
+                    this.getView().showSuccessNotification("回写”单位工资总额预算申报“成功!");
+                }
+            }
+        }
+    }
+
+
+
+
+
+}

+ 218 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/unitst/UnitStBudgetApplyFormPlugin.java

@@ -0,0 +1,218 @@
+package nckd.jxccl.swc.stm.plugin.form.unitst;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+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.base.common.utils.StrFormatter;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.swc.mas.common.MasConstant;
+import nckd.jxccl.swc.stm.business.StmService;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+* 单位工资总额预算申报
+* 实体标识:nckd_unitstbudgetapply
+* @author W.Y.C
+* @date 2025/12/9 16:44
+* @version 1.0
+*/
+public class UnitStBudgetApplyFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        String fieldKey = e.getProperty().getName();
+        ChangeData[] changeSet = e.getChangeSet();
+        Object oldValue = changeSet[0].getOldValue();
+        Object newValue = changeSet[0].getNewValue();
+        if (Stream.of(StmConstant.NCKD_YEAR,  StmConstant.NCKD_PAYUNIT)
+                .anyMatch(op -> op.equalsIgnoreCase(fieldKey))) {
+            if(StmConstant.NCKD_PAYUNIT.equalsIgnoreCase(fieldKey)){
+                if(!Objects.equals(oldValue, newValue) && newValue != null){
+                    int count = StmService.countCorpNum(ConvertUtil.toDynamicObject(newValue));
+                    this.getModel().setValue(StmConstant.NCKD_MGTELEFIRMCOUNT,count);
+                }
+            }
+            if(!Objects.equals(oldValue, newValue)){
+                loadData();
+            }
+
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        if(e.getOperationResult() != null && e.getOperationResult().isSuccess()){
+            String operateKey = e.getOperateKey();
+            if("loadsubucybgtot".equalsIgnoreCase(operateKey)){
+                Date year = this.getModel().getDataEntity(true).getDate(StmConstant.NCKD_YEAR);
+                DynamicObject payUnit = this.getModel().getDataEntity(true).getDynamicObject(StmConstant.NCKD_PAYUNIT);
+                if(year == null || payUnit == null){
+                    this.getView().showErrorNotification("请先填写“年度”和“填报单位”");
+                    return;
+                }
+                //载入直属下级单位本年度预算数合计
+                MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType(StmConstant.UNITSTBUDGETAPPLY_ENTITYID);
+                Set<String> allFields = mainEntityType.getAllFields().keySet();
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create();
+                for (String field : allFields) {
+                    if (field.startsWith("nckd_") && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(field))) {
+                        queryFieldBuilder.add(field);
+                    }
+                }
+                queryFieldBuilder.add(String.join( ".", StmConstant.NCKD_PAYUNIT, FormConstant.NAME_KEY));
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(year);
+                LocalDateTime endOfYear = DateUtil.endOfYear(year);
+                QFilter qFilter = new QFilter(String.join(".",StmConstant.NCKD_PAYUNIT, FormConstant.PARENTORG_KEY, FormConstant.ID_KEY), QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                        .and(StmConstant.NCKD_YEAR,QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR,QCP.less_equals,  DateUtil.toDate(endOfYear))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+                DynamicObjectCollection query = QueryServiceHelper.query(StmConstant.UNITSTBUDGETAPPLY_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter});
+                // 对查询结果按照buildSelectArray()中的字段进行汇总
+                String[] summaryFields = queryFieldBuilder.buildSelectArray();
+                Map<String, BigDecimal> summaryMap = new HashMap<>();
+                String payUnitNames = "";
+                if (!query.isEmpty()) {
+                    // 初始化汇总值
+                    for (String field : summaryFields) {
+                        if (field.startsWith("nckd_")
+                                && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(field))) {
+                            // 数值字段汇总
+                            java.math.BigDecimal sumValue = query.stream()
+                                    .map(obj -> obj.get(field))
+                                    .filter(Objects::nonNull)
+                                    .map(value -> new java.math.BigDecimal(value.toString()))
+                                    .reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add);
+                            summaryMap.put(field, sumValue);
+                        }
+                    }
+                    // 获取所有payunit名称并去重,然后用中文逗号连接
+                    payUnitNames = query.stream()
+                            .map(obj -> obj.getString(String.join(".", StmConstant.NCKD_PAYUNIT, FormConstant.NAME_KEY)))
+                            .filter(Objects::nonNull)
+                            .distinct()
+                            .collect(Collectors.joining(","));
+                }else{
+                    this.getView().showTipNotification(StrFormatter.format("【{}】直属下级单位没有【{}】年度预算数据", payUnit.getString(FormConstant.NAME_KEY),beginOfYear.getYear()));
+                }
+                if(!summaryMap.isEmpty()) {
+                    List<String> summaryList = new ArrayList<>();
+                    for (Map.Entry<String, BigDecimal> summaryEntry : summaryMap.entrySet()) {
+                        //汇总字段不赋值
+                        if (StmConstant.IGNORE_SUMMARY_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(summaryEntry.getKey()))) {
+                            this.getModel().setValue(summaryEntry.getKey(), summaryEntry.getValue());
+                        }
+                    }
+
+                    this.getView().showSuccessNotification(StrFormatter.format("成功加载直属下级组织【{}】数据!",payUnitNames));
+                }
+            }
+        }
+    }
+
+
+    private void loadData(){
+        BillShowParameter showParameter = (BillShowParameter) this.getView().getFormShowParameter();
+        String formId = showParameter.getFormId();
+        if(formId.equalsIgnoreCase(StmConstant.UNITSTBUDGETADJUST_ENTITYID) || formId.equalsIgnoreCase(StmConstant.UNITSTSETTLEMENT_ENTITYID)) {
+            Date year = this.getModel().getDataEntity(true).getDate(MasConstant.NCKD_YEAR);
+            DynamicObject payUnit = this.getModel().getDataEntity(true).getDynamicObject(MasConstant.NCKD_PAYUNIT);
+            if (year != null && payUnit != null) {
+                // 清理现有数据
+                clearExistingData();
+
+                // 加载同年度同单位的预算申报数据
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .orderDesc(FormConstant.CREATE_TIME_KEY);
+
+                LocalDateTime beginOfYear = DateUtil.beginOfYear(DateUtil.toLocalDateTime(year));
+                LocalDateTime endOfYear = DateUtil.endOfYear(DateUtil.toLocalDateTime(year));
+
+                QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals, DateUtil.toDate(beginOfYear))
+                        .and(StmConstant.NCKD_YEAR, QCP.less_equals, DateUtil.toDate(endOfYear))
+                        .and(String.join(",", StmConstant.NCKD_PAYUNIT, FormConstant.ID_KEY), QCP.equals, payUnit.getLong(FormConstant.ID_KEY))
+                        .and(QFilterCommonHelper.getBillStatusFilter());
+
+                DynamicObjectCollection unitStBudgetApplyColl = QueryServiceHelper.query(
+                        StmConstant.UNITSTBUDGETAPPLY_ENTITYID,
+                        queryFieldBuilder.buildSelect(),
+                        new QFilter[]{qFilter},
+                        queryFieldBuilder.buildOrder());
+
+                if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】、【填报单位】未加载到\"单位工资总额预算申报\"数据!");
+                    return;
+                }
+
+                DynamicObject unitStBudgetApply = unitStBudgetApplyColl.get(0);
+                long id = unitStBudgetApply.getLong(FormConstant.ID_KEY);
+                MainEntityType entityType = EntityMetadataCache.getDataEntityType(StmConstant.UNITSTBUDGETAPPLY_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(new Long[]{id}, entityType);
+
+                if (load == null || load.length == 0) {
+                    this.getView().showTipNotification("未加载到数据,根据【年度】、【填报单位】未加载到\"单位工资总额预算申报\"数据!");
+                    return;
+                }
+
+                copyBudgetData(load[0]);
+                DynamicObject dynamicObject = EntityHelper.newEntity(StmConstant.UNITSTBUDGETAPPLY_ENTITYID, load[0].getLong(StmConstant.ID_KEY));
+                this.getModel().setValue(StmConstant.UNITSTBUDGETAPPLY_ENTITYID, dynamicObject);
+                this.getView().showSuccessNotification("数据加载成功!");
+            }
+        }
+    }
+
+
+
+    // 提取清理数据逻辑
+    private void clearExistingData() {
+        DataEntityPropertyCollection properties = this.getModel().getDataEntityType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name+"ls")) {
+                this.getModel().setValue(name+"ls", null);
+            }
+        }
+    }
+
+    // 提取复制数据逻辑
+    private void copyBudgetData(DynamicObject source) {
+        DataEntityPropertyCollection properties = source.getDynamicObjectType().getProperties();
+        for (IDataEntityProperty property : properties) {
+            String name = property.getName();
+            if (name.indexOf("nckd_") > -1 && this.getModel().getDataEntityType().getProperties().containsKey(name+"ls")) {
+                this.getModel().setValue(name+"ls", source.get(name));
+            }
+        }
+    }
+}

+ 100 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/grpttlwg/BackGrpHqTtlWgGgtSubOpPlugin.java

@@ -0,0 +1,100 @@
+package nckd.jxccl.swc.stm.plugin.operate.grpttlwg;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.MetadataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.exception.ValidationException;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+* 集团本部工资总额预算申报调整-回调
+* 实体标识:nckd_grphqttlwgbgtadj
+* @author W.Y.C
+* @date 2025/12/11 15:38
+* @version 1.0
+*/
+public class BackGrpHqTtlWgGgtSubOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        MainEntityType billEntityType = this.billEntityType;
+        if(billEntityType.getName().equalsIgnoreCase(StmConstant.GRPHQTTLWGBGTADJ_ENTITYID)) {
+            List<Long> grpTtlWgBgtSubIds = new ArrayList<>();
+            for (DynamicObject dataEntity : e.getDataEntities()) {
+
+                DynamicObject grpTtlWgBgtSub = dataEntity.getDynamicObject(StmConstant.GRPHQTTLWGBGTSU_ENTITYID);
+                grpTtlWgBgtSubIds.add(grpTtlWgBgtSub.getLong(FormConstant.ID_KEY));
+            }
+            Map<Long, DynamicObject> grpTtlWgBgtSubMap = new HashMap<>(grpTtlWgBgtSubIds.size());
+            if (!grpTtlWgBgtSubIds.isEmpty()) {
+                MainEntityType dataEntityType = MetadataServiceHelper.getDataEntityType(StmConstant.GRPHQTTLWGBGTSU_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(grpTtlWgBgtSubIds.toArray(new Long[0]), dataEntityType);
+                grpTtlWgBgtSubMap = Arrays.stream(load)
+                        .collect(Collectors.toMap(
+                                obj -> obj.getLong(FormConstant.ID_KEY),
+                                obj -> obj
+                        ));
+            }
+
+            List<DynamicObject> saveGrpTtlWgBgtSub = new ArrayList<>(grpTtlWgBgtSubIds.size());
+            for (DynamicObject dataEntity : e.getDataEntities()) {
+                DynamicObject grpTtlWgBgtSub = dataEntity.getDynamicObject(StmConstant.GRPHQTTLWGBGTSU_ENTITYID);
+                DynamicObject dbGrpTtlWgBgtSub = grpTtlWgBgtSubMap.get(grpTtlWgBgtSub.getLong(FormConstant.ID_KEY));
+                DataEntityPropertyCollection properties = dataEntity.getDataEntityType().getProperties();
+                for (IDataEntityProperty property : properties) {
+                    String name = property.getName();
+                    if (name.startsWith("nckd_")
+                            && name.endsWith("ad")
+                            && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                        dbGrpTtlWgBgtSub.set(name.replace("ad", ""), dataEntity.get(name));
+                    }
+                }
+                saveGrpTtlWgBgtSub.add(dbGrpTtlWgBgtSub);
+            }
+
+            //调用“集团工资总额预算”保存
+            OperateOption option = OperateOption.create();
+            //修改和删除不校验是否是暂存状态(只能修改暂存的数据。只能删除暂存的数据。)
+            option.setVariableValue("forceNoAudit", "true");
+            // 执行保存操作
+            OperationResult saveResult = SaveServiceHelper.saveOperate(StmConstant.GRPHQTTLWGBGTSU_ENTITYID, saveGrpTtlWgBgtSub.toArray(new DynamicObject[0]), option);
+            if (saveResult != null && !saveResult.isSuccess()) {
+                StringJoiner errorMsg = new StringJoiner(";");
+                for (IOperateInfo error : saveResult.getAllErrorOrValidateInfo()) {
+                    errorMsg.add(error.getMessage());
+                }
+                if (!ObjectUtils.isEmpty(saveResult.getMessage())) {
+                    errorMsg.add(saveResult.getMessage());
+                }
+                throw new ValidationException(StrFormatter.format("回写【{}】失败,原因:{}", "集团工资总额预算", errorMsg.toString()));
+            }
+        }
+    }
+}

+ 100 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/grpttlwg/BackGrpTtlWgGgtSubOpPlugin.java

@@ -0,0 +1,100 @@
+package nckd.jxccl.swc.stm.plugin.operate.grpttlwg;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.MetadataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.exception.ValidationException;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+* 集团工资总额预算调整-回调
+* 实体标识:nckd_unitstbudgetadjust
+* @author W.Y.C
+* @date 2025/12/11 15:38
+* @version 1.0
+*/
+public class BackGrpTtlWgGgtSubOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        MainEntityType billEntityType = this.billEntityType;
+        if(billEntityType.getName().equalsIgnoreCase(StmConstant.GRPTTLWGBGTADJ_ENTITYID)) {
+            List<Long> grpTtlWgBgtSubIds = new ArrayList<>();
+            for (DynamicObject dataEntity : e.getDataEntities()) {
+
+                DynamicObject grpTtlWgBgtSub = dataEntity.getDynamicObject(StmConstant.GRPTTLWGBGTSUB_ENTITYID);
+                grpTtlWgBgtSubIds.add(grpTtlWgBgtSub.getLong(FormConstant.ID_KEY));
+            }
+            Map<Long, DynamicObject> grpTtlWgBgtSubMap = new HashMap<>(grpTtlWgBgtSubIds.size());
+            if (!grpTtlWgBgtSubIds.isEmpty()) {
+                MainEntityType dataEntityType = MetadataServiceHelper.getDataEntityType(StmConstant.GRPTTLWGBGTSUB_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(grpTtlWgBgtSubIds.toArray(new Long[0]), dataEntityType);
+                grpTtlWgBgtSubMap = Arrays.stream(load)
+                        .collect(Collectors.toMap(
+                                obj -> obj.getLong(FormConstant.ID_KEY),
+                                obj -> obj
+                        ));
+            }
+
+            List<DynamicObject> saveGrpTtlWgBgtSub = new ArrayList<>(grpTtlWgBgtSubIds.size());
+            for (DynamicObject dataEntity : e.getDataEntities()) {
+                DynamicObject grpTtlWgBgtSub = dataEntity.getDynamicObject(StmConstant.GRPTTLWGBGTSUB_ENTITYID);
+                DynamicObject dbGrpTtlWgBgtSub = grpTtlWgBgtSubMap.get(grpTtlWgBgtSub.getLong(FormConstant.ID_KEY));
+                DataEntityPropertyCollection properties = dataEntity.getDataEntityType().getProperties();
+                for (IDataEntityProperty property : properties) {
+                    String name = property.getName();
+                    if (name.startsWith("nckd_")
+                            && name.endsWith("ad")
+                            && StmConstant.IGNORE_FIELDS.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(name))) {
+                        dbGrpTtlWgBgtSub.set(name.replace("ad", ""), dataEntity.get(name));
+                    }
+                }
+                saveGrpTtlWgBgtSub.add(dbGrpTtlWgBgtSub);
+            }
+
+            //调用“集团工资总额预算”保存
+            OperateOption option = OperateOption.create();
+            //修改和删除不校验是否是暂存状态(只能修改暂存的数据。只能删除暂存的数据。)
+            option.setVariableValue("forceNoAudit", "true");
+            // 执行保存操作
+            OperationResult saveResult = SaveServiceHelper.saveOperate(StmConstant.GRPTTLWGBGTSUB_ENTITYID, saveGrpTtlWgBgtSub.toArray(new DynamicObject[0]), option);
+            if (saveResult != null && !saveResult.isSuccess()) {
+                StringJoiner errorMsg = new StringJoiner(";");
+                for (IOperateInfo error : saveResult.getAllErrorOrValidateInfo()) {
+                    errorMsg.add(error.getMessage());
+                }
+                if (!ObjectUtils.isEmpty(saveResult.getMessage())) {
+                    errorMsg.add(saveResult.getMessage());
+                }
+                throw new ValidationException(StrFormatter.format("回写【{}】失败,原因:{}", "集团工资总额预算", errorMsg.toString()));
+            }
+        }
+    }
+}

+ 66 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/grpttlwg/GrpTtlWgGgtSubSaveOpPlugin.java

@@ -0,0 +1,66 @@
+package nckd.jxccl.swc.stm.plugin.operate.grpttlwg;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.entity.validate.BillStatus;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+/**
+* 集团工资总额预算申报调整-保存
+* 实体标识:nckd_grpttlwgbgtadj
+* @author W.Y.C
+* @date 2025/12/13 13:06
+* @version 1.0
+*/
+public class GrpTtlWgGgtSubSaveOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        e.addValidator(new AbstractValidator() {
+
+            @Override
+            public void validate() {
+                String entityKey = this.entityKey;
+                if(entityKey.equalsIgnoreCase(StmConstant.GRPTTLWGBGTADJ_ENTITYID)) {
+                    for (ExtendedDataEntity dataEntity : this.getDataEntities()) {
+                        DynamicObject data = dataEntity.getDataEntity();
+                        long id = data.getLong(FormConstant.ID_KEY);
+                        DynamicObject unitStBudgetApply = data.getDynamicObject(StmConstant.GRPTTLWGBGTSUB_ENTITYID);
+                        if (unitStBudgetApply != null) {
+                            // 校验有没有暂存或进行中的调整单
+                            QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                                    .add(FormConstant.BILL_NO_KEY);
+                            QFilter filter = new QFilter(FormConstant.BILL_STATUS_KEY, QCP.not_equals, BillStatus.C.toString())
+                                    .and(String.join(".", StmConstant.GRPTTLWGBGTSUB_ENTITYID, FormConstant.ID_KEY), QCP.in, unitStBudgetApply.getLong(FormConstant.ID_KEY));
+                            if (id > 0) {
+                                filter.and(FormConstant.ID_KEY, QCP.not_equals, id);
+                            }
+                            DynamicObjectCollection query = QueryServiceHelper.query(StmConstant.GRPTTLWGBGTADJ_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{filter});
+                            if (!query.isEmpty()) {
+                                String number = query.get(0).getString(FormConstant.BILL_NO_KEY);
+                                this.addFatalErrorMessage(dataEntity, StrFormatter.format("已存在暂存或进行中的调整单【单据号:{}】,请勿重复申请。", number));
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+}

+ 101 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/unitst/BackUnitStBudgetOpPlugin.java

@@ -0,0 +1,101 @@
+package nckd.jxccl.swc.stm.plugin.operate.unitst;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.MetadataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.exception.ValidationException;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+* 回写单位工资总额-保存
+* 实体标识:nckd_unitstbudgetadjust
+* @author W.Y.C
+* @date 2025/12/11 15:38
+* @version 1.0
+*/
+public class BackUnitStBudgetOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        MainEntityType billEntityType = this.billEntityType;
+        if(billEntityType.getName().equalsIgnoreCase(StmConstant.UNITSTBUDGETADJUST_ENTITYID)) {
+            List<Long> unitStBudgetApplyIds = new ArrayList<>();
+            for (DynamicObject dataEntity : e.getDataEntities()) {
+                DynamicObject unitStBudgetApply = dataEntity.getDynamicObject(StmConstant.UNITSTBUDGETAPPLY_ENTITYID);
+                unitStBudgetApplyIds.add(unitStBudgetApply.getLong(FormConstant.ID_KEY));
+            }
+            Map<Long, DynamicObject> unitStBudgetApplyMap = new HashMap<>(unitStBudgetApplyIds.size());
+            if (!unitStBudgetApplyIds.isEmpty()) {
+                MainEntityType dataEntityType = MetadataServiceHelper.getDataEntityType(StmConstant.UNITSTBUDGETAPPLY_ENTITYID);
+                DynamicObject[] load = BusinessDataServiceHelper.load(unitStBudgetApplyIds.toArray(new Long[0]), dataEntityType);
+                unitStBudgetApplyMap = Arrays.stream(load)
+                        .collect(Collectors.toMap(
+                                obj -> obj.getLong(FormConstant.ID_KEY),
+                                obj -> obj
+                        ));
+            }
+
+            List<DynamicObject> saveUnitStBudgetApply = new ArrayList<>(unitStBudgetApplyIds.size());
+            for (DynamicObject dataEntity : e.getDataEntities()) {
+                DynamicObject unitStBudgetApply = dataEntity.getDynamicObject(StmConstant.UNITSTBUDGETAPPLY_ENTITYID);
+                DynamicObject dbUnitStBudgetApply = unitStBudgetApplyMap.get(unitStBudgetApply.getLong(FormConstant.ID_KEY));
+                DataEntityPropertyCollection properties = dataEntity.getDataEntityType().getProperties();
+                for (IDataEntityProperty property : properties) {
+                    String name = property.getName();
+                    if (name.startsWith("nckd_")
+                            && !name.endsWith("ls")
+                            && !name.contains("nckd_year")
+                            && !name.contains("nckd_payunit")
+                            && !name.contains("nckd_unitstbudgetapply")) {
+                        dbUnitStBudgetApply.set(name, dataEntity.get(name));
+                    }
+                }
+                saveUnitStBudgetApply.add(dbUnitStBudgetApply);
+            }
+
+            //调用“单位工资总额预算申报”保存
+            OperateOption option = OperateOption.create();
+            //修改和删除不校验是否是暂存状态(只能修改暂存的数据。只能删除暂存的数据。)
+            option.setVariableValue("forceNoAudit", "true");
+            // 执行保存操作
+            OperationResult saveResult = SaveServiceHelper.saveOperate(StmConstant.UNITSTBUDGETAPPLY_ENTITYID, saveUnitStBudgetApply.toArray(new DynamicObject[0]), option);
+            if (saveResult != null && !saveResult.isSuccess()) {
+                StringJoiner errorMsg = new StringJoiner(";");
+                for (IOperateInfo error : saveResult.getAllErrorOrValidateInfo()) {
+                    errorMsg.add(error.getMessage());
+                }
+                if (!ObjectUtils.isEmpty(saveResult.getMessage())) {
+                    errorMsg.add(saveResult.getMessage());
+                }
+                throw new ValidationException(StrFormatter.format("回写【{}】失败,原因:{}", "单位工资总额预算申报", errorMsg.toString()));
+            }
+        }
+    }
+}

+ 63 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/unitst/UnitStBudgetAdjustSaveOpPlugin.java

@@ -0,0 +1,63 @@
+package nckd.jxccl.swc.stm.plugin.operate.unitst;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.entity.validate.BillStatus;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+/**
+* 单位工资总额预算申报调整-保存操作插件
+* 实体标识:nckd_unitstbudgetadjust
+* @author W.Y.C
+* @date 2025/12/11 16:15
+* @version 1.0
+*/
+public class UnitStBudgetAdjustSaveOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        e.addValidator(new AbstractValidator() {
+
+            @Override
+            public void validate() {
+                for (ExtendedDataEntity dataEntity : this.getDataEntities()) {
+                    DynamicObject data = dataEntity.getDataEntity();
+                    long id = data.getLong(FormConstant.ID_KEY);
+                    DynamicObject unitStBudgetApply = data.getDynamicObject(StmConstant.UNITSTBUDGETAPPLY_ENTITYID);
+                    if(unitStBudgetApply != null) {
+                        // 校验有没有暂存或进行中的调整单
+                        QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                                .add(FormConstant.BILL_NO_KEY);
+                        QFilter filter = new QFilter(FormConstant.BILL_STATUS_KEY, QCP.not_equals, BillStatus.C.toString())
+                                .and(String.join(".", StmConstant.UNITSTBUDGETAPPLY_ENTITYID, FormConstant.ID_KEY), QCP.in, unitStBudgetApply.getLong(FormConstant.ID_KEY));
+                        if (id > 0) {
+                            filter.and(FormConstant.ID_KEY, QCP.not_equals, id);
+                        }
+                        DynamicObjectCollection query = QueryServiceHelper.query(StmConstant.UNITSTBUDGETADJUST_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{filter});
+                        if (!query.isEmpty()) {
+                            String number = query.get(0).getString(FormConstant.BILL_NO_KEY);
+                            this.addFatalErrorMessage(dataEntity,StrFormatter.format("已存在暂存或进行中的调整单【单据号:{}】,请勿重复申请。", number));
+                        }
+                    }
+                }
+            }
+        });
+    }
+}

+ 57 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/operate/unitst/UnitStBudgetAdjustSubmitEffectOpPlugin.java

@@ -0,0 +1,57 @@
+package nckd.jxccl.swc.stm.plugin.operate.unitst;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.exception.ValidationException;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.swc.stm.common.StmConstant;
+
+import java.util.StringJoiner;
+
+/**
+* 单位工资总额预算申报调整-提交生效插件
+* 实体标识:nckd_unitstbudgetadjust
+* @author W.Y.C
+* @date 2025/12/11 16:15
+* @version 1.0
+*/
+public class UnitStBudgetAdjustSubmitEffectOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            OperateOption option = OperateOption.create();
+            OperationResult result = OperationServiceHelper.executeOperate(
+                    "backunitstbudget",
+                    StmConstant.UNITSTBUDGETADJUST_ENTITYID,
+                    new DynamicObject[]{dataEntity},
+                    option
+            );
+
+            if (result != null && !result.isSuccess()) {
+                StringJoiner errorMsg = new StringJoiner(";");
+                for (IOperateInfo error : result.getAllErrorOrValidateInfo()) {
+                    errorMsg.add(error.getMessage());
+                }
+                if (!ObjectUtils.isEmpty(result.getMessage())) {
+                    errorMsg.add(result.getMessage());
+                }
+                throw new ValidationException(StrFormatter.format("回写【{}】失败,原因:{}","单位工资总额预算申报",errorMsg.toString()));
+            }
+        }
+    }
+}

+ 0 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/other/.gitkeep


+ 0 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/report/.gitkeep


+ 0 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/workflow/.gitkeep


+ 0 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/webapi/.gitkeep