Browse Source

Merge branch 'refs/heads/feat-opmc-pm_1.0'

wyc 1 tuần trước cách đây
mục cha
commit
67e2482a94

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

@@ -326,6 +326,10 @@ public class FormConstant {
 
     /** 描述*/
     public static final String NCKD_DESCRIPTION = "nckd_description";
+    /**岗位绩效工资制编码*/
+    public static final String POST_PERF_WAGE_SYS = "001";
+    /**薪酬标准方案*/
+    public static final String NCKD_PAYSTDPLAN = "nckd_paystdplan";
 
 
 

+ 63 - 9
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/cycle/CycleGenerateOpPlugin.java

@@ -19,9 +19,10 @@ 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.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.QueryServiceHelper;
 import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
 import kd.bos.servicehelper.operation.OperationServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRQueryEntityHelper;
@@ -62,10 +63,15 @@ import java.util.stream.Collectors;
 */
 public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
 
+    private static final Log logger = LogFactory.getLog(CycleGenerateOpPlugin.class);
+
     @Override
     public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        logger.info("开始执行周期生成操作");
         //获取待生成新周期人员
         Map<Long, PerfManagerSaveOpPlugin.PersonPerfInfo> pendingCyclePersonnelMap = getPendingCyclePersonnel();
+        logger.info("获取到待生成新周期人员数量: {}", pendingCyclePersonnelMap.size());
+        
         List<Long> perfManagerId = pendingCyclePersonnelMap.values().stream()
                 .map(PerfManagerSaveOpPlugin.PersonPerfInfo::getId)
                 .filter(Objects::nonNull)
@@ -115,7 +121,11 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
             newPerfManager.set(FormConstant.NAME_KEY, StrFormatter.format("【{}】{}~{}的考核周期",personName,value.getBeginYear().getYear(),value.getEndYear().getYear()));
             savePerfManager.add(newPerfManager);
         }
+        
+        logger.info("准备保存 {} 条新的绩效管理记录", savePerfManager.size());
+        
         if(savePerfManager.isEmpty()){
+            logger.warn("生成周期完成,本次没有需要生成周期的人员");
             this.operationResult.setShowMessage(true);
             this.operationResult.setSuccess(false);
             this.operationResult.setMessage("生成周期完成,本次没有需要生成周期的人员");
@@ -124,6 +134,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
             OperateOption option = OperateOption.create();
             option.setVariableValue(OperateOptionConst.IGNOREINTERACTION, Boolean.TRUE + "");
             option.setVariableValue("cyclegenerate", Boolean.TRUE + "");
+            logger.info("开始执行保存操作,实体ID: {}", PerfManagerFormConstant.PERFMANAGER_ENTITYID);
             OperationResult operationResult = OperationServiceHelper.executeOperate(FormConstant.SAVE_OP, PerfManagerFormConstant.PERFMANAGER_ENTITYID, savePerfManager.toArray(new DynamicObject[0]), option);
 
             if (!operationResult.isSuccess()) {
@@ -131,6 +142,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                 for (IOperateInfo error : operationResult.getAllErrorOrValidateInfo()) {
                     errorMsg.add(error.getMessage());
                 }
+                logger.error("周期生成失败,错误信息: {}", errorMsg.toString());
                 throw new ValidationException(errorMsg.toString());
             }else{
                 //周期生成成功,以下是本次周期生成的人员:
@@ -143,6 +155,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                     String description = value.getDescription();
                     msg.add(StrFormatter.format("{}、【{}】{}",index.getAndIncrement(),personName,value.getWhyEnd()));
                 }
+                logger.info("周期生成成功,生成了 {} 条记录", savePerfManager.size());
                 this.operationResult.setMessage(msg.toString());
             }
         }
@@ -159,6 +172,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
      * @date: 2025/11/06 14:19
      */
     public static Map<Long, PerfManagerSaveOpPlugin.PersonPerfInfo> getPendingCyclePersonnel() {
+        logger.info("开始获取待生成新周期人员");
         LocalDateTime now = DateUtil.beginOfYear(DateUtil.now());
         // LocalDateTime lastDate = now;
         LocalDateTime lastDate = DateUtil.minusYears(now, 1);
@@ -169,15 +183,17 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
         Map<Long, PerfManagerSaveOpPlugin.PersonPerfInfo> personPerfInfoMap = new HashMap<>();
 
         //查询岗位工资制单位
-        DynamicObjectCollection postWageUnitList = QueryServiceHelper.query(PerfManagerFormConstant.POSTWAGEUNITLIST_ENTITYID, QueryFieldBuilder.create().addIdNumberName(FormConstant.NCKD_ORG).buildSelect(), null);
-        List<Long> postWageUnitIds = postWageUnitList.stream().map(postWageUnit -> postWageUnit.getLong(String.join(".", FormConstant.NCKD_ORG, FormConstant.ID_KEY))).collect(Collectors.toList());
+       /* DynamicObjectCollection postWageUnitList = QueryServiceHelper.query(PerfManagerFormConstant.POSTWAGEUNITLIST_ENTITYID, QueryFieldBuilder.create().addIdNumberName(FormConstant.NCKD_ORG).buildSelect(), null);
+        List<Long> postWageUnitIds = postWageUnitList.stream().map(postWageUnit -> postWageUnit.getLong(String.join(".", FormConstant.NCKD_ORG, FormConstant.ID_KEY))).collect(Collectors.toList());*/
         // 在职并去年入职的人员
         QFilter newHireFilter = buildNewHireFilter(lastBegin, lastEnd);
-        if(!postWageUnitIds.isEmpty()){
+
+
+        /*if(!postWageUnitIds.isEmpty()){
             newHireFilter.and(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.COMPANY_KEY), QCP.in, postWageUnitIds);
         }else{
             return personPerfInfoMap;
-        }
+        }*/
         // 只处理权限范围内的人员
         AuthorizedOrgResultWithSub userAdminOrgWithSub = HRPermissionServiceHelper.getUserAdminOrgsWithSub(
                 currUserId, "nckd_pm", PerfManagerFormConstant.PERFMANAGER_ENTITYID,
@@ -193,7 +209,6 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
 
         // 构建考核周期查询条件
         QFilter perfManagerFilter = buildPerfManagerFilter(userAdminOrgWithSub);
-        perfManagerFilter.and(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.COMPANY_KEY), QCP.in, postWageUnitIds);
         QueryFieldBuilder perfManagerQueryFieldBuilder = buildPerfManagerQueryFieldBuilder();
         QueryEntityType perfManagerQueryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityTypeNoCache("nckd_perfmanager_query");
 
@@ -209,20 +224,30 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
             collectPersonIds(personIds, perfManagerQueryDataSet.copy());
 
             // 1、去年入职人员生成周期
+            logger.info("开始处理去年入职人员生成周期");
             generateCycleForNewHires(personPerfInfoMap, newHirePersonList, personIds, now);
+            logger.info("去年入职人员生成周期处理完成,当前待处理人员数: {}", personPerfInfoMap.size());
 
             // 2、上年度绩效结果不合格或基本合格的人员,并且当前周期是最新的
+            logger.info("开始处理上年度绩效结果不合格或基本合格的人员");
             handleUnqualifiedLastYearResults(personPerfInfoMap, perfManagerQueryDataSet.copy(),
                     perfManagerQueryFieldBuilder, lastBegin, now);
+            logger.info("上年度绩效结果不合格或基本合格的人员处理完成,当前待处理人员数: {}", personPerfInfoMap.size());
 
             // 3、上年度无绩效结果(周期开始及结束年份含上年)
+            logger.info("开始处理上年度无绩效结果的人员");
             handleMissingLastYearResults(personPerfInfoMap, perfManagerQueryDataSet.copy(),
                     perfManagerQueryFieldBuilder, lastBegin, now);
+            logger.info("上年度无绩效结果的人员处理完成,当前待处理人员数: {}", personPerfInfoMap.size());
 
             // 4、三年考评周期结束(周期结束年份为去年,不管有没有结果)
+            logger.info("开始处理三年考评周期结束的人员");
             handleEndedThreeYearCycles(personPerfInfoMap, perfManagerQueryDataSet.copy(),
                     perfManagerQueryFieldBuilder, lastBegin, now);
+            logger.info("三年考评周期结束的人员处理完成,最终待处理人员数: {}", personPerfInfoMap.size());
         }
+        
+        logger.info("获取待生成新周期人员完成,共 {} 人", personPerfInfoMap.size());
         return personPerfInfoMap;
     }
 
@@ -233,7 +258,10 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
         return new QFilter(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.ENTRYDATE), QCP.large_equals, lastBegin)
                 .and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.ENTRYDATE), QCP.less_equals, lastEnd)
                 .and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_HIRED),
-                        QCP.equals, EnableEnum.YES.getCode());
+                        QCP.equals, EnableEnum.YES.getCode())
+                //岗位绩效工资制
+                .and(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.POSITION_KEY,FormConstant.NCKD_PAYSTDPLAN, FormConstant.NUMBER_KEY),QCP.equals,FormConstant.POST_PERF_WAGE_SYS);
+
     }
 
     /**
@@ -267,6 +295,8 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
             perfManagerFilter.and(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.ADMINORG), QCP.in, orgIds);
         }
         perfManagerFilter.and(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.IS_SEQLATESTRECORD), QCP.equals,EnableEnum.YES.getCode());
+        //岗位绩效工资制
+        perfManagerFilter.and(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.POSITION_KEY,FormConstant.NCKD_PAYSTDPLAN, FormConstant.NUMBER_KEY),QCP.equals,FormConstant.POST_PERF_WAGE_SYS);
         return perfManagerFilter;
     }
 
@@ -304,6 +334,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                                                  DynamicObjectCollection newHirePersonList,
                                                  Set<Long> personIds,
                                                  LocalDateTime now) {
+        logger.debug("开始为新入职员工生成考核周期,新入职员工总数: {}", newHirePersonList.size());
         for (DynamicObject person : newHirePersonList) {
             long personId = person.getLong(String.join(".", FormConstant.HRPI_EMPLOYEE, FormConstant.ID_KEY));
             long empPosOrgRelId = person.getLong(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.ID_KEY));
@@ -324,8 +355,12 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                         cyclePerson,empPosOrgRel,adminOrg, DateUtil.toDate(now), DateUtil.toDate(DateUtil.addYears(now, 2)), "周期生成(新入职)");
                 personPerfInfo.setWhyEnd("新入职员工");
                 personPerfInfoMap.put(personId, personPerfInfo);
+                logger.debug("为新员工 {} 添加周期生成记录", personName);
+            } else {
+                logger.debug("员工ID {} 已存在周期,跳过生成", personId);
             }
         }
+        logger.debug("新入职员工考核周期生成完成,新增 {} 条记录", personPerfInfoMap.size());
     }
 
     /**
@@ -336,13 +371,15 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                                                          QueryFieldBuilder perfManagerQueryFieldBuilder,
                                                          LocalDateTime lastBegin,
                                                          LocalDateTime now) {
+        logger.debug("开始处理上年度绩效不合格或基本合格的人员");
         DataSet lastYearFailFilter = perfManagerQueryDataSet.copy().filter(
                         "perfmanagerentry.nckd_appraisalresult.number in ('" + AppraisalResultEnum.UN_QUALIFIED.getCode() + "','" +
                                 AppraisalResultEnum.BASICALLY_QUALIFIED.getCode() + "') " +
                                 "and YEAR(perfmanagerentry.nckd_appraisalyear) = " + lastBegin.getYear() +
                                 " and nckd_iscurrentnewest = true")
                 .select(perfManagerQueryFieldBuilder.buildSelect());
-
+        
+        int count = 0;
         while (lastYearFailFilter.hasNext()) {
             Row next = lastYearFailFilter.next();
             Long id = next.getLong(FormConstant.ID_KEY);
@@ -379,7 +416,10 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
             }
 
             personPerfInfoMap.put(personId, personPerfInfo);
+            count++;
+            logger.debug("添加上年度绩效不合格或基本合格人员: {} ({})", personName, appraisalResult);
         }
+        logger.debug("上年度绩效不合格或基本合格人员处理完成,共处理 {} 条记录", count);
     }
 
     /**
@@ -390,6 +430,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                                                      QueryFieldBuilder perfManagerQueryFieldBuilder,
                                                      LocalDateTime lastBegin,
                                                      LocalDateTime now) {
+        logger.debug("开始处理上年度无绩效结果的人员");
         DataSet lastYearNoPerfFilter = perfManagerQueryDataSet.copy().filter(
                         "YEAR(NCKD_BEGINYEAR) <= " + lastBegin.getYear() +
                                 " AND YEAR(NCKD_ENDYEAR) >= " + lastBegin.getYear() +
@@ -404,6 +445,7 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
         Map<Long, Long> personIdAndEmpPosOrgRelMap = new HashMap<>();
         Map<Long, Long> personIdAndAdminOrgMap = new HashMap<>();
 
+        int filterCount = 0;
         while (lastYearNoPerfFilter.hasNext()) {
             Row next = lastYearNoPerfFilter.next();
             Long id = next.getLong(FormConstant.ID_KEY);
@@ -425,14 +467,17 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                 personIdAndEndDateMap.put(personId, endYear);
                 personIdAndEmpPosOrgRelMap.put(personId, empPosOrgRelId);
                 personIdAndAdminOrgMap.put(personId, adminOrgId);
+                filterCount++;
             }
         }
+        logger.debug("筛选出 {} 条上年度绩效记录", filterCount);
 
         // 找出上年度绩效记录为空或等于"无"的人员
         List<Long> filteredPersonIds = personIdAndAppraisalYearMap.entrySet().stream()
                 .filter(entry -> AppraisalResultEnum.NONE.getCode().equals(entry.getValue()) || entry.getValue() == null)
                 .map(Map.Entry::getKey)
                 .collect(Collectors.toList());
+        logger.debug("筛选出 {} 条上年度无绩效结果的人员", filteredPersonIds.size());
 
         for (Long filteredPersonId : filteredPersonIds) {
             String personName = personIdAndPersonNameMap.get(filteredPersonId);
@@ -456,7 +501,9 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
             personPerfInfo.setActEndYear(actualEndYear);
 
             personPerfInfoMap.put(filteredPersonId, personPerfInfo);
+            logger.debug("添加上年度无绩效结果人员: {}", personName);
         }
+        logger.debug("上年度无绩效结果人员处理完成");
     }
 
     /**
@@ -467,10 +514,12 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                                                    QueryFieldBuilder perfManagerQueryFieldBuilder,
                                                    LocalDateTime lastBegin,
                                                    LocalDateTime now) {
+        logger.debug("开始处理三年考评周期结束的人员");
         DataSet yearEvalEndFilter = perfManagerQueryDataSet.copy().filter(
                         "YEAR(nckd_endyear) = " + lastBegin.getYear() + " and nckd_iscurrentnewest = true ")
                 .select(perfManagerQueryFieldBuilder.buildSelect());
-
+        
+        int processedCount = 0;
         while (yearEvalEndFilter.hasNext()) {
             Row next = yearEvalEndFilter.next();
             Long id = next.getLong(FormConstant.ID_KEY);
@@ -501,8 +550,13 @@ public class CycleGenerateOpPlugin extends AbstractOperationServicePlugIn implem
                 personPerfInfo.setActEndYear(actualEndYear);
 
                 personPerfInfoMap.put(personId, personPerfInfo);
+                processedCount++;
+                logger.debug("添加三年考评周期结束人员: {}", personName);
+            } else {
+                logger.debug("人员 {} 已在其他规则中处理,跳过", personName);
             }
         }
+        logger.debug("三年考评周期结束人员处理完成,共处理 {} 条记录", processedCount);
     }
 
 }