From cde5e6335dd02db4d2137ba6d5f330544e764b3d Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期三, 26 三月 2025 04:13:26 +0800
Subject: [PATCH] 任务统计bug

---
 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java |  131 +++++++++++++++++++++++++++++++++----------
 1 files changed, 99 insertions(+), 32 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 628ff3d..b6ed61c 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -331,7 +331,7 @@
         // 鎺掗櫎瀹圭己鍚庡張瀹屾垚鐨勪换鍔�
         List<ProcessLog> finishedTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
                 .eq(ProcessLog::getProcessInsId, processInsId)
-                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED)
+                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.REJECT)
                 .list();
         List<String> finishedTaskIds = finishedTaskList.stream().map(ProcessLog::getTaskId).distinct().collect(Collectors.toList());
         // 寰楀埌鏈畬鎴愮殑瀹圭己浠诲姟
@@ -339,7 +339,19 @@
         if (CollectionUtils.isEmpty(waitTaskIds)) {
             return 0L;
         }
-        return Long.valueOf(waitTaskIds.size());
+        // 瀹圭己鐨勪换鍔¢兘灞炰簬鍘嗗彶浠诲姟锛屽彧鏄渶瑕佽ˉ琛ㄥ崟鏁版嵁
+        List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
+                .processInstanceId(processInsId)
+                .taskIds(waitTaskIds)
+                .includeIdentityLinks()
+                .orderByHistoricTaskInstanceStartTime()
+                .desc()
+                .list();
+        hisTaskList = this.distinctHisTask(hisTaskList);
+        // 鎺掗櫎杩愯鏃朵换鍔�
+        List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList());
+        return Long.valueOf(hisTaskList.size());
     }
 
     @Override
@@ -1403,21 +1415,25 @@
      */
     private Long getTimelyTaskNum(String processInsId) {
         // 鏌ュ嚭宸插畬鎴愮殑浠诲姟key
-        List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
+        HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery()
                 .processInstanceId(processInsId)
                 .finished()
-                .list();
-        // 鎺掗櫎璺宠繃銆佸缂虹殑浠诲姟锛屽洜涓鸿繖涓や釜鎿嶄綔閮戒細瀹屾垚浠诲姟鑰屼骇鐢熷巻鍙蹭换鍔�
-        List<String> jumpAndWaitTaskIds = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
-                .eq(ProcessLog::getProcessInsId, processInsId)
-                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT, ProcessLogEventTypeEnum.REJECT)
-                .list().stream().map(ProcessLog::getTaskId).collect(Collectors.toList());
-        hisTaskList = hisTaskList.stream().filter(hisTask -> jumpAndWaitTaskIds.indexOf(hisTask.getId()) == -1).collect(Collectors.toList());
-        hisTaskList = this.distinctHisTask(hisTaskList);
+                .includeIdentityLinks()
+                .orderByTaskCreateTime()
+                .desc();
+        List<HistoricTaskInstance> hisTaskList = query.list();
         if (CollectionUtils.isEmpty(hisTaskList)) {
             return 0L;
         }
-
+        hisTaskList = this.distinctHisTask(hisTaskList);
+        // 鎺掗櫎璺宠繃銆佸缂虹殑浠诲姟锛屽洜涓鸿繖涓や釜鎿嶄綔閮戒細瀹屾垚浠诲姟鑰屼骇鐢熷巻鍙蹭换鍔�
+        List<String> jumpAndWaitTaskKeys = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
+                .eq(ProcessLog::getProcessInsId, processInsId)
+                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT) // TODO 濡傛灉杩愯鏃朵换鍔℃濂芥槸琚┏鍥炵殑锛岄渶瑕佹兂鍔炴硶鎺掗櫎璋冭椹冲洖鐨勪换鍔★紝涓嶈兘鐩存帴鍦ㄨ繖鍔� ProcessLogEventTypeEnum.REJECT
+                .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList());
+        List<String> runtimeTaskKey = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        jumpAndWaitTaskKeys.addAll(runtimeTaskKey);
+        hisTaskList = hisTaskList.stream().filter(hisTask -> jumpAndWaitTaskKeys.indexOf(hisTask.getTaskDefinitionKey()) == -1).collect(Collectors.toList());
         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
@@ -1460,27 +1476,32 @@
         int endNum = startNum + pageSize;
 
         // 鏌ュ嚭宸插畬鎴愮殑浠诲姟key
-        List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
+        HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery()
                 .processInstanceId(processInsId)
                 .finished()
-                .taskNameLike(taskName)
                 .includeIdentityLinks()
                 .orderByTaskCreateTime()
-                .desc()
-                .list();
+                .desc();
+        if (StringUtils.isNotBlank(taskName)) {
+            query.taskNameLike(taskName);
+        }
+        List<HistoricTaskInstance> hisTaskList = query.list();
         if (CollectionUtils.isEmpty(hisTaskList)) {
             result.total(0);
             return new ArrayList<>();
         }
+        hisTaskList = this.distinctHisTask(hisTaskList);
         // 鎺掗櫎璺宠繃銆佸缂虹殑浠诲姟锛屽洜涓鸿繖涓や釜鎿嶄綔閮戒細瀹屾垚浠诲姟鑰屼骇鐢熷巻鍙蹭换鍔�
-        List<String> jumpAndWaitTaskIds = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
+        List<String> jumpAndWaitTaskKeys = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
                 .eq(ProcessLog::getProcessInsId, processInsId)
                 .eq(ProcessLog::getProjectId, projectId)
-                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT, ProcessLogEventTypeEnum.REJECT)
-                .list().stream().map(ProcessLog::getTaskId).collect(Collectors.toList());
-        hisTaskList = hisTaskList.stream().filter(hisTask -> jumpAndWaitTaskIds.indexOf(hisTask.getId()) == -1).collect(Collectors.toList());
+                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT)
+                .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList());
+        List<String> runtimeTaskKey = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        jumpAndWaitTaskKeys.addAll(runtimeTaskKey);
+        hisTaskList = hisTaskList.stream().filter(hisTask -> jumpAndWaitTaskKeys.indexOf(hisTask.getTaskDefinitionKey()) == -1).collect(Collectors.toList());
         List<String> hisTaskKeys = hisTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList());
-        Map<String, HistoricTaskInstance> hisTaskMap = this.distinctHisTask(hisTaskList).stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his));
+        Map<String, HistoricTaskInstance> hisTaskMap = hisTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his));
         // 鏌ュ嚭鏃堕棿姝e父鐨勪换鍔ey
         List<ProcessCoding> codeList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                 .eq(ProcessCoding::getProcessInsId, processInsId)
@@ -2018,15 +2039,31 @@
                 .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP)
                 .orderByDesc(ProcessLog::getGmtCreate)
                 .list();
+        // 鎺掗櫎椹冲洖鐨�
+        List<String> rejectTaskIds = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
+                .select(ProcessLog::getTaskId)
+                .eq(ProcessLog::getProcessInsId, processInsId)
+                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.REJECT)
+                .orderByDesc(ProcessLog::getGmtCreate)
+                .list().stream().map(ProcessLog::getTaskId).collect(Collectors.toList());
+
         List<String> jumpTaskIds = allJumpTaskList.stream().map(ProcessLog::getTaskId).collect(Collectors.toList());
+        jumpTaskIds.removeAll(rejectTaskIds);
+        if(CollectionUtils.isEmpty(jumpTaskIds)) {
+            return 0L;
+        }
         List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
                 .processInstanceId(processInsId)
+                .finished()
                 .taskIds(jumpTaskIds)
                 .includeIdentityLinks()
                 .orderByHistoricTaskInstanceStartTime()
                 .desc()
                 .list();
         hisTaskList = this.distinctHisTask(hisTaskList);
+        // 鎺掗櫎杩愯鏃朵换鍔�
+        List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList());
         return Long.valueOf(hisTaskList.size());
     }
 
@@ -2056,15 +2093,33 @@
                 .like(StringUtils.isNotBlank(taskName), ProcessLog::getTaskName, taskName)
                 .orderByDesc(ProcessLog::getGmtCreate)
                 .list();
+        // 鎺掗櫎椹冲洖鐨�
+        List<String> rejectTaskIds = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
+                .select(ProcessLog::getTaskId)
+                .eq(ProcessLog::getProcessInsId, processInsId)
+                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.REJECT)
+                .like(StringUtils.isNotBlank(taskName), ProcessLog::getTaskName, taskName)
+                .orderByDesc(ProcessLog::getGmtCreate)
+                .list().stream().map(ProcessLog::getTaskId).collect(Collectors.toList());
+
         List<String> jumpTaskIds = allJumpTaskList.stream().map(ProcessLog::getTaskId).collect(Collectors.toList());
+        jumpTaskIds.removeAll(rejectTaskIds);
+        if(CollectionUtils.isEmpty(jumpTaskIds)) {
+            result.total(0l);
+            return new ArrayList<>();
+        }
         List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
                 .processInstanceId(processInsId)
+                .finished()
                 .taskIds(jumpTaskIds)
                 .includeIdentityLinks()
                 .orderByHistoricTaskInstanceStartTime()
                 .desc()
                 .list();
         hisTaskList = this.distinctHisTask(hisTaskList);
+        // 鎺掗櫎杩愯鏃朵换鍔�
+        List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList());
         if (CollectionUtils.isEmpty(hisTaskList)) {
             result.total(0l);
             return new ArrayList<>();
@@ -2185,7 +2240,7 @@
         // 鎺掗櫎瀹圭己鍚庡張瀹屾垚鐨勪换鍔�
         List<ProcessLog> finishedTaskList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
                 .eq(ProcessLog::getProcessInsId, processInsId)
-                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED)
+                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.REJECT)
                 .list();
         List<String> finishedTaskIds = finishedTaskList.stream().map(ProcessLog::getTaskId).distinct().collect(Collectors.toList());
         // 寰楀埌鏈畬鎴愮殑瀹圭己浠诲姟
@@ -2203,7 +2258,9 @@
                 .desc()
                 .list();
         hisTaskList = this.distinctHisTask(hisTaskList);
-
+        // 鎺掗櫎杩愯鏃朵换鍔�
+        List<String> runTaskKeys = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        hisTaskList = hisTaskList.stream().filter(his -> !runTaskKeys.contains(his.getTaskDefinitionKey())).collect(Collectors.toList());
         if (CollectionUtils.isEmpty(hisTaskList)) {
             result.total(0l);
             return new ArrayList<>();
@@ -2325,8 +2382,14 @@
 
         // 鎺掗櫎杩涜涓殑浠诲姟鍜屽凡瀹屾垚鐨勪换鍔�
         List<String> runTaskKeyList = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
-        List<String> finishedTaskKeyList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInsId).finished().list().stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList());
-        allUserTaskElement = allUserTaskElement.stream().filter(el -> !runTaskKeyList.contains(el.getId()) && !finishedTaskKeyList.contains(el.getId())).collect(Collectors.toList());
+        List<String> finishedTaskKeyList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
+                .select(ProcessLog::getTaskDefKey)
+                .eq(ProcessLog::getProcessInsId, processInsId)
+                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT)
+                .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList());
+        finishedTaskKeyList.addAll(runTaskKeyList);
+//        List<String> finishedTaskKeyList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInsId).finished().list().stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().collect(Collectors.toList());
+        allUserTaskElement = allUserTaskElement.stream().filter(el -> finishedTaskKeyList.indexOf(el.getId()) == -1).collect(Collectors.toList());
         // 妯℃嫙妯$硦鏌ヨ
         if (StringUtils.isNotBlank(taskName)) {
             allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList());
@@ -2483,14 +2546,18 @@
             // 杩愯鏃舵湭鎵惧埌娴佺▼锛岃鏄庢祦绋嬪凡缁忕粨鏉熶簡
             return 0L;
         }
-        // 鏌ュ嚭宸插畬鎴愮殑浠诲姟锛岀敤鎬讳换鍔℃暟-宸插畬鎴愮殑灏卞緱鍒板墿浣欎簨椤�
-        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
-                .processInstanceId(process.getProcessInstanceId())
-                .finished()
-                .list();
-        long num = list.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().count();
+        List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId);
 
-        return totalNum - num;
+        // 鎺掗櫎杩涜涓殑浠诲姟鍜屽凡瀹屾垚鐨勪换鍔�
+        List<String> runTaskKeyList = taskService.createTaskQuery().processInstanceId(processInsId).list().stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
+        List<String> finishedTaskKeyList = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper())
+                .select(ProcessLog::getTaskDefKey)
+                .eq(ProcessLog::getProcessInsId, processInsId)
+                .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.FINISHED, ProcessLogEventTypeEnum.JUMP, ProcessLogEventTypeEnum.WAIT)
+                .list().stream().map(ProcessLog::getTaskDefKey).collect(Collectors.toList());
+        finishedTaskKeyList.addAll(runTaskKeyList);
+        allUserTaskElement = allUserTaskElement.stream().filter(el -> finishedTaskKeyList.indexOf(el.getId()) == -1).collect(Collectors.toList());
+        return Long.valueOf(allUserTaskElement.size());
     }
 
     /**

--
Gitblit v1.8.0