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

Merge remote-tracking branch 'origin/master'

wyc 1 неделя назад
Родитель
Сommit
53aaacc526
25 измененных файлов с 854 добавлено и 156 удалено
  1. 9 1
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
  2. 165 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillAfterBindDataService.java
  3. 101 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillBeforeBindDataService.java
  4. 1 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillClosedCallBackService.java
  5. 7 7
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillConfirmCallBackService.java
  6. 2 2
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillPropertyChangedService.java
  7. 4 3
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillSaveHelper.java
  8. 46 46
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillServiceHelper.java
  9. 43 5
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionBillConstant.java
  10. 16 4
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionChangeTypeEnum.java
  11. 8 8
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryAddFormPlugin.java
  12. 30 25
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryUpdatePlugin.java
  13. 2 2
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillEntryFormPlugin.java
  14. 248 46
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillFormPlugin.java
  15. 70 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillListPlugin.java
  16. 1 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryAddSaveOpPlugin.java
  17. 26 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryChangeSaveOpPlugin.java
  18. 2 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryNewPositionTempSaveOpPlugin.java
  19. 46 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PositionBillDeleteOpPlugin.java
  20. 1 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PositionBillEntrySaveOpPlugin.java
  21. 4 3
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/AbsBillPositionSaveValidator.java
  22. 1 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionAddSaveValidator.java
  23. 3 2
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionBillEntryNameValidator.java
  24. 2 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionBillEntryNumberValidator.java
  25. 16 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionChangeSaveValidator.java

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

@@ -140,6 +140,8 @@ public class FormConstant {
     public static final String HAOS_ADMINORGTREELISTF7_ENTITY = "haos_adminorgtreelistf7";
     /** 批量单组织F7-树实体标识 */
     public static final String HAOS_ORGBATCHTREELISTF7_ENTITY = "haos_orgbatchtreelistf7";
+    /** 组织快速维护实体标识 */
+    public static final String HAOS_ADMINORGDETAIL_ENTITY = "haos_adminorgdetail";
 
     //====================================== 标品op ======================================
     /** 确认框确认按钮 */
@@ -190,6 +192,10 @@ public class FormConstant {
     public static final String MODIFY_OP = "modify";
     /** 修改按钮标识 */
     public static final String BAR_MODIFY_KEY = "bar_modify";
+    /** 查看流程图操作标识 */
+    public static final String VIEWFLOWCHART_OP = "viewflowchart";
+    /** 查看流程图按钮标识 */
+    public static final String BAR_VIEWFLOWCHART_KEY = "bar_viewflowchart";
 
 
     //====================================== 标品页面控件 ======================================
@@ -226,7 +232,7 @@ public class FormConstant {
     /** 编号标识 */
     public static final String NUMBER_KEY = "number";
     /** 单据编号*/
-    public static final String BILL_NO_KEY = "BILLNO";
+    public static final String BILL_NO_KEY = "billno";
     /** 单据状态 */
     public static final String BILL_STATUS_KEY = "billstatus";
     /** 单据状态 */
@@ -343,6 +349,8 @@ public class FormConstant {
     public static final String BSED_KEY = "bsed";
     /** 失效日期 */
     public static final String BSLED_KEY = "bsled";
+    /** 是否存在工作流 */
+    public static final String ISEXISTSWORKFLOW_KEY = "isexistsworkflow";
 
     /** 工具栏标识(二开)*/
     public static final String NCKD_TOOLBARAP = "nckd_toolbarap";

+ 165 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillAfterBindDataService.java

@@ -1,8 +1,35 @@
 package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
+import com.google.common.collect.Maps;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.entity.datamodel.AbstractFormDataModel;
+import kd.bos.entity.datamodel.TableValueSetter;
+import kd.bos.form.FieldTip;
 import kd.bos.form.IFormView;
+import kd.bos.form.IPageCache;
+import kd.bos.mvc.cache.PageCache;
 import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.orm.util.CollectionUtils;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.util.HRArrayUtils;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.hr.homs.business.utils.PatternUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionChangeTypeEnum;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 岗位申请单后置绑定数据服务
@@ -17,9 +44,54 @@ public class PositionBillAfterBindDataService extends PositionBillBaseService {
 
     public void afterBindData() {
         genBillIdIfNotExist();
+        deleteAllEntryData();
+        updateAllChangeTypeEntry();
+        deleteAddEntryIfChangeOrg();
+        changeOrgFiledTip();
         getModel().setDataChanged(false);
     }
 
+    private void changeOrgFiledTip() {
+        FieldTip orgTip = new FieldTip();
+        orgTip.setFieldKey(PositionBillConstant.ORG_KEY);
+        orgTip.setSuccess(true);
+        getView().showFieldTip(orgTip);
+    }
+
+    private void deleteAddEntryIfChangeOrg() {
+        String orgCache = getView().getPageCache().get(PositionBillConstant.PC_ORGCACHE);
+        Object org = getModel().getValue(PositionBillConstant.ORG_KEY);
+        if (Objects.isNull(orgCache)) {
+            if (Objects.nonNull(org)) {
+                DynamicObject dy = (DynamicObject) org;
+                getView().getPageCache().put(PositionBillConstant.PC_ORGCACHE, dy.getLong(PositionBillConstant.ID_KEY) + "");
+            }
+        } else if (Objects.nonNull(org)) {
+            DynamicObject dy = (DynamicObject) org;
+            String newId = dy.getLong(PositionBillConstant.ID_KEY) + "";
+            if (!orgCache.equals(newId)) {
+                long billId = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
+                HRBaseServiceHelper positionBillEntryHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);
+                QFilter billIdFilter = new QFilter(PositionBillConstant.NCKD_BILLID, QCP.equals, billId);
+                String selectProperties = QueryFieldBuilder.create().add(PositionBillConstant.ID_KEY)
+                        .add(PositionBillConstant.NUMBER_KEY)
+                        .add(PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY)
+                        .add(PositionBillConstant.NCKD_POSITION_KEY)
+                        .buildSelect();
+                DynamicObject[] positionBillEntryDynArr = positionBillEntryHelper.query(selectProperties, new QFilter[]{billIdFilter});
+                positionBillEntryHelper.deleteByFilter(new QFilter[]{billIdFilter});
+                List<Long> addPositionIdList = Arrays.stream(positionBillEntryDynArr).filter((dyn) -> HRStringUtils.equals(dyn.getString(String.join(".", PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY)), PositionChangeTypeEnum.ADD.getNumber())).map((dyn) -> dyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY))).collect(Collectors.toList());
+                getView().getPageCache().put(PositionBillConstant.PC_ORGCACHE, newId);
+                if (addPositionIdList.size() == 0) {
+                    return;
+                }
+
+                PositionBillServiceHelper.delAddMaster(addPositionIdList);
+            }
+        }
+
+    }
+
     private void genBillIdIfNotExist() {
         long billId = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
         if (billId == 0L) {
@@ -28,4 +100,97 @@ public class PositionBillAfterBindDataService extends PositionBillBaseService {
         }
     }
 
+    private void deleteAllEntryData() {
+        IPageCache pageCache = new PageCache(getView().getPageId());
+        Object importPageClose = pageCache.get(PositionBillConstant.PC_CACHE_KEY_IMPORT_START_CLOSE);
+        Object entryImport = pageCache.get(PositionBillConstant.PC_CACHE_KEY_IMPORT_DATA_FLAG);
+        if (!Boolean.TRUE.toString().equals(importPageClose) || Boolean.TRUE.toString().equals(entryImport)) {
+            Arrays.stream(PositionChangeTypeEnum.values()).forEach((changTypeEnum) -> getModel().deleteEntryData(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, changTypeEnum.getTag())));
+        }
+    }
+
+    private void updateAllChangeTypeEntry() {
+        IPageCache pageCache = new PageCache(getView().getPageId());
+        Object importPageClose = pageCache.get(PositionBillConstant.PC_CACHE_KEY_IMPORT_START_CLOSE);
+        Object entryImport = pageCache.get(PositionBillConstant.PC_CACHE_KEY_IMPORT_DATA_FLAG);
+        if (Boolean.TRUE.toString().equals(importPageClose) && !Boolean.TRUE.toString().equals(entryImport)) {
+            pageCache.remove(PositionBillConstant.PC_CACHE_KEY_IMPORT_START_CLOSE);
+            pageCache.remove(PositionBillConstant.PC_CACHE_KEY_IMPORT_DATA_FLAG);
+        } else {
+            Long billId = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
+            HRBaseServiceHelper positionBillEntryEntityHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);
+            QFilter billIdFilter = new QFilter(PositionBillConstant.NCKD_BILLID, QCP.equals, billId);
+            DynamicObject[] batchOrgEntryEntityDynArr = positionBillEntryEntityHelper.loadDynamicObjectArray(new QFilter[]{billIdFilter});
+            Arrays.sort(batchOrgEntryEntityDynArr, Comparator.comparingLong((dyn) -> dyn.getLong(PositionBillConstant.NCKD_SEQUENCE)));
+            Map<String, List<DynamicObject>> changeTypeForBillDynMap = Maps.newHashMap();
+            if (!HRArrayUtils.isEmpty(batchOrgEntryEntityDynArr)) {
+                changeTypeForBillDynMap = Arrays.stream(batchOrgEntryEntityDynArr).collect(Collectors.groupingBy((dyn) -> dyn.getString(String.join(".", PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY))));
+            }
+
+            // 获取分录需要转换的键值
+            Map<String, String> posBillEntryTransKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
+            for(Map.Entry<String, List<DynamicObject>> stringListEntry : changeTypeForBillDynMap.entrySet()) {
+                String changeTypeNumber = stringListEntry.getKey();
+                List<DynamicObject> entryEntityDynList = stringListEntry.getValue();
+                String suffix = PositionChangeTypeEnum.getTagByNumber(changeTypeNumber);
+                String entryEntity = String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, suffix);
+                DynamicObjectCollection dynamicObjectCollection = getModel().getDataEntity(true).getDynamicObjectCollection(entryEntity);
+                DynamicObjectType dynamicObjectType = dynamicObjectCollection.getDynamicObjectType();
+                DataEntityPropertyCollection properties = dynamicObjectType.getProperties();
+                TableValueSetter tableValueSetter = new TableValueSetter();
+                setTableValueSetterField(suffix, tableValueSetter, properties);
+                setTableValueSetterValue(suffix, tableValueSetter, properties, entryEntityDynList, posBillEntryTransKeyMap);
+                batchCreateNewEntryRow(tableValueSetter, entryEntity);
+            }
+
+        }
+    }
+
+    private void setTableValueSetterField(String suffix, TableValueSetter tableValueSetter, DataEntityPropertyCollection properties) {
+        if (!HRStringUtils.isEmpty(suffix)) {
+            for(IDataEntityProperty property : properties) {
+                String propName = property.getName();
+                if (PatternUtil.isExProperty(propName) && propName.endsWith("_"+suffix)) {
+                    tableValueSetter.addField(propName);
+                }
+            }
+            tableValueSetter.addField(PositionBillConstant.ID_KEY);
+        }
+    }
+
+    private void setTableValueSetterValue(String suffix, TableValueSetter tableValueSetter, DataEntityPropertyCollection properties, List<DynamicObject> entryEntityDynList, Map<String, String> posBillEntryTransKeyMap) {
+        if (!HRStringUtils.isEmpty(suffix)) {
+            for(int i = 0; i < entryEntityDynList.size(); ++i) {
+                for(IDataEntityProperty property : properties) {
+                    String propName = property.getName();
+                    if (PatternUtil.isExProperty(propName) && propName.endsWith("_"+suffix)) {
+                        String propNameSub = PositionBillServiceHelper.getNoLineSuffixProp(propName, "_"+suffix);
+                        tableValueSetter.set(propName, getValue(entryEntityDynList.get(i).get(posBillEntryTransKeyMap.getOrDefault(propName, propNameSub))), i);
+                    }
+                }
+                tableValueSetter.set(PositionBillConstant.ID_KEY, entryEntityDynList.get(i).get(PositionBillConstant.ID_KEY), i);
+
+                if (PositionBillConstant.ADD_TAG.equals(suffix)) {
+                    tableValueSetter.set(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, suffix), entryEntityDynList.get(i).getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY)), i);
+                }
+
+            }
+
+        }
+    }
+
+    private Object getValue(Object object) {
+        return object instanceof DynamicObject ? ((DynamicObject) object).get(PositionBillConstant.ID_KEY) : object;
+    }
+
+    private void batchCreateNewEntryRow(TableValueSetter tableValueSetter, String entryEntity) {
+        if (!CollectionUtils.isEmpty(tableValueSetter.getFields())) {
+            AbstractFormDataModel model = (AbstractFormDataModel) getModel();
+            model.beginInit();
+            model.batchCreateNewEntryRow(entryEntity, tableValueSetter);
+            model.endInit();
+            getView().updateView(entryEntity);
+        }
+    }
+
 }

+ 101 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillBeforeBindDataService.java

@@ -0,0 +1,101 @@
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
+
+import kd.bos.common.enums.EnableEnum;
+import kd.bos.context.RequestContext;
+import kd.bos.form.IFormView;
+import kd.bos.form.container.Container;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.permission.api.HasPermOrgResult;
+import kd.bos.servicehelper.org.OrgUnitServiceHelper;
+import kd.bos.servicehelper.org.OrgViewType;
+import kd.bos.servicehelper.permission.PermissionServiceHelper;
+import kd.hr.haos.business.util.OrgPermHelper;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.hr.hdm.common.enums.reg.RegBillStatusEnum;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+
+import java.util.EventObject;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 岗位申请单前置绑定数据服务
+ * @from: kd.hr.homs.business.domain.batchbill.service.impl.AdminOrgBatchBillBeforeBindDataService
+ * @author: jtd
+ * @date: 2025/12/30 22:05
+ */
+public class PositionBillBeforeBindDataService extends PositionBillBaseService {
+    private static final Log LOGGER = LogFactory.getLog(PositionBillBeforeBindDataService.class);
+
+    public PositionBillBeforeBindDataService(IFormView view) {
+        super(view);
+    }
+
+    public void beforeBindData(EventObject e) {
+        changePageCacheFromWhatVie();
+        getView().getPageCache().put(PositionBillConstant.PC_ISLIST, EnableEnum.YES.getCode());
+        if (HRStringUtils.equals(getView().getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
+            Container baseInfo = getView().getControl(PositionBillConstant.FS_BASEINFO_KEY);
+            baseInfo.setCollapse(true);
+        } else {
+            Container baseInfo = getView().getControl(PositionBillConstant.FS_BASEINFO_KEY);
+            baseInfo.setCollapse(false);
+        }
+
+        if (getModel().getDataEntity(true).getDynamicObject(PositionBillConstant.ORG_KEY) == null) {
+            getView().getModel().setValue(PositionBillConstant.ORG_KEY, OrgUnitServiceHelper.getRootOrgId());
+        }
+
+        String billstatus = getModel().getDataEntity().getString(PositionBillConstant.BILL_STATUS_KEY);
+        // 显示/隐藏 查看流程图
+        if (HRStringUtils.equalsAny(billstatus, RegBillStatusEnum.ALREADYSUBMIT.getCode(), RegBillStatusEnum.APPROVEPASSED.getCode(), RegBillStatusEnum.APPROVING.getCode(), RegBillStatusEnum.APPROVEREJECTED.getCode()) && getModel().getDataEntity().getBoolean(PositionBillConstant.ISEXISTSWORKFLOW_KEY)) {
+            getView().setVisible(true, new String[]{PositionBillConstant.BAR_VIEWFLOWCHART_KEY});
+        } else {
+            getView().setVisible(false, new String[]{PositionBillConstant.BAR_VIEWFLOWCHART_KEY});
+        }
+
+    }
+
+    private void changePageCacheFromWhatVie() {
+        if (Boolean.TRUE.toString().equals(getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_FROMLIST))) {
+            Object businessUnit = getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_BUSINESSUNIT);
+            if (businessUnit != null) {
+                getModel().setValue(PositionBillConstant.ORG_KEY, businessUnit);
+            } else if (!Boolean.TRUE.toString().equals(getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_ISFROMBILLCLICK))) {
+                HasPermOrgResult hrPermOrg = OrgPermHelper.getHRPermOrg(false);
+                List<Long> hasPermOrgs = hrPermOrg.getHasPermOrgs();
+                if (!Objects.isNull(hasPermOrgs) && hasPermOrgs.size() != 0) {
+                    if (hasPermOrgs.contains(RequestContext.get().getOrgId())) {
+                        getModel().setValue(PositionBillConstant.ORG_KEY, RequestContext.get().getOrgId());
+                    } else {
+                        getModel().setValue(PositionBillConstant.ORG_KEY, hasPermOrgs.get(0));
+                    }
+                }
+            }
+
+            getView().getFormShowParameter().setCustomParam(PositionBillConstant.CP_FROMLIST, Boolean.FALSE.toString());
+            getView().cacheFormShowParameter();
+        } else if (Boolean.TRUE.toString().equals(getView().getPageCache().get(PositionBillConstant.PC_ISFROMIMPORT)) || getView().getParentView() != null && (PositionBillConstant.NCKD_POSTMGR_APPHOME_ENTITY.equals(getView().getParentView().getEntityId()) || getView().getParentView().getEntityId().startsWith("wf_"))) {
+            if (getView().getParentView() != null && PositionBillConstant.NCKD_POSTMGR_APPHOME_ENTITY.equals(getView().getParentView().getEntityId()) && getView().getPageCache().get(PositionBillConstant.PC_ISFROMHOMEPAGE) == null) {
+                HasPermOrgResult hrPermOrg = PermissionServiceHelper.getAllPermOrgs(RequestContext.get().getCurrUserId(), OrgViewType.HR_OD, getView().getFormShowParameter().getCheckRightAppId(), PositionBillConstant.HBPM_POSITIONHR, "47150e89000000ac", false);
+                List<Long> hasPermOrgs = hrPermOrg.getHasPermOrgs();
+                if (!Objects.isNull(hasPermOrgs) && hasPermOrgs.size() != 0) {
+                    if (hasPermOrgs.contains(RequestContext.get().getOrgId())) {
+                        getModel().setValue(PositionBillConstant.ORG_KEY, RequestContext.get().getOrgId());
+                    } else {
+                        getModel().setValue(PositionBillConstant.ORG_KEY, hasPermOrgs.get(0));
+                    }
+
+                    getView().getPageCache().put(PositionBillConstant.PC_ISFROMHOMEPAGE, Boolean.TRUE.toString());
+                }
+            }
+
+            getView().getPageCache().put(PositionBillConstant.PC_ISFROMIMPORT, Boolean.FALSE.toString());
+        } else {
+            String parentView = getView().getParentView() != null ? getView().getParentView().getEntityId() : "null";
+            LOGGER.info("method changePageCacheFromWhatVie parentView is [{}]", parentView);
+        }
+
+    }
+}

+ 1 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillClosedCallBackService.java

@@ -150,6 +150,7 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
                     }
                 }
 
+                vs.addField(PositionBillConstant.ID_KEY);
                 propList.add(PositionBillConstant.ID_KEY);
                 List<Object> values = Lists.newArrayListWithCapacity(16);
 

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

@@ -65,7 +65,7 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
                     for (int i = 0; i < deleteRows.length; ++i) {
                         int row = deleteRows[i];
                         entryIdList.add(getModel().getEntryEntity(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).get(row).getLong(PositionBillConstant.ID_KEY));
-                        positionIds.add(getModel().getEntryEntity(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).get(row).getLong(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ADD_TAG)));
+                        positionIds.add(getModel().getEntryEntity(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).get(row).getLong(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ADD_TAG)));
                     }
 
                     getModel().deleteEntryRows(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY, deleteRows);
@@ -94,11 +94,11 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
                 String selectProperties = QueryFieldBuilder.create().add(PositionBillConstant.ID_KEY)
                         .add(PositionBillConstant.NUMBER_KEY)
                         .add(PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY)
-                        .add(PositionBillConstant.NCKD_POSITION)
+                        .add(PositionBillConstant.NCKD_POSITION_KEY)
                         .buildSelect();
                 DynamicObject[] positionBillEntryDynArr = positionBillEntryHelper.query(selectProperties, new QFilter[]{billIdFilter});
                 positionBillEntryHelper.deleteByFilter(new QFilter[]{billIdFilter});
-                List<Long> addPositionIdList = Arrays.stream(positionBillEntryDynArr).filter((dynx) -> PositionChangeTypeEnum.ADD.getNumber().equals(dynx.getDynamicObject(PositionBillConstant.NCKD_CHANGETYPE).getString(PositionBillConstant.NUMBER_KEY))).map((dynx) -> dynx.getLong(String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY))).collect(Collectors.toList());
+                List<Long> addPositionIdList = Arrays.stream(positionBillEntryDynArr).filter((dynx) -> HRStringUtils.equals(dynx.getDynamicObject(PositionBillConstant.NCKD_CHANGETYPE).getString(PositionBillConstant.NUMBER_KEY), PositionBillConstant.ADD_TAG)).map((dynx) -> dynx.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY))).collect(Collectors.toList());
                 PositionBillServiceHelper.delAddMaster(addPositionIdList);
 
                 getView().getPageCache().put(PositionBillConstant.PC_ISCANCELOVER, Boolean.TRUE.toString());
@@ -121,7 +121,7 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
         List<Integer> rowList = Arrays.stream(rows).boxed().collect(Collectors.toList());
 
         // 岗位标识-新增岗位
-        String positionAddKey = String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ADD_TAG);
+        String positionAddKey = String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ADD_TAG);
         for(int i = 0; i < count; ++i) {
             DynamicObject dynamicObject = getModel().getEntryEntity(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).get(i);
             long positionId = dynamicObject.getLong(positionAddKey);
@@ -199,9 +199,9 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
                 if (HRStringUtils.isNotEmpty(positionOld)) {
                     QFilter filter = new QFilter(PositionBillConstant.ID_KEY, QCP.equals, Long.parseLong(positionOld));
                     DynamicObject position = helper.queryOne(String.join(",", PositionBillConstant.ID_KEY, PositionBillConstant.NAME_KEY, PositionBillConstant.NUMBER_KEY), filter.toArray());
-                    entryEntityDyn.set(PositionBillConstant.NCKD_POSITION + lineSuffix, position);
+                    entryEntityDyn.set(PositionBillConstant.NCKD_POSITION_KEY + lineSuffix, position);
                 } else {
-                    entryEntityDyn.set(PositionBillConstant.NCKD_POSITION + lineSuffix, null);
+                    entryEntityDyn.set(PositionBillConstant.NCKD_POSITION_KEY + lineSuffix, null);
                 }
 
                 getView().updateView(PositionBillConstant.NCKD_ENTRYENTITY + lineSuffix);
@@ -228,7 +228,7 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
             }
 
             DynamicObject entryEntityDyn = PositionBillServiceHelper.getFocusEntry(suffix, getView(), row);
-            long positionId = entryEntityDyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION+lineSuffix, PositionBillConstant.ID_KEY));
+            long positionId = entryEntityDyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY+lineSuffix, PositionBillConstant.ID_KEY));
             QFilter filter = new QFilter(PositionBillConstant.ID_KEY, QCP.equals, positionId);
             DynamicObject position = helper.queryOne(queryFieldBuilder.buildSelect(), filter.toArray());
             long entryId = ORM.create().genLongId(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);

+ 2 - 2
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillPropertyChangedService.java

@@ -53,7 +53,7 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
             String suffix = getSuffixByFieldKey(fieldKey);
             Object objectNew = changedArgs.getChangeSet()[0].getNewValue();
             Object objectOld = changedArgs.getChangeSet()[0].getOldValue();
-            if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION, suffix))) {
+            if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, suffix))) {
                 if (objectOld == null) {
                     entrySelectF7Change(property, suffix, rowIndex);
                 } else if (objectNew != null) {
@@ -104,7 +104,7 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
         Map<?, DynamicObject> dyMap = baseDataCacheMap.get(baseEntityId);
         DynamicObject entryEntityDyn = PositionBillServiceHelper.getFocusEntry(suffix, getView(), row);
         DynamicObject position = null;
-        long positionId = entryEntityDyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION+lineSuffix, PositionBillConstant.ID_KEY));
+        long positionId = entryEntityDyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY+lineSuffix, PositionBillConstant.ID_KEY));
         if (dyMap != null) {
             position = dyMap.get(positionId);
         }

+ 4 - 3
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillSaveHelper.java

@@ -3,6 +3,7 @@ package nckd.jxccl.hrmp.hbpm.business.service.hr;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
+import kd.hr.hbp.common.util.HRStringUtils;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionChangeTypeEnum;
 
@@ -21,9 +22,9 @@ public class PositionBillSaveHelper {
     }
 
     public Long getPositionId(DynamicObject entryEntityDynFromPage, String suffix) {
-        String idFieldName = String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY);
-        if (entryEntityDynFromPage.getString(spliceTwoStringByUnderLine(suffix, String.join(".", PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY))) == PositionChangeTypeEnum.ADD.getNumber()) {
-            idFieldName = PositionBillConstant.NCKD_POSITION;
+        String idFieldName = String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY);
+        if (HRStringUtils.equals(entryEntityDynFromPage.getString(spliceTwoStringByUnderLine(suffix, String.join(".", PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY))), PositionChangeTypeEnum.ADD.getNumber())) {
+            idFieldName = PositionBillConstant.NCKD_POSITION_KEY;
         }
 
         String positionFiledName = spliceTwoStringByUnderLine(suffix, idFieldName);

+ 46 - 46
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillServiceHelper.java

@@ -68,6 +68,41 @@ public class PositionBillServiceHelper {
         return prop;
     }
 
+    /**
+     * 获取岗位转换键值
+     * @return 目标字段: 源字段
+     */
+    public static Map<String, String> getPositionTransKeyMap() {
+        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);
+        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)
+        );
+        return transKeyMap;
+    }
+
+    /**
+     * 获取岗位申请分录转换键值
+     * @return 单据分录字段: 分录页面字段
+     */
+    public static Map<String, String> getPosBillEntryTransKeyMap() {
+        String selectFields = QueryFieldBuilder.create().add(PositionBillConstant.NUMBER_KEY).add(PositionBillConstant.NAME_KEY).buildSelect();
+        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(PositionBillConstant.NCKD_PBENTRY_TRANSKEY_ENTITY).queryOriginalArray(selectFields, null);
+        Map<String, String> transKeyMap = Arrays.stream(transKeyDyos).collect(Collectors.toMap(
+                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NUMBER_KEY),
+                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NAME_KEY),
+                (oldValue, newValue) -> newValue));
+        return transKeyMap;
+    }
+
+    public static List<String> getPositionExcludeKeyList() {
+        DynamicObject[] positionExcludeKeyList = HRBaseServiceHelper.create(PositionBillConstant.NCKD_POSITION_EXCLUDEKEY_ENTITY).queryOriginalArray(PositionBillConstant.NUMBER_KEY, null);
+        List<String> excludeKeyList = Arrays.stream(positionExcludeKeyList).map(positionExcludeKeyDyo -> positionExcludeKeyDyo.getString(PositionBillConstant.NUMBER_KEY)).collect(Collectors.toList());
+        return excludeKeyList;
+    }
+
     /**
      * 获取分录序号
      * @param iDataModel
@@ -139,9 +174,9 @@ public class PositionBillServiceHelper {
 
     public static AuthorizedOrgResult getOrgAuth(IFormView iFormView) {
         Long userId = RequestContext.get().getCurrUserId();
-        String permItemId = "47150e89000000ac";
+        String permItemId = "47150e89000000ac";// 查询权限
         String appId = iFormView.getFormShowParameter().getCheckRightAppId();
-        AuthorizedOrgResult permResult = HRMServiceHelper.invokeHRMPService("hrcs", "IHRCSBizDataPermissionService", "getUserAdminOrgsF7", new Object[]{userId, appId, PositionBillConstant.NCKD_POSITIONBILL_ENTITY, permItemId, "adminorgboid", Maps.newHashMapWithExpectedSize(0)});
+        AuthorizedOrgResult permResult = HRMServiceHelper.invokeHRMPService("hrcs", "IHRCSBizDataPermissionService", "getUserAdminOrgsF7", new Object[]{userId, appId, PositionBillConstant.NCKD_POSITIONBILL_ENTITY, permItemId, PositionBillConstant.NCKD_ADMINORGBOID_KEY, Maps.newHashMapWithExpectedSize(0)});
         return permResult;
     }
 
@@ -149,7 +184,7 @@ public class PositionBillServiceHelper {
         DynamicObject dataEntityParent = view.getModel().getDataEntity(true);
         QFilter isCurrentVersion = new QFilter(PositionBillConstant.IS_CURRENT_VERSION, QCP.equals, EnableEnum.NO.getCode());
         DynamicObjectCollection addCollection = dataEntityParent.getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY);
-        Set<String> positionSet = addCollection.stream().map((s) -> s.getString(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ADD_TAG))).collect(Collectors.toSet());
+        Set<String> positionSet = addCollection.stream().map((s) -> s.getString(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ADD_TAG))).collect(Collectors.toSet());
         Set<Long> addPositionIdSet = positionSet.stream().map(Long::valueOf).collect(Collectors.toSet());
         QFilter currentOrderFilter = new QFilter(PositionBillConstant.ID_KEY, QCP.in, addPositionIdSet);
 
@@ -212,7 +247,7 @@ public class PositionBillServiceHelper {
         }
 
         if (change != null) {
-            list.addAll(change.stream().map((position) -> position.getLong(String.format("%s_%s.%s", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG, PositionBillConstant.BOID_KEY))).collect(Collectors.toList()));
+            list.addAll(change.stream().map((position) -> position.getLong(String.format("%s_%s.%s", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.CHANGE_TAG, PositionBillConstant.BOID_KEY))).collect(Collectors.toList()));
         }
 
         return list.isEmpty() ? new QFilter(PositionBillConstant.ID_KEY, QCP.not_equals, 20000L) : new QFilter(PositionBillConstant.BOID_KEY, QCP.not_in, list);
@@ -278,52 +313,17 @@ public class PositionBillServiceHelper {
 
     public static DynamicObject getHisDynamicObject(Long boId) {
         if (boId != null && boId != 0L) {
-            HRBaseServiceHelper adminOrgHelper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
+            HRBaseServiceHelper positionHelper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
             QFilter idFilter = new QFilter(PositionBillConstant.BOID_KEY, QCP.equals, boId);
             Date effDate = HRDateTimeUtils.truncateDate(new Date());
             QFilter hisVersionFilter = (new QFilter(PositionBillConstant.IS_CURRENT_VERSION, QCP.equals, false)).and((new QFilter(PositionBillConstant.BSED_KEY, QCP.less_equals, effDate)).and(new QFilter(PositionBillConstant.BSLED_KEY, QCP.large_equals, effDate))).and(new QFilter(PositionBillConstant.DATA_STATUS, QCP.in, Arrays.asList(HisModelDataStatusEnum.EFFECTING.getStatus(), HisModelDataStatusEnum.EFFECTING.getStatus())));
             hisVersionFilter.and(PositionBillConstant.ISSTANDARDPOS_KEY, QCP.equals, true);
-            return adminOrgHelper.queryOne("id", new QFilter[]{idFilter, hisVersionFilter});
+            return positionHelper.queryOne(PositionBillConstant.ID_KEY, new QFilter[]{idFilter, hisVersionFilter});
         } else {
             return null;
         }
     }
 
-    /**
-     * 获取岗位转换键值
-     * @return 目标字段: 源字段
-     */
-    public static Map<String, String> getPositionTransKeyMap() {
-        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);
-        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)
-        );
-        return transKeyMap;
-    }
-
-    /**
-     * 获取岗位申请分录转换键值
-     * @return 单据分录字段: 分录页面字段
-     */
-    public static Map<String, String> getPosBillEntryTransKeyMap() {
-        String selectFields = QueryFieldBuilder.create().add(PositionBillConstant.NUMBER_KEY).add(PositionBillConstant.NAME_KEY).buildSelect();
-        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(PositionBillConstant.NCKD_PBENTRY_TRANSKEY_ENTITY).queryOriginalArray(selectFields, null);
-        Map<String, String> transKeyMap = Arrays.stream(transKeyDyos).collect(Collectors.toMap(
-                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NUMBER_KEY),
-                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NAME_KEY),
-                (oldValue, newValue) -> newValue));
-        return transKeyMap;
-    }
-
-    public static List<String> getPositionExcludeKeyList() {
-        DynamicObject[] positionExcludeKeyList = HRBaseServiceHelper.create(PositionBillConstant.NCKD_POSITION_EXCLUDEKEY_ENTITY).queryOriginalArray(PositionBillConstant.NUMBER_KEY, null);
-        List<String> excludeKeyList = Arrays.stream(positionExcludeKeyList).map(positionExcludeKeyDyo -> positionExcludeKeyDyo.getString(PositionBillConstant.NUMBER_KEY)).collect(Collectors.toList());
-        return excludeKeyList;
-    }
-
     /**
      * 构建岗位
      * 用于校验岗位数据或获取/回收岗位编码
@@ -397,7 +397,7 @@ public class PositionBillServiceHelper {
         Map map = HRDynamicObjectUtils.convertDynamicObjectToMap(dynamicObject);
         long id = dynamicObject.getLong(PositionBillConstant.ID_KEY);
         BillShowParameter formShowParameter = new BillShowParameter();
-        Object dy = dynamicObject.get(String.join("_", PositionBillConstant.NCKD_POSITION, tag));
+        Object dy = dynamicObject.get(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, tag));
         if (dy == null) {
             iFormView.showTipNotification("请先选择岗位。");
         } else {
@@ -423,7 +423,7 @@ public class PositionBillServiceHelper {
             formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
             formShowParameter.setCustomParam(PositionBillConstant.CP_SELECTOBJECT, SerializationUtils.toJsonString(map));
             formShowParameter.setCustomParam(PositionBillConstant.CP_BILLID, iDataModel.getValue(PositionBillConstant.ID_KEY));
-            formShowParameter.setCustomParam(PositionBillConstant.CP_POSITIONID, String.valueOf(dynamicObject.getLong(String.format("%s_%s.%s", PositionBillConstant.NCKD_POSITION, tag, PositionBillConstant.ID_KEY))));
+            formShowParameter.setCustomParam(PositionBillConstant.CP_POSITIONID, String.valueOf(dynamicObject.getLong(String.format("%s_%s.%s", PositionBillConstant.NCKD_POSITION_KEY, tag, PositionBillConstant.ID_KEY))));
             formShowParameter.setCustomParam(PositionBillConstant.CP_POSITION_BSED, iDataModel.getValue(PositionBillConstant.NCKD_EFFDT) == null ? HRDateTimeUtils.getNowDateTime().getTime() : ((Date) iDataModel.getValue(PositionBillConstant.NCKD_EFFDT)).getTime());
             formShowParameter.setCustomParam(PositionBillConstant.ORG_KEY, iDataModel.getDataEntity().getLong(String.join(".", PositionBillConstant.ORG_KEY, PositionBillConstant.ID_KEY)));
             formShowParameter.setCustomParam(PositionBillConstant.BILL_STATUS_KEY, iDataModel.getDataEntity().get(PositionBillConstant.BILL_STATUS_KEY));
@@ -453,7 +453,7 @@ public class PositionBillServiceHelper {
                 if (PositionChangeTypeEnum.ADD.getNumber().equals(changeTypeNumber)) {
                     positionBoId = helper.getPositionId(entryDy, suffix);
                 } else {
-                    DynamicObject positionDyRef = entryDy.getDynamicObject(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_POSITION));
+                    DynamicObject positionDyRef = entryDy.getDynamicObject(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_POSITION_KEY));
                     if (positionDyRef != null) {
                         positionBoId = positionDyRef.getLong(PositionBillConstant.BOID_KEY);
                     }
@@ -489,9 +489,9 @@ public class PositionBillServiceHelper {
                 long positionId = 0L;
                 String positionNumber = positionEntryDy.getString(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_NUMBER_KEY));
                 if (PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY.equals(positionEntryDy.getDynamicObjectType().getName())) {
-                    positionId = positionEntryDy.getLong(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_POSITION));
+                    positionId = positionEntryDy.getLong(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_POSITION_KEY));
                 } else {
-                    DynamicObject positionDy = positionEntryDy.getDynamicObject(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_POSITION));
+                    DynamicObject positionDy = positionEntryDy.getDynamicObject(helper.spliceTwoStringByUnderLine(suffix, PositionBillConstant.NCKD_POSITION_KEY));
                     if (positionDy != null) {
                         positionId = positionDy.getLong(PositionBillConstant.BOID_KEY);
                     }

+ 43 - 5
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionBillConstant.java

@@ -27,6 +27,8 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_PBENTRY_TRANSKEY_ENTITY = "nckd_pbentry_transkey";
     /** 岗位信息排除键值实体标识 */
     public static final String NCKD_POSITION_EXCLUDEKEY_ENTITY = "nckd_position_excludekey";
+    /** 岗位管理_应用首页实体标识 */
+    public static final String NCKD_POSTMGR_APPHOME_ENTITY = "nckd_postmgr_apphome";
 
     /** 新增标识 */
     public static final String ADD_TAG = "add";
@@ -49,11 +51,17 @@ public class PositionBillConstant extends FormConstant {
     public static final String EDIT_ADD_OP = "edit_add";
     /** 编辑-岗位变更OP */
     public static final String EDIT_CHANGE_OP = "edit_change";
+    /** 确认变更OP */
+    public static final String CONFIRMCHANGE_OP = "confirmchange";
+    /** 保存(不记录操作日志)操作标识 */
+    public static final String SAVE_NO_LOG_OP = "save_no_log";
 
     /** 岗位职责高级面板工具栏标识 */
     public static final String NCKD_ADVCONTOOLBARAP11_KEY = "nckd_advcontoolbarap11";
     /** 分录删除按钮标识 */
     public static final String NCKD_TB_DEL_KEY = "nckd_tb_del";
+    /** 单据信息容器标识 */
+    public static  final String FS_BASEINFO_KEY = "fs_baseinfo";
 
     /** 岗位申请单内码 */
     public static final String NCKD_BILLID = "nckd_billid";
@@ -67,8 +75,6 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_SEQUENCE = "nckd_sequence";
     /** 行政组织 */
     public static final String NCKD_ADMINORG = "nckd_adminorg";
-    /** 岗位 */
-    public static final String NCKD_POSITION = "nckd_position";
     /** 岗位ID */
     public static final String NCKD_POSITIONID_KEY = "nckd_positionid";
     /** 上级岗位 */
@@ -79,10 +85,8 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_ORG_KEY = "nckd_org";
     /** 生效日期 */
     public static final String NCKD_BSED = "nckd_bsed";
-    /** 行政组织业务ID */
+    /** 行政组织业务ID(仅验权使用) */
     public static final String NCKD_ADMINORGBOID_KEY = "nckd_adminorgboid";
-    /** 岗位业务ID */
-    public static final String NCKD_POSITIONBOID_KEY = "nckd_positionboid";
     /** 单据体-新增岗位 */
     public static final String NCKD_ENTRYENTITY_ADD_KEY = "nckd_entryentity_add";
     /** 单据体-变更信息 */
@@ -97,6 +101,8 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_DISORG_KEY = "nckd_disorg";
     /** 原上级岗位 */
     public static final String NCKD_ORIPARENT_KEY = "nckd_oriparent";
+    /** 所有分录数据单据体标识 */
+    public static final String NCKD_ENTRYENTITY_ALL_KEY = "nckd_entryentity_all";
 
     /** 岗位生效时间页面自定义参数 */
     public static final String CP_POSITION_BSED = "position_bsed";
@@ -112,6 +118,14 @@ public class PositionBillConstant extends FormConstant {
     public static final String CP_SEQUENCE = "sequence";
     /** 岗位ID页面自定义参数 */
     public static final String CP_POSITIONID = "positionId";
+    /** 来自列表页面自定义参数 */
+    public static final String CP_FROMLIST = "fromList";
+    /** 业务单元页面自定义参数 */
+    public static final String CP_BUSINESSUNIT = "businessUnit";
+    /** 是否来自单据列表点击页面自定义参数 */
+    public static final String CP_ISFROMBILLCLICK = "isFromBillClick";
+
+
 
     /** 新增岗位上级变更页面缓存参数 */
     public static final String PC_ADDPOSITIONPARENTCHANGE = "addPositionParentChange";
@@ -145,6 +159,22 @@ public class PositionBillConstant extends FormConstant {
     public static final String PC_ISCHANGEPOSITION = "isChangePosition";
     /** 是否关闭完成页面缓存参数 */
     public static final String PC_ISCANCELOVER = "isCancelOver";
+    /** 是否列表页面缓存参数 */
+    public static final String PC_ISLIST = "isList";
+    /** 是否来自导入页面缓存参数 */
+    public static final String PC_ISFROMIMPORT = "isFromImport";
+    /** 是否来自应用首页页面缓存参数 */
+    public static final String PC_ISFROMHOMEPAGE = "isFromHomePage";
+    /** 导入开始/结束页面缓存参数 */
+    public static final String PC_CACHE_KEY_IMPORT_START_CLOSE = "CACHE_KEY_IMPORT_START_CLOSE";
+    /** 导入数据标识页面缓存参数 */
+    public static final String PC_CACHE_KEY_IMPORT_DATA_FLAG = "CACHE_KEY_IMPORT_DATA_FLAG";
+    /** 组织体系管理组织页面缓存参数 */
+    public static final String PC_ORGCACHE = "orgCache";
+    /** 是否来自单据点击页面缓存参数 */
+    public static final String PC_ISFROMBILLCLICK = "isFromBillClick";
+    /** 业务单元页面缓存参数 */
+    public static final String PC_BUSINESSUNIT = "businessUnit";
 
     /** 变更组织体系管理组织回调标识 */
     public static final String CB_CHG_ORG = "chg_org";
@@ -163,5 +193,13 @@ public class PositionBillConstant extends FormConstant {
     public static final String OP_VALIDATOR_BILL_POSITION_ALL_CHANGE_POSITION_KEY = "OP_VALIDATOR_BILL_POSITION_ALL_CHANGE_POSITION_KEY";
     /** 岗位申请单所有岗位编码OP参数 */
     public static final String OP_VALIDATOR_BILL_POSITION_NEW_POSITION_NUMBERS_KEY = "OP_VALIDATOR_BILL_POSITION_NEW_POSITION_NUMBERS_KEY";
+    /** 操作标识OP参数 */
+    public static final String OP_OPERATE_KEY = "OP_OPERATE_KEY";
+    /** 删除行数据OP参数 */
+    public static final String OP_ROW_INDEX = "OP_ROW_INDEX";
+    /** 返回数据OP参数 */
+    public static final String OP_RETURNDATA = "returnData";
+    /** 后置确认回调OP参数 */
+    public static final String OP_AFTERCONFIRM = "afterconfirm";
 
 }

+ 16 - 4
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionChangeTypeEnum.java

@@ -25,26 +25,38 @@ public enum PositionChangeTypeEnum {
 
     public static String getNumberByTag(String tag) {
         if (tag == null) {
-            return null;
+            return "";
         }
         for (PositionChangeTypeEnum value : values()) {
             if (HRStringUtils.equals(value.getTag(), tag)) {
                 return value.getNumber();
             }
         }
-        return null;
+        return "";
+    }
+
+    public static String getTagByNumber(String number) {
+        if (number == null) {
+            return "";
+        }
+        for (PositionChangeTypeEnum value : values()) {
+            if (HRStringUtils.equals(value.getNumber(), number)) {
+                return value.getTag();
+            }
+        }
+        return "";
     }
 
     public static String getTipByTag(String tag) {
         if (tag == null) {
-            return null;
+            return "";
         }
         for (PositionChangeTypeEnum value : values()) {
             if (HRStringUtils.equals(value.getTag(), tag)) {
                 return value.getTip();
             }
         }
-        return null;
+        return "";
     }
 
     public String getNumber() {

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

@@ -81,7 +81,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
 
         getPageCache().put(PositionBillConstant.PC_PARAMSCHANGESETNUMBER, Boolean.TRUE.toString());
         // 新增的时候生成岗位ID
-        String positionIdKey = String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY);
+        String positionIdKey = String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY);
         long positionId = getModel().getDataEntity().getLong(positionIdKey);
         if (positionId == 0L) {
             positionId = ORM.create().genLongId(PositionBillConstant.HBPM_POSITIONHR);
@@ -242,7 +242,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
             if (value != null) {
                 if (propertyType.equals(DynamicObject.class) && dynamicProperty instanceof BasedataProp) {
                     // 岗位特殊处理
-                    Object id = PositionBillConstant.NCKD_POSITION.equals(key) ? value : ((Map) value).get(PositionBillConstant.ID_KEY);
+                    Object id = PositionBillConstant.NCKD_POSITION_KEY.equals(key) ? value : ((Map) value).get(PositionBillConstant.ID_KEY);
                     if (id != null && !HRStringUtils.equals(value.toString(), "0")) {
                         getModel().setValue(key, id);
                     }
@@ -252,10 +252,10 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
                     HRBaseServiceHelper serviceHelper = new HRBaseServiceHelper(property.getBaseEntityId());
                     ((List) value).forEach((map) -> {
                         DynamicObject dy = new DynamicObject(property.getDynamicCollectionItemPropertyType());
-                        dy.set("fbasedataid_id", ((Map) map).get("fbasedataid_id"));
+                        dy.set(PositionBillConstant.FBASEDATAID_ID_KEY, ((Map) map).get(PositionBillConstant.FBASEDATAID_ID_KEY));
                         DynamicObject emptyDynamicObject = serviceHelper.generateEmptyDynamicObject();
-                        emptyDynamicObject.set(PositionBillConstant.ID_KEY, ((Map) map).get("fbasedataid_id"));
-                        dy.set("fbasedataid", emptyDynamicObject);
+                        emptyDynamicObject.set(PositionBillConstant.ID_KEY, ((Map) map).get(PositionBillConstant.FBASEDATAID_ID_KEY));
+                        dy.set(PositionBillConstant.BASEDATAID_KEY, emptyDynamicObject);
                         dynamicObjectCollection.add(dy);
                     });
                     getModel().setValue(key, !dynamicObjectCollection.isEmpty() ? dynamicObjectCollection : null);
@@ -275,7 +275,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
             case PositionBillConstant.NCKD_ESTDATE:
                 setEstablishmentDateToBsed((Date)changedArgs.getChangeSet()[0].getNewValue());
                 break;
-            case PositionBillConstant.NCKD_POSITION:
+            case PositionBillConstant.NCKD_POSITION_KEY:
                 break;
             case PositionBillConstant.NCKD_ORG_KEY:
                 PosBillEntryFastChgHelper.orgPropertyChanged(changedArgs, getView(), this);
@@ -360,7 +360,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
             }
             Map<String, String> map = new HashMap<>();
             DynamicObject dataEntity = getModel().getDataEntity();
-            map.put(PositionBillConstant.CP_POSITIONID, dataEntity.getString(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY)));
+            map.put(PositionBillConstant.CP_POSITIONID, dataEntity.getString(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY)));
             map.put(PositionBillConstant.NAME_KEY, dataEntity.getString(PositionBillConstant.NAME_KEY));
             map.put(PositionBillConstant.ID_KEY, dataEntity.getString(PositionBillConstant.ID_KEY));
             getView().getPageCache().put(PositionBillConstant.PC_SAVERESULT, Boolean.TRUE.toString());
@@ -370,7 +370,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
 
     private void propertyChangedGetNumber(String fieldKey, Object oldValue) {
         switch (fieldKey) {
-            case PositionBillConstant.NCKD_POSITION:
+            case PositionBillConstant.NCKD_POSITION_KEY:
                 String codeRuleNumber = getView().getPageCache().get(PositionBillConstant.PC_CODERULENUMBER);
                 if (!StringUtils.isEmpty(codeRuleNumber)) {
                     DynamicObject org = getModel().getDataEntity().getDynamicObject(PositionBillConstant.NCKD_ORG_KEY);

+ 30 - 25
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryUpdatePlugin.java

@@ -32,9 +32,9 @@ import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
+import kd.bos.orm.util.CollectionUtils;
 import kd.bos.permission.api.HasPermOrgResult;
 import kd.bos.servicehelper.permission.PermissionServiceHelper;
-import kd.hr.haos.business.domain.common.service.impl.BaseDataHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.model.AuthorizedOrgResult;
 import kd.hr.hbp.common.util.HRDateTimeUtils;
@@ -109,7 +109,7 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
 
     public void registerListener(EventObject e) {
         super.registerListener(e);
-        BasedataEdit position = getView().getControl(PositionBillConstant.NCKD_POSITION);
+        BasedataEdit position = getView().getControl(PositionBillConstant.NCKD_POSITION_KEY);
         position.addBeforeF7SelectListener(this);
 
         for(String registerBeforeF7Listener : getRegisterBeforeF7ListenerControlList()) {
@@ -130,7 +130,7 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
     @Override
     public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
         String fieldKey = beforeF7SelectEvent.getProperty().getName();
-        if (PositionBillConstant.NCKD_POSITION.equals(fieldKey)) {
+        if (PositionBillConstant.NCKD_POSITION_KEY.equals(fieldKey)) {
             AuthorizedOrgResult authorizedOrgResult = PositionBillServiceHelper.getOrgAuth(getView());
             if (!authorizedOrgResult.isHasAllOrgPerm()) {
                 List<Long> hasPermOrgList = authorizedOrgResult.getHasPermOrgs();
@@ -139,8 +139,12 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
             PositionBillServiceHelper.filterF7Org(getView().getParentView(), beforeF7SelectEvent, null);
 
             if (getModel().getValue(PositionBillConstant.NCKD_ORG_KEY) != null) {
-                QFilter baseDataFilter = BaseDataHelper.getAdminOrgBaseDataFilter(PositionBillConstant.HBPM_POSITIONHR, Collections.singletonList(((DynamicObject) getModel().getValue(PositionBillConstant.NCKD_ORG_KEY)).getLong(PositionBillConstant.ID_KEY)));
-                beforeF7SelectEvent.getCustomQFilters().add(baseDataFilter);
+                List<Long> orgIdList = Collections.singletonList(((DynamicObject) getModel().getValue(PositionBillConstant.NCKD_ORG_KEY)).getLong(PositionBillConstant.ID_KEY));
+                if (CollectionUtils.isEmpty(orgIdList)) {
+                    beforeF7SelectEvent.getCustomQFilters().add(new QFilter("1", QCP.not_equals, 1));
+                } else {
+                    beforeF7SelectEvent.getCustomQFilters().add(new QFilter(PositionBillConstant.ORG_KEY, QCP.in, orgIdList));
+                }
             }
 
             beforeF7SelectEvent.getFormShowParameter().setCustomParam(PositionBillConstant.CP_SEARCHDATE, new Date());
@@ -171,7 +175,7 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
     public void propertyChanged(PropertyChangedArgs changedArgs) {
         String fieldKey = changedArgs.getProperty().getName();
         switch (fieldKey) {
-            case PositionBillConstant.NCKD_POSITION:
+            case PositionBillConstant.NCKD_POSITION_KEY:
                 positionChanged(changedArgs);
                 break;
             case PositionBillConstant.NCKD_ORG_KEY:
@@ -193,7 +197,7 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
             Long positionIdOld = position != null ? position.getLong(PositionBillConstant.ID_KEY) : null;
             Long positionIdNew = newPosition != null ? newPosition.getLong(PositionBillConstant.ID_KEY) : null;
             if (newPosition != null) {
-                ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener(PositionBillConstant.NCKD_POSITION, this);
+                ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener(PositionBillConstant.NCKD_POSITION_KEY, this);
                 getView().showConfirm("切换岗位后,当前已修改的内容将会丢失,是否继续?", "", MessageBoxOptions.OKCancel, ConfirmTypes.Default, confirmCallBackListener, null, positionIdOld + "#" + positionIdNew);
             }
         }
@@ -206,13 +210,13 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
         int result = event.getResult().getValue();
         getView().getFormShowParameter();
         switch (event.getCallBackId()) {
-            case PositionBillConstant.NCKD_POSITION:
+            case PositionBillConstant.NCKD_POSITION_KEY:
                 if (result == MessageBoxResult.Yes.getValue()) {
                     String positionIdNew = event.getCustomVaule().split("#")[1];
                     setInfoFromDb(Long.parseLong(positionIdNew), true);
                 } else {
                     String positionIdOld = event.getCustomVaule().split("#")[0];
-                    getModel().setValue(PositionBillConstant.NCKD_POSITION, "null".equals(positionIdOld) ? null : positionIdOld);
+                    getModel().setValue(PositionBillConstant.NCKD_POSITION_KEY, "null".equals(positionIdOld) ? null : positionIdOld);
                 }
             case PositionBillConstant.CB_CHG_ORG:
                 if (event.getResult().getValue() == MessageBoxResult.Yes.getValue()) {
@@ -271,9 +275,9 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
             DynamicObject positionMasterInfo = PositionBillServiceHelper.getPositionDyById(positionId);
             if (!positionChange && entryIdExists) {
             } else {
-                long positionBoId = positionMasterInfo.getLong(PositionBillConstant.BOID_KEY);
-                getModel().setValue(PositionBillConstant.NCKD_POSITIONBOID_KEY, positionBoId);
-                getModel().setValue(PositionBillConstant.NCKD_POSITION, positionId);
+                long orgBoId = positionMasterInfo.getDynamicObject(PositionBillConstant.ADMINORG).getLong(PositionBillConstant.BOID_KEY);
+                getModel().setValue(PositionBillConstant.NCKD_ADMINORGBOID_KEY, orgBoId);
+                getModel().setValue(PositionBillConstant.NCKD_POSITION_KEY, positionId);
                 getModel().setValue(PositionBillConstant.NCKD_POSITIONID_KEY, positionId);
                 if (lineSuffix.endsWith("_"+PositionBillConstant.CHANGE_TAG)) {
                     getModel().setValue(PositionBillConstant.NCKD_PARENT, null);
@@ -317,10 +321,11 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
                 // 处理分录数据
                 DataEntityPropertyCollection positionProperties = positionMasterInfo.getDataEntityType().getProperties();
                 Map<String, IDataEntityProperty> dataEntryPropMap = positionProperties.stream().filter(property -> entryPropMap.containsKey(property.getName())).collect(Collectors.toMap(property -> entryPropMap.get(property.getName()).getName(), Function.identity()));
-                AbstractFormDataModel model = (AbstractFormDataModel) getModel();
-                model.beginInit();
 
                 for (Map.Entry<String, IDataEntityProperty> dataEntryProp : dataEntryPropMap.entrySet()) {
+                    AbstractFormDataModel model = (AbstractFormDataModel) getModel();
+                    model.beginInit();
+
                     DynamicObjectCollection fromCollection = positionMasterInfo.getDynamicObjectCollection(dataEntryProp.getValue());
                     DynamicObjectCollection toCollection = getModel().getDataEntity().getDynamicObjectCollection(dataEntryProp.getKey());
                     if (fromCollection == null || fromCollection.isEmpty()) {
@@ -330,13 +335,13 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
                     for (DynamicObject fromObj : fromCollection) {
                         HRDynamicObjectUtils.copy(fromObj, toCollection.addNew());
                     }
+
+                    model.endInit();
+                    getView().updateView(dataEntryProp.getKey());
                 }
 
-                model.endInit();
-                dataEntryPropMap.forEach((key, value) -> getView().updateView(key));
                 getModel().setDataChanged(false);
-
-                // 生效日期单独处理
+                // 生效日期特殊处理
                 getModel().setValue(PositionBillConstant.NCKD_BSED, new Date(positionBsedTime));
                 // 原上级岗位特殊处理
                 getModel().setValue(PositionBillConstant.NCKD_ORIPARENT_KEY, getModel().getValue(PositionBillConstant.NCKD_PARENT));
@@ -361,20 +366,20 @@ public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements Befo
                     LOG.info("set MulBasedataProp value [{}]", value);
                     ((List) value).forEach((map) -> {
                         DynamicObject dy = new DynamicObject(property.getDynamicCollectionItemPropertyType());
-                        if (((Map) map).get("fbasedataid_id") != null) {
-                            dy.set("fbasedataid_id", ((Map) map).get("fbasedataid_id"));
+                        if (((Map) map).get(PositionBillConstant.FBASEDATAID_ID_KEY) != null) {
+                            dy.set(PositionBillConstant.FBASEDATAID_ID_KEY, ((Map) map).get(PositionBillConstant.FBASEDATAID_ID_KEY));
                             DynamicObject emptyDynamicObject = serviceHelper.generateEmptyDynamicObject();
-                            emptyDynamicObject.set(PositionBillConstant.ID_KEY, ((Map) map).get("fbasedataid_id"));
-                            dy.set("fbasedataid", emptyDynamicObject);
+                            emptyDynamicObject.set(PositionBillConstant.ID_KEY, ((Map) map).get(PositionBillConstant.FBASEDATAID_ID_KEY));
+                            dy.set(PositionBillConstant.BASEDATAID_KEY, emptyDynamicObject);
                             dynamicObjectCollection.add(dy);
                         } else {
-                            Object fbasedataid = ((Map) map).get("fbasedataid");
+                            Object fbasedataid = ((Map) map).get(PositionBillConstant.BASEDATAID_KEY);
                             if (fbasedataid instanceof Map && ((Map) fbasedataid).get(PositionBillConstant.ID_KEY) instanceof Long) {
                                 Long id = (Long) ((Map) fbasedataid).get(PositionBillConstant.ID_KEY);
-                                dy.set("fbasedataid_id", id);
+                                dy.set(PositionBillConstant.FBASEDATAID_ID_KEY, id);
                                 DynamicObject emptyDynamicObject = serviceHelper.generateEmptyDynamicObject();
                                 emptyDynamicObject.set(PositionBillConstant.ID_KEY, id);
-                                dy.set("fbasedataid", emptyDynamicObject);
+                                dy.set(PositionBillConstant.BASEDATAID_KEY, emptyDynamicObject);
                                 dynamicObjectCollection.add(dy);
                             }
                         }

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

@@ -83,7 +83,7 @@ public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements C
 
         BasedataEdit adminorg = getView().getControl(PositionBillConstant.NCKD_ADMINORG);
         adminorg.addBeforeF7SelectListener(this);
-        BasedataEdit position = getView().getControl(PositionBillConstant.NCKD_POSITION);
+        BasedataEdit position = getView().getControl(PositionBillConstant.NCKD_POSITION_KEY);
         position.addBeforeF7SelectListener(this);
         BasedataEdit parent = getView().getControl(PositionBillConstant.NCKD_PARENT);
         parent.addBeforeF7SelectListener(this);
@@ -107,7 +107,7 @@ public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements C
                     beforeF7SelectEvent.getFormShowParameter().setFormId(PositionBillConstant.HAOS_ORGTREELISTF7_ENTITY);
                     beforeF7SelectEvent.getFormShowParameter().setCaption("行政组织");
                     break;
-                case PositionBillConstant.NCKD_POSITION:
+                case PositionBillConstant.NCKD_POSITION_KEY:
                     // 替换岗位F7模板
                     beforeF7SelectEvent.getFormShowParameter().setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
                     beforeF7SelectEvent.getFormShowParameter().setCaption("岗位");

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

@@ -1,12 +1,16 @@
 package nckd.jxccl.hrmp.hbpm.plugin.form.hr;
 
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import kd.bos.bill.BillOperationStatus;
 import kd.bos.bill.BillShowParameter;
 import kd.bos.bill.OperationStatus;
 import kd.bos.context.RequestContext;
+import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.entity.LocaleString;
 import kd.bos.dataentity.metadata.IDataEntityProperty;
 import kd.bos.dataentity.metadata.IDataEntityType;
 import kd.bos.dataentity.serialization.SerializationUtils;
@@ -17,6 +21,8 @@ import kd.bos.entity.datamodel.IDataModel;
 import kd.bos.entity.datamodel.ListSelectedRow;
 import kd.bos.entity.datamodel.ListSelectedRowCollection;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.operate.OperateOptionConst;
+import kd.bos.entity.operate.result.IOperateInfo;
 import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.entity.property.BasedataProp;
 import kd.bos.ext.hr.entity.property.PositionFieldProp;
@@ -31,14 +37,18 @@ import kd.bos.form.control.EntryGrid;
 import kd.bos.form.control.events.EntryGridBindDataListener;
 import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeClosedEvent;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
 import kd.bos.form.events.ClosedCallBackEvent;
+import kd.bos.form.events.LoadCustomControlMetasArgs;
 import kd.bos.form.events.MessageBoxClosedEvent;
 import kd.bos.form.field.BasedataEdit;
 import kd.bos.form.field.events.BeforeBasedataSetValueEvent;
 import kd.bos.form.field.events.BeforeBasedataSetValueListener;
 import kd.bos.form.field.events.BeforeF7SelectEvent;
 import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.operate.AbstractOperate;
 import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.lang.Lang;
 import kd.bos.list.ListShowParameter;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
@@ -48,6 +58,9 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.orm.util.CollectionUtils;
 import kd.bos.permission.api.HasPermOrgResult;
 import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
+import kd.bos.servicehelper.coderule.CodeRuleServiceHelper;
+import kd.bos.servicehelper.model.PermissionStatus;
+import kd.bos.servicehelper.org.OrgViewType;
 import kd.bos.servicehelper.permission.PermissionServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.model.AuthorizedOrgResult;
@@ -58,6 +71,7 @@ import kd.hr.hbp.common.util.HRStringUtils;
 import kd.hr.hbp.common.util.concurrent.NullableConcurrentHashMap;
 import kd.sdk.hr.hdm.common.enums.reg.RegBillStatusEnum;
 import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillAfterBindDataService;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillBeforeBindDataService;
 import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillClosedCallBackService;
 import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillConfirmCallBackService;
 import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillPropertyChangedService;
@@ -78,6 +92,7 @@ import java.util.Objects;
 
 /**
  * 岗位申请单表单插件
+ * @entity: nckd_positionbill
  * @from: kd.hr.homs.formplugin.web.orgbatch.AdminOrgBatchBillPlugin
  * @author: jtd
  * @date: 2025-10-25 13:38
@@ -86,6 +101,78 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
     private static final Log LOG = LogFactory.getLog(PositionBillFormPlugin.class);
     private final Map<String, Map<?, DynamicObject>> baseDataCacheMap = new NullableConcurrentHashMap(3);
 
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        DynamicObject org = getModel().getDataEntity().getDynamicObject(PositionBillConstant.ORG_KEY);
+        if (org == null) {
+            // 获取是否有查询权限
+            HasPermOrgResult hrPermOrg = PermissionServiceHelper.getAllPermOrgs(RequestContext.get().getCurrUserId(), OrgViewType.HR_OD, getView().getFormShowParameter().getCheckRightAppId(), PositionBillConstant.HAOS_ADMINORGDETAIL_ENTITY, PermissionStatus.View, true);
+            List<Long> hasPermOrgs = hrPermOrg.getHasPermOrgs();
+            if (!Objects.isNull(hasPermOrgs) && hasPermOrgs.size() != 0) {
+                if (hasPermOrgs.contains(RequestContext.get().getOrgId())) {
+                    getModel().setValue(PositionBillConstant.ORG_KEY, RequestContext.get().getOrgId());
+                } else {
+                    getModel().setValue(PositionBillConstant.ORG_KEY, hasPermOrgs.get(0));
+                }
+            } else {
+                LOG.error("PositionBillFormPlugin can not get any org");
+            }
+        }
+
+        org = getModel().getDataEntity().getDynamicObject(PositionBillConstant.ORG_KEY);
+        if (org == null) {
+            setBillNo(e);
+        } else {
+            long orgid = org.getLong(PositionBillConstant.ID_KEY);
+            boolean cudeRule = CodeRuleServiceHelper.isExist(PositionBillConstant.NCKD_POSITIONBILL_ENTITY, getModel().getDataEntity(), String.valueOf(orgid));
+            if (!cudeRule) {
+                setBillNo(e);
+            }
+        }
+
+    }
+
+    private void setBillNo(EventObject e) {
+        Map map = new HashMap();
+        Map item = new HashMap();
+        Map emptyTip = new HashMap();
+        map.put("item", item);
+        item.put("emptytip", emptyTip);
+        Lang lang = Lang.get();
+        emptyTip.put(lang.getLocale(), "");
+        getView().updateControlMetadata(PositionBillConstant.BILL_NO_KEY, map);
+        getModel().setValue(PositionBillConstant.BILL_NO_KEY, "");
+        getView().setEnable(Boolean.TRUE, PositionBillConstant.BILL_NO_KEY);
+        super.afterCreateNewData(e);
+    }
+
+    @Override
+    public void loadCustomControlMetas(LoadCustomControlMetasArgs e) {
+        super.loadCustomControlMetas(e);
+        BillShowParameter billShowParameter = (BillShowParameter) e.getSource();
+        LocaleString caption = billShowParameter.getFormConfig().getCaption();
+        if (billShowParameter.getPkId() == null) {
+            caption.setLocaleValue("岗位调整申请");
+        } else {
+            HRBaseServiceHelper hrBaseServiceHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILL_ENTITY);
+            DynamicObject billObject = hrBaseServiceHelper.queryOne(String.join(",", PositionBillConstant.ID_KEY, PositionBillConstant.BILL_NO_KEY), billShowParameter.getPkId());
+            if (billObject != null) {
+                caption.setLocaleValue(String.format(Locale.ROOT, "岗位调整申请-%s", billObject.getString("billno")));
+            }
+        }
+
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+
+        long startTime = System.currentTimeMillis();
+        PositionBillBeforeBindDataService beforeBindDataService = new PositionBillBeforeBindDataService(getView());
+        beforeBindDataService.beforeBindData(e);
+        LOG.info(String.format(Locale.ROOT, "PositionBillFormPlugin beforeBindData() time cost is: %s", System.currentTimeMillis() - startTime));
+    }
+
     @Override
     public void afterBindData(EventObject e) {
         super.afterBindData(e);
@@ -128,44 +215,6 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
         propertyChangedService.propertyChanged(e);
     }
 
-    @Override
-    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
-        super.afterDoOperation(afterDoOperationEventArgs);
-
-        OperationStatus status = getView().getFormShowParameter().getStatus();
-        if (HRStringUtils.equals(getView().getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
-            ((BillView) getView()).setBillStatus(BillOperationStatus.EDIT);
-            getView().getFormShowParameter().setStatus(OperationStatus.EDIT);
-            ((BillShowParameter) getView().getFormShowParameter()).setBillStatus(BillOperationStatus.EDIT);
-            String billStatus = ((BillEntityType) getModel().getDataEntityType()).getBillStatus();
-            getModel().setValue(billStatus, "A");
-            getModel().setDataChanged(Boolean.FALSE);
-        }
-
-        OperationResult afterOperationResult = afterDoOperationEventArgs.getOperationResult();
-        if (!(afterOperationResult == null || afterOperationResult.isSuccess())) {
-            return;
-        }
-
-        String opKey = afterDoOperationEventArgs.getOperateKey();
-        switch (opKey) {
-            case PositionBillConstant.NEWENTRY_ADD_OP:
-                PositionBillServiceHelper.openViewForm(getView(), PositionBillConstant.ADD_TAG, getPluginName(), null);
-                break;
-            case PositionBillConstant.EDIT_ADD_OP:
-                openEditAddPage(status, getModel(), getView());
-                break;
-            case PositionBillConstant.EDIT_CHANGE_OP:
-                PositionBillServiceHelper.entryEntityMore(getModel(), getView(), PositionBillConstant.CHANGE_TAG, status, getPluginName());
-                break;
-            case PositionBillConstant.DELETE_ROWS_ADD_OP:
-            case PositionBillConstant.DELETE_ROWS_CHANGE_OP:
-                deleteRowsConfirm(opKey);
-                break;
-
-        }
-    }
-
     public void confirmCallBack(MessageBoxClosedEvent event) {
         super.confirmCallBack(event);
 
@@ -219,14 +268,161 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
         }
     }
 
+    private boolean executeSaveOperation(String operateKey, OperateOption operateOption) {
+        OperateOption option = OperateOption.create();
+        if (operateOption != null) {
+            option.mergeValue(operateOption);
+        }
+
+        option.setVariableValue(OperateOptionConst.MUTEX_IGNORE_VALIDATION, Boolean.TRUE.toString());
+        option.setVariableValue(PositionBillConstant.OP_OPERATE_KEY, operateKey);
+        option.setVariableValue(OperateOptionConst.ISSHOWMESSAGE, Boolean.FALSE.toString());
+        OperationResult saveOperationResult = getView().invokeOperation(PositionBillConstant.SAVE_NO_LOG_OP, option);
+        if (!saveOperationResult.isSuccess()) {
+            getView().showOperationResult(saveOperationResult);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        AbstractOperate operate = (AbstractOperate) args.getSource();
+        String operateKey = operate.getOperateKey();
+        OperateOption option = operate.getOption();
+        if (getAllEntrySize() == 0) {
+            option.setVariableValue(OperateOptionConst.ISHASRIGHT, Boolean.TRUE.toString());
+            option.setVariableValue(OperateOptionConst.SKIPCHECKPERMISSION, Boolean.TRUE.toString());
+        }
+
+        if (HRStringUtils.equals("import_multientry_hr", operate.getOperateKey())) {
+            if (getModel().getValue(PositionBillConstant.ORG_KEY) == null) {
+                getView().showTipNotification("请先填写组织体系管理组织。");
+                args.setCancel(Boolean.TRUE);
+                return;
+            }
+
+            DynamicObject dataEntity = getModel().getDataEntity(Boolean.TRUE);
+            long billId = dataEntity.getLong(PositionBillConstant.ID_KEY);
+            HRBaseServiceHelper serviceHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILL_ENTITY);
+            DynamicObject[] dynamicObjects = serviceHelper.query(PositionBillConstant.BILL_STATUS_KEY, new QFilter[]{new QFilter(PositionBillConstant.ID_KEY, QCP.equals, billId)});
+            if (dynamicObjects.length > 0 && !Sets.newHashSet(new String[]{RegBillStatusEnum.TEMPSTORAGE.getCode(), RegBillStatusEnum.WAITRESUBMIT.getCode()}).contains(dynamicObjects[0].getString(PositionBillConstant.BILL_STATUS_KEY))) {
+                String auditStatus = dynamicObjects[0].getString(PositionBillConstant.BILL_STATUS_KEY);
+                getView().showTipNotification(String.format(Locale.ROOT, "%s的单据不能导入。", RegBillStatusEnum.getName(auditStatus)));
+                args.setCancel(Boolean.TRUE);
+            }
+        }
+
+        if (HRStringUtils.equalsAny(operateKey, PositionBillConstant.SAVE_OP, PositionBillConstant.SUBMIT_OP, PositionBillConstant.SUBMITEFFECT_OP)) {
+            if (HRStringUtils.equals(operateKey, PositionBillConstant.SUBMIT_OP) || HRStringUtils.equals(operateKey, PositionBillConstant.SUBMITEFFECT_OP)) {
+                if (!executeSaveOperation(operateKey, operate.getOption())) {
+                    args.setCancel(true);
+                } else {
+                    option.setVariableValue(OperateOptionConst.MUTEX_IGNORE_VALIDATION, Boolean.TRUE.toString());
+                }
+            }
+        }
+
+        if (PositionBillConstant.DELETE_ROWS_ADD_OP.equals(operateKey)) {
+            EntryGrid entryGrid = getView().getControl(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY);
+            int[] selectRows = entryGrid.getSelectRows();
+            operate.getOption().setVariableValue(PositionBillConstant.OP_ROW_INDEX, JSONObject.toJSONString(selectRows));
+        }
+
+        if (HRStringUtils.equals(getView().getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
+            option.setVariableValue(OperateOptionConst.ISHASRIGHT, Boolean.TRUE.toString());
+            option.setVariableValue(OperateOptionConst.SKIPCHECKPERMISSION, Boolean.TRUE.toString());
+        }
+
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs eventArgs) {
+        super.afterDoOperation(eventArgs);
+
+        OperationStatus status = getView().getFormShowParameter().getStatus();
+        if (HRStringUtils.equals(getView().getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
+            ((BillView) getView()).setBillStatus(BillOperationStatus.EDIT);
+            getView().getFormShowParameter().setStatus(OperationStatus.EDIT);
+            ((BillShowParameter) getView().getFormShowParameter()).setBillStatus(BillOperationStatus.EDIT);
+            String billStatus = ((BillEntityType) getModel().getDataEntityType()).getBillStatus();
+            getModel().setValue(billStatus, RegBillStatusEnum.TEMPSTORAGE.getCode());
+            getModel().setDataChanged(Boolean.FALSE);
+        }
+
+        String opKey = eventArgs.getOperateKey();
+        if (!PositionBillConstant.VIEWFLOWCHART_OP.equals(opKey)) {
+            OperationResult afterOperationResult = eventArgs.getOperationResult();
+            if (afterOperationResult != null && !afterOperationResult.isSuccess()) {
+                if (PositionBillConstant.SUBMIT_OP.equals(opKey)) {
+                    afterSubmitError(afterOperationResult);
+                }
+
+            } else {
+                switch (opKey) {
+                    case PositionBillConstant.NEWENTRY_ADD_OP:
+                        PositionBillServiceHelper.openViewForm(getView(), PositionBillConstant.ADD_TAG, getPluginName(), null);
+                        break;
+                    case PositionBillConstant.EDIT_ADD_OP:
+                        openEditAddPage(status, getModel(), getView());
+                        break;
+                    case PositionBillConstant.EDIT_CHANGE_OP:
+                        PositionBillServiceHelper.entryEntityMore(getModel(), getView(), PositionBillConstant.CHANGE_TAG, status, getPluginName());
+                        break;
+                    case PositionBillConstant.DELETE_ROWS_ADD_OP:
+                    case PositionBillConstant.DELETE_ROWS_CHANGE_OP:
+                        deleteRowsConfirm(opKey);
+                        break;
+                    case PositionBillConstant.SUBMIT_OP:
+                        afterSubmit();
+                }
+            }
+
+        }
+    }
+
+    private void afterSubmitError(OperationResult operationResult) {
+        boolean needWfAssignPersons = operationResult.isNeedWfAssignPersons();
+        List<IOperateInfo> allErrorOrValidateInfo = operationResult.getAllErrorOrValidateInfo();
+        String errorMsg;
+        if (allErrorOrValidateInfo.isEmpty()) {
+            errorMsg = operationResult.getMessage();
+        } else {
+            errorMsg = operationResult.getAllErrorOrValidateInfo().get(0).getMessage();
+        }
+
+        if (errorMsg != null && !errorMsg.isEmpty() || !needWfAssignPersons) {
+            String exist = "已存在";
+            if (errorMsg != null && !errorMsg.contains(exist)) {
+                getView().showErrorNotification(errorMsg);
+            }
+
+        }
+    }
+
+    private void afterSubmit() {
+        LOG.info("afterDoSubmit:" + getModel().getDataEntity().get(PositionBillConstant.BILL_NO_KEY));
+        LOG.info("afterDoSubmit getEntityId refresh:" + getView().getFormShowParameter().getAppId());
+        if (HRStringUtils.equals(getView().getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
+            LOG.info("afterDoSubmit refresh:" + getModel().getDataEntity().get(PositionBillConstant.BILL_NO_KEY));
+            getView().getParentView().invokeOperation(PositionBillConstant.REFRESH_OP);
+            getView().invokeOperation(PositionBillConstant.CLOSE_OP);
+        } else {
+            getView().updateView();
+        }
+
+    }
+
     private void deleteRowsConfirm(String callBackId) {
         long id = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
-        HRBaseServiceHelper helper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
+        HRBaseServiceHelper helper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILL_ENTITY);
         QFilter idFilter = new QFilter(PositionBillConstant.ID_KEY, QCP.equals, id);
         DynamicObject dyn = helper.queryOne(String.join(",", PositionBillConstant.ID_KEY, PositionBillConstant.BILL_STATUS_KEY), new QFilter[]{idFilter});
         String billstatus;
         if (Objects.isNull(dyn)) {
-            billstatus = "A";
+            billstatus = RegBillStatusEnum.TEMPSTORAGE.getCode();
         } else {
             billstatus = dyn.getString(PositionBillConstant.BILL_STATUS_KEY);
         }
@@ -287,7 +483,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
     public void registerListener(EventObject e) {
         super.registerListener(e);
 
-        EntryGrid entryGrid = getControl(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, PositionBillConstant.CHANGE_TAG));
+        EntryGrid entryGrid = getControl(PositionBillConstant.NCKD_ENTRYENTITY_CHANGE_KEY);
         entryGrid.addDataBindListener(this);
 
         for(String registerBeforeF7Listener : getRegisterBeforeF7ListenerControlList()) {
@@ -301,7 +497,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
     }
 
     private List<String> getRegisterBeforeF7ListenerControlList() {
-        return Arrays.asList(PositionBillConstant.NCKD_DISORG_KEY, String.join("_", PositionBillConstant.ORG_KEY, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG));
+        return Arrays.asList(PositionBillConstant.NCKD_DISORG_KEY, String.join("_", PositionBillConstant.ORG_KEY, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG));
     }
 
     @Override
@@ -324,12 +520,12 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
             IDataEntityType parent = property.getParent();
             if (!checkOrgValue(beforeF7SelectEvent, property, parent)) {
                 ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
-                if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG))) {
+                if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.CHANGE_TAG))) {
                     showParameter.getCustomParams().put(PositionBillConstant.CP_SEARCHDATE, date);
                     PositionBillServiceHelper.filterF7Org(getView(), beforeF7SelectEvent, null);
                     setFilterByOrg(beforeF7SelectEvent);
                 } else if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG))) {
-                    DynamicObject position = focusEntryDyn.getDynamicObject(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG));
+                    DynamicObject position = focusEntryDyn.getDynamicObject(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.CHANGE_TAG));
                     PositionBillServiceHelper.setParentFilter(getView(), position, beforeF7SelectEvent);
                     beforeF7SelectEvent.getFormShowParameter().setCaption("上级岗位");
                     if (!HRObjectUtils.isEmpty(position)) {
@@ -399,7 +595,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
             }
 
             String fieldName = beforeF7SelectEvent.getProperty().getName();
-            if (PositionBillConstant.NCKD_DISORG_KEY.equals(fieldName) || HRStringUtils.equals(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG), fieldName)) {
+            if (PositionBillConstant.NCKD_DISORG_KEY.equals(fieldName) || HRStringUtils.equals(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.CHANGE_TAG), fieldName)) {
                 List<Long> hasPermOrgList = authorizedOrgResult.getHasPermOrgs();
                 beforeF7SelectEvent.getCustomQFilters().add(new QFilter(String.join(".", PositionBillConstant.ADMINORG, PositionBillConstant.BOID_KEY), QCP.in, hasPermOrgList));
             }
@@ -414,7 +610,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
             showParameter.setFormId(PositionBillConstant.HAOS_ORGBATCHTREELISTF7_ENTITY);
         }
 
-        if (HRStringUtils.equals(fieldKey, String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG)) || HRStringUtils.equals(fieldKey, String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG))) {
+        if (HRStringUtils.equalsAny(fieldKey, String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG))) {
             ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
             showParameter.setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
         }
@@ -424,4 +620,10 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
     private static String getSuffixByFieldKey(String fieldKey) {
         return fieldKey.substring(fieldKey.lastIndexOf("_") + 1);
     }
+
+    private int getAllEntrySize() {
+        DynamicObjectCollection addDyS = getModel().getEntryEntity(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY);
+        DynamicObjectCollection changeDyS = getModel().getEntryEntity(PositionBillConstant.NCKD_ENTRYENTITY_CHANGE_KEY);
+        return addDyS.size() + changeDyS.size();
+    }
 }

+ 70 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillListPlugin.java

@@ -0,0 +1,70 @@
+package nckd.jxccl.hrmp.hbpm.plugin.form.hr;
+
+import kd.bos.context.RequestContext;
+import kd.bos.form.events.FilterContainerSearchClickArgs;
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.events.BeforeShowBillFormEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.permission.api.HasPermOrgResult;
+import kd.bos.servicehelper.model.PermissionStatus;
+import kd.bos.servicehelper.org.OrgViewType;
+import kd.bos.servicehelper.permission.PermissionServiceHelper;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *  * 岗位申请单列表插件
+ * @entity: nckd_positionbill
+ * @from: kd.hr.homs.formplugin.web.orgbatch.AdminOrgBatchBillListPlugin
+ * @author: jtd
+ * @date: 2025/12/31 20:48
+ */
+public class PositionBillListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void setFilter(SetFilterEvent setFilterEvent) {
+        super.setFilter(setFilterEvent);
+        setFilterEvent.setOrderBy(String.format("%s desc, %s desc", PositionBillConstant.CREATE_TIME_KEY, PositionBillConstant.BILL_NO_KEY));
+    }
+
+    @Override
+    public void beforeShowBill(BeforeShowBillFormEvent e) {
+        super.beforeShowBill(e);
+        String orgId = getView().getPageCache().get(PositionBillConstant.PC_BUSINESSUNIT);
+        if (Objects.isNull(orgId)) {
+            if (getView().getPageCache().get(PositionBillConstant.PC_ISFROMBILLCLICK) != null) {
+                getView().getPageCache().remove(PositionBillConstant.PC_ISFROMBILLCLICK);
+                e.getParameter().setCustomParam(PositionBillConstant.PC_ISFROMBILLCLICK, Boolean.TRUE.toString());
+            } else {
+                HasPermOrgResult hrPermOrg = PermissionServiceHelper.getAllPermOrgs(RequestContext.get().getCurrUserId(), OrgViewType.HR_OD, getView().getFormShowParameter().getCheckRightAppId(), PositionBillConstant.HAOS_ADMINORGDETAIL_ENTITY, PermissionStatus.View, false);
+                List<Long> hasPermOrgs = hrPermOrg.getHasPermOrgs();
+                if (!Objects.isNull(hasPermOrgs) && hasPermOrgs.size() != 0) {
+                    if (hasPermOrgs.contains(RequestContext.get().getOrgId())) {
+                        e.getParameter().setCustomParam(PositionBillConstant.CP_BUSINESSUNIT, String.valueOf(RequestContext.get().getOrgId()));
+                    } else {
+                        e.getParameter().setCustomParam(PositionBillConstant.CP_BUSINESSUNIT, String.valueOf(hasPermOrgs.get(0)));
+                    }
+                }
+            }
+        } else {
+            e.getParameter().setCustomParam(PositionBillConstant.CP_BUSINESSUNIT, orgId);
+        }
+
+        e.getParameter().setCustomParam(PositionBillConstant.CP_FROMLIST, Boolean.TRUE.toString());
+    }
+
+    @Override
+    public void filterContainerAfterSearchClick(FilterContainerSearchClickArgs args) {
+        Object filterValue = args.getFilterValue(String.join(".", PositionBillConstant.ORG_KEY, PositionBillConstant.ID_KEY));
+        if (!Objects.isNull(filterValue) && filterValue instanceof Long) {
+            getView().getPageCache().put(PositionBillConstant.PC_BUSINESSUNIT, filterValue.toString());
+        } else {
+            getView().getPageCache().remove(PositionBillConstant.PC_BUSINESSUNIT);
+        }
+
+        super.filterContainerAfterSearchClick(args);
+    }
+
+}

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

@@ -9,6 +9,7 @@ import nckd.jxccl.hrmp.hbpm.plugin.operate.hr.validator.PositionAddSaveValidator
 /**
  * 岗位申请-岗位新设保存操作插件
  * @entity: nckd_posbillentryadd
+ * @from: kd.hr.homs.opplugin.web.orgbatch.AdminOrgBatchDetailAddSaveOp
  * @author: jtd
  * @date: 2025/12/18 09:57
  */

+ 26 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryChangeSaveOpPlugin.java

@@ -0,0 +1,26 @@
+package nckd.jxccl.hrmp.hbpm.plugin.operate.hr;
+
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+import nckd.jxccl.hrmp.hbpm.plugin.operate.hr.validator.PositionChangeSaveValidator;
+
+/**
+ * 岗位申请-岗位变更保存操作插件
+ * @entity: nckd_posbillentrychange
+ * @from: kd.hr.homs.opplugin.web.orgbatch.AdminOrgBatchDetailParentSaveOp
+ * @author: jtd
+ * @date: 2025/12/31 21:58
+ */
+public class PosBillEntryChangeSaveOpPlugin extends PositionBillEntrySaveOpPlugin {
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new PositionChangeSaveValidator());
+    }
+
+    @Override
+    protected String getOperationKey() {
+        return PositionBillConstant.CONFIRMCHANGE_OP;
+    }
+}

+ 2 - 1
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryNewPositionTempSaveOpPlugin.java

@@ -28,6 +28,7 @@ import java.util.Map;
 /**
  * 岗位申请-新增岗位保存操作插件
  * @entity: nckd_posbillentryadd
+ * @from: kd.hr.homs.opplugin.web.orgbatch.OrgBatchChgBillNewOrgTempSaveOp
  * @author: jtd
  * @date: 2025-11-08 15:30
  */
@@ -47,7 +48,7 @@ public class PosBillEntryNewPositionTempSaveOpPlugin extends AbstractOperationSe
         // 获取 行政组织业务ID
         List<Long> adminorgBoIds = Lists.newArrayListWithExpectedSize(positionEntities.length);
         // 岗位ID标识
-        String positionIdKey = String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY);
+        String positionIdKey = String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY);
         for (DynamicObject positionEntity : positionEntities) {
             positionBoIds.add(positionEntity.getLong(positionIdKey));
             adminorgBoIds.add(positionEntity.getLong(PositionBillConstant.NCKD_ADMINORGBOID_KEY));

+ 46 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PositionBillDeleteOpPlugin.java

@@ -0,0 +1,46 @@
+package nckd.jxccl.hrmp.hbpm.plugin.operate.hr;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.util.HRStringUtils;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 岗位申请单删除操作插件
+ * @entity: nckd_positionbill
+ * @from: kd.hr.homs.opplugin.web.orgbatch.AdminOrgBatchBillDeleteOpPlugin
+ * @operate: delete
+ * @author: jtd
+ * @date: 2025/12/31 21:29
+ */
+public class PositionBillDeleteOpPlugin extends AbstractOperationServicePlugIn {
+    @Override
+    public void beginOperationTransaction(BeginOperationTransactionArgs args) {
+        super.beginOperationTransaction(args);
+        DynamicObject[] datas = args.getDataEntities();
+        if (datas.length > 0) {
+            List<Long> selectedRows = Arrays.stream(datas).map((dyn) -> dyn.getLong(PositionBillConstant.ID_KEY)).collect(Collectors.toList());
+            HRBaseServiceHelper positionBillEntryHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);
+            QFilter billIdFilter = new QFilter(PositionBillConstant.NCKD_BILLID, QCP.equals, selectedRows);
+            String selectProperties = QueryFieldBuilder.create().add(PositionBillConstant.ID_KEY)
+                    .add(PositionBillConstant.NUMBER_KEY)
+                    .add(PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY)
+                    .add(PositionBillConstant.NCKD_POSITION_KEY)
+                    .buildSelect();
+            DynamicObject[] positionBillEntryDyns = positionBillEntryHelper.query(selectProperties, new QFilter[]{billIdFilter});
+            List<Long> addPositionEntryIdList = Arrays.stream(positionBillEntryDyns).filter((dyn) -> HRStringUtils.equals(dyn.getDynamicObject(PositionBillConstant.NCKD_CHANGETYPE).getString(PositionBillConstant.NUMBER_KEY), PositionBillConstant.ADD_TAG)).map((dyn) -> dyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY))).collect(Collectors.toList());
+            PositionBillServiceHelper.delAddMaster(addPositionEntryIdList);
+        }
+
+    }
+}

+ 1 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PositionBillEntrySaveOpPlugin.java

@@ -7,6 +7,7 @@ import nckd.jxccl.hrmp.hbpm.plugin.operate.hr.validator.PositionBillEntryNumberV
 /**
  * 岗位申请单分录保存操作插件
  * @entity: nckd_positionbillentry
+ * @from: kd.hr.homs.opplugin.web.orgbatch.AdminorgBatchDetailSaveOp
  * @author: jtd
  * @date: 2025/12/23 19:17
  */

+ 4 - 3
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/AbsBillPositionSaveValidator.java

@@ -25,6 +25,7 @@ import java.util.Map;
 
 /**
  * 岗位申请单分录校验器
+ * @from: kd.hr.homs.opplugin.web.orgbatch.validator.AbsBillOrgSaveValidator
  * @author: jtd
  * @date: 2025/12/23 20:55
  */
@@ -57,16 +58,16 @@ public abstract class AbsBillPositionSaveValidator extends AbstractValidator  {
 
         for(ExtendedDataEntity entity : entities) {
             DynamicObject positionDy = entity.getDataEntity();
-            long positionId = positionDy.getLong(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY));
+            long positionId = positionDy.getLong(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY));
             entityMap.put(positionId, entity);
         }
 
         for(ExtendedDataEntity entity : entities) {
             DynamicObject positionEntity = entity.getDataEntity();
-            long positionId = positionEntity.getLong(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY));
+            long positionId = positionEntity.getLong(String.join("_", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY));
             DynamicObject addPositionDy = PositionBillServiceHelper.getPositionHrDy(positionEntity);
             addPositionDy.set(PositionBillConstant.ID_KEY, positionId);
-            addPositionDy.set(PositionBillConstant.BOID_KEY, positionEntity.get(String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.BOID_KEY)));
+            addPositionDy.set(PositionBillConstant.BOID_KEY, positionEntity.get(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.BOID_KEY)));
             DynamicObject parentPositionVersionDy = positionEntity.getDynamicObject(PositionBillConstant.NCKD_PARENT);
             if (parentPositionVersionDy != null) {
                 long parentOrgBoId = parentPositionVersionDy.getLong(PositionBillConstant.BOID_KEY);

+ 1 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionAddSaveValidator.java

@@ -4,6 +4,7 @@ import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 /**
  * 岗位申请-岗位新设保存校验器
+ * @from: kd.hr.homs.opplugin.web.orgbatch.validator.OrgAddSaveValidator
  * @author: jtd
  * @date: 2025-11-08 17:23
  */

+ 3 - 2
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionBillEntryNameValidator.java

@@ -16,6 +16,7 @@ import java.util.Set;
 
 /**
  * 岗位申请单分录名称校验器
+ * @from: kd.hr.homs.opplugin.web.orgbatch.validator.AdminOrgBatchDetailNameValidator
  * @author: jtd
  * @date: 2025/12/23 21:16
  */
@@ -39,8 +40,8 @@ public class PositionBillEntryNameValidator extends AbstractValidator {
 
                 // 获取岗位数据
                 ILocaleString positionNameMap = dataEntity.getLocaleString(PositionBillConstant.NAME_KEY);
-                long positionId = dataEntity.getLong(String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY));
-                long positionBoId = dataEntity.getLong(String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.BOID_KEY));
+                long positionId = dataEntity.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY));
+                long positionBoId = dataEntity.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.BOID_KEY));
                 // 获取该组织下的岗位名称数据
                 JSONObject siblingNameMap = orgBoIdToSiblingNameMap.getJSONObject(String.valueOf(orgBoId));
                 if (siblingNameMap != null) {

+ 2 - 1
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionBillEntryNumberValidator.java

@@ -10,6 +10,7 @@ import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 /**
  * 岗位申请单分录编码校验器
+ * @from: kd.hr.homs.opplugin.web.orgbatch.validator.AdminOrgBatchDetailNumberValidator
  * @author: jtd
  * @date: 2025/12/24 11:04
  */
@@ -26,7 +27,7 @@ public class PositionBillEntryNumberValidator extends AbstractValidator {
                 DynamicObject dataEntity = data.getDataEntity();
                 String number = dataEntity.getString(PositionBillConstant.NUMBER_KEY);
                 if (HRStringUtils.isNotEmpty(number)) {
-                    long positionId = dataEntity.getLong(String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY));
+                    long positionId = dataEntity.getLong(String.join(".", PositionBillConstant.NCKD_POSITION_KEY, PositionBillConstant.ID_KEY));
 
                     for(String siblingId : numberMap.keySet()) {
                         if (!siblingId.equals(String.valueOf(positionId)) && number.equals(numberMap.getString(siblingId))) {

+ 16 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionChangeSaveValidator.java

@@ -0,0 +1,16 @@
+package nckd.jxccl.hrmp.hbpm.plugin.operate.hr.validator;
+
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+
+/**
+ * 岗位申请-岗位变更保存校验器
+ * @from: kd.hr.homs.opplugin.web.orgbatch.validator.OrgParentSaveValidator
+ * @author: jtd
+ * @date: 2025/12/31 22:01
+ */
+public class PositionChangeSaveValidator extends AbsBillPositionSaveValidator {
+    @Override
+    String getOperationKey() {
+        return PositionBillConstant.CONFIRMCHANGE_OP;
+    }
+}