xiangpei
2025-02-10 55a173ec806bbe9ea00c6801e6c5b87b7af2f3eb
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.constant.ProcessOverTimeConstants;
import com.ycl.common.core.domain.entity.SysDept;
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
@@ -14,6 +15,7 @@
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
import com.ycl.domain.entity.ProcessCoding;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.entity.SysForm;
@@ -28,6 +30,7 @@
import com.ycl.mapper.ProjectProcessMapper;
import com.ycl.service.IFlowTaskService;
import com.ycl.service.ISysFormService;
import com.ycl.service.ProcessCodingService;
import com.ycl.service.ProjectProcessService;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -86,6 +89,7 @@
    private final TaskCommonService taskCommonService;
    private final IFlowTaskService flowTaskService;
    private final ISysFormService formService;
    private final ProcessCodingService processCodingService;
    private final ApplicationEventPublisher publisher;
    /**
@@ -227,6 +231,9 @@
        taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId));
        taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId(), taskStatistics.getTotalTaskNum()));
        taskStatistics.setTimelyFinishedTaskNum(this.getTimelyTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setOvertimeTaskNum(this.getOvertimeTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setWillOvertimeTaskNum(this.getWillOvertimeTaskNum(projectProcess.getProcessInsId()));
//        taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId()));
        detail.setStatistics(taskStatistics);
@@ -260,6 +267,15 @@
                break;
            case TaskTypeConstant.REMAINING:
                this.getRemainingTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok);
                break;
            case TaskTypeConstant.TIMELY:
                this.getTimelyTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok);
                break;
            case TaskTypeConstant.OVERTIME:
                this.getOvertimeTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok);
                break;
            case TaskTypeConstant.WILL_OVER_TIME:
                this.getWillOvertimeTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok);
                break;
            default:
                break;
@@ -836,11 +852,19 @@
        taskVO.setTaskName(task.getName());
        taskVO.setTaskStatus(TaskStatusEnum.TODO);
        // 流程定义信息
        ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
                .processDefinitionId(task.getProcessDefinitionId())
                .singleResult();
        taskVO.setDeployId(pd.getDeploymentId());
        taskVO.setProcessName(pd.getName());
        ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
        String deployId = "";
        String processName = "";
        if (Objects.nonNull(process)) {
            deployId = process.getDeploymentId();
            processName = process.getProcessDefinitionName();
        } else {
            HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
            deployId = hisProcess.getDeploymentId();
            processName = hisProcess.getProcessDefinitionName();
        }
        taskVO.setDeployId(deployId);
        taskVO.setProcessName(processName);
        taskVO.setProcessInsId(task.getProcessInstanceId());
        taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
@@ -898,6 +922,313 @@
            taskVO.setHandlerUnitId(handlerUnitIds);
            taskVO.setHandlerUnitName(handlerUnitNames);
        }
    }
    /**
     * 统计按时完成的任务
     *
     * @param processInsId 流程实例id
     * @return
     */
    private Long getTimelyTaskNum(String processInsId) {
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.NORMAL)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(taskKeyList)) {
            return 0L;
        }
        // 查出所有已完成的任务
        return historyService.createHistoricTaskInstanceQuery()
                .processInstanceId(processInsId)
                .finished()
                .caseDefinitionKeyIn(taskKeyList)
                .count();
    }
    /**
     * 查询按时完成的任务
     *
     * @param processDefinitionId 流程定义id
     * @param processInsId 流程实例id
     * @param taskName 任务名称--搜索条件
     * @param pageNum
     * @param pageSize
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getTimelyTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.NORMAL)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        List<HistoricTaskInstance> finishedTaskList = new ArrayList<>();
        if (! CollectionUtils.isEmpty(taskKeyList)) {
            // 查出所有已完成的任务
            finishedTaskList = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(processInsId)
                    .finished()
                    .taskNameLike(taskName)
                    .caseDefinitionKeyIn(taskKeyList)
                    .includeIdentityLinks()
                    .list();
        }
        if (startNum >= finishedTaskList.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
        }
        result.total(finishedTaskList.size());
        int end = Math.min(endNum, finishedTaskList.size());
        List<HistoricTaskInstance> pageFinishedTaskList = finishedTaskList.subList(startNum, end);
        List<String> taskDefs = pageFinishedTaskList.stream().map(HistoricTaskInstance::getTaskDefinitionKey).collect(Collectors.toList());
        Map<String, HistoricTaskInstance> keyMap = pageFinishedTaskList.stream().collect(Collectors.toMap(HistoricTaskInstance::getTaskDefinitionKey, his -> his));
        // 得到目标任务对应的定义
        List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList());
        // 查出流程
        ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        String deployId = "";
        String processName = "";
        if (Objects.nonNull(process)) {
            deployId = process.getDeploymentId();
            processName = process.getProcessDefinitionName();
        } else {
            HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult();
            deployId = hisProcess.getDeploymentId();
            processName = hisProcess.getProcessDefinitionName();
        }
        String finalDeployId = deployId;
        String finalProcessName = processName;
        List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> {
            CustomerTaskVO vo = new CustomerTaskVO();
            vo.setProcessInsId(processInsId);
            vo.setProcessDefId(processDefinitionId);
            vo.setDeployId(finalDeployId);
            vo.setTaskName(userTask.getName());
            vo.setProcessName(finalProcessName);
            // 一个任务可能有多个候选人/组,所以需要使用list
            List<Long> handlerIds = new ArrayList<>(2);
            List<String> handlerNames = new ArrayList<>(2);
            List<Long> handlerUnitIds = new ArrayList<>(2);
            List<String> handlerUnitNames = new ArrayList<>(2);
            HistoricTaskInstance hisTask = keyMap.get(userTask.getId());
            if (Objects.nonNull(hisTask)) {
                vo.setTaskStatus(TaskStatusEnum.FINISHED);
                // 如果是已完成的,信息需要单独赋值
                vo.setTaskId(hisTask.getId());
                vo.setExecutionId(hisTask.getExecutionId());
                vo.setCreateTime(hisTask.getStartTime());
                // 查询实际处理人
                long handlerUserId = Long.parseLong(hisTask.getAssignee());
                SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                if (Objects.nonNull(handlerUser)) {
                    handlerIds.add(handlerUserId);
                    handlerNames.add(handlerUser.getNickName());
                    vo.setActualHandlerUserId(hisTask.getAssignee());
                    vo.setActualHandlerUserName(handlerUser.getNickName());
                }
                vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey());
                this.setPromoterAndHandler(vo, hisTask.getIdentityLinks());
            }
            vo.setHandlerId(handlerIds);
            vo.setHandlerName(handlerNames);
            vo.setHandlerUnitId(handlerUnitIds);
            vo.setHandlerUnitName(handlerUnitNames);
            return vo;
        }).collect(Collectors.toList());
        result.data(vos);
        return vos;
    }
    /**
     * 统计超时的任务数
     *
     * @param processInsId 流程实例id
     * @return
     */
    private Long getOvertimeTaskNum(String processInsId) {
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.OVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(taskKeyList)) {
            return 0L;
        }
        // 查出所有已完成的任务
        return taskService.createTaskQuery()
                .processInstanceId(processInsId)
                .caseDefinitionKeyIn(taskKeyList)
                .count();
    }
    /**
     * 查询超时的任务
     *
     * @param processDefinitionId 流程定义id
     * @param processInsId 流程实例id
     * @param taskName 任务名称--搜索条件
     * @param pageNum
     * @param pageSize
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getOvertimeTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        // 查出即将超时的任务
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.OVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        List<Task> taskList = new ArrayList<>();
        // 查出所有正在处理(运行时)的任务
        if (! CollectionUtils.isEmpty(taskKeyList)) {
            taskList = taskService.createTaskQuery()
                    .processInstanceId(processInsId)
                    .taskNameLike(taskName)
                    .caseDefinitionKeyIn(taskKeyList)
                    .list();
        }
        if (startNum >= taskList.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
        }
        result.total(taskList.size());
        int end = Math.min(endNum, taskList.size());
        List<Task> pageTaskList = taskList.subList(startNum, end);
        List<String> taskDefs = pageTaskList.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
        Map<String, Task> keyMap = pageTaskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
        // 得到目标任务对应的定义
        List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList());
        // 查询任务相关信息
        List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> {
            Task task = keyMap.get(userTask.getId());
            CustomerTaskVO vo = new CustomerTaskVO();
            this.setRuntimeTaskInfo(task, vo);
            return vo;
        }).collect(Collectors.toList());
        result.data(vos);
        return vos;
    }
    /**
     * 统计即将超时的任务数
     *
     * @param processInsId 流程实例id
     * @return
     */
    private Long getWillOvertimeTaskNum(String processInsId) {
        // 查出时间正常的任务id
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.WILLOVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(taskKeyList)) {
            return 0L;
        }
        // 查出所有已完成的任务
        return taskService.createTaskQuery()
                .processInstanceId(processInsId)
                .caseDefinitionKeyIn(taskKeyList)
                .count();
    }
    /**
     * 查询即将超时的任务
     *
     * @param processDefinitionId 流程定义id
     * @param processInsId 流程实例id
     * @param taskName 任务名称--搜索条件
     * @param pageNum
     * @param pageSize
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getWillOvertimeTask(String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        // 查出即将超时的任务
        List<String> taskKeyList = new LambdaQueryChainWrapper<>(processCodingService.getBaseMapper())
                .select(ProcessCoding::getTaskDefKey)
                .eq(ProcessCoding::getProcessInsId, processInsId)
                .eq(ProcessCoding::getOvertimeStatus, ProcessOverTimeConstants.WILLOVERTIME)
                .list()
                .stream()
                .map(ProcessCoding::getTaskDefKey)
                .collect(Collectors.toList());
        List<Task> taskList = new ArrayList<>();
        // 查出所有正在处理(运行时)的任务
        if (! CollectionUtils.isEmpty(taskKeyList)) {
            taskList = taskService.createTaskQuery()
                    .processInstanceId(processInsId)
                    .taskNameLike(taskName)
                    .caseDefinitionKeyIn(taskKeyList)
                    .list();
        }
        if (startNum >= taskList.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
        }
        result.total(taskList.size());
        int end = Math.min(endNum, taskList.size());
        List<Task> pageTaskList = taskList.subList(startNum, end);
        List<String> taskDefs = pageTaskList.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList());
        Map<String, Task> keyMap = pageTaskList.stream().collect(Collectors.toMap(Task::getTaskDefinitionKey, his -> his));
        // 得到目标任务对应的定义
        List<UserTask> finishedUserTaskElement = this.getAllUserTaskElement(processDefinitionId).stream().filter(el -> taskDefs.contains(el.getId())).collect(Collectors.toList());
        // 查询任务相关信息
        List<CustomerTaskVO> vos = finishedUserTaskElement.stream().map(userTask -> {
            Task task = keyMap.get(userTask.getId());
            CustomerTaskVO vo = new CustomerTaskVO();
            this.setRuntimeTaskInfo(task, vo);
            return vo;
        }).collect(Collectors.toList());
        result.data(vos);
        return vos;
    }
    /**
@@ -1044,7 +1375,7 @@
                .processInstanceId(process.getProcessInstanceId())
                .finished()
                .list();
        long num = list.stream().map(HistoricTaskInstance::getTaskDefinitionId).distinct().count();
        long num = list.stream().map(HistoricTaskInstance::getTaskDefinitionKey).distinct().count();
        return totalNum - num;
    }