xiangpei
2024-12-24 982e63b981079caaae2be3ad8bb11d29cf9cd97b
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -12,12 +12,14 @@
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
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;
@@ -28,6 +30,7 @@
import com.ycl.domain.form.ProjectProcessForm;
import com.ycl.domain.vo.ProjectProcessVO;
import com.ycl.domain.query.ProjectProcessQuery;
import com.ycl.service.common.TaskCommonService;
import com.ycl.system.service.ISysDeptService;
import com.ycl.system.service.ISysRoleService;
import com.ycl.system.service.ISysUserService;
@@ -52,6 +55,7 @@
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
@@ -76,6 +80,7 @@
    private final ISysUserService sysUserService;
    private final ISysRoleService sysRoleService;
    private final ISysDeptService sysDeptService;
    private final TaskCommonService taskCommonService;
    /**
     * 分页查询
@@ -111,14 +116,16 @@
        if (Objects.nonNull(pp.getProcessInsId())) {
            HistoricProcessInstance historicProcessInstance =
                    historyService.createHistoricProcessInstanceQuery().processInstanceId(pp.getProcessInsId()).singleResult();
            // 删除之前流程的数据
            if (historicProcessInstance.getEndTime() != null) {
                historyService.deleteHistoricProcessInstance(historicProcessInstance.getId());
            } else {
                // 删除流程实例
                runtimeService.deleteProcessInstance(pp.getProcessInsId(), "");
                // 删除历史流程实例
                historyService.deleteHistoricProcessInstance(pp.getProcessInsId());
            if (Objects.nonNull(historicProcessInstance)) {
                // 删除之前流程的数据
                if (historicProcessInstance.getEndTime() != null) {
                    historyService.deleteHistoricProcessInstance(historicProcessInstance.getId());
                } else {
                    // 删除流程实例
                    runtimeService.deleteProcessInstance(pp.getProcessInsId(), "");
                    // 删除历史流程实例
                    historyService.deleteHistoricProcessInstance(pp.getProcessInsId());
                }
            }
        }
        String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId());
@@ -201,7 +208,7 @@
        taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId()));
//        taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId()));
        taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(projectProcess.getProcessDefId(), projectProcess.getProcessInsId()));
        detail.setStatistics(taskStatistics);
        Result result = Result.ok();
@@ -271,21 +278,17 @@
            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) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerId(sysUser.getUserId());
@@ -298,6 +301,7 @@
                    // 绑定的是角色或者部门
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
@@ -310,6 +314,7 @@
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
@@ -332,6 +337,33 @@
                .eq(ProjectProcess::getProcessDefId, query.getProcessDefId())
                .list();
        return Result.ok().data(list);
    }
    @Override
    public Result taskIsAuditing(String processDefinitionId, String taskId) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
        Collection<Process> processes = bpmnModel.getProcesses();
        Boolean needAuditing = Boolean.FALSE;
        for (Process process : processes) {
            Collection<FlowElement> flowElements = process.getFlowElements();
            for (FlowElement flowElement : flowElements) {
                if (flowElement instanceof UserTask && flowElement.getId().equals(task.getTaskDefinitionKey())) {
                    UserTask userTask = (UserTask) flowElement;
                    needAuditing = taskCommonService.checkTaskNeedAuditing(userTask.getExtensionElements().get("properties"));
                    break;
                }
            }
        }
        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("驳回成功");
    }
    /**
@@ -372,21 +404,17 @@
            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) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerId(sysUser.getUserId());
@@ -399,6 +427,7 @@
                    // 绑定的是角色或者部门
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
@@ -411,6 +440,7 @@
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
@@ -440,7 +470,6 @@
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId);
        result.total(allUserTaskElement.size());
        if (startNum >= allUserTaskElement.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
@@ -449,10 +478,17 @@
            // 模拟模糊查询
            allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList());
        }
        result.total(allUserTaskElement.size());
        int end = Math.min(endNum, allUserTaskElement.size());
        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();
@@ -464,14 +500,19 @@
            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);
                        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
                        if (Objects.nonNull(sysUser)) {
                            vo.setHandlerId(sysUser.getUserId());
@@ -482,6 +523,7 @@
                    } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) {
                        String groupId = userTask.getCandidateGroups().get(0);
                        if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                            vo.setHandlerType(HandlerTypeEnum.DEPT);
                            String[] split = groupId.split(":");
                            if (split.length > 1) {
                                // 部门
@@ -494,6 +536,7 @@
                                }
                            }
                        } else {
                            vo.setHandlerType(HandlerTypeEnum.ROLE);
                            SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId));
                            if (Objects.nonNull(role)) {
                                vo.setHandlerUnitId(Long.parseLong(groupId));
@@ -507,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;
    }
@@ -547,7 +639,7 @@
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId);
        result.total(allUserTaskElement.size());
        if (startNum >= allUserTaskElement.size()) {
            // 如果起始索引超出了列表的大小,返回一个空列表
            return new ArrayList<>();
@@ -556,10 +648,17 @@
            // 模拟模糊查询
            allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList());
        }
        result.total(allUserTaskElement.size());
        int end = Math.min(endNum, allUserTaskElement.size());
        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();
@@ -571,14 +670,17 @@
            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);
                        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
                        if (Objects.nonNull(sysUser)) {
                            vo.setHandlerId(sysUser.getUserId());
@@ -589,6 +691,7 @@
                    } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) {
                        String groupId = userTask.getCandidateGroups().get(0);
                        if (groupId.startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                            vo.setHandlerType(HandlerTypeEnum.DEPT);
                            String[] split = groupId.split(":");
                            if (split.length > 1) {
                                // 部门
@@ -601,6 +704,7 @@
                                }
                            }
                        } else {
                            vo.setHandlerType(HandlerTypeEnum.ROLE);
                            SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId));
                            if (Objects.nonNull(role)) {
                                vo.setHandlerUnitId(Long.parseLong(groupId));
@@ -635,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++;
                }
            }
@@ -656,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());
@@ -680,6 +781,7 @@
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerType(HandlerTypeEnum.USER);
                        taskVO.setHandlerId(sysUser.getUserId());
                        if (Objects.nonNull(sysUser.getDept())) {
                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
@@ -690,6 +792,7 @@
                    // 绑定的是角色或者是部门,需要根据id判断
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
@@ -702,6 +805,7 @@
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
@@ -716,6 +820,7 @@
            for (IdentityLinkInfo identityLink : identityLinkInfos) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
//                        taskVO.setHandlerId(sysUser.getUserId());
@@ -728,6 +833,7 @@
                    // 绑定的是角色,查出角色名称
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
@@ -737,18 +843,55 @@
                                taskVO.setHandlerUnitName(dept.getDeptName());
                            }
                        }
                    }
                    SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                    if (Objects.nonNull(role)) {
                        taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                        taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                            taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
//                        taskVO.setHandlerName(role.getRoleName());
//                        taskVO.setHandlerId(null);
                        }
                    }
                }
            }
        }
    }
    /**
     * 设置任务发起人
     *
     * @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("、")));
        }
    }
    /**
@@ -794,16 +937,6 @@
     */
    private Long getTotalTaskNum(String processDefinitionId) {
        return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size());
    }
    /**
     * 获取流程剩余未完成的任务数
     *
     * @param processInstanceId
     * @return
     */
    private Long getNotFinishedTaskNum(String processInstanceId) {
        return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count();
    }
    /**