Преглед на файлове

Merge branch 'master' of http://111.75.220.136:10030/turborao/jtcosmic

Tyx преди 1 седмица
родител
ревизия
041f04f97a

+ 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);
+    }
 }

+ 21 - 0
code/opmc/nckd-jxccl-opmc/src/main/java/nckd/jxccl/opmc/pm/plugin/form/cycle/PerfManagerListPlugin.java

@@ -2,7 +2,9 @@ package nckd.jxccl.opmc.pm.plugin.form.cycle;
 
 import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.datamodel.events.PackageDataEvent;
 import kd.bos.entity.operate.OperateOptionConst;
 import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.form.CloseCallBack;
@@ -12,9 +14,11 @@ import kd.bos.form.ShowType;
 import kd.bos.form.StyleCss;
 import kd.bos.form.control.events.ItemClickEvent;
 import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeCreateListDataProviderArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.operate.FormOperate;
 import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.mvc.list.ListDataProvider;
 import kd.bos.servicehelper.operation.OperationServiceHelper;
 import kd.sdk.plugin.Plugin;
 import nckd.jxccl.base.common.constant.FormConstant;
@@ -49,6 +53,23 @@ public class PerfManagerListPlugin extends AbstractListPlugin implements Plugin
         }
     }
 
+    @Override
+    public void beforeCreateListDataProvider(BeforeCreateListDataProviderArgs args) {
+        args.setListDataProvider(new ListDataProvider() {
+            @Override
+            public DynamicObjectCollection getData(int start, int size) {
+                DynamicObjectCollection rows = super.getData(start, size);
+
+                // 为动态列设置值
+                for (DynamicObject row : rows) {
+                    DynamicObject adminOrg = row.getDynamicObject(FormConstant.NCKD_EMPPOSORGREL).getDynamicObject(FormConstant.ADMINORG);
+                }
+
+                return rows;
+            }
+        });
+    }
+
     @Override
     public void beforeDoOperation(BeforeDoOperationEventArgs args) {
         String operateKey = ((FormOperate) args.getSource()).getOperateKey();

+ 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;

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

@@ -66,6 +66,7 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
             @Override
             public void validate() {
                 //第一个循环先获取表单数据,这里需要兼容单人和批量的数据包
+                Map<Long, List<PersonPerfInfo>> currentBatchData = new HashMap<>();
                 for (ExtendedDataEntity rowDataEntity : getDataEntities()) {
                     DynamicObject data = rowDataEntity.getDataEntity();
                     int dataEntityIndex = rowDataEntity.getDataEntityIndex();
@@ -81,7 +82,50 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
                     if (beginYear != null) {
                         personBeginYearMap.put(personId, beginYear);
                     }
-                    ids.add(id);
+                    if(id > 0) {
+                        ids.add(id);
+                    }
+
+                    PersonPerfInfo perfInfo = new PersonPerfInfo(person, null,
+                            data.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR),
+                            data.getDate(PerfManagerFormConstant.NCKD_ENDYEAR),
+                            data.getString(FormConstant.DESCRIPTION_KEY),
+                            rowDataEntity.getDataEntityIndex());
+
+                    currentBatchData.computeIfAbsent(personId, k -> new ArrayList<>()).add(perfInfo);
+                }
+
+                //检查同一批次内同一人员的周期重叠
+                for (Map.Entry<Long, List<PersonPerfInfo>> entry : currentBatchData.entrySet()) {
+                    List<PersonPerfInfo> personPerfList = entry.getValue();
+                    if (personPerfList.size() > 1) {
+                        // 对同一人员的多个周期进行相互比较
+                        for (int i = 0; i < personPerfList.size(); i++) {
+                            PersonPerfInfo info1 = personPerfList.get(i);
+                            for (int j = i + 1; j < personPerfList.size(); j++) {
+                                PersonPerfInfo info2 = personPerfList.get(j);
+                                String personName = info2.getPerson().getString(FormConstant.NAME_KEY);
+
+                                // 检查开始年份是否相同
+                                if (isSameYear(info1.getBeginYear(), info2.getBeginYear())) {
+                                    addFatalErrorMessage(getDataEntities()[info1.getDataEntityIndex()],
+                                            StrFormatter.format("同批次数据中,人员【{}】存在相同的周期开始年份:{}",
+                                                    personName,info1.getBeginYear().getYear()));
+                                } else {
+                                    // 只有开始年份不相同时才检查重叠
+                                    // 检查周期是否重叠
+                                    String overlapInfo = getCycleOverlapInfo(
+                                            info1.getBeginYear(), info1.getEndYear(), null,
+                                            info2.getBeginYear(), info2.getEndYear(), null);
+
+                                    if (StringUtils.isNotBlank(overlapInfo)) {
+                                        addFatalErrorMessage(getDataEntities()[info1.getDataEntityIndex()],
+                                                StrFormatter.format("同批次数据中,人员【{}】存在重叠周期:{}",personName ,overlapInfo));
+                                    }
+                                }
+                            }
+                        }
+                    }
                 }
 
                 QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
@@ -285,54 +329,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 +412,7 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
             }
             //分录考核结果写入到表头 end
         }
-        if(!updatePerManager.isEmpty()) {
-            DynamicObject[] lastPerfManagerArray = updatePerManager.toArray(new DynamicObject[0]);
-            SaveServiceHelper.update(lastPerfManagerArray);
-        }
+
     }
 
     /**
@@ -488,6 +482,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) {

+ 4 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/init/business/CalResultCoverSalaryItemExtPlugin.java

@@ -4,6 +4,8 @@ import kd.bos.context.RequestContext;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.entity.param.CustomParam;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
 import kd.bos.servicehelper.parameter.SystemParamServiceHelper;
 import kd.bos.servicehelper.permission.PermissionServiceHelper;
 import kd.sdk.swc.hsas.business.extpoint.payroll.ICalPersonCalResultCoverExtPlugin;
@@ -25,8 +27,10 @@ import java.util.Map;
  */
 public class CalResultCoverSalaryItemExtPlugin implements ICalPersonCalResultCoverExtPlugin {
 
+    private static final Log logger = LogFactory.getLog(CalResultCoverSalaryItemExtPlugin.class);
     @Override
     public void onFillExtSalaryItem(CalResultCoverSalaryItemEventArgs event) {
+        logger.info("进入计算结果覆盖薪酬项目扩展埋点");
         ArrayList excludeItemIdList = new ArrayList<Long>();
         /**
          * 获取当前用户