Explorar el Código

feature(机构增量同步功能开发): 机构增量同步功能开发

机构增量同步功能开发
mazq hace 3 años
padre
commit
4aa1873d55

+ 23 - 21
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/impl/SubSyncBusinessImpl.java

@@ -1046,12 +1046,16 @@ public class SubSyncBusinessImpl implements ISubSyncBusiness {
                 }
 
                 watch.start("orgInfoAddSync");
-                orgInfoAddSync();
+                List<AuthOrgInfo> updateOrgInfos = orgInfoAddSync();
                 watch.stop();
 
                 watch.start("Set path And ReInitTrees");
-                List<String> updateOrgCodes = setAddPathAndUpId();
-                orgTreeService.updateTreeByCode(updateOrgCodes, false);
+                List<String> updateOrgCodesInTrees = setAddPathAndUpId(updateOrgInfos);
+                List<String> delCode = orgAddOriginalService.getDelCodes();
+                //需要删除的机构code也加入
+                //如果同一个机构code是先删除后新增的机构,id也变了也需要从树结构中移除
+                updateOrgCodesInTrees.addAll(delCode);
+                orgTreeService.updateTreeByCode(updateOrgCodesInTrees, false);
                 watch.stop();
 
                 watch.start("onOrgSyncEnd");
@@ -1071,21 +1075,20 @@ public class SubSyncBusinessImpl implements ISubSyncBusiness {
         };
     }
 
-    private List<String> setAddPathAndUpId() {
-        List<String> addOrgCodes = orgAddOriginalService.getCodes();
+    private List<String> setAddPathAndUpId(List<AuthOrgInfo> updateOrgInfos) {
+        Set<String> addOrgCodes = updateOrgInfos.stream().map(AuthOrgInfo::getCode).collect(Collectors.toSet());
         //获取新增或修改的机构
-        List<AuthOrgInfo> addOrgInfos = authOrgInfoService.getOrgByCodes(addOrgCodes);
-        List<String> upOrgInfoCodes = addOrgInfos.stream()
+        List<String> upOrgInfoCodes = updateOrgInfos.stream()
                 .map(AuthOrgInfo::getUpGovCode)
                 .distinct()
                 .collect(Collectors.toList());
-        //查询增量同步机构在已存在机构中的上级机构
+        //查询增量同步机构中的上级机构,且是已存在机构表中的机构
         List<String> collect = upOrgInfoCodes.stream().filter(e -> !addOrgCodes.contains(e)).collect(Collectors.toList());
         List<AuthOrgInfo> upOrgInfos = authOrgInfoService.getOrgByCodes(collect);
         //设置path和upGovId
         Map<String, AuthOrgInfo> upOrgMap = upOrgInfos.stream()
                 .collect(Collectors.toMap(AuthOrgInfo::getCode, e -> e, (old, last) -> last));
-        Map<String, List<AuthOrgInfo>> addOrgGroup = addOrgInfos.stream()
+        Map<String, List<AuthOrgInfo>> addOrgGroup = updateOrgInfos.stream()
                 .collect(Collectors.groupingBy(AuthOrgInfo::getUpGovCode));
         Set<String> upOrgCodes = upOrgMap.keySet();
         Deque<String> deque = new LinkedList<>(upOrgCodes);
@@ -1110,28 +1113,26 @@ public class SubSyncBusinessImpl implements ISubSyncBusiness {
                 });
             }
         }
+        //经过这次循环之后所有需要修改机构树的节点code都被添加到upOrgCodes
+
         //批量更新机构path和upGovId、upGovName
-        authOrgInfoService.batchUpdatePathUpGovId(addOrgInfos);
+        authOrgInfoService.batchUpdatePathUpGovId(updateOrgInfos);
 
-        //过滤被删除的机构code
-        Set<String> addOrgCodeSet = addOrgInfos.stream().map(AuthOrgInfo::getCode).collect(Collectors.toSet());
-        List<String> delOrgCodes = addOrgCodes.stream().filter(e -> !addOrgCodeSet.contains(e)).distinct().collect(Collectors.toList());
         //返回所有需要修改树节点信息的机构code
-        //这里只添加能串树节点的机构code和删除的机构code
-        List<String> list = new ArrayList<>(upOrgCodes);
-        list.addAll(delOrgCodes);
-        return list;
+        //这里只添加能串联起树节点的机构code
+        return new ArrayList<>(upOrgCodes);
     }
 
-    private void orgInfoAddSync() {
+    private List<AuthOrgInfo> orgInfoAddSync() {
         int currentPage = 0;
         Searchable searchable = Searchable.newSearchable();
         searchable.addSort(Sort.Direction.ASC, "orgUpdateTime");
+        List<AuthOrgInfo> list = new ArrayList<>();
         do {
             searchable.setPage(currentPage, 1000);
             Page<AuthOrgAddOriginal> page = orgAddOriginalService.pageSearch(searchable);
             if(page.isEmpty()) {
-                return;
+                break;
             }
             List<AuthOrgAddOriginal> content = page.getContent();
             List<AuthOrgInfo> orgInfoList = content.stream().map(item -> {
@@ -1147,10 +1148,11 @@ public class SubSyncBusinessImpl implements ISubSyncBusiness {
                     return authOrgInfo;
                 }
             }).collect(Collectors.toList());
-            authOrgInfoService.batchSaveByOrgCode(orgInfoList);
+            List<AuthOrgInfo> updateOrgInfos = authOrgInfoService.batchSaveByOrgCode(orgInfoList);
+            list.addAll(updateOrgInfos);
             ++currentPage;
         }while (true);
-
+        return list;
     }
 
     private Integer getOrgInfoAddFromRemote(Integer pageSize, Date syncStartTime, List<Header> headers) {

+ 7 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AuthOrgAddOriRepo.java

@@ -21,4 +21,11 @@ public interface AuthOrgAddOriRepo extends BaseRepository<AuthOrgAddOriginal, St
     @Query("SELECT DISTINCT code FROM AuthOrgAddOriginal")
     List<String> getCodes();
 
+    /**
+     * 查询被删除的机构code
+     * @return
+     */
+    @Query("SELECT code FROM AuthOrgAddOriginal WHERE orgDeleted = '1'")
+    List<String> getDelCodes();
+
 }

+ 6 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAuthOrgAddOriginalService.java

@@ -37,4 +37,10 @@ public interface IAuthOrgAddOriginalService {
      */
     List<String> getCodes();
 
+    /**
+     * 获取删除的机构code
+     * @return
+     */
+    List<String> getDelCodes();
+
 }

+ 2 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAuthOrgInfoService.java

@@ -85,8 +85,9 @@ public interface IAuthOrgInfoService{
     /**
      * 根据code批量保存或更新
      * @param orgInfoList
+     * @return
      */
-    void batchSaveByOrgCode(List<AuthOrgInfo> orgInfoList);
+    List<AuthOrgInfo> batchSaveByOrgCode(List<AuthOrgInfo> orgInfoList);
 
     /**
      * 批量更新upId、upName、path

+ 5 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthOrgAddOriginalServiceImpl.java

@@ -45,4 +45,9 @@ public class AuthOrgAddOriginalServiceImpl implements IAuthOrgAddOriginalService
         return repository.getCodes();
     }
 
+    @Override
+    public List<String> getDelCodes() {
+        return repository.getDelCodes();
+    }
+
 }

+ 9 - 3
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthOrgInfoService.java

@@ -93,9 +93,9 @@ public class AuthOrgInfoService implements IAuthOrgInfoService {
     }
 
     @Override
-    public void batchSaveByOrgCode(List<AuthOrgInfo> orgInfoList) {
+    public List<AuthOrgInfo> batchSaveByOrgCode(List<AuthOrgInfo> orgInfoList) {
         if(CollectionUtils.isEmpty(orgInfoList)) {
-            return;
+            return Collections.emptyList();
         }
         List<String> codes = orgInfoList
                 .stream()
@@ -106,13 +106,18 @@ public class AuthOrgInfoService implements IAuthOrgInfoService {
         List<AuthOrgInfo> existList = getOrgByCodes(codes);
         Map<String, AuthOrgInfo> existMap = existList.stream()
                 .collect(Collectors.toMap(AuthOrgInfo::getCode, e -> e, (old, last) -> last));
+
         Integer maxSort = getMaxSort();
-        for (AuthOrgInfo authOrgInfo : orgInfoList) {
+
+        Iterator<AuthOrgInfo> iterator = orgInfoList.iterator();
+        while (iterator.hasNext()) {
+            AuthOrgInfo authOrgInfo = iterator.next();
             String code = authOrgInfo.getCode();
             AuthOrgInfo exist = existMap.get(code);
             //删除机构信息
             if(BooleanEnum.TRUE.value.equals(authOrgInfo.getDeleted())) {
                 orgInfoRepository.deleteByCode(code);
+                iterator.remove();
                 continue ;
             }
             //新增或修改机构
@@ -127,6 +132,7 @@ public class AuthOrgInfoService implements IAuthOrgInfoService {
                 orgInfoRepository.update(exist);
             }
         }
+        return orgInfoList;
     }
 
     private Integer getMaxSort() {

+ 4 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthOrgTreeServiceImpl.java

@@ -296,7 +296,10 @@ public class AuthOrgTreeServiceImpl implements IAuthOrgTreeService {
                 lock.writeLock().lock();
                 treeNods.forEach(e->{
                     treeNodeMap.put(e.getId(), e);
-                    codeIdMap.put(e.getCode(), e);
+                    OrgTreeNodeDTO oldNode = codeIdMap.put(e.getCode(), e);
+                    if(null != oldNode) {
+                        treeNodeMap.remove(oldNode.getId());
+                    }
                 });
                 delCodes.forEach(e->{
                     OrgTreeNodeDTO node = codeIdMap.remove(e);

+ 7 - 7
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthUserInfoService.java

@@ -74,31 +74,31 @@ public class AuthUserInfoService implements IAuthUserInfoService {
         if(CollectionUtils.isEmpty(userInfoList)) {
             return Collections.emptyList();
         }
-        List<AuthUserInfo> list = new ArrayList<>();
         List<String> idcards = userInfoList.stream().map(AuthUserInfo::getIdcard).distinct().collect(Collectors.toList());
         List<AuthUserInfo> idAndIdcards = getIdAndIdcards(idcards);
         Map<String, AuthUserInfo> existMap = idAndIdcards.stream()
                 .collect(Collectors.toMap(AuthUserInfo::getIdcard, e -> e, (old, last) -> last));
-        for (AuthUserInfo authUserInfo : userInfoList) {
+        Iterator<AuthUserInfo> iterator = userInfoList.iterator();
+        while (iterator.hasNext()) {
+            AuthUserInfo authUserInfo = iterator.next();
             String idcard = authUserInfo.getIdcard();
             AuthUserInfo exist = existMap.get(idcard);
             //删除人员信息
             if (BooleanEnum.TRUE.value.equals(authUserInfo.getDeleted())) {
                 userInfoRepository.deleteByIdcard(idcard);
+                iterator.remove();
                 continue;
             }
             //新增或更新人员信息
             if(null == exist) {
                 authUserInfo.setDeleted(BooleanEnum.FALSE.value);
-                AuthUserInfo save = userInfoRepository.save(authUserInfo);
-                list.add(save);
+                userInfoRepository.save(authUserInfo);
             } else {
                 BeanUtils.copyProperties(authUserInfo, exist, "id","createTime","createUser");
-                AuthUserInfo update = userInfoRepository.update(exist);
-                list.add(update);
+                userInfoRepository.update(exist);
             }
         }
-        return list;
+        return userInfoList;
     }
 
     @Override