Browse Source

feat:审核记录导出

shc 6 months ago
parent
commit
6464b6ebb9

+ 76 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/excel/TaskCheckExcelModel.java

@@ -0,0 +1,76 @@
+package com.qunzhixinxi.hnqz.admin.api.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * 任务审核记录excel模型
+ *
+ * @author jimmy
+ * @date 2025-01-06 11:24
+ */
+@Data
+public class TaskCheckExcelModel {
+
+    @ExcelProperty("(服务商业务员)全部已提交服务包数量")
+    private String pkgCount;
+
+    @ExcelProperty("(服务商业务员)全部已提交服务项目数量")
+    private String taskCount;
+
+    @ExcelProperty("已全流程完成审核服务项目数量")
+    private String finishTaskCount;
+
+    @ExcelProperty("未全流程完成审核项目数量")
+    private String unfinishedTaskCount;
+
+    // 服务商
+    @ExcelProperty("服务商负责人待审核数量")
+    private String vendorUnfinishedTaskCount;
+
+    @ExcelProperty("服务商负责人平均待审核时间")
+    private String vendorUnfinishedAvgTime;
+
+    // 地市经理
+    @ExcelProperty("事业部地市经理待审核数量")
+    private String cityUnfinishedTaskCount;
+
+    @ExcelProperty("事业部地市经理待审核数量")
+    private String cityUnfinishedAvgTime;
+
+    // 区域经理
+    @ExcelProperty("事业部区域经理待审核数量")
+    private String provinceUnfinishedTaskCount;
+
+    @ExcelProperty("事业部区域经理平均待审核时间")
+    private String provinceUnfinishedAvgTime;
+
+    // 市场组
+    @ExcelProperty("事业部市场组待审核数量")
+    private String marketUnfinishedTaskCount;
+
+    @ExcelProperty("事业部市场组平均待审核时间")
+    private String marketUnfinishedAvgTime;
+
+    // 商务组
+    @ExcelProperty("事业部商务组待审核数量")
+    private String bizUnfinishedTaskCount;
+
+    @ExcelProperty("事业部商务组平均待审核时间")
+    private String bizUnfinishedAvgTime;
+
+    // 分管领导
+    @ExcelProperty("事业部分管销售领导待审核数量")
+    private String leaderUnfinishedTaskCount;
+
+    @ExcelProperty("事业部分管销售平均待审核时间")
+    private String leaderUnfinishedAvgTime;
+
+    // 总经理
+    @ExcelProperty("事业部总经理待审核数量")
+    private String managerUnfinishedTaskCount;
+
+    @ExcelProperty("事业部总经理平均待审核时间")
+    private String managerUnfinishedAvgTime;
+
+}

+ 316 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/InitController.java

@@ -9,9 +9,12 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 import com.pig4cloud.plugin.excel.annotation.RequestExcel;
+import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
+import com.pig4cloud.plugin.excel.annotation.Sheet;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysAreaEntity;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysLog;
@@ -23,6 +26,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageTaskTypeQty;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTask;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskContent;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.api.model.excel.TaskCheckExcelModel;
 import com.qunzhixinxi.hnqz.admin.api.model.excel.WmTaskDupModel;
 import com.qunzhixinxi.hnqz.admin.event.PackageContractEvent;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
@@ -31,6 +35,7 @@ import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysAreaEntityService;
+import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeCheckHistoryService;
 import com.qunzhixinxi.hnqz.admin.service.SysLogService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
@@ -39,7 +44,6 @@ import com.qunzhixinxi.hnqz.admin.service.WmTaskContentService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
-import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationEventPublisher;
@@ -53,13 +57,16 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.Period;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -99,6 +106,7 @@ public class InitController {
     private final RedisTemplate<String, Object> redisTemplate;
     private final ApplicationEventPublisher applicationEventPublisher;
     private final WmPackageTaskTypeQtyService packageTaskTypeQtyService;
+    private final SysCheckChainNodeCheckHistoryService checkChainNodeCheckHistoryService;
 
 
     @Inner(value = false)
@@ -675,4 +683,311 @@ public class InitController {
     }
 
 
+    @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());
+                }
+
+            }
+
+        }
+
+        // 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() {
+
+        List<SysCheckChainNodeCheckHistory> all = checkChainNodeCheckHistoryService.list();
+
+        // 任务ID2List
+        Map<Integer, List<SysCheckChainNodeCheckHistory>> collect = all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getTargetId));
+
+
+        // 需要保存的审核节点
+        List<Integer> keep = new LinkedList<>();
+        // 需要改掉状态的任务
+        List<String> rejTaskId = new LinkedList<>();
+
+        for (Map.Entry<Integer, List<SysCheckChainNodeCheckHistory>> entry : collect.entrySet()) {
+
+            String taskId = entry.getKey().toString();
+
+            List<SysCheckChainNodeCheckHistory> value = entry.getValue().stream().sorted(Comparator.comparingInt(SysCheckChainNodeCheckHistory::getHistoryId)).collect(Collectors.toList());
+
+            for (SysCheckChainNodeCheckHistory history : value) {
+
+                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);
+    }
+
+
+    @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>> nodeId2HisMap = all.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
+
+        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 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 += Duration.between(task.getCreateTime(), endTime).getSeconds();
+            }
+            // 判断其他节点
+            else {
+
+                // 按节点分组
+                Map<Integer, List<SysCheckChainNodeCheckHistory>> nodeId2HisMap = sysCheckChainNodeCheckHistories.stream().collect(Collectors.groupingBy(SysCheckChainNodeCheckHistory::getNodeId));
+
+                // 判断地市 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)) {
+                            marketUnfinishedCount += bizDeptHis.size();
+                            bizUnfinishedCount += bizDeptHis.size();
+                            long seconds = Duration.between(task.getCreateTime(), endTime).getSeconds();
+                            marketUnfinishedTime += seconds;
+                            bizUnfinishedTime += 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);
+                        leaderUnfinishedCount += (int) bizCheck.get("count");
+                        leaderUnfinishedTime += (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));
+
+        int unfinishedCount = vendorUnfinishedCount + cityUnfinishedCount + provUnfinishedCount + marketUnfinishedCount + bizUnfinishedCount + leaderUnfinishedCount + mgrUnfinishedCount;
+        taskCheckExcelModel.setFinishTaskCount(String.valueOf(taskCount - unfinishedCount));
+        taskCheckExcelModel.setUnfinishedTaskCount(String.valueOf(unfinishedCount));
+
+        // 服务商
+        taskCheckExcelModel.setVendorUnfinishedTaskCount(String.valueOf(vendorUnfinishedCount));
+        taskCheckExcelModel.setVendorUnfinishedAvgTime(String.valueOf(vendorUnfinishedTime));
+
+        // 地市
+        taskCheckExcelModel.setCityUnfinishedTaskCount(String.valueOf(cityUnfinishedCount));
+        taskCheckExcelModel.setCityUnfinishedAvgTime(String.valueOf(cityUnfinishedTime));
+
+        // 区域
+        taskCheckExcelModel.setProvinceUnfinishedTaskCount(String.valueOf(provUnfinishedCount));
+        taskCheckExcelModel.setProvinceUnfinishedAvgTime(String.valueOf(provUnfinishedTime));
+
+        // 市场
+        taskCheckExcelModel.setMarketUnfinishedTaskCount(String.valueOf(marketUnfinishedCount));
+        taskCheckExcelModel.setMarketUnfinishedAvgTime(String.valueOf(marketUnfinishedTime));
+
+        // 商务
+        taskCheckExcelModel.setBizUnfinishedTaskCount(String.valueOf(bizUnfinishedCount));
+        taskCheckExcelModel.setBizUnfinishedAvgTime(String.valueOf(bizUnfinishedTime));
+
+        // 分管领导
+        taskCheckExcelModel.setLeaderUnfinishedTaskCount(String.valueOf(leaderUnfinishedCount));
+        taskCheckExcelModel.setLeaderUnfinishedAvgTime(String.valueOf(leaderUnfinishedTime));
+
+        // 总经理
+        taskCheckExcelModel.setManagerUnfinishedTaskCount(String.valueOf(mgrUnfinishedCount));
+        taskCheckExcelModel.setManagerUnfinishedAvgTime(String.valueOf(mgrUnfinishedTime));
+        return Collections.singletonList(taskCheckExcelModel);
+
+    }
+
+
+    private Map<String, Object> getCheckData(List<SysCheckChainNodeCheckHistory> cityCheckHis, WmTask task, LocalDateTime endTime) {
+
+        int count = 0;
+        long time = 0L;
+        boolean nextFlag = true;
+
+        if (CollUtil.isEmpty(cityCheckHis)) {
+            count++;
+            time += Duration.between(task.getCreateTime(), endTime).getSeconds();
+            nextFlag = false;
+        } else {
+            List<SysCheckChainNodeCheckHistory> collect = cityCheckHis.stream().sorted(Comparator.comparingInt(SysCheckChainNodeCheckHistory::getHistoryId)).collect(Collectors.toList());
+            for (SysCheckChainNodeCheckHistory his : collect) {
+                // 当前节点审核节点拒绝则流程完毕
+                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;
+
+    }
+
+
 }