2 Commits b7d820c850 ... 8649f40c6a

Author SHA1 Message Date
  lixuesong 8649f40c6a feat: 分批次查询,防止in过多报错 6 days ago
  lixuesong 023ad8d0cf fix: /stat/pkg/tree个人包按照下级任务汇总了积分,但是B包没有汇总个人包的积分修复 6 days ago

+ 59 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysStatisticManager.java

@@ -55,11 +55,13 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 统计控制器
@@ -544,6 +546,21 @@ public class SysStatisticManager {
         List<Integer> deptIds = cont.stream().mapToInt(p -> Integer.parseInt(p.getDeptId())).distinct().boxed().sorted().collect(Collectors.toList());
         Map<Integer, String> dId2NameMap = deptService.list(Wrappers.<SysDept>lambdaQuery().in(SysDept::getDeptId, deptIds)).stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getName));
 
+        // 批量查询任务
+        List<WmTask> tasks = new ArrayList<>();
+        Set<String> allPkgIds = cont.stream().map(WmScorePackage::getId).collect(Collectors.toSet());
+        // 分批次查询
+        List<List<String>> batchPkgIds = CollUtil.split(allPkgIds, 1000);
+        for (List<String> batchPkgId : batchPkgIds) {
+            List<WmTask> batchTasks = taskService.list(Wrappers.<WmTask>lambdaQuery()
+                    .eq(WmTask::getTaskStatus, UpmsState.TaskState.PASSED)
+                    .in(WmTask::getScorePackageId, batchPkgId));
+            tasks.addAll(batchTasks);
+        }
+
+        // 根据执行包ID分组
+        Map<String, List<WmTask>> pkg2TaskListMap = tasks.stream().collect(Collectors.groupingBy(WmTask::getScorePackageId));
+
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
         List<TreeNode<Integer>> treeNodes = cont.stream().map(pkg -> {
             TreeNode<Integer> node = new TreeNode<>();
@@ -573,13 +590,13 @@ public class SysStatisticManager {
             extra.put("createTime", pkg.getCreateTime());
 
             // 完成分值
-            List<WmTask> tasks = taskService.list(Wrappers.<WmTask>lambdaQuery()
-                    .eq(WmTask::getTaskStatus, UpmsState.TaskState.PASSED)
-                    .eq(WmTask::getScorePackageId, pkg.getId()));
-
             long sum = 0;
-            if (CollUtil.isNotEmpty(tasks)) {
-                sum = tasks.stream().mapToLong(WmTask::getScore).sum();
+
+            // 根据任意层级的pkgId获取任务列表
+            List<WmTask> thisPkgTasks = this.getTasksByPkgId(pkg.getId(), cont, pkg2TaskListMap);
+
+            if (CollUtil.isNotEmpty(thisPkgTasks)) {
+                sum = thisPkgTasks.stream().mapToLong(WmTask::getScore).sum();
             }
             extra.put("completedScore", sum);
 
@@ -614,6 +631,42 @@ public class SysStatisticManager {
         return page1;
     }
 
+    /**
+     * 根据任意层级的pkgId获取任务列表
+     *
+     * @param pkgId           上级执行包ID
+     * @param pkgs            执行包集合
+     * @param pkg2TaskListMap 根据执行包ID分组的任务map
+     * @return {@link Set }<{@link String }> 任务列表
+     */
+    private List<WmTask> getTasksByPkgId(String pkgId, List<WmScorePackage> pkgs, Map<String, List<WmTask>> pkg2TaskListMap) {
+        // 当前包ID对应的个人包ID
+        Set<String> taskPkgIds = new HashSet<>();
+        taskPkgIds.add(pkgId);
+
+        // 获取当前执行包ID的所有子包ID
+        Set<String> subPkgIds = Set.of(pkgId);
+        while (true) {
+            Set<String> finalSubPkgIds = subPkgIds;
+            subPkgIds = pkgs.stream()
+                    .filter(pkg -> finalSubPkgIds.contains(pkg.getRelationScoreId()))
+                    .map(WmScorePackage::getId).collect(Collectors.toSet());
+            if (CollUtil.isEmpty(subPkgIds)) {
+                break;
+            }
+
+            taskPkgIds.addAll(subPkgIds);
+        }
+
+        // 根据子执行包ID获取任务
+        List<WmTask> tasks = new ArrayList<>();
+        for (String taskPkgId : taskPkgIds) {
+            tasks.addAll(pkg2TaskListMap.getOrDefault(taskPkgId, new ArrayList<>()));
+        }
+
+        return tasks;
+    }
+
     /**
      * 统计服务商数据
      * <p>