Parcourir la source

1.处理组织长名称微服务及扩展插件

Tyx il y a 1 semaine
Parent
commit
4da241c2d9

+ 71 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/explugin/BatchEffectServiceExtendEx.java

@@ -0,0 +1,71 @@
+package nckd.jimin.jyyy.hr.haos.explugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import kd.hr.haos.business.servicehelper.AdminOrgQueryServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.homs.business.service.ext.function.IBatchEffectServiceExtend;
+import kd.hr.homs.common.model.batcheffect.BatchEffectBeforeArgs;
+import nckd.jimin.jyyy.hr.haos.util.OrgUtils;
+import nckd.jimin.jyyy.hr.hrmp.hbpm.opplugin.web.position.PositionDataProviderEx;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * Tyx 2025-06-20
+ * 组织保存前扩展插件,处理长名称
+ * haos_adminorghr和haos_adminorg增加文本字段nckd_longname,其他地方增加引用属性
+ */
+public class BatchEffectServiceExtendEx implements IBatchEffectServiceExtend {
+    private static final Log log = LogFactory.getLog(BatchEffectServiceExtendEx.class);
+    private static String adminOrgDetail_entity = "haos_adminorgdetail";
+    @Override
+    public void beforeSaveAdminOrg(BatchEffectBeforeArgs batchEffectBeforeArgs) {
+        log.info("---- inter beforeSaveAdminOrg ----");
+        //调整上级的情况 structlongnumber 不会发生变化
+        //这里仅处理非调整上级的情况,调整上级情况通过协同处理DealOrgLongNameServiceImpl.consumerSaveMsg
+        if(batchEffectBeforeArgs.getBill().getDynamicObjectType().getName().equals("homs_orgfastchgparent"))
+            return;
+        List<DynamicObject> list = batchEffectBeforeArgs.getAdminOrgList();
+        for (DynamicObject org : list) {
+            //4VTX1ACRU8A9!4VU/45/K1PJZ!4VU/45/K1PK8!4VU/45/K1PK9!50A4ILMNS91S
+            String structLongNumber = org.getString("structlongnumber");
+            String structNumber = org.getString("structnumber");
+            log.info("---- beforeSaveAdminOrg处理中:{}", org.getString("number"));
+            Map map = new HashMap();
+            map.put("name", org.getString("name"));
+            map.put("number", org.getString("number"));
+            List<Map<String, Object>> subOrgList = AdminOrgQueryServiceHelper.batchQueryAllSubOrg(Arrays.asList(org.getLong("boid")), new Date());
+            Set subOrgIdset = subOrgList.stream().map(i -> i.get("orgId")).collect(Collectors.toSet());
+            //排除掉本次生效的组织,让标品处理
+            subOrgIdset.remove(org.getLong("id"));
+            String selectProperties = "id,boid,number,name,structlongnumber,structnumber,nckd_longname,nckd_longnumber";
+            QFilter idQFilter = new QFilter("id", "in", subOrgIdset);
+            DynamicObject[] subOrgDyns = new HRBaseServiceHelper(adminOrgDetail_entity).query(selectProperties, new QFilter[]{idQFilter});
+            //查出所有涉及到的structNumber,不含本次修改的组织
+            Set structLongNumberSet = Arrays.asList(subOrgDyns).stream()
+                    .map(dyx -> dyx.getString("structlongnumber"))
+                    .flatMap(longNumber -> Arrays.stream(longNumber.split("!")))
+                    .collect(Collectors.toSet());
+            Map<String, Map<String, String>> structMap = OrgUtils.getStructNumberMap(structLongNumberSet, null);
+            //把本次修改的组织加进structMap
+            structMap.put(structNumber, map);
+            //处理本次修改组织的长名称和长编码
+            OrgUtils.dealLongNameAndNumber(org, structMap);
+            //处理本次修改组织下级组织的长名称和长编码
+            for (DynamicObject subOrg : subOrgDyns) {
+                OrgUtils.dealLongNameAndNumber(subOrg, structMap);
+            }
+            SaveServiceHelper.update(subOrgDyns);
+        }
+    }
+
+
+
+
+}

+ 7 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/msg/api/IDealOrgLongNameService.java

@@ -0,0 +1,7 @@
+package nckd.jimin.jyyy.hr.haos.msg.api;
+
+import kd.hr.hbp.business.service.message.IHRMsgTplService;
+
+public interface IDealOrgLongNameService extends IHRMsgTplService {
+
+}

+ 64 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/msg/impl/DealOrgLongNameServiceImpl.java

@@ -0,0 +1,64 @@
+package nckd.jimin.jyyy.hr.haos.msg.impl;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.serialization.SerializationUtils;
+import kd.bos.exception.KDBizException;
+import kd.bos.orm.query.QFilter;
+import kd.hr.haos.business.servicehelper.AdminOrgQueryServiceHelper;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.DispatchServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.common.mservice.HRMServiceResult;
+import nckd.jimin.jyyy.hr.haos.msg.api.IDealOrgLongNameService;
+import nckd.jimin.jyyy.hr.haos.util.OrgUtils;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 2025-06-23 Tyx
+ * 处理组织长名称微服务实现类
+ * HR通用服务-业务事件订阅,订阅事件:行政组织上级调整生效
+ */
+public class DealOrgLongNameServiceImpl implements IDealOrgLongNameService {
+
+    private static String adminOrgDetail_entity = "haos_adminorgdetail";
+
+
+    @Override
+    public HRMServiceResult consumerSaveMsg(DynamicObject dynamicObject) {
+        Map<String, Object> msgContentMap = (Map) SerializationUtils.deSerializeFromBase64(dynamicObject.getString("msgcontent"));
+        long billId = Long.parseLong(msgContentMap.get("billid").toString());
+        long boid = Long.parseLong(msgContentMap.get("boid").toString());
+        Map<String, Object> resultMap = (Map) DispatchServiceHelper.invokeBizService("odc", "homs", "IHAOSAdminOrgMsgQueryService", "orgParentChgEffectQueryDetail", new Object[]{billId, boid});
+        // 4VTX1ACRU8A9!4VU/45/K1PJZ!4VU/45/K1PK8!4VU/45/K1PK9!50A4ILMNS91S
+        Map afterMap = (Map) resultMap.get("afterChgInfo");
+        DynamicObject org = BusinessDataServiceHelper.loadSingle(afterMap.get("fid"), adminOrgDetail_entity);
+        String structLongNumber = org.getString("structlongnumber");
+        String structNumber = org.getString("structnumber");
+        Map map = new HashMap();
+        map.put("name", org.getString("name"));
+        map.put("number", org.getString("number"));
+        List<Map<String, Object>> subOrgList = AdminOrgQueryServiceHelper.batchQueryAllSubOrg(Arrays.asList(org.getLong("boid")), new Date());
+        Set subOrgIdset = subOrgList.stream().map(i -> i.get("orgId")).collect(Collectors.toSet());
+        String selectProperties = "id,boid,number,name,structlongnumber,structnumber,nckd_longname,nckd_longnumber";
+        QFilter idQFilter = new QFilter("id", "in", subOrgIdset);
+        DynamicObject[] subOrgDyns = new HRBaseServiceHelper(adminOrgDetail_entity).query(selectProperties, new QFilter[]{idQFilter});
+        //查出所有涉及到的structNumber,不含本次修改的组织
+        Set structLongNumberSet = Arrays.asList(subOrgDyns).stream()
+                .map(dyx -> dyx.getString("structlongnumber"))
+                .flatMap(longNumber -> Arrays.stream(longNumber.split("!")))
+                .collect(Collectors.toSet());
+        Map<String, Map<String, String>> structMap = OrgUtils.getStructNumberMap(structLongNumberSet, null);
+        //把本次修改的组织加进structMap
+        structMap.put(structNumber, map);
+        //处理本次修改组织下级组织的长名称和长编码
+        for (DynamicObject subOrg : subOrgDyns) {
+            OrgUtils.dealLongNameAndNumber(subOrg, structMap);
+        }
+        SaveServiceHelper.update(subOrgDyns);
+        //return null;
+        return HRMServiceResult.success();
+    }
+}

+ 102 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/util/OrgUtils.java

@@ -0,0 +1,102 @@
+package nckd.jimin.jyyy.hr.haos.util;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class OrgUtils {
+
+    static QFilter isNotCurrent = new QFilter("iscurrentversion", "=", '0');
+    static QFilter isCurrent = new QFilter("iscurrentversion", "=", "1");
+    static QFilter dataStatusFilter = new QFilter("datastatus", "in", Arrays.asList("1", "2"));
+    static QFilter dataStatusCurrent = new QFilter("datastatus", "in", Arrays.asList("-3", "0"));
+    static QFilter enableFilter = new QFilter("enable", "=", "1");
+    static QFilter initStatusFilter = new QFilter("initstatus", "=", "2");
+
+    /**
+     * 获取组织结构编码Map
+     * key = structnumber, value = Map包含number和name
+     * @param structNumberSet
+     * @param modifyTime
+     * @return
+     */
+    public static Map<String, Map<String, String>> getStructNumberMap(Set<String> structNumberSet, Date modifyTime) {
+        HRBaseServiceHelper adminOrg = new HRBaseServiceHelper("haos_adminorgdetail");
+        QFilter structNumberFilter = new QFilter("structnumber", "in", structNumberSet);
+        if (Objects.isNull(modifyTime)) {
+            structNumberFilter.and(isCurrent);
+        } else {
+            QFilter effDateFilter = (new QFilter("bsed", "<=", modifyTime)).and(new QFilter("bsled", ">=", modifyTime));
+            structNumberFilter.and(isNotCurrent).and(effDateFilter);
+        }
+
+        DynamicObject[] adminOrgNumber = adminOrg.query("id,structnumber,name,number", new QFilter[]{structNumberFilter, dataStatusFilter, initStatusFilter});
+        Stream<DynamicObject> dynamicObjectStream = Arrays.stream(adminOrgNumber).filter(distinctByKey1((s) -> {
+            return s.getString("structnumber");
+        }));
+        Map<String, Map<String, String>> stringStringMap = (Map)dynamicObjectStream.collect(Collectors.toMap((dy) -> {
+            return (String)Optional.ofNullable(dy.getString("structnumber")).orElse("");
+        }, (dy) -> {
+            Map map = new HashMap<>();
+            map.put("number",(String)Optional.ofNullable(dy.getString("number")).orElse(""));
+            map.put("name",(String)Optional.ofNullable(dy.getString("name")).orElse(""));
+            return map;
+        }));
+        structNumberSet.removeAll(stringStringMap.keySet());
+        if (structNumberSet.size() == 0) {
+            return stringStringMap;
+        } else {
+            structNumberFilter = new QFilter("structnumber", "in", structNumberSet);
+            DynamicObject[] adminOrgNumberNot = adminOrg.query("id,structnumber,name,number", new QFilter[]{structNumberFilter, isCurrent, dataStatusCurrent, enableFilter, initStatusFilter});
+            dynamicObjectStream = Arrays.stream(adminOrgNumberNot).filter(distinctByKey1((s) -> {
+                return s.getString("structnumber");
+            }));
+            Map<String, Map<String, String>> stringStringMapNot = (Map)dynamicObjectStream.collect(Collectors.toMap((dy) -> {
+                return (String)Optional.ofNullable(dy.getString("structnumber")).orElse("");
+            }, (dy) -> {
+                Map map = new HashMap<>();
+                map.put("number",(String)Optional.ofNullable(dy.getString("number")).orElse(""));
+                map.put("name",(String)Optional.ofNullable(dy.getString("name")).orElse(""));
+                return map;
+            }));
+            stringStringMap.putAll(stringStringMapNot);
+            return stringStringMap;
+        }
+    }
+
+    /**
+     * 根据组织的structlongnumber处理组织的长名称和长编码
+     * @param org
+     * @param structMap
+     */
+    public static void dealLongNameAndNumber(DynamicObject org, Map<String, Map<String, String>> structMap) {
+        String structLongNumber = org.getString("structlongnumber");
+        String[] structNumbers =  structLongNumber.split("!");
+        String[] longNames = new String[structNumbers.length];
+        String[] longNumbers = new String[structNumbers.length];
+        for(int i = 0; i<structNumbers.length; i++) {
+            if(structMap.containsKey(structNumbers[i])) {
+                longNames[i] = structMap.get(structNumbers[i]).get("name");
+                longNumbers[i] = structMap.get(structNumbers[i]).get("number");
+            }
+        }
+        org.set("nckd_longname", String.join("_", longNames));
+        org.set("nckd_longnumber", String.join("!", longNumbers));
+    }
+
+
+    static <T> Predicate<T> distinctByKey1(Function<? super T, ?> keyExtractor) {
+        Map<Object, Boolean> seen = new ConcurrentHashMap();
+        return (t) -> {
+            return seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
+        };
+    }
+
+}

+ 24 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/odc/nckd_homs_ext/ServiceFactory.java

@@ -0,0 +1,24 @@
+package nckd.odc.nckd_homs_ext;
+
+import kd.bos.dataentity.TypesContainer;
+import kd.bos.dataentity.resource.ResManager;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ServiceFactory {
+
+    private static Map<String, String> serviceMap = new HashMap<>();
+    static {
+        serviceMap.put("IDealOrgLongNameService","nckd.jimin.jyyy.hr.haos.msg.impl.DealOrgLongNameServiceImpl");
+    }
+
+    public static Object getService(String serviceName) {
+        String className = serviceMap.get(serviceName);
+        if (className == null) {
+            throw new RuntimeException(String.format(ResManager.loadKDString("%s对应的服务实现未找到", "ServiceFactory_0", "jkjt-tmc-servicehelper", new Object[0]), serviceName));
+        } else {
+            return TypesContainer.getOrRegisterSingletonInstance(className);
+        }
+    }
+}