|
@@ -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;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|