Преглед изворни кода

feat(org): 添加组织长名称处理插件和辅助方法

- 新增 DealOrgLongNamePlugin 事件订阅插件,处理行政组织变动事件
- 实现组织变动时自动更新组织长名称的功能
- 在 OrgHelper 中新增 getStructNumberMap 方法获取组织结构编码映射
- 添加 dealLongName 方法根据组织结构编码处理组织长名称
- 增加数据查询过滤器静态变量用于组织数据查询
- 实现基于组织层级结构的长名称生成机制
Tyx пре 1 недеља
родитељ
комит
a0c632b30a

+ 96 - 1
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/org/helper/OrgHelper.java

@@ -1,11 +1,18 @@
 package nckd.jxccl.base.org.helper;
 
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.basedata.BaseDataServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import nckd.jxccl.base.common.utils.ConvertUtil;
 import nckd.jxccl.base.entity.helper.EntityHelper;
 
-import java.util.List;
+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;
 
 /**
  * Org帮助类
@@ -16,6 +23,13 @@ import java.util.List;
  */
 public class OrgHelper {
 
+    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");
+
     /**
      * 获取创建组织
      * @param entity 实体id
@@ -60,5 +74,86 @@ public class OrgHelper {
     }
 
 
+    /**
+     * 获取组织结构编码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});
+        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});
+            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 dealLongName(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_orglongname", String.join("_", longNames));
+    }
+
+
+    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;
+        };
+    }
+
+
+
 
 }

+ 81 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/haos/plugin/DealOrgLongNamePlugin.java

@@ -0,0 +1,81 @@
+package nckd.jxccl.hr.haos.plugin;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import kd.bos.bec.api.IEventServicePlugin;
+import kd.bos.bec.model.KDBizEvent;
+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.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.sdk.hr.haos.business.helper.HAOSServiceHelper;
+import nckd.jxccl.base.org.helper.OrgHelper;
+
+import java.util.*;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+
+/**
+ * Tyx 2026-01-09
+ * 事件订阅调用插件
+ * 事件名:行政组织变动.生效
+ */
+public class DealOrgLongNamePlugin implements IEventServicePlugin {
+
+    private static final Log logger = LogFactory.getLog(DealOrgLongNamePlugin.class);
+    private static HRBaseServiceHelper ADMINORGDETAIL_HELPER = new HRBaseServiceHelper("haos_adminorgdetail");
+    
+    @Override
+    public Object handleEvent(KDBizEvent evt) {
+
+        // 获取事件参数,格式:
+        // [{"data":[{"beforeversion":2388628286830828544,"isbelongcompanychange":false,"boid":2309486703347249189,"changeoperate":1030,"changescene":1030,"afterversion":2388631384106227714}]}]
+        String paramStr = evt.getSource();
+        JSONArray jsonArray = JSONArray.parseArray(paramStr);
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            JSONArray dataArr = jsonObject.getJSONArray("data");
+            // TODO 不确定这里data会不会为空
+            JSONObject data = dataArr.getJSONObject(0);
+
+            // 获取变动场景id,目前只处理 组织新设-1010,调整上级-1020,变更信息-1030的情况:
+            Long sceneId = data.getLong("changescene");
+            if(sceneId.equals(1010L) || sceneId.equals(1020L) || sceneId.equals(1030L)) {
+                Long boId = data.getLong("boid");
+                updateOrgLongName(boId);
+            }
+        }
+        return IEventServicePlugin.super.handleEvent(evt);
+    }
+
+    /**
+     * 更新组织长名称
+     * @param boId 组织boId
+     */
+    public void updateOrgLongName (Long boId) {
+        DynamicObject org = ADMINORGDETAIL_HELPER.loadOne(boId);
+        String structLongNumber = org.getString("structlongnumber");
+        List<Map<String, Object>> subOrgList = HAOSServiceHelper.querySubOrgToList(Collections.singletonList(boId), new Date(), 6);
+
+        Set subOrgIdset = subOrgList.stream().map(i -> i.get("orgId")).collect(Collectors.toSet());
+        String selectProperties = "id,boid,number,name,structlongnumber,structnumber,nckd_orglongname";
+        QFilter idQFilter = new QFilter("id", "in", subOrgIdset);
+        DynamicObject[] subOrgDyns = ADMINORGDETAIL_HELPER.query(selectProperties, new QFilter[]{idQFilter});
+        Set structLongNumberSet = Arrays.stream(subOrgDyns).map(dyx -> dyx.get("structlongnumber").toString())
+                .flatMap(longNumber -> Arrays.stream(longNumber.split("!")))
+                .collect(Collectors.toSet());
+
+        Map<String, Map<String, String>> structMap = OrgHelper.getStructNumberMap(structLongNumberSet, null);
+        for (DynamicObject subOrg : subOrgDyns) {
+            OrgHelper.dealLongName(subOrg, structMap);
+        }
+        SaveServiceHelper.update(subOrgDyns);
+    }
+
+
+
+
+}