From 1adffe70f3ebcaeee2d157a5353cd9f2baf99abc Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Tue, 17 Dec 2024 15:49:31 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E9=A9=B3=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/mapper/FlwTaskMapper.java | 13 +++- .../service/impl/FlwInstanceServiceImpl.java | 14 +--- .../service/impl/FlwTaskServiceImpl.java | 76 ++++++++++--------- .../dromara/workflow/utils/WorkflowUtils.java | 14 ++++ .../mapper/workflow/FlwTaskMapper.xml | 4 +- script/bpmn/leave5.xml | 27 +++++++ 6 files changed, 96 insertions(+), 52 deletions(-) create mode 100644 script/bpmn/leave5.xml diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java index 18a37d081..9d010f735 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/FlwTaskMapper.java @@ -9,6 +9,8 @@ import org.dromara.workflow.domain.bo.FlowTaskBo; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import java.util.List; + /** * 任务信息Mapper接口 @@ -25,8 +27,15 @@ public interface FlwTaskMapper { * @param queryWrapper 条件 * @return 结果 */ - Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page getListRunTask(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + /** + * 获取待办信息 + * + * @param queryWrapper 条件 + * @return 结果 + */ + List getListRunTask(@Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 获取已办 * @@ -34,7 +43,7 @@ public interface FlwTaskMapper { * @param queryWrapper 条件 * @return 结果 */ - Page getTaskFinishByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page getListFinishTask(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 查询当前用户的抄送 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java index afbbf88b1..b273a038f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java @@ -22,23 +22,16 @@ import org.dromara.warm.flow.core.constant.ExceptionCons; import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Instance; -import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.enums.NodeType; -import org.dromara.warm.flow.core.enums.SkipType; import org.dromara.warm.flow.core.service.DefService; import org.dromara.warm.flow.core.service.InsService; -import org.dromara.warm.flow.core.service.NodeService; import org.dromara.warm.flow.core.service.TaskService; -import org.dromara.warm.flow.core.utils.AssertUtil; import org.dromara.warm.flow.orm.entity.FlowHisTask; import org.dromara.warm.flow.orm.entity.FlowInstance; -import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; 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.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.FlowCancelBo; import org.dromara.workflow.domain.bo.FlowInstanceBo; @@ -69,12 +62,9 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { private final InsService insService; private final DefService defService; private final FlowHisTaskMapper flowHisTaskMapper; - private final FlowTaskMapper flowTaskMapper; private final FlowInstanceMapper flowInstanceMapper; private final FlwInstanceMapper flwInstanceMapper; private final TaskService taskService; - private final FlowNodeMapper flowNodeMapper; - private final NodeService nodeService; private final IFlwTaskService flwTaskService; /** @@ -206,9 +196,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { if (CollUtil.isNotEmpty(currentTaskList)) { if (currentTaskList.size() > 1) { currentTaskList.remove(0); - List taskIds = StreamUtils.toList(currentTaskList, Task::getId); - WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIds); - flowTaskMapper.deleteByIds(taskIds); + WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId)); } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java index c5dbf9b01..17c2771d4 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java @@ -44,6 +44,7 @@ import org.dromara.workflow.handler.WorkflowPermissionHandler; import org.dromara.workflow.mapper.FlwTaskMapper; import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.utils.WorkflowUtils; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -155,7 +156,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Instance instance = taskService.skip(taskId, flowParams); this.setHandler(instance, flowTask, flowCopyList); // 消息通知 - WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); + sendMessage(definition.getFlowName(), ins.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -203,7 +204,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService { * @param task 任务信息 * @param flowCopyList 抄送人 */ - private void setCopy(FlowTask task, List flowCopyList) { + @Async + public void setCopy(FlowTask task, List flowCopyList) { if (CollUtil.isEmpty(flowCopyList)) { return; } @@ -265,7 +267,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey()); queryWrapper.in("t.approver", LoginHelper.getUserIdStr()); queryWrapper.orderByDesc("t.create_time").orderByDesc("t.update_time"); - Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); + Page page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -284,7 +286,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } private Page getFlowTaskVoPage(PageQuery pageQuery, QueryWrapper queryWrapper) { - Page page = flwTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper); + Page page = flwTaskMapper.getListRunTask(pageQuery.build(), queryWrapper); List records = page.getRecords(); if (CollUtil.isNotEmpty(records)) { List taskIds = StreamUtils.toList(records, FlowTaskVo::getId); @@ -309,7 +311,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { @Override public TableDataInfo pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) { QueryWrapper queryWrapper = buildQueryWrapper(flowTaskBo); - Page page = flwTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper); + Page page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper); return TableDataInfo.build(page); } @@ -360,36 +362,30 @@ public class FlwTaskServiceImpl implements IFlwTaskService { Long definitionId = task.getDefinitionId(); Definition definition = defService.getById(definitionId); String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId); - FlowNode node = flowNodes.stream().filter(e -> e.getNodeCode().equals(task.getNodeCode())).findFirst().orElse(null); - BigDecimal nodeRatio = node.getNodeRatio(); - //票签 - if (nodeRatio.compareTo(BigDecimal.ZERO) > 0 && nodeRatio.compareTo(new BigDecimal(100)) < 0) { - List userList = this.currentTaskAllUser(task.getId()); - FlowParams flowParams = FlowParams.build(); - flowParams.nodeCode(bo.getNodeCode()); - flowParams.message(message); - flowParams.skipType(SkipType.PASS.getKey()); - if (applyNodeCode.equals(bo.getNodeCode())) { - flowParams.flowStatus(TaskStatusEnum.BACK.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus()); - } else { - flowParams.flowStatus(TaskStatusEnum.WAITING.getStatus()).hisStatus(TaskStatusEnum.BACK.getStatus()); - } - flowParams.ignore(true); - //解决票签没权限问题 - if (CollUtil.isNotEmpty(userList)) { - flowParams.handler(userList.get(0).getUserId().toString()); - } - taskService.skip(task.getId(), flowParams); + List listRunTask = flwTaskMapper.getListRunTask(new QueryWrapper().eq("instance_id", task.getInstanceId())); + //不是当前节点的待审任务 + List taskVos = StreamUtils.filter(listRunTask, e -> !e.getId().equals(taskId)); + WorkflowUtils.deleteRunTask(StreamUtils.toList(taskVos, FlowTaskVo::getId)); + if (applyNodeCode.equals(bo.getNodeCode())) { + WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.BACK.getStatus(), TaskStatusEnum.BACK.getStatus()); } else { - //申请人节点 - if (applyNodeCode.equals(bo.getNodeCode())) { - WorkflowUtils.backTask(message, inst.getId(), applyNodeCode, TaskStatusEnum.BACK.getStatus(), TaskStatusEnum.BACK.getStatus()); - } else { - WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus()); + WorkflowUtils.backTask(message, inst.getId(), bo.getNodeCode(), TaskStatusEnum.WAITING.getStatus(), TaskStatusEnum.BACK.getStatus()); + } + //删除记录 + FlowNode node = flowNodes.stream().filter(e -> e.getNodeCode().equals(task.getNodeCode())).findFirst().orElse(null); + if (node.getNodeRatio().compareTo(BigDecimal.ZERO) > 0) { + List flowHisTasks = flowHisTaskMapper.selectList( + new LambdaQueryWrapper() + .eq(FlowHisTask::getFlowStatus, BusinessStatusEnum.BACK.getStatus()) + .eq(FlowHisTask::getTaskId, taskId) + .ne(FlowHisTask::getApprover, LoginHelper.getUserIdStr()) + ); + if (CollUtil.isNotEmpty(flowHisTasks)) { + flowHisTaskMapper.deleteByIds(StreamUtils.toList(flowHisTasks, FlowHisTask::getId)); } } Instance instance = insService.getById(inst.getId()); - //判断申请人节点是否有多个,只保留一个 + //判断或节点是否有多个,只保留一个 List currentTaskList = selectByInstId(instance.getId()); if (CollUtil.isNotEmpty(currentTaskList)) { List nodeCodes = StreamUtils.toList(currentTaskList, FlowTask::getNodeCode); @@ -398,15 +394,13 @@ public class FlwTaskServiceImpl implements IFlwTaskService { List flowTasks = currentTaskList.stream().filter(e -> e.getNodeCode().equals(n.getNodeCode()) && n.getNodeRatio().compareTo(BigDecimal.ZERO) == 0).collect(Collectors.toList()); if (flowTasks.size() > 1) { flowTasks.remove(0); - List taskIds = StreamUtils.toList(flowTasks, Task::getId); - WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIds); - flowTaskMapper.deleteByIds(taskIds); + WorkflowUtils.deleteRunTask(StreamUtils.toList(flowTasks, Task::getId)); } } } this.setHandler(instance, task, null); //消息通知 - WorkflowUtils.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); + sendMessage(definition.getFlowName(), instance.getId(), messageType, notice); return true; } catch (Exception e) { log.error(e.getMessage(), e); @@ -414,6 +408,18 @@ public class FlwTaskServiceImpl implements IFlwTaskService { } } + /** + * 发送消息 + * + * @param flowName 流程定义名称 + * @param messageType 消息类型 + * @param notice 消息内容,为空则发送默认配置的消息内容 + */ + @Async + public void sendMessage(String flowName, Long instId, List messageType, String notice) { + WorkflowUtils.sendMessage(flowName, instId, messageType, notice); + } + /** * 获取可驳回节点 * diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index 3736027a5..9042ed1a5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -28,6 +28,7 @@ import org.dromara.warm.flow.orm.entity.FlowNode; import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowUser; import org.dromara.warm.flow.orm.mapper.FlowNodeMapper; +import org.dromara.warm.flow.orm.mapper.FlowTaskMapper; import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.service.IFlwTaskAssigneeService; import org.dromara.workflow.service.IFlwTaskService; @@ -52,6 +53,7 @@ public class WorkflowUtils { private static final TaskService taskService = SpringUtils.getBean(TaskService.class); private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class); private static final NodeService nodeService = SpringUtils.getBean(NodeService.class); + private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class); /** * 获取工作流用户service @@ -189,4 +191,16 @@ public class WorkflowUtils { return nextNode.getNodeCode(); } + /** + * 删除运行中的任务 + * + * @param taskIds 任务id + */ + public static void deleteRunTask(List taskIds) { + if (CollUtil.isEmpty(taskIds)) { + return; + } + userService.deleteByTaskIds(taskIds); + FLOW_TASK_MAPPER.deleteByIds(taskIds); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml index 55e84a823..754a8677f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml +++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwTaskMapper.xml @@ -8,7 +8,7 @@ - select * from ( select distinct t.id, @@ -42,7 +42,7 @@ ${ew.getCustomSqlSegment} - select * from ( select a.id, diff --git a/script/bpmn/leave5.xml b/script/bpmn/leave5.xml new file mode 100644 index 000000000..049937bae --- /dev/null +++ b/script/bpmn/leave5.xml @@ -0,0 +1,27 @@ + + + + + e1b04e96-dc81-4858-a309-2fe945d2f374 + + + 3e743f4f-51ca-41d4-8e94-21f5dd9b59c9 + + + c80f273e-1f17-4bd8-9ad1-04a4a94ea862 + 1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4 + + + 1a20169e-3d82-4926-a151-e2daad28de1b + + + 7a8f0473-e409-442e-a843-5c2b813d00e9 + + + 03c4d2bc-58b5-4408-a2e4-65afb046f169 + + + + 1a20169e-3d82-4926-a151-e2daad28de1b + +