Browse Source

feat(hr): 新增三定计划相关功能及优化

- 在 FormConstant 中新增 tblnew 和 new 操作标识常量
- 优化 SdmBusinessService 中获取最近三定计划的方法,提取公共变量并调整返回逻辑
- 在 SanDingPlanFormPlugin 初始化时增加对年度控件最小值的设置逻辑
- 在 SanDingPlanListPlugin 中新增前置操作校验,防止重复新增未完成的三定计划
- 将 SendTaskOpPlugin 中获取三定计划方法调用改为使用 SdmBusinessService 统一实现
- 移除 SendTaskOpPlugin 中冗余的 getLastSanDingPlanDyo 方法定义
jtd 3 weeks ago
parent
commit
70484660ff

+ 4 - 0
code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java

@@ -153,6 +153,10 @@ public class FormConstant {
     public static final String AFFIRM_OP = "affirm";
     /** 保存按钮标识 */
     public static final String SAVE_OP = "save";
+    /** 新增按钮标识 */
+    public static final String TBLNEW_KEY = "tblnew";
+    /** 新增操作标识 */
+    public static final String NEW_OP = "new";
     /** 保存按钮标识 */
     public static final String BAR_SAVE_KEY = "bar_save";
     /** 保存并新增按钮标识 */

+ 6 - 4
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/sdm/business/SdmBusinessService.java

@@ -14,15 +14,17 @@ import nckd.jxccl.hr.sdm.common.SanDingConstant;
  */
 public class SdmBusinessService {
 
-    public static DynamicObject getLastSanDingPlanDyo(Long id, String selectFields) {
+    private static final HRBaseServiceHelper sanDingPlanServiceHelper = HRBaseServiceHelper.create(SanDingConstant.NCKD_SANDINGPLAN_ENTITY);
+
+    public static DynamicObject getLastSanDingPlanDyo(Long id) {
         // 排序 年度降序、适用批次人力资源需求批次.编码降序
         String orderBys = QueryFieldBuilder.create().addDesc(SanDingConstant.NCKD_SANDINGYEAR_KEY).addDesc(SanDingConstant.NCKD_SANDINGTIME_KEY, SanDingConstant.NUMBER_KEY).buildOrder();
         // 获取最近一个三定计划
-        DynamicObject[] lastSanDingPlanDyos = HRBaseServiceHelper.create(SanDingConstant.NCKD_SANDINGPLAN_ENTITY).queryOriginalArray(selectFields, new QFilter[]{new QFilter(SanDingConstant.ID_KEY, QCP.not_equals, id)}, orderBys);
+        DynamicObject[] lastSanDingPlanDyos = sanDingPlanServiceHelper.queryOriginalArray(SanDingConstant.ID_KEY, new QFilter[]{new QFilter(SanDingConstant.ID_KEY, QCP.not_equals, id)}, orderBys);
         if (lastSanDingPlanDyos.length > 0) {
-            return HRBaseServiceHelper.create(SanDingConstant.NCKD_SANDINGPLAN_ENTITY).loadSingle(lastSanDingPlanDyos[0].getLong(SanDingConstant.ID_KEY));
+            return sanDingPlanServiceHelper.loadSingle(lastSanDingPlanDyos[0].getLong(SanDingConstant.ID_KEY));
         }
-        return null;
+        return sanDingPlanServiceHelper.generateEmptyDynamicObject();
     }
 
 }

+ 14 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/sdm/plugin/form/SanDingPlanFormPlugin.java

@@ -10,7 +10,9 @@ import kd.bos.entity.constant.StatusEnum;
 import kd.bos.entity.datamodel.events.ChangeData;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.ext.mmc.util.MetaDataHelper;
+import kd.bos.form.control.Control;
 import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.field.DateEdit;
 import kd.bos.form.operate.FormOperate;
 import kd.bos.form.plugin.AbstractFormPlugin;
@@ -27,6 +29,7 @@ import kd.hr.hbp.common.util.HRObjectUtils;
 import kd.hr.hbp.common.util.HRStringUtils;
 import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.hr.sdm.business.SdmBusinessService;
 import nckd.jxccl.hr.sdm.common.SanDingConstant;
 import nckd.jxccl.hr.sdm.common.SanDingPlanEntryStatus;
 
@@ -182,6 +185,17 @@ public class SanDingPlanFormPlugin extends AbstractFormPlugin {
         if (isSend || isComplated) {
             getView().setVisible(Boolean.FALSE, SanDingConstant.BAR_MODIFY_KEY, SanDingConstant.NCKD_SENDTASK_KEY);
         }
+        // 获取 ID
+        DynamicObject dataEntity = getModel().getDataEntity();
+        Long id = (Long) dataEntity.get(SanDingConstant.ID_KEY);
+        // 获取 最近一条三定计划数据
+        DynamicObject lastSanDingPlanDyo = SdmBusinessService.getLastSanDingPlanDyo(id == null ? 0L : id);
+        if (!HRObjectUtils.isEmpty(lastSanDingPlanDyo)) {
+            // 设置 年度最小值
+            Date sanDingYear = lastSanDingPlanDyo.getDate(SanDingConstant.NCKD_SANDINGYEAR_KEY);
+            DateEdit sanDingYearControl = getControl(SanDingConstant.NCKD_SANDINGYEAR_KEY);
+            sanDingYearControl.setMinDate(HRDateTimeUtils.addYear(sanDingYear, -1));
+        }
     }
 
     private void setStartDateMinDate(Date startDateLast) {

+ 20 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/sdm/plugin/form/SanDingPlanListPlugin.java

@@ -1,8 +1,13 @@
 package nckd.jxccl.hr.sdm.plugin.form;
 
+import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.AbstractOperate;
 import kd.bos.list.plugin.AbstractListPlugin;
+import kd.hr.hbp.common.util.HRObjectUtils;
 import kd.hr.hbp.common.util.HRStringUtils;
+import nckd.jxccl.hr.sdm.business.SdmBusinessService;
 import nckd.jxccl.hr.sdm.common.SanDingConstant;
 
 /**
@@ -13,6 +18,21 @@ import nckd.jxccl.hr.sdm.common.SanDingConstant;
  */
 public class SanDingPlanListPlugin extends AbstractListPlugin {
 
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+
+        String operateKey = ((AbstractOperate) args.getSource()).getOperateKey();
+        if (HRStringUtils.equals(SanDingConstant.NEW_OP, operateKey)) {
+            DynamicObject lastSanDingPlanDyo = SdmBusinessService.getLastSanDingPlanDyo(0L);
+            if (!HRObjectUtils.isEmpty(lastSanDingPlanDyo) && !lastSanDingPlanDyo.getBoolean(SanDingConstant.NCKD_ISCOMPLATED_KEY)) {
+                getView().showTipNotification("您有一个进行中的三定管理数据,无法新增。");
+                // 取消
+                args.setCancel(true);
+            }
+        }
+    }
+
     @Override
     public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
         super.afterDoOperation(afterDoOperationEventArgs);

+ 3 - 13
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/sdm/plugin/operate/SendTaskOpPlugin.java

@@ -35,6 +35,7 @@ import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.base.entity.helper.EntityHelper;
 import nckd.jxccl.base.org.helper.OrgHelper;
 import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
+import nckd.jxccl.hr.sdm.business.SdmBusinessService;
 import nckd.jxccl.hr.sdm.common.SanDingConstant;
 import nckd.jxccl.hr.sdm.common.SanDingPlanEntryStatus;
 
@@ -277,7 +278,7 @@ public class SendTaskOpPlugin extends AbstractOperationServicePlugIn {
         Map<String, Integer> kgsddEmpPosOrgRelMap = kgsddEmpPosOrgRelIdListMap.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue().size()));
         // key->单位BOID@岗位BOID value->定员数
         Map<String, Integer> lastSanDingTaskMap = new HashMap<String, Integer>();
-        DynamicObject lastSanDingPlanDyo = getLastSanDingPlanDyo(billDyo.getLong(SanDingConstant.ID_KEY), SanDingConstant.ID_KEY);
+        DynamicObject lastSanDingPlanDyo = SdmBusinessService.getLastSanDingPlanDyo(billDyo.getLong(SanDingConstant.ID_KEY));
         if (!HRObjectUtils.isEmpty(lastSanDingPlanDyo)) {
             long sanDingPlanId = lastSanDingPlanDyo.getLong(SanDingConstant.ID_KEY);
             // 查询 单据体.定员数、单据体.岗位.BOID、单位.BOID
@@ -373,17 +374,6 @@ public class SendTaskOpPlugin extends AbstractOperationServicePlugIn {
         }
     }
 
-    private static DynamicObject getLastSanDingPlanDyo(Long id, String selectFields) {
-        // 排序 年度降序、适用批次人力资源需求批次.编码降序
-        String orderBys = QueryFieldBuilder.create().addDesc(SanDingConstant.NCKD_SANDINGYEAR_KEY).addDesc(SanDingConstant.NCKD_SANDINGTIME_KEY, SanDingConstant.NUMBER_KEY).buildOrder();
-        // 获取最近一个三定计划
-        DynamicObject[] lastSanDingPlanDyos = HRBaseServiceHelper.create(SanDingConstant.NCKD_SANDINGPLAN_ENTITY).queryOriginalArray(selectFields, new QFilter[]{new QFilter(SanDingConstant.ID_KEY, QCP.not_equals, id)}, orderBys);
-        if (lastSanDingPlanDyos.length > 0) {
-            return HRBaseServiceHelper.create(SanDingConstant.NCKD_SANDINGPLAN_ENTITY).loadSingle(lastSanDingPlanDyos[0].getLong(SanDingConstant.ID_KEY));
-        }
-        return null;
-    }
-
     @Override
     public void endOperationTransaction(EndOperationTransactionArgs e) {
         super.endOperationTransaction(e);
@@ -439,7 +429,7 @@ public class SendTaskOpPlugin extends AbstractOperationServicePlugIn {
 
     private void updateLastSanDingPlanEndDate(DynamicObject dyo) {
         Date startDate = dyo.getDate(SanDingConstant.NCKD_STARTDATE_KEY);
-        DynamicObject lastSanDingPlanDyo = getLastSanDingPlanDyo(dyo.getLong(SanDingConstant.ID_KEY), String.join(",", SanDingConstant.ID_KEY, SanDingConstant.NCKD_ENDDATE));
+        DynamicObject lastSanDingPlanDyo = SdmBusinessService.getLastSanDingPlanDyo(dyo.getLong(SanDingConstant.ID_KEY));
         if (!HRObjectUtils.isEmpty(lastSanDingPlanDyo)) {
             lastSanDingPlanDyo.set(SanDingConstant.NCKD_ENDDATE, HRDateTimeUtils.addDay(startDate, -1));
             SaveServiceHelper.save(new DynamicObject[]{lastSanDingPlanDyo});