Ver Fonte

refactor(perf): 重构绩效排名管理功能的人员获取和排名计算逻辑

- 添加了 IMetadata 导入用于元数据操作
- 修复了人员列表生成逻辑,添加了 generatePersonList() 方法调用
- 优化了保存和提交操作的排名计算逻辑,增加步骤判断避免重复计算
- 改进了数据实体状态设置逻辑,在保存后正确设置数据库状态
- 重构了人员获取查询逻辑,支持多种任职类型的人员覆盖(全职、上挂、满183天)
- 简化了参与排名判断逻辑,统一使用 isParticipateRank 方法处理
- 修复了排名计算触发机制,移除了不必要的重复计算条件
- 更新了数据变更检测逻辑,添加了组织字段的变更跟踪
- 优化了分录状态更新机制,确保界面状态与数据同步
wyc há 1 dia atrás
pai
commit
6a5e7f8b02

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

@@ -9,6 +9,7 @@ import kd.bos.dataentity.RefObject;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.IMetadata;
 import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.MainEntityType;
@@ -139,6 +140,8 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             importResultStep();
 
 
+        }else{
+            generatePersonList();
         }
     }
 
@@ -317,13 +320,19 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             }
         } else if(Arrays.asList(FormConstant.SAVE_OP, FormConstant.SUBMIT_OP).contains(itemKey)){
             //保存或提交先计算一遍
-            calcRankCount();
+            Integer step = ConvertUtil.toInt(this.getModel().getValue(PerfRankMgmtConstant.NCKD_STEP),0);
+            if(step == 0) {
+                calcRankCount();
+            }
             IPageCache pageCache = this.getView().getPageCache();
             if(pageCache.get("removedEntries") != null && ConvertUtil.toBoolean(pageCache.get("removedEntries"))){
                 //告诉OP需要加载被删除的分录(不参与排名)
                 FormOperate formOperate = (FormOperate) args.getSource();
                 formOperate.getOption().setVariableValue("removedEntries", "true");
             }
+
+
+
         } else if(FormConstant.DELETEENTRY_OP.equalsIgnoreCase(itemKey)){
             //校验人员考评,若考评周期已结束,则禁止删除。
             EntryGrid entryGrid = getView().getControl(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
@@ -439,13 +448,18 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             if (evt.getResult() == MessageBoxResult.Yes) {
                 OperationResult operationResult = this.getView().invokeOperation(FormConstant.SAVE_OP);
                 if (operationResult != null && operationResult.isSuccess()) {
-                    DynamicObject dataEntity = this.getModel().getDataEntity(true);
-                    dataEntity.getDataEntityState().setFromDatabase( true);
+
                     String stepValueStr = this.getPageCache().get("stepValue");
                     if (StringUtils.isNotBlank(stepValueStr)) {
                         int stepValue = ConvertUtil.toInt(stepValueStr);
                         update(stepValue);
                     }
+                    DynamicObject dataEntity = this.getModel().getDataEntity(true);
+                    dataEntity.getDataEntityState().setFromDatabase( true);
+                    DynamicObjectCollection dynamicObjectCollection = dataEntity.getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+                    for (DynamicObject dynamicObject : dynamicObjectCollection) {
+                        dynamicObject.getDataEntityState().setFromDatabase( true);
+                    }
                 }
             }
         }
@@ -470,136 +484,131 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             } else if(hasAdminOrgId){
                 billView.showTipNotification("由于您修改了【所属组织】但还没有保存,请保存之后在获取排名名单");
             }else{*/
-                IDataModel model = this.getModel();
-                DynamicObject adminOrg = ConvertUtil.toDynamicObjectOrNull(model.getValue(FormConstant.NCKD_ADMINORG));
-                int theYear = ConvertUtil.toInt(model.getValue(PerfRankMgmtConstant.NCKD_THEYEAR));
-                if(adminOrg != null) {
-                    Date targetDate = DateUtil.toDate(LocalDateTime.of(theYear, 12, 31, 23, 59, 59));
-                    String structLongNumber = adminOrg.getString(FormConstant.STRUCTLONGNUMBER);
-                    //查询所选组织下的人员
-                    //任职状态为在岗,且任职经历的任职类型为全职任职的人员((不含工作性质大类为离岗))
-                    QFilter qFilter = new QFilter(String.join(".",FormConstant.ADMINORG, FormConstant.STRUCTLONGNUMBER), QCP.like, structLongNumber + "%")
-                            .and(FormConstant.STARTDATE, QCP.less_equals, targetDate)
-                            .and(FormConstant.ENDDATE, QCP.large_equals, targetDate);
-
-                    //在职人员
-                    qFilter.and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_HIRED), QCP.equals, EnableEnum.YES.getCode());
-                    QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
-                            .add(FormConstant.ID_KEY)
-                            .add(FormConstant.STARTDATE)
-                            //用工关系状态.编码(1005_S	在职-试用中、1010_S	在职、1020_S	离职、1030_S	已退休),istrial:是否试用,ishired:是否在职
-                            .addGroup(new String[]{FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS}, FormConstant.NUMBER_KEY, FormConstant.NAME_KEY, FormConstant.IS_TRIAL, FormConstant.IS_HIRED)
-                            //任职状态分类(1010_S:在岗,1030_S:不在岗)
-                            .addIdNumberName(FormConstant.POS_STATUS, FormConstant.POST_STATE_CLS)
-                            //入职日期
-                            .addGroup(new String[]{FormConstant.HRPI_EMPENTREL}, FormConstant.ENTRYDATE)
-                            //职务级别
-                            .addGroup(new String[]{FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE}, FormConstant.NAME_KEY, FormConstant.NUMBER_KEY, FormConstant.NCKD_SORTNUM)
-                            .addGroup(new String[]{FormConstant.EMPLOYEE_KEY}, FormConstant.ID_KEY, FormConstant.NAME_KEY, FormConstant.EMP_NUMBER_KEY)
-                            //工作性质大类
-                            .addIdNumberName(FormConstant.NCKD_HBSS_WORKNATURE,FormConstant.NCKD_JOBTJOBTYPMAIN)
-                            .orderDesc(FormConstant.STARTDATE);
-
-                    // -------------------------------- 1、查询组织下的在职人员 --------------------------------
-                    QueryEntityType queryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityType("personfilequery");
-                    DynamicObjectCollection personList = HRQueryEntityHelper.getInstance().getQueryDyoColl(queryEntityType, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter}, queryFieldBuilder.buildOrder());
-                    //添加分录
-                    DynamicObjectCollection entryEntityCols = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
-                    //根据条件删除分录
-
-                    // -------------------------------- 2、删除系统生成部分人员 --------------------------------
-                    //删除系统生成部分人员
-                    entryEntityCols.removeIf(obj -> EnableEnum.NO.getCode().equals(obj.getString(PerfRankMgmtConstant.NCKD_RANKSOURCE)));
-
-                    List<Long> personIds = personList.stream()
-                            .map(person -> person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)))
+            IDataModel model = this.getModel();
+            DynamicObject adminOrg = ConvertUtil.toDynamicObjectOrNull(model.getValue(FormConstant.NCKD_ADMINORG));
+            int theYear = ConvertUtil.toInt(model.getValue(PerfRankMgmtConstant.NCKD_THEYEAR));
+            if(adminOrg != null) {
+                Date targetDate = DateUtil.toDate(LocalDateTime.of(theYear, 12, 31, 23, 59, 59));
+                String structLongNumber = adminOrg.getString(FormConstant.STRUCTLONGNUMBER);
+                //查询所选组织下的人员
+                //覆盖人员范围为:根据在职人员花名册,排名单元的所属组织和年度的上年度12月31日还在该所属组织的人员(不含岗位性质大类为离岗),其中含上挂人员(任职经历的任职类型为“上挂”)和在本所属组织待满183天的人员。取以下条件的并集
+                //顺序1、上年度12月31日,任职状态为在岗,且任职经历的任职类型为全职任职的人员((不含工作性质大类为离岗))
+                //顺序2、上年度12月31日,任职状态为在岗,且任职经历的任职类型为“上挂”
+                //顺序3:上年度12月31日,任职状态为在岗,且任职经历的任职类型为全职任职但是在本组织待满183天的人员
+                //(例如说,12月31日那一天在B组织任职,但是在A组织待满183天,应该同时出现在A组织和B组织的排名单元里面,且默认A组织为参与排名,B组织为不参与排名)
+                QFilter qFilter = new QFilter(String.join(".",FormConstant.ADMINORG, FormConstant.STRUCTLONGNUMBER), QCP.like, structLongNumber + "%")
+                        .and(FormConstant.STARTDATE, QCP.less_equals, targetDate)
+                        .and(FormConstant.ENDDATE, QCP.large_equals, targetDate)
+                        .and(String.join( ".", FormConstant.POSTYPE, FormConstant.NUMBER_KEY), QCP.in,new String[]{"JTCC_1002", "1010_S"});
+
+                //在职人员
+                qFilter.and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_HIRED), QCP.equals, EnableEnum.YES.getCode());
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .add(FormConstant.STARTDATE)
+                        //用工关系状态.编码(1005_S	在职-试用中、1010_S	在职、1020_S	离职、1030_S	已退休),istrial:是否试用,ishired:是否在职
+                        .addGroup(new String[]{FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS}, FormConstant.NUMBER_KEY, FormConstant.NAME_KEY, FormConstant.IS_TRIAL, FormConstant.IS_HIRED)
+                        //任职状态分类(1010_S:在岗,1030_S:不在岗)
+                        .addIdNumberName(FormConstant.POS_STATUS, FormConstant.POST_STATE_CLS)
+                        //入职日期
+                        .addGroup(new String[]{FormConstant.HRPI_EMPENTREL}, FormConstant.ENTRYDATE)
+                        //职务级别
+                        .addGroup(new String[]{FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE}, FormConstant.NAME_KEY, FormConstant.NUMBER_KEY, FormConstant.NCKD_SORTNUM)
+                        .addGroup(new String[]{FormConstant.EMPLOYEE_KEY}, FormConstant.ID_KEY, FormConstant.NAME_KEY, FormConstant.EMP_NUMBER_KEY)
+                        //工作性质大类
+                        .addIdNumberName(FormConstant.NCKD_HBSS_WORKNATURE,FormConstant.NCKD_JOBTJOBTYPMAIN)
+                        .orderDesc(FormConstant.STARTDATE);
+
+                // -------------------------------- 1、查询组织下的在职人员 --------------------------------
+                QueryEntityType queryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityType("personfilequery");
+                DynamicObjectCollection personList = HRQueryEntityHelper.getInstance().getQueryDyoColl(queryEntityType, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter}, queryFieldBuilder.buildOrder());
+                //添加分录
+                DynamicObjectCollection entryEntityCols = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+                //根据条件删除分录
+
+                // -------------------------------- 2、删除系统生成部分人员 --------------------------------
+                //删除系统生成部分人员
+                entryEntityCols.removeIf(obj -> EnableEnum.NO.getCode().equals(obj.getString(PerfRankMgmtConstant.NCKD_RANKSOURCE)));
+
+                List<Long> personIds = personList.stream()
+                        .map(person -> person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)))
+                        .collect(Collectors.toList());
+                //按员工ID分组,并只取开始日期最新的任职记录
+                Map<Long, DynamicObject> groupedByEmployee = personList.stream()
+                        .collect(Collectors.groupingBy(
+                                person -> person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)),
+                                Collectors.collectingAndThen(
+                                        Collectors.maxBy((p1, p2) -> {
+                                            Date date1 = p1.getDate(FormConstant.STARTDATE);
+                                            Date date2 = p2.getDate(FormConstant.STARTDATE);
+                                            if (date1 == null && date2 == null) return 0;
+                                            if (date1 == null) return -1;
+                                            if (date2 == null) return 1;
+                                            return date2.compareTo(date1); // 降序,取最新的
+                                        }),
+                                        optional -> optional.orElse(null)
+                                )
+                        ));
+                if (!personIds.isEmpty()) {
+                    Date now = new Date();
+                    // -------------------------------- 3、获取人员是否享受职位津贴 --------------------------------
+                    Map<Long, Boolean> entitledToAllowance = isEntitledToAllowance(personIds, now);
+
+                    // -------------------------------- 4、加载数据到分录 --------------------------------
+                    //预加载任职经历
+                    List<Long> ids = personList.stream()
+                            .map(person -> person.getLong(FormConstant.ID_KEY))
                             .collect(Collectors.toList());
-                    //按员工ID分组,并只取开始日期最新的任职记录
-                    Map<Long, DynamicObject> groupedByEmployee = personList.stream()
-                            .collect(Collectors.groupingBy(
-                                    person -> person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)),
-                                    Collectors.collectingAndThen(
-                                            Collectors.maxBy((p1, p2) -> {
-                                                Date date1 = p1.getDate(FormConstant.STARTDATE);
-                                                Date date2 = p2.getDate(FormConstant.STARTDATE);
-                                                if (date1 == null && date2 == null) return 0;
-                                                if (date1 == null) return -1;
-                                                if (date2 == null) return 1;
-                                                return date2.compareTo(date1); // 降序,取最新的
-                                            }),
-                                            optional -> optional.orElse(null)
-                                    )
+                    MainEntityType empOrgRelEntityType = EntityMetadataCache.getDataEntityType(FormConstant.HRPI_EMPPOSORGREL);
+                    DynamicObject[] empOrgRelArray = BusinessDataServiceHelper.load(ids.toArray(), empOrgRelEntityType);
+                    Map<Long, DynamicObject> empOrgRelMap = Arrays.stream(empOrgRelArray)
+                            .collect(Collectors.toMap(
+                                    obj -> obj.getLong(FormConstant.ID_KEY),
+                                    obj -> obj,
+                                    (existing, replacement) -> existing
                             ));
-                    if (!personIds.isEmpty()) {
-                        Date now = new Date();
-                        // -------------------------------- 3、获取人员是否享受职位津贴 --------------------------------
-                        Map<Long, Boolean> entitledToAllowance = isEntitledToAllowance(personIds, now);
-
-                        // -------------------------------- 4、加载数据到分录 --------------------------------
-                        //预加载任职经历
-                        List<Long> ids = personList.stream()
-                                .map(person -> person.getLong(FormConstant.ID_KEY))
-                                .collect(Collectors.toList());
-                        MainEntityType empOrgRelEntityType = EntityMetadataCache.getDataEntityType(FormConstant.HRPI_EMPPOSORGREL);
-                        DynamicObject[] empOrgRelArray = BusinessDataServiceHelper.load(ids.toArray(), empOrgRelEntityType);
-                        Map<Long, DynamicObject> empOrgRelMap = Arrays.stream(empOrgRelArray)
-                                .collect(Collectors.toMap(
-                                        obj -> obj.getLong(FormConstant.ID_KEY),
-                                        obj -> obj,
-                                        (existing, replacement) -> existing
-                                ));
-                        Set<Long> addedPersonIds = new HashSet<>();
-                        for (Map.Entry<Long, DynamicObject> personEntry : groupedByEmployee.entrySet()) {
-                            DynamicObject person = personEntry.getValue();
-                            long id = person.getLong(FormConstant.ID_KEY);
-                            long personId = person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
-                            // 检查人员是否已经添加过,如果已存在则跳过
-                            if (addedPersonIds.contains(personId)) {
-                                continue;
-                            }
-                            DynamicObject empPosOrgRel = empOrgRelMap.get(id);
-                            if(empPosOrgRel == null){
-                                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));
+                    Set<Long> addedPersonIds = new HashSet<>();
+                    for (Map.Entry<Long, DynamicObject> personEntry : groupedByEmployee.entrySet()) {
+                        DynamicObject person = personEntry.getValue();
+                        long id = person.getLong(FormConstant.ID_KEY);
+                        long personId = person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
+                        // 检查人员是否已经添加过,如果已存在则跳过
+                        if (addedPersonIds.contains(personId)) {
+                            continue;
+                        }
+                        DynamicObject empPosOrgRel = empOrgRelMap.get(id);
+                        if(empPosOrgRel == null){
+                            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));
 
 
-                            entryCol.set(FormConstant.NCKD_DEP, empPosOrgRel.get(FormConstant.ADMINORG));
-                            entryCol.set(PositionStructureConstant.NCKD_POSITIONHR, empPosOrgRel.get(FormConstant.POSITION_KEY));
+                        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);
-                            DynamicObject personObj = (DynamicObject) type.createInstance();
-                            personObj.set(FormConstant.ID_KEY, personId);
-                            personObj.set(FormConstant.NAME_KEY, personName);
-                            personObj.set(FormConstant.EMP_NUMBER_KEY, personNumber);
-                            entryCol.set(FormConstant.NCKD_PERSON, personObj);
+                        DynamicObjectType type = EntityMetadataCache.getDataEntityType(FormConstant.HRPI_EMPLOYEE);
+                        DynamicObject personObj = (DynamicObject) type.createInstance();
+                        personObj.set(FormConstant.ID_KEY, personId);
+                        personObj.set(FormConstant.NAME_KEY, personName);
+                        personObj.set(FormConstant.EMP_NUMBER_KEY, personNumber);
+                        entryCol.set(FormConstant.NCKD_PERSON, personObj);
 
 
 
-                            //是否试用
-                            boolean isTrial = person.getBoolean(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_TRIAL));
-                            //入职日期
-                            Date entryDate = person.getDate(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.ENTRYDATE));
-                            //职务级别编码
-                            Integer posGradeSort = null;
-                            if (person.containsProperty(FormConstant.NCKD_HRPI_PARTYPOSH)
-                                    && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE))
-                                    && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM))) {
-                                posGradeSort = person.getInt(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM));
-                            }
-                            StringBuilder reason = new StringBuilder();
-                            boolean participateRank = isParticipateRank(isTrial, entryDate, posGradeSort, reason);
-                            entryCol.set(PerfRankMgmtConstant.NCKD_ISRANKING, participateRank);
-                            entryCol.set(PerfRankMgmtConstant.NCKD_EXCLUDERANKREASON, reason.toString());
-                            entryCol.set(PerfRankMgmtConstant.NCKD_RANKSOURCE, EnableEnum.NO.getCode());
-                            //判断是否有职位津贴
-                            boolean hasAllowance = entitledToAllowance.get(personId);
-                            entryCol.set(PerfRankMgmtConstant.NCKD_POSTALLOWANCE, hasAllowance);
-                        }
+
+                        StringBuilder reason = new StringBuilder();
+                        boolean participateRank = isParticipateRank(person, reason);
+                        entryCol.set(PerfRankMgmtConstant.NCKD_ISRANKING, participateRank);
+                        entryCol.set(PerfRankMgmtConstant.NCKD_EXCLUDERANKREASON, reason.toString());
+                        entryCol.set(PerfRankMgmtConstant.NCKD_RANKSOURCE, EnableEnum.NO.getCode());
+                        //判断是否有职位津贴
+                        boolean hasAllowance = entitledToAllowance.get(personId);
+                        entryCol.set(PerfRankMgmtConstant.NCKD_POSTALLOWANCE, hasAllowance);
+                    }
 
                         /*this.getModel().updateEntryCache(entryEntityCols);
                         this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);*/
@@ -616,12 +625,11 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
                             this.getView().updateView(PerfRankMgmtConstant.NCKD_ISRANKING,i);
 
                         }*/
-                        this.getView().showSuccessNotification("名单获取完成");
-                        this.getView().invokeOperation(FormConstant.REFRESH_OP);
-                    } else {
-                        this.getView().showTipNotification("未获取到人员");
-                    }
+                    this.getView().showSuccessNotification("名单获取完成");
+                } else {
+                    this.getView().showTipNotification("未获取到人员");
                 }
+            }
             /* }*/
         }else if(PerfRankMgmtConstant.SAVE_OP.equalsIgnoreCase(itemKey)){
             if(afterDoOperationEventArgs.getOperationResult() != null && afterDoOperationEventArgs.getOperationResult().isSuccess()){
@@ -641,12 +649,12 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
         }
         if(Arrays.asList(FormConstant.DELETEENTRY_OP, PerfRankMgmtConstant.GETRANKLIST_OP).contains(itemKey)){
             sortEntry();
-            calcRankCount();
+//            calcRankCount();
         }
         // this.getView().setStatus(OperationStatus.EDIT);
     }
 
-    @Override
+/*    @Override
     public void getEntityType(GetEntityTypeEventArgs e) {
         super.getEntityType(e);
 
@@ -656,17 +664,15 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
         } catch (CloneNotSupportedException ex) {
             throw new RuntimeException(ex);
         }
-    }
+    }*/
 
     private void importResultStep() {
         this.getModel().setValue(PerfRankMgmtConstant.NCKD_STEP,1);
+        this.getView().updateView(PerfRankMgmtConstant.NCKD_STEP);
         this.getView().setVisible(false, FormConstant.NUMBER_KEY, PerfRankMgmtConstant.NCKD_GETRANKLIST,"nckd_advconbaritemap2","nckd_advconbaritemap3");
-        this.getView().setVisible(true, PerfRankMgmtConstant.NCKD_TOPRANKS, PerfRankMgmtConstant.NCKD_ALLOWANCERANKS, PerfRankMgmtConstant.NCKD_FAILS, PerfRankMgmtConstant.NCKD_BASICS, PerfRankMgmtConstant.NCKD_EXCELLENTS, "nckd_advconbaritemap6","nckd_advconbaritemap");
-        DynamicObjectCollection entryEntity = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
-        for (int i = 0; i < entryEntity.size(); i++) {
-            this.getView().setEnable(Boolean.FALSE, i, FormConstant.NCKD_PERSON);
-            this.getView().setEnable(Boolean.FALSE, i, PerfRankMgmtConstant.NCKD_ISRANKING);
-        }
+        this.getView().setVisible(true, PerfRankMgmtConstant.NCKD_TOPRANKS, PerfRankMgmtConstant.NCKD_ALLOWANCERANKS, PerfRankMgmtConstant.NCKD_FAILS,PerfRankMgmtConstant.NCKD_APPRAISALRESULT,
+                PerfRankMgmtConstant.NCKD_POSTALLOWANCE,PerfRankMgmtConstant.NCKD_ALLOWANCERANK,PerfRankMgmtConstant.NCKD_BASICS, PerfRankMgmtConstant.NCKD_EXCELLENTS,PerfRankMgmtConstant.NCKD_TOPRANK, "nckd_advconbaritemap6","nckd_advconbaritemap");
+
         DynamicObjectCollection dbEntryEntity = null;
         Long id = ConvertUtil.toLong(this.getModel().getValue(FormConstant.ID_KEY));
         if (id != null && id > 0) {
@@ -687,6 +693,14 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             this.getView().getPageCache().put("removedEntries","false");
         }
         this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+        this.getModel().updateEntryCache(entryEntityCols);
+
+        DynamicObjectCollection entryEntity = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+        for (int i = 0; i < entryEntity.size(); i++) {
+            this.getView().setEnable(Boolean.FALSE, i, FormConstant.NCKD_PERSON);
+            this.getView().setEnable(Boolean.FALSE, i, PerfRankMgmtConstant.NCKD_ISRANKING);
+            this.getView().updateView(PerfRankMgmtConstant.NCKD_ISRANKING,i);
+        }
 
     }
 
@@ -696,6 +710,7 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
         if(pageCache.get("removedEntries") != null && ConvertUtil.toBoolean(pageCache.get("removedEntries"))) {
             Long id = ConvertUtil.toLong(this.getModel().getValue(FormConstant.ID_KEY));
             if (id != null && id > 0) {
+
                 MainEntityType perfRankMgmtEntityType = EntityMetadataCache.getDataEntityType(PerfRankMgmtConstant.NCKD_PERFRANKMGMT_ENTITYID);
                 DynamicObject dbPerfRankMgmt = BusinessDataServiceHelper.loadSingle(id, perfRankMgmtEntityType);
                 DynamicObjectCollection dynamicObjectCollection = dbPerfRankMgmt.getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
@@ -719,22 +734,35 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
                         .collect(Collectors.toList());
 
                 entryEntityCols.addAll(entriesToAdd);
+
                 this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+                this.getModel().updateEntryCache(entryEntityCols);
                 this.getView().getPageCache().put("removedEntries", "false");
             }
         }
         this.getModel().setValue(PerfRankMgmtConstant.NCKD_STEP,0);
+        this.getView().updateView(PerfRankMgmtConstant.NCKD_STEP);
         this.getView().setVisible(true, FormConstant.NUMBER_KEY, PerfRankMgmtConstant.NCKD_GETRANKLIST,"nckd_advconbaritemap2","nckd_advconbaritemap3");
-        this.getView().setVisible(false, PerfRankMgmtConstant.NCKD_TOPRANKS, PerfRankMgmtConstant.NCKD_ALLOWANCERANKS, PerfRankMgmtConstant.NCKD_FAILS, PerfRankMgmtConstant.NCKD_BASICS, PerfRankMgmtConstant.NCKD_EXCELLENTS, "nckd_advconbaritemap6","nckd_advconbaritemap");
+        this.getView().setVisible(false, PerfRankMgmtConstant.NCKD_TOPRANKS, PerfRankMgmtConstant.NCKD_ALLOWANCERANKS, PerfRankMgmtConstant.NCKD_FAILS,PerfRankMgmtConstant.NCKD_APPRAISALRESULT,
+                PerfRankMgmtConstant.NCKD_POSTALLOWANCE,PerfRankMgmtConstant.NCKD_ALLOWANCERANK,PerfRankMgmtConstant.NCKD_BASICS, PerfRankMgmtConstant.NCKD_EXCELLENTS,PerfRankMgmtConstant.NCKD_TOPRANK, "nckd_advconbaritemap6","nckd_advconbaritemap");
         DynamicObjectCollection entryEntity = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
         for (int i = 0; i < entryEntity.size(); i++) {
             this.getView().setEnable(Boolean.TRUE, i, FormConstant.NCKD_PERSON);
             this.getView().setEnable(Boolean.TRUE, i, PerfRankMgmtConstant.NCKD_ISRANKING);
-            DynamicObject dynamicObject = entryEntity.get(i);
-            if(!entryEntity.get( i).getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING)){
-                dynamicObject.getDataEntityState().setFromDatabase( true);
+            Boolean aBoolean = ConvertUtil.toBoolean(this.getModel().getValue(PerfRankMgmtConstant.NCKD_ISRANKING, i), false);
+            if(!aBoolean){
+               /* this.getModel().setValue(PerfRankMgmtConstant.NCKD_ISRANKING, true, i);
+                this.getModel().setValue(PerfRankMgmtConstant.NCKD_ISRANKING, false, i);*/
+               /* DynamicObject dynamicObject = entryEntity.get(i);
+                if(!entryEntity.get(i).getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING)){
+                    dynamicObject.getDataEntityState().setFromDatabase( true);
+                }*/
             }
+            this.getView().updateView(PerfRankMgmtConstant.NCKD_ISRANKING,i);
+
         }
+        this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+        this.getModel().updateEntryCache(entryEntity);
 
     }
 
@@ -804,7 +832,24 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
      * @author W.Y.C
      * @date: 2025/10/20 20:17
      */
-    private boolean isParticipateRank(boolean isTrial,Date entryDate,Integer posGradeSort,StringBuilder reason) {
+    private boolean isParticipateRank(DynamicObject person,StringBuilder reason) {
+        //是否试用
+        boolean isTrial = person.getBoolean(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_TRIAL));
+        //入职日期
+        Date entryDate = person.getDate(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.ENTRYDATE));
+        //职务级别编码
+        Integer posGradeSort = null;
+        if (person.containsProperty(FormConstant.NCKD_HRPI_PARTYPOSH)
+                && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE))
+                && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM))) {
+            posGradeSort = person.getInt(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM));
+        }
+        //工作性质大类
+        String jobtJobTypMain = null;
+        if(person.containsProperty(String.join(".", FormConstant.NCKD_HBSS_WORKNATURE, FormConstant.NCKD_JOBTJOBTYPMAIN,FormConstant.NUMBER_KEY))){
+            jobtJobTypMain = person.getString(String.join(".", FormConstant.NCKD_HBSS_WORKNATURE, FormConstant.NCKD_JOBTJOBTYPMAIN, FormConstant.NUMBER_KEY));
+        }
+
         //获取入职天数
         long between = DateUtil.between(DateUtil.toLocalDateTime(entryDate), DateUtil.now(), ChronoUnit.DAYS);
         if(between < 183){
@@ -820,6 +865,10 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             reason.append("副科级及以上不参与");
             return false;
         }
+        if(FormConstant.NCKD_JOBTJOBTYPMAIN_LEAVE_NUMBER.equalsIgnoreCase(jobtJobTypMain)){
+            reason.append("工作性质大类为离岗");
+            return false;
+        }
         return true;
     }
 
@@ -883,10 +932,6 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
     private void calcRankCount(){
         DynamicObjectCollection entryEntity = this.getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
         Object value = this.getModel().getValue(PerfRankMgmtConstant.NCKD_TOPRANKS);
-        if(value != null && ConvertUtil.toInt( value) > 0){
-            //有值了就不计算
-            return;
-        }
         int totalRankCount = 0;
         int allowanceRankCount = 0;
         int failCount = 0;
@@ -972,7 +1017,7 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
             DynamicObject dataEntity = this.getModel().getDataEntity(true);
             boolean hasChanged = false;
             List<IDataEntityProperty> iDataEntityProperties = dataEntity.getDataEntityState().GetDirtyProperties();
-            ArrayList<String> fields = Lists.newArrayList(PerfRankMgmtConstant.NCKD_STEP,FormConstant.STATUS);
+            ArrayList<String> fields = Lists.newArrayList(PerfRankMgmtConstant.NCKD_STEP,FormConstant.STATUS,FormConstant.USEORG_KEY,"useorg_id");
             for (IDataEntityProperty iDataEntityProperty : iDataEntityProperties) {
                 if (fields.stream().noneMatch(ignoreField -> ignoreField.equalsIgnoreCase(iDataEntityProperty.getName()))) {
                     hasChanged = true;
@@ -982,7 +1027,16 @@ public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements Wizard
                 DynamicObjectCollection entityColl = dataEntity.getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
                 for (DynamicObject dynamicObject : entityColl) {
                     List<IDataEntityProperty> iDataEntityProperties1 = dynamicObject.getDataEntityState().GetDirtyProperties();
-                    if (!iDataEntityProperties1.isEmpty()) {
+                    List<String> name = iDataEntityProperties1.stream().map(IMetadata::getName).collect(Collectors.toList());
+
+                    // 判断name中是否只有"seq"或FormConstant.NCKD_DEP或同时只存在这两个值
+                    boolean onlyContainsSeqAndDep = !name.isEmpty() &&
+                            name.stream().allMatch(ignoreField ->
+                                    ignoreField.equalsIgnoreCase("seq") ||
+                                            ignoreField.equalsIgnoreCase(FormConstant.NCKD_DEP)
+                            );
+
+                    if (!iDataEntityProperties1.isEmpty() && !onlyContainsSeqAndDep) {
                         hasChanged = true;
                     }
                 }