Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

彭佳杰 4 dienas atpakaļ
vecāks
revīzija
492cb9c591
36 mainītis faili ar 685 papildinājumiem un 207 dzēšanām
  1. 7 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
  2. 60 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/enums/ijp/TalentTypeEnum.java
  3. 11 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/DateUtil.java
  4. 1 1
      code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/SWCHelper.java
  5. 4 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/common/transfer/TransferApplyBillConstant.java
  6. 15 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/plugin/form/transfer/TransferApplyBillFormPlugin.java
  7. 32 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/plugin/form/transfer/TransferApplyBillListPlugin.java
  8. 15 37
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/business/application/event/GenerateEmploymentContractEventServicePlugin.java
  9. 10 10
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/common/application/event/GECEventConstant.java
  10. 15 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hspm/common/TitleSkillAppointConstant.java
  11. 41 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hspm/plugin/operate/tsapp/TitleSkillAppointEffectOpPlugin.java
  12. 58 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/common/IntJobPostConstant.java
  13. 258 1
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostAuditedOpPlugin.java
  14. 0 4
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/contribution/ContribBillOpPlugin.java
  15. 87 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsBasePlugin.java
  16. 1 1
      code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/form/ExaminProjectResultListPlugin.java
  17. 19 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/agencybill/AgencyBillEdit.java
  18. 4 3
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/SubCoHeadServiceListPlugin.java
  19. 4 3
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/TenurePersonListListPlugin.java
  20. 4 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/AbstractIncentiveApprFormPlugin.java
  21. 4 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/EntldrTermBonusApprFormPlugin.java
  22. 17 5
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/EntleaderAnlSalStdFormPlugin.java
  23. 14 5
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/SubcorpChiefSalStdFormPlugin.java
  24. 4 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/change/AbstractSalaryStdChgFormPlugin.java
  25. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/business/.gitkeep
  26. 0 22
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/common/AppflgConstant.java
  27. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/mservice/.gitkeep
  28. 0 38
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/mservice/WTPCustomerService.java
  29. 0 36
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/mservice/api/IWTPCustomerService.java
  30. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/form/.gitkeep
  31. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/operate/.gitkeep
  32. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/other/.gitkeep
  33. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/report/.gitkeep
  34. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/workflow/.gitkeep
  35. 0 35
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/servicehelper/ServiceFactory.java
  36. 0 0
      code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/webapi/.gitkeep

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

@@ -81,6 +81,8 @@ public class FormConstant {
     public static final String HDM_TRANSFERBATCH = "hdm_transferbatch";
     /** 事务变动记录-实体标识 */
     public static final String HPFS_CHGRECORD = "hpfs_chgrecord";
+    /** 变动操作-实体标识 */
+    public static final String HPFS_CHGACTION_ENTITY = "hpfs_chgaction";
     /** 组织-实体标识 */
     public static final String BOS_ORG_ENTITY = "bos_org";
     /** HR组织 */
@@ -119,6 +121,8 @@ public class FormConstant {
     public static final String HSBS_CALFREQUENCY = "hsbs_calfrequency";
     /** 考核结果实体标识 */
     public static final String NCKD_APPRAISALRESULT = "nckd_appraisalresult";
+    /** 政策公告实体标识 */
+    public static final String NCKD_ANNOUNCEMENTS = "nckd_announcements";
     /**
      * 定调薪类型 默认值  用于  定调薪清单处理
      * */
@@ -508,6 +512,9 @@ public class FormConstant {
     /** 上级组织 */
     public static final String PARENTORG_KEY = "parentorg";
 
+    /** 上级 */
+    public static final String PARENT_KEY = "parent";
+
     /** 变动操作 */
     public static final String AFFACTION_KEY = "affaction";
     /** 别名 */

+ 60 - 0
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/enums/ijp/TalentTypeEnum.java

@@ -0,0 +1,60 @@
+package nckd.jxccl.base.common.enums.ijp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+* 【内部人力资源市场】-人员类别
+* @author W.Y.C
+* @date 2025/7/14 14:25
+* @version 1.0
+*/
+public enum TalentTypeEnum {
+
+    /*优秀员工	A
+    富余员工	B
+    绩效末等员工	C*/
+    /*优秀员工*/
+    EXCELLENT_EMPLOYEE("A", "优秀员工"),
+    /*富余员工*/
+    RICH_EMPLOYEE("B", "富余员工"),
+    /*绩效末等员工*/
+    PERFORMANCE_LAST_EMPLOYEE("C", "绩效末等员工");
+    private final String code;
+    private final String name;
+
+    TalentTypeEnum(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    private static final Map<String, TalentTypeEnum> CODE_MAP = new HashMap<>();
+
+    static {
+        for (TalentTypeEnum value : TalentTypeEnum.values()) {
+            CODE_MAP.put(value.code, value);
+        }
+    }
+
+    /**
+     * 根据编码获取枚举
+     * @param code 编码
+     * @return: nckd.jxccl.base.common.enums.AppraisalResultEnum
+     * @author W.Y.C
+     * @date: 2025/09/11 14:39
+     */
+    public static TalentTypeEnum getByCode(String code) {
+        if (code == null) {
+            return null;
+        }
+        return CODE_MAP.get(code);
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

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

@@ -156,6 +156,17 @@ public class DateUtil {
         return dateTime.plusYears(years);
     }
 
+    /**
+     * 加年
+     *
+     * @param date 原始日期时间
+     * @param years    要加的年数(可为负数)
+     * @return 计算后的日期时间
+     */
+    public static Date addYears(Date date, int years) {
+        return toDate(addYears(toLocalDateTime(date), years));
+    }
+
     /**
      * 减年
      *

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

@@ -244,7 +244,7 @@ public class SWCHelper {
         QFilter filter = new QFilter("iscurrentdata", QCP.equals, "1"); // 启用
         filter.and(new QFilter("employee.id", QCP.in, employeeId));
 
-        String selectFields1 = "employee.id,adminorg.id,adminorg.belongcompany.id";
+        String selectFields1 = "employee.id,adminorg.id,adminorg.belongcompany.id,company.id";
         DynamicObject[] empposorgreDyns = BusinessDataServiceHelper.load("hrpi_empposorgrel", selectFields1, filter.toArray());
 
         return empposorgreDyns;

+ 4 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/common/transfer/TransferApplyBillConstant.java

@@ -19,6 +19,10 @@ public class TransferApplyBillConstant extends FormConstant {
 
     /** 调动生效后解除合同OP标识 */
     public static final String CANCLECONTRACT_AFTEREFFECT_OP = "canclecontract_aftereffect";
+    /** 二级单位内调动OP标识 */
+    public static final String SECONDARY_UNIT_TRANSFER_OP = "secondary_unit_transfer";
+    /** 跨二级单位调动OP标识 */
+    public static final String CROSS_SECONDARY_UNIT_TRANSFER_OP = "cross_secondary_unit_transfer";
 
     /** 调出公司(业务对象) */
     public static final String BCOMPANYBO_KEY = "bcompanybo";

+ 15 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/plugin/form/transfer/TransferApplyBillFormPlugin.java

@@ -47,6 +47,7 @@ public class TransferApplyBillFormPlugin extends AbstractFormPlugin {
     Log log = LogFactory.getLog(TransferApplyBillFormPlugin.class);
 
     private static final HRBaseServiceHelper transferApplyHelper = HRBaseServiceHelper.create(TransferApplyBillConstant.HDM_TRANSFERAPPLY);
+    private static final HRBaseServiceHelper chgActionHelper = HRBaseServiceHelper.create(TransferApplyBillConstant.HPFS_CHGACTION_ENTITY);
 
     @Override
     public void afterBindData(EventObject e) {
@@ -84,6 +85,20 @@ public class TransferApplyBillFormPlugin extends AbstractFormPlugin {
     public void afterCreateNewData(EventObject e) {
         super.afterCreateNewData(e);
 
+        String operateKey = getView().getFormShowParameter().getCustomParam("OperateKey");
+        if (HRStringUtils.isNotBlank(operateKey)) {
+            switch (operateKey) {
+                case TransferApplyBillConstant.SECONDARY_UNIT_TRANSFER_OP:
+                    // 二级单位内调拨
+                    getModel().setValue(TransferApplyBillConstant.AFFACTION_KEY, chgActionHelper.loadOne(new QFilter[]{new QFilter(TransferApplyBillConstant.NUMBER_KEY, QCP.equals, "1020_JT")}));
+                    break;
+                case TransferApplyBillConstant.CROSS_SECONDARY_UNIT_TRANSFER_OP:
+                    // 跨二级单位调动
+                    getModel().setValue(TransferApplyBillConstant.AFFACTION_KEY, chgActionHelper.loadOne(new QFilter[]{new QFilter(TransferApplyBillConstant.NUMBER_KEY, QCP.equals, "1010_JT")}));
+
+            }
+        }
+
         // 获取当前登录用户
         long currentUserId = UserServiceHelper.getCurrentUserId();
         // 查询最近一笔调动单创建人是该用户的数据

+ 32 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hdm/plugin/form/transfer/TransferApplyBillListPlugin.java

@@ -0,0 +1,32 @@
+package nckd.jxccl.hr.hdm.plugin.form.transfer;
+
+import kd.bos.bill.BillShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.list.plugin.AbstractListPlugin;
+import nckd.jxccl.hr.hdm.common.transfer.TransferApplyBillConstant;
+
+/**
+ *
+ * @entity:
+ * @author: jtd
+ * @date: 2026/1/13 20:05
+ */
+public class TransferApplyBillListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+
+        String operateKey = afterDoOperationEventArgs.getOperateKey();
+        switch (operateKey) {
+            case TransferApplyBillConstant.SECONDARY_UNIT_TRANSFER_OP:
+            case TransferApplyBillConstant.CROSS_SECONDARY_UNIT_TRANSFER_OP:
+                BillShowParameter billShowParameter = new BillShowParameter();
+                billShowParameter.setFormId(TransferApplyBillConstant.HDM_TRANSFERAPPLY);
+                billShowParameter.getOpenStyle().setShowType(ShowType.Modal);
+                billShowParameter.setCustomParam("OperateKey", operateKey);
+                getView().showForm(billShowParameter);
+        }
+    }
+}

+ 15 - 37
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/business/application/event/GenerateEmploymentContractEventServicePlugin.java

@@ -48,29 +48,6 @@ import java.util.stream.Collectors;
  * @date: 2025/11/23 20:56
  */
 public class GenerateEmploymentContractEventServicePlugin implements IEventServicePlugin {
-
-    private enum ContractTypeCatEnum {
-        CON(1366793061547512832L, "1010_S"),
-        EMP(1366793180992898048L, "1020_S"),
-        OTHER(1366793317483942912L, "1030_S");
-
-        String value;
-        long pkId;
-
-        private ContractTypeCatEnum(long pkId, String value) {
-            this.pkId = pkId;
-            this.value = value;
-        }
-
-        public String getValue() {
-            return this.value;
-        }
-
-        public long getPkId() {
-            return this.pkId;
-        }
-    }
-
     private static final Log LOGGER = LogFactory.getLog(GenerateEmploymentContractEventServicePlugin.class);
     /** 入职变动大类ID */
     private static final Long CHGEVENT_ID = 1010L;
@@ -126,21 +103,22 @@ public class GenerateEmploymentContractEventServicePlugin implements IEventServi
     }
 
     private void generateEmploymentContract(List<Long> assignmentIds) throws KDException {
+        LOGGER.info("GenerateEmploymentContractEventServicePlugin assignmentIds: [{}]", assignmentIds);
         // hrpi_assignment.id
         String assignmentIdKey = String.join(".", GECEventConstant.ASSIGNMENT_ENTITYID, GECEventConstant.ID_KEY);
         // 查询字段
         String queryFields = QueryFieldBuilder.create()
-                .add(GECEventConstant.HSPM_PERCONTACT_PHONE)
-                .add(GECEventConstant.HSPM_TRIALPERIOD_PROBATION)
-                .add(GECEventConstant.HSPM_TRIALPERIOD_PROBATIONUNIT)
-                .add(GECEventConstant.HSPM_TRIALPERIOD_PREENDDATE)
-                .add(GECEventConstant.HSPM_TRIALPERIOD_TRIALSTARTDATE)
+                .add(GECEventConstant.HRPI_PERCONTACT_PHONE)
+                .add(GECEventConstant.HRPI_TRIALPERIOD_PROBATION)
+                .add(GECEventConstant.HRPI_TRIALPERIOD_PROBATIONUNIT)
+                .add(GECEventConstant.HRPI_TRIALPERIOD_PREENDDATE)
+                .add(GECEventConstant.HRPI_TRIALPERIOD_TRIALSTARTDATE)
                 .add(GECEventConstant.HOUSEHOLDREGISTER_ADDRESSTYPE_ID)
                 .add(GECEventConstant.HOUSEHOLDREGISTER_ADDRESSINFO)
                 .add(GECEventConstant.RESIDENTIALADDRESS_ADDRESSTYPE_ID)
                 .add(GECEventConstant.RESIDENTIALADDRESS_ADDRESSINFO)
-                .add(GECEventConstant.HSPM_PERCRE_CREDENTIALSTYPE_ID)
-                .add(GECEventConstant.HSPM_PERCRE_NUMBER)
+                .add(GECEventConstant.HRPI_PERCRE_CREDENTIALSTYPE_ID)
+                .add(GECEventConstant.HRPI_PERCRE_NUMBER)
                 .add(GECEventConstant.CNIDCARD_CREDENTIALSTYPE_ID)
                 .add(GECEventConstant.CNIDCARD_NUMBER)
                 .add(GECEventConstant.HAOS_ADMINORGHRF7_CORPORATEORG_ID)
@@ -235,14 +213,14 @@ public class GenerateEmploymentContractEventServicePlugin implements IEventServi
             // 设置 职位
             contractApplyNewDyo.set(GECEventConstant.CURJOB_KEY, personInfo.getDynamicObject(GECEventConstant.HRPI_EMPPOSORGREL_JOB));
             // 设置 证件类型
-            Long cardTypeId = personInfo.getLong(GECEventConstant.HSPM_PERCRE_CREDENTIALSTYPE_ID);
+            Long cardTypeId = personInfo.getLong(GECEventConstant.HRPI_PERCRE_CREDENTIALSTYPE_ID);
             cardTypeId = HRObjectUtils.isEmpty(cardTypeId) ? personInfo.getLong(GECEventConstant.CNIDCARD_CREDENTIALSTYPE_ID) : cardTypeId;
             if (HRObjectUtils.isEmpty(cardTypeId)) {
                 throw new KDBizException(String.format("没有可使用的证件类型,组织分配ID[%s]", assignmentId));
             }
             contractApplyNewDyo.set(GECEventConstant.CARDTYPE_KEY, EntityHelper.newEntity(GECEventConstant.HBSS_CREDENTIALSTYPE_ENTITY, cardTypeId));
             // 设置 证件号码
-            String cardNumber = personInfo.getString(GECEventConstant.HSPM_PERCRE_NUMBER);
+            String cardNumber = personInfo.getString(GECEventConstant.HRPI_PERCRE_NUMBER);
             cardNumber = HRStringUtils.isBlank(cardNumber) ? personInfo.getString(GECEventConstant.CNIDCARD_NUMBER) : cardNumber;
             if (HRStringUtils.isBlank(cardNumber)) {
                 throw new KDBizException(String.format("没有可使用的证件号码,组织分配ID[%s]", assignmentId));
@@ -253,7 +231,7 @@ public class GenerateEmploymentContractEventServicePlugin implements IEventServi
             // 设置 居住地址
             contractApplyNewDyo.set(GECEventConstant.RESIDENTIALADDRESS_KEY, personInfo.getString(GECEventConstant.RESIDENTIALADDRESS_ADDRESSINFO));
             // 设置 联系方式
-            contractApplyNewDyo.set(GECEventConstant.EMPPHONE_KEY, personInfo.getString(GECEventConstant.HSPM_PERCONTACT_PHONE));
+            contractApplyNewDyo.set(GECEventConstant.EMPPHONE_KEY, personInfo.getString(GECEventConstant.HRPI_PERCONTACT_PHONE));
             // 设置应签单位、实签单位
             DynamicObject signCompanyDyo = signCompanyMap.get(personInfo.getLong(GECEventConstant.HAOS_ADMINORGHRF7_CORPORATEORG_ID));
             if (HRObjectUtils.isEmpty(signCompanyDyo)) {
@@ -280,13 +258,13 @@ public class GenerateEmploymentContractEventServicePlugin implements IEventServi
             Date endDate = HRDateTimeUtils.addDay(HRDateTimeUtils.addYear(startDate, 5), -1);// +5年-1天
             contractApplyNewDyo.set(GECEventConstant.ENDDATE_KEY, endDate);
             // 设置 试用期开始日期
-            contractApplyNewDyo.set(GECEventConstant.PROBATIONSTARTDATE_KEY, personInfo.getDate(GECEventConstant.HSPM_TRIALPERIOD_TRIALSTARTDATE));
+            contractApplyNewDyo.set(GECEventConstant.PROBATIONSTARTDATE_KEY, personInfo.getDate(GECEventConstant.HRPI_TRIALPERIOD_TRIALSTARTDATE));
             // 设置 试用结束日期
-            contractApplyNewDyo.set(GECEventConstant.PROBATIONENDDATE_KEY, personInfo.getDate(GECEventConstant.HSPM_TRIALPERIOD_PREENDDATE));
+            contractApplyNewDyo.set(GECEventConstant.PROBATIONENDDATE_KEY, personInfo.getDate(GECEventConstant.HRPI_TRIALPERIOD_PREENDDATE));
             // 设置 试用期限
-            contractApplyNewDyo.set(GECEventConstant.PROBATIONPERIOD_KEY, personInfo.getInt(GECEventConstant.HSPM_TRIALPERIOD_PROBATION));
+            contractApplyNewDyo.set(GECEventConstant.PROBATIONPERIOD_KEY, personInfo.getInt(GECEventConstant.HRPI_TRIALPERIOD_PROBATION));
             // 设置 试用期单位
-            contractApplyNewDyo.set(GECEventConstant.PROBATIONUNIT_KEY, personInfo.getString(GECEventConstant.HSPM_TRIALPERIOD_PROBATIONUNIT));
+            contractApplyNewDyo.set(GECEventConstant.PROBATIONUNIT_KEY, personInfo.getString(GECEventConstant.HRPI_TRIALPERIOD_PROBATIONUNIT));
             // 设置 签署方式
             contractApplyNewDyo.set(GECEventConstant.SIGNWAY_KEY, "2");// 默认纸质签署
             // 设置 创建人

+ 10 - 10
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/common/application/event/GECEventConstant.java

@@ -151,20 +151,20 @@ public class GECEventConstant extends FormConstant {
     public static final String HRPI_EMPPOSORGREL_WORKPLACE_NUMBER = "workplace.number";
 
     /** 联系方式.ID */
-    public static final String HSPM_PERCONTACT_ID = "hspm_percontact.id";
+    public static final String HRPI_PERCONTACT_ID = "hrpi_percontact.id";
     /** 联系方式.手机号码 */
-    public static final String HSPM_PERCONTACT_PHONE = "hspm_percontact.phone";
+    public static final String HRPI_PERCONTACT_PHONE = "hrpi_percontact.phone";
 
     /** 试用期.ID */
-    public static final String HSPM_TRIALPERIOD_ID = "hspm_trialperiod.id";
+    public static final String HRPI_TRIALPERIOD_ID = "hrpi_trialperiod.id";
     /** 试用期.试用期长度 */
-    public static final String HSPM_TRIALPERIOD_PROBATION = "hspm_trialperiod.probation";
+    public static final String HRPI_TRIALPERIOD_PROBATION = "hrpi_trialperiod.probation";
     /** 试用期.试用期单位 */
-    public static final String HSPM_TRIALPERIOD_PROBATIONUNIT = "hspm_trialperiod.probationunit";
+    public static final String HRPI_TRIALPERIOD_PROBATIONUNIT = "hrpi_trialperiod.probationunit";
     /** 试用期.预计转正日期 */
-    public static final String HSPM_TRIALPERIOD_PREENDDATE = "hspm_trialperiod.preenddate";
+    public static final String HRPI_TRIALPERIOD_PREENDDATE = "hrpi_trialperiod.preenddate";
     /** 试用期.试用开始日期 */
-    public static final String HSPM_TRIALPERIOD_TRIALSTARTDATE = "hspm_trialperiod.trialstartdate";
+    public static final String HRPI_TRIALPERIOD_TRIALSTARTDATE = "hrpi_trialperiod.trialstartdate";
 
     /** 户口所在地.ID */
     public static final String HOUSEHOLDREGISTER_ID = "householdregister.id";
@@ -181,11 +181,11 @@ public class GECEventConstant extends FormConstant {
     public static final String RESIDENTIALADDRESS_ADDRESSINFO = "residentialaddress.addressinfo";
 
     /** 证件信息.ID */
-    public static final String HSPM_PERCRE_ID = "hspm_percre.id";
+    public static final String HRPI_PERCRE_ID = "hrpi_percre.id";
     /** 证件信息.证件类型.ID */
-    public static final String HSPM_PERCRE_CREDENTIALSTYPE_ID = "hspm_percre.credentialstype.id";
+    public static final String HRPI_PERCRE_CREDENTIALSTYPE_ID = "hrpi_percre.credentialstype.id";
     /** 证件信息.证件号码 */
-    public static final String HSPM_PERCRE_NUMBER = "hspm_percre.number";
+    public static final String HRPI_PERCRE_NUMBER = "hrpi_percre.number";
 
     /** 中国居民身份证.ID */
     public static final String CNIDCARD_ID = "cnidcard.id";

+ 15 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hspm/common/TitleSkillAppointConstant.java

@@ -0,0 +1,15 @@
+package nckd.jxccl.hr.hspm.common;
+
+import nckd.jxccl.base.common.constant.FormConstant;
+
+/**
+ * 职称技能聘任常量
+ * @author: jtd
+ * @date: 2026/1/13 21:15
+ */
+public class TitleSkillAppointConstant extends FormConstant {
+    /** 员工职称技能聘任-实体标识 */
+    public static final String NCKD_HRPI_TITLSKLAPP_ENTITY = "nckd_hrpi_titlsklapp";
+
+
+}

+ 41 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/hspm/plugin/operate/tsapp/TitleSkillAppointEffectOpPlugin.java

@@ -0,0 +1,41 @@
+package nckd.jxccl.hr.hspm.plugin.operate.tsapp;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import nckd.jxccl.hr.hspm.common.TitleSkillAppointConstant;
+
+/**
+ * 职称技能聘任单生效操作插件
+ * @operate: submiteffect、audit
+ * @author: jtd
+ * @date: 2026/1/13 21:11
+ */
+public class TitleSkillAppointEffectOpPlugin extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+
+        e.getFieldKeys().addAll(billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        super.beginOperationTransaction(e);
+
+        for (DynamicObject dataEntite : e.getDataEntities()) {
+            DynamicObjectCollection entryEntity = dataEntite.getDynamicObjectCollection(TitleSkillAppointConstant.NCKD_ENTRYENTITY);
+            for (DynamicObject entry : entryEntity) {
+
+            }
+        }
+    }
+
+    private void doEffect(DynamicObject data) {
+
+
+    }
+}

+ 58 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/common/IntJobPostConstant.java

@@ -32,4 +32,62 @@ public class IntJobPostConstant extends FormConstant {
     public static final String NCKD_ISJOG = "nckd_isjog";
     /** 获取员工 */
     public static final String FETCHEMP_OP = "fetchemp";
+
+
+
+
+    /** 市场管理-实体标识 */
+    public static final String INTJOBPOSTRECORD_ENTITYID = "nckd_intjobpostrecord";
+    /** 员工状态 */
+    public static final String NCKD_STATE = "nckd_state";
+    /** 进入市场时间 */
+    public static final String NCKD_BEGINDATE = "nckd_begindate";
+    /** 转待岗培训时间 */
+    public static final String NCKD_TOTWODATE = "nckd_totwodate";
+    /** 转待岗时间 */
+    public static final String NCKD_TOTHREEDATE = "nckd_tothreedate";
+    /** 退出市场时间 */
+    public static final String NCKD_TOFOURDATE = "nckd_tofourdate";
+    /** 预计退出市场时间 */
+    public static final String NCKD_PREDICTTOFOURDATE = "nckd_predicttofourdate";
+    /** 三类人员记录分录 */
+    public static final String NCKD_INTJOBPOSTENTRY = "nckd_intjobpostentry";
+    /** 原退出市场时间 */
+    public static final String NCKD_OLDTOFOURDATE = "nckd_oldtofourdate";
+    /** 退出市场原因 */
+    public static final String NCKD_BACKUP = "nckd_backup";
+    /** 员工状态 */
+    public static final String NCKD_OLDSTATE = "nckd_oldstate";
+    /** 操作来源 */
+    public static final String NCKD_HOWFROM = "nckd_howfrom";
+    /** 竞聘时间 */
+    public static final String NCKD_COMPDATE = "nckd_compdate";
+
+
+    /** 内部人力资源市场变动记录-实体标识 */
+    public static final String INTJOBPOSTLOCUS_ENTITYID = "nckd_intjobpostlocus";
+    /** 开始时间 */
+    public static final String NCKD_STARTDATE = "nckd_startdate";
+    /** 结束时间 */
+    public static final String NCKD_ENDDATE = "nckd_enddate";
+    /** 内部人力资源市场记录 */
+    public static final String NCKD_INTJOBPOSTRECORD = "nckd_intjobpostrecord";
+    /** 原结束时间 */
+    public static final String NCKD_OLDENDDAY = "nckd_oldendday";
+    /** 历史退出市场时间 */
+    public static final String NCKD_HISTOFOURDATE = "nckd_histofourdate";
+    /** 历史转待岗时间 */
+    public static final String NCKD_HISTOTHREEDATE = "nckd_histothreedate";
+    /** 历史转待岗培训时间 */
+    public static final String NCKD_HISTOTWODATE = "nckd_histotwodate";
+    /** 员工类别 */
+    public static final String NCKD_HISTALENTTYPE = "nckd_histalenttype";
+    /** 员工状态 */
+    public static final String NCKD_HISSTATE = "nckd_hisstate";
+    /** 历史退出市场原因 */
+    public static final String NCKD_HISBACKUP = "nckd_hisbackup";
+    /** 部门(冗余) */
+    public static final String NCKD_ADMINORG = "nckd_adminorg";
+    /** 是否最新记录(人员) */
+    public static final String NCKD_ISCURRENTNEWEST = "nckd_iscurrentnewest";
 }

+ 258 - 1
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostAuditedOpPlugin.java

@@ -1,11 +1,46 @@
 package nckd.jxccl.hr.ijp.plugin.operate;
 
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.ExtendedDataEntity;
+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.AddValidatorsEventArgs;
 import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.enums.ijp.TalentTypeEnum;
+import nckd.jxccl.base.common.exception.ValidationException;
+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.hrpi.helper.EmpPosOrgRelHelper;
+import nckd.jxccl.hr.ijp.common.IntJobPostConstant;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
 
 /**
 * 内部人力资源市场-三类人员记录生成-审批通过
@@ -16,12 +51,172 @@ import nckd.jxccl.base.common.constant.FormConstant;
 */
 public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
 
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        e.addValidator(new AbstractValidator(){
+            @Override
+            public void validate() {
+                List<Long> personIds = new ArrayList<>();
+                for (ExtendedDataEntity rowDataEntity : getDataEntities()) {
+                    DynamicObject data = rowDataEntity.getDataEntity();
+                    DynamicObject person = data.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
+                    if(person == null){
+                        this.addFatalErrorMessage(rowDataEntity,"请选择人员");
+                    }else{
+                        long personId = person.getLong(FormConstant.ID_KEY);
+                        personIds.add(personId);
+                    }
+                }
+                Map<Long, DynamicObject> empPosOrgRelMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personIds);
+                for (ExtendedDataEntity rowDataEntity : getDataEntities()) {
+                    DynamicObject data = rowDataEntity.getDataEntity();
+                    DynamicObject person = data.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
+                    if(person != null){
+                        long personId = person.getLong(FormConstant.ID_KEY);
+                        if(empPosOrgRelMap.get(personId) == null){
+                            this.addFatalErrorMessage(rowDataEntity,StrFormatter.format("人员【{}】没有在岗状态的任职经历",person.getString(FormConstant.NAME_KEY)));
+                        }
+                    }
+                }
+            }
+        });
+    }
+
     @Override
     public void beginOperationTransaction(BeginOperationTransactionArgs e) {
 
+        List<Long> personIds = new ArrayList<>();
+        List<Long> entityIds = new ArrayList<>();
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            DynamicObjectCollection entryEntity = dataEntity.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+            for (DynamicObject entry : entryEntity) {
+                boolean isEnter = entry.getBoolean(IntJobPostConstant.NCKD_ISENTER);
+                if(isEnter){
+                    personIds.add(entry.getLong(IntJobPostConstant.NCKD_PERSON));
+                }
+                entityIds.add(entry.getLong(IntJobPostConstant.ID_KEY));
+            }
+        }
+        Map<Long, DynamicObject> empPosOrgRelMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personIds);
+
+        // --- A. 处理旧记录 ---
+        // 1. 查询该员工最近的一条记录(排除当前单据产生的记录,按创建时间倒序取第一条)
+        long currUserId = RequestContext.get().getCurrUserId();
+        List<DynamicObject> savedRecords = new ArrayList<>();
+        //由于轨迹需要关联本次新增的记录,需要等记录保存成功后再set内部人力资源市场记录。 以分录id作为key,记录待新增的轨迹。
+        Map<Long, DynamicObject> savedLocusMap = new HashMap<>();
+        List<DynamicObject> savedLocus = new ArrayList<>();
+        Map<Long, DynamicObject> latestRecordMap = getLatestRecordIdsByPersons(personIds, entityIds);
+        Map<Long, DynamicObject> latestLocusMap = findLatestLocusByPerson(personIds);
         for (DynamicObject dataEntity : e.getDataEntities()) {
-            DynamicObjectCollection dynamicObjectCollection = dataEntity.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+            Date auditDate = dataEntity.getDate(IntJobPostConstant.AUDIT_DATE_KEY);
+            long personId = dataEntity.getLong(String.join(".", IntJobPostConstant.NCKD_PERSON, IntJobPostConstant.ID_KEY));
+            String talentType = dataEntity.getString(IntJobPostConstant.NCKD_TALENTTYPE);
+            TalentTypeEnum talentTypeEnum = TalentTypeEnum.getByCode(talentType);
+            DynamicObjectCollection entryEntity = dataEntity.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+
+            for (DynamicObject entry : entryEntity) {
+                long id = entry.getLong(IntJobPostConstant.ID_KEY);
+                boolean isEnter = entry.getBoolean(IntJobPostConstant.NCKD_ISENTER);
+                if(isEnter){
+                    DynamicObject latestRecord = latestRecordMap.get(personId);
+                    if(latestRecord != null) {
+                        // 2. 备份旧值
+                        latestRecord.set(IntJobPostConstant.NCKD_OLDTOFOURDATE, latestRecord.get(IntJobPostConstant.NCKD_TOFOURDATE));
+                        latestRecord.set(IntJobPostConstant.NCKD_OLDSTATE, latestRecord.get(IntJobPostConstant.NCKD_STATE));
+                        //退出市场时间
+                        latestRecord.set(IntJobPostConstant.NCKD_TOFOURDATE, auditDate);
+                        //标记上一条为退出市场
+                        latestRecord.set(IntJobPostConstant.NCKD_STATE, "4");
+                        latestRecord.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.FALSE);
+                        latestRecord.set(IntJobPostConstant.NCKD_BACKUP, StrFormatter.format("以【{}】身份新进入市场,退出原市场。",talentTypeEnum.getName()));
+                        savedRecords.add(latestRecord);
+                    }
+
+                    // --- B. 插入新记录 ---
+                    DynamicObject newRecord = EntityHelper.newEntity(IntJobPostConstant.INTJOBPOSTRECORD_ENTITYID);
+                    DynamicObject empPosOrgRel = empPosOrgRelMap.get(personId);
+                    newRecord.set(IntJobPostConstant.HRPI_EMPPOSORGREL, empPosOrgRel);
+                    newRecord.set(IntJobPostConstant.NCKD_ADMINORG,empPosOrgRel.get(IntJobPostConstant.ADMINORG));
+                    newRecord.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.TRUE);
+                    //初始状态:进入市场
+                    newRecord.set(IntJobPostConstant.NCKD_STATE,"1");
+                    newRecord.set(IntJobPostConstant.NCKD_TALENTTYPE,dataEntity.get(IntJobPostConstant.NCKD_TALENTTYPE));
+                    newRecord.set(IntJobPostConstant.NCKD_BEGINDATE,dataEntity.get(IntJobPostConstant.NCKD_BIZDAY));
+                    newRecord.set(IntJobPostConstant.NCKD_YEAR,dataEntity.get(IntJobPostConstant.NCKD_YEAR));
+                    //分录
+                    newRecord.set(IntJobPostConstant.NCKD_INTJOBPOSTENTRY,latestRecord);
+                    newRecord.set(IntJobPostConstant.NCKD_APPRAISALRESULT,entry.get(IntJobPostConstant.NCKD_APPRAISALRESULT));
+                    newRecord.set(IntJobPostConstant.NCKD_BEFORELAST,entry.get(IntJobPostConstant.NCKD_BEFORELAST));
+                    newRecord.set(FormConstant.CREATOR_KEY,currUserId);
+                    if ("A".equals(dataEntity.getString(IntJobPostConstant.NCKD_TALENTTYPE))) {
+                        //优秀员工-预计退出时间
+                        Date date = DateUtil.addYears(auditDate, 1);
+                        newRecord.set(IntJobPostConstant.NCKD_PREDICTTOFOURDATE, date);
+                    }
+                    savedRecords.add(newRecord);
+
+                    // --- C. 处理轨迹 (Locus) ---
+                    // 1. 查询最近的轨迹
+                    DynamicObject latestLocus = latestLocusMap.get(personId);
+                    if(latestLocus != null){
+                        latestLocus.set(IntJobPostConstant.NCKD_OLDENDDAY, latestLocus.get(IntJobPostConstant.ENDDATE));
+                        latestLocus.set(IntJobPostConstant.ENDDATE, auditDate);
+                        latestLocus.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.FALSE);
+                        savedLocus.add(latestLocus);
+                    }
+                    // 2. 插入新轨迹
+                    DynamicObject newLocus = EntityHelper.newEntity(IntJobPostConstant.INTJOBPOSTLOCUS_ENTITYID);
+                    newLocus.set(IntJobPostConstant.HRPI_EMPPOSORGREL, empPosOrgRel);
+                    newLocus.set(IntJobPostConstant.NCKD_ADMINORG,empPosOrgRel.get(IntJobPostConstant.ADMINORG));
+                    newLocus.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.TRUE);
+                    newLocus.set(IntJobPostConstant.NCKD_INTJOBPOSTRECORD, newRecord);
+                    newLocus.set(IntJobPostConstant.NCKD_STARTDATE, dataEntity.get(IntJobPostConstant.NCKD_BIZDAY));
+                    newLocus.set(IntJobPostConstant.NCKD_TALENTTYPE, dataEntity.get(IntJobPostConstant.NCKD_TALENTTYPE));
+                    newLocus.set(IntJobPostConstant.NCKD_STATE, "1");
+                    newLocus.set(FormConstant.CREATOR_KEY,currUserId);
+                    savedLocusMap.put(id, newLocus);
+                }
+            }
+        }
+        if(!savedRecords.isEmpty()){
+            //保存记录
+            OperationResult operationResult = SaveServiceHelper.saveOperate(IntJobPostConstant.INTJOBPOSTRECORD_ENTITYID, savedRecords.toArray(new DynamicObject[0]), OperateOption.create());
+            if(operationResult.isSuccess()){
+                //新增实体
+                savedLocus.addAll(savedLocusMap.values());
+                OperationResult locusOperationResult = SaveServiceHelper.saveOperate(IntJobPostConstant.INTJOBPOSTLOCUS_ENTITYID, savedLocus.toArray(new DynamicObject[0]), OperateOption.create());
+                if(!locusOperationResult.isSuccess()){
+                    StringJoiner errorMsg = new StringJoiner("\n");
+                    for (IOperateInfo error : locusOperationResult.getAllErrorOrValidateInfo()) {
+                        errorMsg.add(error.getMessage());
+                    }
+                    if (!ObjectUtils.isEmpty(locusOperationResult.getMessage())) {
+                        errorMsg.add(locusOperationResult.getMessage());
+                    }
+                    throw new ValidationException("保存职位档案失败,原因:" + errorMsg.toString());
+                }
+
+            }else{
+                StringJoiner errorMsg = new StringJoiner("\n");
+                for (IOperateInfo error : operationResult.getAllErrorOrValidateInfo()) {
+                    errorMsg.add(error.getMessage());
+                }
+                if (!ObjectUtils.isEmpty(operationResult.getMessage())) {
+                    errorMsg.add(operationResult.getMessage());
+                }
+                throw new ValidationException("保存职位档案失败,原因:" + errorMsg.toString());
+            }
         }
+
+
+
+
+
+        // --- A. 处理旧记录 ---
+        // 1. 查询该员工最近的一条记录(排除当前单据产生的记录,按创建时间倒序取第一条)
+
+
         //1、阶段1:备份原有记录
         // 条件:单据中要进入市场(CFIsenter=1)的员工 + 他们最新的记录 + 记录来源不是当前单据
         //目的:为反审批时恢复数据做准备
@@ -37,7 +232,69 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
         //A类员工:有预计退出时间(1年后)
         //非A类员工:预计退出时间为null
 
+    }
 
+    /**
+     * 获取每个人员最新一条记录
+     * @param personIds 人员ID
+     * @param entityIds 分录ID
+     * @return: java.util.Map<java.lang.Long, java.util.List < kd.bos.dataentity.entity.DynamicObject>>
+     * @author W.Y.C
+     * @date: 2026/01/13 15:56
+     */
+    public Map<Long, DynamicObject> getLatestRecordIdsByPersons(List<Long> personIds,List<Long> entityIds) {
+        QueryFieldBuilder intJobPostRecord = QueryFieldBuilder.create().add(IntJobPostConstant.ID_KEY)
+                .add(FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY,FormConstant.ID_KEY)
+                .add(IntJobPostConstant.NCKD_ISCURRENTNEWEST)
+                .orderDesc(IntJobPostConstant.CREATE_TIME_KEY);
+        QFilter filter = new QFilter(String.join(".",FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY), QCP.in, personIds)
+                .and(IntJobPostConstant.NCKD_INTJOBPOSTENTRY,QCP.not_in,entityIds);
+        DynamicObjectCollection records = QueryServiceHelper.query(IntJobPostConstant.INTJOBPOSTRECORD_ENTITYID, intJobPostRecord.buildSelect(), new QFilter[]{filter});
+        Set<Long> uniquePersonIds = new HashSet<>();
+        List<Long> result = new ArrayList<>();
+        for (DynamicObject record : records) {
+            Long personId = record.getLong(String.join(".",FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
+            if (uniquePersonIds.add(personId)) { // 如果是新的personId,添加到结果中
+                result.add(record.getLong(IntJobPostConstant.ID_KEY));
+            }
+        }
+        MainEntityType intJobPostRecordEntityType = EntityMetadataCache.getDataEntityType(IntJobPostConstant.INTJOBPOSTRECORD_ENTITYID);
+        DynamicObject[] load = BusinessDataServiceHelper.load(result.toArray(new Long[0]), intJobPostRecordEntityType);
+        return Arrays.stream(load)
+                .collect(Collectors.toMap(
+                        obj -> obj.getLong(String.join(".", FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)),
+                        obj -> obj
+                ));
+    }
 
+    /**
+     * 查询最近的轨迹
+     * @param personIds 人员ID
+     * @return: java.util.Map<java.lang.Long, java.util.List < kd.bos.dataentity.entity.DynamicObject>>
+     * @author W.Y.C
+     * @date: 2026/01/13 15:56
+     */
+    public Map<Long, DynamicObject> findLatestLocusByPerson(List<Long> personIds) {
+        QueryFieldBuilder intJobPostLocus = QueryFieldBuilder.create().add(IntJobPostConstant.ID_KEY)
+                .add(FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY,FormConstant.ID_KEY)
+                .add(IntJobPostConstant.NCKD_ISCURRENTNEWEST)
+                .orderDesc(IntJobPostConstant.CREATE_TIME_KEY);
+        QFilter filter = new QFilter(String.join(".",FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY), QCP.in, personIds);
+        DynamicObjectCollection records = QueryServiceHelper.query(IntJobPostConstant.INTJOBPOSTLOCUS_ENTITYID, intJobPostLocus.buildSelect(), new QFilter[]{filter});
+        Set<Long> uniquePersonIds = new HashSet<>();
+        List<Long> result = new ArrayList<>();
+        for (DynamicObject record : records) {
+            Long personId = record.getLong(String.join(".",FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
+            if (uniquePersonIds.add(personId)) { // 如果是新的personId,添加到结果中
+                result.add(record.getLong(IntJobPostConstant.ID_KEY));
+            }
+        }
+        MainEntityType intJobPostLocusEntityType = EntityMetadataCache.getDataEntityType(IntJobPostConstant.INTJOBPOSTLOCUS_ENTITYID);
+        DynamicObject[] load = BusinessDataServiceHelper.load(result.toArray(new Long[0]), intJobPostLocusEntityType);
+        return Arrays.stream(load)
+                .collect(Collectors.toMap(
+                        obj -> obj.getLong(String.join(".",FormConstant.NCKD_EMPPOSORGREL, FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)),
+                        obj -> obj
+                ));
     }
 }

+ 0 - 4
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/contribution/ContribBillOpPlugin.java

@@ -17,7 +17,6 @@ import kd.bos.form.MessageBoxResult;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.common.enums.psms.ScoreItemEnum;
-import nckd.jxccl.base.common.utils.ConvertUtil;
 import nckd.jxccl.base.common.utils.StrFormatter;
 import nckd.jxccl.hr.psms.common.ContributionConstant;
 import nckd.jxccl.hr.psms.helper.ContributionHelper;
@@ -25,11 +24,8 @@ import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 
 /**
  * 年度积分贡献单据保存/提交插件

+ 87 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsBasePlugin.java

@@ -0,0 +1,87 @@
+package nckd.jxccl.hr.tsc.plugin.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.datamodel.events.BizDataEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.servicehelper.user.UserServiceHelper;
+
+import kd.bos.base.AbstractBasePlugIn;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.sdk.plugin.Plugin;
+
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.swc.helper.SWCHelper;
+import java.util.List;
+
+/**
+ * 政策公告插件
+ * @author turborao
+ * 时间 2026/1/13 16:05
+ */
+@SuppressWarnings("unused")
+public class AnnouncementsBasePlugin extends AbstractBasePlugIn implements Plugin {
+
+    @Override
+    public void createNewData(BizDataEventArgs e) {
+        super.createNewData(e);
+
+        Long userId = UserServiceHelper.getCurrentUserId();
+
+        DynamicObject personUserDyn = SWCHelper.queryOne(FormConstant.HRPI_PERSONUSERREL, "employee.id","user",userId);
+
+        Long empId = 0L;
+        if(personUserDyn == null){
+            /**
+             * 没有员工信息时,返回常量,用于测试
+             */
+            //empId = 2313784485549715456L;
+            this.getView().showMessage("未找到员工!");
+            return;
+        }else {
+            empId = personUserDyn.getLong("employee.id");
+        }
+        List<Long> employeeIds = new java.util.ArrayList<>();
+        employeeIds.add(empId);
+        DynamicObject[] empDyns = SWCHelper.queryEmpPosOrgRelDyns(employeeIds);
+        if(empDyns != null && empDyns.length > 0){
+            Long companyId = empDyns[0].getLong("company.id");
+            this.getModel().setValue("nckd_hradminorg", companyId);
+        }
+
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        FormOperate source = (FormOperate)args.getSource();
+        String formOp = source.getOperateKey();
+        DynamicObject data = this.getModel().getDataEntity();
+        String  billstatus =  data.getString("nckd_billstatus");
+        HRBaseServiceHelper hrBaseServiceHelper = new HRBaseServiceHelper(FormConstant.NCKD_ANNOUNCEMENTS);
+        if ("publish".equals(formOp)) {
+
+            if("C".equals(billstatus) ){
+                args.setCancel(true);
+                this.getView().showTipNotification("已经发布,不能操作!");
+            }
+            if("D".equals(billstatus)){
+                args.setCancel(true);
+                this.getView().showTipNotification("已经下架,不能操作!");
+            }
+
+            data.set("nckd_billstatus", "C");
+            data.set("nckd_publishdate", new java.util.Date());
+            data.set("nckd_publishuser", UserServiceHelper.getCurrentUserId());
+            Object billPk = hrBaseServiceHelper.saveOne(data);
+        }
+        if("withdraw".equals(formOp)){
+            if("A".equals(billstatus) || "C".equals(billstatus)){
+                args.setCancel(true);
+                this.getView().showTipNotification("不是已下架状态,不能操作!");
+            }
+            data.set("nckd_billstatus", "A");
+            Object billPk = hrBaseServiceHelper.saveOne(data);
+        }
+    }
+
+}

+ 1 - 1
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/form/ExaminProjectResultListPlugin.java

@@ -71,7 +71,7 @@ import java.util.stream.Collectors;
  * @Version: 1.0
  */
 public class ExaminProjectResultListPlugin extends AbstractListPlugin {
-    private ExaminProjectResultBillList billList;
+//    private ExaminProjectResultBillList billList;
     private static final Log logger = LogFactory.getLog(ExaminProjectResultListPlugin.class);
 
     @Override

+ 19 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hcdm/formplugin/agencybill/AgencyBillEdit.java

@@ -246,12 +246,31 @@ public class AgencyBillEdit extends AbstractFormPlugin implements Plugin {
         QFilter filter = new QFilter("id", QCP.in, ids);
         String selectFields = "employee.id, employee.name, employee.empnumber, empposorgrel.adminorg.id";
         DynamicObject[] adjFiles = SALARYFILE_HELPER.load(selectFields, new QFilter[]{filter});
+
+        // employeeId
+        List<Long> employeeIds = Arrays.stream(adjFiles).map(obj -> obj.getLong("employee.id")).collect(Collectors.toList());
+        DynamicObject[] percreDyns = SWCHelper.queryPercreDyns(employeeIds);
+        Map<Long, DynamicObject> percreMap = Arrays.stream(percreDyns).collect(Collectors.toMap((dyx) -> {
+            return dyx.getLong("employee.id");
+        }, (dyx) -> {
+            return dyx;
+        }, (key1, key2) -> {
+            return key2;
+        }));
+
+
         DynamicObjectCollection entryCols = model.getDataEntity(true).getDynamicObjectCollection("nckd_entryentity");
         model.beginInit();
         for (DynamicObject adjFile : adjFiles) {
             DynamicObject entry = entryCols.addNew();
             entry.set("nckd_employee", adjFile.getDynamicObject("employee"));
             entry.set("nckd_adminorg", adjFile.getDynamicObject("empposorgrel.adminorg"));
+
+            Long employeeId = adjFile.getLong("employee.id");
+            if(percreMap.containsKey(employeeId)) {
+                entry.set("nckd_idcardno", percreMap.get(employeeId).getString("number"));
+            }
+
         }
         model.endInit();
         this.getView().updateView("nckd_entryentity");

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

@@ -371,9 +371,10 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
                     }else{
                         newSubCoHeadService.set(MasConstant.NCKD_ENDDATE, DateUtil.getMaxDateAsDate());
                     }
-                    //【变动时间】的次月到当年年底的月数
-                    LocalDateTime newMonths = DateUtil.addMonths(DateUtil.toLocalDateTime(changeTime), 1);
-                    long between = DateUtil.between(newMonths, endYear, ChronoUnit.MONTHS);
+                    //【变动时间】的次月到当年年底的月数(ChronoUnit.MONTHS是从0开始的,所以不用加月份)
+//                    LocalDateTime newMonths = DateUtil.addMonths(DateUtil.toLocalDateTime(changeTime), 1);
+                    Date endChangeTime = DateUtil.endOfYear(changeTime);
+                    long between = DateUtil.between(DateUtil.toLocalDateTime(changeTime), DateUtil.toLocalDateTime(endChangeTime), ChronoUnit.MONTHS);
                     newSubCoHeadService.set(MasConstant.NCKD_SERVICEMONTHS,between);
                 }
 

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

@@ -312,9 +312,10 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
                     }else{
                         newSubCoHeadService.set(MasConstant.NCKD_ENDDATE, DateUtil.getMaxDateAsDate());
                     }
-                    //【变动时间】的次月到当年年底的月数
-                    LocalDateTime newMonths = DateUtil.addMonths(DateUtil.toLocalDateTime(changeTime), 1);
-                    long between = DateUtil.between(newMonths, endYear, ChronoUnit.MONTHS);
+                    //【变动时间】的次月到当年年底的月数(ChronoUnit.MONTHS是从0开始的,所以不用加月份)
+//                    LocalDateTime newMonths = DateUtil.addMonths(DateUtil.toLocalDateTime(changeTime), 1);
+                    Date endChangeTime = DateUtil.endOfYear(changeTime);
+                    long between = DateUtil.between(DateUtil.toLocalDateTime(changeTime), DateUtil.toLocalDateTime(endChangeTime), ChronoUnit.MONTHS);
                     newSubCoHeadService.set(MasConstant.NCKD_SERVICEMONTHS,between);
                 }
 

+ 4 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/incentivemgmt/AbstractIncentiveApprFormPlugin.java

@@ -110,8 +110,10 @@ public abstract class AbstractIncentiveApprFormPlugin extends AbstractFormPlugin
             for (int rowIndex = 0; rowIndex < entryEntities.size(); rowIndex++) {
                 DynamicObject entry = entryEntities.get(rowIndex);
                 if(entry.getDataEntityType().getProperties().containsKey(MasConstant.NCKD_INSTALLMENTYEARS)) {
-                    int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-                    initOperateOption(installmentYears, rowIndex);
+                    if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                        int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                        initOperateOption(installmentYears, rowIndex);
+                    }
                 }
             }
             

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

@@ -29,8 +29,10 @@ public class EntldrTermBonusApprFormPlugin extends AbstractIncentiveApprFormPlug
         DynamicObjectCollection entryCollection = this.getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
         for (int rowIndex = 0; rowIndex < entryCollection.size(); rowIndex++) {
             DynamicObject entry = entryCollection.get(rowIndex);
-            int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-            initOperateOption(installmentYears, rowIndex);
+            if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                initOperateOption(installmentYears, rowIndex);
+            }
         }
     }
 

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

@@ -40,8 +40,10 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractStructApprFormPlugin i
         for (int rowIndex = 0; rowIndex < entryCollection.size(); rowIndex++) {
             DynamicObject entry = entryCollection.get(rowIndex);
             if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
-                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-                initOperateOption(installmentYears, rowIndex);
+                if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                    int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                    initOperateOption(installmentYears, rowIndex);
+                }
             }
         }
     }
@@ -101,6 +103,9 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractStructApprFormPlugin i
                     .add(MasConstant.NCKD_YEAR)
                     .add(FormConstant.NCKD_ENTRYENTITY)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY)
+                    .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY,FormConstant.PARENT_KEY)
+                    .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY)
+                    .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY,MasConstant.PARENT_KEY)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_SALARYITEM)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYITEM)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYDESC)
@@ -145,8 +150,13 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractStructApprFormPlugin i
                         DynamicObjectCollection dbEntryColl = dbSubCorpSalary.getDynamicObjectCollection(MasConstant.NCKD_ENTRYENTITY);
                         for (DynamicObject dbEntryEntity : dbEntryColl) {
                             DynamicObject projectCategory = dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
+                            DynamicObject parent = null;
+                            if(projectCategory.containsProperty("parent")) {
+                                parent = projectCategory.getDynamicObject("parent");
+                            }
                             String projectCategoryNumber = projectCategory.getString(FormConstant.NUMBER_KEY);
-                            if(projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode())) {
+                            //只取分类为"年度薪酬"的数据
+                            if(projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode()) || (parent != null && (parent.getString(FormConstant.NUMBER_KEY).equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode())))) {
                                 DynamicObject entry = entryEntities.addNew();
                                 boolean deferredPayItem = dbEntryEntity.getBoolean(MasConstant.NCKD_DEFERREDPAYITEM);
                                 entry.set(MasConstant.NCKD_PROJECTCATEGORY, dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY));
@@ -184,8 +194,10 @@ public class EntleaderAnlSalStdFormPlugin extends AbstractStructApprFormPlugin i
 
             for (int rowIndex = 0; rowIndex < entryEntities.size(); rowIndex++) {
                 DynamicObject entry = entryEntities.get(rowIndex);
-                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-                initOperateOption(installmentYears,rowIndex);
+                if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                    int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                    initOperateOption(installmentYears, rowIndex);
+                }
             }
 
         }

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

@@ -40,8 +40,10 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractStructApprFormPlugin i
         DynamicObjectCollection entryCollection = this.getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
         for (int rowIndex = 0; rowIndex < entryCollection.size(); rowIndex++) {
             DynamicObject entry = entryCollection.get(rowIndex);
-            int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-            initOperateOption(installmentYears,rowIndex);
+            if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                initOperateOption(installmentYears, rowIndex);
+            }
         }
     }
 
@@ -75,6 +77,7 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractStructApprFormPlugin i
                     .add(FormConstant.NCKD_ENTRYENTITY)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY)
                     .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY)
+                    .addIdNumberName(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PROJECTCATEGORY,MasConstant.PARENT_KEY)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_SALARYITEM)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYITEM)
                     .add(FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_DEFERREDPAYDESC)
@@ -134,9 +137,13 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractStructApprFormPlugin i
                     DynamicObjectCollection dbEntryColl = dbSubCorpSalary.getDynamicObjectCollection(MasConstant.NCKD_ENTRYENTITY);
                     for (DynamicObject dbEntryEntity : dbEntryColl) {
                         DynamicObject projectCategory = dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY);
+                        DynamicObject parent = null;
+                        if(projectCategory.containsProperty("parent")) {
+                            parent = projectCategory.getDynamicObject("parent");
+                        }
                         String projectCategoryNumber = projectCategory.getString(FormConstant.NUMBER_KEY);
                         //只取分类为"年度薪酬"的数据
-                        if(projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode())) {
+                        if(projectCategoryNumber.equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode()) || (parent != null && (parent.getString(FormConstant.NUMBER_KEY).equalsIgnoreCase(ProjectCategoryEnum.YEARLY_SALARY.getCode())))) {
                             DynamicObject entry = entryEntities.addNew();
                             boolean deferredPayItem = dbEntryEntity.getBoolean(MasConstant.NCKD_DEFERREDPAYITEM);
                             entry.set(MasConstant.NCKD_PROJECTCATEGORY, dbEntryEntity.getDynamicObject(MasConstant.NCKD_PROJECTCATEGORY));
@@ -167,8 +174,10 @@ public class SubcorpChiefSalStdFormPlugin extends AbstractStructApprFormPlugin i
             getView().updateView(FormConstant.NCKD_ENTRYENTITY);
             for (int rowIndex = 0; rowIndex < entryEntities.size(); rowIndex++) {
                 DynamicObject entry = entryEntities.get(rowIndex);
-                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-                initOperateOption(installmentYears,rowIndex);
+                if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                    int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                    initOperateOption(installmentYears, rowIndex);
+                }
             }
 
         }

+ 4 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/change/AbstractSalaryStdChgFormPlugin.java

@@ -44,8 +44,10 @@ public abstract class AbstractSalaryStdChgFormPlugin extends AbstractFormPlugin
         DynamicObjectCollection entryCollection = this.getModel().getEntryEntity(FormConstant.NCKD_ENTRYENTITY);
         for (int rowIndex = 0; rowIndex < entryCollection.size(); rowIndex++) {
             DynamicObject entry = entryCollection.get(rowIndex);
-            int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
-            initOperateOption(installmentYears, rowIndex);
+            if(entry.get(MasConstant.NCKD_INSTALLMENTYEARS) != null) {
+                int installmentYears = entry.getInt(MasConstant.NCKD_INSTALLMENTYEARS);
+                initOperateOption(installmentYears, rowIndex);
+            }
         }
         markChange();
     }

+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/business/.gitkeep


+ 0 - 22
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/common/AppflgConstant.java

@@ -1,22 +0,0 @@
-/**
- * This is a kingdee cosmic template project that is automatically generated by the Kingdee cosmic development assistant plugin. 
- * If there are any issues during the use process, you can provide feedback to the kingdee developer community website.
- * Website: https://developer.kingdee.com/developer?productLineId=29
- * Author: liebin.zheng
- * Generate Date: 2025-10-23 16:09:09
- */
-package nckd.jxccl.wtc.wtp.common;
-
-/**
- * wtc云init应用-通用常量类<br>
- * 代码中不能存在硬编码敏感信息,如账号、密码、http外链、ftp外链、邮箱等。<br>
- * 标识或缓存的常量,需以"KEY_"、"FID_"、"ENTRY_"或"SUBENTRY_"作为变量的前缀。<br>
- *
- * @author nckd
- * @date 2025-10-23 16:09:09
- */
-public class AppflgConstant {
-	
-	public static final String KEY_APP_NAME = "wtc-init";
-
-}

+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/mservice/.gitkeep


+ 0 - 38
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/mservice/WTPCustomerService.java

@@ -1,38 +0,0 @@
-package nckd.jxccl.wtc.wtp.mservice;
-
-import kd.bos.dataentity.entity.DynamicObject;
-import kd.bos.dataentity.serialization.DataEntitySerializerOption;
-import kd.bos.dataentity.serialization.SerializationUtils;
-import kd.hr.hbp.business.servicehelper.HRMServiceHelper;
-import kd.sdk.wtc.wtp.business.attfile.AttFileVersion;
-import kd.sdk.wtc.wtp.business.helper.WTPServiceHelper;
-import nckd.jxccl.base.common.constant.FormConstant;
-import nckd.jxccl.wtc.wtp.mservice.api.IWTPCustomerService;
-
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.List;
-
-/**
- *  工事假勤规则自定义微服务
- * @author: jtd
- * @date: 2026/1/11 18:41
- */
-public class WTPCustomerService implements IWTPCustomerService {
-
-    @Override
-    public String getAttFile(LocalDate localDate, long employeeId) {
-        AttFileVersion attFile = WTPServiceHelper.getAttFile(localDate, employeeId);
-        return attFile == null ? null : SerializationUtils.toJsonString(WTPServiceHelper.getAttFile(localDate, employeeId));
-    }
-
-    @Override
-    public List<DynamicObject> queryQuota(long attFileBoId, List<Long> qtTypeIdList, int rangQueryType, Date startDate, Date endDate) {
-        List<DynamicObject> quotaDyList = HRMServiceHelper.invokeBizService(FormConstant.WTC_CLOUD, FormConstant.WTP_APP, "IQTService", "queryQuota", new Object[]{attFileBoId, qtTypeIdList, rangQueryType, startDate, endDate});
-        DataEntitySerializerOption dataEntitySerializerOption = new DataEntitySerializerOption();
-        //dataEntitySerializerOption.setIncludeComplexProperty(true);// 包含基础资料已有的所有属性
-        //return quotaDyList == null || quotaDyList.isEmpty() ? new String[0] : quotaDyList.stream().map(DataEntitySerializer::serializerToString).toArray(String[]::new);
-        return quotaDyList;
-    }
-
-}

+ 0 - 36
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/mservice/api/IWTPCustomerService.java

@@ -1,36 +0,0 @@
-package nckd.jxccl.wtc.wtp.mservice.api;
-
-import kd.bos.dataentity.entity.DynamicObject;
-
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 工事假勤规则自定义微服务接口
- * @author: jtd
- * @date: 2026/1/11 18:35
- */
-public interface IWTPCustomerService {
-    /**
-     * 获取人员考勤档案
-     * @from: kd.sdk.wtc.wtp.business.helper.WTPServiceHelper.getAttFile
-     * @param localDate
-     * @param employeeId
-     * @return
-     */
-    String getAttFile(LocalDate localDate, long employeeId);
-
-    /**
-     * 查询定额明细
-     * @from: kd.sdk.wtc.wtp.business.helper.WTPServiceHelper.queryQuota
-     * @param attFileBoId
-     * @param qtTypeIdList
-     * @param rangQueryType
-     * @param startDate
-     * @param endDate
-     * @return
-     */
-    List<DynamicObject> queryQuota(long attFileBoId, List<Long> qtTypeIdList, int rangQueryType, Date startDate, Date endDate);
-
-}

+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/form/.gitkeep


+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/operate/.gitkeep


+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/other/.gitkeep


+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/report/.gitkeep


+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/plugin/workflow/.gitkeep


+ 0 - 35
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/servicehelper/ServiceFactory.java

@@ -1,35 +0,0 @@
-package nckd.jxccl.wtc.wtp.servicehelper;
-
-import kd.bos.dataentity.TypesContainer;
-import kd.bos.exception.KDBizException;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * 工事假勤规则自定义微服务工厂
- * @author: jtd
- * @date: 2026/1/11 18:28
- */
-public class ServiceFactory {
-
-    private static Map<String, String> serviceMap = new HashMap<>();
-
-    static {
-        serviceMap.put("IWTPCustomerService", "nckd.jxccl.wtc.wtp.mservice.WTPCustomerService");
-    }
-
-    public static <T> T getService(Class<T> clazz) {
-        return (T) getService(clazz.getSimpleName());
-    }
-
-    public static Object getService(String serviceName) {
-        String className = serviceMap.get(serviceName);
-        if (className == null) {
-            throw new KDBizException(String.format(Locale.ROOT, "未找到%s对应的服务实现。", new Object[]{serviceName}));
-        }
-        return TypesContainer.getOrRegisterSingletonInstance(className);
-    }
-
-}

+ 0 - 0
code/wtc/nckd-jxccl-wtc/src/main/java/nckd/jxccl/wtc/wtp/webapi/.gitkeep