Эх сурвалжийг харах

Merge branch 'refs/heads/feat-hr-psms_1.0'

wyc 1 долоо хоног өмнө
parent
commit
5435785ccc

+ 15 - 15
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/performance/PerfRankMgmtFormPlugin.java

@@ -63,9 +63,11 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.EventObject;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -284,7 +286,6 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
     public static DynamicObject[] getByDate(Date date, Collection<Long> personIds) {
         QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
                 .add(FormConstant.ID_KEY)
-                .addIdNumberName(FormConstant.NCKD_EMPPOSORGREL)
                 .addIdNumberName(FormConstant.NCKD_PERSON)
                 .add(PerfRankMgmtConstant.NCKD_THESTATUS)
                 .addGroup(new String[]{PerfRankMgmtConstant.NCKD_PERFMANAGERENTRY},
@@ -398,23 +399,22 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
                         List<Long> ids = personList.stream()
                                 .map(person -> person.getLong(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.ID_KEY)))
                                 .collect(Collectors.toList());
-                        DynamicObject[] empPosOrgRelArray = EmpPosOrgRelHelper.queryEmpPosOrgRelById(ids);
-                        Map<Long, DynamicObject> empPosOrgRelMap = Arrays.stream(empPosOrgRelArray)
-                                .filter(Objects::nonNull)
-                                .collect(Collectors.toMap(
-                                        obj -> obj.getLong(FormConstant.ID_KEY),
-                                        obj -> obj,
-                                        (existing, replacement) -> existing
-                                ));
+                        Map<Long, DynamicObject> empPosOrgRelByEmployeesMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personIds);
+                        Set<Long> addedPersonIds = new HashSet<>();
                         for (DynamicObject person : personList) {
-                            DynamicObject entryCol = entryEntityCols.addNew();
                             long personId = person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
-                            long empPosOrgRelId = person.getLong(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.ID_KEY));
+                            // 检查人员是否已经添加过,如果已存在则跳过
+                            if (addedPersonIds.contains(personId)) {
+                                continue;
+                            }
+                            DynamicObject entryCol = entryEntityCols.addNew();
+                            addedPersonIds.add(personId); // 记录已添加的人员ID
                             String personName = person.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.NAME_KEY));
                             String personNumber = person.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.EMP_NUMBER_KEY));
 
-                            DynamicObject empPosOrgRel = empPosOrgRelMap.get(empPosOrgRelId);
-                            entryCol.set(FormConstant.NCKD_EMPPOSORGREL, empPosOrgRel);
+                            DynamicObject empPosOrgRel = empPosOrgRelByEmployeesMap.get(personId);
+                            entryCol.set(FormConstant.NCKD_DEP, empPosOrgRel.get(FormConstant.ADMINORG));
+                            entryCol.set(PositionStructureConstant.NCKD_POSITIONHR, empPosOrgRel.get(FormConstant.POSITION_KEY));
 
 
                             DynamicObjectType type = EntityMetadataCache.getDataEntityType(FormConstant.HRPI_EMPLOYEE);
@@ -481,7 +481,7 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
         this.getView().setVisible(true, PerfRankMgmtConstant.NCKD_TOPRANKS, PerfRankMgmtConstant.NCKD_ALLOWANCERANKS, PerfRankMgmtConstant.NCKD_FAILS, PerfRankMgmtConstant.NCKD_BASICS, PerfRankMgmtConstant.NCKD_EXCELLENTS, "nckd_advconbaritemap6");
         DynamicObjectCollection entryEntity = this.getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
         for (int i = 0; i < entryEntity.size(); i++) {
-            this.getView().setEnable(Boolean.FALSE, i, FormConstant.NCKD_EMPPOSORGREL);
+            this.getView().setEnable(Boolean.FALSE, i, FormConstant.NCKD_PERSON);
         }
     }
 
@@ -491,7 +491,7 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
         this.getView().setVisible(false, PerfRankMgmtConstant.NCKD_TOPRANKS, PerfRankMgmtConstant.NCKD_ALLOWANCERANKS, PerfRankMgmtConstant.NCKD_FAILS, PerfRankMgmtConstant.NCKD_BASICS, PerfRankMgmtConstant.NCKD_EXCELLENTS, "nckd_advconbaritemap6");
         DynamicObjectCollection entryEntity = this.getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
         for (int i = 0; i < entryEntity.size(); i++) {
-            this.getView().setEnable(Boolean.TRUE, i, FormConstant.NCKD_EMPPOSORGREL);
+            this.getView().setEnable(Boolean.TRUE, i, FormConstant.NCKD_PERSON);
         }
     }
 

+ 93 - 14
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/performance/PerfRankMgmtSaveOpPlugin.java

@@ -30,12 +30,14 @@ import nckd.jxccl.base.common.utils.StrFormatter;
 import nckd.jxccl.base.hrpi.helper.EmpPosOrgRelHelper;
 import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
 import nckd.jxccl.hr.psms.common.PerfRankMgmtConstant;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
 import nckd.jxccl.hr.psms.plugin.operate.performance.validate.PerfRankMgmtSaveValidate;
 import org.apache.commons.lang3.StringUtils;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import kd.bos.dataentity.utils.ObjectUtils;
 
@@ -72,34 +74,109 @@ public class PerfRankMgmtSaveOpPlugin extends AbstractOperationServicePlugIn imp
         } else{
             dataMigration = FormConstant.DATA_MIGRATION.equalsIgnoreCase(invoker.toString());
         }
+        List<Long> ids = new ArrayList<>();
+        List<Long> personids = new ArrayList<>();
+        //用来判断后续有没有必要查询任职经历,避免浪费资源
+        boolean isQueryEmpPosOrg = false;
         for (DynamicObject dataEntity : e.getDataEntities()) {
+            long id = dataEntity.getLong(FormConstant.ID_KEY);
+            if(id > 0){
+                ids.add(id);
+            }
+            DynamicObjectCollection entryList = dataEntity.getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+            for (DynamicObject entry : entryList) {
+                DynamicObject person = entry.getDynamicObject(FormConstant.NCKD_PERSON);
+                if(person != null) {
+                    personids.add(person.getLong(FormConstant.ID_KEY));
+                }
+                if(entry.getDynamicObject(FormConstant.NCKD_DEP) == null){
+                    isQueryEmpPosOrg = true;
+                }
+                if(entry.getDynamicObject(PositionStructureConstant.NCKD_POSITIONHR) == null){
+                    isQueryEmpPosOrg = true;
+                }
+            }
+        }
 
-            //事务开始前先查询数据库中的排名名单,找出哪些是此次被删除的人员
+        Map<Long, List<DynamicObject>> dbEntryMap = new HashMap<>();
+        if(!ids.isEmpty()) {
+            // 获取数据库中存在的人员ID列表
             QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
-                    .addIdNumberName(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,FormConstant.NCKD_PERSON);
-            QFilter qFilter = new QFilter(FormConstant.ID_KEY, QCP.equals, dataEntity.getLong(FormConstant.ID_KEY));
+                    .add(FormConstant.ID_KEY)
+                    .addIdNumberName(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, FormConstant.NCKD_PERSON);
+            QFilter qFilter = new QFilter(FormConstant.ID_KEY, QCP.in, ids);
             DynamicObjectCollection dbEntryList = QueryServiceHelper.query(PerfRankMgmtConstant.NCKD_PERFRANKMGMT_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter});
+            // 获取数据库中存在的记录,按记录ID分组
+            dbEntryMap = dbEntryList.stream()
+                    .collect(Collectors.groupingBy(
+                            entry -> entry.getLong(FormConstant.ID_KEY) // 按记录ID分组
+                    ));
+        }
+        Map<Long, DynamicObject> empPosOrgRelByEmployeesMap =  new HashMap<>();
+        if(!personids.isEmpty() && isQueryEmpPosOrg){
+            //获取人员最新任职
+            empPosOrgRelByEmployeesMap = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployeesMap(personids);
+        }
 
-            // 获取数据库中存在的人员ID列表
-            List<Long> dbPersonIds = dbEntryList.stream()
+
+
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+
+            //事务开始前先查询数据库中的排名名单,找出哪些是此次被删除的人员(删除的人员同步删除人员考评的考核结果)
+            List<DynamicObject> dbEntryList = dbEntryMap.get(dataEntity.getLong(FormConstant.ID_KEY));
+            List<Long> dbPersonIds = Optional.ofNullable(dbEntryList)
+                    .orElse(Collections.emptyList())
+                    .stream()
                     .map(dbEntry -> dbEntry.getLong(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,FormConstant.NCKD_PERSON, FormConstant.ID_KEY)))
                     .collect(Collectors.toList());
             dbPersonMap.put(dataEntity.getLong(FormConstant.ID_KEY), dbPersonIds);
 
-            List<Long> personids = new ArrayList<>();
+
             DynamicObjectCollection entryList = dataEntity.getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+            entryList.sort((o1, o2) -> {
+                Integer toprank1 = (Integer) o1.get(PerfRankMgmtConstant.NCKD_TOPRANK);
+                Integer toprank2 = (Integer) o2.get(PerfRankMgmtConstant.NCKD_TOPRANK);
+
+                // 如果两个值都为空或为0,则认为相等
+                if ((toprank1 == null || toprank1 == 0) && (toprank2 == null || toprank2 == 0)) {
+                    return 0;
+                }
+                // 如果第一个值为空或为0,则排在后面
+                if (toprank1 == null || toprank1 == 0) {
+                    return 1;
+                }
+                // 如果第二个值为空或为0,则排在前面
+                if (toprank2 == null || toprank2 == 0) {
+                    return -1;
+                }
+                // 都不为空且不为0则比较数值大小
+                return toprank1.compareTo(toprank2);
+            });
+            AtomicInteger rankIndex = new AtomicInteger(1);
             for (DynamicObject entry : entryList) {
                 DynamicObject person = entry.getDynamicObject(FormConstant.NCKD_PERSON);
-                DynamicObject empPosOrgRel = entry.getDynamicObject(FormConstant.NCKD_EMPPOSORGREL);
-                if(person == null && empPosOrgRel != null){
-                    entry.set(FormConstant.NCKD_PERSON, empPosOrgRel.getDynamicObject(FormConstant.EMPLOYEE_KEY));
+                personids.add(person.getLong(FormConstant.ID_KEY));
+                DynamicObject empPosOrg = empPosOrgRelByEmployeesMap.get(person.getLong(FormConstant.ID_KEY));
+                if(entry.getDynamicObject(FormConstant.NCKD_DEP) == null){
+                    //赋值组织
+                    entry.set(FormConstant.NCKD_DEP,empPosOrg.get(FormConstant.ADMINORG));
                 }
-                person = entry.getDynamicObject(FormConstant.NCKD_PERSON);
-                if(person != null) {
-                    personids.add(person.getLong(FormConstant.ID_KEY));
+                if(entry.getDynamicObject(PositionStructureConstant.NCKD_POSITIONHR) == null){
+                    //赋值岗位
+                    entry.set(PositionStructureConstant.NCKD_POSITIONHR,empPosOrg.get(FormConstant.POSITION_KEY));
+                }
+
+                //生成R排名
+                boolean isRanking = entry.getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING);
+                boolean postAllowance = entry.getBoolean(PerfRankMgmtConstant.NCKD_POSTALLOWANCE);
+                if(isRanking && postAllowance){
+                    entry.set(PerfRankMgmtConstant.NCKD_ALLOWANCERANK, rankIndex.getAndIncrement());
+                }else{
+                    entry.set(PerfRankMgmtConstant.NCKD_ALLOWANCERANK, null);
                 }
+
             }
-            if(dataMigration){
+            /*if(dataMigration){
                 //数据迁移逻辑
                 DynamicObject[] dbEmpPosOrgRelList = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployees(personids);
                 for (DynamicObject entry : entryList) {
@@ -116,7 +193,7 @@ public class PerfRankMgmtSaveOpPlugin extends AbstractOperationServicePlugIn imp
                         }
                     }
                 }
-            }
+            }*/
         }
 
     }
@@ -156,6 +233,8 @@ public class PerfRankMgmtSaveOpPlugin extends AbstractOperationServicePlugIn imp
                 if(!deletedPersonIds.isEmpty()){
                     personIds.addAll(deletedPersonIds);
                 }
+
+
                 //获取考核周期
                 List<Long> perfManagerIds = findPerfManager(theYear, personIds);
                 QFilter filter = QFilterCommonHelper.getIdInFilter(perfManagerIds);

+ 9 - 12
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/performance/validate/PerfRankMgmtSaveValidate.java

@@ -245,17 +245,17 @@ public class PerfRankMgmtSaveValidate extends AbstractValidator {
                         obj -> obj.getLong(String.join(".", PerfRankMgmtConstant.NCKD_PERSON, FormConstant.ID_KEY)),
                         obj -> obj
                 ));
-        StringJoiner msgJoiner = new StringJoiner(StrFormatter.LINE_SEPARATOR);
+//        StringJoiner msgJoiner = new StringJoiner(StrFormatter.LINE_SEPARATOR);
         for (DynamicObject entry : entries) {
             long person = entry.getDynamicObject(PerfRankMgmtConstant.NCKD_PERSON).getLong(FormConstant.ID_KEY);
             if (!personMap.containsKey(person)) {
                 String personName = entry.getDynamicObject(PerfRankMgmtConstant.NCKD_PERSON).getString(FormConstant.NAME_KEY);
-                msgJoiner.add(StrFormatter.format("人员【{}】没有【{}】年度的考核周期;", personName,theYear));
+                this.addFatalErrorMessage(rowDataEntity,StrFormatter.format("人员【{}】没有【{}】年度的考核周期;", personName,theYear));
             }
         }
-        if(msgJoiner.length() > 0){
+        /*if(msgJoiner.length() > 0){
             this.addFatalErrorMessage(rowDataEntity, msgJoiner.toString());
-        }
+        }*/
     }
 
     /**
@@ -283,11 +283,8 @@ public class PerfRankMgmtSaveValidate extends AbstractValidator {
         } else{
             dataMigration = FormConstant.DATA_MIGRATION.equalsIgnoreCase(invoker.toString());
         }
-        DynamicObject empPosOrgRel = entry.getDynamicObject(PerfRankMgmtConstant.NCKD_EMPPOSORGREL);
         DynamicObject person = entry.getDynamicObject(PerfRankMgmtConstant.NCKD_PERSON);
-        if(!dataMigration && empPosOrgRel == null){
-            this.addFatalErrorMessage(rowDataEntity, StrFormatter.format("第{}行,请选择人员\n", rowIndex));
-        }else if (person == null) {
+        if (person == null) {
             this.addFatalErrorMessage(rowDataEntity, StrFormatter.format("第{}行,请选择人员\n", rowIndex));
         } else {
             // 人员重复校验
@@ -311,7 +308,7 @@ public class PerfRankMgmtSaveValidate extends AbstractValidator {
                 }
             }
 
-            if (appraisalResult != null) {
+            if (isRanking && appraisalResult != null) {
                 String appraisalResultNumber = appraisalResult.getString(FormConstant.NUMBER_KEY);
                 AppraisalResultEnum appraisalResultEnum = AppraisalResultEnum.getByCode(appraisalResultNumber);
 
@@ -418,7 +415,7 @@ public class PerfRankMgmtSaveValidate extends AbstractValidator {
                     validateAndRecordRank(entry, PerfRankMgmtConstant.NCKD_TOPRANK, "参与排名","排名", personName, rowDataEntity, context.rankCountMap);
 
                     if (postAllowance) {
-                        validateAndRecordRank(entry, PerfRankMgmtConstant.NCKD_ALLOWANCERANK, "享受职位津贴","R排名", personName, rowDataEntity, context.rankRCountMap);
+//                        validateAndRecordRank(entry, PerfRankMgmtConstant.NCKD_ALLOWANCERANK, "享受职位津贴","R排名", personName, rowDataEntity, context.rankRCountMap);
                     }
                 }
 
@@ -443,14 +440,14 @@ public class PerfRankMgmtSaveValidate extends AbstractValidator {
                     this.addFatalErrorMessage(rowDataEntity,
                             StrFormatter.format("第{}行,排名{}超出有效范围[1-{}]\n", i + 1, topRank, totalRankCount));
                 }
-                if (postAllowance) {
+                /*if (postAllowance) {
                     // 检查R排名字段是否在有效范围内
                     int allowanceRank = entry.getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
                     if (allowanceRank < 1 || allowanceRank > totalRankCount) {
                         this.addFatalErrorMessage(rowDataEntity,
                                 StrFormatter.format("第{}行,R排名{}超出有效范围[1-{}]\n", i + 1, allowanceRank, totalRankCount));
                     }
-                }
+                }*/
             }
         }
 

+ 11 - 6
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/form/cycle/BatchEvalCycleFormPlugin.java

@@ -24,7 +24,9 @@ import nckd.jxccl.base.common.utils.ConvertUtil;
 import nckd.jxccl.base.common.utils.DateUtil;
 import nckd.jxccl.base.common.utils.StrFormatter;
 import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.org.helper.OrgHelper;
 import nckd.jxccl.opmc.pm.common.PerfManagerFormConstant;
+import nckd.jxccl.opmc.pm.common.SalAdjTrackerConstant;
 import nckd.jxccl.opmc.pm.helper.PerfManagerHelper;
 import org.apache.commons.lang3.StringUtils;
 
@@ -187,9 +189,12 @@ public class BatchEvalCycleFormPlugin extends AbstractFormPlugin implements Plug
 
     private void executeOperateSave() {
 
-        DynamicObject createOrg = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(FormConstant.CREATEORG_KEY));
-        DynamicObject useOrg = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(FormConstant.USEORG_KEY));
-        DynamicObject org = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(FormConstant.ORG_KEY));
+        DynamicObject createOrg = OrgHelper.getCreateOrg(PerfManagerFormConstant.PERFMANAGER_ENTITYID);
+        String bdCtrlStrgy = null;
+        if(createOrg != null) {
+            bdCtrlStrgy = OrgHelper.getBdCtrlStrgy(PerfManagerFormConstant.PERFMANAGER_ENTITYID, createOrg.getLong(FormConstant.ID_KEY));
+        }
+        bdCtrlStrgy = StringUtils.isNotBlank(bdCtrlStrgy) ? bdCtrlStrgy : CtrlStrategyEnum.GLOBAL_SHARE.getCtrlStrategy();
 
         String isAddOrUpdate = ConvertUtil.toStr(this.getModel().getValue("nckd_isaddorupdate"));
         boolean isUpdate = "2".equalsIgnoreCase(isAddOrUpdate);
@@ -290,11 +295,11 @@ public class BatchEvalCycleFormPlugin extends AbstractFormPlugin implements Plug
                 //新增
                 savePerfManager = EntityHelper.newEntity(PerfManagerFormConstant.PERFMANAGER_ENTITYID);
                 DynamicObjectUtils.copy(dynamicObject, savePerfManager);
-                savePerfManager.set(PerfManagerFormConstant.CTRLSTRATEGY_KEY, CtrlStrategyEnum.GLOBAL_SHARE.getCtrlStrategy());
+                savePerfManager.set(PerfManagerFormConstant.CTRLSTRATEGY_KEY, bdCtrlStrgy);
                 savePerfManager.set(FormConstant.NAME_KEY, StrFormatter.format("【{}】{}~{}的考核周期",personName,beginYear.getYear(),endYear.getYear()));
                 savePerfManager.set(PerfManagerFormConstant.CREATEORG_KEY, createOrg);
-                savePerfManager.set(PerfManagerFormConstant.ORG_KEY, org);
-                savePerfManager.set(PerfManagerFormConstant.USEORG_KEY, useOrg);
+                savePerfManager.set(PerfManagerFormConstant.ORG_KEY, createOrg);
+                savePerfManager.set(PerfManagerFormConstant.USEORG_KEY, createOrg);
                 DynamicObject empPosOrgRel = savePerfManager.getDynamicObject(FormConstant.NCKD_EMPPOSORGREL);
                 savePerfManager.set(PerfManagerFormConstant.NCKD_DEP, empPosOrgRel.getDynamicObject(FormConstant.ADMINORG));
             }