From 06749c4f89adbae1581f142d5b73576ecf6136d8 Mon Sep 17 00:00:00 2001
From: luohairen <3399054449@qq.com>
Date: 星期四, 26 十二月 2024 17:57:37 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
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