Jelajahi Sumber

feat: task stat

shc 5 bulan lalu
induk
melakukan
77412fe1e3

+ 1005 - 921
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/init/InitController.java

@@ -76,7 +76,6 @@ import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-
 /**
  * 初始化控制器
  *
@@ -89,1016 +88,1101 @@ import java.util.stream.Collectors;
 @RequestMapping(value = "/init", produces = MediaType.APPLICATION_JSON_VALUE)
 public class InitController {
 
-    private final InitMapper initMapper;
-    private final WmTaskContentService taskContentService;
-    private final WmTaskService taskService;
-    private final SysLogService logService;
-    private final WmTaskTypeMapper wmTaskTypeMapper;
-    private final SysDeptMapper sysDeptMapper;
-    private final WmDaDrugEntMapper wmDaDrugEntMapper;
-    private final SysDeptRelationMapper sysDeptRelationMapper;
-    private final WmDaAgentMapper wmDaAgentMapper;
-    private final SysUserAreaService userAreaService;
-    private final SysAreaEntityService areaEntityService;
-    private final SysUserService userService;
-    private final RedisTemplate<String, Object> redisTemplate;
-    private final ApplicationEventPublisher applicationEventPublisher;
-    private final WmPackageTaskTypeQtyService packageTaskTypeQtyService;
-    private final SysCheckChainNodeCheckHistoryService checkChainNodeCheckHistoryService;
-
-    @Inner(value = false)
-    @GetMapping(value = "/cnbg/task/check/stat")
-    public R<List<Map<String, Object>>> taskCheckStat(){
-        List<Map<String, Object>> maps = initMapper.taskCheckStat();
-        return R.ok(maps);
-    }
-
-
-    @Inner(value = false)
-    @GetMapping(value = "/cnbg/test")
-    public R<String> cnbgInitTest() {
-        return R.ok("TEST:" + System.currentTimeMillis());
+  private final InitMapper initMapper;
+  private final WmTaskContentService taskContentService;
+  private final WmTaskService taskService;
+  private final SysLogService logService;
+  private final WmTaskTypeMapper wmTaskTypeMapper;
+  private final SysDeptMapper sysDeptMapper;
+  private final WmDaDrugEntMapper wmDaDrugEntMapper;
+  private final SysDeptRelationMapper sysDeptRelationMapper;
+  private final WmDaAgentMapper wmDaAgentMapper;
+  private final SysUserAreaService userAreaService;
+  private final SysAreaEntityService areaEntityService;
+  private final SysUserService userService;
+  private final RedisTemplate<String, Object> redisTemplate;
+  private final ApplicationEventPublisher applicationEventPublisher;
+  private final WmPackageTaskTypeQtyService packageTaskTypeQtyService;
+  private final SysCheckChainNodeCheckHistoryService checkChainNodeCheckHistoryService;
+
+  @Inner(value = false)
+  @GetMapping(value = "/cnbg/task/check/stat")
+  public R<List<Map<String, Object>>> taskCheckStat() {
+    List<Map<String, Object>> maps =
+        initMapper.taskCheckStat1().stream()
+            .filter(m -> !"其他".equals(m.get("node_sum_info").toString()))
+            .collect(Collectors.toList());
+    return R.ok(maps);
+  }
+
+  @Inner(value = false)
+  @GetMapping(value = "/cnbg/test")
+  public R<String> cnbgInitTest() {
+    return R.ok("TEST:" + System.currentTimeMillis());
+  }
+
+  /**
+   * 批量同步指定的任务类型给所有企业
+   *
+   * @return 结果
+   */
+  @Inner(value = false)
+  @PostMapping(value = "/cnbg/tasktype")
+  public R<?> taskTypeInit() {
+
+    List<WmTaskType> tempList =
+        wmTaskTypeMapper.selectList(
+            Wrappers.<WmTaskType>lambdaQuery().eq(WmTaskType::getTaskTypeLevel, "1"));
+
+    // List<WmTaskType> tempList = wmTaskTypeMapper.selectBatchIds(wmTaskTypes);
+
+    // 1.第一级是药企的情况
+    //		List<SysDept> deptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+    //				.eq(SysDept::getLevel, 2));
+    List<SysDept> sysDepts1 = sysDeptMapper.listAllDept();
+    List<SysDept> deptList = new ArrayList<>();
+    if (CollectionUtil.isNotEmpty(sysDepts1)) {
+      deptList =
+          sysDepts1.stream()
+              .filter(sysDept -> sysDept.getLevel().equals(2))
+              .collect(Collectors.toList());
     }
-
-    /**
-     * 批量同步指定的任务类型给所有企业
-     *
-     * @return 结果
-     */
-    @Inner(value = false)
-    @PostMapping(value = "/cnbg/tasktype")
-    public R<?> taskTypeInit() {
-
-        List<WmTaskType> tempList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery().eq(WmTaskType::getTaskTypeLevel, "1"));
-
-        // List<WmTaskType> tempList = wmTaskTypeMapper.selectBatchIds(wmTaskTypes);
-
-        // 1.第一级是药企的情况
-//		List<SysDept> deptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
-//				.eq(SysDept::getLevel, 2));
-        List<SysDept> sysDepts1 = sysDeptMapper.listAllDept();
-        List<SysDept> deptList = new ArrayList<>();
-        if (CollectionUtil.isNotEmpty(sysDepts1)) {
-            deptList = sysDepts1.stream()
-                    .filter(sysDept -> sysDept.getLevel().equals(2))
-                    .collect(Collectors.toList());
-        }
-        // 遍历药企
-        for (SysDept dept : deptList) {
-            // 生成药企任务类型
-            WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntMapper.selectOne(Wrappers.<WmDaDrugEnt>lambdaQuery()
-                    .eq(WmDaDrugEnt::getDeptId, dept.getDeptId())
-//					.eq(WmDaDrugEnt::getEnableFlag, EnableEnum.ENABLE.val())
-                    .eq(WmDaDrugEnt::getDelFlag, DelEnum.NOT_DEL.getVal()));
-            if (wmDaDrugEnt == null) {
-                continue;
-            }
-            for (WmTaskType wmTaskType1 : tempList) {
-                WmTaskType newOne = BeanUtil.copyProperties(wmTaskType1, WmTaskType.class);
-                newOne.setCreateTime(null);
-                newOne.setId(null);
-                newOne.setDurgentId(wmDaDrugEnt.getId());
-                newOne.setTaskTypeLevel("2");
-                newOne.setTaskEntId(wmDaDrugEnt.getId());
-                newOne.setDeptId(wmDaDrugEnt.getDeptId());
-                newOne.setStatus("0");
-                newOne.setBaseId(wmTaskType1.getId());
-                newOne.setRuleId(String.valueOf(wmDaDrugEnt.getId()));
-                newOne.setParentId(wmTaskType1.getParentId());
-                newOne.setTaskReceiverType(wmTaskType1.getTaskReceiverType());
-                List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
-                        .eq(WmTaskType::getTaskTypeName, wmTaskType1.getTaskTypeName())
-                        .eq(WmTaskType::getRuleId, newOne.getRuleId())
-                        .eq(WmTaskType::getDeptId, newOne.getDeptId())
-                        .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
-                if (CollectionUtil.isEmpty(taskTypeList)) {
-                    newOne.setCreateTime(LocalDateTime.now());
-                    wmTaskTypeMapper.insert(newOne);
-                }
-            }
-
-            // 查询一级CSO
-            List<SysDeptRelation> deptRelationList = sysDeptRelationMapper.selectList(Wrappers.<SysDeptRelation>lambdaQuery()
-                    .eq(SysDeptRelation::getAncestor, dept.getDeptId())
-                    .ne(SysDeptRelation::getDescendant, dept.getDeptId()));
-            if (CollectionUtil.isEmpty(deptRelationList)) {
-                continue;
-            }
-            List<Integer> oneCSODeptIdList = deptRelationList.stream()
-                    .map(SysDeptRelation::getDescendant)
-                    .collect(Collectors.toList());
-            List<SysDept> oneCSODeptList = sysDeptMapper.selectByIds(oneCSODeptIdList);
-//			List<SysDept> oneCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
-//					.eq(SysDept::getParentId, dept.getDeptId())
-//					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.getVal())
-//					.eq(SysDept::getLevel, 3));
-            for (SysDept oneCSODept : oneCSODeptList) {
-                // 生成药企给一级CSO的任务类型
-                WmDaAgent wmDaAgent = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
-                        .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
-//						.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
-                        .eq(WmDaAgent::getDeptId, oneCSODept.getDeptId()));
-                if (wmDaAgent == null) {
-                    continue;
-                }
-                for (WmTaskType wmTaskType1 : tempList) {
-                    WmTaskType newOne = BeanUtil.copyProperties(wmTaskType1, WmTaskType.class);
-                    newOne.setCreateTime(null);
-                    newOne.setId(null);
-                    newOne.setLevel1Id(wmDaAgent.getId());
-                    newOne.setDurgentId(wmDaDrugEnt.getId());
-                    newOne.setTaskTypeLevel("2");
-                    newOne.setRuleId("" + wmDaDrugEnt.getId() + wmDaAgent.getId());
-                    newOne.setTaskEntId(wmDaAgent.getId());
-                    newOne.setDeptId(wmDaAgent.getDeptId());
-                    newOne.setStatus("0");
-                    newOne.setBaseId(wmTaskType1.getId());
-                    newOne.setTaskReceiverType(wmTaskType1.getTaskReceiverType());
-                    List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
-                            .eq(WmTaskType::getTaskTypeName, wmTaskType1.getTaskTypeName())
-                            .eq(WmTaskType::getRuleId, newOne.getRuleId())
-                            .eq(WmTaskType::getDeptId, newOne.getDeptId())
-                            .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
-                    if (CollectionUtil.isEmpty(taskTypeList)) {
-                        newOne.setCreateTime(LocalDateTime.now());
-                        wmTaskTypeMapper.insert(newOne);
-                    }
-                }
-                // 生成一级CSO的任务类型
-                for (WmTaskType wmTaskType2 : tempList) {
-                    WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
-                    newOne.setCreateTime(null);
-                    newOne.setId(null);
-                    newOne.setLevel1Id(wmDaAgent.getId());
-                    newOne.setTaskTypeLevel("2");
-                    newOne.setTaskEntId(wmDaAgent.getId());
-                    newOne.setRuleId(String.valueOf(wmDaAgent.getId()));
-                    newOne.setDeptId(wmDaAgent.getDeptId());
-                    newOne.setStatus("0");
-                    newOne.setBaseId(wmTaskType2.getId());
-                    newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
-                    List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
-                            .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
-                            .eq(WmTaskType::getRuleId, newOne.getRuleId())
-                            .eq(WmTaskType::getDeptId, newOne.getDeptId())
-                            .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
-                    if (CollectionUtil.isEmpty(taskTypeList)) {
-                        newOne.setCreateTime(LocalDateTime.now());
-                        wmTaskTypeMapper.insert(newOne);
-                    }
-                }
-
-                // 查询二级CSO
-                List<SysDept> twoCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
-                        .eq(SysDept::getParentId, oneCSODept.getDeptId())
-//						.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.getVal())
-                        .eq(SysDept::getLevel, 4));
-                for (SysDept twoCSODept : twoCSODeptList) {
-                    // 生成二级CSO任务类型
-                    WmDaAgent wmDaAgent2 = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
-                            .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
-//							.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
-                            .eq(WmDaAgent::getDeptId, twoCSODept.getDeptId()));
-                    if (wmDaAgent2 == null) {
-                        continue;
-                    }
-                    for (WmTaskType wmTaskType2 : tempList) {
-                        WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
-                        newOne.setCreateTime(null);
-                        newOne.setId(null);
-                        newOne.setLevel1Id(wmDaAgent2.getId());
-                        newOne.setTaskTypeLevel("2");
-                        newOne.setTaskEntId(wmDaAgent2.getId());
-                        newOne.setRuleId(String.valueOf(wmDaAgent2.getId()));
-                        newOne.setDeptId(wmDaAgent2.getDeptId());
-                        newOne.setStatus("0");
-                        newOne.setBaseId(wmTaskType2.getId());
-                        newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
-                        List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
-                                .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
-                                .eq(WmTaskType::getRuleId, newOne.getRuleId())
-                                .eq(WmTaskType::getDeptId, newOne.getDeptId())
-                                .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
-                        if (CollectionUtil.isEmpty(taskTypeList)) {
-                            newOne.setCreateTime(LocalDateTime.now());
-                            wmTaskTypeMapper.insert(newOne);
-                        }
-                    }
-                }
-
-            }
-
-        }
-
-        // 2.第一级是CSO的情况
-//		List<SysDept> deptList2 = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
-//				.eq(SysDept::getLevel, 3)
-//				.isNull(SysDept::getParentId));
-        List<SysDept> sysDepts = sysDeptMapper.listAllDept();
-        List<SysDept> deptList2 = new ArrayList<>();
-        if (CollectionUtil.isNotEmpty(sysDepts)) {
-            deptList2 = sysDepts.stream()
-                    .filter(sysDept -> sysDept.getLevel().equals(3) && sysDept.getParentId() == null)
-                    .collect(Collectors.toList());
+    // 遍历药企
+    for (SysDept dept : deptList) {
+      // 生成药企任务类型
+      WmDaDrugEnt wmDaDrugEnt =
+          wmDaDrugEntMapper.selectOne(
+              Wrappers.<WmDaDrugEnt>lambdaQuery()
+                  .eq(WmDaDrugEnt::getDeptId, dept.getDeptId())
+                  //					.eq(WmDaDrugEnt::getEnableFlag, EnableEnum.ENABLE.val())
+                  .eq(WmDaDrugEnt::getDelFlag, DelEnum.NOT_DEL.getVal()));
+      if (wmDaDrugEnt == null) {
+        continue;
+      }
+      for (WmTaskType wmTaskType1 : tempList) {
+        WmTaskType newOne = BeanUtil.copyProperties(wmTaskType1, WmTaskType.class);
+        newOne.setCreateTime(null);
+        newOne.setId(null);
+        newOne.setDurgentId(wmDaDrugEnt.getId());
+        newOne.setTaskTypeLevel("2");
+        newOne.setTaskEntId(wmDaDrugEnt.getId());
+        newOne.setDeptId(wmDaDrugEnt.getDeptId());
+        newOne.setStatus("0");
+        newOne.setBaseId(wmTaskType1.getId());
+        newOne.setRuleId(String.valueOf(wmDaDrugEnt.getId()));
+        newOne.setParentId(wmTaskType1.getParentId());
+        newOne.setTaskReceiverType(wmTaskType1.getTaskReceiverType());
+        List<WmTaskType> taskTypeList =
+            wmTaskTypeMapper.selectList(
+                Wrappers.<WmTaskType>lambdaQuery()
+                    .eq(WmTaskType::getTaskTypeName, wmTaskType1.getTaskTypeName())
+                    .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                    .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                    .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+        if (CollectionUtil.isEmpty(taskTypeList)) {
+          newOne.setCreateTime(LocalDateTime.now());
+          wmTaskTypeMapper.insert(newOne);
         }
-        // 查询一级CSO
-        for (SysDept oneCSODept : deptList2) {
-            // 生成药企给一级CSO的任务类型
-            WmDaAgent wmDaAgent = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
+      }
+
+      // 查询一级CSO
+      List<SysDeptRelation> deptRelationList =
+          sysDeptRelationMapper.selectList(
+              Wrappers.<SysDeptRelation>lambdaQuery()
+                  .eq(SysDeptRelation::getAncestor, dept.getDeptId())
+                  .ne(SysDeptRelation::getDescendant, dept.getDeptId()));
+      if (CollectionUtil.isEmpty(deptRelationList)) {
+        continue;
+      }
+      List<Integer> oneCSODeptIdList =
+          deptRelationList.stream()
+              .map(SysDeptRelation::getDescendant)
+              .collect(Collectors.toList());
+      List<SysDept> oneCSODeptList = sysDeptMapper.selectByIds(oneCSODeptIdList);
+      //			List<SysDept> oneCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+      //					.eq(SysDept::getParentId, dept.getDeptId())
+      //					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.getVal())
+      //					.eq(SysDept::getLevel, 3));
+      for (SysDept oneCSODept : oneCSODeptList) {
+        // 生成药企给一级CSO的任务类型
+        WmDaAgent wmDaAgent =
+            wmDaAgentMapper.selectOne(
+                Wrappers.<WmDaAgent>lambdaQuery()
                     .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
-//					.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                    //						.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
                     .eq(WmDaAgent::getDeptId, oneCSODept.getDeptId()));
-            if (wmDaAgent == null) {
-                continue;
-            }
-            // 生成一级CSO的任务类型
-            for (WmTaskType wmTaskType2 : tempList) {
-                WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
-                newOne.setCreateTime(null);
-                newOne.setId(null);
-                newOne.setLevel1Id(wmDaAgent.getId());
-                newOne.setTaskTypeLevel("2");
-                newOne.setTaskEntId(wmDaAgent.getId());
-                newOne.setRuleId(String.valueOf(wmDaAgent.getId()));
-                newOne.setDeptId(wmDaAgent.getDeptId());
-                newOne.setStatus("0");
-                newOne.setBaseId(wmTaskType2.getId());
-                newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
-                List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+        if (wmDaAgent == null) {
+          continue;
+        }
+        for (WmTaskType wmTaskType1 : tempList) {
+          WmTaskType newOne = BeanUtil.copyProperties(wmTaskType1, WmTaskType.class);
+          newOne.setCreateTime(null);
+          newOne.setId(null);
+          newOne.setLevel1Id(wmDaAgent.getId());
+          newOne.setDurgentId(wmDaDrugEnt.getId());
+          newOne.setTaskTypeLevel("2");
+          newOne.setRuleId("" + wmDaDrugEnt.getId() + wmDaAgent.getId());
+          newOne.setTaskEntId(wmDaAgent.getId());
+          newOne.setDeptId(wmDaAgent.getDeptId());
+          newOne.setStatus("0");
+          newOne.setBaseId(wmTaskType1.getId());
+          newOne.setTaskReceiverType(wmTaskType1.getTaskReceiverType());
+          List<WmTaskType> taskTypeList =
+              wmTaskTypeMapper.selectList(
+                  Wrappers.<WmTaskType>lambdaQuery()
+                      .eq(WmTaskType::getTaskTypeName, wmTaskType1.getTaskTypeName())
+                      .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                      .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                      .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+          if (CollectionUtil.isEmpty(taskTypeList)) {
+            newOne.setCreateTime(LocalDateTime.now());
+            wmTaskTypeMapper.insert(newOne);
+          }
+        }
+        // 生成一级CSO的任务类型
+        for (WmTaskType wmTaskType2 : tempList) {
+          WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+          newOne.setCreateTime(null);
+          newOne.setId(null);
+          newOne.setLevel1Id(wmDaAgent.getId());
+          newOne.setTaskTypeLevel("2");
+          newOne.setTaskEntId(wmDaAgent.getId());
+          newOne.setRuleId(String.valueOf(wmDaAgent.getId()));
+          newOne.setDeptId(wmDaAgent.getDeptId());
+          newOne.setStatus("0");
+          newOne.setBaseId(wmTaskType2.getId());
+          newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+          List<WmTaskType> taskTypeList =
+              wmTaskTypeMapper.selectList(
+                  Wrappers.<WmTaskType>lambdaQuery()
+                      .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                      .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                      .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                      .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+          if (CollectionUtil.isEmpty(taskTypeList)) {
+            newOne.setCreateTime(LocalDateTime.now());
+            wmTaskTypeMapper.insert(newOne);
+          }
+        }
+
+        // 查询二级CSO
+        List<SysDept> twoCSODeptList =
+            sysDeptMapper.selectList(
+                Wrappers.<SysDept>lambdaQuery()
+                    .eq(SysDept::getParentId, oneCSODept.getDeptId())
+                    //						.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.getVal())
+                    .eq(SysDept::getLevel, 4));
+        for (SysDept twoCSODept : twoCSODeptList) {
+          // 生成二级CSO任务类型
+          WmDaAgent wmDaAgent2 =
+              wmDaAgentMapper.selectOne(
+                  Wrappers.<WmDaAgent>lambdaQuery()
+                      .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
+                      //							.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                      .eq(WmDaAgent::getDeptId, twoCSODept.getDeptId()));
+          if (wmDaAgent2 == null) {
+            continue;
+          }
+          for (WmTaskType wmTaskType2 : tempList) {
+            WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+            newOne.setCreateTime(null);
+            newOne.setId(null);
+            newOne.setLevel1Id(wmDaAgent2.getId());
+            newOne.setTaskTypeLevel("2");
+            newOne.setTaskEntId(wmDaAgent2.getId());
+            newOne.setRuleId(String.valueOf(wmDaAgent2.getId()));
+            newOne.setDeptId(wmDaAgent2.getDeptId());
+            newOne.setStatus("0");
+            newOne.setBaseId(wmTaskType2.getId());
+            newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+            List<WmTaskType> taskTypeList =
+                wmTaskTypeMapper.selectList(
+                    Wrappers.<WmTaskType>lambdaQuery()
                         .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
                         .eq(WmTaskType::getRuleId, newOne.getRuleId())
                         .eq(WmTaskType::getDeptId, newOne.getDeptId())
                         .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
-                if (CollectionUtil.isEmpty(taskTypeList)) {
-                    newOne.setCreateTime(LocalDateTime.now());
-                    wmTaskTypeMapper.insert(newOne);
-                }
-            }
-
-            // 查询二级CSO
-            List<SysDept> twoCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
-                    .eq(SysDept::getParentId, oneCSODept.getDeptId())
-//					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.getVal())
-                    .eq(SysDept::getLevel, 4));
-            for (SysDept twoCSODept : twoCSODeptList) {
-                // 生成二级CSO任务类型
-                WmDaAgent wmDaAgent2 = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
-                        .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
-//						.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
-                        .eq(WmDaAgent::getDeptId, twoCSODept.getDeptId()));
-                if (wmDaAgent2 == null) {
-                    continue;
-                }
-                for (WmTaskType wmTaskType2 : tempList) {
-                    WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
-                    newOne.setCreateTime(null);
-                    newOne.setId(null);
-                    newOne.setLevel1Id(wmDaAgent2.getId());
-                    newOne.setTaskTypeLevel("2");
-                    newOne.setTaskEntId(wmDaAgent2.getId());
-                    newOne.setRuleId(String.valueOf(wmDaAgent2.getId()));
-                    newOne.setDeptId(wmDaAgent2.getDeptId());
-                    newOne.setStatus("0");
-                    newOne.setBaseId(wmTaskType2.getId());
-                    newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
-                    List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
-                            .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
-                            .eq(WmTaskType::getRuleId, newOne.getRuleId())
-                            .eq(WmTaskType::getDeptId, newOne.getDeptId())
-                            .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
-                    if (CollectionUtil.isEmpty(taskTypeList)) {
-                        newOne.setCreateTime(LocalDateTime.now());
-                        wmTaskTypeMapper.insert(newOne);
-                    }
-                }
+            if (CollectionUtil.isEmpty(taskTypeList)) {
+              newOne.setCreateTime(LocalDateTime.now());
+              wmTaskTypeMapper.insert(newOne);
             }
+          }
         }
-        return R.ok();
+      }
     }
 
-    @Inner(value = false)
-    @PostMapping(value = "/cnbg/user/area/{userId}")
-    public R<Boolean> initUserArea(@PathVariable(value = "userId") Long userId) {
-        List<SysAreaEntity> list = areaEntityService.list(Wrappers.<SysAreaEntity>lambdaQuery().eq(SysAreaEntity::getAreaStatus, true));
-
-
-        Set<Long> collect = list.stream().mapToLong(SysAreaEntity::getAreaId).boxed().collect(Collectors.toSet());
-
-        LocalDateTime now = LocalDateTime.now();
-        List<SysUserArea> collect1 = collect.stream().map(aId -> {
-            SysUserArea userArea = new SysUserArea();
-            userArea.setUserId(userId);
-            userArea.setAreaId(aId);
-            userArea.setCreateTime(now);
-            return userArea;
-
-        }).collect(Collectors.toList());
-
-        userAreaService.saveBatch(collect1);
-        return R.ok();
+    // 2.第一级是CSO的情况
+    //		List<SysDept> deptList2 = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+    //				.eq(SysDept::getLevel, 3)
+    //				.isNull(SysDept::getParentId));
+    List<SysDept> sysDepts = sysDeptMapper.listAllDept();
+    List<SysDept> deptList2 = new ArrayList<>();
+    if (CollectionUtil.isNotEmpty(sysDepts)) {
+      deptList2 =
+          sysDepts.stream()
+              .filter(sysDept -> sysDept.getLevel().equals(3) && sysDept.getParentId() == null)
+              .collect(Collectors.toList());
     }
-
-    @Inner(value = false)
-    @PostMapping(value = "/cnbg/user/area/batch")
-    @Transactional(rollbackFor = Exception.class)
-    public R<Boolean> initUserArea() {
-
-        List<SysUser> users = userService.list(Wrappers.<SysUser>lambdaQuery().gt(SysUser::getCreateTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN)));
-
-
-        List<SysAreaEntity> list = areaEntityService.list(Wrappers.<SysAreaEntity>lambdaQuery().eq(SysAreaEntity::getAreaStatus, true));
-
-
-        Set<Long> collect = list.stream().mapToLong(SysAreaEntity::getAreaId).boxed().collect(Collectors.toSet());
-
-        LocalDateTime now = LocalDateTime.now();
-
-        for (SysUser user : users) {
-
-            List<SysUserArea> collect1 = collect.stream().map(aId -> {
-                SysUserArea userArea = new SysUserArea();
-                userArea.setUserId((long) user.getUserId());
-                userArea.setAreaId(aId);
-                userArea.setCreateTime(now);
-                return userArea;
-
-            }).collect(Collectors.toList());
-            userAreaService.saveBatch(collect1);
+    // 查询一级CSO
+    for (SysDept oneCSODept : deptList2) {
+      // 生成药企给一级CSO的任务类型
+      WmDaAgent wmDaAgent =
+          wmDaAgentMapper.selectOne(
+              Wrappers.<WmDaAgent>lambdaQuery()
+                  .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
+                  //					.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                  .eq(WmDaAgent::getDeptId, oneCSODept.getDeptId()));
+      if (wmDaAgent == null) {
+        continue;
+      }
+      // 生成一级CSO的任务类型
+      for (WmTaskType wmTaskType2 : tempList) {
+        WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+        newOne.setCreateTime(null);
+        newOne.setId(null);
+        newOne.setLevel1Id(wmDaAgent.getId());
+        newOne.setTaskTypeLevel("2");
+        newOne.setTaskEntId(wmDaAgent.getId());
+        newOne.setRuleId(String.valueOf(wmDaAgent.getId()));
+        newOne.setDeptId(wmDaAgent.getDeptId());
+        newOne.setStatus("0");
+        newOne.setBaseId(wmTaskType2.getId());
+        newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+        List<WmTaskType> taskTypeList =
+            wmTaskTypeMapper.selectList(
+                Wrappers.<WmTaskType>lambdaQuery()
+                    .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                    .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                    .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                    .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+        if (CollectionUtil.isEmpty(taskTypeList)) {
+          newOne.setCreateTime(LocalDateTime.now());
+          wmTaskTypeMapper.insert(newOne);
         }
-
-        return R.ok();
+      }
+
+      // 查询二级CSO
+      List<SysDept> twoCSODeptList =
+          sysDeptMapper.selectList(
+              Wrappers.<SysDept>lambdaQuery()
+                  .eq(SysDept::getParentId, oneCSODept.getDeptId())
+                  //					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.getVal())
+                  .eq(SysDept::getLevel, 4));
+      for (SysDept twoCSODept : twoCSODeptList) {
+        // 生成二级CSO任务类型
+        WmDaAgent wmDaAgent2 =
+            wmDaAgentMapper.selectOne(
+                Wrappers.<WmDaAgent>lambdaQuery()
+                    .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
+                    //						.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                    .eq(WmDaAgent::getDeptId, twoCSODept.getDeptId()));
+        if (wmDaAgent2 == null) {
+          continue;
+        }
+        for (WmTaskType wmTaskType2 : tempList) {
+          WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+          newOne.setCreateTime(null);
+          newOne.setId(null);
+          newOne.setLevel1Id(wmDaAgent2.getId());
+          newOne.setTaskTypeLevel("2");
+          newOne.setTaskEntId(wmDaAgent2.getId());
+          newOne.setRuleId(String.valueOf(wmDaAgent2.getId()));
+          newOne.setDeptId(wmDaAgent2.getDeptId());
+          newOne.setStatus("0");
+          newOne.setBaseId(wmTaskType2.getId());
+          newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+          List<WmTaskType> taskTypeList =
+              wmTaskTypeMapper.selectList(
+                  Wrappers.<WmTaskType>lambdaQuery()
+                      .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                      .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                      .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                      .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+          if (CollectionUtil.isEmpty(taskTypeList)) {
+            newOne.setCreateTime(LocalDateTime.now());
+            wmTaskTypeMapper.insert(newOne);
+          }
+        }
+      }
+    }
+    return R.ok();
+  }
+
+  @Inner(value = false)
+  @PostMapping(value = "/cnbg/user/area/{userId}")
+  public R<Boolean> initUserArea(@PathVariable(value = "userId") Long userId) {
+    List<SysAreaEntity> list =
+        areaEntityService.list(
+            Wrappers.<SysAreaEntity>lambdaQuery().eq(SysAreaEntity::getAreaStatus, true));
+
+    Set<Long> collect =
+        list.stream().mapToLong(SysAreaEntity::getAreaId).boxed().collect(Collectors.toSet());
+
+    LocalDateTime now = LocalDateTime.now();
+    List<SysUserArea> collect1 =
+        collect.stream()
+            .map(
+                aId -> {
+                  SysUserArea userArea = new SysUserArea();
+                  userArea.setUserId(userId);
+                  userArea.setAreaId(aId);
+                  userArea.setCreateTime(now);
+                  return userArea;
+                })
+            .collect(Collectors.toList());
+
+    userAreaService.saveBatch(collect1);
+    return R.ok();
+  }
+
+  @Inner(value = false)
+  @PostMapping(value = "/cnbg/user/area/batch")
+  @Transactional(rollbackFor = Exception.class)
+  public R<Boolean> initUserArea() {
+
+    List<SysUser> users =
+        userService.list(
+            Wrappers.<SysUser>lambdaQuery()
+                .gt(SysUser::getCreateTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN)));
+
+    List<SysAreaEntity> list =
+        areaEntityService.list(
+            Wrappers.<SysAreaEntity>lambdaQuery().eq(SysAreaEntity::getAreaStatus, true));
+
+    Set<Long> collect =
+        list.stream().mapToLong(SysAreaEntity::getAreaId).boxed().collect(Collectors.toSet());
+
+    LocalDateTime now = LocalDateTime.now();
+
+    for (SysUser user : users) {
+
+      List<SysUserArea> collect1 =
+          collect.stream()
+              .map(
+                  aId -> {
+                    SysUserArea userArea = new SysUserArea();
+                    userArea.setUserId((long) user.getUserId());
+                    userArea.setAreaId(aId);
+                    userArea.setCreateTime(now);
+                    return userArea;
+                  })
+              .collect(Collectors.toList());
+      userAreaService.saveBatch(collect1);
     }
 
-    @Inner(value = false)
-    @PostMapping(value = "/cnbg/cache/clean")
-    public R<Boolean> clean(@RequestBody Map<String, Object> params) {
-
-
-        Object o = params.get("username");
+    return R.ok();
+  }
 
-        final String errorKey = "login:error:lock:" + o;
+  @Inner(value = false)
+  @PostMapping(value = "/cnbg/cache/clean")
+  public R<Boolean> clean(@RequestBody Map<String, Object> params) {
 
-        if (Boolean.TRUE.equals(redisTemplate.hasKey(errorKey))) {
-            Boolean delete = redisTemplate.delete(errorKey);
+    Object o = params.get("username");
 
-            return R.ok(delete);
-        } else {
-            return R.ok(false, "key:" + errorKey + ",不存在");
-        }
+    final String errorKey = "login:error:lock:" + o;
 
+    if (Boolean.TRUE.equals(redisTemplate.hasKey(errorKey))) {
+      Boolean delete = redisTemplate.delete(errorKey);
 
+      return R.ok(delete);
+    } else {
+      return R.ok(false, "key:" + errorKey + ",不存在");
     }
+  }
 
-    @Inner(value = false)
-    @PostMapping(value = "/cnbg/pkg/contract/create")
-    public R<Boolean> sendPkgContractEvent(@RequestBody Map<String, Object> params) {
-        Integer pkgId = (Integer) params.get("pkgId");
-
-        List<WmPackageTaskTypeQty> list = packageTaskTypeQtyService.list(Wrappers.<WmPackageTaskTypeQty>lambdaQuery().eq(WmPackageTaskTypeQty::getPackageId, pkgId).orderByDesc(WmPackageTaskTypeQty::getCreateTime));
-
-        if (CollectionUtil.isEmpty(list)) {
-            return R.failed(Boolean.FALSE, "不存在任务数量明细");
-        }
-
-        Map<LocalDateTime, List<WmPackageTaskTypeQty>> collect = list.stream().collect(Collectors.groupingBy(WmPackageTaskTypeQty::getCreateTime));
-        LocalDateTime now = LocalDateTime.now();
-        LocalDateTime localDateTime = collect.keySet().stream().max(Comparator.comparing(item -> Math.abs(LocalDateTimeUtil.between(now, item).getSeconds()))).orElse(null);
-
-        PackageContractEvent event = new PackageContractEvent();
-        event.setPackageId(pkgId);
-        event.setTaskTypeQtiyList(collect.get(localDateTime));
-        event.setCreator("admin");
+  @Inner(value = false)
+  @PostMapping(value = "/cnbg/pkg/contract/create")
+  public R<Boolean> sendPkgContractEvent(@RequestBody Map<String, Object> params) {
+    Integer pkgId = (Integer) params.get("pkgId");
 
-        applicationEventPublisher.publishEvent(event);
+    List<WmPackageTaskTypeQty> list =
+        packageTaskTypeQtyService.list(
+            Wrappers.<WmPackageTaskTypeQty>lambdaQuery()
+                .eq(WmPackageTaskTypeQty::getPackageId, pkgId)
+                .orderByDesc(WmPackageTaskTypeQty::getCreateTime));
 
-        return R.ok(Boolean.TRUE, "合同生成事件已发送");
+    if (CollectionUtil.isEmpty(list)) {
+      return R.failed(Boolean.FALSE, "不存在任务数量明细");
     }
 
-    @Inner(value = false)
-    @GetMapping(value = "/cnbg/task/content/update")
-    public R<Boolean> init1() {
-
-        List<SysLog> logs = logService.list(Wrappers.<SysLog>lambdaQuery()
+    Map<LocalDateTime, List<WmPackageTaskTypeQty>> collect =
+        list.stream().collect(Collectors.groupingBy(WmPackageTaskTypeQty::getCreateTime));
+    LocalDateTime now = LocalDateTime.now();
+    LocalDateTime localDateTime =
+        collect.keySet().stream()
+            .max(
+                Comparator.comparing(
+                    item -> Math.abs(LocalDateTimeUtil.between(now, item).getSeconds())))
+            .orElse(null);
+
+    PackageContractEvent event = new PackageContractEvent();
+    event.setPackageId(pkgId);
+    event.setTaskTypeQtiyList(collect.get(localDateTime));
+    event.setCreator("admin");
+
+    applicationEventPublisher.publishEvent(event);
+
+    return R.ok(Boolean.TRUE, "合同生成事件已发送");
+  }
+
+  @Inner(value = false)
+  @GetMapping(value = "/cnbg/task/content/update")
+  public R<Boolean> init1() {
+
+    List<SysLog> logs =
+        logService.list(
+            Wrappers.<SysLog>lambdaQuery()
                 .ge(SysLog::getCreateTime, LocalDateTime.of(2024, 11, 10, 0, 0, 0))
                 .eq(SysLog::getTitle, "新增任务内容表"));
 
+    if (CollUtil.isEmpty(logs)) {
+      return R.ok(Boolean.TRUE, "不存在日志");
+    }
 
-        if (CollUtil.isEmpty(logs)) {
-            return R.ok(Boolean.TRUE, "不存在日志");
-        }
-
-        List<String> collect = logs.stream().map(SysLog::getParams).filter(StrUtil::isNotBlank).collect(Collectors.toList());
-
-
-        if (CollUtil.isEmpty(collect)) {
-
-            return R.ok(Boolean.TRUE, "日志参数不存在");
-        }
-
-        Set<String> ttIds = Set.of("2", "3", "4");
-        Map<String, WmTaskContent> tempContent = collect.stream()
-                // json 2 bean
-                .map(p -> JSONUtil.toBean(p, WmTaskContent.class))
-                //  获取修复的类型
-                .filter(tc -> ttIds.contains(tc.getTemp30()))
-                // temp10分组
-                .collect(Collectors.toMap(WmTaskContent::getTemp10, Function.identity(), (v1, v2) -> v2));
+    List<String> collect =
+        logs.stream()
+            .map(SysLog::getParams)
+            .filter(StrUtil::isNotBlank)
+            .collect(Collectors.toList());
 
+    if (CollUtil.isEmpty(collect)) {
 
-        // List<String> tcIds = taskService.list(Wrappers.<WmTask>lambdaQuery().ge(WmTask::getCreateTime, LocalDateTime.of(2024, 11, 10, 0, 0, 0)))
-        //         .stream().map(WmTask::getTaskContentId).sorted().collect(Collectors.toList());
+      return R.ok(Boolean.TRUE, "日志参数不存在");
+    }
 
-        List<WmTaskContent> taskContents = taskContentService.list(Wrappers.<WmTaskContent>lambdaQuery()
+    Set<String> ttIds = Set.of("2", "3", "4");
+    Map<String, WmTaskContent> tempContent =
+        collect.stream()
+            // json 2 bean
+            .map(p -> JSONUtil.toBean(p, WmTaskContent.class))
+            //  获取修复的类型
+            .filter(tc -> ttIds.contains(tc.getTemp30()))
+            // temp10分组
+            .collect(
+                Collectors.toMap(WmTaskContent::getTemp10, Function.identity(), (v1, v2) -> v2));
+
+    // List<String> tcIds =
+    // taskService.list(Wrappers.<WmTask>lambdaQuery().ge(WmTask::getCreateTime,
+    // LocalDateTime.of(2024, 11, 10, 0, 0, 0)))
+    //         .stream().map(WmTask::getTaskContentId).sorted().collect(Collectors.toList());
+
+    List<WmTaskContent> taskContents =
+        taskContentService.list(
+            Wrappers.<WmTaskContent>lambdaQuery()
                 // .in(WmTaskContent::getId, tcIds)
                 .in(WmTaskContent::getTemp30, ttIds));
 
+    List<WmTaskContent> updateed = new LinkedList<>();
 
-        List<WmTaskContent> updateed = new LinkedList<>();
+    for (WmTaskContent taskContent : taskContents) {
 
-        for (WmTaskContent taskContent : taskContents) {
+      String temp10 = taskContent.getTemp10();
 
-            String temp10 = taskContent.getTemp10();
+      WmTaskContent params = tempContent.get(temp10);
 
-            WmTaskContent params = tempContent.get(temp10);
-
-            if (params == null) {
-                continue;
-            }
-            String temp17 = params.getTemp17();
+      if (params == null) {
+        continue;
+      }
+      String temp17 = params.getTemp17();
 
+      if (StrUtil.isBlank(temp17)) {
+        continue;
+      }
+      WmTaskContent newOne = new WmTaskContent();
+      newOne.setId(taskContent.getId());
+      newOne.setTemp27(temp17);
+      updateed.add(newOne);
+    }
 
-            if (StrUtil.isBlank(temp17)) {
-                continue;
-            }
-            WmTaskContent newOne = new WmTaskContent();
-            newOne.setId(taskContent.getId());
-            newOne.setTemp27(temp17);
-            updateed.add(newOne);
+    taskContentService.updateBatchById(updateed);
 
-        }
+    log.info("updateed:{}", JSONUtil.toJsonStr(updateed));
+    return R.ok(Boolean.TRUE, updateed.size() + "");
+  }
 
+  @Inner(value = false)
+  @PostMapping(value = "/cnbg/del/dup/task")
+  @Transactional(rollbackFor = Exception.class)
+  public R<Map<String, Collection<String>>> delDupTaskContent(
+      @RequestExcel(ignoreEmptyRow = true) List<WmTaskDupModel> dup) {
 
-        taskContentService.updateBatchById(updateed);
-
-        log.info("updateed:{}", JSONUtil.toJsonStr(updateed));
-        return R.ok(Boolean.TRUE, updateed.size() + "");
+    if (CollUtil.isEmpty(dup)) {
+      return R.ok(Collections.EMPTY_MAP, "重复数据集为空");
     }
 
+    List<WmTask> targetTasks = new LinkedList<>();
 
-    @Inner(value = false)
-    @PostMapping(value = "/cnbg/del/dup/task")
-    @Transactional(rollbackFor = Exception.class)
-    public R<Map<String, Collection<String>>> delDupTaskContent(@RequestExcel(ignoreEmptyRow = true) List<WmTaskDupModel> dup) {
+    // 排序去重 && 获取重复的任务记录
+    List<String> taskNumbers =
+        dup.stream()
+            .map(WmTaskDupModel::getTaskNumber)
+            .distinct()
+            .sorted()
+            .collect(Collectors.toList());
 
+    List<List<String>> partition = Lists.partition(taskNumbers, 100);
 
-        if (CollUtil.isEmpty(dup)) {
-            return R.ok(Collections.EMPTY_MAP, "重复数据集为空");
-        }
+    for (List<String> numberList : partition) {
 
+      List<WmTask> temp =
+          taskService.list(Wrappers.<WmTask>lambdaQuery().in(WmTask::getTaskNumber, numberList));
+      targetTasks.addAll(temp);
+    }
 
-        List<WmTask> targetTasks = new LinkedList<>();
+    Map<String, WmTask> tcIds2TaskMap =
+        targetTasks.stream()
+            .collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
+    Map<String, WmTask> tIds2TaskMap =
+        targetTasks.stream().collect(Collectors.toMap(WmTask::getId, Function.identity()));
 
-        // 排序去重 && 获取重复的任务记录
-        List<String> taskNumbers = dup.stream().map(WmTaskDupModel::getTaskNumber).distinct().sorted().collect(Collectors.toList());
+    // 获取重复任务的任务内容
+    List<WmTaskContent> taskContents = new LinkedList<>();
 
-        List<List<String>> partition = Lists.partition(taskNumbers, 100);
+    List<List<String>> partition1 = Lists.partition(new ArrayList<>(tcIds2TaskMap.keySet()), 100);
 
-        for (List<String> numberList : partition) {
+    for (List<String> numberList : partition1) {
+      List<WmTaskContent> byId = taskContentService.listByIds(numberList);
+      taskContents.addAll(byId);
+    }
 
-            List<WmTask> temp = taskService.list(Wrappers.<WmTask>lambdaQuery().in(WmTask::getTaskNumber, numberList));
-            targetTasks.addAll(temp);
+    Map<String, List<WmTaskContent>> collect =
+        taskContents.stream().collect(Collectors.groupingBy(this::getContentStr));
+
+    // 要保留的数据
+    Set<String> tIds = new HashSet<>();
+    Set<String> tcIds = new HashSet<>();
+    for (Map.Entry<String, List<WmTaskContent>> entry : collect.entrySet()) {
+      List<WmTaskContent> value = entry.getValue();
+
+      if (value.size() < 2) {
+        continue;
+      }
+
+      List<WmTask> tempTasks = new LinkedList<>();
+      for (WmTaskContent taskContent : value) {
+
+        String tcId = taskContent.getId().toString();
+        WmTask task = tcIds2TaskMap.get(tcId);
+
+        tempTasks.add(task);
+      }
+
+      Map<Boolean, List<WmTask>> statusMap =
+          tempTasks.stream()
+              .collect(
+                  Collectors.partitioningBy(
+                      t -> UpmsState.TaskState.REJECTED.getState().equals(t.getTaskStatus())));
+      List<WmTask> rejected = statusMap.get(true);
+      List<WmTask> others = statusMap.get(false);
+      // 如果全是拒绝的
+      if (CollUtil.isEmpty(others)) {
+        tIds.add(rejected.get(0).getId());
+        tcIds.add(rejected.get(0).getTaskContentId());
+      }
+      // 部分拒绝的
+      else {
+        Map<Boolean, List<WmTask>> passedAndPending =
+            others.stream()
+                .collect(
+                    Collectors.partitioningBy(
+                        t -> UpmsState.TaskState.PASSED.getState().equals(t.getTaskStatus())));
+        List<WmTask> passed = passedAndPending.get(true);
+        List<WmTask> pending = passedAndPending.get(false);
+        if (CollUtil.isNotEmpty(passed)) {
+          tIds.add(passed.get(0).getId());
+          tcIds.add(passed.get(0).getTaskContentId());
+        } else {
+          if (CollUtil.isNotEmpty(pending)) {
+            tIds.add(pending.get(0).getId());
+            tcIds.add(pending.get(0).getTaskContentId());
+          }
         }
+      }
+    }
 
-
-        Map<String, WmTask> tcIds2TaskMap = targetTasks.stream().collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
-        Map<String, WmTask> tIds2TaskMap = targetTasks.stream().collect(Collectors.toMap(WmTask::getId, Function.identity()));
-
-
-        // 获取重复任务的任务内容
-        List<WmTaskContent> taskContents = new LinkedList<>();
-
-        List<List<String>> partition1 = Lists.partition(new ArrayList<>(tcIds2TaskMap.keySet()), 100);
-
-        for (List<String> numberList : partition1) {
-            List<WmTaskContent> byId = taskContentService.listByIds(numberList);
-            taskContents.addAll(byId);
+    Collection<String> disForTask = CollUtil.disjunction(tIds, tIds2TaskMap.keySet());
+    Collection<String> disForTaskContent = CollUtil.disjunction(tcIds, tcIds2TaskMap.keySet());
+
+    Map<String, Collection<String>> rest = new LinkedHashMap<>(4);
+
+    rest.put("disForTask", disForTask);
+    rest.put("availForTask", tIds);
+    rest.put("availForTaskContent", tcIds);
+    rest.put("disForTaskContent", disForTaskContent);
+
+    return R.ok(rest, Boolean.TRUE.toString());
+  }
+
+  private String getContentStr(WmTaskContent content) {
+
+    return content.getTemp1()
+        + content.getTemp2()
+        + content.getTemp3()
+        + content.getTemp4()
+        + content.getTemp5()
+        + content.getTemp6()
+        + content.getTemp7()
+        + content.getTemp8()
+        + content.getTemp9()
+        + content.getTemp10()
+        + content.getTemp11()
+        + content.getTemp12()
+        + content.getTemp13()
+        + content.getTemp14()
+        + content.getTemp15()
+        + content.getTemp16()
+        + content.getTemp17()
+        + content.getTemp18()
+        + content.getTemp19()
+        + content.getTemp20()
+        + content.getTemp21()
+        + content.getTemp22()
+        + content.getTemp23()
+        + content.getTemp24()
+        + content.getTemp25()
+        + content.getTemp26()
+        + content.getTemp27()
+        + content.getTemp28()
+        + content.getTemp29()
+        + content.getTemp30()
+        + content.getTemp31()
+        + content.getTemp32();
+  }
+
+  @Inner(value = false)
+  @GetMapping(value = "/cnbg/del/dup/task/check-rec1")
+  public R<List<Integer>> delDupTaskCheck1() {
+
+    List<SysCheckChainNodeCheckHistory> all = checkChainNodeCheckHistoryService.list();
+
+    // 任务ID2List
+    Map<Integer, List<SysCheckChainNodeCheckHistory>> collect =
+        all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
+
+    List<Integer> dupHis = new LinkedList<>();
+
+    for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> entry : collect.entrySet()) {
+
+      // 任务的审核节点记录
+      List<SysCheckChainNodeCheckHistory> value = entry.getValue();
+
+      Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeColl =
+          value.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
+
+      for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> nodeEntry :
+          nodeColl.entrySet()) {
+        List<SysCheckChainNodeCheckHistory> nodes = nodeEntry.getValue();
+
+        if (CollUtil.isEmpty(nodes)) {
+          continue;
         }
 
-
-        Map<String, List<WmTaskContent>> collect = taskContents.stream().collect(Collectors.groupingBy(this::getContentStr));
-
-        // 要保留的数据
-        Set<String> tIds = new HashSet<>();
-        Set<String> tcIds = new HashSet<>();
-        for (Map.Entry<String, List<WmTaskContent>> entry : collect.entrySet()) {
-            List<WmTaskContent> value = entry.getValue();
-
-            if (value.size() < 2) {
-                continue;
-            }
-
-            List<WmTask> tempTasks = new LinkedList<>();
-            for (WmTaskContent taskContent : value) {
-
-                String tcId = taskContent.getId().toString();
-                WmTask task = tcIds2TaskMap.get(tcId);
-
-                tempTasks.add(task);
-
-            }
-
-            Map<Boolean, List<WmTask>> statusMap = tempTasks.stream().collect(Collectors.partitioningBy(t -> UpmsState.TaskState.REJECTED.getState().equals(t.getTaskStatus())));
-            List<WmTask> rejected = statusMap.get(true);
-            List<WmTask> others = statusMap.get(false);
-            // 如果全是拒绝的
-            if (CollUtil.isEmpty(others)) {
-                tIds.add(rejected.get(0).getId());
-                tcIds.add(rejected.get(0).getTaskContentId());
-            }
-            // 部分拒绝的
-            else {
-                Map<Boolean, List<WmTask>> passedAndPending = others.stream().collect(Collectors.partitioningBy(t -> UpmsState.TaskState.PASSED.getState().equals(t.getTaskStatus())));
-                List<WmTask> passed = passedAndPending.get(true);
-                List<WmTask> pending = passedAndPending.get(false);
-                if (CollUtil.isNotEmpty(passed)) {
-                    tIds.add(passed.get(0).getId());
-                    tcIds.add(passed.get(0).getTaskContentId());
-                } else {
-                    if (CollUtil.isNotEmpty(pending)) {
-                        tIds.add(pending.get(0).getId());
-                        tcIds.add(pending.get(0).getTaskContentId());
-                    }
-                }
-
-            }
-
+        if (nodes.size() == 1) {
+          continue;
         }
 
-
-        Collection<String> disForTask = CollUtil.disjunction(tIds, tIds2TaskMap.keySet());
-        Collection<String> disForTaskContent = CollUtil.disjunction(tcIds, tcIds2TaskMap.keySet());
-
-        Map<String, Collection<String>> rest = new LinkedHashMap<>(4);
-
-        rest.put("disForTask", disForTask);
-        rest.put("availForTask", tIds);
-        rest.put("availForTaskContent", tcIds);
-        rest.put("disForTaskContent", disForTaskContent);
-
-        return R.ok(rest, Boolean.TRUE.toString());
-
-    }
-
-    private String getContentStr(WmTaskContent content) {
-
-        return content.getTemp1() +
-                content.getTemp2() +
-                content.getTemp3() +
-                content.getTemp4() +
-                content.getTemp5() +
-                content.getTemp6() +
-                content.getTemp7() +
-                content.getTemp8() +
-                content.getTemp9() +
-                content.getTemp10() +
-                content.getTemp11() +
-                content.getTemp12() +
-                content.getTemp13() +
-                content.getTemp14() +
-                content.getTemp15() +
-                content.getTemp16() +
-                content.getTemp17() +
-                content.getTemp18() +
-                content.getTemp19() +
-                content.getTemp20() +
-                content.getTemp21() +
-                content.getTemp22() +
-                content.getTemp23() +
-                content.getTemp24() +
-                content.getTemp25() +
-                content.getTemp26() +
-                content.getTemp27() +
-                content.getTemp28() +
-                content.getTemp29() +
-                content.getTemp30() +
-                content.getTemp31() +
-                content.getTemp32();
-
-
-    }
-
-
-    @Inner(value = false)
-    @GetMapping(value = "/cnbg/del/dup/task/check-rec1")
-    public R<List<Integer>> delDupTaskCheck1() {
-
-        List<SysCheckChainNodeCheckHistory> all = checkChainNodeCheckHistoryService.list();
-
-        // 任务ID2List
-        Map<Integer, List<SysCheckChainNodeCheckHistory>> collect = all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
-
-
-        List<Integer> dupHis = new LinkedList<>();
-
-        for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> entry : collect.entrySet()) {
-
-            // 任务的审核节点记录
-            List<SysCheckChainNodeCheckHistory> value = entry.getValue();
-
-            Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeColl = value.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
-
-            for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> nodeEntry : nodeColl.entrySet()) {
-                List<SysCheckChainNodeCheckHistory> nodes = nodeEntry.getValue();
-
-                if (CollUtil.isEmpty(nodes)) {
-                    continue;
-                }
-
-                if (nodes.size() == 1) {
-                    continue;
-                }
-
-                for (int i = 0, size = nodes.size(); i < size; i++) {
-                    if (i == 0) {
-                        continue;
-                    }
-                    dupHis.add(nodes.get(i).getHistoryId());
-                }
-
-            }
-
+        for (int i = 0, size = nodes.size(); i < size; i++) {
+          if (i == 0) {
+            continue;
+          }
+          dupHis.add(nodes.get(i).getHistoryId());
         }
-
-        // checkChainNodeCheckHistoryService.removeByIds(dupHis.stream().sorted().collect(Collectors.toList()));
-
-        return R.ok(dupHis.stream().sorted().collect(Collectors.toList()));
-
+      }
     }
 
-    @Inner(value = false)
-    @GetMapping(value = "/cnbg/del/dup/task/check-rec2")
-    public R<Map<String, Object>> delDupTaskCheck2() {
+    // checkChainNodeCheckHistoryService.removeByIds(dupHis.stream().sorted().collect(Collectors.toList()));
 
-        List<SysCheckChainNodeCheckHistory> all = checkChainNodeCheckHistoryService.list();
+    return R.ok(dupHis.stream().sorted().collect(Collectors.toList()));
+  }
 
-        // 任务ID2List
-        Map<Integer, List<SysCheckChainNodeCheckHistory>> collect = all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
+  @Inner(value = false)
+  @GetMapping(value = "/cnbg/del/dup/task/check-rec2")
+  public R<Map<String, Object>> delDupTaskCheck2() {
 
+    List<SysCheckChainNodeCheckHistory> all = checkChainNodeCheckHistoryService.list();
 
-        // 需要保存的审核节点
-        List<Integer> keep = new LinkedList<>();
-        // 需要改掉状态的任务
-        List<String> rejTaskId = new LinkedList<>();
+    // 任务ID2List
+    Map<Integer, List<SysCheckChainNodeCheckHistory>> collect =
+        all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
 
-        for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> entry : collect.entrySet()) {
+    // 需要保存的审核节点
+    List<Integer> keep = new LinkedList<>();
+    // 需要改掉状态的任务
+    List<String> rejTaskId = new LinkedList<>();
 
-            String taskId = entry.getKey().toString();
+    for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> entry : collect.entrySet()) {
 
-            List<SysCheckChainNodeCheckHistory> value = entry.getValue().stream().sorted(Comparator.comparingInt(SysCheckChainNodeCheckHistory::getHistoryId)).collect(Collectors.toList());
+      String taskId = entry.getKey().toString();
 
-            for (SysCheckChainNodeCheckHistory history : value) {
+      List<SysCheckChainNodeCheckHistory> value =
+          entry.getValue().stream()
+              .sorted(Comparator.comparingInt(SysCheckChainNodeCheckHistory::getHistoryId))
+              .collect(Collectors.toList());
 
-                keep.add(history.getHistoryId());
+      for (SysCheckChainNodeCheckHistory history : value) {
 
-                if (!history.getCheckResult()) {
-                    rejTaskId.add(taskId);
-                    break;
-                }
+        keep.add(history.getHistoryId());
 
-            }
+        if (!history.getCheckResult()) {
+          rejTaskId.add(taskId);
+          break;
         }
-
-        // 取节点差集(要删除的)
-        Set<Integer> allHisIds = all.stream().mapToInt(SysCheckChainNodeCheckHistory::getHistoryId).boxed().collect(Collectors.toSet());
-        Collection<Integer> need2Del = CollUtil.subtract(allHisIds, keep);
-        // checkChainNodeCheckHistoryService.removeByIds(need2Del.stream().distinct().sorted().collect(Collectors.toList()));
-
-        // taskService.update(Wrappers.<WmTask>lambdaUpdate().set(WmTask::getTaskStatus, UpmsState.TaskState.REJECTED.getState()).in(WmTask::getId, rejTaskId));
-
-
-        Map<String, Object> res = new HashMap<>(2);
-        res.put("need2Del", need2Del);
-        res.put("rejTaskId", rejTaskId);
-
-        return R.ok(res);
+      }
     }
 
-
-    @Inner(value = false)
-    @ResponseExcel(name = "taskCheckExcel", sheets = {@Sheet(sheetName = "汇总信息")})
-    @GetMapping(value = "/cnbg/init/task/check/export")
-    public List<TaskCheckExcelModel> exportTaskCheckExcel() {
-
-        LocalDateTime endTime = LocalDateTime.of(2025, 1, 6, 8, 0, 0);
-
-        // 任务数量
-        List<WmTask> total = taskService.list(Wrappers.<WmTask>lambdaQuery()
-                .between(WmTask::getCreateTime,
-                        LocalDateTime.of(2024, 10, 14, 0, 0, 0),
-                        endTime));
-
-        int taskCount = total.size();
-
-        // 积分包数量
-        Set<String> pkgIds = total.stream().map(WmTask::getScorePackageId).collect(Collectors.toSet());
-
-        int pkgCount = pkgIds.size();
-
-
-        // 审核信息
-        List<SysCheckChainNodeCheckHistory> all = checkChainNodeCheckHistoryService.list(Wrappers.<SysCheckChainNodeCheckHistory>lambdaQuery().orderByAsc(SysCheckChainNodeCheckHistory::getHistoryId));
-
-
-        Map<Integer, List<SysCheckChainNodeCheckHistory>> taskId2HisMap = all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
-
-
-        int vendorUnfinishedCount = 0;
-        long vendorUnfinishedTime = 0L;
-
-        int cityUnfinishedCount = 0;
-        long cityUnfinishedTime = 0L;
-
-        int provUnfinishedCount = 0;
-        long provUnfinishedTime = 0L;
-
-        int deptUnfinishedCount = 0;
-        long deptUnfinishedTime = 0L;
-
-
-        int marketUnfinishedCount = 0;
-        long marketUnfinishedTime = 0L;
-
-        int bizUnfinishedCount = 0;
-        long bizUnfinishedTime = 0L;
-
-
-        int leaderUnfinishedCount = 0;
-        long leaderUnfinishedTime = 0L;
-
-        int mgrUnfinishedCount = 0;
-        long mgrUnfinishedTime = 0L;
-
-
-        // 循环遍历任务
-        for (WmTask task : total) {
-
-            Integer tId = Integer.valueOf(task.getId());
-
-            // 获取当前任务的审核记录
-            List<SysCheckChainNodeCheckHistory> sysCheckChainNodeCheckHistories = taskId2HisMap.get(tId);
-
-            // 不存在审核历史说明卡在服务商管理员
-            if (CollUtil.isEmpty(sysCheckChainNodeCheckHistories)) {
-                vendorUnfinishedCount++;
-                vendorUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-            }
-            // 判断其他节点
-            else {
-
-                // 按节点分组
-                Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeId2HisMap = sysCheckChainNodeCheckHistories.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
-
-                // // 最大的节点
-                // int maxNodeId = nodeId2HisMap.keySet().stream().max(Comparator.comparingInt(Integer::valueOf)).get();
-                //
-                // // 地市没有审核
-                // if (maxNodeId == 1) {
-                //     Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //     if (any.isPresent()) {
-                //         cityUnfinishedCount++;
-                //         cityUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //     }
-                // }
-                //
-                // // 区域没有审核
-                // if (maxNodeId == 2) {
-                //     Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //     if (any.isPresent()) {
-                //         provUnfinishedCount++;
-                //         provUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //     }
-                // }
-                //
-                // // 商务组或者市场组审核
-                // if (maxNodeId == 3 ) {
-                //     Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //     if (any.isPresent()) {
-                //         deptUnfinishedCount++;
-                //         deptUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //     }
-                // }
-                //
-                // // 特殊处理
-                // if (maxNodeId == 4) {
-                //     deptUnfinishedCount++;
-                //     deptUnfinishedCount += getDurationSecond(task.getCreateTime(), endTime);
-                // }
-                //
-                // // 地市没有审核
-                // if (maxNodeId == 5) {
-                //     Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //     if (any.isPresent()) {
-                //         mgrUnfinishedCount++;
-                //         mgrUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //     }
-                // }
-                //
-                //
-                // if (maxNodeId == 8) {
-                //     Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //     if (any.isPresent()) {
-                //         bizUnfinishedCount++;
-                //         bizUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //     }
-                // }
-                //
-                // if (maxNodeId == 9) {
-                //     List<SysCheckChainNodeCheckHistory> market = nodeId2HisMap.get(8);
-                //     // 市场组审核完毕
-                //     if (CollUtil.isNotEmpty(market)) {
-                //         Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //         Optional<SysCheckChainNodeCheckHistory> any1 = nodeId2HisMap.get(8).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //         if (any.isPresent() && any1.isPresent()) {
-                //             leaderUnfinishedCount++;
-                //             leaderUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //         }
-                //     }
-                //     // 市场组没有审核
-                //     else{
-                //         Optional<SysCheckChainNodeCheckHistory> any = nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
-                //         if (any.isPresent()) {
-                //             marketUnfinishedCount++;
-                //             marketUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
-                //         }
-                //     }
-                //
-                //
-                //
-                // }
-
-                // 待服务商审核 node=1
-                List<SysCheckChainNodeCheckHistory> vendorCheckHis = nodeId2HisMap.get(1);
-                Map<String, Object> vendorCheck = getCheckData(vendorCheckHis, task, endTime);
-                boolean vendorFlag = (boolean) vendorCheck.get("nextFlag");
-
-                if (vendorFlag) {
-                    // 判断地市 node=2
-                    List<SysCheckChainNodeCheckHistory> cityCheckHis = nodeId2HisMap.get(2);
-                    Map<String, Object> cityCheck = getCheckData(cityCheckHis, task, endTime);
-                    cityUnfinishedCount += (int) cityCheck.get("count");
-                    cityUnfinishedTime += (long) cityCheck.get("time");
-                    boolean prvFlag = (boolean) cityCheck.get("nextFlag");
-
-                    // 继续判断区域 node=3
-                    if (prvFlag) {
-                        List<SysCheckChainNodeCheckHistory> provCheckHis = nodeId2HisMap.get(3);
-                        Map<String, Object> provCheck = getCheckData(provCheckHis, task, endTime);
-                        provUnfinishedCount += (int) provCheck.get("count");
-                        provUnfinishedTime += (long) provCheck.get("time");
-                        boolean bizDeptFlag = (boolean) provCheck.get("nextFlag");
-
-                        // 判断事业部 node=4
-                        if (bizDeptFlag) {
-                            List<SysCheckChainNodeCheckHistory> bizDeptHis = nodeId2HisMap.get(4);
-
-                            // 市场组和商务组都没有审核
-                            if (CollUtil.isNotEmpty(bizDeptHis)) {
-
-                                deptUnfinishedCount += bizDeptHis.size();
-                                long seconds = Duration.between(task.getCreateTime(), endTime).getSeconds();
-                                deptUnfinishedTime += seconds;
-                            }
-
-                            // 判断市场组是否审核
-                            List<SysCheckChainNodeCheckHistory> marketHis = nodeId2HisMap.get(8);
-                            Map<String, Object> marketCheck = getCheckData(marketHis, task, endTime);
-                            marketUnfinishedCount += (int) marketCheck.get("count");
-                            marketUnfinishedTime += (long) marketCheck.get("time");
-                            boolean marketFlag = (boolean) marketCheck.get("nextFlag");
-
-                            // 判断商务组是否审核
-                            List<SysCheckChainNodeCheckHistory> bizHis = nodeId2HisMap.get(9);
-                            Map<String, Object> bizCheck = getCheckData(bizHis, task, endTime);
-                            bizUnfinishedCount += (int) bizCheck.get("count");
-                            bizUnfinishedTime += (long) bizCheck.get("time");
-                            boolean bizFlag = (boolean) bizCheck.get("nextFlag");
-
-                            // 判断分管领导 node=5
-                            if (marketFlag && bizFlag) {
-                                List<SysCheckChainNodeCheckHistory> leaderHis = nodeId2HisMap.get(5);
-                                Map<String, Object> leaderCheck = getCheckData(leaderHis, task, endTime);
-                                leaderUnfinishedCount += (int) leaderCheck.get("count");
-                                leaderUnfinishedTime += (long) leaderCheck.get("time");
-                                boolean mgrFlag = (boolean) leaderCheck.get("nextFlag");
-                                // 判断总经理 node=6
-                                if (mgrFlag) {
-                                    // 判断总经理
-                                    List<SysCheckChainNodeCheckHistory> mgrHis = nodeId2HisMap.get(6);
-                                    Map<String, Object> mgrCheck = getCheckData(mgrHis, task, endTime);
-                                    mgrUnfinishedCount += (int) mgrCheck.get("count");
-                                    mgrUnfinishedTime += (long) mgrCheck.get("time");
-
-                                }
-                            }
-                        }
-                    }
+    // 取节点差集(要删除的)
+    Set<Integer> allHisIds =
+        all.stream()
+            .mapToInt(SysCheckChainNodeCheckHistory::getHistoryId)
+            .boxed()
+            .collect(Collectors.toSet());
+    Collection<Integer> need2Del = CollUtil.subtract(allHisIds, keep);
+    // checkChainNodeCheckHistoryService.removeByIds(need2Del.stream().distinct().sorted().collect(Collectors.toList()));
+
+    // taskService.update(Wrappers.<WmTask>lambdaUpdate().set(WmTask::getTaskStatus,
+    // UpmsState.TaskState.REJECTED.getState()).in(WmTask::getId, rejTaskId));
+
+    Map<String, Object> res = new HashMap<>(2);
+    res.put("need2Del", need2Del);
+    res.put("rejTaskId", rejTaskId);
+
+    return R.ok(res);
+  }
+
+  @Inner(value = false)
+  @ResponseExcel(
+      name = "taskCheckExcel",
+      sheets = {@Sheet(sheetName = "汇总信息")})
+  @GetMapping(value = "/cnbg/init/task/check/export")
+  public List<TaskCheckExcelModel> exportTaskCheckExcel() {
+
+    LocalDateTime endTime = LocalDateTime.of(2025, 1, 6, 8, 0, 0);
+
+    // 任务数量
+    List<WmTask> total =
+        taskService.list(
+            Wrappers.<WmTask>lambdaQuery()
+                .between(WmTask::getCreateTime, LocalDateTime.of(2024, 10, 14, 0, 0, 0), endTime));
+
+    int taskCount = total.size();
+
+    // 积分包数量
+    Set<String> pkgIds = total.stream().map(WmTask::getScorePackageId).collect(Collectors.toSet());
+
+    int pkgCount = pkgIds.size();
+
+    // 审核信息
+    List<SysCheckChainNodeCheckHistory> all =
+        checkChainNodeCheckHistoryService.list(
+            Wrappers.<SysCheckChainNodeCheckHistory>lambdaQuery()
+                .orderByAsc(SysCheckChainNodeCheckHistory::getHistoryId));
+
+    Map<Integer, List<SysCheckChainNodeCheckHistory>> taskId2HisMap =
+        all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
+
+    int vendorUnfinishedCount = 0;
+    long vendorUnfinishedTime = 0L;
+
+    int cityUnfinishedCount = 0;
+    long cityUnfinishedTime = 0L;
+
+    int provUnfinishedCount = 0;
+    long provUnfinishedTime = 0L;
+
+    int deptUnfinishedCount = 0;
+    long deptUnfinishedTime = 0L;
+
+    int marketUnfinishedCount = 0;
+    long marketUnfinishedTime = 0L;
+
+    int bizUnfinishedCount = 0;
+    long bizUnfinishedTime = 0L;
+
+    int leaderUnfinishedCount = 0;
+    long leaderUnfinishedTime = 0L;
+
+    int mgrUnfinishedCount = 0;
+    long mgrUnfinishedTime = 0L;
+
+    // 循环遍历任务
+    for (WmTask task : total) {
+
+      Integer tId = Integer.valueOf(task.getId());
+
+      // 获取当前任务的审核记录
+      List<SysCheckChainNodeCheckHistory> sysCheckChainNodeCheckHistories = taskId2HisMap.get(tId);
+
+      // 不存在审核历史说明卡在服务商管理员
+      if (CollUtil.isEmpty(sysCheckChainNodeCheckHistories)) {
+        vendorUnfinishedCount++;
+        vendorUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+      }
+      // 判断其他节点
+      else {
+
+        // 按节点分组
+        Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeId2HisMap =
+            sysCheckChainNodeCheckHistories.stream()
+                .collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
+
+        // // 最大的节点
+        // int maxNodeId =
+        // nodeId2HisMap.keySet().stream().max(Comparator.comparingInt(Integer::valueOf)).get();
+        //
+        // // 地市没有审核
+        // if (maxNodeId == 1) {
+        //     Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //     if (any.isPresent()) {
+        //         cityUnfinishedCount++;
+        //         cityUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //     }
+        // }
+        //
+        // // 区域没有审核
+        // if (maxNodeId == 2) {
+        //     Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //     if (any.isPresent()) {
+        //         provUnfinishedCount++;
+        //         provUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //     }
+        // }
+        //
+        // // 商务组或者市场组审核
+        // if (maxNodeId == 3 ) {
+        //     Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //     if (any.isPresent()) {
+        //         deptUnfinishedCount++;
+        //         deptUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //     }
+        // }
+        //
+        // // 特殊处理
+        // if (maxNodeId == 4) {
+        //     deptUnfinishedCount++;
+        //     deptUnfinishedCount += getDurationSecond(task.getCreateTime(), endTime);
+        // }
+        //
+        // // 地市没有审核
+        // if (maxNodeId == 5) {
+        //     Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //     if (any.isPresent()) {
+        //         mgrUnfinishedCount++;
+        //         mgrUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //     }
+        // }
+        //
+        //
+        // if (maxNodeId == 8) {
+        //     Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //     if (any.isPresent()) {
+        //         bizUnfinishedCount++;
+        //         bizUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //     }
+        // }
+        //
+        // if (maxNodeId == 9) {
+        //     List<SysCheckChainNodeCheckHistory> market = nodeId2HisMap.get(8);
+        //     // 市场组审核完毕
+        //     if (CollUtil.isNotEmpty(market)) {
+        //         Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //         Optional<SysCheckChainNodeCheckHistory> any1 =
+        // nodeId2HisMap.get(8).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //         if (any.isPresent() && any1.isPresent()) {
+        //             leaderUnfinishedCount++;
+        //             leaderUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //         }
+        //     }
+        //     // 市场组没有审核
+        //     else{
+        //         Optional<SysCheckChainNodeCheckHistory> any =
+        // nodeId2HisMap.get(maxNodeId).stream().filter(SysCheckChainNodeCheckHistory::getCheckResult).findAny();
+        //         if (any.isPresent()) {
+        //             marketUnfinishedCount++;
+        //             marketUnfinishedTime += getDurationSecond(task.getCreateTime(), endTime);
+        //         }
+        //     }
+        //
+        //
+        //
+        // }
+
+        // 待服务商审核 node=1
+        List<SysCheckChainNodeCheckHistory> vendorCheckHis = nodeId2HisMap.get(1);
+        Map<String, Object> vendorCheck = getCheckData(vendorCheckHis, task, endTime);
+        boolean vendorFlag = (boolean) vendorCheck.get("nextFlag");
+
+        if (vendorFlag) {
+          // 判断地市 node=2
+          List<SysCheckChainNodeCheckHistory> cityCheckHis = nodeId2HisMap.get(2);
+          Map<String, Object> cityCheck = getCheckData(cityCheckHis, task, endTime);
+          cityUnfinishedCount += (int) cityCheck.get("count");
+          cityUnfinishedTime += (long) cityCheck.get("time");
+          boolean prvFlag = (boolean) cityCheck.get("nextFlag");
+
+          // 继续判断区域 node=3
+          if (prvFlag) {
+            List<SysCheckChainNodeCheckHistory> provCheckHis = nodeId2HisMap.get(3);
+            Map<String, Object> provCheck = getCheckData(provCheckHis, task, endTime);
+            provUnfinishedCount += (int) provCheck.get("count");
+            provUnfinishedTime += (long) provCheck.get("time");
+            boolean bizDeptFlag = (boolean) provCheck.get("nextFlag");
+
+            // 判断事业部 node=4
+            if (bizDeptFlag) {
+              List<SysCheckChainNodeCheckHistory> bizDeptHis = nodeId2HisMap.get(4);
+
+              // 市场组和商务组都没有审核
+              if (CollUtil.isNotEmpty(bizDeptHis)) {
+
+                deptUnfinishedCount += bizDeptHis.size();
+                long seconds = Duration.between(task.getCreateTime(), endTime).getSeconds();
+                deptUnfinishedTime += seconds;
+              }
+
+              // 判断市场组是否审核
+              List<SysCheckChainNodeCheckHistory> marketHis = nodeId2HisMap.get(8);
+              Map<String, Object> marketCheck = getCheckData(marketHis, task, endTime);
+              marketUnfinishedCount += (int) marketCheck.get("count");
+              marketUnfinishedTime += (long) marketCheck.get("time");
+              boolean marketFlag = (boolean) marketCheck.get("nextFlag");
+
+              // 判断商务组是否审核
+              List<SysCheckChainNodeCheckHistory> bizHis = nodeId2HisMap.get(9);
+              Map<String, Object> bizCheck = getCheckData(bizHis, task, endTime);
+              bizUnfinishedCount += (int) bizCheck.get("count");
+              bizUnfinishedTime += (long) bizCheck.get("time");
+              boolean bizFlag = (boolean) bizCheck.get("nextFlag");
+
+              // 判断分管领导 node=5
+              if (marketFlag && bizFlag) {
+                List<SysCheckChainNodeCheckHistory> leaderHis = nodeId2HisMap.get(5);
+                Map<String, Object> leaderCheck = getCheckData(leaderHis, task, endTime);
+                leaderUnfinishedCount += (int) leaderCheck.get("count");
+                leaderUnfinishedTime += (long) leaderCheck.get("time");
+                boolean mgrFlag = (boolean) leaderCheck.get("nextFlag");
+                // 判断总经理 node=6
+                if (mgrFlag) {
+                  // 判断总经理
+                  List<SysCheckChainNodeCheckHistory> mgrHis = nodeId2HisMap.get(6);
+                  Map<String, Object> mgrCheck = getCheckData(mgrHis, task, endTime);
+                  mgrUnfinishedCount += (int) mgrCheck.get("count");
+                  mgrUnfinishedTime += (long) mgrCheck.get("time");
                 }
-
+              }
             }
-
+          }
         }
-
-
-        TaskCheckExcelModel taskCheckExcelModel = new TaskCheckExcelModel();
-        taskCheckExcelModel.setPkgCount(String.valueOf(pkgCount));
-        taskCheckExcelModel.setTaskCount(String.valueOf(taskCount));
-
-        Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeId2HisMap = all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
-        long okCount = nodeId2HisMap.get(6).stream().mapToInt(SysCheckChainNodeCheckHistory::getTargetId).distinct().count();
-
-        int unfinishedCount = vendorUnfinishedCount + cityUnfinishedCount + provUnfinishedCount + marketUnfinishedCount + bizUnfinishedCount + leaderUnfinishedCount + mgrUnfinishedCount;
-        taskCheckExcelModel.setFinishTaskCount(String.valueOf(okCount));
-        taskCheckExcelModel.setUnfinishedTaskCount(String.valueOf(unfinishedCount));
-
-        // 服务商
-        taskCheckExcelModel.setVendorUnfinishedTaskCount(String.valueOf(vendorUnfinishedCount));
-        taskCheckExcelModel.setVendorUnfinishedAvgTime(String.format("%.2f", vendorUnfinishedTime * 1.0 / (60L * 60 * 24 * vendorUnfinishedCount)));
-
-        // 地市
-        taskCheckExcelModel.setCityUnfinishedTaskCount(String.valueOf(cityUnfinishedCount));
-        taskCheckExcelModel.setCityUnfinishedAvgTime(String.format("%.2f", cityUnfinishedTime * 1.0 / (60L * 60 * 24 * cityUnfinishedCount)));
-
-        // 区域
-        taskCheckExcelModel.setProvinceUnfinishedTaskCount(String.valueOf(provUnfinishedCount));
-        taskCheckExcelModel.setProvinceUnfinishedAvgTime(String.format("%.2f", provUnfinishedTime * 1.0 / (60L * 60 * 24 * provUnfinishedCount)));
-
-        taskCheckExcelModel.setDeptUnfinishedTaskCount(String.valueOf(deptUnfinishedCount));
-        taskCheckExcelModel.setDeptUnfinishedAvgTime(String.format("%.2f", deptUnfinishedTime * 1.0 / (60L * 60 * 24 * deptUnfinishedCount)));
-
-        // 市场
-        taskCheckExcelModel.setMarketUnfinishedTaskCount(String.valueOf(marketUnfinishedCount));
-        taskCheckExcelModel.setMarketUnfinishedAvgTime(String.format("%.2f", marketUnfinishedTime * 1.0 / (60L * 60 * 24 * marketUnfinishedCount)));
-
-        // 商务
-        taskCheckExcelModel.setBizUnfinishedTaskCount(String.valueOf(bizUnfinishedCount));
-        taskCheckExcelModel.setBizUnfinishedAvgTime(String.format("%.2f", bizUnfinishedTime * 1.0 / (60L * 60 * 24 * bizUnfinishedCount)));
-
-        // 分管领导
-        taskCheckExcelModel.setLeaderUnfinishedTaskCount(String.valueOf(leaderUnfinishedCount));
-        taskCheckExcelModel.setLeaderUnfinishedAvgTime(String.format("%.2f", leaderUnfinishedTime * 1.0 / (60L * 60 * 24 * leaderUnfinishedCount)));
-
-        // 总经理
-        taskCheckExcelModel.setManagerUnfinishedTaskCount(String.valueOf(mgrUnfinishedCount));
-        taskCheckExcelModel.setManagerUnfinishedAvgTime(String.format("%.2f", mgrUnfinishedTime * 1.0 / (60L * 60 * 24 * mgrUnfinishedCount)));
-        return Collections.singletonList(taskCheckExcelModel);
-
+      }
     }
 
-
-    private Map<String, Object> getCheckData(List<SysCheckChainNodeCheckHistory> target, WmTask task, LocalDateTime endTime) {
-
-        int count = 0;
-        long time = 0L;
-        boolean nextFlag = true;
-
-        // 改节点尚未审核
-        if (CollUtil.isEmpty(target)) {
-            count++;
-            time += getDurationSecond(task.getCreateTime(), endTime);
-            nextFlag = false;
-        } else {
-            for (SysCheckChainNodeCheckHistory his : target) {
-                // 当前节点审核节点拒绝则流程完毕
-                if (!his.getCheckResult()) {
-                    nextFlag = false;
-                    break;
-                }
-
-            }
+    TaskCheckExcelModel taskCheckExcelModel = new TaskCheckExcelModel();
+    taskCheckExcelModel.setPkgCount(String.valueOf(pkgCount));
+    taskCheckExcelModel.setTaskCount(String.valueOf(taskCount));
+
+    Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeId2HisMap =
+        all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
+    long okCount =
+        nodeId2HisMap.get(6).stream()
+            .mapToInt(SysCheckChainNodeCheckHistory::getTargetId)
+            .distinct()
+            .count();
+
+    int unfinishedCount =
+        vendorUnfinishedCount
+            + cityUnfinishedCount
+            + provUnfinishedCount
+            + marketUnfinishedCount
+            + bizUnfinishedCount
+            + leaderUnfinishedCount
+            + mgrUnfinishedCount;
+    taskCheckExcelModel.setFinishTaskCount(String.valueOf(okCount));
+    taskCheckExcelModel.setUnfinishedTaskCount(String.valueOf(unfinishedCount));
+
+    // 服务商
+    taskCheckExcelModel.setVendorUnfinishedTaskCount(String.valueOf(vendorUnfinishedCount));
+    taskCheckExcelModel.setVendorUnfinishedAvgTime(
+        String.format(
+            "%.2f", vendorUnfinishedTime * 1.0 / (60L * 60 * 24 * vendorUnfinishedCount)));
+
+    // 地市
+    taskCheckExcelModel.setCityUnfinishedTaskCount(String.valueOf(cityUnfinishedCount));
+    taskCheckExcelModel.setCityUnfinishedAvgTime(
+        String.format("%.2f", cityUnfinishedTime * 1.0 / (60L * 60 * 24 * cityUnfinishedCount)));
+
+    // 区域
+    taskCheckExcelModel.setProvinceUnfinishedTaskCount(String.valueOf(provUnfinishedCount));
+    taskCheckExcelModel.setProvinceUnfinishedAvgTime(
+        String.format("%.2f", provUnfinishedTime * 1.0 / (60L * 60 * 24 * provUnfinishedCount)));
+
+    taskCheckExcelModel.setDeptUnfinishedTaskCount(String.valueOf(deptUnfinishedCount));
+    taskCheckExcelModel.setDeptUnfinishedAvgTime(
+        String.format("%.2f", deptUnfinishedTime * 1.0 / (60L * 60 * 24 * deptUnfinishedCount)));
+
+    // 市场
+    taskCheckExcelModel.setMarketUnfinishedTaskCount(String.valueOf(marketUnfinishedCount));
+    taskCheckExcelModel.setMarketUnfinishedAvgTime(
+        String.format(
+            "%.2f", marketUnfinishedTime * 1.0 / (60L * 60 * 24 * marketUnfinishedCount)));
+
+    // 商务
+    taskCheckExcelModel.setBizUnfinishedTaskCount(String.valueOf(bizUnfinishedCount));
+    taskCheckExcelModel.setBizUnfinishedAvgTime(
+        String.format("%.2f", bizUnfinishedTime * 1.0 / (60L * 60 * 24 * bizUnfinishedCount)));
+
+    // 分管领导
+    taskCheckExcelModel.setLeaderUnfinishedTaskCount(String.valueOf(leaderUnfinishedCount));
+    taskCheckExcelModel.setLeaderUnfinishedAvgTime(
+        String.format(
+            "%.2f", leaderUnfinishedTime * 1.0 / (60L * 60 * 24 * leaderUnfinishedCount)));
+
+    // 总经理
+    taskCheckExcelModel.setManagerUnfinishedTaskCount(String.valueOf(mgrUnfinishedCount));
+    taskCheckExcelModel.setManagerUnfinishedAvgTime(
+        String.format("%.2f", mgrUnfinishedTime * 1.0 / (60L * 60 * 24 * mgrUnfinishedCount)));
+    return Collections.singletonList(taskCheckExcelModel);
+  }
+
+  private Map<String, Object> getCheckData(
+      List<SysCheckChainNodeCheckHistory> target, WmTask task, LocalDateTime endTime) {
+
+    int count = 0;
+    long time = 0L;
+    boolean nextFlag = true;
+
+    // 改节点尚未审核
+    if (CollUtil.isEmpty(target)) {
+      count++;
+      time += getDurationSecond(task.getCreateTime(), endTime);
+      nextFlag = false;
+    } else {
+      for (SysCheckChainNodeCheckHistory his : target) {
+        // 当前节点审核节点拒绝则流程完毕
+        if (!his.getCheckResult()) {
+          nextFlag = false;
+          break;
         }
-
-
-        Map<String, Object> r = new HashMap<>(3);
-        r.put("count", count);
-        r.put("time", time);
-        r.put("nextFlag", nextFlag);
-
-        return r;
-
+      }
     }
 
+    Map<String, Object> r = new HashMap<>(3);
+    r.put("count", count);
+    r.put("time", time);
+    r.put("nextFlag", nextFlag);
 
-    private long getDurationSecond(LocalDateTime start, LocalDateTime end) {
-        long seconds = Duration.between(start, end).getSeconds();
+    return r;
+  }
 
-        return Math.max(seconds, 0L);
-    }
-
-
-    public void export1() {
-
-
-    }
+  private long getDurationSecond(LocalDateTime start, LocalDateTime end) {
+    long seconds = Duration.between(start, end).getSeconds();
 
+    return Math.max(seconds, 0L);
+  }
 
+  public void export1() {}
 }

+ 2 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/InitMapper.java

@@ -17,4 +17,6 @@ public interface InitMapper {
 
 
     List<Map<String, Object>> taskCheckStat();
+
+    List<Map<String, Object>> taskCheckStat1();
 }

+ 23 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/InitMapper.xml

@@ -46,4 +46,27 @@
     GROUP BY T.task_status, TC1.node_id
     ORDER BY TC1.node_id, T.task_status
   </select>
+
+  <select id="taskCheckStat1" resultType="map">
+    select
+      his.node_sum,
+      CASE
+        WHEN node_sum = 1  then '待地市'
+        WHEN node_sum = 3 then '待区域'
+        WHEN node_sum = 6 then '市场和商务均没审核'
+        WHEN node_sum = 14 then '待商务'
+        WHEN node_sum = 15 then '待市场'
+        WHEN node_sum = 23 then '待分管'
+        WHEN node_sum = 28 THEN '待总经理' ELSE '其他'
+        END AS node_sum_info,
+      count(1) AS tot
+    from wm_task AS t
+           INNER JOIN (SELECT h.target_id, SUM(DISTINCT h.node_id) AS node_sum
+                       FROM sys_chain_node_check_his AS h
+                       GROUP BY h.target_id) AS his
+                      ON his.target_id = t.id
+    WHERE t.task_status = '3'
+    GROUP BY his.node_sum
+    ORDER BY node_sum
+  </select>
 </mapper>