| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.domain.dto.StartProcessReturnDTO; |
| | | import org.dromara.common.core.domain.dto.UserDTO; |
| | | import org.dromara.common.core.enums.BusinessStatusEnum; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | |
| | | import org.dromara.warm.flow.orm.entity.*; |
| | | import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper; |
| | | import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper; |
| | | import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; |
| | | import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; |
| | | import org.dromara.workflow.common.ConditionalOnEnable; |
| | | import org.dromara.workflow.common.enums.TaskAssigneeType; |
| | | import org.dromara.workflow.common.enums.TaskStatusEnum; |
| | | import org.dromara.workflow.domain.bo.*; |
| | |
| | | * |
| | | * @author may |
| | | */ |
| | | @ConditionalOnEnable |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | @Service |
| | |
| | | |
| | | private final TaskService taskService; |
| | | private final InsService insService; |
| | | private final FlowInstanceMapper flowInstanceMapper; |
| | | private final FlwTaskMapper flwTaskMapper; |
| | | private final UserService userService; |
| | | private final FlowTaskMapper flowTaskMapper; |
| | | private final FlowHisTaskMapper flowHisTaskMapper; |
| | | private final FlowProcessEventHandler flowProcessEventHandler; |
| | | private final DefService defService; |
| | | private final HisTaskService hisTaskService; |
| | | private final IdentifierGenerator identifierGenerator; |
| | | private final NodeService nodeService; |
| | | private final FlowNodeMapper flowNodeMapper; |
| | | private final FlowInstanceMapper flowInstanceMapper; |
| | | private final FlowTaskMapper flowTaskMapper; |
| | | private final FlowHisTaskMapper flowHisTaskMapper; |
| | | private final IdentifierGenerator identifierGenerator; |
| | | private final FlowProcessEventHandler flowProcessEventHandler; |
| | | private final UserService userService; |
| | | private final FlwTaskMapper flwTaskMapper; |
| | | private final FlwCategoryMapper flwCategoryMapper; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Map<String, Object> startWorkFlow(StartProcessBo startProcessBo) { |
| | | public StartProcessReturnDTO startWorkFlow(StartProcessBo startProcessBo) { |
| | | String businessId = startProcessBo.getBusinessId(); |
| | | if (StringUtils.isBlank(businessId)) { |
| | | throw new ServiceException("启动工作流时必须包含业务ID"); |
| | |
| | | if (ObjectUtil.isNotNull(flowInstance)) { |
| | | BusinessStatusEnum.checkStartStatus(flowInstance.getFlowStatus()); |
| | | List<Task> taskList = taskService.list(new FlowTask().setInstanceId(flowInstance.getId())); |
| | | return Map.of(PROCESS_INSTANCE_ID, taskList.get(0).getInstanceId(), TASK_ID, taskList.get(0).getId()); |
| | | StartProcessReturnDTO dto = new StartProcessReturnDTO(); |
| | | dto.setProcessInstanceId(taskList.get(0).getInstanceId()); |
| | | dto.setTaskId(taskList.get(0).getId()); |
| | | return dto; |
| | | } |
| | | FlowParams flowParams = new FlowParams(); |
| | | flowParams.flowCode(startProcessBo.getFlowCode()); |
| | |
| | | if (taskList.size() > 1) { |
| | | throw new ServiceException("请检查流程第一个环节是否为申请人!"); |
| | | } |
| | | return Map.of(PROCESS_INSTANCE_ID, instance.getId(), TASK_ID, taskList.get(0).getId()); |
| | | StartProcessReturnDTO dto = new StartProcessReturnDTO(); |
| | | dto.setProcessInstanceId(instance.getId()); |
| | | dto.setTaskId(taskList.get(0).getId()); |
| | | return dto; |
| | | } |
| | | |
| | | /** |
| | |
| | | // 获取抄送人 |
| | | List<FlowCopyBo> flowCopyList = completeTaskBo.getFlowCopyList(); |
| | | FlowTask flowTask = flowTaskMapper.selectById(taskId); |
| | | if (ObjectUtil.isNull(flowTask)) { |
| | | throw new ServiceException("流程任务不存在或任务已审批!"); |
| | | } |
| | | Instance ins = insService.getById(flowTask.getInstanceId()); |
| | | // 获取流程定义信息 |
| | | Definition definition = defService.getById(flowTask.getDefinitionId()); |
| | | // 检查流程状态是否为草稿、已撤销或已退回状态,若是则执行流程提交监听 |
| | | if (BusinessStatusEnum.isDraftOrCancelOrBack(ins.getFlowStatus())) { |
| | | flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), true); |
| | | flowProcessEventHandler.processHandler(definition.getFlowCode(), ins.getBusinessId(), ins.getFlowStatus(), null, true); |
| | | } |
| | | // 构建流程参数,包括变量、跳转类型、消息、处理人、权限等信息 |
| | | FlowParams flowParams = new FlowParams(); |
| | |
| | | this.setCopy(task, flowCopyList); |
| | | // 根据流程实例ID查询所有关联的任务 |
| | | List<FlowTask> flowTasks = this.selectByInstId(instance.getId()); |
| | | if (CollUtil.isEmpty(flowTasks)) { |
| | | return; |
| | | } |
| | | List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId); |
| | | // 获取与当前任务关联的用户列表 |
| | | List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList); |
| | | if (CollUtil.isEmpty(associatedUsers)) { |
| | | return; |
| | | } |
| | | List<User> userList = new ArrayList<>(); |
| | | // 遍历任务列表,处理每个任务的办理人 |
| | | for (FlowTask flowTask : flowTasks) { |
| | | // 获取与当前任务关联的用户列表 |
| | | List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(flowTask.getId())); |
| | | if (CollUtil.isNotEmpty(associatedUsers)) { |
| | | userList.addAll(WorkflowUtils.buildUser(associatedUsers, flowTask.getId())); |
| | | List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId())); |
| | | if (CollUtil.isNotEmpty(users)) { |
| | | userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId())); |
| | | } |
| | | } |
| | | // 批量删除现有任务的办理人记录 |
| | | if (CollUtil.isNotEmpty(flowTasks)) { |
| | | WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId)); |
| | | } |
| | | WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList); |
| | | // 确保要保存的 userList 不为空 |
| | | if (CollUtil.isNotEmpty(userList)) { |
| | | WorkflowUtils.getFlowUserService().saveBatch(userList); |
| | | if (CollUtil.isEmpty(userList)) { |
| | | return; |
| | | } |
| | | WorkflowUtils.getFlowUserService().saveBatch(userList); |
| | | } |
| | | |
| | | /** |
| | |
| | | wrapper.in(CollUtil.isNotEmpty(flowTaskBo.getCreateByIds()), "t.create_by", flowTaskBo.getCreateByIds()); |
| | | if (StringUtils.isNotBlank(flowTaskBo.getCategory())) { |
| | | List<Long> categoryIds = flwCategoryMapper.selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory())); |
| | | wrapper.in("t.category", categoryIds); |
| | | wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr)); |
| | | } |
| | | wrapper.orderByDesc("t.create_time"); |
| | | return wrapper; |
| | |
| | | flowParams.skipType(SkipType.REJECT.getKey()); |
| | | flowParams.flowStatus(applyNodeCode.equals(bo.getNodeCode()) ? TaskStatusEnum.BACK.getStatus() : TaskStatusEnum.WAITING.getStatus()) |
| | | .hisStatus(TaskStatusEnum.BACK.getStatus()); |
| | | flowParams.hisTaskExt(bo.getFileId()); |
| | | taskService.skip(task.getId(), flowParams); |
| | | |
| | | Instance instance = insService.getById(inst.getId()); |