Ver Fonte

Merge remote-tracking branch 'origin/master'

彭佳杰 há 3 dias atrás
pai
commit
9d81c74e7f
16 ficheiros alterados com 669 adições e 51 exclusões
  1. 1 1
      code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/SWCHelper.java
  2. 0 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/.gitkeep
  3. 56 17
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostAuditedOpPlugin.java
  4. 213 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostUnAuditedOpPlugin.java
  5. 1 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/task/KeyBeHavEvalTask.java
  6. 35 7
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsBasePlugin.java
  7. 96 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsListPlugin.java
  8. 162 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsTplListPlugin.java
  9. 32 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/HomePageApplyExtFormPlugin.java
  10. 27 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/base/DeferPayratioConfFormPlugin.java
  11. 1 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/AbstractStructApprFormPlugin.java
  12. 2 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/business/StmService.java
  13. 26 15
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/appr/GrpSalStlApprFormPlugin.java
  14. 9 4
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/grpttlwg/GrpTtlWgBgtSubFormPlugin.java
  15. 3 0
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/ttlwg/TtlWgAdjdeCompFormPlugin.java
  16. 5 5
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/unitst/UnitStBudgetApplyFormPlugin.java

+ 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,company.id";
+        String selectFields1 = "employee.id,adminorg.id,adminorg.belongcompany.id,company.id,adminorg.structlongnumber";
         DynamicObject[] empposorgreDyns = BusinessDataServiceHelper.load("hrpi_empposorgrel", selectFields1, filter.toArray());
 
         return empposorgreDyns;

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


+ 56 - 17
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostAuditedOpPlugin.java

@@ -12,8 +12,11 @@ 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.PreparePropertysEventArgs;
 import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
 import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
@@ -51,6 +54,13 @@ import java.util.stream.Collectors;
 */
 public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
 
+    private static final Log logger = LogFactory.getLog(IntJobPostAuditedOpPlugin.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(billEntityType.getAllFields().keySet());
+    }
+
     @Override
     public void onAddValidators(AddValidatorsEventArgs e) {
         e.addValidator(new AbstractValidator(){
@@ -59,22 +69,29 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                 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);
+                    DynamicObjectCollection entryEntity = data.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+                    for (DynamicObject entry : entryEntity) {
+                        DynamicObject person = entry.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)));
+                    DynamicObjectCollection entryEntity = data.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+                    for (DynamicObject entry : entryEntity) {
+                        DynamicObject person = entry.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)));
+                            }
                         }
                     }
                 }
@@ -85,19 +102,23 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
     @Override
     public void beginOperationTransaction(BeginOperationTransactionArgs e) {
 
+        logger.info("开始执行内部人力资源市场审批通过操作");
         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) {
+                DynamicObject person = entry.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
                 boolean isEnter = entry.getBoolean(IntJobPostConstant.NCKD_ISENTER);
                 if(isEnter){
-                    personIds.add(entry.getLong(IntJobPostConstant.NCKD_PERSON));
+                    personIds.add(person.getLong(IntJobPostConstant.ID_KEY));
                 }
                 entityIds.add(entry.getLong(IntJobPostConstant.ID_KEY));
             }
         }
+        logger.info("需要处理的人员ID数量: {}, 分录ID数量: {}", personIds.size(), entityIds.size());
         Map<Long, DynamicObject> empPosOrgRelMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personIds);
+        logger.info("获取到的员工岗位组织关系数量: {}", empPosOrgRelMap.size());
 
         // --- A. 处理旧记录 ---
         // 1. 查询该员工最近的一条记录(排除当前单据产生的记录,按创建时间倒序取第一条)
@@ -106,19 +127,25 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
         //由于轨迹需要关联本次新增的记录,需要等记录保存成功后再set内部人力资源市场记录。 以分录id作为key,记录待新增的轨迹。
         Map<Long, DynamicObject> savedLocusMap = new HashMap<>();
         List<DynamicObject> savedLocus = new ArrayList<>();
+        logger.info("开始查询人员最新记录");
         Map<Long, DynamicObject> latestRecordMap = getLatestRecordIdsByPersons(personIds, entityIds);
+        logger.info("获取到人员最新记录数量: {}", latestRecordMap.size());
+
+        logger.info("开始查询人员最新轨迹");
         Map<Long, DynamicObject> latestLocusMap = findLatestLocusByPerson(personIds);
+        logger.info("获取到人员最新轨迹数量: {}", latestLocusMap.size());
         for (DynamicObject dataEntity : e.getDataEntities()) {
             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);
+                long personId = entry.getLong(String.join(".", IntJobPostConstant.NCKD_PERSON, IntJobPostConstant.ID_KEY));
+                String name = entry.getString(String.join(".", IntJobPostConstant.NCKD_PERSON, IntJobPostConstant.NAME_KEY));
                 if(isEnter){
+                    logger.info("处理进入市场的人员: {}, 人员ID: {}", name, personId);
                     DynamicObject latestRecord = latestRecordMap.get(personId);
                     if(latestRecord != null) {
                         // 2. 备份旧值
@@ -131,12 +158,13 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                         latestRecord.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.FALSE);
                         latestRecord.set(IntJobPostConstant.NCKD_BACKUP, StrFormatter.format("以【{}】身份新进入市场,退出原市场。",talentTypeEnum.getName()));
                         savedRecords.add(latestRecord);
+                        logger.info("已添加旧记录至更新列表,人员: {}, 旧状态: 1(在市场中) -> 新状态: 4(退出市场)",name);
                     }
 
                     // --- B. 插入新记录 ---
                     DynamicObject newRecord = EntityHelper.newEntity(IntJobPostConstant.INTJOBPOSTRECORD_ENTITYID);
                     DynamicObject empPosOrgRel = empPosOrgRelMap.get(personId);
-                    newRecord.set(IntJobPostConstant.HRPI_EMPPOSORGREL, empPosOrgRel);
+                    newRecord.set(IntJobPostConstant.NCKD_EMPPOSORGREL, empPosOrgRel);
                     newRecord.set(IntJobPostConstant.NCKD_ADMINORG,empPosOrgRel.get(IntJobPostConstant.ADMINORG));
                     newRecord.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.TRUE);
                     //初始状态:进入市场
@@ -145,7 +173,7 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                     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_INTJOBPOSTENTRY, entry);
                     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);
@@ -153,8 +181,10 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                         //优秀员工-预计退出时间
                         Date date = DateUtil.addYears(auditDate, 1);
                         newRecord.set(IntJobPostConstant.NCKD_PREDICTTOFOURDATE, date);
+                        logger.info("A类人才,设置预计退出时间为: {}", date);
                     }
                     savedRecords.add(newRecord);
+                    logger.info("已添加新记录至保存列表,人员: {}, 状态: 1(进入市场)", name);
 
                     // --- C. 处理轨迹 (Locus) ---
                     // 1. 查询最近的轨迹
@@ -167,7 +197,7 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                     }
                     // 2. 插入新轨迹
                     DynamicObject newLocus = EntityHelper.newEntity(IntJobPostConstant.INTJOBPOSTLOCUS_ENTITYID);
-                    newLocus.set(IntJobPostConstant.HRPI_EMPPOSORGREL, empPosOrgRel);
+                    newLocus.set(IntJobPostConstant.NCKD_EMPPOSORGREL, empPosOrgRel);
                     newLocus.set(IntJobPostConstant.NCKD_ADMINORG,empPosOrgRel.get(IntJobPostConstant.ADMINORG));
                     newLocus.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.TRUE);
                     newLocus.set(IntJobPostConstant.NCKD_INTJOBPOSTRECORD, newRecord);
@@ -176,15 +206,21 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                     newLocus.set(IntJobPostConstant.NCKD_STATE, "1");
                     newLocus.set(FormConstant.CREATOR_KEY,currUserId);
                     savedLocusMap.put(id, newLocus);
+                    logger.info("已添加新轨迹至保存映射,分录ID: {}, 人员: {}", id, name);
                 }
             }
         }
+        logger.info("准备保存记录总数: {}, 轨迹总数: {}", savedRecords.size(), savedLocusMap.size());
+
         if(!savedRecords.isEmpty()){
+            logger.info("开始保存内部人力资源市场记录,记录数量: {}", savedRecords.size());
             //保存记录
             OperationResult operationResult = SaveServiceHelper.saveOperate(IntJobPostConstant.INTJOBPOSTRECORD_ENTITYID, savedRecords.toArray(new DynamicObject[0]), OperateOption.create());
             if(operationResult.isSuccess()){
+                logger.info("内部人力资源市场记录保存成功");
                 //新增实体
                 savedLocus.addAll(savedLocusMap.values());
+                logger.info("准备保存轨迹记录,数量: {}", savedLocus.size());
                 OperationResult locusOperationResult = SaveServiceHelper.saveOperate(IntJobPostConstant.INTJOBPOSTLOCUS_ENTITYID, savedLocus.toArray(new DynamicObject[0]), OperateOption.create());
                 if(!locusOperationResult.isSuccess()){
                     StringJoiner errorMsg = new StringJoiner("\n");
@@ -194,8 +230,10 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                     if (!ObjectUtils.isEmpty(locusOperationResult.getMessage())) {
                         errorMsg.add(locusOperationResult.getMessage());
                     }
+                    logger.error("保存轨迹记录失败,原因:{}", errorMsg.toString());
                     throw new ValidationException("保存职位档案失败,原因:" + errorMsg.toString());
                 }
+                logger.info("轨迹记录保存成功");
 
             }else{
                 StringJoiner errorMsg = new StringJoiner("\n");
@@ -205,6 +243,7 @@ public class IntJobPostAuditedOpPlugin extends AbstractOperationServicePlugIn im
                 if (!ObjectUtils.isEmpty(operationResult.getMessage())) {
                     errorMsg.add(operationResult.getMessage());
                 }
+                logger.error("保存内部人力资源市场记录失败,原因:{}", errorMsg.toString());
                 throw new ValidationException("保存职位档案失败,原因:" + errorMsg.toString());
             }
         }

+ 213 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/ijp/plugin/operate/IntJobPostUnAuditedOpPlugin.java

@@ -0,0 +1,213 @@
+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.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.logging.Log;
+import kd.bos.logging.LogFactory;
+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;
+
+/**
+* 内部人力资源市场-三类人员记录生成-反审批
+* 实体标识:nckd_intjobpost
+* @author W.Y.C
+* @date 2026/1/8 21:34
+* @version 1.0
+*/
+public class IntJobPostUnAuditedOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    private static final Log logger = LogFactory.getLog(IntJobPostUnAuditedOpPlugin.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().addAll(billEntityType.getAllFields().keySet());
+    }
+
+
+    @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) {
+                DynamicObject person = entry.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
+                boolean isEnter = entry.getBoolean(IntJobPostConstant.NCKD_ISENTER);
+                if(isEnter){
+                    personIds.add(person.getLong(IntJobPostConstant.ID_KEY));
+                }
+                entityIds.add(entry.getLong(IntJobPostConstant.ID_KEY));
+            }
+        }
+        Map<Long, DynamicObject> empPosOrgRelMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personIds);
+        Map<Long, DynamicObject> latestRecordMap = getLatestRecordIdsByPersons(personIds, entityIds);
+        Map<Long, DynamicObject> latestLocusByPerson = findLatestLocusByPerson(personIds);
+        List<DynamicObject> savedRecords = new ArrayList<>();
+        List<DynamicObject> savedLocus = new ArrayList<>();
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            Date auditDate = dataEntity.getDate(IntJobPostConstant.AUDIT_DATE_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);
+                long personId = entry.getLong(String.join(".", IntJobPostConstant.NCKD_PERSON, IntJobPostConstant.ID_KEY));
+                String name = entry.getString(String.join(".", IntJobPostConstant.NCKD_PERSON, IntJobPostConstant.NAME_KEY));
+                // --- A. 恢复旧记录 ---
+                // 逻辑:找到该单据对应的“上一条”记录。
+                // 实际上就是找那些被“此单据”截断的记录。
+                DynamicObject prevRecord = latestRecordMap.get(personId);
+                if(prevRecord != null) {
+                    // 还原备份的值
+                    prevRecord.set(IntJobPostConstant.NCKD_TOFOURDATE,prevRecord.get(IntJobPostConstant.NCKD_OLDTOFOURDATE));
+                    // 只有当备份状态不为空时才还原,否则保持原样 (NVL逻辑)
+                    if (prevRecord.get(IntJobPostConstant.NCKD_OLDSTATE) != null) {
+                        prevRecord.set(IntJobPostConstant.NCKD_STATE, prevRecord.get(IntJobPostConstant.NCKD_OLDSTATE));
+                    }
+                    prevRecord.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST, Boolean.TRUE);
+                    savedRecords.add(prevRecord);
+                }
+
+                // --- B. 恢复旧轨迹 ---
+                DynamicObject prevLocus  = latestLocusByPerson.get(personId);
+                if (prevLocus != null) {
+                    prevLocus.set(IntJobPostConstant.NCKD_ENDDATE,prevLocus.get(IntJobPostConstant.NCKD_OLDENDDAY));
+                    prevLocus.set(IntJobPostConstant.NCKD_ISCURRENTNEWEST,Boolean.TRUE);
+                    savedLocus.add(prevLocus);
+                }
+
+            }
+        }
+
+        // --- A. 恢复旧记录 ---
+        // 逻辑:找到该单据对应的“上一条”记录。
+        // 实际上就是找那些被“此单据”截断的记录。
+
+
+
+
+
+
+
+        // --- A. 处理旧记录 ---
+        // 1. 查询该员工最近的一条记录(排除当前单据产生的记录,按创建时间倒序取第一条)
+
+
+        //1、阶段1:备份原有记录
+        // 条件:单据中要进入市场(CFIsenter=1)的员工 + 他们最新的记录 + 记录来源不是当前单据
+        //目的:为反审批时恢复数据做准备
+
+        //阶段2:关闭原记录
+        //逻辑:一个员工只能有一条活跃记录(FIsSingle=1)
+        //状态变化:1(在市场中) → 4(退出市场)
+
+        //阶段3:创建新记录
+        //新记录状态:FIsSingle=1, CFInsidehrRecordState='1'
+
+        //阶段3:特殊处理
+        //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
+                ));
+    }
+}

+ 1 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/task/KeyBeHavEvalTask.java

@@ -118,6 +118,7 @@ public class KeyBeHavEvalTask extends AbstractTask implements Plugin {
         QueryFieldBuilder perfManagerQueryField = QueryFieldBuilder.create()
                 .addIdNumberName(PositionStructureConstant.NCKD_PERSON)
                 .add(PositionStructureConstant.NCKD_PERFMANAGERENTRY,PositionStructureConstant.NCKD_APPRAISALYEAR)
+                //考核结果(nckd.jxccl.base.common.enums.AppraisalResultEnum)
                 .addIdNumberName(PositionStructureConstant.NCKD_PERFMANAGERENTRY,PositionStructureConstant.NCKD_APPRAISALRESULT);
         DynamicObjectCollection perfManagerColl = QueryServiceHelper.query(PositionStructureConstant.PERFMANAGER_ENTITYID, perfManagerQueryField.buildSelect(), new QFilter[]{perfManagerFilter}, perfManagerQueryField.buildOrder());
         logger.info("考核结果查询完成,查询结果数量: {}", perfManagerColl.size());

+ 35 - 7
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsBasePlugin.java

@@ -1,17 +1,17 @@
 package nckd.jxccl.hr.tsc.plugin.form;
 
+import kd.bos.bill.OperationStatus;
 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.EventObject;
 import java.util.List;
 
 /**
@@ -22,12 +22,11 @@ import java.util.List;
 @SuppressWarnings("unused")
 public class AnnouncementsBasePlugin extends AbstractBasePlugIn implements Plugin {
 
+
     @Override
-    public void createNewData(BizDataEventArgs e) {
-        super.createNewData(e);
+    public void afterCreateNewData(EventObject e) {
 
         Long userId = UserServiceHelper.getCurrentUserId();
-
         DynamicObject personUserDyn = SWCHelper.queryOne(FormConstant.HRPI_PERSONUSERREL, "employee.id","user",userId);
 
         Long empId = 0L;
@@ -47,6 +46,8 @@ public class AnnouncementsBasePlugin extends AbstractBasePlugIn implements Plugi
         if(empDyns != null && empDyns.length > 0){
             Long companyId = empDyns[0].getLong("company.id");
             this.getModel().setValue("nckd_hradminorg", companyId);
+            this.getModel().setValue("nckd_billstatus", "A");
+            this.getModel().setValue("nckd_istop", false);
         }
 
     }
@@ -55,7 +56,7 @@ public class AnnouncementsBasePlugin extends AbstractBasePlugIn implements Plugi
     public void beforeDoOperation(BeforeDoOperationEventArgs args) {
         FormOperate source = (FormOperate)args.getSource();
         String formOp = source.getOperateKey();
-        DynamicObject data = this.getModel().getDataEntity();
+        DynamicObject data = this.getModel().getDataEntity(true);
         String  billstatus =  data.getString("nckd_billstatus");
         HRBaseServiceHelper hrBaseServiceHelper = new HRBaseServiceHelper(FormConstant.NCKD_ANNOUNCEMENTS);
         if ("publish".equals(formOp)) {
@@ -84,4 +85,31 @@ public class AnnouncementsBasePlugin extends AbstractBasePlugIn implements Plugi
         }
     }
 
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        DynamicObject data = this.getModel().getDataEntity(true);
+        setEnable(data);
+    }
+
+    public void setEnable(DynamicObject data) {
+        String  billstatus =  data.getString("nckd_billstatus");
+        if("A".equals(billstatus)){
+            this.getView().setStatus(OperationStatus.EDIT);
+            this.getView().setEnable(Boolean.TRUE, "nckd_downdate");
+            this.getView().setVisible(Boolean.TRUE, "bar_save");
+            this.getView().setVisible(Boolean.TRUE, "bar_modify");
+            this.getView().setVisible(Boolean.TRUE, "nckd_publish");
+            this.getView().setVisible(Boolean.FALSE, "nckd_withdrawn");
+        }else {
+            this.getView().setStatus(OperationStatus.VIEW);
+            this.getView().setEnable(Boolean.FALSE, "nckd_downdate");
+            this.getView().setVisible(Boolean.FALSE, "bar_save");
+            this.getView().setVisible(Boolean.FALSE, "bar_delete");
+            this.getView().setVisible(Boolean.FALSE, "bar_modify");
+            this.getView().setVisible(Boolean.FALSE, "nckd_publish");
+            this.getView().setVisible(Boolean.TRUE, "nckd_withdrawn");
+
+        }
+    }
 }

+ 96 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsListPlugin.java

@@ -0,0 +1,96 @@
+package nckd.jxccl.hr.tsc.plugin.form;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.model.PermissionStatus;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.hr.hbp.business.helper.permission.HRPermissionServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+
+import java.util.HashMap;
+
+/**
+ * 政策公告列表插件
+ * @author turborao
+ * 时间 2026/1/13 16:05
+ */
+@SuppressWarnings("unused")
+public class AnnouncementsListPlugin extends AbstractListPlugin implements Plugin {
+
+    public void afterDoOperation(AfterDoOperationEventArgs args) {
+        super.afterDoOperation(args);
+        FormOperate formOperate = (FormOperate)args.getSource();
+        String key = formOperate.getOperateKey();
+        switch (key) {
+            case "publish":
+                setBillStatus("C",key);
+                break;
+            case "withdraw":
+                setBillStatus("A",key);
+                break;
+            case "top":
+                setBillStatus("A",key);
+                break;
+            case "untop":
+                setBillStatus("A",key);
+                break;
+            case "takedown":
+                setBillStatus("A",key);
+                break;
+        }
+    }
+
+    /**
+     * 设置单据状态
+     * @param billStatus
+     * A	待处理
+     * D	处理中
+     * C	已处理
+     * F	已忽略
+     */
+    public void setBillStatus(String billStatus,String operateKey) {
+        ListSelectedRowCollection selectedRows = this.getSelectedRows();
+        MainEntityType entityType= EntityMetadataCache.getDataEntityType(FormConstant.NCKD_ANNOUNCEMENTS);
+        DynamicObject[] billDyns = BusinessDataServiceHelper.load(selectedRows.getPrimaryKeyValues(), entityType);
+        for (DynamicObject billDyn : billDyns){
+            if(operateKey.equals("takedown") ){
+                billDyn.set("nckd_billstatus", billStatus);
+            }
+            if(operateKey.equals("withdraw") ){
+                billDyn.set("nckd_billstatus", billStatus);
+                billDyn.set("nckd_publishdate", null);
+                billDyn.set("nckd_publishuser", null);
+            }
+            if(operateKey.equals("publish") ){
+                billDyn.set("nckd_billstatus", "C");
+                billDyn.set("nckd_publishdate", new java.util.Date());
+                billDyn.set("nckd_publishuser", UserServiceHelper.getCurrentUserId());
+            }
+            if(operateKey.equals("untop") ){
+                billDyn.set("nckd_istop", false);
+            }
+            if(operateKey.equals("top") ){
+                billDyn.set("nckd_istop", true);
+            }
+        }
+
+        Object[] update = SaveServiceHelper.save(billDyns);
+        this.getView().showSuccessNotification(update.length + "条,操作成功", 3000);
+
+        this.getView().updateView();
+
+    }
+
+
+}

+ 162 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/AnnouncementsTplListPlugin.java

@@ -0,0 +1,162 @@
+package nckd.jxccl.hr.tsc.plugin.form;
+
+import kd.bos.algo.DataSet;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DB;
+import kd.bos.db.DBRoute;
+import kd.bos.form.events.FilterContainerInitArgs;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.model.PermissionStatus;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.hr.hbp.business.helper.permission.HRPermissionServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.swc.helper.SWCHelper;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 政策公告布局列表插件
+ * @author turborao
+ * 时间 2026/1/13 16:05
+ */
+@SuppressWarnings("unused")
+public class AnnouncementsTplListPlugin extends AbstractListPlugin implements Plugin {
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+        List<QFilter> qFilters = e.getQFilters();
+        List<QFilter> qFilterList = null;
+        if(qFilters.size()>0 && qFilters.get(0) != null) {
+            qFilterList = (List) qFilters.stream().filter((qFilter) -> {
+                return HRStringUtils.equals(qFilter.getProperty(), "id");
+            }).collect(Collectors.toList());
+        }
+
+        QFilter qFilter = null;
+        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){
+            ///获取当前员工的行政组织长编码
+            String adminOrgStructnumber = empDyns[0].getString("adminorg.structlongnumber");
+            System.out.println("empId:"+ empId + " adminOrgStructnumber:"+ adminOrgStructnumber);
+            ///查询符合条件的公告
+            Map<Long, String> announcementsMap = queryAnnouncementsByBillStatus();
+            ///组织结构编码匹配,返回符合条件的公告
+            List<Long> ids = getMatchingAnnouncementIds(announcementsMap, adminOrgStructnumber);
+            if(ids.size() > 0){
+                qFilter = new QFilter("id", QCP.in, ids);
+            }
+
+        }
+
+        if (qFilterList == null  && qFilter != null) {
+            qFilters.add(qFilter);
+        }else{
+            qFilter = new QFilter("id", QCP.equals, 10000000000000000L);
+            qFilters.add(qFilter);
+        }
+        QFilter adminOrgFilter = (QFilter)qFilterList.get(0);
+        System.out.println("qFilters:" + qFilters.toString() + " empId:"+ empId );
+
+    }
+
+    @Override
+    public void filterColumnSetFilter(SetFilterEvent args) {
+
+        super.filterColumnSetFilter(args);
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+    }
+
+    /**
+     * 根据组织结构编码匹配,返回符合条件的公告ID列表
+     * @param announcementsMap Map<id, structnumber> 公告ID与组织结构编码的映射
+     * @param adminOrgStructnumber 当前用户的行政组织结构编码
+     * @return 匹配成功的公告ID列表
+     */
+    public List<Long> getMatchingAnnouncementIds(Map<Long, String> announcementsMap, String adminOrgStructnumber) {
+        List<Long> matchingIds = new ArrayList<>();
+
+        // 循环遍历 announcementsMap
+        for (Map.Entry<Long, String> entry : announcementsMap.entrySet()) {
+            Long id = entry.getKey();
+            String structnumber = entry.getValue();
+
+            // 检查 adminOrgStructnumber 是否包含 structnumber 中的字符
+            if (adminOrgStructnumber != null && structnumber != null &&
+                    adminOrgStructnumber.contains(structnumber)) {
+                matchingIds.add(id);
+            }
+        }
+
+        return matchingIds;
+    }
+
+
+
+    /**
+     * 根据 billstatus 查询公告信息并返回 Map 结构
+     * @return Map<id, structnumber>
+     */
+    public  Map<Long, String> queryAnnouncementsByBillStatus() {
+        // 设置查询条件
+        QFilter filter = new QFilter("nckd_billstatus", QCP.equals, "C");
+
+        // 执行查询
+        StringBuilder sb = getBillDetailSql();
+        DataSet dataSet = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), sb.toString());
+        DynamicObjectCollection result = ORM.create().toPlainDynamicObjectCollection(dataSet);
+
+        // 将结果转换为 Map<Long, String>
+        Map<Long, String> resultMap = new HashMap<>();
+        for (DynamicObject item : result) {
+            Long id = item.getLong("fid");
+            String structnumber = (String) item.get("fstructlongnumber");
+            if (id != null && structnumber != null) {
+                resultMap.put(id, structnumber);
+            }
+        }
+        return resultMap;
+    }
+
+    public  StringBuilder getBillDetailSql() {
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("/*dialect*/ SELECT  a.fid, \n")
+                .append("e.fstructlongnumber \n")
+                .append("from tk_nckd_announcements a \n")
+                .append("left join tk_nckd_announcesentry b on a.fid = b.fid \n")
+                .append("left join t_haos_adminstruct e on e.fadminorgid = b.fk_nckd_adminorg and e.fiscurrentdata = '1' \n")
+                .append("where 1 = 1 and e.fstructprojectid = 1010 \n")
+                .append("and a.fk_nckd_billstatus in ('C') \n");
+        return sb;
+    }
+}

+ 32 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/tsc/plugin/form/HomePageApplyExtFormPlugin.java

@@ -0,0 +1,32 @@
+package nckd.jxccl.hr.tsc.plugin.form;
+
+import kd.bos.form.ShowType;
+import kd.bos.form.container.Tab;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.ListShowParameter;
+import kd.sdk.plugin.Plugin;
+
+import java.util.EventObject;
+
+/**
+ * 我要应聘动态表单插件
+ * @author turborao
+ * 时间 2026/1/13 16:05
+ */
+@SuppressWarnings("unused")
+public class HomePageApplyExtFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        setAnnouncementPage();
+    }
+
+    private void setAnnouncementPage() {
+        ListShowParameter lsp = new ListShowParameter();
+        lsp.setBillFormId("nckd_announcement_p");
+        lsp.getOpenStyle().setShowType(ShowType.InContainer);
+        lsp.getOpenStyle().setTargetKey("nckd_flexpanelap");
+        this.getView().showForm(lsp);
+    }
+}

+ 27 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/base/DeferPayratioConfFormPlugin.java

@@ -0,0 +1,27 @@
+package nckd.jxccl.swc.mas.plugin.form.base;
+
+import kd.bos.entity.datamodel.RowDataEntity;
+import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.swc.constants.MasConstant;
+
+/**
+* 延期支付比例
+* 实体标识:nckd_deferpayratioconf
+* @author W.Y.C
+* @date 2026/1/14 14:28
+* @version 1.0
+*/
+public class DeferPayratioConfFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void afterAddRow(AfterAddRowEventArgs e) {
+        int rowCount = this.getModel().getEntryRowCount(FormConstant.NCKD_ENTRYENTITY);
+        for (RowDataEntity rowDataEntity : e.getRowDataEntities()) {
+            int rowIndex = rowDataEntity.getRowIndex();
+            this.getModel().setValue(MasConstant.NCKD_TIMES, rowCount, rowIndex);
+        }
+    }
+}

+ 1 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/AbstractStructApprFormPlugin.java

@@ -24,7 +24,6 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
-import kd.drp.mem.er.BillStatusEnum;
 import kd.hr.hbp.common.util.HRDynamicObjectUtils;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
@@ -252,7 +251,7 @@ public abstract class AbstractStructApprFormPlugin extends AbstractFormPlugin im
                 HRDynamicObjectUtils.copy(data, newChangeEntity);
                 newChangeEntity.set(FormConstant.NCKD_DESCRIPTION, data.getString(FormConstant.DESCRIPTION_KEY));
                 newChangeEntity.set(entityId, data);
-                newChangeEntity.set(FormConstant.BILL_STATUS_KEY, BillStatusEnum.SAVED.getValue());
+                newChangeEntity.set(FormConstant.BILL_STATUS_KEY, BillStatus.A.getValue());
 
                 // 变更前
                 DynamicObjectCollection newEntryColl = newChangeEntity.getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);

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

@@ -1,5 +1,6 @@
 package nckd.jxccl.swc.stm.business;
 
+import kd.bos.common.enums.EnableEnum;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.orm.query.QCP;
@@ -43,6 +44,7 @@ public class StmService {
                 .and(QFilterCommonHelper.getCurrentVersionFilter())
                 .and(QFilterCommonHelper.getEnableFilter())
                 .and(QFilterCommonHelper.getStatusFilter())
+                .and(String.join(".", "corporateorg", FormConstant.ENABLE),QCP.equals, EnableEnum.YES.getCode())
                 //包含自己
                 .or(FormConstant.ID_KEY,QCP.equals,org.getLong(FormConstant.ID_KEY));
         QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()

+ 26 - 15
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/appr/GrpSalStlApprFormPlugin.java

@@ -101,20 +101,31 @@ public class GrpSalStlApprFormPlugin extends AbstractFormPlugin implements Plugi
                         List<DynamicObject> lastYearDataList = lastYearDataMap.get(unitId);
                         if(lastYearDataList != null && !lastYearDataList.isEmpty()){
                             DynamicObject lastYearData = lastYearDataList.get(0);
-                            if(lastYearData.containsProperty(StmConstant.NCKD_ENTRYENTITY)) {
-                                //上年实际计提工资总额与应提工资总额差额
-                                entry.set(StmConstant.NCKD_LYRACTVSEXPDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_LYRACTVSEXPDIFF)));
-                                //上年补提或冲回以前年度差额
-                                entry.set(StmConstant.NCKD_LYRPRIORADJDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_LYRPRIORADJDIFF)));
-                                //上年年薪人员差额
-                                entry.set(StmConstant.NCKD_LYRANNSALDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_LYRANNSALDIFF)));
-                                //上年任期激励差额
-                                entry.set(StmConstant.NCKD_LYRTERMBONUSDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_LYRTERMBONUSDIFF)));
-                                //上年组织绩效差额
-                                entry.set(StmConstant.NCKD_LYRORGPERFDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_LYRORGPERFDIFF)));
-                                //上年单项工资差额
-                                entry.set(StmConstant.NCKD_LYRITEMWGDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_LYRITEMWGDIFF)));
+                            //上年实际计提工资总额与应提工资总额差额
+                            if(lastYearData.containsProperty(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYACTVSEXPDIFF))) {
+                                entry.set(StmConstant.NCKD_LYRACTVSEXPDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYACTVSEXPDIFF)));
                             }
+                            //上年补提或冲回以前年度差额
+                            if(lastYearData.containsProperty(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYPRIORADJDIFF2))) {
+                                entry.set(StmConstant.NCKD_LYRPRIORADJDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYPRIORADJDIFF2)));
+                            }
+                            //上年年薪人员差额
+                            if(lastYearData.containsProperty(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYANNSALDIFF))) {
+                                entry.set(StmConstant.NCKD_LYRANNSALDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYANNSALDIFF)));
+                            }
+                            //上年任期激励差额
+                            if(lastYearData.containsProperty(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYTERMBONUSDIFF))) {
+                                entry.set(StmConstant.NCKD_LYRTERMBONUSDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYTERMBONUSDIFF)));
+                            }
+                            //上年组织绩效差额
+                            if(lastYearData.containsProperty(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYORGPERFDIFF))) {
+                                entry.set(StmConstant.NCKD_LYRORGPERFDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYORGPERFDIFF)));
+                            }
+                            //上年单项工资差额
+                            if(lastYearData.containsProperty(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYITEMWGDIFF))) {
+                                entry.set(StmConstant.NCKD_LYRITEMWGDIFF, lastYearData.getBigDecimal(String.join(".", StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_CYITEMWGDIFF)));
+                            }
+
                         }
                         Result avgMasPeopleNum = avgMasPeopleNumMap.get(unitId);
                         if(avgMasPeopleNum != null) {
@@ -274,7 +285,7 @@ public class GrpSalStlApprFormPlugin extends AbstractFormPlugin implements Plugi
     private Map<Long,List<DynamicObject>> getLastYearData(Date year, List<Long> unitIds){
         Date lastYear = DateUtil.minusYears(year, 1);
         Date beginDate = DateUtil.beginOfYear(lastYear);
-        Date endDate = DateUtil.endOfDay(lastYear);
+        Date endDate = DateUtil.endOfYear(lastYear);
         QFilter qFilter = new QFilter(StmConstant.NCKD_YEAR, QCP.large_equals,beginDate)
                 .and(StmConstant.NCKD_YEAR, QCP.less_equals, endDate)
                 .and(String.join(".",StmConstant.NCKD_ENTRYENTITY, StmConstant.NCKD_UNIT), QCP.in, unitIds);
@@ -462,7 +473,7 @@ public class GrpSalStlApprFormPlugin extends AbstractFormPlugin implements Plugi
             // 按单位分组并汇总任期激励金额
             return query.stream()
                     .collect(Collectors.groupingBy(
-                            obj -> obj.getLong(String.join(".", FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_PAYUNIT, FormConstant.ID_KEY)),
+                            obj -> obj.getLong(String.join(".",  MasConstant.NCKD_PAYUNIT, FormConstant.ID_KEY)),
                             Collectors.reducing(
                                     BigDecimal.ZERO,
                                     obj -> obj.getBigDecimal(String.join(".", FormConstant.NCKD_ENTRYENTITY, MasConstant.NCKD_TOTALBONUSAMT)),

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

@@ -90,6 +90,8 @@ public class GrpTtlWgBgtSubFormPlugin extends AbstractFormPlugin implements Plug
                 java.math.BigDecimal onpStNum = java.math.BigDecimal.ZERO;
                 // nckd_onpstwg:应发工资总额(万元)-其中:在岗职工
                 java.math.BigDecimal onpStWg = java.math.BigDecimal.ZERO;
+                // nckd_onpstwg:应发工资总额(万元)-其中:在岗职工
+                java.math.BigDecimal offpStNum = java.math.BigDecimal.ZERO;
                 // nckd_offpstliv:不在岗职工生活费
                 java.math.BigDecimal offpStLiv = java.math.BigDecimal.ZERO;
                 if (unitStBudgetApplyColl == null || unitStBudgetApplyColl.isEmpty()) {
@@ -106,16 +108,17 @@ public class GrpTtlWgBgtSubFormPlugin extends AbstractFormPlugin implements Plug
                         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);
+                                .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);
+                        offpStNum =  offpStNum.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)
+                        onpStWg = //onpStWg.add(obj.getBigDecimal(StmConstant.NCKD_TOTALWAGE) != null ? obj.getBigDecimal(StmConstant.NCKD_TOTALWAGE) : java.math.BigDecimal.ZERO)
+                                onpStWg.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);
 
@@ -131,9 +134,11 @@ public class GrpTtlWgBgtSubFormPlugin extends AbstractFormPlugin implements Plug
 
                 // 设置汇总值到界面
                 this.getModel().setValue(StmConstant.NCKD_ONPSTNUM, onpStNum);
+                this.getModel().setValue(StmConstant.NCKD_OFFPSTNUM, offpStNum);
                 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_OFFPSTNUM);
                 this.getView().updateView(StmConstant.NCKD_ONPSTWG);
                 this.getView().updateView(StmConstant.NCKD_OFFPSTLIV);
 

+ 3 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/stm/plugin/form/ttlwg/TtlWgAdjdeCompFormPlugin.java

@@ -119,6 +119,9 @@ public class TtlWgAdjdeCompFormPlugin extends AbstractFormPlugin implements Plug
             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));
+                if("nckd_wagetype".equalsIgnoreCase( name)){
+                    this.getModel().setValue("nckd_wagetypead", source.get(name));
+                }
             }
         }
     }

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

@@ -73,9 +73,9 @@ public class UnitStBudgetApplyFormPlugin extends AbstractFormPlugin implements P
                 }else{
                     DynamicObjectCollection corp = StmService.corp(org);
                     ListShowParameter listParameter = new ListShowParameter();
-                    listParameter.setFormId("bos_list");
+                    listParameter.setFormId("bos_listf7");
 //                    listParameter.setFormId("haos_orgtreelistf7");
-                    listParameter.setBillFormId("haos_adminorghrf7");
+                    listParameter.setBillFormId("hbss_lawentity");
                     listParameter.setCaption(StrFormatter.format("【{}】下的法人企业",org.getString(FormConstant.NAME_KEY)));
                     listParameter.getOpenStyle().setShowType(ShowType.Modal);
                     StyleCss inlineStyleCss = new StyleCss();
@@ -83,12 +83,12 @@ public class UnitStBudgetApplyFormPlugin extends AbstractFormPlugin implements P
                     inlineStyleCss.setWidth("800");
                     listParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
 
-                    QFilter qFilter = QFilterCommonHelper.getCurrentVersionFilter();
+                    QFilter qFilter = QFilter.of("1=1");
                     List<Long> ids = new ArrayList<Long>();
                     for (DynamicObject dynamicObject : corp) {
                         long corpoRateOrgId = dynamicObject.getLong(String.join(".", "corporateorg", FormConstant.ID_KEY));
                         if(corpoRateOrgId > 0) {
-                            ids.add(dynamicObject.getLong(FormConstant.ID_KEY));
+                            ids.add(corpoRateOrgId);
                         }
                     }
                     qFilter.and(FormConstant.ID_KEY,QCP.in,ids);
@@ -178,7 +178,7 @@ public class UnitStBudgetApplyFormPlugin extends AbstractFormPlugin implements P
                             .distinct()
                             .collect(Collectors.joining(","));
                 }else{
-                    this.getView().showTipNotification(StrFormatter.format("【{}】直属下级单位没有【{}】年度预算数据", payUnit.getString(FormConstant.NAME_KEY),beginOfYear.getYear()));
+                    this.getView().showTipNotification(StrFormatter.format("【{}】直属下级单位没有【{}】年度预算数据", payUnit.getString(FormConstant.NAME_KEY),DateUtil.getYear(beginOfYear)));
                 }
                 if(!summaryMap.isEmpty()) {
                     List<String> summaryList = new ArrayList<>();