From 4e27db66437147ee162c73f50c98265fe66d657b Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期二, 11 二月 2025 18:38:13 +0800 Subject: [PATCH] 流程推进详情页统计数据:同一个taskDefKey可能存在多个任务,取最新一个 --- business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 122 +++++++++++++++++++++++++++++----------- 1 files changed, 87 insertions(+), 35 deletions(-) diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java index 4dedffa..ef85fb1 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -966,8 +966,8 @@ List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInsId) .finished() - .includeIdentityLinks() .list(); + hisTaskList = this.distinctHisTask(hisTaskList); if (CollectionUtils.isEmpty(hisTaskList)) { return 0L; } @@ -975,20 +975,24 @@ List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey - List<ProcessCoding> taskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, hisTaskKeys) .list(); - Map<String, ProcessCoding> codingMap = taskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<HistoricTaskInstance> finishedTaskList = new ArrayList<>(); // 鍒ゆ柇 for (String key : hisTaskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� - if (Objects.isNull(processCoding)) { + if (CollectionUtils.isEmpty(targetProcessCodings)) { finishedTaskList.add(hisTaskMap.get(key)); - } else if (ProcessOverTimeConstants.NORMAL.equals(processCoding.getOvertimeStatus()) || StringUtils.isBlank(processCoding.getOvertimeStatus())) { - finishedTaskList.add(hisTaskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (ProcessOverTimeConstants.NORMAL.equals(latestProjectProcess.getOvertimeStatus()) || StringUtils.isBlank(latestProjectProcess.getOvertimeStatus())) { + finishedTaskList.add(hisTaskMap.get(key)); + } } } return Long.valueOf(finishedTaskList.size()); @@ -1024,22 +1028,26 @@ } List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList()); - Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); + Map<String, HistoricTaskInstance> hisTaskMap = this.distinctHisTask(hisTaskList).stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey - List<ProcessCoding> taskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, hisTaskKeys) .list(); - Map<String, ProcessCoding> codingMap = taskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<HistoricTaskInstance> finishedTaskList = new ArrayList<>(); // 鍒ゆ柇 for (String key : hisTaskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� - if (Objects.isNull(processCoding)) { + if (CollectionUtils.isEmpty(targetProcessCodings)) { finishedTaskList.add(hisTaskMap.get(key)); - } else if (ProcessOverTimeConstants.NORMAL.equals(processCoding.getOvertimeStatus()) || StringUtils.isBlank(processCoding.getOvertimeStatus())) { - finishedTaskList.add(hisTaskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (ProcessOverTimeConstants.NORMAL.equals(latestProjectProcess.getOvertimeStatus()) || StringUtils.isBlank(latestProjectProcess.getOvertimeStatus())) { + finishedTaskList.add(hisTaskMap.get(key)); + } } } @@ -1117,6 +1125,27 @@ return vos; } + /** + * 鏍规嵁浠诲姟key鍘婚噸鍘嗗彶浠诲姟锛岀浉鍚屾儏鍐典笅鍙栨渶鏂扮殑涓�鏉� + * + * @param hisTaskList + * @return + */ + private List<HistoricTaskInstance> distinctHisTask(List<HistoricTaskInstance> hisTaskList) { + Map<String, HistoricTaskInstance> uniqueTasks = new HashMap<>(); + for (HistoricTaskInstance task : hisTaskList) { + String taskDefinitionKey = task.getTaskDefinitionKey(); + HistoricTaskInstance existingTask = uniqueTasks.get(taskDefinitionKey); + + // 濡傛灉浠诲姟key閲嶅锛堝彲鑳借椹冲洖杩囷紝閲嶆柊鎻愪氦瀵艰嚧key閲嶅锛夛紝鍙栨渶杩戠殑涓�鏉� + if (existingTask == null || task.getCreateTime().after(existingTask.getCreateTime())) { + uniqueTasks.put(taskDefinitionKey, task); + } + } + // 鏈�缁堝幓閲嶅悗鐨勪换鍔″垪琛� + return new ArrayList<>(uniqueTasks.values()); + } + /** * 缁熻瓒呮椂鐨勪换鍔℃暟 @@ -1134,21 +1163,26 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.OVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.OVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } - return Long.valueOf(taskList.size()); } @@ -1182,18 +1216,24 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.OVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.OVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } @@ -1236,18 +1276,24 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻鍗冲皢瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.WILLOVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.WILLOVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } return Long.valueOf(tList.size()); @@ -1283,18 +1329,24 @@ List<String> taskKeys = taskList.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList()); Map<String, Task> taskMap = taskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his)); // 鏌ュ嚭鏁版嵁搴撶殑浠诲姟key - List<ProcessCoding> databaseTaskList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) + List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper()) .eq(ProcessCoding::getProcessInsId, processInsId) .in(ProcessCoding::getTaskDefKey, taskKeys) .list(); - Map<String, ProcessCoding> codingMap = databaseTaskList.stream().collect(Collectors.toMap(ProcessCoding::getTaskDefKey, pro -> pro)); List<Task> tList = new ArrayList<>(); // 鍒ゆ柇 for (String key : taskMap.keySet()) { - ProcessCoding processCoding = codingMap.get(key); - // 濡傛灉杩愯涓殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝涓嶇畻鍗冲皢瓒呮椂 - if (Objects.nonNull(processCoding) && ProcessOverTimeConstants.WILLOVERTIME.equals(processCoding.getOvertimeStatus())) { + List<ProcessCoding> targetProcessCodings = codeList.stream().filter(code -> key.equals(code.getTaskDefKey())).collect(Collectors.toList()); + // 濡傛灉宸插畬鎴愮殑浠诲姟娌′粠鏁版嵁搴撴煡鎵惧嚭鏉ワ紝璇存槑璇ヤ换鍔℃病閰嶇疆璧嬬爜绛夋椂闂达紝鐩存帴璁剧疆涓烘寜鏃跺畬鎴� + if (CollectionUtils.isEmpty(targetProcessCodings)) { tList.add(taskMap.get(key)); + } else { + // 鎸夌収鏃堕棿闄嶅簭鎺掑垪 + targetProcessCodings.sort(Comparator.comparing(ProcessCoding::getGmtCreate).reversed()); + ProcessCoding latestProjectProcess = targetProcessCodings.get(0); + if (Objects.nonNull(latestProjectProcess) && ProcessOverTimeConstants.WILLOVERTIME.equals(latestProjectProcess.getOvertimeStatus())) { + tList.add(taskMap.get(key)); + } } } -- Gitblit v1.8.0