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

refactor(hr): 重构岗位申请单相关服务和常量

- 添加生效日期和失效日期常量定义
- 重构离职申请单休假类型ID查询参数
- 将多个岗位业务服务类从hr包移动到service.hr子包
- 更新岗位申请单回调服务中的业务逻辑处理
- 优化岗位申请单属性变更服务中的组织变更处理
- 添加岗位申请单工具类和相关辅助方法
- 修复岗位申请单分录数据更新和保存逻辑
- 优化岗位F7选择过滤条件和历史数据查询逻辑
jtd 1 неделя назад
Родитель
Сommit
ed61311096
23 измененных файлов с 882 добавлено и 156 удалено
  1. 4 0
      code/base/nckd-jxccl-base-common/src/main/java/nckd/jxccl/base/common/constant/FormConstant.java
  2. 1 4
      code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitApplyFormPlugin.java
  3. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PosBillEntryFastChgHelper.java
  4. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillAfterBindDataService.java
  5. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillBaseService.java
  6. 85 15
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillClosedCallBackService.java
  7. 38 13
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillConfirmCallBackService.java
  8. 10 8
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillPropertyChangedService.java
  9. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillSaveHelper.java
  10. 85 9
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/service/hr/PositionBillServiceHelper.java
  11. 29 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/utils/hr/PositionBillUtil.java
  12. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PatternUtil.java
  13. 18 8
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionBillConstant.java
  14. 0 39
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/ParentPositionListPlugin.java
  15. 13 12
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryAddFormPlugin.java
  16. 38 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryChangeFormPlugin.java
  17. 428 0
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PosBillEntryUpdatePlugin.java
  18. 66 25
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillEntryFormPlugin.java
  19. 56 12
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/form/hr/PositionBillFormPlugin.java
  20. 3 3
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/PosBillEntryNewPositionTempSaveOpPlugin.java
  21. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/AbsBillPositionSaveValidator.java
  22. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionBillEntryNameValidator.java
  23. 1 1
      code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/plugin/operate/hr/validator/PositionBillEntryNumberValidator.java

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

@@ -337,6 +337,10 @@ public class FormConstant {
     public static final String INITDATASOURCE = "initdatasource";
     /** 是否标准岗位 */
     public static final String ISSTANDARDPOS_KEY = "isstandardpos";
+    /** 生效日期 */
+    public static final String BSED_KEY = "bsed";
+    /** 失效日期 */
+    public static final String BSLED_KEY = "bsled";
 
     /** 工具栏标识(二开)*/
     public static final String NCKD_TOOLBARAP = "nckd_toolbarap";

+ 1 - 4
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/htm/plugin/form/quitapply/QuitApplyFormPlugin.java

@@ -1,10 +1,8 @@
 package nckd.jxccl.hr.htm.plugin.form.quitapply;
 
-import kd.bos.bill.BillShowParameter;
 import kd.bos.common.enums.EnableEnum;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
-import kd.bos.form.events.PreOpenFormEventArgs;
 import kd.bos.form.plugin.AbstractFormPlugin;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
@@ -18,7 +16,6 @@ import java.time.ZoneId;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 离职申请单表单插件
@@ -81,7 +78,7 @@ public class QuitApplyFormPlugin extends AbstractFormPlugin {
         // 考勤档案
         quotaQueryParam.setAttFileBoId(attFile.getBoId());
         // 休假类型
-        quotaQueryParam.setQuotaTypeIdList(Collections.singletonList(1427605179489846272L));
+        quotaQueryParam.setQuotaTypeIdList(Collections.singletonList(1666695290893207552L));
         // 仅使用范围过滤
         quotaQueryParam.setRangQueryType(0);
         // 开始时间

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import kd.bos.form.IFormView;
 import kd.bos.orm.ORM;

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import kd.bos.entity.datamodel.IDataModel;
 import kd.bos.form.IFormView;

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

@@ -1,7 +1,8 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import com.google.common.collect.Lists;
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.metadata.IDataEntityProperty;
 import kd.bos.dataentity.metadata.IMetadata;
 import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
@@ -15,6 +16,7 @@ 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.HRDyObjectPropUtil;
+import kd.hr.homs.business.utils.PatternUtil;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionChangeTypeEnum;
 
@@ -22,6 +24,8 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -40,12 +44,14 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
 
     public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
         switch (closedCallBackEvent.getActionId()) {
-            case PositionBillConstant.ADD_TAG:
-            case PositionBillConstant.CHANGE_TAG:
+            case PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY:
                 if (onlyForView(closedCallBackEvent)) {
                     return;
                 }
-                updateEntryEntity(closedCallBackEvent.getActionId());
+                updateAddEntryEntity();
+                break;
+            case  PositionBillConstant.NCKD_ENTRYENTITY_CHANGE_KEY:
+                saveReturn(closedCallBackEvent.getReturnData(), PositionBillConstant.NCKD_ENTRYENTITY_CHANGE_KEY);
         }
     }
 
@@ -53,7 +59,7 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
         return closedCallBackEvent.getReturnData() == null;
     }
 
-    private void updateEntryEntity(String tag) {
+    private void updateAddEntryEntity() {
         DataEntityPropertyCollection entryEntityInfo = getModel().getDataEntity(true).getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).getDynamicObjectType().getProperties();
         MainEntityType entityType = EntityMetadataCache.getDataEntityType(PositionBillConstant.NCKD_POSBILLENTRYADD_ENTITY);
         DataEntityPropertyCollection addEntityInfo = entityType.getProperties();
@@ -61,26 +67,24 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
         List<String> selectPropList = new ArrayList<String>();
         Set<String> toSetValueEntryPropList = new HashSet<String>();
 
-        String lineSuffix = "_"+tag;
+        String lineSuffix = "_"+PositionBillConstant.ADD_TAG;
+        // 获取分录需要转换的键值,将单据分录字段转换转成分录页面字段
+        Map<String, String> posBillEntryTransKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
         for(IDataEntityProperty iDataEntityProperty : entryEntityInfo) {
             String entryPropName = iDataEntityProperty.getName();
             if (entryPropName.endsWith(lineSuffix)) {
                 String entryPropNameSub = PositionBillServiceHelper.getNoLineSuffixProp(entryPropName, lineSuffix);
-                if (addNamePropMap.containsKey(entryPropNameSub)) {
+                if (posBillEntryTransKeyMap.containsKey(entryPropNameSub)) {
+                    selectPropList.add(posBillEntryTransKeyMap.get(entryPropNameSub));
+                    toSetValueEntryPropList.add(entryPropName);
+                } else if (addNamePropMap.containsKey(entryPropNameSub)) {
                     selectPropList.add(entryPropNameSub);
                     toSetValueEntryPropList.add(entryPropName);
                 }
             }
         }
 
-        // 获取分录需要转换的键值,将单据分录字段转换转成分录页面字段
-        Map<String, String> transKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
-        transKeyMap.forEach((key, value) -> {
-            selectPropList.add(value);// 岗位查询字段放入分录页面字段
-            toSetValueEntryPropList.add(key+lineSuffix);// 放入单据分录字段(带后缀)
-        });
         toSetValueEntryPropList.add(PositionBillConstant.ID_KEY);
-
         HRBaseServiceHelper posBillEntryAddServiceHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSBILLENTRYADD_ENTITY);
         Long billId = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
         QFilter qFilter = (new QFilter(PositionBillConstant.NCKD_BILLID, QCP.equals, billId)).and(new QFilter(String.join(".", PositionBillConstant.NCKD_CHANGETYPE, PositionBillConstant.NUMBER_KEY), QCP.equals, PositionChangeTypeEnum.ADD.getNumber()));
@@ -98,7 +102,7 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
                     values.add(addPositionDy.getLong(PositionBillConstant.ID_KEY));
                 } else {
                     String propName = PositionBillServiceHelper.getNoLineSuffixProp(entryPropName, lineSuffix);
-                    propName = transKeyMap.getOrDefault(propName, propName);
+                    propName = posBillEntryTransKeyMap.getOrDefault(propName, propName);
                     if (addPositionDy.get(propName) instanceof DynamicObject) {
                         values.add(HRDyObjectPropUtil.getIdLongObject(addPositionDy.getDynamicObject(propName)));
                     } else {
@@ -117,4 +121,70 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
         getView().updateView(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY);
     }
 
+    private void saveReturn(Object data, String entryEntityInfo) {
+        if (data instanceof Map) {
+            Map<String, Object> map = (Map) data;
+            DynamicObjectCollection info = getModel().getDataEntity(true).getDynamicObjectCollection(entryEntityInfo);
+            DataEntityPropertyCollection properties = info.getDynamicObjectType().getProperties();
+            Optional<DynamicObject> changeEntry = info.stream().filter((entry) -> entry.getLong(PositionBillConstant.ID_KEY) == (Long) map.get(PositionBillConstant.ID_KEY)).findFirst();
+            if (changeEntry.isPresent()) {
+                DynamicObject dynamicObject = changeEntry.get();
+                DataEntityPropertyCollection propers = dynamicObject.getDataEntityType().getProperties();
+                map.keySet().forEach((item) -> {
+                    if (propers.containsKey(item)) {
+                        dynamicObject.set(item, map.get(item));
+                    }
+
+                });
+                getView().updateView(entryEntityInfo);
+            } else {
+                String lineSuffix = entryEntityInfo.substring(entryEntityInfo.lastIndexOf("_"));
+                TableValueSetter vs = new TableValueSetter();
+                List<String> propList = new ArrayList();
+
+                for(IDataEntityProperty property : properties) {
+                    String propName = property.getName();
+                    if (PatternUtil.isExProperty(propName) && propName.endsWith(lineSuffix)) {
+                        vs.addField(property.getName());
+                        propList.add(property.getName());
+                    }
+                }
+
+                propList.add(PositionBillConstant.ID_KEY);
+                List<Object> values = Lists.newArrayListWithCapacity(16);
+
+                for(String prop : propList) {
+                    Object obj = map.get(prop);
+                    // 原上级岗位特殊处理
+                    if (PositionBillConstant.NCKD_ORIPARENT_KEY.equals(prop)) {
+                        values.add(getLongId(map.get(PositionBillConstant.NCKD_PARENT)));
+                        continue;
+                    }
+
+                    if (obj instanceof DynamicObject) {
+                        values.add(getLongId(obj));
+                    } else {
+                        values.add(obj);
+                    }
+                }
+
+                vs.addRow(values.toArray());
+                AbstractFormDataModel model = (AbstractFormDataModel) getModel();
+                model.beginInit();
+                model.batchCreateNewEntryRow(PositionBillConstant.NCKD_ENTRYENTITY_CHANGE_KEY, vs);
+                model.endInit();
+                getView().updateView(PositionBillConstant.NCKD_ENTRYENTITY_CHANGE_KEY);
+            }
+        }
+
+    }
+
+    private Object getLongId(Object mapValue) {
+        if (Objects.isNull(mapValue)) {
+            return null;
+        } else {
+            return mapValue instanceof DynamicObject ? ((DynamicObject) mapValue).getLong(PositionBillConstant.ID_KEY) : mapValue;
+        }
+    }
+
 }

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -19,7 +19,9 @@ 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.common.hr.PatternUtil;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionChangeTypeEnum;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -49,8 +51,8 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
                     return;
                 }
 
-                EntryGrid coopRelEntryGrid = getView().getControl(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, callBackId.substring(callBackId.lastIndexOf("_")+1)));
-                int[] selectRows = coopRelEntryGrid.getSelectRows();
+                EntryGrid strategyEntryGrid = getView().getControl(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, callBackId.substring(callBackId.lastIndexOf("_")+1)));
+                int[] selectRows = strategyEntryGrid.getSelectRows();
                 HRBaseServiceHelper hrBaseServiceHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);
                 List<Long> entryIdList = Lists.newArrayListWithExpectedSize(selectRows.length);
                 if (PositionBillConstant.DELETE_ROWS_ADD_OP.equals(callBackId)) {
@@ -75,10 +77,34 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
 
                 getView().showSuccessNotification("删除成功");
                 hrBaseServiceHelper.delete(entryIdList.toArray(new Long[0]));
+            } else {
+                if (PositionBillConstant.CB_CLOSE_BILL.equals(callBackId) && event.getResult() == MessageBoxResult.Cancel) {
+                    return;
+                }
+
+                for (PositionChangeTypeEnum positionChangeTypeEnum : PositionChangeTypeEnum.values()) {
+                    getModel().deleteEntryData(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, positionChangeTypeEnum.getTag()));
+                }
+
+                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)
+                        .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());
+                PositionBillServiceHelper.delAddMaster(addPositionIdList);
+
+                getView().getPageCache().put(PositionBillConstant.PC_ISCANCELOVER, Boolean.TRUE.toString());
+                getView().invokeOperation(PositionBillConstant.CLOSE_OP);
             }
         }
 
-        changePositionConfirm(event, callBackId);
+        changeOrgConfirm(event, callBackId);
     }
 
     private int[] validateHasChildPositionAndDelete() {
@@ -158,18 +184,17 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
         return deleteRowIndexList.stream().mapToInt(Integer::intValue).toArray();
     }
 
-    private void changePositionConfirm(MessageBoxClosedEvent messageBoxClosedEvent, String callBackId) {
-        if (callBackId.startsWith(PositionBillConstant.CB_SELECT_POSITION_UNDERLINE)) {
-            String suffix = callBackId.replace(PositionBillConstant.CB_SELECT_POSITION_UNDERLINE, "");
+    private void changeOrgConfirm(MessageBoxClosedEvent messageBoxClosedEvent, String callBackId) {
+        if (callBackId.startsWith(PositionBillConstant.CB_SELECT_POSITION)) {
+            String suffix = callBackId.substring(11);
             String lineSuffix = "_" + suffix;
             HRBaseServiceHelper helper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
-            EntryGrid entryGrid = getView().getControl(PositionBillConstant.NCKD_ENTRYENTITY + lineSuffix);
             String positionRow = getView().getPageCache().get(PositionBillConstant.PC_POSITIONROW);
             int row = Integer.parseInt(positionRow);
             if (messageBoxClosedEvent.getResult() != MessageBoxResult.Yes) {
                 DynamicObject entryEntityDyn = getModel().getDataEntity(true).getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY + lineSuffix).get(row);
                 String positionOld = getView().getPageCache().get(PositionBillConstant.PC_POSITIONOLD);
-                if (HRStringUtils.isNotEmpty(positionOld)) {// 461
+                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);
@@ -210,12 +235,12 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
             // 设置单据分录字段值
             for(IDataEntityProperty iDataEntityProperty : entryEntityInfo) {
                 String propName = iDataEntityProperty.getName();
-                if (nckd.jxccl.hrmp.hbpm.business.hr.PatternUtil.isExProperty(propName) && propName.endsWith(lineSuffix)) {
+                if (PatternUtil.isExProperty(propName) && propName.endsWith(lineSuffix)) {
                     String selectName = PositionBillServiceHelper.getNoLineSuffixProp(propName, lineSuffix);
                     if (positionExcludeKeyList.contains(selectName) || HRStringUtils.equals(selectName, PositionBillConstant.NCKD_POSDUTY_ENTRY_ENTITY_KEY)) {
                         continue;
                     }
-                    // 原上级岗位单独处理
+                    // 原上级岗位特殊处理
                     if (HRStringUtils.equals(selectName, PositionBillConstant.NCKD_PARENT)) {
                         entryEntityDyn.set(PositionBillConstant.NCKD_ORIPARENT_KEY+lineSuffix, position.get(transKeyMap.getOrDefault(selectName, selectName)));
                     }
@@ -224,14 +249,14 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
             }
 
             getView().updateView(PositionBillConstant.NCKD_ENTRYENTITY + lineSuffix);
-        } else if (callBackId.equals(PositionBillConstant.CHANGE_TAG)) {
+        } else if (callBackId.equals(String.join("_", PositionBillConstant.NCKD_ORG_KEY, PositionBillConstant.CHANGE_TAG))) {
             String entryId = String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, callBackId);
             EntryGrid entryGrid = getView().getControl(entryId);
             int row = entryGrid.getEntryState().getFocusRow();
             if (messageBoxClosedEvent.getResult() == MessageBoxResult.Yes) {
                 PosBillEntryFastChgHelper.cleanOrgBaseInfoForBillEntry(getView(), row, callBackId, entryId);
             } else {
-                String oldId = getView().getPageCache().get(PositionBillConstant.PC_ENTRY_POSITION_VALUE);
+                String oldId = getView().getPageCache().get(PositionBillConstant.PC_ENTRY_ORG_VALUE);
                 getModel().beginInit();
                 getModel().setValue(callBackId, Long.parseLong(oldId), row);
                 getModel().endInit();

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import kd.bos.common.enums.EnableEnum;
 import kd.bos.dataentity.entity.DynamicObject;
@@ -15,6 +15,7 @@ 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.hrmp.hbpm.common.hr.PatternUtil;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 import java.util.HashMap;
@@ -50,7 +51,6 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
             int rowIndex = changedArgs.getChangeSet()[0].getRowIndex();
             String fieldKey = property.getName();
             String suffix = getSuffixByFieldKey(fieldKey);
-            String entryName = String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, suffix);
             Object objectNew = changedArgs.getChangeSet()[0].getNewValue();
             Object objectOld = changedArgs.getChangeSet()[0].getOldValue();
             if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION, suffix))) {
@@ -59,13 +59,15 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
                 } else if (objectNew != null) {
                     showConfirmByOldValue(changedArgs, suffix, rowIndex);
                 }
+            } else if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG))) {
+                // 上级岗位变更业务逻辑
             } else if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_ORG_KEY, suffix))) {
-                DynamicObject oldObj = (DynamicObject)objectOld;// 160
-                DynamicObject newObj = (DynamicObject)objectNew;// 161
+                DynamicObject oldObj = (DynamicObject) objectOld;
+                DynamicObject newObj = (DynamicObject) objectNew;
                 if (newObj != null && oldObj != null && oldObj.getLong(PositionBillConstant.ID_KEY) != newObj.getLong(PositionBillConstant.ID_KEY)) {
                     Long orgIDOld = oldObj == null ? 0L : oldObj.getLong(PositionBillConstant.ID_KEY);
-                    getView().getPageCache().remove(PositionBillConstant.PC_ENTRY_POSITION_VALUE);
-                    getView().getPageCache().put(PositionBillConstant.PC_ENTRY_POSITION_VALUE, String.valueOf(orgIDOld));
+                    getView().getPageCache().remove(PositionBillConstant.PC_ENTRY_ORG_VALUE);
+                    getView().getPageCache().put(PositionBillConstant.PC_ENTRY_ORG_VALUE, String.valueOf(orgIDOld));
                     ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener(fieldKey, closeCallBackPlugin);
                     getView().showConfirm("切换组织体系管理组织后,将清除该组织不可使用的基础资料信息,是否切换?", MessageBoxOptions.OKCancel, confirmCallBackListener);
                 }
@@ -125,7 +127,7 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
                     if (positionExcludeKeyList.contains(selectName) || HRStringUtils.equals(selectName, PositionBillConstant.NCKD_POSDUTY_ENTRY_ENTITY_KEY)) {
                         continue;
                     }
-                    // 原上级岗位单独处理
+                    // 原上级岗位特殊处理
                     if (HRStringUtils.equals(selectName, PositionBillConstant.NCKD_PARENT)) {
                         entryEntityDyn.set(PositionBillConstant.NCKD_ORIPARENT_KEY+lineSuffix, position.get(transKeyMap.getOrDefault(selectName, selectName)));
                     }
@@ -143,7 +145,7 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
         Long positionOld = position != null ? position.getLong(PositionBillConstant.ID_KEY) : null;
         getView().getPageCache().put(PositionBillConstant.PC_POSITIONOLD, positionOld == null ? "" : String.valueOf(positionOld));
         getView().getPageCache().put(PositionBillConstant.PC_POSITIONROW, String.valueOf(rowIndex));
-        ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener(PositionBillConstant.CB_SELECT_POSITION_UNDERLINE + suffix, getCloseCallBackPlugin());
+        ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener(PositionBillConstant.CB_SELECT_POSITION + suffix, getCloseCallBackPlugin());
         getView().showConfirm("切换岗位后,当前已修改的内容将会丢失,是否继续?", MessageBoxOptions.OKCancel, confirmCallBackListener);
     }
 

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.logging.Log;

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

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.business.service.hr;
 
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
@@ -41,12 +41,14 @@ import kd.sdk.hr.hdm.common.enums.reg.RegBillStatusEnum;
 import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionChangeTypeEnum;
+import org.apache.commons.lang3.time.DateUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -61,7 +63,7 @@ public class PositionBillServiceHelper {
 
     public static String getNoLineSuffixProp(String prop, String lineSuffix) {
         if (prop.endsWith(lineSuffix)) {
-            return prop.lastIndexOf(lineSuffix) >= 0 ? prop.substring(0, prop.lastIndexOf(lineSuffix)) : prop;
+            return prop.substring(0, prop.lastIndexOf(lineSuffix));
         }
         return prop;
     }
@@ -119,10 +121,7 @@ public class PositionBillServiceHelper {
                     formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
                     formShowParameter.setCustomParam(PositionBillConstant.CP_BILLID, iFormView.getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY));
                     formShowParameter.setCustomParam(PositionBillConstant.CP_BILLBSED, iFormView.getModel().getDataEntity().getDate(PositionBillConstant.NCKD_EFFDT));
-                    formShowParameter.setCloseCallBack(new CloseCallBack(pluginName, operation));
-                    if (HRStringUtils.equals(EnableEnum.NO.getCode(), iFormView.getPageCache().get(PositionBillConstant.PC_ISLIST))) {
-                        formShowParameter.setCustomParam(PositionBillConstant.CP_PARENTID, iFormView.getPageCache().get(PositionBillConstant.CP_PARENTID));
-                    }
+                    formShowParameter.setCloseCallBack(new CloseCallBack(pluginName, PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY));
 
                     if (HRStringUtils.equals(iFormView.getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
                         formShowParameter.setHasRight(true);
@@ -146,7 +145,44 @@ public class PositionBillServiceHelper {
         return permResult;
     }
 
-    public static void filterF7Position(IFormView iFormView, BeforeF7SelectEvent event, QFilter filter) {
+    public static void setParentFilter(IFormView view, DynamicObject positionObject, BeforeF7SelectEvent event) {
+        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> adminOrgSet = addCollection.stream().map((s) -> s.getString(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ADD_TAG))).collect(Collectors.toSet());
+        Set<Long> addOrgIdSet = adminOrgSet.stream().map(Long::valueOf).collect(Collectors.toSet());
+        QFilter currentOrderFilter = new QFilter(PositionBillConstant.ID_KEY, QCP.in, addOrgIdSet);
+
+        AuthorizedOrgResult permResult = getOrgAuth(view);
+        if (permResult != null && !permResult.isHasAllOrgPerm()) {
+            log.info("[非全功能用户过滤条件]");
+            QFilter authFilter = new QFilter(String.join(PositionBillConstant.ADMINORG, PositionBillConstant.BOID_KEY), QCP.in, permResult.getHasPermOrgs());
+            event.getCustomQFilters().add(authFilter.or(currentOrderFilter));
+        }
+
+        DynamicObject buOrg = dataEntityParent.getDynamicObject(PositionBillConstant.ORG_KEY);
+        if (positionObject != null) {
+            event.getCustomQFilters().add(new QFilter(PositionBillConstant.ID_KEY, QCP.not_equals, positionObject.getLong(PositionBillConstant.ID_KEY)));
+            buOrg = positionObject.getDynamicObject(PositionBillConstant.ORG_KEY);
+        }
+
+        Date effDate = HRObjectUtils.isEmpty(view.getModel().getValue(PositionBillConstant.NCKD_EFFDT)) ? DateUtils.truncate(new Date(), 5) : (Date)view.getModel().getValue(PositionBillConstant.NCKD_EFFDT);
+        event.getCustomQFilters().add(new QFilter(PositionBillConstant.BSED_KEY, QCP.less_equals, effDate));
+        event.getCustomQFilters().add(new QFilter(PositionBillConstant.BSLED_KEY, QCP.large_equals, effDate));
+        if (buOrg != null) {
+            event.getCustomQFilters().add(new QFilter(PositionBillConstant.ORG_KEY, QCP.equals, buOrg.getLong(PositionBillConstant.ID_KEY)));
+        }
+
+        QFilter dataStatusFilter = new QFilter(PositionBillConstant.DATA_STATUS, QCP.in, Arrays.asList(HisModelDataStatusEnum.EFFECTING.getStatus(), HisModelDataStatusEnum.TO_BE_EFFECT.getStatus()));
+        event.getCustomQFilters().add(dataStatusFilter.or(currentOrderFilter));
+        QFilter statusFilter = new QFilter(PositionBillConstant.STATUS, QCP.equals, StatusEnum.C);
+        event.getCustomQFilters().add(statusFilter.or(currentOrderFilter));
+        event.getCustomQFilters().add(isCurrentVersion.or(currentOrderFilter));
+        ListShowParameter formShowParameter = (ListShowParameter)event.getFormShowParameter();
+        formShowParameter.setShowApproved(false);
+    }
+
+    public static void filterF7Org(IFormView iFormView, BeforeF7SelectEvent event, QFilter filter) {
         FormShowParameter formShowParameter = event.getFormShowParameter();
         formShowParameter.setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
         log.info("[岗位F7过滤条件]");
@@ -182,6 +218,29 @@ public class PositionBillServiceHelper {
         return list.isEmpty() ? new QFilter(PositionBillConstant.ID_KEY, QCP.not_equals, 20000L) : new QFilter(PositionBillConstant.BOID_KEY, QCP.not_in, list);
     }
 
+    public static DynamicObject getPositionDyById(Long orgId) {
+        HRBaseServiceHelper serviceHelper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
+        QFilter qFilter = new QFilter(PositionBillConstant.ID_KEY, QCP.equals, orgId);
+        DynamicObject dynamicObject = serviceHelper.loadDynamicObject(qFilter.toArray());
+        return dynamicObject;
+    }
+
+    public static List<Long> getPositionAndChildren(Long positionId, Date positionBsed) {
+        List<Long> positionIds = new ArrayList();
+        HRBaseServiceHelper parentServiceHelper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
+        QFilter parentFilter = new QFilter(PositionBillConstant.PARENT_KEY, QCP.equals, positionId)
+                .and(PositionBillConstant.IS_CURRENT_VERSION, QCP.equals, false)
+                .and(PositionBillConstant.BSED_KEY, QCP.less_equals, positionBsed)
+                .and(PositionBillConstant.BSLED_KEY, QCP.large_equals, positionBsed)
+                .and(PositionBillConstant.DATA_STATUS, QCP.in, Arrays.asList(HisModelDataStatusEnum.EFFECTING.getStatus(), HisModelDataStatusEnum.TO_BE_EFFECT.getStatus()))
+                .and(PositionBillConstant.STATUS, QCP.equals, StatusEnum.C);
+
+        DynamicObjectCollection dynamicObjects = parentServiceHelper.queryOriginalCollection(PositionBillConstant.ID_KEY, parentFilter.toArray());
+        dynamicObjects.forEach((dy) -> positionIds.add(dy.getLong(PositionBillConstant.ID_KEY)));
+
+        return positionIds;
+    }
+
     /**
      * 删除岗位新设暂存数据
      * @param positionIdList
@@ -212,6 +271,24 @@ public class PositionBillServiceHelper {
         return entryEntityDyn;
     }
 
+    public static Long getHisId(Long boId) {
+        DynamicObject dynamicObject = getHisDynamicObject(boId);
+        return dynamicObject != null ? dynamicObject.getLong(PositionBillConstant.ID_KEY) : boId;
+    }
+
+    public static DynamicObject getHisDynamicObject(Long boId) {
+        if (boId != null && boId != 0L) {
+            HRBaseServiceHelper adminOrgHelper = 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});
+        } else {
+            return null;
+        }
+    }
+
     /**
      * 获取岗位转换键值
      * @return 目标字段: 源字段
@@ -347,13 +424,12 @@ public class PositionBillServiceHelper {
             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_ISCARD, "isCardFalse");
             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));
             int sequence = getEntrySeq(iFormView.getModel(), PositionChangeTypeEnum.getNumberByTag(tag));
             formShowParameter.setCustomParam(PositionBillConstant.CP_SEQUENCE, sequence);
-            formShowParameter.setCloseCallBack(new CloseCallBack(pluginName, tag));
+            formShowParameter.setCloseCallBack(new CloseCallBack(pluginName, String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, tag)));
             formShowParameter.setCustomParam(PositionBillConstant.OP_VALIDATOR_BILL_POSITION_ALL_CHANGE_POSITION_KEY, getThisBillAllValidateDataStr(iDataModel.getDataEntity(true)));
             formShowParameter.setCustomParam(PositionBillConstant.OP_VALIDATOR_BILL_POSITION_NEW_POSITION_NUMBERS_KEY, getThisBillPositionNumbersStr(iDataModel.getDataEntity(true)));
             iFormView.showForm(formShowParameter);

+ 29 - 0
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/utils/hr/PositionBillUtil.java

@@ -0,0 +1,29 @@
+package nckd.jxccl.hrmp.hbpm.business.utils.hr;
+
+import kd.bos.exception.KDBizException;
+import kd.bos.form.IFormView;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+
+import java.util.Locale;
+import java.util.stream.Stream;
+
+/**
+ * 岗位申请单工具类
+ * @from: kd.hr.homs.business.utils.OrgChgUtil
+ * @author: jtd
+ * @date: 2025/12/30 15:06
+ */
+public class PositionBillUtil {
+
+    public static synchronized IFormView getView(IFormView view, String name) {
+        String msg = String.format(Locale.ROOT, "需要从 %s 页面进入", name);
+        if (view == null) {
+            throw new KDBizException(msg);
+        } else {
+            String pageName = view.getModel().getDataEntityType().getName();
+            Stream<String> pause = Stream.of(name, PositionBillConstant.BOS_LIST_ENTITY);
+            return pause.anyMatch((s) -> s.equals(pageName)) ? view : getView(view.getParentView(), name);
+        }
+    }
+
+}

+ 1 - 1
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/hr/PatternUtil.java → code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PatternUtil.java

@@ -1,4 +1,4 @@
-package nckd.jxccl.hrmp.hbpm.business.hr;
+package nckd.jxccl.hrmp.hbpm.common.hr;
 
 import kd.bos.entity.ISVInfo;
 import kd.bos.logging.Log;

+ 18 - 8
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/common/hr/PositionBillConstant.java

@@ -49,6 +49,12 @@ public class PositionBillConstant extends FormConstant {
     public static final String EDIT_ADD_OP = "edit_add";
     /** 编辑-岗位变更OP */
     public static final String EDIT_CHANGE_OP = "edit_change";
+
+    /** 岗位职责高级面板工具栏标识 */
+    public static final String NCKD_ADVCONTOOLBARAP11_KEY = "nckd_advcontoolbarap11";
+    /** 分录删除按钮标识 */
+    public static final String NCKD_TB_DEL_KEY = "nckd_tb_del";
+
     /** 岗位申请单内码 */
     public static final String NCKD_BILLID = "nckd_billid";
     /** 生效日期 */
@@ -63,6 +69,8 @@ public class PositionBillConstant extends FormConstant {
     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";
     /** 上级岗位 */
     public static final String NCKD_PARENT = "nckd_parent";
     /** 上级岗位 */
@@ -100,17 +108,11 @@ public class PositionBillConstant extends FormConstant {
     public static final String CP_SELECTOBJECT = "selectObject";
     /** 单据生效时间页面自定义参数 */
     public static final String CP_BILLBSED = "billBsed";
-    /** 上级ID页面自定义参数 */
-    public static final String CP_PARENTID = "parentId";
     /** 分录顺序号页面自定义参数 */
     public static final String CP_SEQUENCE = "sequence";
     /** 岗位ID页面自定义参数 */
     public static final String CP_POSITIONID = "positionId";
-    /** 是否卡片视图页面自定义参数 */
-    public static final String CP_ISCARD = "iscard";
 
-    /** 是否列表界面缓存参数 */
-    public static final String PC_ISLIST = "isList";
     /** 新增岗位上级变更页面缓存参数 */
     public static final String PC_ADDPOSITIONPARENTCHANGE = "addPositionParentChange";
     /** 上级ID页面缓存参数 */
@@ -138,12 +140,20 @@ public class PositionBillConstant extends FormConstant {
     /** 岗位变更行页面缓存参数 */
     public static final String PC_POSITIONROW = "positionRow";
     /** 分录岗位信息页面缓存参数 */
-    public static final String PC_ENTRY_POSITION_VALUE = "entry_position_value";
+    public static final String PC_ENTRY_ORG_VALUE = "entry_position_value";
+    /** 是否变更岗位页面缓存参数 */
+    public static final String PC_ISCHANGEPOSITION = "isChangePosition";
+    /** 是否关闭完成页面缓存参数 */
+    public static final String PC_ISCANCELOVER = "isCancelOver";
 
     /** 变更组织体系管理组织回调标识 */
     public static final String CB_CHG_ORG = "chg_org";
     /** 选中岗位数据回调标识 */
-    public static final String CB_SELECT_POSITION_UNDERLINE = "select_position_";
+    public static final String CB_SELECT_POSITION = "select_position_";
+    /** 关闭页面回调标识 */
+    public static final String CB_CLOSE_BILL = "close_bill";
+    /** 删除分录回调标识 */
+    public static final String CB_DEL_ROW = "del_row";
 
     /** 岗位申请单同级岗位名称OP参数 */
     public static final String OP_BILL_SIBLING_NAMES_MAP = "OP_BILL_SIBLING_NAMES_MAP";

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

@@ -1,39 +0,0 @@
-package nckd.jxccl.hrmp.hbpm.plugin.form.hr;
-
-import kd.bos.common.enums.EnableEnum;
-import kd.bos.form.control.SplitContainer;
-import kd.bos.form.control.SplitDirection;
-import kd.bos.form.events.PreOpenFormEventArgs;
-import kd.bos.list.plugin.AbstractListPlugin;
-
-import java.util.EventObject;
-import java.util.Map;
-
-
-/**
- * 上级岗位列表插件
- * @author: jtd
- * @date: 2025-10-24 10:24
- */
-public class ParentPositionListPlugin extends AbstractListPlugin {
-
-    @Override
-    public void preOpenForm(PreOpenFormEventArgs e) {
-        super.preOpenForm(e);
-
-        // 指定显示岗位数据
-        Map<String, Object> customParams = e.getFormShowParameter().getCustomParams();
-        customParams.put("showBasedata", EnableEnum.NO.getCode());
-    }
-
-    @Override
-    public void beforeBindData(EventObject e) {
-        super.beforeBindData(e);
-
-        // 默认隐藏左树
-        SplitContainer splitContainer = getView().getControl("splitcontainerap");
-        if (splitContainer != null) {
-            splitContainer.hidePanel(SplitDirection.left, true);
-        }
-    }
-}

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

@@ -29,8 +29,8 @@ import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.util.HRObjectUtils;
 import kd.hr.hbp.common.util.HRStringUtils;
 import kd.hr.homs.business.utils.PatternUtil;
-import nckd.jxccl.hrmp.hbpm.business.hr.PosBillEntryFastChgHelper;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PosBillEntryFastChgHelper;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 import java.util.ArrayList;
@@ -42,7 +42,7 @@ import java.util.Map;
 import java.util.stream.Stream;
 
 /**
- * 岗位申请-新增岗位表单插件
+ * 岗位申请-岗位新设表单插件
  * @from: kd.hr.homs.formplugin.web.orgbatch.AdminOrgBatchDetailAddPlugin
  * @author: jtd
  * @date: 2025-11-05 15:32
@@ -209,10 +209,10 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
         if (selectObject != null) {
             String lineSuffix = "_"+PositionBillConstant.ADD_TAG;
             Map<String, Object> map = SerializationUtils.fromJsonString(selectObject.toString(), Map.class);
-            Map<String, Object> noPrefixMap = map.entrySet().stream().collect(HashMap::new, (m, v) -> m.put(PositionBillServiceHelper.getNoLineSuffixProp(v.getKey(), lineSuffix), v.getValue()), HashMap::putAll);
+            Map<String, Object> noSuffixMap = map.entrySet().stream().collect(HashMap::new, (m, v) -> m.put(PositionBillServiceHelper.getNoLineSuffixProp(v.getKey(), lineSuffix), v.getValue()), HashMap::putAll);
             List<String> props = new ArrayList();
 
-            for(String prop : noPrefixMap.keySet()) {
+            for(String prop : noSuffixMap.keySet()) {
                 if (PatternUtil.isExProperty(prop)) {
                     props.add(prop);
                 }
@@ -221,13 +221,14 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
             // 获取分录需要转换的键值,将单据分录字段转换转成分录页面字段
             Map<String, String> transKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
             transKeyMap.forEach((key, value) -> {
-                noPrefixMap.put(value, noPrefixMap.get(key));
-                noPrefixMap.remove(key);
+                noSuffixMap.put(value, noSuffixMap.get(key));
+                noSuffixMap.remove(key);
+                props.add(value);
                 props.remove(key);
             });
 
             Stream<String> fields = Stream.of(props.toArray(new String[0]));
-            fields.forEach((s) -> setValue(s, noPrefixMap.get(s)));
+            fields.forEach((s) -> setValue(s, noSuffixMap.get(s)));
         }
 
         // 取消数据标哥标识
@@ -248,7 +249,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
                 } else if (propertyType.equals(DynamicObject.class) && dynamicProperty instanceof MulBasedataProp && value instanceof List) {
                     MulBasedataProp property = (MulBasedataProp) getModel().getDataEntityType().getProperty(key);
                     DynamicObjectCollection dynamicObjectCollection = new DynamicObjectCollection();
-                        HRBaseServiceHelper serviceHelper = new HRBaseServiceHelper(property.getBaseEntityId());
+                    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"));
@@ -293,8 +294,8 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
     private void setEstablishmentDateToBsed(Date date) {
         if (date != null) {
             getModel().setValue(PositionBillConstant.NCKD_BSED, date);
-            DynamicProperty property = this.getModel().getDataEntityType().getProperty(PositionBillConstant.NCKD_BSED);
-            DataEntityState dataEntityState = this.getModel().getDataEntity().getDataEntityState();
+            DynamicProperty property = getModel().getDataEntityType().getProperty(PositionBillConstant.NCKD_BSED);
+            DataEntityState dataEntityState = getModel().getDataEntity().getDataEntityState();
             dataEntityState.setBizChanged(property.getOrdinal(), false);
         }
     }
@@ -368,7 +369,7 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
     }
 
     private void propertyChangedGetNumber(String fieldKey, Object oldValue) {
-        switch (fieldKey) {// 549
+        switch (fieldKey) {
             case PositionBillConstant.NCKD_POSITION:
                 String codeRuleNumber = getView().getPageCache().get(PositionBillConstant.PC_CODERULENUMBER);
                 if (!StringUtils.isEmpty(codeRuleNumber)) {

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

@@ -0,0 +1,38 @@
+package nckd.jxccl.hrmp.hbpm.plugin.form.hr;
+
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.field.BasedataEdit;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+
+import java.util.EventObject;
+
+/**
+ * 岗位申请-岗位变更表单插件
+ * @from: kd.hr.homs.formplugin.web.orgbatch.AdminOrgBatchDetailParentPlugin
+ * @author: jtd
+ * @date: 2025/12/28 15:47
+ */
+public class PosBillEntryChangeFormPlugin extends PosBillEntryUpdatePlugin {
+
+    @Override
+    public void initialize() {
+        super.initialize();
+        suffix = PositionBillConstant.CHANGE_TAG;
+        lineSuffix = "_" + suffix;
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        suffix = PositionBillConstant.CHANGE_TAG;
+        lineSuffix = "_" + suffix;
+        super.afterDoOperation(afterDoOperationEventArgs);
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+
+        BasedataEdit control = getView().getControl(PositionBillConstant.NCKD_PARENT);
+        control.addBeforeF7SelectListener(this);
+    }
+}

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

@@ -0,0 +1,428 @@
+package nckd.jxccl.hrmp.hbpm.plugin.form.hr;
+
+import kd.bos.common.enums.EnableEnum;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.IDataEntityType;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
+import kd.bos.dataentity.metadata.dynamicobject.DynamicProperty;
+import kd.bos.dataentity.serialization.SerializationUtils;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.datamodel.AbstractFormDataModel;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.property.BasedataProp;
+import kd.bos.entity.property.EntryProp;
+import kd.bos.entity.property.LongProp;
+import kd.bos.entity.property.MulBasedataProp;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.ConfirmTypes;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.ListShowParameter;
+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.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;
+import kd.hr.hbp.common.util.HRDynamicObjectUtils;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.hr.homs.formplugin.web.orgbatch.AdminOrgBatchDetailUpdatePlugin;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PosBillEntryFastChgHelper;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.common.hr.PatternUtil;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 岗位申请单分录修改插件
+ * @from: kd.hr.homs.formplugin.web.orgbatch.AdminOrgBatchDetailUpdatePlugin
+ * @author: jtd
+ * @date: 2025/12/28 15:48
+ */
+public class PosBillEntryUpdatePlugin extends AbstractFormPlugin implements BeforeF7SelectListener {
+    private static final Log LOG = LogFactory.getLog(AdminOrgBatchDetailUpdatePlugin.class);
+    public static String suffix;
+    public static String lineSuffix;
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        getModel().setDataChanged(false);
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+        Long billId = getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_BILLID);
+        Object positionBsed = getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_POSITION_BSED);
+        long positionBsedTime = positionBsed != null ? Long.parseLong(String.valueOf(positionBsed)) : HRDateTimeUtils.getNowDate().getTime();
+        long id = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
+        if (id == 0L) {
+            Object idStr = getView().getFormShowParameter().getCustomParam(PositionBillConstant.ID_KEY);
+            if (idStr != null) {
+                getModel().setValue(PositionBillConstant.ID_KEY, Long.valueOf(String.valueOf(idStr)));
+            }
+        }
+
+        getModel().setValue(PositionBillConstant.NCKD_BILLID, billId);
+        getModel().setValue(PositionBillConstant.ENABLE, EnableEnum.YES.getCode());
+
+        DynamicObject orgDy = getModel().getDataEntity().getDynamicObject(PositionBillConstant.NCKD_ORG_KEY);
+        getPageCache().put(PositionBillConstant.PC_MASTERORG, orgDy != null ? String.valueOf(orgDy.getLong(PositionBillConstant.ID_KEY)) : EnableEnum.NO.getCode());
+        getModel().setValue(PositionBillConstant.NCKD_BSED, new Date(positionBsedTime));
+        Object positionIdStr = getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_POSITIONID);
+        if (positionIdStr != null) {
+            Long positionId = Long.valueOf(String.valueOf(positionIdStr));
+            setInfoFromDb(positionId, false);
+        }
+
+        getModel().beginInit();
+        setInfoFromEntry();
+        getModel().endInit();
+        getModel().setDataChanged(false);
+    }
+
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        BasedataEdit position = getView().getControl(PositionBillConstant.NCKD_POSITION);
+        position.addBeforeF7SelectListener(this);
+
+        for(String registerBeforeF7Listener : getRegisterBeforeF7ListenerControlList()) {
+            BasedataEdit basedataEdit = getControl(registerBeforeF7Listener);
+            if (basedataEdit != null) {
+                basedataEdit.setF7BatchFill(false);
+                basedataEdit.addBeforeF7SelectListener(this);
+            }
+        }
+
+    }
+
+    private List<String> getRegisterBeforeF7ListenerControlList() {
+        //return Arrays.asList(PositionBillConstant.NCKD_PARENT, PositionBillConstant.NCKD_ORG_KEY);
+        return Collections.singletonList(PositionBillConstant.NCKD_ORG_KEY);
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+        String fieldKey = beforeF7SelectEvent.getProperty().getName();
+        if (PositionBillConstant.NCKD_POSITION.equals(fieldKey)) {
+            AuthorizedOrgResult authorizedOrgResult = PositionBillServiceHelper.getOrgAuth(getView());
+            if (!authorizedOrgResult.isHasAllOrgPerm()) {
+                List<Long> hasPermOrgList = authorizedOrgResult.getHasPermOrgs();
+                beforeF7SelectEvent.getCustomQFilters().add(new QFilter(String.join(".", PositionBillConstant.ADMINORG, PositionBillConstant.BOID_KEY), QCP.in, hasPermOrgList));
+            }
+            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);
+            }
+
+            beforeF7SelectEvent.getFormShowParameter().setCustomParam(PositionBillConstant.CP_SEARCHDATE, new Date());
+            getPageCache().put(PositionBillConstant.PC_ISCHANGEPOSITION, Boolean.TRUE.toString());
+        } else if (PositionBillConstant.NCKD_PARENT.equals(fieldKey)) {
+            Long positionId = getModel().getDataEntity().getLong(PositionBillConstant.NCKD_POSITIONID_KEY);
+            // 使用岗位BOID查下级岗位,岗位的上级岗位存储的是BOID
+            Long positionBoId = getModel().getDataEntity().getDynamicObject(PositionBillConstant.NCKD_POSITION_KEY).getLong(PositionBillConstant.BOID_KEY);
+            Date positionBsed = getModel().getDataEntity().getDate(PositionBillConstant.NCKD_BSED);
+            List<Long> positionIds = PositionBillServiceHelper.getPositionAndChildren(positionBoId, positionBsed);
+            // 固定过滤岗位
+            positionIds.add(positionId);
+            beforeF7SelectEvent.getCustomQFilters().add(new QFilter(PositionBillConstant.ID_KEY, QCP.not_in, positionIds));
+
+            ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
+            Date date = DateUtils.truncate(new Date(), 5);
+            showParameter.getCustomParams().put(PositionBillConstant.CP_SEARCHDATE, date);
+        } else if (PositionBillConstant.NCKD_ORG_KEY.equals(fieldKey)) {
+            HasPermOrgResult permOrgResult = PermissionServiceHelper.getUserHasPermOrgs(RequestContext.get().getCurrUserId(), false);
+            if (!permOrgResult.hasAllOrgPerm()) {
+                List<Long> hasPermOrgs = permOrgResult.getHasPermOrgs();
+                beforeF7SelectEvent.getCustomQFilters().add(new QFilter(PositionBillConstant.ID_KEY, QCP.in, hasPermOrgs));
+            }
+        }
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs changedArgs) {
+        String fieldKey = changedArgs.getProperty().getName();
+        switch (fieldKey) {
+            case PositionBillConstant.NCKD_POSITION:
+                positionChanged(changedArgs);
+                break;
+            case PositionBillConstant.NCKD_ORG_KEY:
+                PosBillEntryFastChgHelper.orgPropertyChanged(changedArgs, getView(), this);
+        }
+
+    }
+
+    private void positionChanged(PropertyChangedArgs changedArgs) {
+        if (Boolean.TRUE.toString().equals(getPageCache().get(PositionBillConstant.PC_ISCHANGEPOSITION))) {
+            getPageCache().put(PositionBillConstant.PC_ISCHANGEPOSITION, Boolean.FALSE.toString());
+            if (changedArgs.getChangeSet()[0].getNewValue() == null) {
+                getModel().setValue(PositionBillConstant.NCKD_POSITION_KEY, changedArgs.getChangeSet()[0].getOldValue());
+                return;
+            }
+
+            DynamicObject position = (DynamicObject) changedArgs.getChangeSet()[0].getOldValue();
+            DynamicObject newPosition = (DynamicObject) changedArgs.getChangeSet()[0].getNewValue();
+            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);
+                getView().showConfirm("切换岗位后,当前已修改的内容将会丢失,是否继续?", "", MessageBoxOptions.OKCancel, ConfirmTypes.Default, confirmCallBackListener, null, positionIdOld + "#" + positionIdNew);
+            }
+        }
+
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent event) {
+        super.confirmCallBack(event);
+        int result = event.getResult().getValue();
+        getView().getFormShowParameter();
+        switch (event.getCallBackId()) {
+            case PositionBillConstant.NCKD_POSITION:
+                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);
+                }
+            case PositionBillConstant.CB_CHG_ORG:
+                if (event.getResult().getValue() == MessageBoxResult.Yes.getValue()) {
+                    getView().getPageCache().put(PositionBillConstant.PC_MASTERORG, String.valueOf(getModel().getDataEntity().getLong(String.join(".", PositionBillConstant.NCKD_ORG_KEY, PositionBillConstant.ID_KEY))));
+                    getModel().beginInit();
+                    PosBillEntryFastChgHelper.cleanOrgBaseInfo(getModel().getDataEntity().getLong(String.join(".", PositionBillConstant.NCKD_ORG_KEY, PositionBillConstant.ID_KEY)), getView());
+                    getModel().endInit();
+                } else {
+                    Long masterOrgId = Long.valueOf(getPageCache().get(PositionBillConstant.PC_MASTERORG));
+                    getModel().beginInit();
+                    getModel().setValue(PositionBillConstant.NCKD_ORG_KEY, masterOrgId.equals(0L) ? null : masterOrgId);
+                    getView().updateView(PositionBillConstant.NCKD_ORG_KEY);
+                    getModel().endInit();
+                }
+            default:
+        }
+    }
+
+    protected void setInfoFromEntry() {
+        Object selectObject = getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_SELECTOBJECT);
+        if (selectObject != null) {
+            Map<String, Object> map = SerializationUtils.fromJsonString(selectObject.toString(), Map.class);
+            Map<String, Object> noSuffixMap = map.entrySet().stream().collect(HashMap::new, (m, v) -> m.put(PositionBillServiceHelper.getNoLineSuffixProp(v.getKey(), lineSuffix), v.getValue()), HashMap::putAll);
+            List<String> props = new ArrayList();
+
+            for(String prop : noSuffixMap.keySet()) {
+                if (PatternUtil.isExProperty(prop)) {
+                    props.add(prop);
+                }
+            }
+
+            // 获取分录需要转换的键值,将单据分录字段转换转成分录页面字段
+            Map<String, String> transKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
+            transKeyMap.forEach((key, value) -> {
+                noSuffixMap.put(value, noSuffixMap.get(key));
+                noSuffixMap.remove(key);
+                props.add(value);
+                props.remove(key);
+            });
+
+            Stream<String> fields = Stream.of(props.toArray(new String[0]));
+            fields.forEach((s) -> setValue(s, noSuffixMap.get(s)));
+
+            setValue(PositionBillConstant.NCKD_BILLID, getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_BILLID));
+        }
+
+    }
+
+    protected void setInfoFromDb(Long positionId, boolean positionChange) {
+        Object positionBsed = getView().getFormShowParameter().getCustomParam(PositionBillConstant.CP_POSITION_BSED);
+        long positionBsedTime = positionBsed != null ? Long.parseLong(String.valueOf(positionBsed)) : HRDateTimeUtils.getNowDate().getTime();
+        if (positionId != 0L) {
+            Object entryId = getView().getFormShowParameter().getCustomParam(PositionBillConstant.ID_KEY);
+            HRBaseServiceHelper positionBillEntryDAO = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);
+            boolean entryIdExists = positionBillEntryDAO.isExists(entryId);
+            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);
+                getModel().setValue(PositionBillConstant.NCKD_POSITIONID_KEY, positionId);
+                if (lineSuffix.endsWith("_"+PositionBillConstant.CHANGE_TAG)) {
+                    getModel().setValue(PositionBillConstant.NCKD_PARENT, null);
+                } else {
+                    getModel().setValue(PositionBillConstant.NCKD_PARENT, PositionBillServiceHelper.getHisId(positionMasterInfo.getLong(String.join(".", PositionBillConstant.NCKD_PARENT, PositionBillConstant.ID_KEY))));
+                }
+
+                Object orgParam = getView().getFormShowParameter().getCustomParam(PositionBillConstant.ORG_KEY);
+                if (orgParam != null) {
+                    getModel().beginInit();
+                    getModel().setValue(PositionBillConstant.NCKD_ORG_KEY, orgParam);
+                    getModel().endInit();
+                    getView().updateView(PositionBillConstant.NCKD_ORG_KEY);
+                }
+
+                MainEntityType dataEntityType = getModel().getDataEntityType();
+                DataEntityPropertyCollection properties = dataEntityType.getProperties();
+                Map<String, IDataEntityProperty> allFields = ((MainEntityType) positionMasterInfo.getDataEntityType()).getAllFields();
+
+                // 获取分录需要转换的键值
+                Map<String, String> posBillEntryTransKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
+                // 获取岗位需要转换的键值
+                Map<String, String> positionTransKeyMap = PositionBillServiceHelper.getPositionTransKeyMap();
+                // 获取分录属性
+                Map<String, IDataEntityProperty> entryPropMap = new HashMap<String, IDataEntityProperty>();
+                for(IDataEntityProperty property : properties) {
+                    String propName = property.getName();
+                    if (property instanceof EntryProp) {
+                        getModel().deleteEntryData(propName);
+                        entryPropMap.put(positionTransKeyMap.getOrDefault(propName, propName), property);
+                        continue;
+                    }
+
+                    if (positionTransKeyMap.containsKey(propName) && allFields.containsKey(positionTransKeyMap.getOrDefault(propName, ""))) {
+                        getModel().setValue(propName, positionMasterInfo.get(positionTransKeyMap.getOrDefault(propName, "")));
+                    } else if ((PatternUtil.isExProperty(propName) || posBillEntryTransKeyMap.containsValue(propName)) && allFields.containsKey(propName)) {
+                        getModel().setValue(propName, positionMasterInfo.get(propName));
+                    }
+                }
+
+                // 处理分录数据
+                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()) {
+                    DynamicObjectCollection fromCollection = positionMasterInfo.getDynamicObjectCollection(dataEntryProp.getValue());
+                    DynamicObjectCollection toCollection = getModel().getDataEntity().getDynamicObjectCollection(dataEntryProp.getKey());
+                    if (fromCollection == null || fromCollection.isEmpty()) {
+                        continue;
+                    }
+
+                    for (DynamicObject fromObj : fromCollection) {
+                        HRDynamicObjectUtils.copy(fromObj, toCollection.addNew());
+                    }
+                }
+
+                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));
+            }
+        }
+    }
+
+    private void setValue(String key, Object value) {
+        if (getModel().getProperty(key) != null) {
+            Class<?> propertyType = getModel().getDataEntityType().getProperty(key).getPropertyType();
+            DynamicProperty dynamicProperty = getModel().getDataEntityType().getProperty(key);
+            if (value != null) {
+                if (propertyType.equals(DynamicObject.class) && dynamicProperty instanceof BasedataProp) {
+                    Object id = ((Map) value).get(PositionBillConstant.ID_KEY);
+                    if (id != null && !HRStringUtils.equals(value.toString(), "0")) {
+                        getModel().setValue(key, id);
+                    }
+                } else if (propertyType.equals(DynamicObject.class) && dynamicProperty instanceof MulBasedataProp && value instanceof List) {
+                    MulBasedataProp property = (MulBasedataProp) getModel().getDataEntityType().getProperty(key);
+                    DynamicObjectCollection dynamicObjectCollection = new DynamicObjectCollection();
+                    HRBaseServiceHelper serviceHelper = new HRBaseServiceHelper(property.getBaseEntityId());
+                    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"));
+                            DynamicObject emptyDynamicObject = serviceHelper.generateEmptyDynamicObject();
+                            emptyDynamicObject.set(PositionBillConstant.ID_KEY, ((Map) map).get("fbasedataid_id"));
+                            dy.set("fbasedataid", emptyDynamicObject);
+                            dynamicObjectCollection.add(dy);
+                        } else {
+                            Object fbasedataid = ((Map) map).get("fbasedataid");
+                            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);
+                                DynamicObject emptyDynamicObject = serviceHelper.generateEmptyDynamicObject();
+                                emptyDynamicObject.set(PositionBillConstant.ID_KEY, id);
+                                dy.set("fbasedataid", emptyDynamicObject);
+                                dynamicObjectCollection.add(dy);
+                            }
+                        }
+
+                    });
+                    getModel().setValue(key, dynamicObjectCollection.size() != 0 ? dynamicObjectCollection : null);
+                } else {
+                    getModel().setValue(key, value);
+                }
+
+            }
+        }
+    }
+
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        String key = afterDoOperationEventArgs.getOperateKey();
+        OperationResult result = afterDoOperationEventArgs.getOperationResult();
+        if (result != null && HRStringUtils.equals(key, PositionBillConstant.SAVE_OP) && result.isSuccess()) {
+            DynamicObject data = getModel().getDataEntity();
+            Map<String, Object> map = new HashMap(1);
+            DynamicObject dataEntity = getModel().getDataEntity(true);
+            IDataEntityType dataEntityType = dataEntity.getDataEntityType();
+
+            for(IDataEntityProperty property : dataEntityType.getProperties()) {
+                String propName = property.getName();
+                if (PatternUtil.isExProperty(propName) && !(property instanceof LongProp)) {
+                    map.put(propName, data.get(propName));
+                }
+            }
+
+            // 获取分录需要转换的键值
+            Map<String, String> posBillEntryTransKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
+            posBillEntryTransKeyMap.forEach((k, v) -> {
+                if (map.containsKey(v)) {
+                    map.put(k, map.get(v));
+                    map.remove(k);
+                } else {
+                    map.put(k, data.get(v));
+                }
+            });
+
+            Map<String, Object> suffixMap = map.entrySet().stream().collect(HashMap::new, (m, v) -> m.put(v.getKey()+lineSuffix, v.getValue()), HashMap::putAll);
+            suffixMap.put(PositionBillConstant.ID_KEY, data.getLong(PositionBillConstant.ID_KEY));
+            getView().returnDataToParent(suffixMap);
+            getView().close();
+        }
+
+    }
+
+}

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

@@ -6,19 +6,32 @@ import kd.bos.bill.OperationStatus;
 import kd.bos.common.enums.EnableEnum;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.ILocaleString;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
 import kd.bos.dataentity.utils.ObjectUtils;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
 import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.property.BasedataProp;
+import kd.bos.form.ConfirmCallBackListener;
 import kd.bos.form.FormShowParameter;
 import kd.bos.form.IFormView;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.events.ClickListener;
+import kd.bos.form.control.events.ItemClickEvent;
 import kd.bos.form.events.AfterDoOperationEventArgs;
 import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
 import kd.bos.form.field.BasedataEdit;
 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.list.ListShowParameter;
+import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
 import kd.hr.hbp.common.util.HRStringUtils;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.business.utils.hr.PositionBillUtil;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 import java.util.EventObject;
@@ -30,7 +43,7 @@ import java.util.Map;
  * @author: jtd
  * @date: 2025-11-04 9:35
  */
-public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements BeforeF7SelectListener {
+public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements ClickListener, BeforeF7SelectListener {
 
     @Override
     public void beforeBindData(EventObject e) {
@@ -70,36 +83,42 @@ public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements B
 
         BasedataEdit adminorg = getView().getControl(PositionBillConstant.NCKD_ADMINORG);
         adminorg.addBeforeF7SelectListener(this);
-
         BasedataEdit position = getView().getControl(PositionBillConstant.NCKD_POSITION);
         position.addBeforeF7SelectListener(this);
-
         BasedataEdit parent = getView().getControl(PositionBillConstant.NCKD_PARENT);
         parent.addBeforeF7SelectListener(this);
+        addItemClickListeners(PositionBillConstant.NCKD_ADVCONTOOLBARAP11_KEY);
     }
 
     @Override
     public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
         String fieldKey = beforeF7SelectEvent.getProperty().getName();
-        // 替换组织F7模板
-        if (PositionBillConstant.NCKD_ADMINORG.equals(fieldKey)) {
-            ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
-            showParameter.setFormId(PositionBillConstant.HAOS_ORGTREELISTF7_ENTITY);
-            //showParameter.setCaption("行政组织");
-        }
-
-        // 替换岗位F7模板
-        if (PositionBillConstant.NCKD_POSITION.equals(fieldKey)) {
-            ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
-            showParameter.setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
-            showParameter.setCaption("岗位");
-        }
+        DynamicObject orgDy = getModel().getDataEntity().getDynamicObject(PositionBillConstant.NCKD_ORG);
+        MainEntityType entityType = EntityMetadataCache.getDataEntityType(getView().getEntityId());
+        IDataEntityProperty property = entityType.getAllFields().get(fieldKey);
+        Boolean baseDataCtrl = BaseDataServiceHelper.checkBaseDataCtrl(((BasedataProp) property).getBaseEntityId());
+        if (baseDataCtrl && orgDy == null && !HRStringUtils.equals(PositionBillConstant.NCKD_PARENT, fieldKey) && !HRStringUtils.equals(PositionBillConstant.NCKD_ORG, fieldKey)) {
+            getView().showTipNotification("请先选择组织体系管理组织。");
+            beforeF7SelectEvent.setCancel(true);
+        } else {
+            switch (fieldKey) {
+                case PositionBillConstant.NCKD_ADMINORG:
+                    // 替换组织F7模板
+                    beforeF7SelectEvent.getFormShowParameter().setFormId(PositionBillConstant.HAOS_ORGTREELISTF7_ENTITY);
+                    beforeF7SelectEvent.getFormShowParameter().setCaption("行政组织");
+                    break;
+                case PositionBillConstant.NCKD_POSITION:
+                    // 替换岗位F7模板
+                    beforeF7SelectEvent.getFormShowParameter().setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
+                    beforeF7SelectEvent.getFormShowParameter().setCaption("岗位");
+                    break;
+                case PositionBillConstant.NCKD_PARENT:
+                    DynamicObject positionObject = (DynamicObject) getModel().getValue(PositionBillConstant.NCKD_POSITION_KEY);
+                    PositionBillServiceHelper.setParentFilter(PositionBillUtil.getView(getView(), PositionBillConstant.NCKD_POSITIONBILL_ENTITY), positionObject, beforeF7SelectEvent);
+                    beforeF7SelectEvent.getFormShowParameter().setCaption("上级岗位");
+                    beforeF7SelectEvent.getFormShowParameter().setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
+            }
 
-        // 替换上级岗位F7模板
-        if (PositionBillConstant.NCKD_PARENT.equals(fieldKey)) {
-            ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
-            showParameter.setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
-            showParameter.setCaption("上级岗位");
         }
     }
 
@@ -116,6 +135,31 @@ public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements B
         }
     }
 
+    public void itemClick(ItemClickEvent evt) {
+        super.itemClick(evt);
+        if (PositionBillConstant.NCKD_TB_DEL_KEY.equals(evt.getItemKey())) {
+            EntryGrid posDutyEntryGrid = getView().getControl(PositionBillConstant.NCKD_POSDUTY_ENTRY_ENTITY_KEY);
+            int length = posDutyEntryGrid.getSelectRows().length;
+            if (length > 0) {
+                ConfirmCallBackListener deleteEntryCallBackListener = new ConfirmCallBackListener(PositionBillConstant.CB_DEL_ROW, this);
+                getView().showConfirm(String.format("你已选中%s条记录,删除后将不可恢复,是否继续?", length), MessageBoxOptions.OKCancel, deleteEntryCallBackListener);
+            } else {
+                getView().showTipNotification("请选中需要操作的行。");
+            }
+        }
+
+    }
+
+    public void confirmCallBack(MessageBoxClosedEvent event) {
+        super.confirmCallBack(event);
+        if (PositionBillConstant.CB_DEL_ROW.equals(event.getCallBackId()) && event.getResult().getValue() == MessageBoxResult.Yes.getValue()) {
+            EntryGrid strategyEntryGrid = getView().getControl(PositionBillConstant.NCKD_POSDUTY_ENTRY_ENTITY_KEY);
+            int[] rows = strategyEntryGrid.getSelectRows();
+            getModel().deleteEntryRows(PositionBillConstant.NCKD_POSDUTY_ENTRY_ENTITY_KEY, rows);
+        }
+
+    }
+
     /**
      * 设置组织体系管理组织
      */
@@ -136,12 +180,9 @@ public class PositionBillEntryFormPlugin extends AbstractFormPlugin implements B
     @Override
     public void beforeDoOperation(BeforeDoOperationEventArgs args) {
         super.beforeDoOperation(args);
-
-
         AbstractOperate operate = (AbstractOperate) args.getSource();
         String operateKey = operate.getOperateKey();
         if (HRStringUtils.equals(operateKey, PositionBillConstant.SAVE_OP) || HRStringUtils.equals(operateKey, PositionBillConstant.SAVE_AND_NEW_OP)) {
-
             IFormView parentView = getBillFormView(getView());
             // 组织下同级岗位名称数据 {orgBoid:{positionId:positionName}}
             Map<String, Map<String, ILocaleString>> orgBoIdToSiblingNameMap = Maps.newHashMapWithExpectedSize(16);

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

@@ -25,10 +25,12 @@ import kd.bos.form.ConfirmCallBackListener;
 import kd.bos.form.ConfirmTypes;
 import kd.bos.form.IFormView;
 import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
 import kd.bos.form.ShowType;
 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.ClosedCallBackEvent;
 import kd.bos.form.events.MessageBoxClosedEvent;
 import kd.bos.form.field.BasedataEdit;
@@ -54,18 +56,20 @@ import kd.hr.hbp.common.util.HRDynamicObjectUtils;
 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.hr.PositionBillAfterBindDataService;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillClosedCallBackService;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillConfirmCallBackService;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillPropertyChangedService;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillAfterBindDataService;
+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;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
+import nckd.jxccl.hrmp.hbpm.common.hr.PositionChangeTypeEnum;
 import org.apache.commons.lang3.time.DateUtils;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
 import java.util.EventObject;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -176,6 +180,44 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
         closedCallBackService.closedCallBack(closedCallBackEvent);
     }
 
+    @Override
+    public void beforeClosed(BeforeClosedEvent e) {
+        super.beforeClosed(e);
+
+        String isCancelOverFlag = getView().getPageCache().get(PositionBillConstant.PC_ISCANCELOVER);
+        if (HRStringUtils.isNotEmpty(isCancelOverFlag) && Boolean.TRUE.toString().equals(isCancelOverFlag)) {
+            getModel().setDataChanged(false);
+            getView().getPageCache().put(PositionBillConstant.PC_ISCANCELOVER, Boolean.FALSE.toString());
+        } else {
+            boolean hasEntryData = false;
+            DynamicObject dataEntity = getModel().getDataEntity(Boolean.TRUE);
+
+            for (PositionChangeTypeEnum positionChangeTypeEnum : PositionChangeTypeEnum.values()) {
+                DynamicObjectCollection entryDynColl = dataEntity.getDynamicObjectCollection(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, positionChangeTypeEnum.getTag()));
+                hasEntryData = entryDynColl != null && entryDynColl.size() > 0;
+                if (hasEntryData) {
+                    break;
+                }
+            }
+
+            HRBaseServiceHelper orgBatchChgBillHelper = new HRBaseServiceHelper(PositionBillConstant.NCKD_POSITIONBILL_ENTITY);
+            long billId = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
+            QFilter idFilter = new QFilter(PositionBillConstant.ID_KEY, QCP.equals, billId);
+            boolean isExistFromDb = orgBatchChgBillHelper.isExists(idFilter);
+            if (hasEntryData && !isExistFromDb) {
+                e.setCancel(true);
+                ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener(PositionBillConstant.CB_CLOSE_BILL, this);
+                Map<Integer, String> btnNameMaps = new HashMap();
+                btnNameMaps.put(MessageBoxResult.Cancel.getValue(), "返回编辑");
+                btnNameMaps.put(MessageBoxResult.Yes.getValue(), "直接退出");
+                MessageBoxOptions options = MessageBoxOptions.OKCancel;
+                String msg = "检测到您有更改内容,是否不保存直接退出?若直接退出,将丢失这些更改。";
+                getView().showConfirm(msg, getModel().getChangeDesc(), options, ConfirmTypes.Save, confirmCallBacks, btnNameMaps);
+            }
+
+        }
+    }
+
     private void deleteRowsConfirm(String callBackId) {
         long id = getModel().getDataEntity().getLong(PositionBillConstant.ID_KEY);
         HRBaseServiceHelper helper = new HRBaseServiceHelper(PositionBillConstant.HBPM_POSITIONHR);
@@ -194,11 +236,11 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
             String auditStatusName = RegBillStatusEnum.getName(billstatus);
             getView().showErrorNotification(String.format("%s的单据不能删除调整明细。", auditStatusName));
         } else {
-            EntryGrid coopRelEntryGrid = getView().getControl(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, callBackId.substring(callBackId.lastIndexOf("_")+1)));
-            if (null == coopRelEntryGrid) {
+            EntryGrid strategyEntryGrid = getView().getControl(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, callBackId.substring(callBackId.lastIndexOf("_")+1)));
+            if (null == strategyEntryGrid) {
                 getView().showTipNotification("请选中需要删除的行。");
             } else {
-                int[] selectRows = coopRelEntryGrid.getSelectRows();
+                int[] selectRows = strategyEntryGrid.getSelectRows();
                 int length = selectRows.length;
                 if (selectRows.length > 0) {
                     ConfirmCallBackListener deleteEntryCallBackListener = new ConfirmCallBackListener(callBackId, this);
@@ -230,7 +272,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
         }
 
         if (!status.equals(OperationStatus.VIEW)) {
-            formShowParameter.setCloseCallBack(new CloseCallBack(getPluginName(), PositionBillConstant.ADD_TAG));
+            formShowParameter.setCloseCallBack(new CloseCallBack(getPluginName(), PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY));
         }
 
         formShowParameter.setCustomParam(PositionBillConstant.CP_SELECTOBJECT, SerializationUtils.toJsonString(map));
@@ -283,11 +325,13 @@ public class PositionBillFormPlugin extends AbstractFormPlugin implements Before
                 ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
                 if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG))) {
                     showParameter.getCustomParams().put(PositionBillConstant.CP_SEARCHDATE, date);
-                    PositionBillServiceHelper.filterF7Position(getView(), beforeF7SelectEvent, null);
+                    PositionBillServiceHelper.filterF7Org(getView(), beforeF7SelectEvent, null);
                     setFilterByOrg(beforeF7SelectEvent);
                 } else if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG))) {
-                    // 岗位变更-上级岗位业务逻辑
-                } else if (fieldKey.equals(String.join("_", PositionBillConstant.ORG_KEY, PositionBillConstant.CHANGE_TAG))) {
+                    DynamicObject position = focusEntryDyn.getDynamicObject(String.join("_", PositionBillConstant.NCKD_PARENT, PositionBillConstant.CHANGE_TAG));
+                    PositionBillServiceHelper.setParentFilter(getView(), position, beforeF7SelectEvent);
+                    beforeF7SelectEvent.getFormShowParameter().setCaption("上级岗位");
+                } else if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_ORG_KEY, PositionBillConstant.CHANGE_TAG))) {
                     HasPermOrgResult permOrgResult = PermissionServiceHelper.getUserHasPermOrgs(RequestContext.get().getCurrUserId(), false);
                     if (!permOrgResult.hasAllOrgPerm()) {
                         List<Long> hasPermOrgs = permOrgResult.getHasPermOrgs();

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

@@ -19,7 +19,7 @@ import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.constants.history.HisModelDataStatusEnum;
 import kd.hr.hbp.common.util.HRStringUtils;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 import java.util.List;
@@ -76,7 +76,7 @@ public class PosBillEntryNewPositionTempSaveOpPlugin extends AbstractOperationSe
         OperateOption operateOption = OperateOption.create();
         List<DynamicObject> positionList = Lists.newArrayListWithExpectedSize(positionEntities.length);
         // 获取岗位需要转换的键值
-        Map<String, String> transKeyMap = PositionBillServiceHelper.getPositionTransKeyMap();
+        Map<String, String> positionTransKeyMap = PositionBillServiceHelper.getPositionTransKeyMap();
 
         for (DynamicObject positionEntity : positionEntities) {
             long positionId = positionEntity.getLong(positionIdKey);
@@ -87,7 +87,7 @@ public class PosBillEntryNewPositionTempSaveOpPlugin extends AbstractOperationSe
                 positionDyo = positionServiceHelper.generateEmptyDynamicObject();
             }
             // 将表单中的信息赋值到岗位信息中
-            PositionBillServiceHelper.getPositionHrDy(positionEntity, positionDyo, transKeyMap);// 调用保存会自动设置status、enable、datastatus
+            PositionBillServiceHelper.getPositionHrDy(positionEntity, positionDyo, positionTransKeyMap);// 调用保存会自动设置status、enable、datastatus
             // 设置ID为岗位ID
             positionDyo.set(PositionBillConstant.ID_KEY, positionId);
             // 设置 是否标准岗位

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

@@ -17,7 +17,7 @@ import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.util.HRObjectUtils;
 import kd.hr.hbp.common.util.HRStringUtils;
-import nckd.jxccl.hrmp.hbpm.business.hr.PositionBillServiceHelper;
+import nckd.jxccl.hrmp.hbpm.business.service.hr.PositionBillServiceHelper;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 import java.util.List;

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

@@ -64,7 +64,7 @@ public class PositionBillEntryNameValidator extends AbstractValidator {
             }
 
             if (option.containsVariable("isimport") && Boolean.parseBoolean(option.getVariableValue("isimport"))) {
-                // 业务逻辑
+                // 导入业务逻辑
             }
 
         }

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

@@ -38,7 +38,7 @@ public class PositionBillEntryNumberValidator extends AbstractValidator {
         }
 
         if (option.containsVariable("isimport") && Boolean.parseBoolean(option.getVariableValue("isimport"))) {
-            // 业务逻辑
+            // 导入业务逻辑
         }
 
     }