Ver código fonte

feat(hr): 新增管理人员任命功能及相关插件

- 新增管理人员任命导入插件 MgrAppointMgmtImportPlugin
- 新增管理人员任命列表插件 MgrAppointMgmtListPlugin
- 新增新建任命弹窗插件 NewApptPopupFormPlugin
- 新增员工职位档案保存操作插件 PersonPosFileSaveOpPlugin
- 新增终止管理人员任命操作插件 EndAppointMentOpPlugin
- 新增新建管理人员任命操作插件 NewAppointMentOpPlugin
- 优化 ShowOperExecuteResult 工具类,支持从表单视图获取页面缓存
- 更新 DateUtil 中的最大日期至 2999 年
- 完善 OrgHelper 和 EmpPosOrgRelHelper 辅助类功能
- 添加 PositionStructureConstant 中新建任命相关常量定义
wyc 1 semana atrás
pai
commit
098bf54575
15 arquivos alterados com 598 adições e 68 exclusões
  1. 3 3
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/DateUtil.java
  2. 35 25
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/ShowOperExecuteResult.java
  3. 1 0
      code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/hrpi/helper/EmpPosOrgRelHelper.java
  4. 18 0
      code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/org/helper/OrgHelper.java
  5. 5 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/common/PositionStructureConstant.java
  6. 61 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/other/MgrAppointMgmtListPlugin.java
  7. 85 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/other/NewApptPopupFormPlugin.java
  8. 50 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/other/impt/MgrAppointMgmtImportPlugin.java
  9. 41 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/file/PersonPosFileSaveOpPlugin.java
  10. 64 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/other/EndAppointMentOpPlugin.java
  11. 229 0
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/other/NewAppointMentOpPlugin.java
  12. 2 14
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/SubCoHeadServiceListPlugin.java
  13. 3 14
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/TenurePersonListListPlugin.java
  14. 1 10
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/AbstractStructApprFormPlugin.java
  15. 0 2
      code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/empmgt/SubCoHeadServiceOpPlugin.java

+ 3 - 3
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/DateUtil.java

@@ -713,17 +713,17 @@ public class DateUtil {
     }
 
     /**
-     * 获取远期截止日期(2199年12月31日)
+     * 获取远期截止日期(2999年12月31日)
      * 常用于表示无截止日期限制的场景
      *
      * @return 2199年12月31日 23:59:59.999999999
      */
     public static LocalDateTime getMaxDate() {
-        return LocalDateTime.of(2199, 12, 31, 23, 59, 59, 999999999);
+        return LocalDateTime.of(2999, 12, 31, 23, 59, 59, 999999999);
     }
 
     /**
-     * 获取远期截止日期(2199年12月31日)
+     * 获取远期截止日期(2999年12月31日)
      * 常用于表示无截止日期限制的场景
      *
      * @return 2199年12月31日

+ 35 - 25
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/utils/ShowOperExecuteResult.java

@@ -7,8 +7,10 @@ import kd.bos.entity.operate.result.IOperateInfo;
 import kd.bos.entity.operate.result.OperateErrorInfo;
 import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.form.FormShowParameter;
+import kd.bos.form.IFormView;
 import kd.bos.form.IPageCache;
 import kd.bos.form.ShowType;
+import kd.bos.mvc.SessionManager;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.HashMap;
@@ -27,29 +29,28 @@ import java.util.StringJoiner;
  */
 public class ShowOperExecuteResult {
 
-    /**
-     * 获取操作结果表单显示参数(重载方法1)
-     * 
-     * @param operateName 操作名称
-     * @param successMap 成功记录映射关系(成功的数据需要显示时需要在op自定义参数中添加:this.getOperationResult().getCustomData().put("成功的id","需要显示的消息");)
-     * @param pageCache 页面缓存对象
-     * @param operationResult 操作结果对象
-     * @return 表单显示参数
-     */
-    public static FormShowParameter getOperResultForm(String operateName, Map<Object, Object> successMap, IPageCache pageCache, OperationResult operationResult) {
-        return getOperResultForm(null, operateName, successMap, pageCache, operationResult);
+    public static FormShowParameter getOperResultForm(String operateName, IFormView formView, OperationResult operationResult) {
+        String parentPageId = formView.getFormShowParameter().getPageId();
+        IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
+        IPageCache pageCache = (IPageCache) parentView.getService(IPageCache.class);
+        return getOperResultForm(operateName, pageCache, operationResult);
     }
 
+    public static FormShowParameter getOperResultForm(String operateName, IFormView formView,IPageCache pageCache, OperationResult operationResult) {
+        String parentPageId = formView.getFormShowParameter().getPageId();
+        IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
+        return getOperResultForm(operateName, pageCache, operationResult);
+    }
     /**
-     * 获取操作结果表单显示参数(重载方法2)
+     * 获取操作结果表单显示参数(重载方法1
      * 
      * @param operateName 操作名称
      * @param pageCache 页面缓存对象
      * @param operationResult 操作结果对象
      * @return 表单显示参数
      */
-    public static FormShowParameter getOperResultForm(String operateName, IPageCache pageCache,  OperationResult operationResult) {
-        return getOperResultForm(null, operateName, null, pageCache, operationResult);
+    public static FormShowParameter getOperResultForm(String operateName,  IPageCache pageCache, OperationResult operationResult) {
+        return getOperResultForm(null, operateName, pageCache, operationResult);
     }
 
     /**
@@ -58,27 +59,36 @@ public class ShowOperExecuteResult {
      * 
      * @param title 自定义标题,如果为空则根据成功/失败数量自动生成标题
      * @param operateName 操作名称
-     * @param successMap 成功记录映射关系
      * @param pageCache 页面缓存对象,用于存储操作结果序列化后的数据
      * @param operationResult 操作结果对象,包含详细的成功/失败信息
      * @return 表单显示参数对象
      */
-    public static FormShowParameter getOperResultForm(String title, String operateName, Map<Object, Object> successMap, IPageCache pageCache, OperationResult operationResult) {
+    public static FormShowParameter getOperResultForm(String title, String operateName,  IPageCache pageCache, OperationResult operationResult) {
 
         // 收集所有错误或验证信息
         StringJoiner errorMsgJoiner = new StringJoiner(StrFormatter.LINE_SEPARATOR);
 
         // 构建自定义参数
         Map<String, Object> customParam = new HashMap(2);
-        // 如果有成功记录映射关系,则添加到参数中
-        if (successMap != null && !successMap.isEmpty()) {
-            // 成功消息
-            customParam.put("pkNumbers", successMap);
-            for (Map.Entry<Object, Object> objectObjectEntry : successMap.entrySet()) {
-                Object key = objectObjectEntry.getKey();
-                Object value = objectObjectEntry.getValue();
-                String tip = value != null ? ConvertUtil.toStr( value) : ConvertUtil.toStr( key);
-                errorMsgJoiner.add(String.format(ResManager.loadKDString("%s:执行成功。", "ShowOperationResultPlugin_2", "bos-designer-plugin", new Object[0]), tip));
+        //成功的记录
+        Map<String, String> customData = operationResult.getCustomData();
+        if(customData != null) {
+            //成功的记录
+            Map<Object, Object> successMap = new HashMap<>();
+            for (Object successPkId : operationResult.getSuccessPkIds()) {
+                successMap.put(successPkId, customData.get(successPkId.toString()));
+            }
+
+            // 如果有成功记录映射关系,则添加到参数中
+            if (!successMap.isEmpty()) {
+                // 成功消息
+                customParam.put("pkNumbers", successMap);
+                for (Map.Entry<Object, Object> objectObjectEntry : successMap.entrySet()) {
+                    Object key = objectObjectEntry.getKey();
+                    Object value = objectObjectEntry.getValue();
+                    String tip = value != null ? ConvertUtil.toStr(value) : ConvertUtil.toStr(key);
+                    errorMsgJoiner.add(String.format(ResManager.loadKDString("%s:执行成功。", "ShowOperationResultPlugin_2", "bos-designer-plugin", new Object[0]), tip));
+                }
             }
         }
 

+ 1 - 0
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/hrpi/helper/EmpPosOrgRelHelper.java

@@ -124,6 +124,7 @@ public class EmpPosOrgRelHelper {
                 // 所属公司
                 .addIdNumberName(FormConstant.COMPANY_KEY)
                 // 行政组织(部门)
+                .add(FormConstant.ADMINORG)
                 .addIdNumberName(FormConstant.ADMINORG)
                 // 岗位
                 .addIdNumberName(FormConstant.POSITION_KEY)

+ 18 - 0
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/org/helper/OrgHelper.java

@@ -1,7 +1,9 @@
 package nckd.jxccl.base.org.helper;
 
+import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
 import nckd.jxccl.base.common.utils.ConvertUtil;
+import nckd.jxccl.base.entity.helper.EntityHelper;
 
 import java.util.List;
 
@@ -29,6 +31,22 @@ public class OrgHelper {
         return null;
     }
 
+    /**
+     * 获取创建组织
+     * @param entity 实体id
+     * @return: java.lang.Long
+     * @author W.Y.C
+     * @date: 2025/12/04 10:27
+     */
+    public static DynamicObject getCreateOrg(String entity) {
+        List<Long> createOrgList = BaseDataServiceHelper.getCreateOrgList(entity);
+        if (createOrgList != null && !createOrgList.isEmpty()) {
+            return EntityHelper.newEntity(entity,createOrgList.get(0));
+
+        }
+        return null;
+    }
+
     /**
      * 获取控制策略
      * @param entity 实体id

+ 5 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/common/PositionStructureConstant.java

@@ -268,4 +268,9 @@ public class PositionStructureConstant extends FormConstant {
     public static final String PERFMANAGER_ENTRY_ENTITYID = "nckd_perfmanagerentry";
     /** 分录-考核年份 */
     public static final String APPRAISAL_YEAR_KEY = "nckd_appraisalyear";
+
+    /*-------------------------------------- 新建任命 begin --------------------------------------*/
+    /** 新建任命-实体标识 */
+    public static final String NEWAPPTPOPUP_ENTITYID = "nckd_newapptpopup";
+    /*-------------------------------------- 新建任命 end --------------------------------------*/
 }

+ 61 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/other/MgrAppointMgmtListPlugin.java

@@ -0,0 +1,61 @@
+package nckd.jxccl.hr.psms.plugin.form.other;
+
+import kd.bos.common.enums.EnableEnum;
+import kd.bos.form.CloseCallBack;
+import kd.bos.form.FormShowParameter;
+import kd.bos.form.ShowType;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+* 管理人员任命
+* 实体标识:nckd_mgrappointmgmt
+* @author W.Y.C
+* @date 2025/12/4 18:23
+* @version 1.0
+*/
+public class MgrAppointMgmtListPlugin extends AbstractListPlugin implements Plugin {
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        //只查询类型状态
+        QFilter filter = new QFilter(PositionStructureConstant.NCKD_TYPESTATE, QCP.equals, "5");
+        e.addCustomQFilter(filter);
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        String operateKey = e.getOperateKey();
+        if(e.getOperationResult() != null && e.getOperationResult().isSuccess()){
+            if("newappointment".equalsIgnoreCase(operateKey)) {
+                FormShowParameter showParameter = new FormShowParameter();
+                showParameter.setFormId(PositionStructureConstant.NEWAPPTPOPUP_ENTITYID);
+                showParameter.getOpenStyle().setShowType(ShowType.Modal);
+                showParameter.setCaption("新建任命");
+                showParameter.setCloseCallBack(new CloseCallBack(this, PositionStructureConstant.NEWAPPTPOPUP_ENTITYID));
+                this.getView().showForm(showParameter);
+            }
+            this.getView().invokeOperation(FormConstant.REFRESH_OP);
+        }
+    }
+
+    @Override
+    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
+        String actionId = closedCallBackEvent.getActionId();
+        if(PositionStructureConstant.NEWAPPTPOPUP_ENTITYID.equalsIgnoreCase(actionId)){
+            Object returnData = closedCallBackEvent.getReturnData();
+            if(returnData != null) {
+                //刷新列表
+                this.getView().invokeOperation(FormConstant.REFRESH_OP);
+            }
+        }
+    }
+}

+ 85 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/other/NewApptPopupFormPlugin.java

@@ -0,0 +1,85 @@
+package nckd.jxccl.hr.psms.plugin.form.other;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.form.IFormView;
+import kd.bos.form.IPageCache;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.mvc.SessionManager;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.enums.psms.TypeStateEnum;
+import nckd.jxccl.base.common.utils.DateUtil;
+import nckd.jxccl.base.common.utils.ShowOperExecuteResult;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.hrpi.helper.EmpPosOrgRelHelper;
+import nckd.jxccl.base.org.helper.OrgHelper;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* 新建任命
+* 实体标识:nckd_newapptpopup
+* @author W.Y.C
+* @date 2025/12/4 18:50
+* @version 1.0
+*/
+public class NewApptPopupFormPlugin extends AbstractFormPlugin implements Plugin {
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs e) {
+        String operateKey = e.getOperateKey();
+        if(e.getOperationResult() != null && e.getOperationResult().isSuccess()){
+            if(FormConstant.AFFIRM_OP.equalsIgnoreCase(operateKey)) {
+
+                //新建管理任命
+                DynamicObjectCollection entryColl = this.getModel().getDataEntity(true).getDynamicObjectCollection(FormConstant.NCKD_ENTRYENTITY);
+                List<DynamicObject> newEntityList = new ArrayList<>();
+                for (DynamicObject entry : entryColl) {
+                    DynamicObject newEntity = EntityHelper.newEntity(PositionStructureConstant.NCKD_PERSONPOSFILE);
+                    DynamicObject person = entry.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
+                    long personId = person.getLong(FormConstant.ID_KEY);
+                    String personName = person.getString(FormConstant.NAME_KEY);
+                    newEntity.set(FormConstant.NCKD_PERSON, entry.get(FormConstant.NCKD_PERSON));
+                    Date beginDate = entry.getDate(PositionStructureConstant.NCKD_BEGINDATE);
+                    LocalDateTime beginDateDateTime = DateUtil.toLocalDateTime(beginDate);
+                    newEntity.set(PositionStructureConstant.NCKD_BEGINDATE, beginDate);
+                    newEntityList.add(newEntity);
+                }
+                OperateOption operateOption = OperateOption.create();
+                operateOption.setVariableValue(PositionStructureConstant.NCKD_TYPESTATE, TypeStateEnum.MANAGEMENT_SEQUENCE_EMPLOYMENT.getCode());
+                OperationResult operationResult = OperationServiceHelper.executeOperate(
+                        "savenewappointment",
+                        PositionStructureConstant.PERSONPOSFILE_ENTITYID,
+                        newEntityList.toArray(new DynamicObject[0]),
+                        OperateOption.create()
+                );
+                if (!operationResult.isSuccess()) {
+                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("新建任命", this.getView().getParentView(),this.getPageCache(), operationResult));
+                } else {
+                    this.getView().returnDataToParent("true");
+                    this.getView().getParentView().showSuccessNotification("新建任命成功");
+                    this.getView().close();
+                }
+            }
+        }
+    }
+}

+ 50 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/form/other/impt/MgrAppointMgmtImportPlugin.java

@@ -0,0 +1,50 @@
+package nckd.jxccl.hr.psms.plugin.form.other.impt;
+
+import com.google.common.collect.Lists;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.formplugin.web.HRDataBaseList;
+import kd.hr.impt.common.dto.ImportBillData;
+import kd.hr.impt.common.plugin.BeforeCallOperationEventArgs;
+import kd.hr.impt.common.plugin.BeforeShowTemplateSelectListEventArgs;
+import kd.hr.impt.common.plugin.HRImportPlugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.enums.psms.TypeStateEnum;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+* 管理人员任命导入插件
+* @author W.Y.C
+* @date 2025/12/4 22:10
+* @version 1.0
+*/
+public class MgrAppointMgmtImportPlugin extends HRDataBaseList implements HRImportPlugin {
+
+    private static String MGRAPPOINTMGMT_IMPT = "mgrappointmgmt_IMPT";
+
+    @Override
+    public void beforeShowTemplateSelectList(BeforeShowTemplateSelectListEventArgs args) {
+        List<QFilter> fileter = args.getqFilterList();
+        if(fileter == null){
+            fileter = Lists.newArrayList();
+        }
+        fileter.add(new QFilter(FormConstant.NUMBER_KEY, QCP.in, new String[]{MGRAPPOINTMGMT_IMPT}));
+        args.setqFilterList(fileter);
+    }
+
+    @Override
+    public void beforeCallOperation(BeforeCallOperationEventArgs args) {
+        String mainEntityId = ((ImportBillData)args.getImportBillDatas().get(0)).getMainEntityId();
+        OperateOption operateOption = (OperateOption)args.getOperateOptions().get(mainEntityId);
+        operateOption.setVariableValue(PositionStructureConstant.NCKD_TYPESTATE, TypeStateEnum.MANAGEMENT_SEQUENCE_EMPLOYMENT.getCode());
+        Map<String, String> submitOPs = args.getSubmitOPs();
+        String targetKey = PositionStructureConstant.NCKD_PERSONPOSFILE.toLowerCase();
+        //删除默认save方法
+        submitOPs.entrySet().removeIf(entry -> entry.getKey().toLowerCase().equals(targetKey));
+        submitOPs.put(PositionStructureConstant.NCKD_PERSONPOSFILE.toLowerCase(),"savenewappointment");
+    }
+}

+ 41 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/file/PersonPosFileSaveOpPlugin.java

@@ -0,0 +1,41 @@
+package nckd.jxccl.hr.psms.plugin.operate.file;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+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.enums.psms.TypeStateEnum;
+import nckd.jxccl.base.common.utils.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.base.org.helper.OrgHelper;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+* 员工职位档案
+* 实体标识:nckd_personposfile
+* @author W.Y.C
+* @date 2025/12/4 19:36
+* @version 1.0
+*/
+public class PersonPosFileSaveOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+}

+ 64 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/other/EndAppointMentOpPlugin.java

@@ -0,0 +1,64 @@
+package nckd.jxccl.hr.psms.plugin.operate.other;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.enums.psms.TypeStateEnum;
+import nckd.jxccl.base.common.exception.ValidationException;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+
+/**
+* 终止管理人员任命
+* 实体标识:nckd_mgrappointmgmt
+* @author W.Y.C
+* @date 2025/12/4 21:25
+* @version 1.0
+*/
+public class EndAppointMentOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        e.getFieldKeys().add(PositionStructureConstant.NCKD_TYPESTATE);
+        e.getFieldKeys().add(PositionStructureConstant.NCKD_APPOINTSTATUS);
+        e.getFieldKeys().add(PositionStructureConstant.NCKD_PERSON);
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        e.addValidator(new AbstractValidator(){
+            @Override
+            public void validate() {
+                for (ExtendedDataEntity rowDataEntity : getDataEntities()) {
+                    DynamicObject data = rowDataEntity.getDataEntity();
+                    DynamicObject person = data.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
+                    String name = person.getString(PositionStructureConstant.NAME_KEY);
+                    String typeState = data.getString(PositionStructureConstant.NCKD_TYPESTATE);
+                    String appointStatus = data.getString(PositionStructureConstant.NCKD_APPOINTSTATUS);
+                    if(!"1".equalsIgnoreCase(typeState)){
+                        this.addErrorMessage(rowDataEntity, StrFormatter.format("【{}】状态为【已终止】,忽略此条处理!",name));
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            dataEntity.set(PositionStructureConstant.NCKD_APPOINTSTATUS, "0");
+        }
+        OperationResult operationResult = SaveServiceHelper.saveOperate(PositionStructureConstant.PERSONPOSFILE_ENTITYID, e.getDataEntities(), OperateOption.create());
+        if (!operationResult.isSuccess()) {
+            throw new ValidationException(operationResult.getMessage());
+        }
+    }
+}

+ 229 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/plugin/operate/other/NewAppointMentOpPlugin.java

@@ -0,0 +1,229 @@
+package nckd.jxccl.hr.psms.plugin.operate.other;
+
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.operate.result.IOperateInfo;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.enums.psms.TypeStateEnum;
+import nckd.jxccl.base.common.exception.ValidationException;
+import nckd.jxccl.base.common.utils.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.common.utils.StrFormatter;
+import nckd.jxccl.base.entity.helper.EntityHelper;
+import nckd.jxccl.base.hrpi.helper.EmpPosOrgRelHelper;
+import nckd.jxccl.base.org.helper.OrgHelper;
+import nckd.jxccl.hr.psms.common.PositionStructureConstant;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * 新建管理人员任命
+ * 实体标识:nckd_mgrappointmgmt
+ * @author W.Y.C
+ * @date 2025/12/4 21:25
+ * @version 1.0
+ */
+public class NewAppointMentOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                List<Long> personIdList = new ArrayList<>();
+                for (ExtendedDataEntity rowDataEntity : getDataEntities()) {
+                    DynamicObject data = rowDataEntity.getDataEntity();
+                    long personId = data.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY));
+                    personIdList.add(personId);
+
+                    DynamicObject person = data.getDynamicObject(FormConstant.NCKD_PERSON);
+                    if (person != null) {
+                        //设置每行对应的员工名称,用于准确显示每个错误属于哪个员工的
+                        getOperationResult().getCustomData().put("DataEntityIndex_" + rowDataEntity.getDataEntityIndex(), "【" + person.getString(FormConstant.NAME_KEY) + "】");
+                    }
+                }
+
+                Map<Long, List<DynamicObject>> mgrAppointMgmtMap = new HashMap<>();
+                //查询管理人员任命
+                QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                        .add(FormConstant.ID_KEY)
+                        .add(PositionStructureConstant.NCKD_BEGINDATE)
+                        .add(PositionStructureConstant.NCKD_ENDDATE)
+                        .add(PositionStructureConstant.NCKD_APPOINTSTATUS)
+                        .addIdNumberName(PositionStructureConstant.NCKD_PERSON);
+                DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.NCKD_PERSONPOSFILE, queryFieldBuilder.buildSelect(), new QFilter[]{new QFilter(PositionStructureConstant.NCKD_PERSON, QCP.in, personIdList)});
+                // 按用户ID分组
+                mgrAppointMgmtMap = query.stream()
+                        .collect(Collectors.groupingBy(
+                                obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY))
+                        ));
+
+                for (ExtendedDataEntity rowDataEntity : getDataEntities()) {
+                    DynamicObject data = rowDataEntity.getDataEntity();
+                    DynamicObject person = data.getDynamicObject(FormConstant.NCKD_PERSON);
+                    if(person == null){
+                        this.addErrorMessage(rowDataEntity, "请选择员工。");
+                        continue;
+                    }
+                    long personId = person.getLong(FormConstant.ID_KEY);
+                    String personName = person.getString(FormConstant.NAME_KEY);
+                    if(data.getDate(PositionStructureConstant.NCKD_BEGINDATE) == null){
+                        this.addErrorMessage(rowDataEntity, StrFormatter.format("【{}】的开始日期不能为空。", personName));
+                        continue;
+                    }
+
+                    //管理人员任命校验
+                    List<DynamicObject> dbmgrAppointMgmtList = mgrAppointMgmtMap.get(personId);
+                    if (dbmgrAppointMgmtList != null) {
+                        //1、判断有没有状态为【任命中=1】中的
+                        boolean hasAppointingStatus = dbmgrAppointMgmtList.stream()
+                                .anyMatch(obj -> "1".equals(obj.getString(PositionStructureConstant.NCKD_APPOINTSTATUS)));
+                        if (hasAppointingStatus) {
+                            this.addErrorMessage(rowDataEntity, StrFormatter.format("存在状态为【{}】的记录,不能任命。", "任命中"));
+                        }
+
+                        //2、判断有没有任命日期在有效时间内的
+                        if (!hasAppointingStatus) {
+                            Date beginDate = data.getDate(PositionStructureConstant.NCKD_BEGINDATE);
+
+                            Optional<DynamicObject> lastAppointment = dbmgrAppointMgmtList.stream()
+                                    .filter(obj -> {
+                                        Date endDate = obj.getDate(PositionStructureConstant.NCKD_ENDDATE);
+                                        // 新的任命开始时间必须在上一条记录的结束时间之后
+                                        return endDate != null && beginDate != null && !beginDate.after(endDate);
+                                    })
+                                    .findFirst();
+
+                            if (lastAppointment.isPresent()) {
+                                DynamicObject appointment = lastAppointment.get();
+                                Date endDate = appointment.getDate(PositionStructureConstant.NCKD_ENDDATE);
+                                String periodMessage = StrFormatter.format("新的任命开始时间不能早于或等于上一任命的结束时间【{}】。",
+                                        endDate != null ? DateUtil.format(endDate, "yyyy-MM-dd") : "");
+                                // 提示用户时间段信息
+                                this.addErrorMessage(rowDataEntity, periodMessage);
+                            }
+                        }
+
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs e) {
+        List<Long> personidList = new ArrayList<>();
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            long personId = dataEntity.getLong(String.join(".", PositionStructureConstant.NCKD_PERSON, FormConstant.ID_KEY));
+            personidList.add(personId);
+        }
+        DynamicObject[] empPosOrgRelArray = EmpPosOrgRelHelper.queryEmpPosOrgRelByEmployees(personidList);
+        Map<Long, DynamicObject> empPosOrgRelMap = Arrays.stream(empPosOrgRelArray)
+                .collect(Collectors.toMap(
+                        empPosOrgRelObj -> empPosOrgRelObj.getLong(String.join(".", PositionStructureConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)),
+                        empPosOrgRelObj -> empPosOrgRelObj,
+                        (existing, replacement) -> replacement // 如果有重复的key,使用新的值替换旧的值
+                ));
+        List<DynamicObject> newEntityList = new ArrayList<>();
+
+        DynamicObject org = OrgHelper.getCreateOrg(PositionStructureConstant.PERSONPOSFILE_ENTITYID);
+        String bdCtrlStrgy = null;
+        if(org != null) {
+            bdCtrlStrgy = OrgHelper.getBdCtrlStrgy(PositionStructureConstant.PERSONPOSFILE_ENTITYID, org.getLong(FormConstant.ID_KEY));
+        }
+        for (DynamicObject entry : e.getDataEntities()) {
+            DynamicObject newEntity = EntityHelper.newEntity(PositionStructureConstant.NCKD_PERSONPOSFILE);
+            DynamicObject person = entry.getDynamicObject(PositionStructureConstant.NCKD_PERSON);
+            long personId = person.getLong(FormConstant.ID_KEY);
+            String personName = person.getString(FormConstant.NAME_KEY);
+            DynamicObject empPosOrgRel = empPosOrgRelMap.get(personId);
+
+            newEntity.set(FormConstant.NCKD_PERSON, entry.get(FormConstant.NCKD_PERSON));
+            Date beginDate = entry.getDate(PositionStructureConstant.NCKD_BEGINDATE);
+            LocalDateTime beginDateDateTime = DateUtil.toLocalDateTime(beginDate);
+            newEntity.set(PositionStructureConstant.NCKD_BEGINDATE, beginDate);
+            newEntity.set(PositionStructureConstant.NCKD_TYPESTATE, TypeStateEnum.MANAGEMENT_SEQUENCE_EMPLOYMENT.getCode());
+            newEntity.set(PositionStructureConstant.NCKD_DEP, empPosOrgRel.get(PositionStructureConstant.ADMINORG));
+            newEntity.set(PositionStructureConstant.NCKD_POSITIONHR, empPosOrgRel.get(PositionStructureConstant.POSITION_KEY));
+            newEntity.set(PositionStructureConstant.NCKD_EXECUTEYEAR, beginDateDateTime.getYear());
+            newEntity.set(PositionStructureConstant.NCKD_APPOINTSTATUS, "1");
+            newEntity.set(FormConstant.CREATEORG_KEY, org);
+            newEntity.set(FormConstant.ORG_KEY, org);
+            newEntity.set(FormConstant.USEORG_KEY, org);
+            newEntity.set(FormConstant.CTRLSTRATEGY_KEY, bdCtrlStrgy);
+            newEntity.set(FormConstant.CREATOR_KEY, UserServiceHelper.getCurrentUserId());
+            newEntityList.add(newEntity);
+        }
+        OperateOption operateOption = OperateOption.create();
+        operateOption.setVariableValue(PositionStructureConstant.NCKD_TYPESTATE, TypeStateEnum.MANAGEMENT_SEQUENCE_EMPLOYMENT.getCode());
+        OperationResult operationResult = SaveServiceHelper.saveOperate(PositionStructureConstant.PERSONPOSFILE_ENTITYID, newEntityList.toArray(new DynamicObject[0]), operateOption);
+
+        if(operationResult != null && !operationResult.isSuccess()){
+            StringJoiner errorMsgJoiner = new StringJoiner(StrFormatter.LINE_SEPARATOR);
+            if(operationResult.getAllErrorOrValidateInfo() != null && !operationResult.getAllErrorOrValidateInfo().isEmpty()){
+                Iterator<IOperateInfo> iterator = operationResult.getAllErrorOrValidateInfo().iterator();
+                while (iterator.hasNext()) {
+                    IOperateInfo operateInfo = iterator.next();
+                    if(operateInfo instanceof OperateErrorInfo){
+                        OperateErrorInfo operateErrorInfo = (OperateErrorInfo) operateInfo;
+                        int dataEntityIndex = operateErrorInfo.getDataEntityIndex();
+                        String prefix = operationResult.getCustomData().get("DataEntityIndex_" + dataEntityIndex);
+                        if(StringUtils.isNotBlank(prefix)){
+                            operateErrorInfo.setMessage(prefix + operateErrorInfo.getMessage());
+                        }
+                    }
+                    errorMsgJoiner.add(operateInfo.getMessage());
+                }
+            }
+            // 如果没有具体的错误详情,则使用操作结果中的通用消息
+            if (StringUtils.isBlank(operationResult.getMessage())) {
+                errorMsgJoiner.add(operationResult.getMessage());
+            }
+            throw new ValidationException(errorMsgJoiner.toString());
+        }
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        for (DynamicObject dataEntity : e.getDataEntities()) {
+            long id = dataEntity.getLong(FormConstant.ID_KEY);
+            DynamicObject dynamicObject = dataEntity.getDynamicObject(FormConstant.NCKD_PERSON);
+            if(dynamicObject != null) {
+                this.getOperationResult().getCustomData().put(id + "", "【" + dynamicObject.getString(FormConstant.NAME_KEY) + "】");
+            }
+        }
+    }
+}

+ 2 - 14
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/SubCoHeadServiceListPlugin.java

@@ -417,16 +417,7 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
             option.setVariableValue("load", Boolean.TRUE+"");
             OperationResult operationResult = SaveServiceHelper.saveOperate(MasConstant.SUBCOHEADSERVICE_ENTITYID, saveSubCoHeadServiceList.toArray(new DynamicObject[0]), option);
             if (!operationResult.isSuccess()) {
-                String parentPageId = this.getView().getFormShowParameter().getPageId();
-                IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
-                IPageCache pageCache = (IPageCache) parentView.getService(IPageCache.class);
-                Map<String, String> customData = operationResult.getCustomData();
-                //成功的记录
-                Map<Object, Object> successMap = new HashMap<>();
-                for (Object successPkId : operationResult.getSuccessPkIds()) {
-                    successMap.put(successPkId, customData.get(successPkId.toString()));
-                }
-                this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", successMap, pageCache, operationResult));
+                this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", this.getView(), operationResult));
                 this.getView().invokeOperation(FormConstant.REFRESH_OP);
             } else {
                 //刷新列表
@@ -437,10 +428,7 @@ public class SubCoHeadServiceListPlugin extends AbstractListPlugin implements Pl
                     successMap.put(successPkId, customData.get(successPkId.toString()));
                 }
                 if (!successMap.isEmpty()) {
-                    String parentPageId = this.getView().getFormShowParameter().getPageId();
-                    IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
-                    IPageCache pageCache = (IPageCache) parentView.getService(IPageCache.class);
-                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", successMap, pageCache, operationResult));
+                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历",this.getView(), operationResult));
                     this.getView().invokeOperation(FormConstant.REFRESH_OP);
                 } else {
                     this.getView().invokeOperation(FormConstant.REFRESH_OP);

+ 3 - 14
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/empmgt/TenurePersonListListPlugin.java

@@ -347,16 +347,7 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
             option.setVariableValue("load", Boolean.TRUE+"");
             OperationResult operationResult = SaveServiceHelper.saveOperate(MasConstant.TENUREPERSONLIST_ENTITYID, saveSubCoHeadServiceList.toArray(new DynamicObject[0]), option);
             if (!operationResult.isSuccess()) {
-                String parentPageId = this.getView().getFormShowParameter().getPageId();
-                IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
-                IPageCache pageCache = (IPageCache) parentView.getService(IPageCache.class);
-                Map<String, String> customData = operationResult.getCustomData();
-                //成功的记录
-                Map<Object, Object> successMap = new HashMap<>();
-                for (Object successPkId : operationResult.getSuccessPkIds()) {
-                    successMap.put(successPkId, customData.get(successPkId.toString()));
-                }
-                this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", successMap, pageCache, operationResult));
+                this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", this.getView(), operationResult));
                 this.getView().invokeOperation(FormConstant.REFRESH_OP);
             } else {
                 //刷新列表
@@ -367,10 +358,8 @@ public class TenurePersonListListPlugin extends AbstractListPlugin implements Pl
                     successMap.put(successPkId, customData.get(successPkId.toString()));
                 }
                 if (!successMap.isEmpty()) {
-                    String parentPageId = this.getView().getFormShowParameter().getPageId();
-                    IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
-                    IPageCache pageCache = (IPageCache) parentView.getService(IPageCache.class);
-                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", successMap, pageCache, operationResult));
+
+                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", this.getView(), operationResult));
                     this.getView().invokeOperation(FormConstant.REFRESH_OP);
                 } else {
                     this.getView().invokeOperation(FormConstant.REFRESH_OP);

+ 1 - 10
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/form/structappr/AbstractStructApprFormPlugin.java

@@ -277,16 +277,7 @@ public abstract class AbstractStructApprFormPlugin extends AbstractFormPlugin im
                 }
                 OperationResult operationResult = SaveServiceHelper.saveOperate(changeEntityId, new DynamicObject[]{newChangeEntity}, OperateOption.create());
                 if (!operationResult.isSuccess()) {
-                    String parentPageId = this.getView().getFormShowParameter().getPageId();
-                    IFormView parentView = SessionManager.getCurrent().getViewNoPlugin(parentPageId);
-                    IPageCache pageCache = (IPageCache) parentView.getService(IPageCache.class);
-                    Map<String, String> customData = operationResult.getCustomData();
-                    // 成功的记录
-                    Map<Object, Object> successMap = new HashMap<>();
-                    for (Object successPkId : operationResult.getSuccessPkIds()) {
-                        successMap.put(successPkId, customData.get(successPkId.toString()));
-                    }
-                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历", successMap, pageCache, operationResult));
+                    this.getView().showForm(ShowOperExecuteResult.getOperResultForm("载入党政职务履历",this.getView(), operationResult));
                     this.getView().invokeOperation(FormConstant.REFRESH_OP);
                 } else {
                     // 自定义确认框按钮名称

+ 0 - 2
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/mas/plugin/operate/empmgt/SubCoHeadServiceOpPlugin.java

@@ -56,7 +56,5 @@ public class SubCoHeadServiceOpPlugin extends AbstractOperationServicePlugIn imp
                 this.getOperationResult().getCustomData().put(id + "", "【" + dynamicObject.getString(FormConstant.NAME_KEY) + "】");
             }
         }
-
-
     }
 }