Răsfoiți Sursa

wbs树节点统计优化

lvy 1 lună în urmă
părinte
comite
c71e52d225

+ 14 - 7
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/WbsTreeContractStatistics.java

@@ -63,38 +63,38 @@ public class WbsTreeContractStatistics implements Serializable {
      * 叶子节点数量
      */
     @ApiModelProperty(value = "叶子节点数量")
-    private Integer leafNum = 0;
+    private Integer leafNum;
 
     /**
      * 已填报数量
      */
     @ApiModelProperty(value = "已填报数量")
-    private Integer fillNum = 0;
+    private Integer fillNum;
     /**
      * 待审批数量
      */
     @ApiModelProperty(value = "待审批数量")
-    private Integer approveNum = 0;
+    private Integer approveNum;
     /**
      * 已审批数量
      */
     @ApiModelProperty(value = "已审批数量")
-    private Integer completeNum = 0;
+    private Integer completeNum;
     /**
      * 已填报数量(监理)
      */
     @ApiModelProperty(value = "已填报数量(监理)")
-    private Integer jlFillNum = 0;
+    private Integer jlFillNum;
     /**
      * 待审批数量(监理)
      */
     @ApiModelProperty(value = "待审批数量(监理)")
-    private Integer jlApproveNum = 0;
+    private Integer jlApproveNum;
     /**
      * 已审批数量(监理)
      */
     @ApiModelProperty(value = "已审批数量(监理)")
-    private Integer jlCompleteNum = 0;
+    private Integer jlCompleteNum;
 
     @DateTimeFormat(
             pattern = "yyyy-MM-dd HH:mm:ss"
@@ -133,6 +133,13 @@ public class WbsTreeContractStatistics implements Serializable {
             this.ancestors = ancestors == null ? "" : ancestors;
             this.status = 1;
             this.isLeaf = 1;
+            this.fillNum = 0;
+            this.approveNum = 0;
+            this.completeNum = 0;
+            this.jlFillNum = 0;
+            this.jlApproveNum = 0;
+            this.jlCompleteNum = 0;
+            this.leafNum = 0;
         }
     }
 

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/WbsTreeContractStatisticsClient.java

@@ -45,4 +45,7 @@ public interface WbsTreeContractStatisticsClient {
     @GetMapping(API_PREFIX + "/statisticsContract")
     void statisticsContract(@RequestParam Long contractId);
 
+    @GetMapping(API_PREFIX + "/updateAncestors")
+    void updateAncestors(@RequestParam String ids);
+
 }

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/WbsTreeContractStatisticsClientImpl.java

@@ -164,4 +164,10 @@ public class WbsTreeContractStatisticsClientImpl implements WbsTreeContractStati
     public void statisticsContract(Long contractId) {
         wbsTreeContractStatisticsService.statisticsContract(contractId);
     }
+
+    @Override
+    @Async
+    public void updateAncestors(String ids) {
+        wbsTreeContractStatisticsService.updateAncestors(ids);
+    }
 }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/WbsTreeContractStatisticsMapper.xml

@@ -28,14 +28,14 @@
     <update id="updateLeafNum">
         UPDATE m_wbs_tree_contract_statistics a INNER JOIN (
                 select  b.id, COUNT(c.id) AS leaf_num, sum(c.fill_num) as fill_num, sum(c.approve_num) as approve_num, sum(c.complete_num) as complete_num, sum(c.jl_fill_num) as jl_fill_num, sum(c.jl_approve_num) as jl_approve_num, sum(c.jl_complete_num) as jl_complete_num
-                FROM m_wbs_tree_contract_statistics b INNER JOIN m_wbs_tree_contract_statistics c  ON c.contract_id = b.contract_id AND c.is_leaf = 1 AND c.is_deleted = 0  AND c.status = 1 AND c.ancestors LIKE CONCAT(b.ancestors, ',', b.id, '%')
+                FROM m_wbs_tree_contract_statistics b INNER JOIN m_wbs_tree_contract_statistics c  ON c.contract_id = b.contract_id AND c.leaf_num = 0 AND c.is_deleted = 0  AND c.status = 1 AND c.ancestors LIKE CONCAT(b.ancestors, ',', b.id, '%')
                 WHERE b.id IN (
                     <foreach collection="ids" item="item" separator=",">
                         #{item}
                     </foreach>
                     ) GROUP BY b.id
             ) AS t ON a.id = t.id
-        SET a.leaf_num = t.leaf_num, a.fill_num = t.fill_num,a.approve_num = t.approve_num, a.complete_num = t.complete_num, a.jl_fill_num =t.jl_fill_num, a.jl_approve_num = t.jl_approve_num, a.jl_complete_num = t.jl_complete_num;
+        SET a.leaf_num = t.leaf_num, a.fill_num = t.fill_num,a.approve_num = t.approve_num, a.complete_num = t.complete_num, a.jl_fill_num =t.jl_fill_num, a.jl_approve_num = t.jl_approve_num, a.jl_complete_num = t.jl_complete_num, a.is_leaf = if(t.leaf_num > 0, 0, 1);
     </update>
     <select id="getByIdOnLock" resultMap="ResultMap">
         select <include refid="includeSql"/> from m_wbs_tree_contract_statistics where id = #{id} for update

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IWbsTreeContractStatisticsService.java

@@ -12,5 +12,6 @@ public interface IWbsTreeContractStatisticsService extends IService<WbsTreeContr
     Boolean updateIsDeleted(Long id, Integer isDeleted);
     void statisticsContract(Long contractId);
 
+    void updateAncestors(String ids);
     void sync();
 }

+ 93 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WbsTreeContractStatisticsServiceImpl.java

@@ -234,6 +234,92 @@ public class WbsTreeContractStatisticsServiceImpl extends ServiceImpl<WbsTreeCon
         return true;
     }
 
+    @Override
+    public void updateAncestors(String ids) {
+        if (!StringUtil.hasText(ids)) {
+            return;
+        }
+        String[] split = ids.split(",");
+        if (split.length == 0) {
+            return;
+        }
+        Map<Long, Long> map = new HashMap<>();
+        {
+            ids = Arrays.stream(split).filter(StringUtil::isNumeric).distinct().collect(Collectors.joining(","));
+            List<WbsTreeContract> query = jdbcTemplate.query("SELECT id,p_key_id,p_id,parent_id FROM m_wbs_tree_contract WHERE is_deleted = 0 and type = 1 and p_key_id in (" + String.join(",", ids) + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if (query.isEmpty()) {
+                return;
+            }
+            // 只更新父级节点
+            Map<Long, List<WbsTreeContract>> childrenMap = query.stream().collect(Collectors.groupingBy(WbsTreeContract::getPId));
+            for (WbsTreeContract wbsTreeContract : query) {
+                List<WbsTreeContract> list = childrenMap.get(wbsTreeContract.getPKeyId());
+                if (list == null) {
+                    // 更新当前节点 parent ancestors字段
+                    map.put(wbsTreeContract.getPKeyId(), wbsTreeContract.getPId());
+                }
+            }
+        }
+        if (map.isEmpty()) {
+            return;
+        }
+        List<WbsTreeContractStatistics> wbsTreeContractStatistics = this.listByIds(map.keySet());
+        List<WbsTreeContractStatistics> parentList = this.listByIds(map.values());
+        Map<Long, WbsTreeContractStatistics> parentMap = parentList.stream().collect(Collectors.toMap(WbsTreeContractStatistics::getId, item -> item));
+        List<WbsTreeContractStatistics> updateList = new ArrayList<>();
+        List<String> sqlList = new ArrayList<>();
+        for (WbsTreeContractStatistics statistics : wbsTreeContractStatistics) {
+            Long parentId = map.get(statistics.getId());
+            WbsTreeContractStatistics update = new WbsTreeContractStatistics();
+            update.setId(statistics.getId());
+            if (parentId == null) {
+                update.setParentId(0L);
+                update.setAncestors("0");
+                updateList.add(update);
+                continue;
+            }
+            WbsTreeContractStatistics parent = parentMap.get(parentId);
+            if (parent == null) {
+                update.setParentId(0L);
+                update.setAncestors("0");
+                updateList.add(update);
+                continue;
+            }
+            update.setParentId(parent.getId());
+            update.setAncestors(parent.getAncestors() + "," + parent.getId());
+            updateList.add(update);
+            WbsTreeContractStatistics temp = new WbsTreeContractStatistics();
+            temp.setId(statistics.getParentId());
+            temp.setAncestors(statistics.getAncestors());
+            parentMap.put(statistics.getParentId(), temp);
+            String oldAncestors = statistics.getAncestors() + "," + statistics.getId();
+            String newAncestors = update.getAncestors() + "," + statistics.getId();
+            String sql = "UPDATE m_wbs_tree_contract_statistics SET ancestors = replace(ancestors, '" + oldAncestors + "', '" + newAncestors + "') WHERE is_deleted = 0 and status = 1 and ancestors like '"
+                    + oldAncestors + "%' and contract_id = " + statistics.getContractId();
+            sqlList.add(sql);
+        }
+        Set<Long> parentIds = new HashSet<>();
+        parentMap.values().forEach(item -> {
+            parentIds.add(item.getId());
+            String ancestors = item.getAncestors();
+            if (ancestors != null && !ancestors.isEmpty()) {
+                String[] split1 = ancestors.split(",");
+                for (String s : split1) {
+                    if (StringUtil.isNumeric(s)) {
+                        parentIds.add(Long.parseLong(s));
+                    }
+                }
+            }
+        });
+        this.updateBatchById(updateList);
+        for (String s : sqlList) {
+            jdbcTemplate.update(s);
+        }
+        if (!parentIds.isEmpty()) {
+            this.baseMapper.updateLeafNum(parentIds);
+        }
+    }
+
     public void createWbsTreeContractStatisticsParent(WbsTreeContract wbsTreeContract, WbsTreeContractStatistics wbsTreeContractStatistics, List<WbsTreeContractStatistics> wbsTreeContractStatisticsList) {
         if (wbsTreeContract.getParentId() == null || wbsTreeContract.getParentId() <= 0) {
             wbsTreeContractStatistics.setParentId(0L);
@@ -247,6 +333,7 @@ public class WbsTreeContractStatisticsServiceImpl extends ServiceImpl<WbsTreeCon
                 return;
             }
             parent = createWbsTreeContractStatistics(wbsTreeContractParent);
+            parent.setIsLeaf(0);
             createWbsTreeContractStatisticsParent(wbsTreeContractParent, parent, wbsTreeContractStatisticsList);
             wbsTreeContractStatisticsList.add(parent);
         } else {
@@ -254,20 +341,24 @@ public class WbsTreeContractStatisticsServiceImpl extends ServiceImpl<WbsTreeCon
                 wbsTreeContractStatistics.setParentId(parent.getId());
                 wbsTreeContractStatistics.setAncestors(parent.getAncestors() + "," + parent.getId());
             }
+            if (parent.getIsLeaf() == 1) {
+                this.update(Wrappers.<WbsTreeContractStatistics>lambdaUpdate().eq(WbsTreeContractStatistics::getId, parent.getId()).set(WbsTreeContractStatistics::getIsLeaf, 0));
+            }
         }
     }
 
     public void createWbsTreeContractStatisticsChildren(WbsTreeContract wbsTreeContract, WbsTreeContractStatistics wbsTreeContractStatistics, List<WbsTreeContractStatistics> wbsTreeContractStatisticsList) {
         List<WbsTreeContract> wbsTreeContracts =  jdbcTemplate.query("select * from m_wbs_tree_contract where is_deleted = 0 and type = 1 and contract_id = ? and p_id = ?",
                 new Object[]{wbsTreeContract.getContractId(), wbsTreeContract.getPKeyId()}, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-        if (wbsTreeContracts == null || wbsTreeContracts.isEmpty()) {
+        if (wbsTreeContracts.isEmpty()) {
             wbsTreeContractStatistics.setIsLeaf(1);
             wbsTreeContractStatistics.setLeafNum(0);
             return;
         }
+        wbsTreeContractStatistics.setIsLeaf(0);
         wbsTreeContracts.forEach(item -> {
             WbsTreeContractStatistics statistics = createWbsTreeContractStatistics(item);
-            createWbsTreeContractStatisticsChildren(item, wbsTreeContractStatistics, wbsTreeContractStatisticsList);
+            createWbsTreeContractStatisticsChildren(item, statistics, wbsTreeContractStatisticsList);
             statistics.setAncestors(wbsTreeContractStatistics.getAncestors() + "," + wbsTreeContractStatistics.getId());
             statistics.setParentId(wbsTreeContractStatistics.getId());
             wbsTreeContractStatisticsList.add(statistics);