xiangpei
2025-02-17 9b3b652cfb16b09a6f9c79c5d1d8f7b2b855f22e
Merge remote-tracking branch 'origin/master'

# Conflicts:
# flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
4个文件已修改
84 ■■■■ 已修改文件
business/src/main/java/com/ycl/task/FlowableTask.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/resources/mapper/ProcessLogMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 @@
        //当前正在运行的所有任务节点
        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)) {
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
@@ -104,6 +104,8 @@
    public static final String EXTENSION_PROPERTY_CAN_WAIT_TEXT = "是否允许容缺";
    public static final String EXTENSION_PROPERTY_PROJECT_PHASE = "项目阶段";
    public static final String EXTENSION_PROPERTY_CAN_HANGUP_TEXT = "是否允许挂起";
    public static final String EXTENSION_PROPERTY_VALUE = "是";
flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java
@@ -38,4 +38,7 @@
     * @return
     */
    List<ProcessLogVO> projectProcessLogPage(@Param("query") ProcessLogQuery query);
    List<String> getAllHangup();
}
flowable/src/main/resources/mapper/ProcessLogMapper.xml
@@ -78,4 +78,15 @@
            TFL.gmt_create DESC
    </select>
    <select id="getAllHangup" resultType="java.lang.String">
        SELECT task_id
        FROM (
                 SELECT task_id,
                        COUNT(*) AS num
                 FROM t_process_log
                 WHERE task_id IS NOT NULL
                 GROUP BY task_id
                 HAVING MOD(num, 2) != 0
             ) AS t;
    </select>
</mapper>