From 88d4cd31fa5b197a91ed081ba1df292420af2d05 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期四, 22 十月 2026 16:48:52 +0800
Subject: [PATCH] 【丽水】随访统计增加一列,及时随访,统计未超时且已完成的随访人次

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java |  277 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 245 insertions(+), 32 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index bb35beb..f403771 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -4,18 +4,23 @@
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.*;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.DtoConversionUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.TreeUtils;
 import com.ruoyi.common.utils.bean.BeanValidators;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.common.core.service.IUserExtInfoService;
 import com.ruoyi.system.mapper.SysUserDeptMapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +34,7 @@
 import javax.validation.Validator;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -41,8 +47,13 @@
 public class SysUserServiceImpl implements ISysUserService {
     private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
 
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
     @Autowired
     private SysUserMapper userMapper;
+
+    @Autowired
+    private ISysDeptService sysDeptService;
 
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -132,19 +143,20 @@
         SysUserDept sysUserDept = new SysUserDept();
         sysUserDept.setUserId(sysUser.getUserId());
         sysUserDept.setDeptType(sysUser.getSearchscope());
+        sysUserDept.setOrgid(sysUser.getOrgid());
         List<SysUserDept> sysUserDeptKSs = null;
         List<SysUserDept> sysUserDeptBQs = null;
         if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("0")) {
             sysUserDept.setDeptType("1");
-            sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
+            sysUserDeptKSs = selectLeafSysDeptList(sysUserDept);
             sysUserDept.setDeptType("2");
-            sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
+            sysUserDeptBQs = selectLeafSysDeptList(sysUserDept);
         } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("1")) {
             sysUserDept.setDeptType("1");
-            sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
+            sysUserDeptKSs = selectLeafSysDeptList(sysUserDept);
         } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("2")) {
             sysUserDept.setDeptType("2");
-            sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
+            sysUserDeptBQs = selectLeafSysDeptList(sysUserDept);
         }
 
         sysUser.setDepts(deptIds);
@@ -180,14 +192,16 @@
         String[] split = userName.split("&");
         SysUser sysUser = userMapper.selectUserByUserNameByCondition(split[0], split[1], null);
         if (Objects.isNull(sysUser)) return sysUser;
+        //杩欓噷鍙崱鐢ㄦ埛绫诲瀷涓衡�滄偅鑰呪�濈殑
+        if (sysUser.getUserType().equals("鎮h��") && StringUtils.isNotEmpty(split[3]) && !split[3].equals("null") && !sysUser.getUserType().equals(split[3].trim()))
+            throw new BaseException("褰撳墠鐢ㄦ埛绫诲瀷涓庣櫥褰曠敤鎴风被鍨嬩笉涓�鑷�");
 
         boolean isAdmin = StringUtils.isNotEmpty(split[0]) && "admin".equals(split[0]);
         IUserExtInfoService userExtInfoService = SpringUtils.getBean(IUserExtInfoService.class);
-        java.util.concurrent.Executor executor = SpringUtils.getBean("threadPoolTaskExecutor");
+        Executor executor = SpringUtils.getBean("threadPoolTaskExecutor");
 
         // === 骞惰鏌ヨ: 鐢ㄦ埛鏈烘瀯淇℃伅 + 閮ㄩ棬鍒楄〃 ===
-        CompletableFuture<Map<String, String>> orgInfoFuture = CompletableFuture.supplyAsync(() ->
-                userExtInfoService.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[2]), executor);
+        CompletableFuture<Map<String, String>> orgInfoFuture = CompletableFuture.supplyAsync(() -> userExtInfoService.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[2]), executor);
 
         CompletableFuture<List<SysDept>> deptsFuture;
         if (isAdmin) {
@@ -236,8 +250,8 @@
                     SysDept deptBQ = new SysDept();
                     deptBQ.setOrgid(split[1]);
                     deptBQ.setDeptType("2");
-                    CompletableFuture<List<SysDept>> ksFuture = CompletableFuture.supplyAsync(() -> sysDeptMapper.selectDeptList(deptKS), executor);
-                    CompletableFuture<List<SysDept>> bqFuture = CompletableFuture.supplyAsync(() -> sysDeptMapper.selectDeptList(deptBQ), executor);
+                    CompletableFuture<List<SysDept>> ksFuture = CompletableFuture.supplyAsync(() -> selectLeafSysDeptForAdmin(deptKS), executor);
+                    CompletableFuture<List<SysDept>> bqFuture = CompletableFuture.supplyAsync(() -> selectLeafSysDeptForAdmin(deptBQ), executor);
                     try {
                         sysUserDeptKSs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(ksFuture.get(5, TimeUnit.SECONDS), SysUserDept.class));
                         sysUserDeptBQs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(bqFuture.get(5, TimeUnit.SECONDS), SysUserDept.class));
@@ -254,8 +268,8 @@
                     queryBQ.setUserId(sysUser.getUserId());
                     queryBQ.setDeptType("2");
                     queryBQ.setOrgid(split[1]);
-                    CompletableFuture<List<SysUserDept>> ksFuture = CompletableFuture.supplyAsync(() -> sysUserDeptMapper.selectSysUserDeptList(queryKS), executor);
-                    CompletableFuture<List<SysUserDept>> bqFuture = CompletableFuture.supplyAsync(() -> sysUserDeptMapper.selectSysUserDeptList(queryBQ), executor);
+                    CompletableFuture<List<SysUserDept>> ksFuture = CompletableFuture.supplyAsync(() -> selectLeafSysDeptList(queryKS), executor);
+                    CompletableFuture<List<SysUserDept>> bqFuture = CompletableFuture.supplyAsync(() -> selectLeafSysDeptList(queryBQ), executor);
                     try {
                         sysUserDeptKSs = ksFuture.get(5, TimeUnit.SECONDS);
                         sysUserDeptBQs = bqFuture.get(5, TimeUnit.SECONDS);
@@ -268,13 +282,13 @@
                 queryKS.setUserId(sysUser.getUserId());
                 queryKS.setDeptType("1");
                 queryKS.setOrgid(split[1]);
-                sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(queryKS);
+                sysUserDeptKSs = selectLeafSysDeptList(queryKS);
             } else if ("2".equals(sysUser.getSearchscope())) {
                 SysUserDept queryBQ = new SysUserDept();
                 queryBQ.setUserId(sysUser.getUserId());
                 queryBQ.setDeptType("2");
                 queryBQ.setOrgid(split[1]);
-                sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(queryBQ);
+                sysUserDeptBQs = selectLeafSysDeptList(queryBQ);
             }
         }
 
@@ -339,10 +353,7 @@
 
         //鑾峰彇褰撳墠鐧婚檰浜虹殑鏈烘瀯鍜岄櫌锟�?
         IUserExtInfoService userExtInfoService2 = SpringUtils.getBean(IUserExtInfoService.class);
-        Map<String, String> userOrgInfo2 = userExtInfoService2.getUserOrgInfo(
-                sysUser.getUserId().toString(),
-                split[1],
-                split[3]);
+        Map<String, String> userOrgInfo2 = userExtInfoService2.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[3]);
         if (!userOrgInfo2.isEmpty()) {
             sysUser.setOrgid(userOrgInfo2.get("orgid"));
             sysUser.setCampusid(userOrgInfo2.get("campusid"));
@@ -373,20 +384,20 @@
                 sysUserDept.setUserId(null);
             }
             sysUserDept.setDeptType("1");
-            sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
+            sysUserDeptKSs = selectLeafSysDeptList(sysUserDept);
             sysUserDept.setDeptType("2");
-            sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
+            sysUserDeptBQs = selectLeafSysDeptList(sysUserDept);
             //濡傛灉鏄痑dmin锛岄渶瑕佸sysUserDeptBQs锛宻ysUserDeptBQs鍘婚噸
             if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) {
                 //濡傛灉鏄痑dmin锛屽彧鑳藉幓sys_dept鍘诲彇鏁版嵁
                 SysDept dept = new SysDept();
                 dept.setOrgid(split[1]);
                 dept.setDeptType("1");
-                sysDepts = sysDeptMapper.selectDeptList(dept);
+                sysDepts = selectLeafSysDeptForAdmin(dept);
                 sysUserDeptKSs = DtoConversionUtils.sourceToTarget(sysDepts, SysUserDept.class);
 
                 dept.setDeptType("2");
-                sysDepts = sysDeptMapper.selectDeptList(dept);
+                sysDepts = selectLeafSysDeptForAdmin(dept);
                 sysUserDeptBQs = DtoConversionUtils.sourceToTarget(sysDepts, SysUserDept.class);
 
                 List<SysUserDept> distinctUserDepts = new ArrayList<>();
@@ -708,6 +719,12 @@
 //                sysUserDeptMapper.insertSysUserDept(sysUserDep);
 //            }
 //        }
+        //鍒犻櫎鍘熸湁鍏崇郴
+        SysUserDept delSysUserDept = new SysUserDept();
+        delSysUserDept.setUserId(user.getUserId());
+        delSysUserDept.setOrgid(user.getOrgid());
+        sysUserDeptMapper.deleteSysUserDeptByUserId(delSysUserDept);
+
         if (!CollectionUtils.isEmpty(user.getDeptCodes())) {
             for (String deptCode : user.getDeptCodes()) {
                 SysDept sysDept = sysDeptMapper.selectDeptByCode("1", user.getOrgid(), deptCode);
@@ -720,20 +737,15 @@
                 sysUserDept.setOrgid(user.getOrgid());
                 sysUserDept.setDeptCode(deptCode);
                 sysUserDept.setDeptId(sysDept.getDeptId());
-                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                 sysUserDept.setDelFlag(0L);
                 sysUserDept.setDeptType("1");
                 sysUserDept.setDeptName(sysDept.getDeptName());
                 sysUserDept.setUpdateTime(new Date());
-                if (!CollectionUtils.isEmpty(sysUserDepts)) {
-                    sysUserDept.setId(sysUserDepts.get(0).getId());
-                    sysUserDeptMapper.updateSysUserDept(sysUserDept);
-                    continue;
-                }
                 sysUserDept.setCreateTime(new Date());
                 sysUserDeptMapper.insertSysUserDept(sysUserDept);
             }
         }
+
         if (!CollectionUtils.isEmpty(user.getWardCodes())) {
             for (String wardCode : user.getWardCodes()) {
                 SysDept sysDept = sysDeptMapper.selectDeptByCode("2", user.getOrgid(), wardCode);
@@ -745,16 +757,11 @@
                 sysUserDept.setDeptCode(wardCode);
                 sysUserDept.setDeptId(sysDept.getDeptId());
                 sysUserDept.setOrgid(user.getOrgid());
-                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                 sysUserDept.setDelFlag(0L);
                 sysUserDept.setDeptType("2");
                 sysUserDept.setOrgid(user.getOrgid());
                 sysUserDept.setDeptName(sysDept.getDeptName());
                 sysUserDept.setUpdateTime(new Date());
-                if (!CollectionUtils.isEmpty(sysUserDepts)) {
-                    sysUserDeptMapper.updateSysUserDept(sysUserDept);
-                    continue;
-                }
                 sysUserDept.setCreateTime(new Date());
                 sysUserDeptMapper.insertSysUserDept(sysUserDept);
             }
@@ -975,4 +982,210 @@
         }
         return successMsg.toString();
     }
+
+    public List<SysUserDept> selectLeafSysDeptList(SysUserDept sysUserDept){
+        List<SysDept> list =  sysDeptMapper.selectSysDeptListBySysUserDept(sysUserDept);
+        if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(list)){
+            list = TreeUtils.getLeafDepts(list);
+        }
+        List<SysUserDept> list1 = DtoConversionUtils.sourceToTarget(list, SysUserDept.class);
+        return list1;
+    }
+
+    public List<SysDept> selectLeafSysDeptForAdmin(SysDept sysDept){
+        SysUserDept sysUserDept = DtoConversionUtils.sourceToTarget(sysDept, SysUserDept.class);
+        List<SysDept> list =  sysDeptMapper.selectSysDeptListBySysUserDept(sysUserDept);
+        if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(list)){
+            list = TreeUtils.getLeafDepts(list);
+        }
+        return list;
+    }
+
+    /**
+     * 鏍规嵁 sys_user.hosp_info锛堢瀹わ級鍜� sys_user.dept_info锛堢梾鍖猴級琛ュ叏 sys_user_dept 鏁版嵁
+     *
+     * @param orgid  鏈烘瀯ID锛屼负绌烘椂澶勭悊鍏ㄩ儴鏈烘瀯
+     * @param userId 鐢ㄦ埛ID锛屼负绌烘椂澶勭悊鍏ㄩ儴鐢ㄦ埛
+     * @return 澶勭悊缁撴灉缁熻
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> repairUserDeptByHospAndDeptInfo(String orgid, Long userId) {
+        List<SysUser> users = userMapper.selectUsersForRepairUserDept(orgid, userId);
+        int processedUsers = 0;
+        int inserted = 0;
+        int updated = 0;
+        int restored = 0;
+        int deptNotFound = 0;
+        Set<String> missingDeptCodes = new LinkedHashSet<>();
+
+        for (SysUser user : users) {
+            if (user.getUserId() == null) {
+                continue;
+            }
+            List<String> hospCodes = parseDeptCodes(user.getHospInfo());
+            List<String> wardCodes = parseDeptCodes(user.getDeptInfo());
+            if (hospCodes.isEmpty() && wardCodes.isEmpty()) {
+                continue;
+            }
+            processedUsers++;
+
+            int[] hospStat = repairUserDept(user, hospCodes, "1", missingDeptCodes);
+            int[] wardStat = repairUserDept(user, wardCodes, "2", missingDeptCodes);
+            inserted += hospStat[0] + wardStat[0];
+            updated += hospStat[1] + wardStat[1];
+            restored += hospStat[2] + wardStat[2];
+            deptNotFound += hospStat[3] + wardStat[3];
+        }
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("scannedUsers", users.size());
+        result.put("processedUsers", processedUsers);
+        result.put("inserted", inserted);
+        result.put("updated", updated);
+        result.put("restored", restored);
+        result.put("deptMetaNotFound", deptNotFound);
+        result.put("missingDeptCodes", missingDeptCodes);
+        log.info("鏍规嵁hosp_info/dept_info琛ュ叏鐢ㄦ埛閮ㄩ棬鍏崇郴瀹屾垚锛岀粨鏋滐細{}", result);
+        return result;
+    }
+
+    /**
+     * 琛ュ叏鍗曚釜鐢ㄦ埛鎸囧畾绫诲瀷鐨勯儴闂ㄥ叧绯汇��
+     * hosp_info / dept_info 鐢� Gson 搴忓垪鍖� List&lt;List&lt;String&gt;&gt; 鐢熸垚锛�
+     * 姣忎釜鍏冪礌褰㈠ [["code"]]锛屽洜姝や互閮ㄩ棬缂栫爜浣滀负琛ュ叏渚濇嵁锛屼笌鍘熷閲囬泦閫昏緫涓�鑷淬��
+     *
+     * @param user             鐢ㄦ埛
+     * @param deptCodes        閮ㄩ棬缂栫爜闆嗗悎
+     * @param expectedDeptType 閮ㄩ棬绫诲瀷锛�1绉戝 2鐥呭尯锛屽搴� hosp_info / dept_info锛�
+     * @param missingDeptCodes sys_dept 涓湭鍖归厤鍒扮殑閮ㄩ棬缂栫爜
+     * @return [鏂板鏁�, 鏇存柊鏁�, 鎭㈠鏁�, sys_dept鏈尮閰嶆暟]
+     */
+    private int[] repairUserDept(SysUser user, List<String> deptCodes, String expectedDeptType, Set<String> missingDeptCodes) {
+        int[] stat = new int[4];
+        for (String deptCode : deptCodes) {
+            // sys_dept 鍙敤浜庤ˉ鍏� dept_id銆乨ept_name 绛変俊鎭紝鏌ヤ笉鍒颁篃缁х画鎸夌紪鐮佽ˉ鍏�
+            SysDept sysDept = sysDeptMapper.selectDeptByCode(expectedDeptType, user.getOrgid(), deptCode);
+            if (ObjectUtils.isEmpty(sysDept)) {
+                // dept_type 鍙兘瀛樺湪鍘嗗彶鑴忔暟鎹紝鎸夌紪鐮佸厹搴曞啀鏌ヤ竴娆�
+                sysDept = sysDeptMapper.selectDeptByCode(null, user.getOrgid(), deptCode);
+            }
+            if (ObjectUtils.isEmpty(sysDept)) {
+                stat[3]++;
+                if (missingDeptCodes.size() < 100) {
+                    missingDeptCodes.add(deptCode);
+                }
+            }
+
+            String userDeptOrgid = StringUtils.isNotEmpty(user.getOrgid()) ? user.getOrgid()
+                    : (sysDept == null ? null : sysDept.getOrgid());
+            String campusid = sysDept != null && StringUtils.isNotEmpty(sysDept.getCampusid())
+                    ? sysDept.getCampusid() : user.getCampusid();
+            Date now = new Date();
+
+            // 涓庡師濮嬬敓鎴愰�昏緫淇濇寔涓�鑷达紝user_id + dept_code + orgid 浣滀负涓氬姟鍞竴閿�
+            SysUserDept sysUserDept = sysUserDeptMapper.selectSysUserDeptByUserAndCode(user.getUserId(), deptCode, user.getOrgid());
+            if (ObjectUtils.isEmpty(sysUserDept)) {
+                sysUserDept = new SysUserDept();
+                sysUserDept.setUserId(user.getUserId());
+                sysUserDept.setDeptCode(deptCode);
+                sysUserDept.setDeptType(expectedDeptType);
+                sysUserDept.setOrgid(userDeptOrgid);
+                sysUserDept.setCampusid(campusid);
+                if (sysDept != null) {
+                    sysUserDept.setDeptId(sysDept.getDeptId());
+                    sysUserDept.setDeptName(sysDept.getDeptName());
+                }
+                sysUserDept.setDelFlag(0L);
+                sysUserDept.setCreateTime(now);
+                sysUserDept.setUpdateTime(now);
+                sysUserDeptMapper.insertSysUserDept(sysUserDept);
+                stat[0]++;
+                continue;
+            }
+
+            boolean wasDeleted = !Long.valueOf(0L).equals(sysUserDept.getDelFlag());
+            sysUserDept.setDeptCode(deptCode);
+            sysUserDept.setDeptType(expectedDeptType);
+            sysUserDept.setOrgid(userDeptOrgid);
+            sysUserDept.setCampusid(campusid);
+            if (sysDept != null) {
+                sysUserDept.setDeptId(sysDept.getDeptId());
+                sysUserDept.setDeptName(sysDept.getDeptName());
+            }
+            sysUserDept.setDelFlag(0L);
+            sysUserDept.setUpdateTime(now);
+            sysUserDeptMapper.updateSysUserDept(sysUserDept);
+            if (wasDeleted) {
+                stat[2]++;
+            } else {
+                stat[1]++;
+            }
+        }
+        return stat;
+    }
+
+    /**
+     * 瑙f瀽 hosp_info / dept_info 涓殑閮ㄩ棬缂栫爜銆�
+     * 鍘熷鐢熸垚閫昏緫浣跨敤 Gson 搴忓垪鍖� List&lt;List&lt;String&gt;&gt;锛屾牸寮忓 [["code1"],["code2"]]锛�
+     * 杩欓噷鍏煎璇ユ牸寮忥紝鍚屾椂鍏煎 ["code"]銆乕{"deptCode":"code"}] 绛夊巻鍙叉牸寮忋��
+     */
+    private List<String> parseDeptCodes(String json) {
+        if (StringUtils.isEmpty(json)) {
+            return Collections.emptyList();
+        }
+        List<String> codes = new ArrayList<>();
+        try {
+            collectDeptCodes(OBJECT_MAPPER.readTree(json), codes);
+        } catch (Exception e) {
+            log.warn("瑙f瀽鐢ㄦ埛绉戝/鐥呭尯淇℃伅澶辫触锛屽唴瀹癸細{}", json, e);
+        }
+        return codes.stream().filter(StringUtils::isNotEmpty).distinct().collect(Collectors.toList());
+    }
+
+    private void collectDeptCodes(JsonNode node, List<String> codes) {
+        if (node == null || node.isNull()) {
+            return;
+        }
+        if (node.isArray()) {
+            for (JsonNode item : node) {
+                collectDeptCodes(item, codes);
+            }
+            return;
+        }
+        if (node.isObject()) {
+            JsonNode codeNode = node.get("deptCode");
+            if (codeNode == null) {
+                codeNode = node.get("code");
+            }
+            if (codeNode == null) {
+                codeNode = node.get("deptId");
+            }
+            if (codeNode == null) {
+                codeNode = node.get("hisDeptId");
+            }
+            if (codeNode != null) {
+                collectDeptCodes(codeNode, codes);
+                return;
+            }
+            Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
+            while (fields.hasNext()) {
+                JsonNode value = fields.next().getValue();
+                if (value != null && value.isValueNode() && !value.isNull()) {
+                    collectDeptCodes(value, codes);
+                    return;
+                }
+            }
+            return;
+        }
+        if (node.isValueNode()) {
+            String code = node.asText();
+            if (StringUtils.isNotEmpty(code)) {
+                code = code.trim();
+                if (StringUtils.isNotEmpty(code) && !"null".equalsIgnoreCase(code)) {
+                    codes.add(code);
+                }
+            }
+        }
+    }
 }

--
Gitblit v1.9.3