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