luohairen
2024-12-26 06749c4f89adbae1581f142d5b73576ecf6136d8
Merge remote-tracking branch 'origin/master'
4个文件已修改
1个文件已添加
133 ■■■■■ 已修改文件
business/src/main/java/com/ycl/task/FlowableTask.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/src/main/java/com/ycl/common/constant/Constants.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/dto/FlowTaskDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/task/FlowableTask.java
New file
@@ -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();
        }
    }
}
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" };
    /**
     * 定时任务违规的字符
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;
}
flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
@@ -20,4 +20,9 @@
     * 是否完成(已经审批)
     */
    private boolean completed;
    /**
     * 是否已经超时
     */
    private boolean overtime;
}
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);
                //扩展内容 代办的通过当前时间去判断
                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();