fix(部署流程): 修改部署流程方法,增加保存用户节点的表单信息

This commit is contained in:
konbai
2022-08-01 21:16:04 +08:00
parent 4adb99729b
commit 1ff440c235
6 changed files with 123 additions and 35 deletions

View File

@@ -137,8 +137,7 @@ public class WfModelController extends BaseController {
@RepeatSubmit()
@PostMapping("/deploy")
public R<Void> deployModel(@RequestParam String modelId) {
modelService.deployModel(modelId);
return R.ok();
return toAjax(modelService.deployModel(modelId));
}
}

View File

@@ -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<FlowElement> elements = process.getFlowElements();
return (StartEvent) elements.stream()
.filter(flowElement -> flowElement instanceof StartEvent)
.findFirst().orElse(null);
Collection<FlowElement> flowElements = process.getFlowElements();
return getStartEvent(flowElements);
}
/**
* 获取开始节点
*
* @param flowElements 流程元素集合
* @return 开始节点未找到开始节点返回null
*/
public static StartEvent getStartEvent(Collection<FlowElement> flowElements) {
for (FlowElement flowElement : flowElements) {
if (flowElement instanceof StartEvent) {
return (StartEvent) flowElement;
}
}
return null;
}
/**
* 获取所有用户任务节点
*
* @param model bpmnModel对象
* @return 用户任务节点列表
*/
public static Collection<UserTask> getAllUserTaskEvent(BpmnModel model) {
Process process = model.getMainProcess();
Collection<FlowElement> flowElements = process.getFlowElements();
return getAllUserTaskEvent(flowElements, null);
}
/**
* 获取所有用户任务节点
* @param flowElements 流程元素集合
* @param allElements 所有流程元素集合
* @return 用户任务节点列表
*/
public static Collection<UserTask> getAllUserTaskEvent(Collection<FlowElement> flowElements, Collection<UserTask> 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;
}
}

View File

@@ -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);
}

View File

@@ -61,5 +61,5 @@ public interface IWfModelService {
/**
* 部署流程模型
*/
void deployModel(String modelId);
boolean deployModel(String modelId);
}

View File

@@ -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<WfDeployForm> 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<UserTask> 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;
}
}

View File

@@ -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);
}
/**