From 1ff440c2359ed29a6073ddb6c0db94ecae9f5383 Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Mon, 1 Aug 2022 21:16:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E9=83=A8=E7=BD=B2=E6=B5=81=E7=A8=8B):=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E7=BD=B2=E6=B5=81=E7=A8=8B=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BF=9D=E5=AD=98=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=8A=82=E7=82=B9=E7=9A=84=E8=A1=A8=E5=8D=95=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/WfModelController.java | 3 +- .../com/ruoyi/flowable/utils/ModelUtils.java | 58 +++++++++++++-- .../service/IWfDeployFormService.java | 8 ++- .../workflow/service/IWfModelService.java | 2 +- .../service/impl/WfDeployFormServiceImpl.java | 72 ++++++++++++++++--- .../service/impl/WfModelServiceImpl.java | 15 +--- 6 files changed, 123 insertions(+), 35 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfModelController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfModelController.java index 1cbfc0e9..346f3166 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfModelController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfModelController.java @@ -137,8 +137,7 @@ public class WfModelController extends BaseController { @RepeatSubmit() @PostMapping("/deploy") public R deployModel(@RequestParam String modelId) { - modelService.deployModel(modelId); - return R.ok(); + return toAjax(modelService.deployModel(modelId)); } } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java index 766cc622..e449dd67 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/utils/ModelUtils.java @@ -1,12 +1,11 @@ package com.ruoyi.flowable.utils; import org.flowable.bpmn.converter.BpmnXMLConverter; -import org.flowable.bpmn.model.BpmnModel; -import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.Process; -import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.util.io.StringStreamSource; +import java.util.ArrayList; import java.util.Collection; /** @@ -45,9 +44,54 @@ public class ModelUtils { */ public static StartEvent getStartEvent(BpmnModel model) { Process process = model.getMainProcess(); - Collection elements = process.getFlowElements(); - return (StartEvent) elements.stream() - .filter(flowElement -> flowElement instanceof StartEvent) - .findFirst().orElse(null); + Collection flowElements = process.getFlowElements(); + return getStartEvent(flowElements); + } + + /** + * 获取开始节点 + * + * @param flowElements 流程元素集合 + * @return 开始节点(未找到开始节点,返回null) + */ + public static StartEvent getStartEvent(Collection flowElements) { + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof StartEvent) { + return (StartEvent) flowElement; + } + } + return null; + } + + /** + * 获取所有用户任务节点 + * + * @param model bpmnModel对象 + * @return 用户任务节点列表 + */ + public static Collection getAllUserTaskEvent(BpmnModel model) { + Process process = model.getMainProcess(); + Collection flowElements = process.getFlowElements(); + return getAllUserTaskEvent(flowElements, null); + } + + /** + * 获取所有用户任务节点 + * @param flowElements 流程元素集合 + * @param allElements 所有流程元素集合 + * @return 用户任务节点列表 + */ + public static Collection getAllUserTaskEvent(Collection flowElements, Collection allElements) { + allElements = allElements == null ? new ArrayList<>() : allElements; + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof UserTask) { + allElements.add((UserTask) flowElement); + } + if (flowElement instanceof SubProcess) { + // 继续深入子流程,进一步获取子流程 + allElements = getAllUserTaskEvent(((SubProcess) flowElement).getFlowElements(), allElements); + } + } + return allElements; } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfDeployFormService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfDeployFormService.java index f7d8de69..ee4d7531 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfDeployFormService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfDeployFormService.java @@ -2,6 +2,7 @@ package com.ruoyi.workflow.service; import com.ruoyi.workflow.domain.WfDeployForm; import com.ruoyi.workflow.domain.vo.WfFormVo; +import org.flowable.bpmn.model.BpmnModel; /** * 流程实例关联表单Service接口 @@ -21,11 +22,11 @@ public interface IWfDeployFormService { /** * 保存流程实例关联表单 - * @param deployId - * @param formKey + * @param deployId 部署ID + * @param bpmnModel bpmnModel对象 * @return */ - int saveInternalDeployForm(String deployId, String formKey); + boolean saveInternalDeployForm(String deployId, BpmnModel bpmnModel); /** * 查询流程挂着的表单 @@ -33,5 +34,6 @@ public interface IWfDeployFormService { * @param deployId * @return */ + @Deprecated WfFormVo selectDeployFormByDeployId(String deployId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfModelService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfModelService.java index ee7de025..363ee7cd 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfModelService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfModelService.java @@ -61,5 +61,5 @@ public interface IWfModelService { /** * 部署流程模型 */ - void deployModel(String modelId); + boolean deployModel(String modelId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfDeployFormServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfDeployFormServiceImpl.java index 7dc3cb96..62519eb2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfDeployFormServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfDeployFormServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -7,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.flowable.utils.ModelUtils; import com.ruoyi.workflow.domain.WfDeployForm; import com.ruoyi.workflow.domain.WfForm; import com.ruoyi.workflow.domain.vo.WfFormVo; @@ -14,9 +16,15 @@ import com.ruoyi.workflow.mapper.WfDeployFormMapper; import com.ruoyi.workflow.mapper.WfFormMapper; import com.ruoyi.workflow.service.IWfDeployFormService; import lombok.RequiredArgsConstructor; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowNode; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.UserTask; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -50,17 +58,30 @@ public class WfDeployFormServiceImpl implements IWfDeployFormService { @Override @Transactional(rollbackFor = Exception.class) - public int saveInternalDeployForm(String deployId, String formKey) { - WfDeployForm deployForm = new WfDeployForm(); - deployForm.setDeployId(deployId); - deployForm.setFormKey(formKey); - Long formId = Convert.toLong(StringUtils.substringAfter(formKey, "key_")); - WfForm wfForm = formMapper.selectById(formId); - if (ObjectUtil.isNotNull(wfForm)) { - deployForm.setContent(wfForm.getContent()); + public boolean saveInternalDeployForm(String deployId, BpmnModel bpmnModel) { + List deployFormList = new ArrayList<>(); + // 获取开始节点 + StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel); + if (ObjectUtil.isNull(startEvent)) { + throw new RuntimeException("开始节点不存在,请检查流程设计是否有误!"); } - // 新增部署流程和表单关系 - return baseMapper.insert(deployForm); + // 保存开始节点表单信息 + WfDeployForm startDeployForm = buildDeployForm(deployId, startEvent); + if (ObjectUtil.isNotNull(startDeployForm)) { + deployFormList.add(startDeployForm); + } + // 保存用户节点表单信息 + Collection userTasks = ModelUtils.getAllUserTaskEvent(bpmnModel); + if (CollUtil.isNotEmpty(userTasks)) { + for (UserTask userTask : userTasks) { + WfDeployForm userTaskDeployForm = buildDeployForm(deployId, userTask); + if (ObjectUtil.isNotNull(userTaskDeployForm)) { + deployFormList.add(userTaskDeployForm); + } + } + } + // 批量新增部署流程和表单关联信息 + return baseMapper.insertBatch(deployFormList); } /** @@ -84,4 +105,35 @@ public class WfDeployFormServiceImpl implements IWfDeployFormService { return null; } } + + /** + * 构建部署表单关联信息对象 + * @param deployId 部署ID + * @param node 节点信息 + * @return 部署表单关联对象。若无表单信息(formKey),则返回null + */ + private WfDeployForm buildDeployForm(String deployId, FlowNode node) { + String formKey = null; + if (node instanceof StartEvent) { + formKey = ((StartEvent) node).getFormKey(); + } else if (node instanceof UserTask) { + formKey = ((UserTask) node).getFormKey(); + } + if (StringUtils.isEmpty(formKey)) { + return null; + } + Long formId = Convert.toLong(StringUtils.substringAfter(formKey, "key_")); + WfForm wfForm = formMapper.selectById(formId); + if (ObjectUtil.isNull(wfForm)) { + throw new ServiceException("表单信息查询错误"); + } + WfDeployForm deployForm = new WfDeployForm(); + deployForm.setContent(wfForm.getContent()); + deployForm.setDeployId(deployId); + deployForm.setNodeKey(node.getId()); + deployForm.setNodeName(node.getName()); + deployForm.setFormKey(formKey); + deployForm.setContent(wfForm.getContent()); + return deployForm; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java index 09511dd3..17b0086f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfModelServiceImpl.java @@ -272,7 +272,7 @@ public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelSe @Override @Transactional(rollbackFor = Exception.class) - public void deployModel(String modelId) { + public boolean deployModel(String modelId) { // 获取流程模型 Model model = repositoryService.getModel(modelId); if (ObjectUtil.isNull(model)) { @@ -281,16 +281,8 @@ public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelSe // 获取流程图 String bpmnXml = queryBpmnXmlById(modelId); BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml); - // 获取开始节点 - StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel); - if (ObjectUtil.isNull(startEvent)) { - throw new RuntimeException("开始节点不存在,请检查流程设计是否有误!"); - } - String formKey = startEvent.getFormKey(); - if (StringUtils.isEmpty(formKey)) { - throw new RuntimeException("请配置流程表单"); - } String processName = model.getName() + ProcessConstants.SUFFIX; + // 部署流程 Deployment deployment = repositoryService.createDeployment() .name(model.getName()) .key(model.getKey()) @@ -298,8 +290,7 @@ public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelSe .category(model.getCategory()) .deploy(); // 保存部署表单 - deployFormService.saveInternalDeployForm(deployment.getId(), formKey); - + return deployFormService.saveInternalDeployForm(deployment.getId(), bpmnModel); } /**