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

fix(hr): 解决岗位申请单权限控制和数据转换问题

- 在OrgBatchChgBillListPlugin中添加不控权设置
- 修复SendTaskOpPlugin中的空指针异常和错误消息处理
- 更新PositionBillClosedCallBackService使用正确的转换键值映射
- 重构PositionBillConfirmCallBackService的数据查询和转换逻辑
- 优化PositionBillPropertyChangedService的字段映射处理
- 增加PositionBillServiceHelper的权限验证和转换键值方法
- 添加PositionBillConstant新的实体标识常量
- 重构PositionBillFormPlugin的F7选择和数据绑定逻辑
- 修复PosBillEntryNewPositionTempSaveOpPlugin的岗位数据转换问题
jtd 2 недель назад
Родитель
Сommit
b1291881a3

+ 2 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/homs/plugin/form/orgbatch/OrgBatchChgBillListPlugin.java

@@ -125,6 +125,8 @@ public class OrgBatchChgBillListPlugin extends AbstractListPlugin {
             listShowParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
             // 必须设置为true,表示是可选择界面
             listShowParameter.setLookUp(true);
+            // 不控权
+            listShowParameter.setHasRight(true);
             // 设置是否多选
             listShowParameter.setMultiSelect(false);
             // 设置是否显示标题

+ 12 - 9
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/sdm/plugin/operate/SendTaskOpPlugin.java

@@ -1,5 +1,6 @@
 package nckd.jxccl.hr.sdm.plugin.operate;
 
+import com.google.common.collect.Lists;
 import kd.bos.coderule.api.CodeRuleInfo;
 import kd.bos.coderule.opplugin.util.OrgUtil;
 import kd.bos.common.enums.EnableEnum;
@@ -48,7 +49,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.StringJoiner;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -330,6 +330,9 @@ public class SendTaskOpPlugin extends AbstractOperationServicePlugIn {
             // 构建单据体
             DynamicObjectCollection sanDingTaskEntryDyoColl = sanDingTaskDyo.getDynamicObjectCollection(SanDingConstant.NCKD_ENTRYENTITY);
             List<Map<String, Long>> positionBoIdList = companyPositionMap.get(entryDyo.getLong(companyBoIdKey));
+            if (positionBoIdList == null || positionBoIdList.isEmpty()) {
+                continue;
+            }
             for (Map<String, Long> positionOrgMap : positionBoIdList) {
                 DynamicObject sanDingTaskEntryDyo = sanDingTaskEntryDyoColl.addNew();
                 // 岗位BOID
@@ -361,16 +364,16 @@ public class SendTaskOpPlugin extends AbstractOperationServicePlugIn {
             SANDING_TASK_MAP.put(entryDyo.getLong(SanDingConstant.ID_KEY), sanDingTaskDyo.getLong(SanDingConstant.ID_KEY));
         }
         // 保存
-        OperationResult operationResult = SaveServiceHelper.saveOperate(SanDingConstant.NCKD_SANDINGTASK_ENTITY, sanDingTaskDyoList.toArray(new DynamicObject[0]));
-        if (operationResult != null && !operationResult.isSuccess()) {
-            StringJoiner errorMsg = new StringJoiner(";");
-            for (IOperateInfo error : operationResult.getAllErrorOrValidateInfo()) {
-                errorMsg.add(error.getMessage());
+        OperationResult saveResult = SaveServiceHelper.saveOperate(SanDingConstant.NCKD_SANDINGTASK_ENTITY, sanDingTaskDyoList.toArray(new DynamicObject[0]));
+        if (saveResult != null && !saveResult.isSuccess()) {
+            List<String> errorMsgList = Lists.newArrayList();
+            for(IOperateInfo operateInfo : saveResult.getAllErrorOrValidateInfo()) {
+                errorMsgList.add(operateInfo.getMessage());
             }
-            if (!HRObjectUtils.isEmpty(operationResult.getMessage())) {
-                errorMsg.add(operationResult.getMessage());
+
+            if (!errorMsgList.isEmpty()) {
+                throw new KDBizException(String.join(System.lineSeparator(), errorMsgList));
             }
-            throw new KDBizException(errorMsg.toString());
         }
     }
 

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

@@ -72,7 +72,7 @@ public class PositionBillClosedCallBackService extends PositionBillBaseService {
         }
 
         // 获取需要转换的键值
-        Map<String, String> transKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSBILL_TRANSKEY_ENTITY, suffix);
+        Map<String, String> transKeyMap = PositionBillServiceHelper.getPosBillEntryReverseTransKeyMap();
         transKeyMap.forEach((key, value) -> {
             selectPropList.add(value);
             toSetValueEntryPropList.add(key);

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

@@ -4,6 +4,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
 import kd.bos.entity.operate.result.OperateErrorInfo;
 import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.entity.validate.ErrorLevel;
@@ -17,11 +19,15 @@ import kd.bos.orm.query.QFilter;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.util.HRStringUtils;
 import kd.hr.homs.business.domain.orgfast.repository.AdminOrgFastChgHelper;
+import kd.hr.homs.business.utils.PatternUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
 import nckd.jxccl.hrmp.hbpm.common.hr.PositionBillConstant;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -176,12 +182,40 @@ public class PositionBillConfirmCallBackService extends PositionBillBaseService
                 return;
             }
 
+            DataEntityPropertyCollection entryEntityInfo = getModel().getDataEntity(true).getDynamicObjectCollection(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, suffix)).getDynamicObjectType().getProperties();
+
+            // 获取要转换的键值,转成岗位字段
+            Map<String, String> transKeyMap = new HashMap<String, String>();
+            // 单据分录字段要先转分录页面字段
+            transKeyMap.putAll(PositionBillServiceHelper.getPosBillEntryTransKeyMap());
+            transKeyMap.putAll(PositionBillServiceHelper.getPositionTransKeyMap());
+            // 倒转,转成岗位字段: 单据分录字段
+            Map<String, String> reverseTransKeyMap = transKeyMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
+            // 获取岗位要排除的键值
+            List<String> positionExcludeKeyList = PositionBillServiceHelper.getPositionExcludeKeyList();
+
+            QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create().add(PositionBillConstant.ID_KEY);
+            for(IDataEntityProperty iDataEntityProperty : entryEntityInfo) {
+                if (PatternUtil.isExProperty(iDataEntityProperty.getName())) {
+                    String selectName = iDataEntityProperty.getName().substring(suffix.length() + 1);
+                    if (positionExcludeKeyList.contains(selectName)) {
+                        continue;
+                    } else if (transKeyMap.containsKey(selectName)) {
+                        queryFieldBuilder.add(reverseTransKeyMap.get(selectName));
+                    } else {
+                        queryFieldBuilder.add(selectName);
+                    }
+                }
+            }
+
             DynamicObject entryEntityDyn = PositionBillServiceHelper.getFocusEntry(suffix, getView(), row);
             long positionId = entryEntityDyn.getLong(PositionBillConstant.NCKD_POSITION + lineSuffix);
             QFilter filter = new QFilter(PositionBillConstant.ID_KEY, QCP.equals, positionId);
-            DynamicObject org = helper.queryOne("id,parentorg,simplename,adminorgtype,establishmentdate,corporateorg,tobedisableflag,adminorglayer,adminorgfunction,companyarea,city,workplace", filter.toArray());
+            DynamicObject position = helper.queryOne(queryFieldBuilder.buildSelect(), filter.toArray());
             long entryId = ORM.create().genLongId(PositionBillConstant.NCKD_POSITIONBILLENTRY_ENTITY);
-            entryEntityDyn.set("id", entryId);
+            entryEntityDyn.set(PositionBillConstant.ID_KEY, entryId);
+            // 设置单据分录字段值
+            reverseTransKeyMap.forEach((key, value) -> entryEntityDyn.set(key, position.get(value)));
 
             //setChangeSence(lineSuffix, entryEntityDyn, row);
             getView().updateView(PositionBillConstant.NCKD_ENTRYENTITY + lineSuffix);

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

@@ -64,16 +64,17 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
     }
 
     private void entrySelectF7Change(IDataEntityProperty property, String suffix, int row) {
-        DataEntityPropertyCollection entryEntityInfo = getModel().getDataEntity(true).getDynamicObjectCollection(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, suffix)).getDynamicObjectType().getProperties();
-        // 分录要转换的键值
-        Map<String, String> posBillTransKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSBILL_TRANSKEY_ENTITY);
-        // 岗位要转换的键值
-        Map<String, String> positionTransKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY);
+        String lineSuffix = "_"+suffix;
+        DataEntityPropertyCollection entryEntityInfo = getModel().getDataEntity(true).getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY+lineSuffix).getDynamicObjectType().getProperties();
+        // 获取分录要转换的键值,将单据分录字段转换转成分录页面字段
+        Map<String, String> posBillTransKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
+        // 获取岗位要转换的键值
+        Map<String, String> positionTransKeyMap = PositionBillServiceHelper.getPositionTransKeyMap();
 
         StringBuilder selectSqlBuilder = new StringBuilder();
         for(IDataEntityProperty iDataEntityProperty : entryEntityInfo) {
             if (PatternUtil.isExProperty(iDataEntityProperty.getName())) {
-                String selectName = iDataEntityProperty.getName().substring(suffix.length() + 1);
+                String selectName = iDataEntityProperty.getName().replace(lineSuffix, "");
                 if (posBillTransKeyMap.containsKey(selectName)) {
                     selectSqlBuilder.append(",").append(posBillTransKeyMap.get(selectName));
                 } else if (positionTransKeyMap.containsKey(selectName)) {
@@ -87,10 +88,9 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
         BasedataProp basedataProp = (BasedataProp) property;
         String baseEntityId = basedataProp.getBaseEntityId();
         Map<?, DynamicObject> dyMap = baseDataCacheMap.get(baseEntityId);
-        String lineSuffix = "_"+suffix;
         DynamicObject entryEntityDyn = PositionBillServiceHelper.getFocusEntry(suffix, getView(), row);
         DynamicObject position = null;
-        long positionId = entryEntityDyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION, PositionBillConstant.ID_KEY));
+        long positionId = entryEntityDyn.getLong(String.join(".", PositionBillConstant.NCKD_POSITION+lineSuffix, PositionBillConstant.ID_KEY));
         if (dyMap != null) {
             position = dyMap.get(positionId);
         }
@@ -108,7 +108,7 @@ public class PositionBillPropertyChangedService extends PositionBillBaseService
 
             for(IDataEntityProperty iDataEntityProperty : entryEntityInfo) {
                 if (PatternUtil.isExProperty(iDataEntityProperty.getName())) {
-                    entryEntityDyn.set(iDataEntityProperty.getName(), position.get(iDataEntityProperty.getName().substring(suffix.length() + 1)));
+                    entryEntityDyn.set(iDataEntityProperty.getName(), position.get(iDataEntityProperty.getName().replace(lineSuffix, "")));
                 }
             }
 

+ 54 - 42
code/hrmp/nckd-jxccl-hrmp/src/main/java/nckd/jxccl/hrmp/hbpm/business/hr/PositionBillServiceHelper.java

@@ -1,9 +1,11 @@
 package nckd.jxccl.hrmp.hbpm.business.hr;
 
+import com.google.common.collect.Maps;
 import com.kingdee.util.StringUtils;
 import kd.bos.bill.BillShowParameter;
 import kd.bos.bill.OperationStatus;
 import kd.bos.common.enums.EnableEnum;
+import kd.bos.context.RequestContext;
 import kd.bos.dataentity.OperateOption;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.serialization.SerializationUtils;
@@ -23,7 +25,9 @@ import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.MetadataServiceHelper;
 import kd.bos.servicehelper.operation.OperationServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRMServiceHelper;
 import kd.hr.hbp.common.constants.history.HisModelDataStatusEnum;
+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.HRObjectUtils;
@@ -120,6 +124,14 @@ public class PositionBillServiceHelper {
         }
     }
 
+    public static AuthorizedOrgResult getOrgAuth(IFormView iFormView) {
+        Long userId = RequestContext.get().getCurrUserId();
+        String permItemId = "47150e89000000ac";
+        String appId = iFormView.getFormShowParameter().getCheckRightAppId();
+        AuthorizedOrgResult permResult = HRMServiceHelper.invokeHRMPService("hrcs", "IHRCSBizDataPermissionService", "getUserAdminOrgsF7", new Object[]{userId, appId, PositionBillConstant.NCKD_POSITIONBILL_ENTITY, permItemId, "adminorgboid", Maps.newHashMapWithExpectedSize(0)});
+        return permResult;
+    }
+
     /**
      * 删除岗位新设暂存数据
      * @param positionIdList
@@ -151,30 +163,57 @@ public class PositionBillServiceHelper {
     }
 
     /**
-     * 获取转换键值
-     * @param entityNumber
-     * @return key->目标字段 value->源字段
+     * 获取岗位转换键值
+     * @return 目标字段: 源字段
      */
-    public static Map<String, String> getTransKeyMap(String entityNumber) {
-        return getTransKeyMap(entityNumber, null);
+    public static Map<String, String> getPositionTransKeyMap() {
+        String selectFields = QueryFieldBuilder.create().add(PositionBillConstant.NUMBER_KEY).add(PositionBillConstant.NAME_KEY).buildSelect();
+        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY).queryOriginalArray(selectFields, null);
+        Map<String, String> transKeyMap = Arrays.stream(transKeyDyos).collect(Collectors.toMap(
+                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NAME_KEY),
+                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NUMBER_KEY),
+                (oldValue, newValue) -> newValue)
+        );
+        return transKeyMap;
     }
 
     /**
-     * 获取转换键值
-     * @param entityNumber
-     * @return key->目标字段+suffix value->源字段
+     * 获取岗位申请分录转换键值
+     * @return 单据分录字段: 分录页面字段
      */
-    public static Map<String, String> getTransKeyMap(String entityNumber, String suffix) {
-        // 查询需要转换的键值
+    public static Map<String, String> getPosBillEntryTransKeyMap() {
+        return getPosBillEntryTransKeyMap(false);
+    }
+
+    /**
+     * 获取岗位申请分录转换键值(倒转)
+     * @return 分录页面字段: 单据分录字段
+     */
+    public static Map<String, String> getPosBillEntryReverseTransKeyMap() {
+        return getPosBillEntryTransKeyMap(true);
+    }
+
+    /**
+     * 获取岗位申请分录转换键值
+     * @return
+     */
+    private static Map<String, String> getPosBillEntryTransKeyMap(Boolean isReverse) {
         String selectFields = QueryFieldBuilder.create().add(PositionBillConstant.NUMBER_KEY).add(PositionBillConstant.NAME_KEY).buildSelect();
-        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(entityNumber).queryOriginalArray(selectFields, null);
+        DynamicObject[] transKeyDyos = HRBaseServiceHelper.create(PositionBillConstant.NCKD_PBENTRY_TRANSKEY_ENTITY).queryOriginalArray(selectFields, null);
         Map<String, String> transKeyMap = Arrays.stream(transKeyDyos).collect(Collectors.toMap(
-                transKeyDyo -> HRStringUtils.isBlank(suffix) ? transKeyDyo.getString(PositionBillConstant.NAME_KEY) : transKeyDyo.getString(PositionBillConstant.NAME_KEY)+suffix,
-                transKeyDyo -> transKeyDyo.getString(PositionBillConstant.NUMBER_KEY),
-                (oldValue, newValue) -> newValue));
+                transKeyDyo -> isReverse ? transKeyDyo.getString(PositionBillConstant.NUMBER_KEY) : transKeyDyo.getString(PositionBillConstant.NAME_KEY),
+                transKeyDyo -> isReverse ? transKeyDyo.getString(PositionBillConstant.NAME_KEY) : transKeyDyo.getString(PositionBillConstant.NUMBER_KEY),
+                (oldValue, newValue) -> newValue)
+        );
         return transKeyMap;
     }
 
+    public static List<String> getPositionExcludeKeyList() {
+        DynamicObject[] positionExcludeKeyList = HRBaseServiceHelper.create(PositionBillConstant.NCKD_POSITION_EXCLUDEKEY_ENTITY).queryOriginalArray(PositionBillConstant.NUMBER_KEY, null);
+        List<String> excludeKeyList = Arrays.stream(positionExcludeKeyList).map(positionExcludeKeyDyo -> positionExcludeKeyDyo.getString(PositionBillConstant.NUMBER_KEY)).collect(Collectors.toList());
+        return excludeKeyList;
+    }
+
     /**
      * 构建岗位
      * 用于校验岗位数据或获取/回收岗位编码
@@ -182,7 +221,7 @@ public class PositionBillServiceHelper {
      * @return
      */
     public static DynamicObject getPositionHrDy(DynamicObject addDy) {
-        return getPositionHrDy(addDy, getTransKeyMap(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY));
+        return getPositionHrDy(addDy, getPositionTransKeyMap());
     }
 
     /**
@@ -288,33 +327,6 @@ public class PositionBillServiceHelper {
         }
     }
 
-    public static void openEditAddPage(OperationStatus status, IDataModel iDataModel, IFormView iFormView) {
-        EntryGrid strategyEntryGrid = iFormView.getControl(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY);
-        int row = strategyEntryGrid.getEntryState().getFocusRow();
-        DynamicObject addDy = iDataModel.getDataEntity(true).getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).get(row);
-        Long adddyId = addDy.getLong(PositionBillConstant.ID_KEY);
-        Map map = HRDynamicObjectUtils.convertDynamicObjectToMap(addDy);
-        BillShowParameter formShowParameter = new BillShowParameter();
-        formShowParameter.setFormId(PositionBillConstant.NCKD_POSBILLENTRYADD_ENTITY);
-        formShowParameter.setCustomParam("position_bsed", iDataModel.getValue(PositionBillConstant.NCKD_EFFDT) == null ? HRDateTimeUtils.getNowDateTime().getTime() : ((Date) iDataModel.getValue(PositionBillConstant.NCKD_EFFDT)).getTime());
-        formShowParameter.setPkId(adddyId);
-        formShowParameter.setStatus(status);
-        formShowParameter.setCustomParam("billid", iDataModel.getDataEntity().getLong(PositionBillConstant.ID_KEY));
-        if (HRStringUtils.equals(iFormView.getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
-            formShowParameter.setHasRight(true);
-        }
-
-        if (!status.equals(OperationStatus.VIEW)) {
-            formShowParameter.setCloseCallBack(new CloseCallBack("nckd.jxccl.hrmp.hbpm.plugin.form.hr.PositionBillFormPlugin", PositionBillConstant.ADD_TAG));
-        }
-
-        formShowParameter.setCustomParam("selectObject", SerializationUtils.toJsonString(map));
-        formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
-        //formShowParameter.setCustomParam("OP_VALIDATOR_BILL_ORG_ALL_CHANGE_ORG_KEY", getThisBillAllValidateDataStr(dynamicObject));
-        //formShowParameter.setCustomParam("OP_VALIDATOR_BILL_ORG_NEW_ORG_NUMBERS_KEY", getThisBillOrgNumbersStr(dynamicObject));
-        iFormView.showForm(formShowParameter);
-    }
-
     public static OperationResult executeOperateOnlyValidate(String operationKey, DynamicObject[] positionDys, OperateOption option) {
         OperateOption operateOption = option;
         if (option == null) {

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

@@ -23,8 +23,10 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_POSBILLENTRYADD_ENTITY = "nckd_posbillentryadd";
     /** 岗位申请-变更信息实体标识 */
     public static final String NCKD_POSBILLENTRYCHANGE_ENTITY = "nckd_posbillentrychange";
-    /** 岗位申请单键值转换实体标识 */
-    public static final String NCKD_POSBILL_TRANSKEY_ENTITY = "nckd_posbill_transkey";
+    /** 岗位申请分录键值转换实体标识 */
+    public static final String NCKD_PBENTRY_TRANSKEY_ENTITY = "nckd_pbentry_transkey";
+    /** 岗位信息排除键值实体标识 */
+    public static final String NCKD_POSITION_EXCLUDEKEY_ENTITY = "nckd_position_excludekey";
 
     /** 新增标识 */
     public static final String ADD_TAG = "add";
@@ -83,5 +85,7 @@ public class PositionBillConstant extends FormConstant {
     public static final String NCKD_NUMBER_KEY = "nckd_number";
     /** 名称 */
     public static final String NCKD_NAME_KEY = "nckd_name";
+    /** 签发组织 */
+    public static final String NCKD_DISORG_KEY = "nckd_disorg";
 
 }

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

@@ -225,8 +225,8 @@ public class PosBillEntryAddFormPlugin extends AbstractFormPlugin {
                 }
             }
 
-            // 获取需要转换的键值
-            Map<String, String> transKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSBILL_TRANSKEY_ENTITY);
+            // 获取分录需要转换的键值,将单据分录字段转换转成分录页面字段
+            Map<String, String> transKeyMap = PositionBillServiceHelper.getPosBillEntryTransKeyMap();
             transKeyMap.forEach((key, value) -> {
                 noPrefixMap.put(value, noPrefixMap.get(key));
                 noPrefixMap.remove(key);

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

@@ -1,27 +1,58 @@
 package nckd.jxccl.hrmp.hbpm.plugin.form.hr;
 
+import com.google.common.collect.Maps;
 import kd.bos.bill.BillOperationStatus;
 import kd.bos.bill.BillShowParameter;
 import kd.bos.bill.OperationStatus;
+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.serialization.SerializationUtils;
 import kd.bos.entity.BillEntityType;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
 import kd.bos.entity.datamodel.events.PropertyChangedArgs;
 import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.property.BasedataProp;
+import kd.bos.ext.hr.entity.property.PositionFieldProp;
+import kd.bos.form.CloseCallBack;
 import kd.bos.form.ConfirmCallBackListener;
 import kd.bos.form.ConfirmTypes;
+import kd.bos.form.IFormView;
 import kd.bos.form.MessageBoxOptions;
+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.ClosedCallBackEvent;
 import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeBasedataSetValueEvent;
+import kd.bos.form.field.events.BeforeBasedataSetValueListener;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
 import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.list.ListShowParameter;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.mvc.bill.BillView;
 import kd.bos.orm.ORM;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
+import kd.bos.orm.util.CollectionUtils;
+import kd.bos.permission.api.HasPermOrgResult;
+import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
+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.hbp.common.util.concurrent.NullableConcurrentHashMap;
 import kd.hr.homs.business.domain.batchbill.repository.AdminOrgBatchChgHelper;
@@ -31,8 +62,13 @@ 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.common.hr.PositionBillConstant;
+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.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -41,7 +77,7 @@ import java.util.Objects;
  * @author: jtd
  * @date: 2025-10-25 13:38
  */
-public class PositionBillFormPlugin extends AbstractFormPlugin {
+public class PositionBillFormPlugin extends AbstractFormPlugin implements BeforeF7SelectListener, EntryGridBindDataListener, BeforeBasedataSetValueListener {
     private static final Log LOG = LogFactory.getLog(PositionBillFormPlugin.class);
     private final Map<String, Map<?, DynamicObject>> baseDataCacheMap = new NullableConcurrentHashMap(3);
 
@@ -65,6 +101,33 @@ public class PositionBillFormPlugin extends AbstractFormPlugin {
         }
     }
 
+    public void beforeBasedataSetValue(BeforeBasedataSetValueEvent beforeBasedataSetValueEvent) {
+        Object value = beforeBasedataSetValueEvent.getValue();
+        Object source = beforeBasedataSetValueEvent.getSource();
+        if (value instanceof ListSelectedRowCollection && source instanceof BasedataEdit) {
+            ListSelectedRowCollection rows = (ListSelectedRowCollection) value;
+            BasedataEdit basedataEdit = (BasedataEdit) source;
+            IDataEntityProperty property = basedataEdit.getProperty();
+            if (property instanceof PositionFieldProp && basedataEdit.isF7MultipleSelect()) {
+                DynamicObject billDy = getModel().getDataEntity();
+                String fieldKey = basedataEdit.getFieldKey();
+                String baseEntityId = ((BasedataProp) property).getBaseEntityId();
+                HRBaseServiceHelper helper = new HRBaseServiceHelper(baseEntityId);
+                DynamicObject[] baseDataDys = helper.loadDynamicObjectArray(rows.stream().map(ListSelectedRow::getPrimaryKeyValue).distinct().toArray());
+                //Set<Long> parentBoIds = Sets.newHashSetWithExpectedSize(baseDataDys.length);
+                Map<Object, DynamicObject> baseDataDyMap = Maps.newHashMapWithExpectedSize(baseDataDys.length);
+
+                for(DynamicObject orgDy : baseDataDys) {
+                    //parentBoIds.add(orgDy.getLong(String.join(".", PositionBillConstant.PARENT_KEY, PositionBillConstant.BOID_KEY)));
+                    baseDataDyMap.put(orgDy.getPkValue(), orgDy);
+                }
+
+                baseDataCacheMap.put(baseEntityId, baseDataDyMap);
+            }
+        }
+
+    }// 280
+
     @Override
     public void propertyChanged(PropertyChangedArgs e) {
         super.propertyChanged(e);
@@ -99,7 +162,7 @@ public class PositionBillFormPlugin extends AbstractFormPlugin {
                 PositionBillServiceHelper.openViewForm(getView(), PositionBillConstant.ADD_TAG, getPluginName(), null);
                 break;
             case PositionBillConstant.EDIT_ADD_OP:
-                PositionBillServiceHelper.openEditAddPage(status, getModel(), getView());
+                openEditAddPage(status, getModel(), getView());
                 break;
             case PositionBillConstant.EDIT_CHANGE_OP:
                 PositionBillServiceHelper.entryEntityMore(getModel(), getView(), PositionBillConstant.CHANGE_TAG, status);
@@ -162,4 +225,158 @@ public class PositionBillFormPlugin extends AbstractFormPlugin {
         }
     }
 
+    private void openEditAddPage(OperationStatus status, IDataModel iDataModel, IFormView iFormView) {
+        EntryGrid strategyEntryGrid = iFormView.getControl(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY);
+        int row = strategyEntryGrid.getEntryState().getFocusRow();
+        DynamicObject addDy = iDataModel.getDataEntity(true).getDynamicObjectCollection(PositionBillConstant.NCKD_ENTRYENTITY_ADD_KEY).get(row);
+        Long adddyId = addDy.getLong(PositionBillConstant.ID_KEY);
+        Map map = HRDynamicObjectUtils.convertDynamicObjectToMap(addDy);
+        BillShowParameter formShowParameter = new BillShowParameter();
+        formShowParameter.setFormId(PositionBillConstant.NCKD_POSBILLENTRYADD_ENTITY);
+        formShowParameter.setCustomParam("position_bsed", iDataModel.getValue(PositionBillConstant.NCKD_EFFDT) == null ? HRDateTimeUtils.getNowDateTime().getTime() : ((Date) iDataModel.getValue(PositionBillConstant.NCKD_EFFDT)).getTime());
+        formShowParameter.setPkId(adddyId);
+        formShowParameter.setStatus(status);
+        formShowParameter.setCustomParam("billid", iDataModel.getDataEntity().getLong(PositionBillConstant.ID_KEY));
+        if (HRStringUtils.equals(iFormView.getFormShowParameter().getAppId(), PositionBillConstant.WFTASK_APP)) {
+            formShowParameter.setHasRight(true);
+        }
+
+        if (!status.equals(OperationStatus.VIEW)) {
+            formShowParameter.setCloseCallBack(new CloseCallBack(getPluginName(), PositionBillConstant.ADD_TAG));
+        }
+
+        formShowParameter.setCustomParam("selectObject", SerializationUtils.toJsonString(map));
+        formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
+        //formShowParameter.setCustomParam("OP_VALIDATOR_BILL_ORG_ALL_CHANGE_ORG_KEY", getThisBillAllValidateDataStr(dynamicObject));
+        //formShowParameter.setCustomParam("OP_VALIDATOR_BILL_ORG_NEW_ORG_NUMBERS_KEY", getThisBillOrgNumbersStr(dynamicObject));
+        iFormView.showForm(formShowParameter);
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+
+        EntryGrid entryGrid = getControl(String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, PositionBillConstant.CHANGE_TAG));
+        //entryGrid.addDataBindListener(this);
+
+        for(String registerBeforeF7Listener : getRegisterBeforeF7ListenerControlList()) {
+            BasedataEdit basedataEdit = getControl(registerBeforeF7Listener);
+            if (basedataEdit != null) {
+                basedataEdit.setF7BatchFill(false);
+                basedataEdit.addBeforeF7SelectListener(this);
+                basedataEdit.addBeforeBasedataSetValueListener(this);
+            }
+        }
+    }
+
+    private List<String> getRegisterBeforeF7ListenerControlList() {
+        return Arrays.asList(PositionBillConstant.NCKD_DISORG_KEY, String.join("_", PositionBillConstant.NCKD_ORG, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG), String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG));
+    }
+
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+        String fieldKey = beforeF7SelectEvent.getProperty().getName();
+        setFuzzySearchAuthFilter(beforeF7SelectEvent);
+        replaceFormIdByFieldKey(beforeF7SelectEvent);
+        if (PositionBillConstant.NCKD_DISORG_KEY.equals(fieldKey)) {// 780
+            beforeF7SelectEvent.getFormShowParameter().setCaption("签发组织");
+            beforeF7SelectEvent.getCustomQFilters().add(BaseDataHelper.getAdminOrgBaseDataFilter(PositionBillConstant.NCKD_POSITIONBILL_ENTITY, Collections.singletonList(((DynamicObject) getView().getModel().getValue(PositionBillConstant.ORG_KEY)).getLong(PositionBillConstant.ID_KEY))));
+        } else {
+            int rowIndex = beforeF7SelectEvent.getRow();
+            String suffix = getSuffixByFieldKey(fieldKey);
+            String entryName = String.join("_", PositionBillConstant.NCKD_ENTRYENTITY, suffix);
+            DynamicObjectCollection entryDynColl = getModel().getDataEntity(true).getDynamicObjectCollection(entryName);
+            DynamicObject focusEntryDyn = entryDynColl.get(rowIndex);
+            Date date = DateUtils.truncate(new Date(), 5);
+            MainEntityType entityType = EntityMetadataCache.getDataEntityType(getView().getEntityId());
+            IDataEntityProperty property = entityType.getAllFields().get(fieldKey);
+            IDataEntityType parent = property.getParent();
+            Date effectDate = (Date) getModel().getValue(PositionBillConstant.NCKD_EFFDT);
+            if (checkOrgValue(beforeF7SelectEvent, property, parent)) {
+                ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
+                if (fieldKey.equals(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG))) {
+                    showParameter.getCustomParams().put("searchdate", date);
+                    AdminOrgBatchChgHelper.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.NCKD_ORG, PositionBillConstant.CHANGE_TAG))) {
+                    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.equals, hasPermOrgs));
+                    }
+                }
+            }
+        }
+    }
+
+    private boolean checkOrgValue(BeforeF7SelectEvent beforeF7SelectEvent, IDataEntityProperty property, IDataEntityType parent) {
+        if (parent == null) {
+            return false;
+        } else if (parent.getName().equals(getView().getEntityId())) {
+            return false;
+        } else if (!getModel().getDataEntity().containsProperty(property.getParent().getName())) {
+            return false;
+        } else {
+            DynamicObjectCollection dynamicObjectCollection = getModel().getDataEntity(true).getDynamicObjectCollection(parent.getName());
+            DynamicObject dynamicObject = dynamicObjectCollection.get(beforeF7SelectEvent.getRow());
+            String name = property.getName();
+            String suffix = name.substring(name.lastIndexOf("_") + 1);
+            String fieldKey = name.replace("_"+suffix, "");
+            if (PositionBillConstant.NCKD_ORG.equals(fieldKey)) {
+                return false;
+            } else if (!dynamicObject.getDataEntityType().getProperties().containsKey(String.join("_", PositionBillConstant.NCKD_ORG, suffix))) {
+                return false;
+            } else {
+                Boolean baseDataCtrl = BaseDataServiceHelper.checkBaseDataCtrl(((BasedataProp)property).getBaseEntityId());
+                DynamicObject orgDy = dynamicObject.getDynamicObject(String.join("_", PositionBillConstant.NCKD_ORG, suffix));
+                if (orgDy == null && baseDataCtrl) {
+                    getView().showTipNotification("请先选择组织体系管理组织。");
+                    beforeF7SelectEvent.setCancel(true);
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }
+    }
+
+    private void setFilterByOrg(BeforeF7SelectEvent beforeF7SelectEvent) {
+        List<Long> orgIdList = Collections.singletonList(((DynamicObject) getModel().getValue(PositionBillConstant.ORG_KEY)).getLong(PositionBillConstant.ID_KEY));
+        if (CollectionUtils.isEmpty(orgIdList)) {
+            beforeF7SelectEvent.getCustomQFilters().add(new QFilter("1", QCP.not_equals, 1));
+        } else {
+            beforeF7SelectEvent.getCustomQFilters().add(new QFilter(String.join(".", PositionBillConstant.ADMINORG, PositionBillConstant.ORG_KEY), QCP.in, orgIdList));
+        }
+    }
+
+    private void setFuzzySearchAuthFilter(BeforeF7SelectEvent beforeF7SelectEvent) {
+        if ("getLookUpList".equals(beforeF7SelectEvent.getSourceMethod()) || "setItemByNumber".equals(beforeF7SelectEvent.getSourceMethod())) {
+            AuthorizedOrgResult authorizedOrgResult = PositionBillServiceHelper.getOrgAuth(getView());
+            if (authorizedOrgResult.isHasAllOrgPerm()) {
+                return;
+            }
+
+            String fieldName = beforeF7SelectEvent.getProperty().getName();
+            if (PositionBillConstant.NCKD_DISORG_KEY.equals(fieldName) || HRStringUtils.equals(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG), fieldName)) {
+                List<Long> hasPermOrgList = authorizedOrgResult.getHasPermOrgs();
+                beforeF7SelectEvent.getCustomQFilters().add(new QFilter(String.join(".", PositionBillConstant.ADMINORG, PositionBillConstant.BOID_KEY), "in", hasPermOrgList));
+            }
+        }
+
+    }// 1018
+
+    private void replaceFormIdByFieldKey(BeforeF7SelectEvent beforeF7SelectEvent) {
+        String fieldKey = beforeF7SelectEvent.getProperty().getName();
+        if (PositionBillConstant.NCKD_DISORG_KEY.equals(fieldKey) || HRStringUtils.equals(String.join("_", PositionBillConstant.NCKD_POSITION, PositionBillConstant.CHANGE_TAG), fieldKey)) {
+            ListShowParameter showParameter = (ListShowParameter) beforeF7SelectEvent.getFormShowParameter();
+            showParameter.setFormId(PositionBillConstant.NCKD_HBPM_POSORGTREELISTF_ENTITY);
+        }
+
+    }
+
+    private static String getSuffixByFieldKey(String fieldKey) {
+        return fieldKey.substring(fieldKey.lastIndexOf("_") + 1);
+    }
 }

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

@@ -75,8 +75,8 @@ public class PosBillEntryNewPositionTempSaveOpPlugin extends AbstractOperationSe
         // 构建岗位对象
         OperateOption operateOption = OperateOption.create();
         List<DynamicObject> positionList = Lists.newArrayListWithExpectedSize(positionEntities.length);
-        // 需要转换的键值
-        Map<String, String> transKeyMap = PositionBillServiceHelper.getTransKeyMap(PositionBillConstant.NCKD_POSITION_TRANSKEY_ENTITY);
+        // 获取岗位需要转换的键值
+        Map<String, String> transKeyMap = 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);// 调用保存会自动设置
+            PositionBillServiceHelper.getPositionHrDy(positionEntity, positionDyo, transKeyMap);// 调用保存会自动设置status、enable、datastatus
             // 设置ID为岗位ID
             positionDyo.set(PositionBillConstant.ID_KEY, positionId);
             // 设置 是否标准岗位