Просмотр исходного кода

feat(hr): 优化岗位申请单功能实现

- 修改常量类中组织标识的描述文本
- 合并新增和变更操作的处理逻辑,统一调用updateEntryEntity方法
- 重构updateEntryEntity方法支持传入tag参数进行动态处理
- 实现键值转换映射功能,支持字段映射配置
- 优化岗位暂存数据删除逻辑,使用历史模型服务助手
- 添加获取转换键值的工具方法支持后缀处理
- 重构岗位构建逻辑,完善组织和上级岗位设置
- 修复字段名称拼接问题,统一使用String.join方式
- 更新确认回调服务类引用,修正导入路径
- 优化岗位暂存操作的编码生成和回收机制
- 调整岗位状态设置逻辑,优化数据版本状态处理
jtd 2 недель назад
Родитель
Сommit
8da57ed337

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

@@ -43,7 +43,7 @@ public class FormConstant {
     public static final String HBJM_JOBLEVELSCMHR = "hbjm_joblevelscmhr";
     /**职级-实体标识*/
     public static final String HBJM_JOBLEVELHR = "hbjm_joblevelhr";
-    /** HR行政组织-实体标识*/
+    /** 组织基本信息(主)-实体标识*/
     public static final String ADMINORG_ENTITYID = "haos_adminorg";
     /** 组织分配-实体标识 */
     public static final String ASSIGNMENT_ENTITYID = "hrpi_assignment";

+ 15 - 12
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/hr/PositionBillClosedCallBackService.java

@@ -39,13 +39,11 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
     public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
         switch (closedCallBackEvent.getActionId()) {
             case PositionBillConstant.ADD_TAG:
+            case PositionBillConstant.CHANGE_TAG:
                 if (onlyForView(closedCallBackEvent)) {
                     return;
                 }
-                updateAddEntryEntity();
-                break;
-            case PositionBillConstant.CHANGE_TAG:
-
+                updateEntryEntity(closedCallBackEvent.getActionId());
         }
     }
 
@@ -53,7 +51,7 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
         return closedCallBackEvent.getReturnData() == null;
     }
 
-    private void updateAddEntryEntity() {
+    private void updateEntryEntity(String tag) {
         DataEntityPropertyCollection entryEntityInfo = getModel().getDataEntity(true).getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).getDynamicObjectType().getProperties();
         MainEntityType entityType = EntityMetadataCache.getDataEntityType(PositionBillConstant.NCKD_POSBILLENTRYADD_ENTITY);
         DataEntityPropertyCollection addEntityInfo = entityType.getProperties();
@@ -61,7 +59,7 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
         List<String> selectPropList = new ArrayList<String>();
         Set<String> toSetValueEntryPropList = new HashSet<String>();
 
-        String suffix = "_"+PositionBillConstant.ADD_TAG;
+        String suffix = "_"+tag;
         for(IDataEntityProperty iDataEntityProperty : entryEntityInfo) {
             String entryPropName = iDataEntityProperty.getName();
             if (entryPropName.endsWith(suffix)) {
@@ -73,7 +71,14 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
             }
         }
 
+        // 获取需要转换的键值
+        Map<String, String> transKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSBILL_TRANSKEY_ENTITY, suffix);
+        transKeyMap.forEach((key, value) -> {
+            selectPropList.add(value);
+            toSetValueEntryPropList.add(key);
+        });
         toSetValueEntryPropList.add(PositionBillConstant.ID_KEY);
+
         HRBaseServiceHelper posBillEntryAddServiceHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSBILLENTRYADD_ENTITY);
         Long billId = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
         QFilter qFilter = (new QFilter(PositionBillConstant.NCKD_BILLID, QCP.equals, billId)).and(new QFilter(String.join(".", PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY), QCP.equals, PositionChangeTypeEnum.ADD.getNumber()));
@@ -89,14 +94,12 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
             for(String entryPropName : toSetValueEntryPropList) {
                 if (entryPropName.equals(PositionBillConstant.ID_KEY)) {
                     values.add(addPositionDy.getLong(PositionBillConstant.ID_KEY));
-                } else if (entryPropName.equals(PositionBillConstant.NCKD_NUMBER_KEY)) {
-                    values.add(addPositionDy.get(PositionBillConstant.NUMBER_KEY));
-                } else if (entryPropName.equals(PositionBillConstant.NCKD_NAME_KEY)) {
-                    values.add(addPositionDy.get(PositionBillConstant.NAME_KEY));
-                }else {
+                } else if (transKeyMap.containsKey(entryPropName)) {
+                    values.add(addPositionDy.get(transKeyMap.get(entryPropName)));
+                } else {
                     String propName = entryPropName.replace(suffix, "");
                     if (addPositionDy.get(propName) instanceof DynamicObject) {
-                        values.add(((DynamicObject)addPositionDy.get(propName)).getLong(PositionBillConstant.ID_KEY));
+                        values.add(((DynamicObject) addPositionDy.get(propName)).getLong(PositionBillConstant.ID_KEY));
                     } else {
                         values.add(addPositionDy.get(propName));
                     }

+ 1 - 1
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/hr/PositionBillConfirmCallBackService.java

@@ -121,7 +121,7 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
             if (doNotdeletePositionIdSet.contains(toBeDeletePositionId)) {
                 OperateErrorInfo operateInfo = new OperateErrorInfo("100000", ErrorLevel.Error, toBeDeletePositionId);
                 operateInfo.setErrorLevel(ErrorLevel.FatalError.name());
-                operateInfo.setMessage(String.format(Locale.ROOT, "%s在本单有下层组织,不允许删除。", toBeDeletePositionDyn.getString(String.join("_", PositionBillConstant.NCKD_NAME_KEY, PositionBillConstant.ADD_TAG))));
+                operateInfo.setMessage(String.format(Locale.ROOT, "%s在本单有下层岗位,不允许删除。", toBeDeletePositionDyn.getString(String.join("_", PositionBillConstant.NCKD_NAME_KEY, PositionBillConstant.ADD_TAG))));
                 operationResult.setSuccess(false);
                 operationResult.addErrorInfo(operateInfo);
             } else {

+ 86 - 20
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/hr/PositionBillServiceHelper.java

@@ -16,9 +16,12 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.MetadataServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.constants.history.HisModelDataStatusEnum;
+import kd.hr.hbp.common.model.history.param.HisDeleteParam;
 import kd.hr.hbp.common.util.HRDateTimeUtils;
 import kd.hr.hbp.common.util.HRDynamicObjectUtils;
+import kd.hr.hbp.common.util.HRObjectUtils;
 import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.hr.hbp.business.helper.history.HisModelServiceHelper;
 import kd.sdk.hr.hdm.common.enums.reg.RegBillStatusEnum;
 import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
@@ -100,46 +103,109 @@ public class PositionBillServiceHelper {
         }
     }
 
+    /**
+     * 删除岗位新设暂存数据
+     * @param positionIdList
+     */
     public static void delAddMaster(List<Long> positionIdList) {
-        HRBaseServiceHelper positionHrHelper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
-        positionHrHelper.deleteByFilter(new QFilter[]{new QFilter(PositionBillConstant.ID_KEY, QCP.in, positionIdList)});
+        HisDeleteParam hisDeleteParam = new HisDeleteParam();
+        hisDeleteParam.setEntityNumber(PositionBillConstant.HBPM_POSITIONHR);
+        hisDeleteParam.setDataList(Arrays.asList(HRBaseServiceHelper.create(PositionBillConstant.HBPM_POSITIONHR).loadDynamicObjectArray(positionIdList.toArray())));
+        HisModelServiceHelper.deleteBo(hisDeleteParam);
+        //HRBaseServiceHelper positionHrHelper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
+        //positionHrHelper.deleteByFilter(new QFilter[]{new QFilter(PositionBillConstant.ID_KEY, QCP.in, positionIdList)});
+    }
+
+    /**
+     * 获取转换键值
+     * @param entityNumber
+     * @return key->目标字段 value->源字段
+     */
+    public static Map<String, String> getTransKeyMap(String entityNumber) {
+        return getTransKeyMap(entityNumber, null);
     }
 
-    public static Map<String, String> getTransKeyMap() {
+    /**
+     * 获取转换键值
+     * @param entityNumber
+     * @return key->目标字段+suffix value->源字段
+     */
+    public static Map<String, String> getTransKeyMap(String entityNumber, String suffix) {
         // 查询需要转换的键值
         String selectFields = QueryFieldBuilder.create().add(PositionBillConstant.NUMBER_KEY).add(PositionBillConstant.NAME_KEY).buildSelect();
-        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY).queryOriginalArray(selectFields, null);
-        // key->目标字段 value->源字段
-        Map<String, String> transKeyMap = Arrays.stream(transKeyDyos).collect(Collectors.toMap(transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NAME_KEY), transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NUMBER_KEY), (oldValue, newValue) -> newValue));
+        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(entityNumber).queryOriginalArray(selectFields, null);
+        Map<String, String> transKeyMap = Arrays.stream(transKeyDyos).collect(Collectors.toMap(
+                transKeyDyo -> HRStringUtils.isBlank(suffix) ? transKeyDyo.getString(PositionBillConstant.NAME_KEY) : transKeyDyo.getString(PositionBillConstant.NAME_KEY)+suffix,
+                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NUMBER_KEY),
+                (oldValue, newValue) -> newValue));
         return transKeyMap;
     }
 
+
+    /**
+     * 构建岗位
+     * 用于获取/回收岗位编码
+     * @param addDy
+     * @return
+     */
     public static DynamicObject getPositionHrDy(DynamicObject addDy) {
-        return getPositionHrDy(addDy, getTransKeyMap());
+        return getPositionHrDy(addDy, getTransKeyMap(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY));
     }
 
+    /**
+     * 构建岗位
+     * 用于获取/回收岗位编码
+     * @param addDy
+     * @param transKeyMap
+     * @return
+     */
     public static DynamicObject getPositionHrDy(DynamicObject addDy, Map<String, String> transKeyMap) {
         DynamicObject positionHrDy = new DynamicObject(MetadataServiceHelper.getDataEntityType(PositionBillConstant.HBPM_POSITIONHR));
-        // 将表单中的信息赋值到岗位信息中
-        HRDynamicObjectUtils.copy(addDy, positionHrDy, transKeyMap);
+        getPositionHrDy(addDy, positionHrDy, transKeyMap);
+        // 设置 是否标准岗位
+        positionHrDy.set(PositionBillConstant.ISSTANDARDPOS_KEY, EnableEnum.NO.getCode());
+        // 设置 业务状态
+        positionHrDy.set(PositionBillConstant.ENABLE, EnableEnum.YES.getCode());
+        // 设置 数据状态
+        positionHrDy.set(PositionBillConstant.STATUS, StatusEnum.C);
+        // 设置 数据版本状态
+        positionHrDy.set(PositionBillConstant.DATA_STATUS, HisModelDataStatusEnum.EFFECTING);
         // 设置 行政组织
-        positionHrDy.set(PositionBillConstant.ADMINORG, HRBaseServiceHelper.create(PositionBillConstant.ADMINORG_ENTITYID).loadSingle(addDy.getLong(PositionBillConstant.NCKD_ADMINORGBOID_KEY)));
+        DynamicObject adminOrgVersionDy = addDy.getDynamicObject(PositionBillConstant.NCKD_ADMINORG);
+        if (HRObjectUtils.isEmpty(adminOrgVersionDy)) {
+            positionHrDy.set(PositionBillConstant.ADMINORG, null);
+        } else {
+            positionHrDy.set(PositionBillConstant.ADMINORG, HRBaseServiceHelper.create(PositionBillConstant.ADMINORG_ENTITYID).loadSingle(adminOrgVersionDy.getLong(PositionBillConstant.BOID_KEY)));
+        }
         // 设置 上级岗位
         DynamicObject parentPositionVersionDy = addDy.getDynamicObject(PositionBillConstant.NCKD_PARENT);
-        if (parentPositionVersionDy != null) {
-            positionHrDy.set(PositionBillConstant.PARENT_KEY, HRBaseServiceHelper.create(PositionBillConstant.HBPM_POSITIONHR).loadSingle(parentPositionVersionDy.getLong(PositionBillConstant.BOID_KEY)));
-        } else {
+        if (HRObjectUtils.isEmpty(parentPositionVersionDy)) {
             positionHrDy.set(PositionBillConstant.PARENT_KEY, null);
+        } else {
+            positionHrDy.set(PositionBillConstant.PARENT_KEY, HRBaseServiceHelper.create(PositionBillConstant.HBPM_POSITIONHR).loadSingle(parentPositionVersionDy.getLong(PositionBillConstant.BOID_KEY)));
         }
-        // 设置 数据状态
-        positionHrDy.set(PositionBillConstant.STATUS, StatusEnum.A);
+        return positionHrDy;
+    }
+
+    /**
+     * 构建岗位
+     * @param addDy
+     * @param positionDyo
+     * @param transKeyMap
+     * @return
+     */
+    public static DynamicObject getPositionHrDy(DynamicObject addDy, DynamicObject positionDyo, Map<String, String> transKeyMap) {
+        // 将表单中的信息赋值到岗位信息中
+        HRDynamicObjectUtils.copy(addDy, positionDyo, transKeyMap);
+        // 设置ID
+        positionDyo.set(PositionBillConstant.ID_KEY, addDy.getLong(PositionBillConstant.ID_KEY));
         // 设置 业务状态
-        positionHrDy.set(PositionBillConstant.ENABLE, EnableEnum.YES.getCode());
-        // 设置 是否标准岗位
-        positionHrDy.set(PositionBillConstant.ISSTANDARDPOS_KEY, EnableEnum.NO.getCode());
+        //positionDyo.set(PositionBillConstant.ENABLE, EnableEnum.YES.getCode());
+        // 设置 数据状态
+        //positionDyo.set(PositionBillConstant.STATUS, StatusEnum.A);
         // 设置 数据版本状态
-        positionHrDy.set(PositionBillConstant.DATA_STATUS, HisModelDataStatusEnum.TEMP.getStatus());
-        return positionHrDy;
+        //positionDyo.set(PositionBillConstant.DATA_STATUS, " ");
+        return positionDyo;
     }
 
     public static void entryEntityMore(IDataModel iDataModel, IFormView iFormView, String tag, OperationStatus status, String pluginName) {

+ 2 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionBillConstant.java

@@ -23,6 +23,8 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_POSBILLENTRYADD_ENTITY = "nckd_posbillentryadd";
     /** 岗位申请-变更信息实体标识 */
     public static final String NCKD_POSBILLENTRYCHANGE_ENTITY = "nckd_posbillentrychange";
+    /** 岗位申请单键值转换实体标识 */
+    public static final String NCKD_POSBILL_TRANSKEY_ENTITY = "nckd_posbill_transkey";
 
     /** 新增标识 */
     public static final String ADD_TAG = "add";

+ 1 - 1
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryAddFormPlugin.java

@@ -74,7 +74,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
         }
 
         // 新增的时候生成岗位ID
-        String positionIdKey = String.format("%s_id", PositionBillConstant.NCKD_POSITION);
+        String positionIdKey = String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY);
         long positionId = getModel().getDataEntity().getLong(positionIdKey);
         if (positionId == 0L) {
             positionId = ORM.create().genLongId(PositionBillConstant.HBPM_POSITIONHR);

+ 2 - 2
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillEntryFormPlugin.java

@@ -182,11 +182,11 @@ public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements B
                     childNameMap = Maps.newHashMapWithExpectedSize(16);
                 }
 
-                childNameMap.put(String.valueOf(positionId), addEntryDy.getLocaleString(String.join("_", PositionBillConstant.NAME_KEY, suffix)));
+                childNameMap.put(String.valueOf(positionId), addEntryDy.getLocaleString(String.join("_", PositionBillConstant.NCKD_NAME_KEY, suffix)));
                 parentBoIdToChildNameMap.put(String.valueOf(boId), childNameMap);
             }
 
-            numberMap.put(String.valueOf(positionId), addEntryDy.getString(String.join("_", PositionBillConstant.NUMBER_KEY, suffix)));
+            numberMap.put(String.valueOf(positionId), addEntryDy.getString(String.join("_", PositionBillConstant.NCKD_NUMBER_KEY, suffix)));
         }
 
     }

+ 2 - 2
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillFormPlugin.java

@@ -21,9 +21,9 @@ import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.util.HRStringUtils;
 import kd.hr.homs.business.domain.batchbill.repository.AdminOrgBatchChgHelper;
-import kd.hr.homs.business.domain.batchbill.service.impl.AdminOrgBatchBillConfirmCallBackService;
 import kd.sdk.hr.hdm.common.enums.reg.RegBillStatusEnum;
 import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillClosedCallBackService;
+import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillConfirmCallBackService;
 import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillServiceHelper;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
@@ -98,7 +98,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin {
     public void confirmCallBack(MessageBoxClosedEvent event) {
         super.confirmCallBack(event);
 
-        AdminOrgBatchBillConfirmCallBackService confirmCallBackService = new AdminOrgBatchBillConfirmCallBackService(getView());
+        PositionBillConfirmCallBackService confirmCallBackService = new PositionBillConfirmCallBackService(getView());
         confirmCallBackService.confirmCallBack(event);
     }
 

+ 31 - 20
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryAddSaveOpPlugin.java

@@ -2,7 +2,6 @@ package nckd.jxccl.hrmp.hbpm.plugin.operate.hr;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import kd.bos.common.enums.EnableEnum;
 import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.entity.constant.StatusEnum;
@@ -15,10 +14,10 @@ import kd.bos.exception.KDBizException;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.service.operation.OperationServiceImpl;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.constants.history.HisModelDataStatusEnum;
-import kd.hr.hbp.common.util.HRDynamicObjectUtils;
 import kd.hr.hbp.common.util.HRStringUtils;
 import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillServiceHelper;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
@@ -49,8 +48,10 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
         List<Long> positionBoIds = Lists.newArrayListWithExpectedSize(positionEntities.length);
         // 获取 行政组织业务ID
         List<Long> adminorgBoIds = Lists.newArrayListWithExpectedSize(positionEntities.length);
+        // 岗位ID标识
+        String positionIdKey = String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY);
         for (DynamicObject positionEntity : positionEntities) {
-            positionBoIds.add(positionEntity.getLong(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY)));
+            positionBoIds.add(positionEntity.getLong(positionIdKey));
             adminorgBoIds.add(positionEntity.getLong(PositionBillConstant.NCKD_ADMINORGBOID_KEY));
             // 获取上级岗位
             DynamicObject parentPositionVersionDy = positionEntity.getDynamicObject(PositionBillConstant.NCKD_PARENT);
@@ -77,10 +78,10 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
         OperateOption operateOption = OperateOption.create();
         List<DynamicObject> positionList = Lists.newArrayListWithExpectedSize(positionEntities.length);
         // 需要转换的键值
-        Map<String, String> transKeyMap = PositionBillServiceHelper.getTransKeyMap();
+        Map<String, String> transKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY);
 
         for (DynamicObject positionEntity : positionEntities) {
-            long positionId = positionEntity.getLong(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY));
+            long positionId = positionEntity.getLong(positionIdKey);
             // 如果数据库存在则用数据库的岗位对象
             DynamicObject positionDyo = dbPositionMap.get(positionId);
             // 不存在则创建一个
@@ -88,11 +89,13 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
                 positionDyo = positionServiceHelper.generateEmptyDynamicObject();
             }
             // 将表单中的信息赋值到岗位信息中
-            HRDynamicObjectUtils.copy(positionEntity, positionDyo, transKeyMap);
+            PositionBillServiceHelper.getPositionHrDy(positionEntity, positionDyo, transKeyMap);// 调用保存会自动设置
+            // 设置ID为岗位ID
+            positionDyo.set(PositionBillConstant.ID_KEY, positionId);
+            // 设置 是否标准岗位
+            positionDyo.set(PositionBillConstant.ISSTANDARDPOS_KEY, "9");// 暂存的数据固定为9,由于标品岗位一定会生成历史版本数据,所以为了能够正常的多次保存且不显示在岗位中需要这样做
             // 设置 行政组织
             positionDyo.set(PositionBillConstant.ADMINORG, dbAdminOrgMap.get(positionEntity.getLong(PositionBillConstant.NCKD_ADMINORGBOID_KEY)));
-             // 设置ID
-            positionDyo.set(PositionBillConstant.ID_KEY, positionId);
             // 设置 上级岗位
             DynamicObject parentPositionVersionDy = positionEntity.getDynamicObject(PositionBillConstant.NCKD_PARENT);
             if (parentPositionVersionDy != null) {
@@ -100,14 +103,6 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
             } else {
                 positionDyo.set(PositionBillConstant.PARENT_KEY, null);
             }
-            // 设置 数据状态
-            positionDyo.set(PositionBillConstant.STATUS, StatusEnum.A);
-            // 设置 业务状态
-            positionDyo.set(PositionBillConstant.ENABLE, EnableEnum.YES.getCode());
-            // 设置 是否标准岗位
-            positionDyo.set(PositionBillConstant.ISSTANDARDPOS_KEY, EnableEnum.NO.getCode());
-            // 设置 数据版本状态
-            positionDyo.set(PositionBillConstant.DATA_STATUS, HisModelDataStatusEnum.TEMP.getStatus());
             positionList.add(positionDyo);
             String number = positionDyo.getString(PositionBillConstant.NUMBER_KEY);
             // 设置 编码为已变更
@@ -115,6 +110,8 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
                 operateOption.setVariableValue(positionId + "coderule_billno_from_initAbstractCodeRule", PAGECACHE_KEY_BILLNO_FROM_INIT_VALUE_OF_OPERATION);
             }
         }
+        // 设置岗位临时新增标识
+        //operateOption.setVariableValue("OP_ADD_POSITION_TEMP_TAG", Boolean.TRUE.toString());
         // 跳过功能权限校验
         operateOption.setVariableValue(OperateOptionConst.ISHASRIGHT, Boolean.TRUE.toString());
         // 跳过数据权限校验
@@ -123,9 +120,22 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
         List successPkIds = Lists.newArrayList();
         for (int index = 0; index < positionList.size(); ++index) {
             DynamicObject positionDyo = positionList.get(index);
+            String orgId = "";
+            // 设置编码
+            if (HRStringUtils.isBlank(positionDyo.getString(PositionBillConstant.NUMBER_KEY))) {
+                orgId = String.valueOf(positionDyo.getLong(String.join("_", PositionBillConstant.ORG_KEY, PositionBillConstant.ID_KEY)));
+                String positionNumber = CodeRuleServiceHelper.getNumber(PositionBillConstant.HBPM_POSITIONHR, positionDyo, orgId);
+                positionDyo.set(PositionBillConstant.NUMBER_KEY, positionNumber);
+            }
+            // 保存
             OperationServiceImpl opImpl = new OperationServiceImpl();
             OperationResult saveResult = opImpl.localInvokeOperation(PositionBillConstant.SAVE_OP, new DynamicObject[]{positionDyo}, operateOption);
             if (!saveResult.isSuccess()) {
+                // 回收编码
+                if (HRStringUtils.isNotBlank(orgId)) {
+                    CodeRuleServiceHelper.recycleNumber(PositionBillConstant.HBPM_POSITIONHR, positionDyo, orgId, positionDyo.getString(PositionBillConstant.NUMBER_KEY));
+                }
+
                 for(IOperateInfo operateInfo : saveResult.getAllErrorOrValidateInfo()) {
                     errorMsgList.add(operateInfo.getMessage());
                 }
@@ -134,7 +144,7 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
                 DynamicObject[] dbPositionEntityDys = positionServiceHelper.loadDynamicObjectArray(new QFilter[]{new QFilter(PositionBillConstant.ID_KEY, QCP.in, saveResult.getSuccessPkIds())});
                 DynamicObject dbPositionEntityDy = dbPositionEntityDys[0];
                 DynamicObject positionEntity = positionEntities[index];
-                positionEntity.set(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY), dbPositionEntityDy.get(PositionBillConstant.ID_KEY));
+                positionEntity.set(positionIdKey, dbPositionEntityDy.get(PositionBillConstant.ID_KEY));
                 positionEntity.set(PositionBillConstant.NUMBER_KEY, dbPositionEntityDy.getString(PositionBillConstant.NUMBER_KEY));
             }
         }
@@ -142,18 +152,19 @@ public class PosBillEntryAddSaveOpPlugin extends AbstractOperationServicePlugIn
             throw new KDBizException(String.join(System.lineSeparator(), errorMsgList));
         } else {
             // 由于标品会强制设置值,所以需要后置更新
-            updatePositionDataStatus(successPkIds);
+            //updatePositionStatus(successPkIds);
         }
     }
 
     /**
-     * 更新岗位数据版本状态
+     * 更新岗位信息的状态
      * @param successPkIds
      */
-    private void updatePositionDataStatus(List successPkIds) {
+    private void updatePositionStatus(List successPkIds) {
         HRBaseServiceHelper positionServiceHelper = HRBaseServiceHelper.create(PositionBillConstant.HBPM_POSITIONHR);
         DynamicObject[] positionDys = positionServiceHelper.loadDynamicObjectArray(new QFilter[]{new QFilter(PositionBillConstant.BOID_KEY, QCP.in, successPkIds)});
         for (DynamicObject positionDy : positionDys) {
+            positionDy.set(PositionBillConstant.STATUS, StatusEnum.A);
             positionDy.set(PositionBillConstant.DATA_STATUS, HisModelDataStatusEnum.TEMP.getStatus());
         }
         SaveServiceHelper.save(positionDys);