From b809036ade43c97f86a0802fed57177884cc61f7 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期四, 26 十二月 2024 17:46:34 +0800
Subject: [PATCH] 赋码demo

---
 flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java         |    5 +
 common/src/main/java/com/ycl/common/constant/Constants.java          |    4 
 flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java |   45 +++++++++++++++
 business/src/main/java/com/ycl/task/FlowableTask.java                |   77 +++++++++++++++++++++++++
 flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java           |    2 
 5 files changed, 131 insertions(+), 2 deletions(-)

diff --git a/business/src/main/java/com/ycl/task/FlowableTask.java b/business/src/main/java/com/ycl/task/FlowableTask.java
new file mode 100644
index 0000000..7336100
--- /dev/null
+++ b/business/src/main/java/com/ycl/task/FlowableTask.java
@@ -0,0 +1,77 @@
+package com.ycl.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.ycl.domain.entity.ProjectInfo;
+import com.ycl.domain.entity.ProjectProcess;
+import com.ycl.factory.FlowServiceFactory;
+import com.ycl.mapper.ProjectInfoMapper;
+import com.ycl.mapper.ProjectProcessMapper;
+import com.ycl.service.ProjectProcessService;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.task.api.Task;
+import org.flowable.task.api.TaskInfo;
+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.stream.Collectors;
+
+@Slf4j
+@Component("flowableTask")
+public class FlowableTask extends FlowServiceFactory {
+    @Autowired
+    private ProjectProcessMapper projectProcessMapper;
+    @Autowired
+    private ProjectInfoMapper projectInfoMapper;
+
+    /**
+     * 璧嬬爜浠诲姟
+     */
+    public void expireTask() {
+        log.info("寮�濮嬭祴鐮�");
+        List<Task> taskList = taskService.createTaskQuery().list();
+        if (!CollectionUtils.isEmpty(taskList)) {
+            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"); // 鏈秴鏃堕」鐩�
+        }
+        log.info("缁撴潫璧嬬爜");
+    }
+
+    /**
+     * 璧嬬爜
+     *
+     * @param processInstanceIds 娴佺▼瀹炰緥ID鍒楄〃
+     * @param coding             璧嬬爜鍊�
+     */
+    private void updateProjectCoding(List<String> processInstanceIds, String coding) {
+        if (CollectionUtils.isEmpty(processInstanceIds)) {
+            return;
+        }
+
+        List<Long> projectIds = projectProcessMapper.selectList(
+                        new QueryWrapper<ProjectProcess>()
+                                .in("process_ins_id", processInstanceIds)
+                ).stream()
+                .map(ProjectProcess::getProjectId)
+                .collect(Collectors.toList());
+
+        if (!CollectionUtils.isEmpty(projectIds)) {
+            new LambdaUpdateChainWrapper<>(projectInfoMapper)
+                    .in(ProjectInfo::getId, projectIds)
+                    .set(ProjectInfo::getCoding, coding)
+                    .update();
+        }
+    }
+}
diff --git a/common/src/main/java/com/ycl/common/constant/Constants.java b/common/src/main/java/com/ycl/common/constant/Constants.java
index 4cf7c6f..6371790 100644
--- a/common/src/main/java/com/ycl/common/constant/Constants.java
+++ b/common/src/main/java/com/ycl/common/constant/Constants.java
@@ -5,7 +5,7 @@
 
 /**
  * 閫氱敤甯搁噺淇℃伅
- * 
+ *
  * @author ycl
  */
 public class Constants
@@ -163,7 +163,7 @@
     /**
      * 瀹氭椂浠诲姟鐧藉悕鍗曢厤缃紙浠呭厑璁歌闂殑鍖呭悕锛屽鍏朵粬闇�瑕佸彲浠ヨ嚜琛屾坊鍔狅級
      */
-    public static final String[] JOB_WHITELIST_STR = { "com.ycl.quartz.task" };
+    public static final String[] JOB_WHITELIST_STR = { "com.ycl.task" };
 
     /**
      * 瀹氭椂浠诲姟杩濊鐨勫瓧绗�
diff --git a/flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java b/flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java
index ce641bd..1e639a4 100644
--- a/flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java
+++ b/flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java
@@ -99,4 +99,6 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date finishTime;
 
+    private Boolean overtime;
+
 }
diff --git a/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java b/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
index be8bb9c..63f252f 100644
--- a/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
+++ b/flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
@@ -20,4 +20,9 @@
      * 鏄惁瀹屾垚(宸茬粡瀹℃壒)
      */
     private boolean completed;
+
+    /**
+     * 鏄惁宸茬粡瓒呮椂
+     */
+    private boolean overtime;
 }
diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
index aff08d2..4486c01 100644
--- a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
+++ b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -792,6 +792,11 @@
                     .processInstanceId(procInsId)
                     .orderByHistoricActivityInstanceStartTime()
                     .desc().list();
+            Date now =new Date();
+            //鎵╁睍
+            List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery()
+                    .processInstanceId(procInsId)
+                    .list();
             List<FlowTaskDto> hisFlowList = new ArrayList<>();
             for (HistoricActivityInstance histIns : list) {
                 // 灞曠ず寮�濮嬭妭鐐�
@@ -850,6 +855,23 @@
                     }
 
                     flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis()));
+                    String taskId = histIns.getTaskId();
+
+                    //鎵╁睍 鍒ゆ柇鏄惁瓒呮椂
+                    for (HistoricTaskInstance taskInstance : taskList) {
+                        Date dueDate = taskInstance.getDueDate();
+                        //鎵惧埌瀵瑰簲浠诲姟鑺傜偣
+                        if(dueDate!=null && taskInstance.getId().equals(taskId) ) {
+                            //濡傛灉浠诲姟杩樻病瀹屾垚
+                            if(flowTask.getDuration()==null) {
+                                //鍒ゆ柇褰撳墠鏃堕棿鏄惁瓒呰繃鍒版湡鏃堕棿
+                                if (now.after(dueDate)) flowTask.setOvertime(Boolean.TRUE);
+                            }else {
+                                //濡傛灉浠诲姟鑺傜偣宸茬粡瀹屾垚浜嗭紝鐢ㄥ畬鎴愭椂闂村垽鏂�
+                                if(histIns.getEndTime().after(dueDate)) flowTask.setOvertime(Boolean.TRUE);
+                            }
+                        }
+                    }
                     // 鑾峰彇鎰忚璇勮鍐呭
                     List<Comment> commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId());
                     commentList.forEach(comment -> {
@@ -1095,9 +1117,15 @@
     @Override
     public AjaxResult flowXmlAndNode(String procInsId, String deployId) {
         try {
+            Date now = new Date();
             List<FlowViewerDto> flowViewerList = new ArrayList<>();
             // 鑾峰彇宸茬粡瀹屾垚鐨勮妭鐐�
             List<HistoricActivityInstance> listFinished = historyService.createHistoricActivityInstanceQuery()
+                    .processInstanceId(procInsId)
+                    .finished()
+                    .list();
+            //鑾峰彇鎵�鏈変换鍔¤妭鐐逛俊鎭�(鎵╁睍)
+            List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery()
                     .processInstanceId(procInsId)
                     .finished()
                     .list();
@@ -1107,6 +1135,15 @@
                 FlowViewerDto flowViewerDto = new FlowViewerDto();
                 flowViewerDto.setKey(s.getActivityId());
                 flowViewerDto.setCompleted(true);
+                //鎵╁睍鍐呭 宸插畬鎴愮殑鐢ㄥ畬鎴愭椂闂村垽鏂�
+                Date endTime = s.getEndTime();
+                for (HistoricTaskInstance task : taskList) {
+                    if(s.getTaskId()!=null && s.getTaskId().equals(task.getId())){
+                        if(task.getDueDate()!=null && endTime.after(task.getDueDate())){
+                            flowViewerDto.setOvertime(true);
+                        }
+                    }
+                }
                 // 閫�鍥炶妭鐐逛笉杩涜灞曠ず
                 if (StringUtils.isBlank(s.getDeleteReason())) {
                     flowViewerList.add(flowViewerDto);
@@ -1126,6 +1163,14 @@
                 FlowViewerDto flowViewerDto = new FlowViewerDto();
                 flowViewerDto.setKey(s.getActivityId());
                 flowViewerDto.setCompleted(false);
+                //鎵╁睍鍐呭 浠e姙鐨勯�氳繃褰撳墠鏃堕棿鍘诲垽鏂�
+                for (HistoricTaskInstance task : taskList) {
+                    if(s.getTaskId()!=null && s.getTaskId().equals(task.getId())){
+                        if(task.getDueDate()!=null && now.after(task.getDueDate())){
+                            flowViewerDto.setOvertime(true);
+                        }
+                    }
+                }
                 flowViewerList.add(flowViewerDto);
             });
             Map<String, Object> result = new HashMap();

--
Gitblit v1.8.0