ソースを参照

refactor(performance): 重构绩效管理表单插件逻辑

- 重命名类名 PerfrankMgmtFormPlugin 为 PerfRankMgmtFormPlugin
- 实现 WizardStepsListener 接口以支持向导步骤监听
- 移除未使用的导入包 ListSelectedRow 和 ListSelectedRowCollection
- 新增对 EntryQueryParam、Control、StepEvent 等类的引用
- 添加 generatePersonList 方法用于初始化人员列表显示状态
- 在 update 方法中实现向导步骤切换时的业务逻辑处理
- 调整绩效周期保存操作中的历史周期结束标记逻辑位置
- 将周期结束相关代码从 save 方法迁移至 endOperationTransaction 方法中执行
wyc 1 週間 前
コミット
69350cf5ad

+ 45 - 4
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/performance/PerfrankMgmtFormPlugin.java → code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/performance/PerfRankMgmtFormPlugin.java

@@ -10,10 +10,9 @@ import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.QueryEntityType;
 import kd.bos.entity.constant.StatusEnum;
 import kd.bos.entity.datamodel.IDataModel;
-import kd.bos.entity.datamodel.ListSelectedRow;
-import kd.bos.entity.datamodel.ListSelectedRowCollection;
 import kd.bos.entity.datamodel.RowDataEntity;
 import kd.bos.entity.datamodel.events.*;
+import kd.bos.entity.property.entryfilter.EntryQueryParam;
 import kd.bos.ext.hr.service.query.QueryEntityHelper;
 import kd.bos.form.ConfirmCallBackListener;
 import kd.bos.form.ConfirmTypes;
@@ -21,8 +20,11 @@ import kd.bos.form.IClientViewProxy;
 import kd.bos.form.MessageBoxOptions;
 import kd.bos.form.MessageBoxResult;
 import kd.bos.form.container.Wizard;
+import kd.bos.form.control.Control;
 import kd.bos.form.control.EntryGrid;
 import kd.bos.form.control.Steps;
+import kd.bos.form.control.events.StepEvent;
+import kd.bos.form.control.events.WizardStepsListener;
 import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.events.MessageBoxClosedEvent;
@@ -30,6 +32,7 @@ import kd.bos.form.operate.FormOperate;
 import kd.bos.form.plugin.AbstractFormPlugin;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
+import kd.bos.metadata.form.container.WizardAp;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
@@ -62,12 +65,19 @@ import java.util.stream.Stream;
 * @date 2025/10/20 15:11
 * @version 1.0
 */
-public class PerfrankMgmtFormPlugin extends AbstractFormPlugin {
+public class PerfRankMgmtFormPlugin extends AbstractFormPlugin implements WizardStepsListener {
 
-    private static final Log logger = LogFactory.getLog(PerfrankMgmtFormPlugin.class);
+    private static final Log logger = LogFactory.getLog(PerfRankMgmtFormPlugin.class);
 
     private final static String CALLBACK_ID = "interrupt_confirm";
 
+    @Override
+    public void registerListener(EventObject e) {
+        Wizard wizard = this.getControl(FormConstant.NCKD_WIZARDAP);
+        wizard.addWizardStepsListener(this);
+    }
+
+
     @Override
     public void afterBindData(EventObject e) {
         sortEntry();
@@ -464,6 +474,16 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin {
         }
     }
 
+    private void generatePersonList() {
+        this.getModel().setValue(PerfRankMgmtConstant.NCKD_STEP,0);
+        this.getView().setVisible(true, FormConstant.NUMBER_KEY, PerfRankMgmtConstant.NCKD_GETRANKLIST);
+        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);
+        }
+    }
+
     /**
      * 判断人员是否享受职位津贴
      * @param personIds 人员ID列表
@@ -684,4 +704,25 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin {
         wizard.setWizardCurrentStep(currentStepMap);
         this.getView().getPageCache().put(FormConstant.NCKD_WIZARDAP, step+"");
     }
+
+    @Override
+    public void update(StepEvent stepEvent) {
+        Wizard wizard = this.getControl(FormConstant.NCKD_WIZARDAP);
+        if(stepEvent.getValue() == 0){
+            generatePersonList();
+            setStepStatus(0, Steps.PROCESS);
+        }else{
+            //校验有没有保存
+            DynamicObject dataEntity = this.getModel().getDataEntity();
+            Object pkValue = dataEntity.getPkValue();
+            if(pkValue == null || pkValue.toString().equals("0")){
+                this.getView().showTipNotification("请先生成名单并保存后再进行下一步!");
+            }else {
+                importResultStep();
+                setStepStatus(1, Steps.PROCESS);
+            }
+        }
+        this.getView().updateView(PerfRankMgmtConstant.NCKD_STEP);
+        this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
+    }
 }

+ 1 - 7
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/form/result/AnnualPerfDetailReportListDataPlugin.java

@@ -1,19 +1,13 @@
 package nckd.jxccl.opmc.pm.plugin.form.result;
 
 import kd.bos.algo.DataSet;
-import kd.bos.common.enums.EnableEnum;
 import kd.bos.dataentity.entity.LocaleString;
 import kd.bos.entity.EntityMetadataCache;
 import kd.bos.entity.QueryEntityType;
-import kd.bos.entity.report.AbstractReportColumn;
-import kd.bos.entity.report.AbstractReportListDataPlugin;
-import kd.bos.entity.report.FastFilter;
-import kd.bos.entity.report.ReportColumn;
-import kd.bos.entity.report.ReportQueryParam;
+import kd.bos.entity.report.*;
 import kd.bos.ext.hr.service.query.QueryEntityHelper;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
-import kd.bos.servicehelper.QueryServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
 import nckd.jxccl.base.common.utils.DateUtil;

+ 69 - 51
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/operate/cycle/PerfManagerSaveOpPlugin.java

@@ -285,54 +285,7 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
             if(StringUtils.isBlank(name)){
                 dataEntity.set(FormConstant.NAME_KEY, StrFormatter.format("【{}】{}~{}的考核周期",personName,beginYear.getYear(),endYear.getYear()));
             }
-            //上一周期标记为“已结束”并设置“实际结束时间” begin
-            if(!isUpdate) {
-                //找出当前周期前还未结束的考核周期
-                QFilter filter = null;
-                if (id > 0) {
-                    filter = new QFilter(FormConstant.ID_KEY, QCP.not_in, id);
-                }
-                DynamicObject[] beforeBeginYear = PerfManagerHelper.getBeforeBeginYear(DateUtil.toDate(beginYear), Collections.singletonList(personId), filter);
-                if (beforeBeginYear != null && beforeBeginYear.length > 0) {
-                    DynamicObject[] allPerfManagerArray = PerfManagerHelper.getByPersonId(Collections.singletonList(personId), filter);
-                    List<DynamicObject> allPerfManagerList = new ArrayList<>(Arrays.asList(allPerfManagerArray));
-                    allPerfManagerList.add(dataEntity);
-                    for (DynamicObject lastPerfManager : beforeBeginYear) {
-                        lastPerfManager.set(PerfManagerFormConstant.NCKD_THESTATUS, "3");
-                        //找到当前周期的下一周期
-                        Date currentBeginYear = lastPerfManager.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR);
-                        Date currentEndYear = lastPerfManager.getDate(PerfManagerFormConstant.NCKD_ENDYEAR);
 
-                        DynamicObject nextCycle = findNextCycle(allPerfManagerList, currentBeginYear);
-                        if (nextCycle != null) {
-                            // 获取下一周期的开始年份
-                            Date nextBeginYear = nextCycle.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR);
-                            LocalDateTime nextBeginLocalDateTime = DateUtil.toLocalDateTime(nextBeginYear);
-                            // 计算预期的实际结束年份:下一周期开始时间-1年
-                            LocalDateTime expectedActEndYear = DateUtil.minusYears(nextBeginLocalDateTime, 1);
-                            LocalDateTime currentEndLocalDateTime = DateUtil.toLocalDateTime(currentEndYear);
-                            // 如果预期结束时间大于等于当前周期的结束时间,说明中间有断层
-                            // 则实际结束时间设置为当前周期的结束时间
-                            // 否则设置为预期的实际结束时间(下一周期开始时间-1年)
-                            LocalDateTime actEndYear = expectedActEndYear.isAfter(currentEndLocalDateTime) ?
-                                    currentEndLocalDateTime : expectedActEndYear;
-                            lastPerfManager.set(PerfManagerFormConstant.NCKD_ACTENDYEAR, DateUtil.toDate(actEndYear));
-                        } else {
-                            // 如果没有找到下一周期,则实际结束时间设置为当前周期的结束时间
-                            lastPerfManager.set(PerfManagerFormConstant.NCKD_ACTENDYEAR, currentEndYear);
-                        }
-                        String str = isCycleGenerate ? "周期生成" : "手动/导入新增周期";
-                        lastPerfManager.set(PerfManagerFormConstant.NCKD_WHYEND, StrFormatter.format("{}({}~{}),系统自动结束前周期", str, beginYear.getYear(), endYear.getYear()));
-                        updatePerManager.add(lastPerfManager);
-                    }
-                    //找到当前周期的上一周期
-                    DynamicObject previousCycle = findPreviousCycle(allPerfManagerList, DateUtil.toDate(beginYear));
-                    if (previousCycle != null) {
-                        dataEntity.set(PerfManagerFormConstant.NCKD_LASTPERFMANAGER, previousCycle);
-                    }
-                }
-            }
-            //上一周期标记为“已结束”并设置“实际结束时间” end
 
             /*DynamicObject lastPerfManager = lastPerfManagerMap.get(personId);
             if(lastPerfManager != null) {
@@ -415,10 +368,7 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
             }
             //分录考核结果写入到表头 end
         }
-        if(!updatePerManager.isEmpty()) {
-            DynamicObject[] lastPerfManagerArray = updatePerManager.toArray(new DynamicObject[0]);
-            SaveServiceHelper.update(lastPerfManagerArray);
-        }
+
     }
 
     /**
@@ -488,6 +438,74 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
     @Override
     public void endOperationTransaction(EndOperationTransactionArgs e) {
         PerfManagerHelper.markAsCurrentNewest(personBeginYearMap.keySet(),null);
+
+        //上一周期标记为“已结束”并设置“实际结束时间” begin
+        Boolean isCycleGenerate = ConvertUtil.toBoolean(this.getOption().getVariableValue("cyclegenerate",StringUtils.EMPTY),Boolean.FALSE);
+        Boolean isUpdate = ConvertUtil.toBoolean(this.getOption().getVariableValue("isUpdate",StringUtils.EMPTY),Boolean.FALSE);
+        List<DynamicObject> updatePerManager = new ArrayList<>();
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            long id = dataEntity.getLong(FormConstant.ID_KEY);
+            DynamicObject person = dataEntity.getDynamicObject(FormConstant.NCKD_PERSON);
+            person = person == null ? dataEntity.getDynamicObject(FormConstant.NCKD_EMPPOSORGREL).getDynamicObject(FormConstant.EMPLOYEE_KEY) : person;
+            dataEntity.set(FormConstant.NCKD_PERSON, person);
+            LocalDateTime beginYear = DateUtil.toLocalDateTime(dataEntity.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR));
+            LocalDateTime endYear = DateUtil.toLocalDateTime(dataEntity.getDate(PerfManagerFormConstant.NCKD_ENDYEAR));
+            long personId = person.getLong(FormConstant.ID_KEY);
+
+            if(!isUpdate) {
+                //找出当前周期前还未结束的考核周期
+                QFilter filter = null;
+                if (id > 0) {
+                    filter = new QFilter(FormConstant.ID_KEY, QCP.not_in, id);
+                }
+                DynamicObject[] beforeBeginYear = PerfManagerHelper.getBeforeBeginYear(DateUtil.toDate(beginYear), Collections.singletonList(personId), filter);
+                if (beforeBeginYear != null && beforeBeginYear.length > 0) {
+                    DynamicObject[] allPerfManagerArray = PerfManagerHelper.getByPersonId(Collections.singletonList(personId), filter);
+                    List<DynamicObject> allPerfManagerList = new ArrayList<>(Arrays.asList(allPerfManagerArray));
+                    allPerfManagerList.add(dataEntity);
+                    for (DynamicObject lastPerfManager : beforeBeginYear) {
+                        lastPerfManager.set(PerfManagerFormConstant.NCKD_THESTATUS, "3");
+                        //找到当前周期的下一周期
+                        Date currentBeginYear = lastPerfManager.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR);
+                        Date currentEndYear = lastPerfManager.getDate(PerfManagerFormConstant.NCKD_ENDYEAR);
+
+                        DynamicObject nextCycle = findNextCycle(allPerfManagerList, currentBeginYear);
+                        if (nextCycle != null) {
+                            // 获取下一周期的开始年份
+                            Date nextBeginYear = nextCycle.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR);
+                            LocalDateTime nextBeginLocalDateTime = DateUtil.toLocalDateTime(nextBeginYear);
+                            // 计算预期的实际结束年份:下一周期开始时间-1年
+                            LocalDateTime expectedActEndYear = DateUtil.minusYears(nextBeginLocalDateTime, 1);
+                            LocalDateTime currentEndLocalDateTime = DateUtil.toLocalDateTime(currentEndYear);
+                            // 如果预期结束时间大于等于当前周期的结束时间,说明中间有断层
+                            // 则实际结束时间设置为当前周期的结束时间
+                            // 否则设置为预期的实际结束时间(下一周期开始时间-1年)
+                            LocalDateTime actEndYear = expectedActEndYear.isAfter(currentEndLocalDateTime) ?
+                                    currentEndLocalDateTime : expectedActEndYear;
+                            lastPerfManager.set(PerfManagerFormConstant.NCKD_ACTENDYEAR, DateUtil.toDate(actEndYear));
+                        } else {
+                            // 如果没有找到下一周期,则实际结束时间设置为当前周期的结束时间
+                            lastPerfManager.set(PerfManagerFormConstant.NCKD_ACTENDYEAR, currentEndYear);
+                        }
+                        String str = isCycleGenerate ? "周期生成" : "手动/导入新增周期";
+                        lastPerfManager.set(PerfManagerFormConstant.NCKD_WHYEND, StrFormatter.format("{}({}~{}),系统自动结束前周期", str, beginYear.getYear(), endYear.getYear()));
+                        updatePerManager.add(lastPerfManager);
+                    }
+                    //找到当前周期的上一周期
+                    DynamicObject previousCycle = findPreviousCycle(allPerfManagerList, DateUtil.toDate(beginYear));
+                    if (previousCycle != null) {
+                        dataEntity.set(PerfManagerFormConstant.NCKD_LASTPERFMANAGER, previousCycle);
+                        SaveServiceHelper.update(dataEntity);
+                    }
+                }
+            }
+
+        }
+        if(!updatePerManager.isEmpty()) {
+            DynamicObject[] lastPerfManagerArray = updatePerManager.toArray(new DynamicObject[0]);
+            SaveServiceHelper.update(lastPerfManagerArray);
+        }
+        //上一周期标记为“已结束”并设置“实际结束时间” end
     }
 
     private boolean showInteractionMessage(String confirMmsg) {