fuliqi
2025-01-03 a0e8d1bbff7a02f538be76e852aa233324bd8810
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -20,6 +20,7 @@
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
import com.ycl.domain.form.RejectTaskForm;
import com.ycl.domain.form.TaskDelegationForm;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
import com.ycl.mapper.ProjectInfoMapper;
@@ -44,6 +45,7 @@
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.identitylink.api.IdentityLinkInfo;
import org.flowable.identitylink.api.IdentityLinkType;
import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
@@ -254,6 +256,7 @@
        TaskQuery taskQuery = taskService.createTaskQuery()
                .active()
                .includeProcessVariables()
                .includeIdentityLinks()
                .orderByTaskCreateTime().desc();
        if (StringUtils.isNotBlank(taskName)) {
@@ -284,8 +287,8 @@
            this.setPromoterInfo(taskVO);
            // 流程处理人信息
            List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
            for (IdentityLink identityLink : identityLinksForTask) {
            List<? extends IdentityLinkInfo> identityLinks = task.getIdentityLinks();
            for (IdentityLinkInfo identityLink : identityLinks) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
@@ -360,10 +363,36 @@
    }
    @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("驳回成功");
    public Result taskDelegation(TaskDelegationForm form) {
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).includeIdentityLinks().singleResult();
        if (Objects.isNull(task)) {
            throw new RuntimeException("未在运行任务中找到该任务,无法执行转办操作");
        }
        // 需要先移除之前的处理人
        for (IdentityLinkInfo identityLink : task.getIdentityLinks()) {
            if (StringUtils.isNotBlank(identityLink.getUserId())) {
                taskService.deleteCandidateUser(task.getId(), identityLink.getUserId());
            } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                taskService.deleteCandidateGroup(task.getId(), identityLink.getGroupId());
            }
        }
        // 再新增处理人
        switch (form.getPeopleType()) {
            case FIX_USER:
                // 指定用户的话,只能选一个用户
                taskService.delegateTask(task.getId(), form.getTargetId());
                break;
            case USER:
                // 用户组的话,可以选多个用户,严格来说这里的用户组并不是flowable中的组的概念,只是开源框架有这个定义
                break;
            case DEPT:
                taskService.addCandidateGroup(task.getId(), form.getTargetId());
                break;
            default:
                break;
        }
        return Result.ok("转办成功");
    }
    /**
@@ -483,6 +512,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();
@@ -573,6 +608,52 @@
    }
    /**
     * 查询已完成的流程的任务信息
     *
     * @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;
    }
    /**
     * 查询剩余事项(未开始的任务)
     *
     * @param processDefinitionId
@@ -601,6 +682,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();
@@ -681,6 +768,10 @@
        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) {