From a0e8d1bbff7a02f538be76e852aa233324bd8810 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期五, 03 一月 2025 13:31:51 +0800
Subject: [PATCH] 赋码

---
 business/src/main/java/com/ycl/task/FlowableTask.java |   94 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 79 insertions(+), 15 deletions(-)

diff --git a/business/src/main/java/com/ycl/task/FlowableTask.java b/business/src/main/java/com/ycl/task/FlowableTask.java
index 7336100..5842b3b 100644
--- a/business/src/main/java/com/ycl/task/FlowableTask.java
+++ b/business/src/main/java/com/ycl/task/FlowableTask.java
@@ -2,23 +2,27 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.ycl.domain.entity.ProcessCoding;
 import com.ycl.domain.entity.ProjectInfo;
 import com.ycl.domain.entity.ProjectProcess;
 import com.ycl.factory.FlowServiceFactory;
+import com.ycl.mapper.ProcessCodingMapper;
 import com.ycl.mapper.ProjectInfoMapper;
 import com.ycl.mapper.ProjectProcessMapper;
-import com.ycl.service.ProjectProcessService;
+import com.ycl.service.ProcessCodingService;
 import lombok.extern.slf4j.Slf4j;
 import org.flowable.task.api.Task;
 import org.flowable.task.api.TaskInfo;
+import org.flowable.task.api.history.HistoricTaskInstance;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
+
+import static com.ycl.common.constant.ProcessOverTimeConstants.*;
 
 @Slf4j
 @Component("flowableTask")
@@ -27,28 +31,88 @@
     private ProjectProcessMapper projectProcessMapper;
     @Autowired
     private ProjectInfoMapper projectInfoMapper;
-
+    @Autowired
+    private ProcessCodingMapper processCodingMapper;
     /**
      * 璧嬬爜浠诲姟
+     * 涓や釜閫昏緫 鏀归」鐩爜銆佹敼鑺傜偣棰滆壊
      */
     public void expireTask() {
         log.info("寮�濮嬭祴鐮�");
+        //褰撳墠姝e湪杩愯鐨勬墍鏈変换鍔¤妭鐐�
         List<Task> taskList = taskService.createTaskQuery().list();
-        if (!CollectionUtils.isEmpty(taskList)) {
+        if(CollectionUtils.isEmpty(taskList)) return;
+        List<String> taskIds = taskList.stream().map(TaskInfo::getId).collect(Collectors.toList());
+        //闇�瑕佺洃鎺х殑璧嬬爜浠诲姟
+        List<ProcessCoding> processCodingList = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>().in("task_id",taskIds));
+        if (!CollectionUtils.isEmpty(processCodingList)) {
+            //key涓簍askId value涓烘湰浣撳璞�
+            Map<String, ProcessCoding> taskMap = processCodingList.stream().collect(Collectors.toMap(ProcessCoding::getTaskId, Function.identity()));
+            //鎷垮埌寮�濮嬭鏃剁殑鑺傜偣闆嗗悎 key:taskId value:寮�濮嬫椂闂�
+            Map<String, Date> startTaskMap = getStartTaskList(processCodingList);
+            //鎻愬墠鍑嗗鎺ユ敹鏁版嵁鐨刴ap key:娴佺▼瀹炰緥id value:闇�瑕佹敼鍙樼殑棰滆壊
+            Map<String, List<String>> map = new HashMap<>();
+            List<ProcessCoding> list = new ArrayList<>();
+            map.put(GREEN, new ArrayList<>());
+            map.put(RED, new ArrayList<>());
+            map.put(YELLOW, new ArrayList<>());
             Date now = new Date();
-            // 鎸夎秴鏃剁姸鎬佸垎缁勪换鍔�
-            Map<Boolean, List<String>> processInstanceMap = taskList.stream()
-                    .collect(Collectors.groupingBy(
-                            task -> task.getDueDate() != null && now.after(task.getDueDate()),
-                            Collectors.mapping(TaskInfo::getProcessInstanceId, Collectors.toList())
-                    ));
-            // 澶勭悊瓒呮椂鍜屾湭瓒呮椂鐨勯」鐩�
-            updateProjectCoding(processInstanceMap.get(true), "red");    // 瓒呮椂椤圭洰
-            updateProjectCoding(processInstanceMap.get(false), "green"); // 鏈秴鏃堕」鐩�
+            //閬嶅巻鎵�鏈変唬鍔炵殑鑺傜偣
+            for (Task task : taskList) {
+                String taskId = task.getId();
+                ProcessCoding processCoding = taskMap.get(taskId);
+                if (processCoding == null) {
+                    //涓嶉渶瑕佺洃鎺х殑浠诲姟鑺傜偣鐩存帴鏀逛负缁胯壊
+                    List<String> processInsIds = map.get(GREEN);
+                    processInsIds.add(task.getProcessInstanceId());
+                    continue;
+                }
+                //鍒ゆ柇鏄惁瓒呮椂
+                Date startTime = startTaskMap.get(processCoding.getStartTaskId());
+                Integer yellowTime = processCoding.getYellowTime();
+                Integer redTime = processCoding.getRedTime();
+                if (startTime == null) continue;
+//                long durationDay = (now.getTime() - startTime.getTime()) / (1000 * 60 * 60 * 24);
+                long durationDay = (now.getTime() - startTime.getTime()) / (1000 * 60);
+                String status = GREEN; // 榛樿鐘舵�佷负缁胯壊
+                if (redTime != null && durationDay >= redTime) {
+                    status = RED; // 濡傛灉瓒呰繃绾㈣壊鏃堕棿闃堝�硷紝鍒欑姸鎬佷负绾㈣壊
+                } else if (yellowTime != null && durationDay >= yellowTime) {
+                    status = YELLOW; // 鍚﹀垯锛屽鏋滆秴杩囬粍鑹叉椂闂撮槇鍊硷紝鍒欑姸鎬佷负榛勮壊
+                }
+                List<String> processInsIds = map.get(status);
+                processInsIds.add(task.getProcessInstanceId());
+                processCoding.setStatus(status);
+                list.add(processCoding);
+            }
+            //鏇存柊椤圭洰鐮�
+            map.forEach((key,value)-> updateProjectCoding(value, key));
+            //鏇存柊鑺傜偣鐘舵�� 鑷畾涔夌殑mybatis鏂规硶
+            if(!CollectionUtils.isEmpty(list)) processCodingMapper.updateBatch(list);
         }
         log.info("缁撴潫璧嬬爜");
     }
 
+    private Map<String, Date> getStartTaskList(List<ProcessCoding> processCodingList) {
+        //鏌ュ嚭浠诲姟璁℃椂璧峰鑺傜偣闆嗗悎
+        List<String> startTaskIds = processCodingList.stream().map(ProcessCoding::getStartTaskId).collect(Collectors.toList());
+        //鏌ュ嚭璧峰璁℃椂鑺傜偣鏁版嵁 娉ㄦ剰姝e湪杩涜鐨勪换鍔′笉浼氳繘鍏is琛� 缁撴潫浜嗘墠浼氳繘鍏� 鎵�浠ラ渶瑕佹煡涓ゅ紶琛�
+        Map<String, Date> startDateMap = new HashMap<>();
+        List<Task> startTasks = taskService.createTaskQuery().taskIds(startTaskIds).list();
+        List<HistoricTaskInstance> hisStartTasks = historyService.createHistoricTaskInstanceQuery().taskIds(startTaskIds).list();
+        if (!CollectionUtils.isEmpty(startTasks)) {
+            startTasks.forEach(task -> {
+                startDateMap.put(task.getId(), task.getCreateTime());
+            });
+        }
+        if (!CollectionUtils.isEmpty(hisStartTasks)) {
+            hisStartTasks.forEach(hisTask -> {
+                startDateMap.put(hisTask.getId(), hisTask.getStartTime());
+            });
+        }
+        return startDateMap;
+    }
+
     /**
      * 璧嬬爜
      *

--
Gitblit v1.8.0