diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java index 8575fdec1..a167cb5c8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.warm.flow.core.dto.FlowParams; import com.warm.flow.core.dto.ModifyHandler; +import com.warm.flow.core.entity.HisTask; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; import com.warm.flow.core.enums.CooperateType; @@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Collections; +import java.util.List; import java.util.Map; /** @@ -265,4 +267,15 @@ public class FlwTaskController extends BaseController { return toAjax(flwTaskService.backProcess(bo)); } + /** + * 获取可驳回节点 + * + * @param instanceId 实例id + */ + @GetMapping("/getBackTaskNode/{instanceId}") + public R> getBackTaskNode(@PathVariable String instanceId) { + return R.ok(flwTaskService.getBackTaskNode(instanceId)); + } + + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index ac1251e2c..60bd30feb 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -39,7 +39,7 @@ public class BackProcessBo implements Serializable { * 驳回的节点id(目前未使用,直接驳回到申请人) */ @NotBlank(message = "驳回的节点不能为空", groups = AddGroup.class) - private String targetNodeCode; + private String nodeCode; /** * 办理意见 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java index 237fe56b3..6424073ed 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java @@ -1,11 +1,13 @@ package org.dromara.workflow.service; +import com.warm.flow.core.entity.HisTask; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.FlowHisTaskVo; import org.dromara.workflow.domain.vo.FlowTaskVo; +import java.util.List; import java.util.Map; /** @@ -50,7 +52,6 @@ public interface IFlwTaskService { TableDataInfo getPageByTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery); - /** * 查询待办任务 * @@ -85,4 +86,12 @@ public interface IFlwTaskService { * @return 结果 */ boolean backProcess(BackProcessBo bo); + + /** + * 获取可驳回节点 + * + * @param instanceId 实例id + * @return 结果 + */ + List getBackTaskNode(String instanceId); } 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 4689b8128..512cd925d 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 @@ -39,6 +39,7 @@ import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Arrays; import java.util.List; /** @@ -85,7 +86,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { @Override public TableDataInfo getPageByFinish(Instance instance, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("t.flow_status", FlowStatus.FINISHED.getKey()); + queryWrapper.in("t.flow_status", Arrays.asList(FlowStatus.FINISHED.getKey(), FlowStatus.AUTO_PASS.getKey())); Page page = flwInstanceMapper.page(pageQuery.build(), queryWrapper); TableDataInfo build = TableDataInfo.build(); build.setRows(BeanUtil.copyToList(page.getRecords(), FlowInstanceVo.class)); @@ -149,8 +150,8 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService { // 获取下一个节点,如果是网关节点,则重新获取后续节点 //List nextNodes = FlowFactory.taskService().getNextByCheckGateWay(new FlowParams(), getFirstBetween(startNode)); //Node node = nextNodes.get(0); - // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); - // taskService.skip(list.get(0).getId(), flowParams); + // FlowParams flowParams = FlowParams.build().nodeCode(node.getNodeCode()).skipType(SkipType.PASS.getKey()).permissionFlag(WorkflowUtils.permissionList()); + // taskService.skip(list.get(0).getId(), flowParams); } catch (Exception e) { throw new RuntimeException(e); } 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 7fb014396..3bc3b623e 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.warm.flow.core.dto.FlowParams; +import com.warm.flow.core.entity.HisTask; import com.warm.flow.core.entity.Instance; import com.warm.flow.core.entity.Task; import com.warm.flow.core.entity.User; @@ -14,12 +15,15 @@ import com.warm.flow.core.enums.SkipType; import com.warm.flow.core.service.InsService; import com.warm.flow.core.service.TaskService; import com.warm.flow.core.service.UserService; +import com.warm.flow.orm.entity.FlowHisTask; import com.warm.flow.orm.entity.FlowInstance; +import com.warm.flow.orm.entity.FlowSkip; import com.warm.flow.orm.entity.FlowTask; +import com.warm.flow.orm.mapper.FlowHisTaskMapper; +import com.warm.flow.orm.mapper.FlowSkipMapper; import com.warm.flow.orm.mapper.FlowTaskMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.dto.UserDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; @@ -37,6 +41,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; import static org.dromara.workflow.common.constant.FlowConstant.*; @@ -56,8 +61,9 @@ public class FlwTaskServiceImpl implements IFlwTaskService { private final UserService userService; private final IWfDefinitionConfigService wfDefinitionConfigService; private final IFlwInstanceService iFlwInstanceService; - private final FlowTaskMapper flowTaskMapper; + private final FlowHisTaskMapper flowHisTaskMapper; + private final FlowSkipMapper flowSkipMapper; /** * 启动任务 @@ -92,7 +98,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService { FlowParams flowParams = new FlowParams(); flowParams.flowCode(wfDefinitionConfigVo.getProcessKey()); flowParams.variable(startProcessBo.getVariables()); - + flowParams.setHandler(String.valueOf(LoginHelper.getUserId())); Instance instance; try { instance = insService.start(startProcessBo.getBusinessKey(), flowParams); @@ -286,17 +292,52 @@ public class FlwTaskServiceImpl implements IFlwTaskService { try { String userId = String.valueOf(LoginHelper.getUserId()); Long taskId = bo.getTaskId(); + List flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId)); + if (CollUtil.isEmpty(flowTasks)) { + throw new ServiceException("任务不存在!"); + } + Long definitionId = flowTasks.get(0).getDefinitionId(); + List flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId)); + FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType())); + //开始节点的下一节点 + assert flowSkip != null; + String nextNodeCode = flowSkip.getNextNodeCode(); + FlowParams flowParams = new FlowParams(); flowParams.variable(bo.getVariables()); - flowParams.skipType(SkipType.REJECT.getKey()); + if (nextNodeCode.equals(bo.getNodeCode())) { + flowParams.skipType(SkipType.REJECT.getKey()); + } else { + flowParams.skipType(SkipType.PASS.getKey()); + } flowParams.message(bo.getMessage()); flowParams.handler(userId); - flowParams.nodeCode(bo.getTargetNodeCode()); - taskService.skip(taskId, flowParams); + flowParams.nodeCode(bo.getNodeCode()); + flowParams.setPermissionFlag(WorkflowUtils.permissionList()); + Instance instance = taskService.skip(taskId, flowParams); + setHandler(instance); return true; } catch (Exception e) { log.error(e.getMessage(), e); throw new ServiceException(e.getMessage()); } } + + /** + * 获取可驳回节点 + * + * @param instanceId 实例id + */ + @Override + public List getBackTaskNode(String instanceId) { + LambdaQueryWrapper lw = new LambdaQueryWrapper<>(FlowHisTask.class) + .eq(FlowHisTask::getInstanceId, instanceId) + .eq(FlowHisTask::getNodeType, 1) + .orderByDesc(FlowHisTask::getCreateTime); + List flowHisTasks = flowHisTaskMapper.selectList(lw); + if (CollUtil.isNotEmpty(flowHisTasks)) { + return flowHisTasks.stream().distinct().collect(Collectors.toList()); + } + return Collections.emptyList(); + } }