Commit a829e8d083380bca2db19fb411a4655fd8f3f02b

Authored by yunlong.li
1 parent 3f90e79d

初步完善模型发布流程

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/ModelController.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow; 1 package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow;
2 2
3 -import cn.hutool.core.util.StrUtil;  
4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp; 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp;
5 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO;  
6 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelCreateVO;  
7 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo; 4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo;
8 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelRespVo;  
9 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelUpdateVO; 5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelVO;
10 import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.BpmModelService; 6 import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.BpmModelService;
11 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 7 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
12 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
13 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; 9 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
14 -import com.fasterxml.jackson.databind.ObjectMapper;  
15 -import com.fasterxml.jackson.databind.node.ObjectNode;  
16 import io.swagger.annotations.Api; 10 import io.swagger.annotations.Api;
17 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
18 import lombok.RequiredArgsConstructor; 12 import lombok.RequiredArgsConstructor;
19 import lombok.extern.slf4j.Slf4j; 13 import lombok.extern.slf4j.Slf4j;
20 -import org.activiti.engine.*;  
21 import org.activiti.engine.repository.Model; 14 import org.activiti.engine.repository.Model;
22 -import org.springframework.beans.factory.annotation.Autowired;  
23 -import org.springframework.stereotype.Controller;  
24 import org.springframework.web.bind.annotation.*; 15 import org.springframework.web.bind.annotation.*;
25 16
26 -import javax.servlet.http.HttpServletRequest;  
27 import javax.servlet.http.HttpServletResponse; 17 import javax.servlet.http.HttpServletResponse;
28 import java.io.IOException; 18 import java.io.IOException;
29 -import java.io.UnsupportedEncodingException;  
30 19
31 /** 20 /**
32 * 工作流模型 21 * 工作流模型
@@ -49,14 +38,14 @@ public class ModelController { @@ -49,14 +38,14 @@ public class ModelController {
49 38
50 @PostMapping("/create") 39 @PostMapping("/create")
51 @ApiOperation(value = "新建模型") 40 @ApiOperation(value = "新建模型")
52 - public CommonResult<String> newModel(@RequestBody ModelCreateVO modelCreateVO) {  
53 - return bpmModelService.newModel(modelCreateVO); 41 + public CommonResult<String> newModel(@RequestBody ModelVO modelVO) {
  42 + return bpmModelService.newModel(modelVO);
54 } 43 }
55 44
56 @PostMapping("/update") 45 @PostMapping("/update")
57 @ApiOperation(value = "修改模型属性") 46 @ApiOperation(value = "修改模型属性")
58 - public CommonResult<String> updateModel(@RequestBody ModelUpdateVO modelUpdateVO) {  
59 - return bpmModelService.updateModel(modelUpdateVO); 47 + public CommonResult<String> updateModel(@RequestBody ModelVO modelVO) {
  48 + return bpmModelService.updateModel(modelVO);
60 } 49 }
61 50
62 @PostMapping("/delete") 51 @PostMapping("/delete")
@@ -72,9 +61,9 @@ public class ModelController { @@ -72,9 +61,9 @@ public class ModelController {
72 } 61 }
73 62
74 @GetMapping("/exportBpmnXml") 63 @GetMapping("/exportBpmnXml")
75 - @ApiOperation(value = "导出模型")  
76 - public void export(@RequestParam String deploymentId, HttpServletResponse response) throws IOException {  
77 - FileResp fileResp = bpmModelService.exportBpmnXml(deploymentId); 64 + @ApiOperation(value = "导出模型Xml")
  65 + public void export(@RequestParam String modelId, HttpServletResponse response) throws IOException {
  66 + FileResp fileResp = bpmModelService.exportBpmnXml(modelId);
78 ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte()); 67 ServletUtils.writeAttachment(response, fileResp.getFileName(), fileResp.getFileByte());
79 } 68 }
80 69
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/model/ModelCreateVO.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model;  
2 -  
3 -import io.swagger.annotations.ApiModelProperty;  
4 -import lombok.Data;  
5 -  
6 -/**  
7 - * 新增模型 VO  
8 - * @author yunlongn  
9 - */  
10 -@Data  
11 -public class ModelCreateVO {  
12 -  
13 - @ApiModelProperty(value = "模型名字", required = true)  
14 - private String name;  
15 -  
16 - @ApiModelProperty(value = "模型描述")  
17 - private String description;  
18 -  
19 - @ApiModelProperty(value = "版本号")  
20 - private Integer revision;  
21 -  
22 - @ApiModelProperty(value = "key值")  
23 - private String key;  
24 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/model/ModelUpdateVO.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/workflow/vo/model/ModelVO.java
@@ -8,9 +8,9 @@ import lombok.Data; @@ -8,9 +8,9 @@ import lombok.Data;
8 * @author yunlongn 8 * @author yunlongn
9 */ 9 */
10 @Data 10 @Data
11 -public class ModelUpdateVO { 11 +public class ModelVO {
12 12
13 - @ApiModelProperty(value = "模型Id", required = true) 13 + @ApiModelProperty(value = "模型Id")
14 private String id; 14 private String id;
15 15
16 @ApiModelProperty(value = "模型名字", required = true) 16 @ApiModelProperty(value = "模型名字", required = true)
@@ -27,6 +27,4 @@ public class ModelUpdateVO { @@ -27,6 +27,4 @@ public class ModelUpdateVO {
27 27
28 @ApiModelProperty(value = "bpmnXml") 28 @ApiModelProperty(value = "bpmnXml")
29 private String bpmnXml; 29 private String bpmnXml;
30 -  
31 -  
32 } 30 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/BpmModelService.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp; 3 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp;
4 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelCreateVO;  
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo; 4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo;
6 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelRespVo;  
7 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelUpdateVO; 5 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelVO;
8 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
9 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import org.activiti.engine.repository.Model; 8 import org.activiti.engine.repository.Model;
11 9
12 -import javax.servlet.http.HttpServletResponse;  
13 -  
14 /** 10 /**
15 * 工作流模型接口 11 * 工作流模型接口
16 * @author yunlongn 12 * @author yunlongn
@@ -27,16 +23,16 @@ public interface BpmModelService { @@ -27,16 +23,16 @@ public interface BpmModelService {
27 23
28 /** 24 /**
29 * 新增一个模型 25 * 新增一个模型
30 - * @param modelCreateVO 模型对象 26 + * @param modelVO 模型对象
31 * @return 返回成功 27 * @return 返回成功
32 */ 28 */
33 - CommonResult<String> newModel(ModelCreateVO modelCreateVO); 29 + CommonResult<String> newModel(ModelVO modelVO);
34 /** 30 /**
35 * 修改模型属性,填充bpmn数据 31 * 修改模型属性,填充bpmn数据
36 - * @param modelUpdateVO 模型对象 32 + * @param modelVO 模型对象
37 * @return 返回成功 33 * @return 返回成功
38 */ 34 */
39 - CommonResult<String> updateModel(ModelUpdateVO modelUpdateVO); 35 + CommonResult<String> updateModel(ModelVO modelVO);
40 36
41 /** 37 /**
42 * 部署模型 使模型成为一个 process 38 * 部署模型 使模型成为一个 process
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/workflow/impl/BpmModelServiceImpl.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.impl; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.impl;
2 2
3 -import cn.hutool.core.io.IoUtil;  
4 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp; 4 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.FileResp;
6 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelCreateVO;  
7 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo; 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelPageReqVo;
8 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelRespVo;  
9 -import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelUpdateVO; 6 +import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.model.ModelVO;
10 import cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants; 7 import cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants;
11 import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.BpmModelService; 8 import cn.iocoder.yudao.adminserver.modules.bpm.service.workflow.BpmModelService;
12 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; 9 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
@@ -15,26 +12,20 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -15,26 +12,20 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
15 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 12 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
16 import lombok.RequiredArgsConstructor; 13 import lombok.RequiredArgsConstructor;
17 import lombok.extern.slf4j.Slf4j; 14 import lombok.extern.slf4j.Slf4j;
18 -import org.activiti.api.runtime.shared.query.Pageable;  
19 import org.activiti.bpmn.converter.BpmnXMLConverter; 15 import org.activiti.bpmn.converter.BpmnXMLConverter;
20 import org.activiti.bpmn.model.BpmnModel; 16 import org.activiti.bpmn.model.BpmnModel;
21 import org.activiti.engine.RepositoryService; 17 import org.activiti.engine.RepositoryService;
22 import org.activiti.engine.repository.Deployment; 18 import org.activiti.engine.repository.Deployment;
23 import org.activiti.engine.repository.Model; 19 import org.activiti.engine.repository.Model;
24 import org.activiti.engine.repository.ModelQuery; 20 import org.activiti.engine.repository.ModelQuery;
25 -import org.activiti.engine.repository.ProcessDefinition;  
26 import org.apache.commons.lang3.exception.ExceptionUtils; 21 import org.apache.commons.lang3.exception.ExceptionUtils;
27 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
28 import org.springframework.util.ObjectUtils; 23 import org.springframework.util.ObjectUtils;
29 24
30 -import javax.servlet.http.HttpServletResponse;  
31 import javax.xml.stream.XMLInputFactory; 25 import javax.xml.stream.XMLInputFactory;
32 import javax.xml.stream.XMLStreamReader; 26 import javax.xml.stream.XMLStreamReader;
33 import java.io.ByteArrayInputStream; 27 import java.io.ByteArrayInputStream;
34 -import java.io.IOException;  
35 -import java.io.InputStream;  
36 import java.io.InputStreamReader; 28 import java.io.InputStreamReader;
37 -import java.net.URLEncoder;  
38 import java.nio.charset.StandardCharsets; 29 import java.nio.charset.StandardCharsets;
39 import java.util.List; 30 import java.util.List;
40 import java.util.Optional; 31 import java.util.Optional;
@@ -64,64 +55,67 @@ public class BpmModelServiceImpl implements BpmModelService { @@ -64,64 +55,67 @@ public class BpmModelServiceImpl implements BpmModelService {
64 } 55 }
65 56
66 @Override 57 @Override
67 - public CommonResult<String> newModel(ModelCreateVO modelCreateVO) { 58 + public CommonResult<String> newModel(ModelVO modelVO) {
68 try { 59 try {
69 //初始化一个空模型 60 //初始化一个空模型
70 Model model = repositoryService.newModel(); 61 Model model = repositoryService.newModel();
71 - String name = Optional.ofNullable(modelCreateVO.getName()).orElse("new-process"); 62 + String name = Optional.ofNullable(modelVO.getName()).orElse("new-process");
72 //设置一些默认信息 63 //设置一些默认信息
73 model.setName(name); 64 model.setName(name);
74 - model.setKey(Optional.ofNullable(modelCreateVO.getKey()).orElse("processKey"));  
75 - model.setMetaInfo(JsonUtils.toJsonString(modelCreateVO)); 65 + model.setKey(Optional.ofNullable(modelVO.getKey()).orElse("processKey"));
  66 + model.setMetaInfo(JsonUtils.toJsonString(modelVO));
76 repositoryService.saveModel(model); 67 repositoryService.saveModel(model);
77 - return CommonResult.success("保存成功"); 68 + if (!ObjectUtils.isEmpty(modelVO.getBpmnXml())) {
  69 + repositoryService.addModelEditorSource(model.getId(), modelVO.getBpmnXml().getBytes(StandardCharsets.UTF_8));
  70 + }
  71 + return CommonResult.success(model.getId());
78 }catch (Exception e){ 72 }catch (Exception e){
79 - log.info("模型创建失败!modelCreateVO = {} e = {} ", modelCreateVO, ExceptionUtils.getStackTrace(e)); 73 + log.info("模型创建失败!modelVO = {} e = {} ", modelVO, ExceptionUtils.getStackTrace(e));
80 throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR); 74 throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR);
81 } 75 }
82 76
83 } 77 }
84 78
85 @Override 79 @Override
86 - public CommonResult<String> updateModel(ModelUpdateVO modelUpdateVO) { 80 + public CommonResult<String> updateModel(ModelVO modelVO) {
87 try { 81 try {
88 - Model model = repositoryService.getModel(modelUpdateVO.getId()); 82 + Model model = repositoryService.getModel(modelVO.getId());
89 if (ObjectUtils.isEmpty(model)) { 83 if (ObjectUtils.isEmpty(model)) {
90 throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS); 84 throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
91 } 85 }
92 // 只能修改名字跟描述 86 // 只能修改名字跟描述
93 - ModelCreateVO modelCreateVO = JsonUtils.parseObject(model.getMetaInfo(), ModelCreateVO.class); 87 + ModelVO modelCreateVO = JsonUtils.parseObject(model.getMetaInfo(), ModelVO.class);
94 if (ObjectUtils.isEmpty(modelCreateVO)) { 88 if (ObjectUtils.isEmpty(modelCreateVO)) {
95 - modelCreateVO = new ModelCreateVO(); 89 + modelCreateVO = new ModelVO();
96 } 90 }
97 - modelCreateVO.setName(modelUpdateVO.getName());  
98 - modelCreateVO.setDescription(modelUpdateVO.getDescription()); 91 + modelCreateVO.setName(modelVO.getName());
  92 + modelCreateVO.setDescription(modelVO.getDescription());
99 model.setMetaInfo(JsonUtils.toJsonString(modelCreateVO)); 93 model.setMetaInfo(JsonUtils.toJsonString(modelCreateVO));
100 - model.setName(modelUpdateVO.getName()); 94 + model.setName(modelVO.getName());
  95 + model.setKey(modelVO.getKey());
101 // 更新模型 96 // 更新模型
102 repositoryService.saveModel(model); 97 repositoryService.saveModel(model);
103 98
104 - repositoryService.addModelEditorSource(model.getId(), modelUpdateVO.getBpmnXml().getBytes(StandardCharsets.UTF_8)); 99 + repositoryService.addModelEditorSource(model.getId(), modelVO.getBpmnXml().getBytes(StandardCharsets.UTF_8));
105 100
106 return CommonResult.success("保存成功"); 101 return CommonResult.success("保存成功");
107 }catch (Exception e){ 102 }catch (Exception e){
108 - log.info("模型更新失败!modelUpdateVO = {} e = {} ", modelUpdateVO, ExceptionUtils.getStackTrace(e)); 103 + log.info("模型更新失败!modelVO = {}", modelVO, e);
109 throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR); 104 throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR);
110 } 105 }
111 } 106 }
112 107
113 @Override 108 @Override
114 public CommonResult<String> deploy(String modelId) { 109 public CommonResult<String> deploy(String modelId) {
115 - // 获取模型  
116 - Model modelData = repositoryService.getModel(modelId);  
117 - if (ObjectUtils.isEmpty(modelData)) {  
118 - throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);  
119 - }  
120 - byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());  
121 - if (bytes == null) {  
122 - throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);  
123 - }  
124 try { 110 try {
  111 + Model modelData = repositoryService.getModel(modelId);
  112 + if (ObjectUtils.isEmpty(modelData)) {
  113 + throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
  114 + }
  115 + byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
  116 + if (bytes == null) {
  117 + throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
  118 + }
125 // 将xml转换为流 119 // 将xml转换为流
126 ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); 120 ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
127 XMLInputFactory xif = XMLInputFactory.newInstance(); 121 XMLInputFactory xif = XMLInputFactory.newInstance();
@@ -148,21 +142,21 @@ public class BpmModelServiceImpl implements BpmModelService { @@ -148,21 +142,21 @@ public class BpmModelServiceImpl implements BpmModelService {
148 } 142 }
149 143
150 @Override 144 @Override
151 - public FileResp exportBpmnXml(String deploymentId) {  
152 -  
153 - // 查询流程定义  
154 - ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();  
155 - if (ObjectUtils.isEmpty(pd)) {  
156 - throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_PROCESS_DEFINITION_NOT_EXISTS); 145 + public FileResp exportBpmnXml(String modelId) {
  146 + try {
  147 + Model modelData = repositoryService.getModel(modelId);
  148 + if (ObjectUtils.isEmpty(modelData)) {
  149 + throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_EDITOR_SOURCE_NOT_EXISTS);
  150 + }
  151 + byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
  152 + FileResp fileResp = new FileResp();
  153 + fileResp.setFileName(String.format("%s.bpmn", Optional.ofNullable(modelData.getName()).orElse("流程图")));
  154 + fileResp.setFileByte(bytes);
  155 + return fileResp;
  156 + } catch (Exception e) {
  157 + log.info("模型部署失败!modelId = {} e = {} ", modelId, ExceptionUtils.getStackTrace(e));
  158 + throw ServiceExceptionUtil.exception(BpmErrorCodeConstants.BPMN_MODEL_ERROR);
157 } 159 }
158 - String resourceName = Optional.ofNullable(pd.getDiagramResourceName()).orElse(pd.getResourceName());  
159 - InputStream inputStream = repositoryService.getResourceAsStream(deploymentId,  
160 - resourceName);  
161 - FileResp fileResp = new FileResp();  
162 -  
163 - fileResp.setFileName(String.format("%s.bpmn", Optional.ofNullable(pd.getName()).orElse("流程图")));  
164 - fileResp.setFileByte(IoUtil.readBytes(inputStream));  
165 - return fileResp;  
166 } 160 }
167 161
168 @Override 162 @Override
yudao-admin-ui/src/api/bpm/model.js
@@ -8,3 +8,41 @@ export function page(query) { @@ -8,3 +8,41 @@ export function page(query) {
8 params: query 8 params: query
9 }) 9 })
10 } 10 }
  11 +export function exportBpmnXml(query) {
  12 + return request({
  13 + url: '/workflow/models/exportBpmnXml',
  14 + method: 'get',
  15 + params: query
  16 + })
  17 +}
  18 +
  19 +export function modelUpdate(data) {
  20 + return request({
  21 + url: '/workflow/models/update',
  22 + method: 'POST',
  23 + data: data
  24 + })
  25 +}
  26 +
  27 +export function modelSave(data) {
  28 + return request({
  29 + url: '/workflow/models/create',
  30 + method: 'POST',
  31 + data: data
  32 + })
  33 +}
  34 +
  35 +export function modelDelete(data) {
  36 + return request({
  37 + url: '/workflow/models/delete?modelId='+ data.modelId,
  38 + method: 'POST',
  39 + data: data
  40 + })
  41 +}
  42 +export function modelDeploy(data) {
  43 + return request({
  44 + url: '/workflow/models/deploy?modelId='+ data.modelId,
  45 + method: 'POST',
  46 + data: data
  47 + })
  48 +}
yudao-admin-ui/src/components/bpmn/Header.vue
@@ -2,10 +2,7 @@ @@ -2,10 +2,7 @@
2 <div> 2 <div>
3 <el-button-group> 3 <el-button-group>
4 <el-tooltip class="item" effect="dark" content="保存并发布" placement="bottom"> 4 <el-tooltip class="item" effect="dark" content="保存并发布" placement="bottom">
5 - <el-button type="primary" size="small" @click="deploy"><i class="fa fa-save"> 保存并发布</i></el-button>  
6 - </el-tooltip>  
7 - <el-tooltip class="item" effect="dark" content="保存草稿" placement="bottom">  
8 - <el-button type="primary" size="small" @click="save"><i class="fa fa-save"> 保存草稿</i></el-button> 5 + <el-button type="primary" size="small" @click="save"><i class="fa fa-save"> 保存</i></el-button>
9 </el-tooltip> 6 </el-tooltip>
10 <el-tooltip class="item" effect="dark" content="打开流程文件" placement="bottom"> 7 <el-tooltip class="item" effect="dark" content="打开流程文件" placement="bottom">
11 <el-button type="primary" size="small" @click="importXml"><i class="fa fa-folder-open"></i></el-button> 8 <el-button type="primary" size="small" @click="importXml"><i class="fa fa-folder-open"></i></el-button>
@@ -32,10 +29,13 @@ @@ -32,10 +29,13 @@
32 <el-tooltip class="item" effect="dark" content="缩小" placement="bottom"> 29 <el-tooltip class="item" effect="dark" content="缩小" placement="bottom">
33 <el-button size="small" @click="zoom(-0.05)"><i class="fa fa-search-minus"></i></el-button> 30 <el-button size="small" @click="zoom(-0.05)"><i class="fa fa-search-minus"></i></el-button>
34 </el-tooltip> 31 </el-tooltip>
35 - <el-tooltip class="item" effect="dark" content="重置" placement="bottom"> 32 + <el-tooltip class="item" effect="dark" content="重置大小" placement="bottom">
36 <el-button size="small" @click="zoom(0)"><i class="fa fa-arrows"></i></el-button> 33 <el-button size="small" @click="zoom(0)"><i class="fa fa-arrows"></i></el-button>
37 </el-tooltip> 34 </el-tooltip>
38 </el-button-group> 35 </el-button-group>
  36 +
  37 + <div class="closeClass" @click="beforeClose()"><i class="el-icon-close"></i></div>
  38 +
39 </div> 39 </div>
40 </template> 40 </template>
41 41
@@ -74,15 +74,15 @@ @@ -74,15 +74,15 @@
74 } 74 }
75 _svg = svg; 75 _svg = svg;
76 }) 76 })
77 - that.post(this.Apis.deployProcess, {  
78 - processKey: "s1111",  
79 - processName: "阿达达",  
80 - resourceName: "test01",  
81 - xml: _xml,  
82 - svg: _svg  
83 - }, function (data) {  
84 - console.log(data)  
85 - }); 77 + // that.post(this.Apis.deployProcess, {
  78 + // processKey: "s1111",
  79 + // processName: "阿达达",
  80 + // resourceName: "test01",
  81 + // xml: _xml,
  82 + // svg: _svg
  83 + // }, function (data) {
  84 + // console.log(data)
  85 + // });
86 }, 86 },
87 save(){ 87 save(){
88 let that = this; 88 let that = this;
@@ -129,11 +129,24 @@ @@ -129,11 +129,24 @@
129 let newScale = !val ? 1.0 : ((this.scale + val) <= 0.2) ? 0.2 : (this.scale + val); 129 let newScale = !val ? 1.0 : ((this.scale + val) <= 0.2) ? 0.2 : (this.scale + val);
130 this.modeler.get('canvas').zoom(newScale); 130 this.modeler.get('canvas').zoom(newScale);
131 this.scale = newScale; 131 this.scale = newScale;
  132 + },
  133 + beforeClose(val) {
  134 + this.$emit("beforeClose");
132 } 135 }
133 } 136 }
134 } 137 }
135 </script> 138 </script>
136 139
137 <style scoped> 140 <style scoped>
  141 +.closeClass{
  142 +
  143 + float: right;
  144 + width: 50px;
  145 + height: 50px;
  146 + font-size: 20px;
  147 +}
138 148
  149 +.closeClass:hover{
  150 + cursor:pointer;
  151 +}
139 </style> 152 </style>
yudao-admin-ui/src/components/bpmn/VueBpmn.vue
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 <el-row> 4 <el-row>
5 <el-col :span="24"> 5 <el-col :span="24">
6 <vue-header class="bpmn-viewer-header" :processData="initData" :modeler="bpmnModeler" @restart="restart" @importXml="importXml" 6 <vue-header class="bpmn-viewer-header" :processData="initData" :modeler="bpmnModeler" @restart="restart" @importXml="importXml"
7 - @handleExportSvg="handleExportSvg" @handleExportBpmn="handleExportBpmn" @processSave="processSave"></vue-header> 7 + @handleExportSvg="handleExportSvg" @handleExportBpmn="handleExportBpmn" @processSave="processSave" @beforeClose="beforeClose"></vue-header>
8 </el-col> 8 </el-col>
9 </el-row> 9 </el-row>
10 <el-row style="margin-left: 1%"> 10 <el-row style="margin-left: 1%">
@@ -61,6 +61,7 @@ @@ -61,6 +61,7 @@
61 }, 61 },
62 props: { 62 props: {
63 product: String, 63 product: String,
  64 + bpmnData: Object,
64 bpmnXml: { 65 bpmnXml: {
65 type: String, 66 type: String,
66 required: false 67 required: false
@@ -80,8 +81,13 @@ @@ -80,8 +81,13 @@
80 mounted() { 81 mounted() {
81 let processId = new Date().getTime(); 82 let processId = new Date().getTime();
82 this.initTemplate = templateXml.initTemplate(processId) 83 this.initTemplate = templateXml.initTemplate(processId)
83 - this.initData = {key: "process" + processId, name: "流程" + processId, xml: this.initTemplate}  
84 - if (this.bpmnXml != null) { 84 +
  85 + this.initData = {
  86 + key: this.bpmnData.key ? this.bpmnData.key : "process" + processId,
  87 + name: this.bpmnData.name ? this.bpmnData.name : "流程" + processId,
  88 + description: this.bpmnData.metaInfo ? JSON.parse(this.bpmnData.metaInfo).description : "" ,
  89 + xml: this.initTemplate}
  90 + if (this.bpmnXml != null && this.bpmnXml !== "") {
85 this.initTemplate = this.bpmnXml 91 this.initTemplate = this.bpmnXml
86 } 92 }
87 this.init(); 93 this.init();
@@ -205,14 +211,21 @@ @@ -205,14 +211,21 @@
205 }, 211 },
206 processSave(data){ 212 processSave(data){
207 let initData = this.initData; 213 let initData = this.initData;
208 - data.procId = initData.key;  
209 - data.name = initData.name;  
210 - this.$emit("processSave",data); 214 + const dataXml = this.bpmnData
  215 + dataXml.bpmnXml = this.xmlShow;
  216 + dataXml.name = initData.name;
  217 + dataXml.key = initData.key;
  218 + dataXml.description = initData.description;
  219 + this.$emit("processSave",dataXml);
211 }, 220 },
212 restart() { 221 restart() {
213 let processId = new Date().getTime(); 222 let processId = new Date().getTime();
214 this.initTemplate = templateXml.initTemplate(processId) 223 this.initTemplate = templateXml.initTemplate(processId)
215 - this.initData = {key: "process" + processId, name: "流程" + processId, xml: this.initTemplate} 224 + this.initData = {
  225 + key: this.bpmnData.key ? this.bpmnData.key : "process" + processId,
  226 + name: this.bpmnData.name ? this.bpmnData.name : "流程" + processId,
  227 + description: this.bpmnData.metaInfo ? JSON.parse(this.bpmnData.metaInfo).description : "" ,
  228 + xml: this.initTemplate}
216 this.initDiagram(this.initTemplate) 229 this.initDiagram(this.initTemplate)
217 }, 230 },
218 importXml() { 231 importXml() {
@@ -244,6 +257,9 @@ @@ -244,6 +257,9 @@
244 } 257 }
245 } 258 }
246 return moddleExtensions; 259 return moddleExtensions;
  260 + },
  261 + beforeClose() {
  262 + this.$emit("beforeClose");
247 } 263 }
248 } 264 }
249 } 265 }
yudao-admin-ui/src/views/bpm/model/index.vue
@@ -10,17 +10,18 @@ @@ -10,17 +10,18 @@
10 <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> 10 <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
11 </el-form-item> 11 </el-form-item>
12 </el-form> 12 </el-form>
13 -  
14 <el-row :gutter="10" class="mb8"> 13 <el-row :gutter="10" class="mb8">
15 <el-col :span="1.5"> 14 <el-col :span="1.5">
16 - <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"  
17 - v-hasPermi="['system:login-log:export']">导出</el-button>  
18 - <el-button type="warning" icon="el-icon-download" size="mini" @click="openBpmn"  
19 - v-hasPermi="['system:login-log:export']">新建</el-button> 15 + <el-button
  16 + type="primary"
  17 + icon="el-icon-plus"
  18 + size="mini"
  19 + @click="openBpmn"
  20 + v-hasPermi="['infra:config:create']"
  21 + >新建流程</el-button>
20 </el-col> 22 </el-col>
21 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 23 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
22 </el-row> 24 </el-row>
23 -  
24 <el-table v-loading="loading" :data="list"> 25 <el-table v-loading="loading" :data="list">
25 <el-table-column label="ID" align="center" prop="id" /> 26 <el-table-column label="ID" align="center" prop="id" />
26 <el-table-column label="name" align="center" prop="metaInfo" > 27 <el-table-column label="name" align="center" prop="metaInfo" >
@@ -33,18 +34,30 @@ @@ -33,18 +34,30 @@
33 <span>{{ JSON.parse(scope.row.metaInfo).description }}</span> 34 <span>{{ JSON.parse(scope.row.metaInfo).description }}</span>
34 </template> 35 </template>
35 </el-table-column> 36 </el-table-column>
  37 + <el-table-column label="创建时间" align="center" prop="createTime" >
  38 + <template slot-scope="scope">
  39 + <span>{{ parseTime(scope.row.createTime) }}</span>
  40 + </template>
  41 + </el-table-column>
  42 + <el-table-column label="操作" align="center" >
  43 + <template slot-scope="scope">
  44 + <el-button size="mini" type="text" icon="el-icon-setting" @click="change(scope.row)">设计流程</el-button>
  45 + <el-button size="mini" type="text" icon="el-icon-delete" @click="modelDelete(scope.row)">删除</el-button>
  46 + <el-button size="mini" type="text" icon="el-icon-thumb" @click="modelDeploy(scope.row)">发布</el-button>
  47 + </template>
  48 + </el-table-column>
36 </el-table> 49 </el-table>
37 50
38 <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" 51 <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
39 @pagination="getList"/> 52 @pagination="getList"/>
40 - <el-dialog title="新建流程" :visible.sync="showBpmnBool" :before-close="close" :fullscreen="true">  
41 - <vue-bpmn product="activiti" @processSave="processSave"></vue-bpmn> 53 + <el-dialog :visible.sync="showBpmnBool" :before-close="close" :fullscreen="true">
  54 + <vue-bpmn v-if="showBpmnBool" product="activiti" @processSave="processSave" :bpmnXml="bpmnXML" :bpmnData="bpmnData" @beforeClose="close"></vue-bpmn>
42 </el-dialog> 55 </el-dialog>
43 </div> 56 </div>
44 </template> 57 </template>
45 58
46 <script> 59 <script>
47 -import { page } from "@/api/bpm/model"; 60 +import { page, exportBpmnXml, modelUpdate, modelSave, modelDelete, modelDeploy } from "@/api/bpm/model";
48 import VueBpmn from "@/components/bpmn/VueBpmn"; 61 import VueBpmn from "@/components/bpmn/VueBpmn";
49 62
50 export default { 63 export default {
@@ -61,6 +74,7 @@ export default { @@ -61,6 +74,7 @@ export default {
61 // 表格数据 74 // 表格数据
62 list: [], 75 list: [],
63 bpmnXML: null, 76 bpmnXML: null,
  77 + bpmnData: {},
64 // 查询参数 78 // 查询参数
65 queryParams: { 79 queryParams: {
66 pageNo: 1, 80 pageNo: 1,
@@ -98,27 +112,81 @@ export default { @@ -98,27 +112,81 @@ export default {
98 this.resetForm("queryForm"); 112 this.resetForm("queryForm");
99 this.handleQuery(); 113 this.handleQuery();
100 }, 114 },
101 - /** 导出按钮操作 */  
102 - handleExport() {  
103 - const queryParams = this.queryParams;  
104 - this.$confirm('是否确认导出所有操作日志数据项?', "警告", {  
105 - confirmButtonText: "确定",  
106 - cancelButtonText: "取消",  
107 - type: "warning"  
108 - }).then(function() {  
109 - return exportLoginLog(queryParams);  
110 - }).then(response => {  
111 - this.downloadExcel(response, '登录日志.xls'); 115 + processSave(data) {
  116 + const that = this;
  117 + // 如果存在id 说明是修改
  118 + if (data.id) {
  119 + let postData = JSON.parse(data.metaInfo)
  120 + postData.bpmnXml = data.bpmnXml
  121 + postData.id = data.id
  122 + postData.name = data.name
  123 + postData.key = data.key
  124 + postData.description = data.description
  125 + modelUpdate(postData).then(response => {
  126 + this.msgSuccess("保存成功");
112 }) 127 })
113 - },  
114 - processSave() {  
115 - console.log("processSave") 128 + this.showBpmnBool = false
  129 + this.getList();
  130 + return
  131 + }
  132 + modelSave(data).then(response => {
  133 + that.bpmnData.id = response.data
  134 + this.msgSuccess("保存成功");
  135 + })
  136 +
  137 + this.showBpmnBool = false
  138 + this.getList();
116 }, 139 },
117 openBpmn() { 140 openBpmn() {
  141 + this.bpmnData = {}
  142 + this.bpmnXML = ""
118 this.showBpmnBool = true 143 this.showBpmnBool = true
119 }, 144 },
120 close() { 145 close() {
121 this.showBpmnBool = false 146 this.showBpmnBool = false
  147 + this.getList();
  148 + },
  149 + change(row) {
  150 + const that = this;
  151 + this.bpmnXML = ""
  152 + this.bpmnData = {}
  153 + exportBpmnXml({
  154 + modelId: row.id
  155 + }).then(response => {
  156 + that.bpmnXML = response
  157 + that.bpmnData = row
  158 + that.showBpmnBool = true
  159 + })
  160 + },
  161 + modelDelete(row) {
  162 + const that = this;
  163 + this.$confirm('是否删除该流程!!', "警告", {
  164 + confirmButtonText: "确定",
  165 + cancelButtonText: "取消",
  166 + type: "warning"
  167 + }).then(function() {
  168 + modelDelete({
  169 + modelId: row.id
  170 + }).then(response => {
  171 + that.getList();
  172 + that.msgSuccess("删除成功");
  173 + })
  174 + })
  175 + },
  176 + modelDeploy(row) {
  177 + const that = this;
  178 + this.$confirm('是否部署该流程!!', "提示", {
  179 + confirmButtonText: "确定",
  180 + cancelButtonText: "取消",
  181 + type: "success"
  182 + }).then(function() {
  183 + modelDeploy({
  184 + modelId: row.id
  185 + }).then(response => {
  186 + that.getList();
  187 + that.msgSuccess("部署成功");
  188 + })
  189 + })
122 } 190 }
123 } 191 }
124 }; 192 };