xiangpei
2024-12-24 982e63b981079caaae2be3ad8bb11d29cf9cd97b
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -19,6 +19,7 @@
import com.ycl.domain.dto.FlowTaskDto;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.form.RejectTaskForm;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
import com.ycl.mapper.ProjectInfoMapper;
@@ -277,16 +278,11 @@
            taskVO.setDeployId(pd.getDeploymentId());
            taskVO.setProcessName(pd.getName());
            taskVO.setProcessInsId(task.getProcessInstanceId());
            taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
            // 流程发起人信息
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                    .processInstanceId(task.getProcessInstanceId())
                    .singleResult();
            SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
            taskVO.setPromoterId(startUser.getUserId());
            taskVO.setPromoterName(startUser.getNickName());
            taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
            taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null);
            this.setPromoterInfo(taskVO);
            // 流程处理人信息
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
            for (IdentityLink identityLink : identityLinksForTask) {
@@ -363,6 +359,13 @@
        return Result.ok().data(needAuditing);
    }
    @Override
    public Result rejectTask(RejectTaskForm form) {
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult();
        taskCommonService.reject(form.getRejectedTaskDefKey(), task.getTaskDefinitionKey(), task.getProcessInstanceId(), form.getTaskId(), form.getAuditOpinion());
        return Result.ok("驳回成功");
    }
    /**
     * 查询待办任务
     *
@@ -401,16 +404,11 @@
            taskVO.setDeployId(pd.getDeploymentId());
            taskVO.setProcessName(pd.getName());
            taskVO.setProcessInsId(task.getProcessInstanceId());
            taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
            // 流程发起人信息
            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                    .processInstanceId(task.getProcessInstanceId())
                    .singleResult();
            SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
            taskVO.setPromoterId(startUser.getUserId());
            taskVO.setPromoterName(startUser.getNickName());
            taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
            taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null);
            this.setPromoterInfo(taskVO);
            // 流程处理人信息
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
            for (IdentityLink identityLink : identityLinksForTask) {
@@ -485,6 +483,12 @@
        List<UserTask> userTasks = allUserTaskElement.subList(startNum, end);
        // 查出流程
        ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        if (Objects.isNull(process)) {
            // 如果运行时找不到说明是已完成的流程,直接查历史任务
            List<CustomerTaskVO> vos = this.getFinishedProcessTaskInfo(userTasks, processInsId, processDefinitionId);
            result.data(vos);
            return vos;
        }
        // 判断任务状态
        List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> {
            CustomerTaskVO vo = new CustomerTaskVO();
@@ -496,12 +500,16 @@
            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
            if (Objects.isNull(task)) {
                // 如果任务在运行时没找到,那么可能为未开始或者已完成,需要从历史任务中再找一下
                HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery()
                List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
                        .processInstanceId(process.getProcessInstanceId())
                        .taskDefinitionKey(userTask.getId())
                        .includeIdentityLinks()
                        .singleResult();
                if (Objects.isNull(historicTask)) {
                        .orderByHistoricTaskInstanceStartTime()
                        .desc()
                        .list();
                if (CollectionUtils.isEmpty(historicTasks)) {
                    vo.setPromoterName("暂无");
                    vo.setPromoterUnitName("暂无");
                    // 未开始的任务,其关联的用户组这些都可以从UserTask中拿到,因为本身未开始的任务是没有task的,所以这里直接查
                    if (StringUtils.isNotBlank(userTask.getAssignee())) {
                        vo.setHandlerType(HandlerTypeEnum.USER);
@@ -542,28 +550,77 @@
                } else {
                    vo.setTaskStatus(TaskStatusEnum.FINISHED);
                    // 如果是已完成的,信息需要单独赋值
                    vo.setTaskId(historicTask.getId());
                    vo.setExecutionId(historicTask.getExecutionId());
                    vo.setCreateTime(historicTask.getStartTime());
                    vo.setTaskId(historicTasks.get(0).getId());
                    vo.setExecutionId(historicTasks.get(0).getExecutionId());
                    vo.setCreateTime(historicTasks.get(0).getStartTime());
                    // 查询实际处理人
                    long handlerUserId = Long.parseLong(historicTask.getAssignee());
                    long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee());
                    SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                    if (Objects.nonNull(handlerUser)) {
                        vo.setHandlerId(handlerUserId);
                        vo.setHandlerName(handlerUser.getNickName());
                    }
                    this.setPromoterAndHandler(vo, historicTask.getIdentityLinks());
                    vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey());
                    this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks());
                }
            } else {
                vo.setTaskStatus(TaskStatusEnum.TODO);
                vo.setTaskId(task.getId());
                vo.setExecutionId(task.getExecutionId());
                vo.setCreateTime(task.getCreateTime());
                vo.setTaskDefinitionKey(task.getTaskDefinitionKey());
                this.setPromoterAndHandler(vo, null);
            }
            return vo;
        }).collect(Collectors.toList());
        result.data(vos);
        return vos;
    }
    /**
     * 查询已完成的流程的任务信息
     *
     * @param userTasks 任务节点列表
     * @param processInsId 流程实例id
     * @param processDefId 流程定义id
     * @return
     */
    private List<CustomerTaskVO> getFinishedProcessTaskInfo(List<UserTask> userTasks, String processInsId, String processDefId) {
        HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> {
            CustomerTaskVO vo = new CustomerTaskVO();
            vo.setProcessInsId(hisProcess.getId());
            vo.setProcessDefId(processDefId);
            vo.setDeployId(hisProcess.getDeploymentId());
            vo.setTaskName(userTask.getName());
            vo.setProcessName(hisProcess.getProcessDefinitionName());
            // 查多个是因为驳回后会查出两条及以上,取最新一条
            List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(hisProcess.getId())
                    .taskDefinitionKey(userTask.getId()).includeIdentityLinks()
                    .orderByHistoricTaskInstanceStartTime()
                    .desc()
                    .list();
            vo.setTaskStatus(TaskStatusEnum.FINISHED);
            // 如果是已完成的,信息需要单独赋值
            vo.setTaskId(hisTaskList.get(0).getId());
            vo.setExecutionId(hisTaskList.get(0).getExecutionId());
            vo.setCreateTime(hisTaskList.get(0).getStartTime());
            // 查询实际处理人
            long handlerUserId = Long.parseLong(hisTaskList.get(0).getAssignee());
            SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
            if (Objects.nonNull(handlerUser)) {
                vo.setHandlerId(handlerUserId);
                vo.setHandlerName(handlerUser.getNickName());
            }
            vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey());
            this.setPromoterAndHandler(vo, hisTaskList.get(0).getIdentityLinks());
            return vo;
        }).collect(Collectors.toList());
        return vos;
    }
@@ -596,6 +653,12 @@
        List<UserTask> userTasks = allUserTaskElement.subList(startNum, end);
        // 查出流程
        ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        if (Objects.isNull(process)) {
            // 如果流程已经完成,那么没有剩余事项了
            List<CustomerTaskVO> vos = new ArrayList<>(1);
            result.data(vos);
            return vos;
        }
        // 判断任务状态
        List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> {
            CustomerTaskVO vo = new CustomerTaskVO();
@@ -607,12 +670,14 @@
            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
            if (Objects.isNull(task)) {
                // 如果任务在运行时没找到,那么可能为未开始或者已完成,只查询未开始的
                HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery()
                List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
                        .processInstanceId(process.getProcessInstanceId())
                        .taskDefinitionKey(userTask.getId())
                        .includeIdentityLinks()
                        .singleResult();
                if (Objects.isNull(historicTask)) {
                        .orderByHistoricTaskInstanceStartTime()
                        .desc()
                        .list();
                if (CollectionUtils.isEmpty(historicTasks)) {
                    // 未开始的任务,其关联的用户组这些都可以从UserTask中拿到,因为本身未开始的任务是没有task的,所以这里直接查
                    if (StringUtils.isNotBlank(userTask.getAssignee())) {
                        vo.setHandlerType(HandlerTypeEnum.USER);
@@ -674,18 +739,24 @@
        List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId);
        // 查出流程
        ProcessInstance process = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        if (Objects.isNull(process)) {
            // 运行时未找到流程,说明流程已经结束了
            return 0L;
        }
        long num = 0L;
        // 判断任务状态
        for (UserTask userTask : allUserTaskElement) {
            Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult();
            if (Objects.isNull(task)) {
                // 如果任务在运行时没找到,那么可能为未开始或者已完成,只查询未开始的
                HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery()
                List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery()
                        .processInstanceId(process.getProcessInstanceId())
                        .taskDefinitionKey(userTask.getId())
                        .includeIdentityLinks()
                        .singleResult();
                if (Objects.isNull(historicTask)) {
                        .orderByHistoricTaskInstanceStartTime()
                        .desc()
                        .list();
                if (CollectionUtils.isEmpty(historicTasks)) {
                    num++;
                }
            }
@@ -695,22 +766,13 @@
    /**
     * 设置任务的发起人&处理人
     * 设置任务的发起人&处理人   只有待办任务和已完成任务才会掉这个方法
     *
     * @param taskVO
     * @param identityLinkInfos 如果是已完成的任务,用这个去取关联的用户/用户组
     */
    private void setPromoterAndHandler(CustomerTaskVO taskVO, List<? extends IdentityLinkInfo> identityLinkInfos) {
        // TODO 发起人是否应为上一节点的处理人
        // 流程发起人信息
        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
                .processInstanceId(taskVO.getProcessInsId())
                .singleResult();
        SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
        taskVO.setPromoterId(startUser.getUserId());
        taskVO.setPromoterName(startUser.getNickName());
        taskVO.setPromoterUnitId(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptId() : null);
        taskVO.setPromoterUnitName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
        this.setPromoterInfo(taskVO);
        // 流程处理人信息
        if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) {
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId());
@@ -798,6 +860,41 @@
    }
    /**
     * 设置任务发起人
     *
     * @param taskVO
     */
    private void setPromoterInfo(CustomerTaskVO taskVO) {
        // 发起人应为上一节点的处理人
        List<String> beforeNodeKey = taskCommonService.getBeforeNodeInfo(taskVO.getProcessDefId(), taskVO.getTaskDefinitionKey());
        List<SysUser> userList = beforeNodeKey.stream().map(key -> {
            List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(taskVO.getProcessInsId())
                    .taskDefinitionKey(key)
                    .orderByHistoricTaskInstanceStartTime()
                    .desc()
                    .list(); // 之所以用list是因为如果某个任务被驳回过,且如果该任务再次执行时会有多条数据,取最新的一条
            if (! CollectionUtils.isEmpty(historicTaskInstances)) {
                // 实际领取这个任务的人,也就是处理人
                String assignee = historicTaskInstances.get(0).getAssignee();
                SysUser startUser = sysUserService.selectUserById(Long.parseLong(assignee));
                return startUser;
            } else {
                return null;
            }
        }).filter(user -> Objects.nonNull(user)).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(userList)) {
            taskVO.setPromoterName("暂无");
            taskVO.setPromoterUnitName("暂无");
        } else {
            taskVO.setPromoterId(userList.stream().map(user -> { return user.getUserId() + ""; }).collect(Collectors.joining("、")));
            taskVO.setPromoterName(userList.stream().map(user -> { return user.getNickName(); }).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptId() + "";}).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitName(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> { return user.getDept().getDeptName() + "";}).collect(Collectors.joining("、")));
        }
    }
    /**
     * 获取某个流程的所有任务节点
     *
     * @param processDefinitionId