diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java index 3aa95f5a..4d1b3274 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java @@ -25,4 +25,11 @@ public interface IWfProcessService { * @param variables 扩展参数 */ void startProcess(String procDefId, Map variables); + + /** + * 通过DefinitionKey启动流程 + * @param procDefKey 流程定义Key + * @param variables 扩展参数 + */ + void startProcessByDefKey(String procDefKey, Map variables); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java index 3abe29bd..0d17518f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfTaskService.java @@ -7,6 +7,7 @@ import com.ruoyi.workflow.domain.vo.WfTaskVo; import com.ruoyi.workflow.domain.bo.WfTaskBo; import com.ruoyi.workflow.domain.vo.WfViewerVo; import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import java.io.InputStream; @@ -165,4 +166,11 @@ public interface IWfTaskService { * @return */ WfNextDto getNextFlowNode(WfTaskBo bo); + + /** + * 启动第一个任务 + * @param processInstance 流程实例 + * @param variables 流程参数 + */ + void startFirstTask(ProcessInstance processInstance, Map variables); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java index b5bb508f..fb9c70c9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java @@ -6,11 +6,13 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.flowable.common.constant.ProcessConstants; import com.ruoyi.flowable.common.enums.FlowComment; import com.ruoyi.flowable.factory.FlowServiceFactory; import com.ruoyi.workflow.domain.vo.WfDefinitionVo; import com.ruoyi.workflow.service.IWfProcessService; +import com.ruoyi.workflow.service.IWfTaskService; import lombok.RequiredArgsConstructor; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.ProcessDefinition; @@ -33,6 +35,8 @@ import java.util.Objects; @Service public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProcessService { + private final IWfTaskService wfTaskService; + /** * 流程定义列表 * @@ -93,22 +97,35 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { throw new ServiceException("流程已被挂起,请先激活流程"); } -// variables.put("skip", true); -// variables.put(ProcessConstants.FLOWABLE_SKIP_EXPRESSION_ENABLED, true); // 设置流程发起人Id到流程中 - String userIdStr = LoginHelper.getUserId().toString(); - identityService.setAuthenticatedUserId(userIdStr); - variables.put(ProcessConstants.PROCESS_INITIATOR, userIdStr); + this.buildProcessVariables(variables); ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); // 给第一步申请人节点设置任务执行人和意见 todo:第一个节点不设置为申请人节点有点问题? - Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); - if (Objects.nonNull(task)) { - if (!StrUtil.equalsAny(task.getAssignee(), userIdStr)) { - throw new ServiceException("数据验证失败,该工作流第一个用户任务的指派人并非当前用户,不能执行该操作!"); + wfTaskService.startFirstTask(processInstance, variables); + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException("流程启动错误"); + } + } + + /** + * 通过DefinitionKey启动流程 + * @param procDefKey 流程定义Key + * @param variables 扩展参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void startProcessByDefKey(String procDefKey, Map variables) { + try { + if (StringUtils.isNoneBlank(procDefKey)) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .processDefinitionKey(procDefKey).latestVersion().singleResult(); + if (processDefinition != null && processDefinition.isSuspended()) { + throw new ServiceException("流程已被挂起,请先激活流程"); } - taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), LoginHelper.getNickName() + "发起流程申请"); - // taskService.setAssignee(task.getId(), userIdStr); - taskService.complete(task.getId(), variables); + this.buildProcessVariables(variables); + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(procDefKey, variables); + wfTaskService.startFirstTask(processInstance, variables); } } catch (Exception e) { e.printStackTrace(); @@ -116,4 +133,13 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce } } + /** + * 扩展参数构建 + * @param variables 扩展参数 + */ + private void buildProcessVariables(Map variables) { + String userIdStr = LoginHelper.getUserId().toString(); + identityService.setAuthenticatedUserId(userIdStr); + variables.put(ProcessConstants.PROCESS_INITIATOR, userIdStr); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java index 7b2b112d..e64e1abf 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java @@ -4,6 +4,7 @@ package com.ruoyi.workflow.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.ruoyi.common.core.domain.PageQuery; @@ -979,6 +980,25 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ return nextDto; } + /** + * 启动第一个任务 + * @param processInstance 流程实例 + * @param variables 流程参数 + */ + public void startFirstTask(ProcessInstance processInstance, Map variables) { + // 给第一步申请人节点设置任务执行人和意见 todo:第一个节点不设置为申请人节点有点问题? + Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); + if (Objects.nonNull(task)) { + String userIdStr = (String) variables.get(ProcessConstants.PROCESS_INITIATOR); + if (!StrUtil.equalsAny(task.getAssignee(), userIdStr)) { + throw new ServiceException("数据验证失败,该工作流第一个用户任务的指派人并非当前用户,不能执行该操作!"); + } + taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), LoginHelper.getNickName() + "发起流程申请"); + // taskService.setAssignee(task.getId(), userIdStr); + taskService.complete(task.getId(), variables); + } + } + /** * 流程完成时间处理 *