From 9b3b652cfb16b09a6f9c79c5d1d8f7b2b855f22e Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期一, 17 二月 2025 13:55:09 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- business/src/main/java/com/ycl/task/FlowableTask.java | 68 ++++++++++++++++++++++++++++----- 1 files changed, 57 insertions(+), 11 deletions(-) diff --git a/business/src/main/java/com/ycl/task/FlowableTask.java b/business/src/main/java/com/ycl/task/FlowableTask.java index b5eb3ec..94a3ef8 100644 --- a/business/src/main/java/com/ycl/task/FlowableTask.java +++ b/business/src/main/java/com/ycl/task/FlowableTask.java @@ -2,14 +2,18 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.domain.entity.ProcessCoding; +import com.ycl.domain.entity.ProcessLog; 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.ProcessLogMapper; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; import com.ycl.service.ProcessCodingService; +import com.ycl.service.ProcessLogService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.task.api.Task; @@ -24,6 +28,8 @@ import java.util.stream.Collectors; import static com.ycl.common.constant.ProcessOverTimeConstants.*; +import static com.ycl.common.enums.business.ProcessLogEventTypeEnum.CANCEL_HANGUP; +import static com.ycl.common.enums.business.ProcessLogEventTypeEnum.HANGUP; @Slf4j @Component("flowableTask") @@ -34,7 +40,10 @@ private ProjectInfoMapper projectInfoMapper; @Autowired private ProcessCodingMapper processCodingMapper; - + @Autowired + private ProcessLogService processLogService; + @Autowired + private ProcessLogMapper processLogMapper; /** * 璧嬬爜浠诲姟 * 涓や釜閫昏緫 鏀归」鐩爜銆佹敼鑺傜偣棰滆壊 @@ -44,7 +53,23 @@ //褰撳墠姝e湪杩愯鐨勬墍鏈変换鍔¤妭鐐� List<Task> taskList = taskService.createTaskQuery().active().list(); if (CollectionUtils.isEmpty(taskList)) return; + //鎺掗櫎鎺夎妭鐐规寕璧风殑浠诲姟 + List<String> allHangupTask = processLogMapper.getAllHangup(); + taskList = taskList.stream() + .filter(task -> !allHangupTask.contains(task.getId())) + .collect(Collectors.toList()); + //TODO锛氱瓫閫夊嚭娴佺▼瀹炰緥id锛岀敤浣滈」鐩寕璧� + Set<String> proInsIds = taskList.stream() + .map(TaskInfo::getProcessInstanceId) + .collect(Collectors.toSet()); + //TODO:鏌ヨ椤圭洰鎸傝捣鏃ュ織 + List<String> taskIds = taskList.stream().map(TaskInfo::getId).collect(Collectors.toList()); + //鏌ヨ鑺傜偣鎸傝捣鏃ュ織 + Map<String, List<ProcessLog>> hangupLogMap = processLogService.list(new QueryWrapper<ProcessLog>() + .in("event_type", Arrays.asList(HANGUP, CANCEL_HANGUP)) + .in("process_ins_id", taskIds)).stream() + .collect(Collectors.groupingBy(ProcessLog::getTaskId)); //闇�瑕佺洃鎺х殑璧嬬爜浠诲姟 List<ProcessCoding> processCodingList = processCodingMapper.selectList(new QueryWrapper<ProcessCoding>().in("task_id", taskIds)); Map<String, ProcessCoding> taskMap = new HashMap<>(); @@ -68,8 +93,7 @@ ProcessCoding processCoding = taskMap.get(taskId); if (processCoding == null) { //涓嶉渶瑕佺洃鎺х殑浠诲姟鑺傜偣椤圭洰鐮佺洿鎺ユ敼涓虹豢鑹� - List<String> processInsIds = map.get(GREEN); - processInsIds.add(task.getProcessInstanceId()); + map.get(GREEN).add(task.getProcessInstanceId()); continue; } //鍒ゆ柇璧嬬爜缁熶竴鐢ㄧ浣滀负鍗曚綅 @@ -80,27 +104,30 @@ Long overtime = getTime(processCoding.getOvertime()); if (startTime == null) continue; //鑺傜偣澶勭悊鏃堕棿 - long durationDay = (now.getTime() - startTime.getTime()) / 1000; + long durationTime = (now.getTime() - startTime.getTime()) / 1000; + //TODO锛氬噺鍘婚」鐩寕璧锋椂闀� + + //鍑忓幓鑺傜偣鎸傝捣鏃堕暱 + durationTime = subNodeHangupTime(hangupLogMap, task, durationTime); + String status = GREEN; // 榛樿鐘舵�佷负缁胯壊 - if (redTime != null && redTime !=0 && durationDay >= redTime) { + if (redTime != null && redTime !=0 && durationTime >= redTime) { status = RED; // 濡傛灉瓒呰繃绾㈣壊鏃堕棿闃堝�硷紝鍒欑姸鎬佷负绾㈣壊 - } else if (yellowTime != null && yellowTime !=0 && durationDay >= yellowTime) { + } else if (yellowTime != null && yellowTime !=0 && durationTime >= yellowTime) { status = YELLOW; // 鍚﹀垯锛屽鏋滆秴杩囬粍鑹叉椂闂撮槇鍊硷紝鍒欑姸鎬佷负榛勮壊 } //澶勭悊鍔炵悊鏈熼檺 String overtimeStatus = NORMAL; - if (overtime != null && overtime !=0 && durationDay >= overtime) { + if (overtime != null && overtime !=0 && durationTime >= overtime) { overtimeStatus = OVERTIME; // 濡傛灉瓒呰繃鍔炵悊鏈熼檺 } - else if (overtime != null && overtime != 0 && durationDay >= (overtime - 12 * 60 * 60)) { + else if (overtime != null && overtime != 0 && durationTime >= (overtime - 12 * 60 * 60)) { overtimeStatus = WILLOVERTIME; // 濡傛灉涓存湡(鍥哄畾瓒呮椂鍓�12灏忔椂涓轰复鏈�) } // else if (overtime != null && overtime != 0 && durationDay >= (overtime - 60)) { // overtimeStatus = WILLOVERTIME; // 濡傛灉涓存湡(鍥哄畾瓒呮椂鍓�12灏忔椂涓轰复鏈�) // } - List<String> processInsIds = map.get(status); - processInsIds.add(task.getProcessInstanceId()); - + map.get(status).add(task.getProcessInstanceId()); processCoding.setStatus(status); processCoding.setOvertimeStatus(overtimeStatus); list.add(processCoding); @@ -116,6 +143,25 @@ log.info("缁撴潫璧嬬爜"); } + //鍑忓幓鑺傜偣鎸傝捣鏃堕暱 + private long subNodeHangupTime(Map<String, List<ProcessLog>> hangupLogMap, Task task, long durationTime) { + List<ProcessLog> processLogs = hangupLogMap.get(task.getId()); + if (!CollectionUtils.isEmpty(processLogs)) { + long hangupTime = 0; + //鍒嗙粍鍒嗕负鎸傝捣鍜屽彇娑堟寕璧� + Map<ProcessLogEventTypeEnum, List<ProcessLog>> logEventTypeMap = processLogs.stream() + .sorted(Comparator.comparing(ProcessLog::getGmtCreate)) + .collect(Collectors.groupingBy(ProcessLog::getEventType)); + List<ProcessLog> cancelHangup = logEventTypeMap.get(CANCEL_HANGUP); + for (int i = 0; i < cancelHangup.size(); i++) { + ProcessLog processLog = cancelHangup.get(i); + hangupTime += processLog.getGmtCreate().getTime() - logEventTypeMap.get(HANGUP).get(i).getGmtCreate().getTime(); + } + durationTime = durationTime - hangupTime; + } + return durationTime; + } + private Long getTime(String timeStr) { Long time = null; if (StringUtils.isNotBlank(timeStr)) { -- Gitblit v1.8.0