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() @RepeatSubmit()
@PostMapping("/deploy") @PostMapping("/deploy")
public R<Void> deployModel(@RequestParam String modelId) { public R<Void> deployModel(@RequestParam String modelId) {
modelService.deployModel(modelId); return toAjax(modelService.deployModel(modelId));
return R.ok();
} }
} }

View File

@@ -1,12 +1,11 @@
package com.ruoyi.flowable.utils; package com.ruoyi.flowable.utils;
import org.flowable.bpmn.converter.BpmnXMLConverter; 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.Process;
import org.flowable.bpmn.model.StartEvent; import org.flowable.bpmn.model.*;
import org.flowable.common.engine.impl.util.io.StringStreamSource; import org.flowable.common.engine.impl.util.io.StringStreamSource;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
/** /**
@@ -45,9 +44,54 @@ public class ModelUtils {
*/ */
public static StartEvent getStartEvent(BpmnModel model) { public static StartEvent getStartEvent(BpmnModel model) {
Process process = model.getMainProcess(); Process process = model.getMainProcess();
Collection<FlowElement> elements = process.getFlowElements(); Collection<FlowElement> flowElements = process.getFlowElements();
return (StartEvent) elements.stream() return getStartEvent(flowElements);
.filter(flowElement -> flowElement instanceof StartEvent) }
.findFirst().orElse(null);
/**
* 获取开始节点
*
* @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.WfDeployForm;
import com.ruoyi.workflow.domain.vo.WfFormVo; import com.ruoyi.workflow.domain.vo.WfFormVo;
import org.flowable.bpmn.model.BpmnModel;
/** /**
* 流程实例关联表单Service接口 * 流程实例关联表单Service接口
@@ -21,11 +22,11 @@ public interface IWfDeployFormService {
/** /**
* 保存流程实例关联表单 * 保存流程实例关联表单
* @param deployId * @param deployId 部署ID
* @param formKey * @param bpmnModel bpmnModel对象
* @return * @return
*/ */
int saveInternalDeployForm(String deployId, String formKey); boolean saveInternalDeployForm(String deployId, BpmnModel bpmnModel);
/** /**
* 查询流程挂着的表单 * 查询流程挂着的表单
@@ -33,5 +34,6 @@ public interface IWfDeployFormService {
* @param deployId * @param deployId
* @return * @return
*/ */
@Deprecated
WfFormVo selectDeployFormByDeployId(String deployId); 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; package com.ruoyi.workflow.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.flowable.utils.ModelUtils;
import com.ruoyi.workflow.domain.WfDeployForm; import com.ruoyi.workflow.domain.WfDeployForm;
import com.ruoyi.workflow.domain.WfForm; import com.ruoyi.workflow.domain.WfForm;
import com.ruoyi.workflow.domain.vo.WfFormVo; 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.mapper.WfFormMapper;
import com.ruoyi.workflow.service.IWfDeployFormService; import com.ruoyi.workflow.service.IWfDeployFormService;
import lombok.RequiredArgsConstructor; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
@@ -50,17 +58,30 @@ public class WfDeployFormServiceImpl implements IWfDeployFormService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int saveInternalDeployForm(String deployId, String formKey) { public boolean saveInternalDeployForm(String deployId, BpmnModel bpmnModel) {
WfDeployForm deployForm = new WfDeployForm(); List<WfDeployForm> deployFormList = new ArrayList<>();
deployForm.setDeployId(deployId); // 获取开始节点
deployForm.setFormKey(formKey); StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel);
Long formId = Convert.toLong(StringUtils.substringAfter(formKey, "key_")); if (ObjectUtil.isNull(startEvent)) {
WfForm wfForm = formMapper.selectById(formId); throw new RuntimeException("开始节点不存在,请检查流程设计是否有误!");
if (ObjectUtil.isNotNull(wfForm)) {
deployForm.setContent(wfForm.getContent());
} }
// 新增部署流程和表单关系 // 保存开始节点表单信息
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; 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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deployModel(String modelId) { public boolean deployModel(String modelId) {
// 获取流程模型 // 获取流程模型
Model model = repositoryService.getModel(modelId); Model model = repositoryService.getModel(modelId);
if (ObjectUtil.isNull(model)) { if (ObjectUtil.isNull(model)) {
@@ -281,16 +281,8 @@ public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelSe
// 获取流程图 // 获取流程图
String bpmnXml = queryBpmnXmlById(modelId); String bpmnXml = queryBpmnXmlById(modelId);
BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml); 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; String processName = model.getName() + ProcessConstants.SUFFIX;
// 部署流程
Deployment deployment = repositoryService.createDeployment() Deployment deployment = repositoryService.createDeployment()
.name(model.getName()) .name(model.getName())
.key(model.getKey()) .key(model.getKey())
@@ -298,8 +290,7 @@ public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelSe
.category(model.getCategory()) .category(model.getCategory())
.deploy(); .deploy();
// 保存部署表单 // 保存部署表单
deployFormService.saveInternalDeployForm(deployment.getId(), formKey); return deployFormService.saveInternalDeployForm(deployment.getId(), bpmnModel);
} }
/** /**