Commit 62b720a5d01339dc4cf6d2baa4739bbdfa5150da

Authored by YunaiV
1 parent c4950e1b

BPM 模型重构 2:导入流程时,只填写 name、description、key

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/BpmModelController.java
... ... @@ -47,7 +47,7 @@ public class BpmModelController {
47 47 @ApiOperation(value = "新建模型")
48 48 @PreAuthorize("@ss.hasPermission('bpm:model:create')")
49 49 public CommonResult<String> createModel(@Valid @RequestBody BpmModelCreateReqVO createRetVO) {
50   - return success(bpmModelService.createModel(createRetVO));
  50 + return success(bpmModelService.createModel(createRetVO, null));
51 51 }
52 52  
53 53 @PostMapping("/import")
... ... @@ -56,8 +56,8 @@ public class BpmModelController {
56 56 public CommonResult<String> importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException {
57 57 BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO);
58 58 // 读取文件
59   -// createReqVO.setBpmnXml(IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false));
60   - return success(bpmModelService.createModel(createReqVO));
  59 + String bpmnXml = IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false);
  60 + return success(bpmModelService.createModel(createReqVO, bpmnXml));
61 61 }
62 62  
63 63 @PutMapping("/update")
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModeImportReqVO.java
... ... @@ -9,11 +9,11 @@ import org.springframework.web.multipart.MultipartFile;
9 9  
10 10 import javax.validation.constraints.NotNull;
11 11  
12   -@ApiModel("流程模型的导入 Request VO")
  12 +@ApiModel(value = "流程模型的导入 Request VO", description = "相比流程模型的新建来说,只是多了一个 bpmnFile 文件")
13 13 @Data
14 14 @EqualsAndHashCode(callSuper = true)
15 15 @ToString(callSuper = true)
16   -public class BpmModeImportReqVO extends BpmModelBaseVO {
  16 +public class BpmModeImportReqVO extends BpmModelCreateReqVO {
17 17  
18 18 @ApiModelProperty(value = "BPMN 文件", required = true)
19 19 @NotNull(message = "BPMN 文件不能为空")
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmModelService.java
... ... @@ -32,9 +32,10 @@ public interface BpmModelService {
32 32 * 创建流程模型
33 33 *
34 34 * @param modelVO 创建信息
  35 + * @param bpmnXml BPMN XML
35 36 * @return 创建的流程模型的编号
36 37 */
37   - String createModel(@Valid BpmModelCreateReqVO modelVO);
  38 + String createModel(@Valid BpmModelCreateReqVO modelVO, String bpmnXml);
38 39  
39 40 /**
40 41 * 修改流程模型
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java
... ... @@ -9,6 +9,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefini
9 9 import cn.iocoder.yudao.adminserver.modules.bpm.service.form.BpmFormService;
10 10 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmModelService;
11 11 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
  12 +import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils;
12 13 import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 14 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
14 15 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
... ... @@ -108,7 +109,7 @@ public class BpmModelServiceImpl implements BpmModelService {
108 109  
109 110 @Override
110 111 @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务
111   - public String createModel(BpmModelCreateReqVO createReqVO) {
  112 + public String createModel(BpmModelCreateReqVO createReqVO, String bpmnXml) {
112 113 checkKeyNCName(createReqVO.getKey());
113 114 // 校验流程标识已经存在
114 115 Model keyModel = this.getModelByKey(createReqVO.getKey());
... ... @@ -121,6 +122,8 @@ public class BpmModelServiceImpl implements BpmModelService {
121 122 BpmModelConvert.INSTANCE.copy(model, createReqVO);
122 123 // 保存流程定义
123 124 repositoryService.saveModel(model);
  125 + // 保存 BPMN XML
  126 + saveModelBpmnXml(model, bpmnXml);
124 127 return model.getId();
125 128 }
126 129  
... ... @@ -138,7 +141,16 @@ public class BpmModelServiceImpl implements BpmModelService {
138 141 // 更新模型
139 142 repositoryService.saveModel(model);
140 143 // 更新 BPMN XML
141   - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(updateReqVO.getBpmnXml()));
  144 + saveModelBpmnXml(model, updateReqVO.getBpmnXml());
  145 + }
  146 +
  147 + private void saveModelBpmnXml(Model model, String bpmnXml) {
  148 + if (StrUtil.isEmpty(bpmnXml)) {
  149 + return;
  150 + }
  151 + byte[] bpmnBytes = ActivitiUtils.replaceBpmnMainProcessIdAndName(bpmnXml,
  152 + model.getKey(), model.getName());
  153 + repositoryService.addModelEditorSource(model.getId(), bpmnBytes);
142 154 }
143 155  
144 156 @Override
... ... @@ -211,11 +223,10 @@ public class BpmModelServiceImpl implements BpmModelService {
211 223 }
212 224 }
213 225  
214   -// public static void main(String[] args) {
215   -// // 创建转换对象
216   -// BpmnXMLConverter converter = new BpmnXMLConverter();
217   -// BpmnModel bpmnModel = converter.convertToBpmnModel(new StringStreamSource(""), true, true);
218   -// bpmnModel.getProcesses().get(0).getId()
219   -// }
  226 + public static void main(String[] args) {
  227 + // 创建转换对象
  228 + BpmnXMLConverter converter = new BpmnXMLConverter();
  229 + BpmnModel bpmnModel = converter.convertToBpmnModel(new StringStreamSource(""), true, true);
  230 + }
220 231  
221 232 }
... ...
yudao-admin-ui/src/views/bpm/model/index.vue
... ... @@ -307,7 +307,7 @@ export default {
307 307 return;
308 308 }
309 309 createModel(this.form).then(response => {
310   - this.msgSuccess("新增成功");
  310 + this.msgSuccess("新建流程模型成功");
311 311 this.open = false;
312 312 this.getList();
313 313 });
... ... @@ -404,7 +404,7 @@ export default {
404 404 // 重置表单
405 405 this.uploadClose();
406 406 // 提示,并刷新
407   - this.msgSuccess("上传成功!请点击【设计流程】按钮,进行编辑保存后,才可以进行【发布流程】");
  407 + this.msgSuccess("导入流程模型成功");
408 408 this.getList();
409 409 },
410 410 uploadClose() {
... ...
yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java
... ... @@ -2,10 +2,13 @@ package cn.iocoder.yudao.framework.activiti.core.util;
2 2  
3 3 import cn.hutool.core.util.ReflectUtil;
4 4 import com.alibaba.ttl.TransmittableThreadLocal;
  5 +import org.activiti.bpmn.converter.BpmnXMLConverter;
  6 +import org.activiti.bpmn.model.BpmnModel;
5 7 import org.activiti.engine.history.HistoricProcessInstance;
6 8 import org.activiti.engine.impl.identity.Authentication;
7 9 import org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntityImpl;
8 10 import org.activiti.engine.impl.persistence.entity.HistoricScopeInstanceEntityImpl;
  11 +import org.activiti.engine.impl.util.io.StringStreamSource;
9 12  
10 13 /**
11 14 * Activiti 工具类
... ... @@ -37,4 +40,25 @@ public class ActivitiUtils {
37 40 Authentication.setAuthenticatedUserId(null);
38 41 }
39 42  
  43 + // ========== BPMN XML 相关 ==========
  44 +
  45 + /**
  46 + * 替换 BPMN XML 主流程的 id 和 name 属性
  47 + *
  48 + * @param bpmnXml 原始的 BPMN XML 字符串
  49 + * @param id 编号,对应到 XML 实际是 key 属性
  50 + * @param name 名字
  51 + * @return 新的 BPMN XML 的字节数组
  52 + */
  53 + public static byte[] replaceBpmnMainProcessIdAndName(String bpmnXml, String id, String name) {
  54 + // 转换成 BpmnModel 对象
  55 + BpmnXMLConverter converter = new BpmnXMLConverter();
  56 + BpmnModel bpmnModel = converter.convertToBpmnModel(new StringStreamSource(bpmnXml), true, true);
  57 + // 设置 id 和 name 属性
  58 + bpmnModel.getMainProcess().setId(id);
  59 + bpmnModel.getMainProcess().setName(name);
  60 + // 转换回字节数组
  61 + return converter.convertToXML(bpmnModel);
  62 + }
  63 +
40 64 }
... ...