Commit c4950e1b135d31f6678af3e9ca6fe8a47cbf3291

Authored by YunaiV
1 parent e863b603

BPM 模型重构 1:新建流程时,只填写 name、description、key

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/BpmModelController.java
@@ -56,7 +56,7 @@ public class BpmModelController { @@ -56,7 +56,7 @@ public class BpmModelController {
56 public CommonResult<String> importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException { 56 public CommonResult<String> importModel(@Valid BpmModeImportReqVO importReqVO) throws IOException {
57 BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO); 57 BpmModelCreateReqVO createReqVO = BpmModelConvert.INSTANCE.convert(importReqVO);
58 // 读取文件 58 // 读取文件
59 - createReqVO.setBpmnXml(IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false)); 59 +// createReqVO.setBpmnXml(IoUtils.readUtf8(importReqVO.getBpmnFile().getInputStream(), false));
60 return success(bpmModelService.createModel(createReqVO)); 60 return success(bpmModelService.createModel(createReqVO));
61 } 61 }
62 62
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelCreateReqVO.java
@@ -10,12 +10,17 @@ import javax.validation.constraints.NotEmpty; @@ -10,12 +10,17 @@ import javax.validation.constraints.NotEmpty;
10 10
11 @ApiModel("流程模型的创建 Request VO") 11 @ApiModel("流程模型的创建 Request VO")
12 @Data 12 @Data
13 -@EqualsAndHashCode(callSuper = true)  
14 -@ToString(callSuper = true)  
15 -public class BpmModelCreateReqVO extends BpmModelBaseVO { 13 +public class BpmModelCreateReqVO {
16 14
17 - @ApiModelProperty(value = "BPMN XML", required = true)  
18 - @NotEmpty(message = "BPMN XML 不能为空")  
19 - private String bpmnXml; 15 + @ApiModelProperty(value = "流程标识", required = true, example = "process_yudao")
  16 + @NotEmpty(message = "流程标识不能为空")
  17 + private String key;
  18 +
  19 + @ApiModelProperty(value = "流程名称", required = true, example = "芋道")
  20 + @NotEmpty(message = "流程名称不能为空")
  21 + private String name;
  22 +
  23 + @ApiModelProperty(value = "流程描述", example = "我是描述")
  24 + private String description;
20 25
21 } 26 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelUpdateReqVO.java
@@ -18,8 +18,19 @@ public class BpmModelUpdateReqVO extends BpmModelBaseVO { @@ -18,8 +18,19 @@ public class BpmModelUpdateReqVO extends BpmModelBaseVO {
18 @NotEmpty(message = "编号不能为空") 18 @NotEmpty(message = "编号不能为空")
19 private String id; 19 private String id;
20 20
  21 + @ApiModelProperty(value = "流程名称", example = "芋道")
  22 + private String name;
  23 +
  24 + @ApiModelProperty(value = "流程描述", example = "我是描述")
  25 + private String description;
  26 +
  27 + @ApiModelProperty(value = "流程分类", notes = "参见 bpm_model_category 数据字典", example = "1")
  28 + private String category;
  29 +
  30 + @ApiModelProperty(value = "表单编号", example = "1024")
  31 + private Long formId;
  32 +
21 @ApiModelProperty(value = "BPMN XML", required = true) 33 @ApiModelProperty(value = "BPMN XML", required = true)
22 - @NotEmpty(message = "BPMN XML 不能为空")  
23 private String bpmnXml; 34 private String bpmnXml;
24 35
25 } 36 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/model/BpmModelConvert.java
@@ -95,8 +95,7 @@ public interface BpmModelConvert { @@ -95,8 +95,7 @@ public interface BpmModelConvert {
95 default void copy(Model model, BpmModelCreateReqVO bean) { 95 default void copy(Model model, BpmModelCreateReqVO bean) {
96 model.setName(bean.getName()); 96 model.setName(bean.getName());
97 model.setKey(bean.getKey()); 97 model.setKey(bean.getKey());
98 - model.setCategory(bean.getCategory());  
99 - model.setMetaInfo(JsonUtils.toJsonString(this.buildMetaInfo(bean.getDescription(), bean.getFormId()))); 98 + model.setMetaInfo(JsonUtils.toJsonString(this.buildMetaInfo(bean.getDescription(), null)));
100 } 99 }
101 100
102 default void copy(Model model, BpmModelUpdateReqVO bean) { 101 default void copy(Model model, BpmModelUpdateReqVO bean) {
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/definition/BpmModelFormTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.enums.definition;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * BPM 模型的表单类型的枚举
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum BpmModelFormTypeEnum {
  14 +
  15 + NORMAL(10, "流程表单"), // 对应 BpmFormDO
  16 + CUSTOM(20, "业务表单") // 业务自己定义的表单,自己进行数据的存储
  17 + ;
  18 +
  19 + private final Integer type;
  20 + private final String desc;
  21 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmModelMetaInfoRespDTO.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto;
2 2
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum;
3 import lombok.Data; 4 import lombok.Data;
4 5
5 /** 6 /**
@@ -16,8 +17,23 @@ public class BpmModelMetaInfoRespDTO { @@ -16,8 +17,23 @@ public class BpmModelMetaInfoRespDTO {
16 */ 17 */
17 private String description; 18 private String description;
18 /** 19 /**
  20 + * 表单类型
  21 + */
  22 + private Long formType;
  23 + /**
19 * 表单编号 24 * 表单编号
  25 + * 在表单类型为 {@link BpmModelFormTypeEnum#NORMAL} 时
20 */ 26 */
21 private Long formId; 27 private Long formId;
  28 + /**
  29 + * 自定义表单的提交路径,使用 Vue 的路由地址
  30 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时
  31 + */
  32 + private String formCustomSubmitPath;
  33 + /**
  34 + * 自定义表单的查看路径,使用 Vue 的路由地址
  35 + * 在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时
  36 + */
  37 + private String formCustomViewPath;
22 38
23 } 39 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmModelServiceImpl.java
@@ -121,15 +121,12 @@ public class BpmModelServiceImpl implements BpmModelService { @@ -121,15 +121,12 @@ public class BpmModelServiceImpl implements BpmModelService {
121 BpmModelConvert.INSTANCE.copy(model, createReqVO); 121 BpmModelConvert.INSTANCE.copy(model, createReqVO);
122 // 保存流程定义 122 // 保存流程定义
123 repositoryService.saveModel(model); 123 repositoryService.saveModel(model);
124 - // 添加 BPMN XML  
125 - repositoryService.addModelEditorSource(model.getId(), StrUtil.utf8Bytes(createReqVO.getBpmnXml()));  
126 return model.getId(); 124 return model.getId();
127 } 125 }
128 126
129 @Override 127 @Override
130 @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务 128 @Transactional(rollbackFor = Exception.class) // 因为进行多个 activiti 操作,所以开启事务
131 public void updateModel(BpmModelUpdateReqVO updateReqVO) { 129 public void updateModel(BpmModelUpdateReqVO updateReqVO) {
132 - checkKeyNCName(updateReqVO.getKey());  
133 // 校验流程模型存在 130 // 校验流程模型存在
134 Model model = repositoryService.getModel(updateReqVO.getId()); 131 Model model = repositoryService.getModel(updateReqVO.getId());
135 if (model == null) { 132 if (model == null) {
yudao-admin-server/src/main/resources/application-dev.yaml
@@ -63,12 +63,12 @@ spring: @@ -63,12 +63,12 @@ spring:
63 63
64 # 工作流 Activiti 配置 64 # 工作流 Activiti 配置
65 activiti: 65 activiti:
66 - #1.false:默认值,activiti启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常  
67 - #2.true:启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表  
68 - #3.create_drop:启动时自动创建表,关闭时自动删除表  
69 - #4.drop_create:启动时,删除旧表,再创建新表 66 + # 1. false:默认值,activiti启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常
  67 + # 2. true:启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表
  68 + # 3. create_drop:启动时自动创建表,关闭时自动删除表
  69 + # 4. drop_create:启动时,删除旧表,再创建新表
70 database-schema-update: true 70 database-schema-update: true
71 - #activiti7默认不生成历史信息表,需手动设置开启 71 + # activiti7 默认不生成历史信息表,需手动设置开启
72 db-history-used: true 72 db-history-used: true
73 check-process-definitions: true 73 check-process-definitions: true
74 #full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数 74 #full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
yudao-admin-ui/src/views/bpm/model/index.vue
@@ -109,51 +109,50 @@ @@ -109,51 +109,50 @@
109 <my-process-viewer key="designer" v-model="bpmnXML" v-bind="bpmnControlForm" /> 109 <my-process-viewer key="designer" v-model="bpmnXML" v-bind="bpmnControlForm" />
110 </el-dialog> 110 </el-dialog>
111 111
  112 + <!-- 对话框(添加) -->
  113 + <el-dialog title="新建模型" :visible.sync="open" width="500px" append-to-body>
  114 + <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  115 + <el-form-item label="流程标识" prop="key">
  116 + <el-input v-model="form.key" placeholder="请输入流标标识" style="width: 350px;" />
  117 + <el-tooltip class="item" effect="light" content="新建后,流程标识不可修改!" placement="top">
  118 + <i style="padding-left: 5px;" class="el-icon-question" />
  119 + </el-tooltip>
  120 + </el-form-item>
  121 + <el-form-item label="流程名称" prop="name">
  122 + <el-input v-model="form.name" placeholder="请输入流程名称" clearable />
  123 + </el-form-item>
  124 + <el-form-item label="流程描述" prop="description">
  125 + <el-input type="textarea" v-model="form.description" clearable />
  126 + </el-form-item>
  127 + </el-form>
  128 + <div slot="footer" class="dialog-footer">
  129 + <el-button type="primary" @click="submitForm">确 定</el-button>
  130 + <el-button @click="cancel">取 消</el-button>
  131 + </div>
  132 + </el-dialog>
  133 +
112 <!-- 用户导入对话框 --> 134 <!-- 用户导入对话框 -->
113 <el-dialog title="导入流程模型" :visible.sync="upload.open" width="400px" append-to-body> 135 <el-dialog title="导入流程模型" :visible.sync="upload.open" width="400px" append-to-body>
114 - <el-upload  
115 - ref="upload"  
116 - :limit="1"  
117 - accept=".bpmn, .xml"  
118 - :headers="upload.headers"  
119 - :action="upload.url"  
120 - :disabled="upload.isUploading"  
121 - :on-progress="handleFileUploadProgress"  
122 - :on-success="handleFileSuccess"  
123 - :auto-upload="false"  
124 - name="bpmnFile"  
125 - :data="upload.form"  
126 - drag  
127 - > 136 + <el-upload ref="upload" :limit="1" accept=".bpmn, .xml" :headers="upload.headers" :action="upload.url"
  137 + :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
  138 + :auto-upload="false" name="bpmnFile" :data="upload.form" drag>
128 <i class="el-icon-upload"></i> 139 <i class="el-icon-upload"></i>
129 <div class="el-upload__text"> 140 <div class="el-upload__text">
130 将文件拖到此处,或 141 将文件拖到此处,或
131 <em>点击上传</em> 142 <em>点击上传</em>
132 </div> 143 </div>
133 <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“bpm”或“xml”格式文件!</div> 144 <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“bpm”或“xml”格式文件!</div>
134 -  
135 - <!-- <div class="el-upload__tip" slot="tip">-->  
136 -<!-- 流程名称:<el-input v-model="upload.name"/>-->  
137 -<!-- 流程分类:<el-input v-model="upload.category"/>-->  
138 -<!-- </div>-->  
139 <div class="el-upload__tip" slot="tip"> 145 <div class="el-upload__tip" slot="tip">
140 <el-form ref="uploadForm" size="mini" label-width="90px" :model="upload.form" :rules="upload.rules" @submit.native.prevent> 146 <el-form ref="uploadForm" size="mini" label-width="90px" :model="upload.form" :rules="upload.rules" @submit.native.prevent>
141 <el-form-item label="流程标识" prop="key"> 147 <el-form-item label="流程标识" prop="key">
142 - <el-input v-model="upload.form.key" placeholder="请输入流标标识" /> 148 + <el-input v-model="upload.form.key" placeholder="请输入流标标识" style="width: 250px;" />
  149 + <el-tooltip class="item" effect="light" content="新建后,流程标识不可修改!" placement="top">
  150 + <i style="padding-left: 5px;" class="el-icon-question" />
  151 + </el-tooltip>
143 </el-form-item> 152 </el-form-item>
144 <el-form-item label="流程名称" prop="name"> 153 <el-form-item label="流程名称" prop="name">
145 <el-input v-model="upload.form.name" placeholder="请输入流程名称" clearable /> 154 <el-input v-model="upload.form.name" placeholder="请输入流程名称" clearable />
146 </el-form-item> 155 </el-form-item>
147 - <el-form-item label="流程分类" prop="category">  
148 - <el-select v-model="upload.form.category" placeholder="请选择流程分类" clearable style="width: 100%">  
149 - <el-option v-for="dict in categoryDictDatas" :key="dict.value" :label="dict.label" :value="dict.value"/>  
150 - </el-select>  
151 - </el-form-item>  
152 - <el-form-item label="流程表单" prop="formId">  
153 - <el-select v-model="upload.form.formId" placeholder="请选择流程表单,非必选哟!" clearable style="width: 100%">  
154 - <el-option v-for="form in forms" :key="form.id" :label="form.name" :value="form.id"/>  
155 - </el-select>  
156 - </el-form-item>  
157 <el-form-item label="流程描述" prop="description"> 156 <el-form-item label="流程描述" prop="description">
158 <el-input type="textarea" v-model="upload.form.description" clearable /> 157 <el-input type="textarea" v-model="upload.form.description" clearable />
159 </el-form-item> 158 </el-form-item>
@@ -169,14 +168,12 @@ @@ -169,14 +168,12 @@
169 </template> 168 </template>
170 169
171 <script> 170 <script>
172 -import {deleteModel, deployModel, getModelPage, getModel, updateModelState} from "@/api/bpm/model"; 171 +import {deleteModel, deployModel, getModelPage, getModel, updateModelState, createModel} from "@/api/bpm/model";
173 import {DICT_TYPE, getDictDatas} from "@/utils/dict"; 172 import {DICT_TYPE, getDictDatas} from "@/utils/dict";
174 import {getForm, getSimpleForms} from "@/api/bpm/form"; 173 import {getForm, getSimpleForms} from "@/api/bpm/form";
175 import {decodeFields} from "@/utils/formGenerator"; 174 import {decodeFields} from "@/utils/formGenerator";
176 import Parser from '@/components/parser/Parser' 175 import Parser from '@/components/parser/Parser'
177 -import {getToken} from "@/utils/auth";  
178 import {getBaseHeader} from "@/utils/request"; 176 import {getBaseHeader} from "@/utils/request";
179 -import {addUser, updateUser} from "@/api/system/user";  
180 177
181 export default { 178 export default {
182 name: "model", 179 name: "model",
@@ -212,6 +209,15 @@ export default { @@ -212,6 +209,15 @@ export default {
212 fields: [] 209 fields: []
213 }, 210 },
214 211
  212 + // 流程表单
  213 + open: false,
  214 + form: {},
  215 + // 表单校验
  216 + rules: {
  217 + key: [{ required: true, message: "流程标识不能为空", trigger: "blur" }],
  218 + name: [{ required: true, message: "流程名称不能为空", trigger: "blur" }],
  219 + },
  220 +
215 // 流程导入参数 221 // 流程导入参数
216 upload: { 222 upload: {
217 // 是否显示弹出层(用户导入) 223 // 是否显示弹出层(用户导入)
@@ -228,7 +234,6 @@ export default { @@ -228,7 +234,6 @@ export default {
228 rules: { 234 rules: {
229 key: [{ required: true, message: "流程标识不能为空", trigger: "blur" }], 235 key: [{ required: true, message: "流程标识不能为空", trigger: "blur" }],
230 name: [{ required: true, message: "流程名称不能为空", trigger: "blur" }], 236 name: [{ required: true, message: "流程名称不能为空", trigger: "blur" }],
231 - category: [{ required: true, message: "流程分类不能为空", trigger: "blur" }],  
232 }, 237 },
233 }, 238 },
234 // 流程表单的下拉框的数据 239 // 流程表单的下拉框的数据
@@ -256,10 +261,19 @@ export default { @@ -256,10 +261,19 @@ export default {
256 } 261 }
257 ); 262 );
258 }, 263 },
  264 + /** 取消按钮 */
  265 + cancel() {
  266 + this.open = false;
  267 + this.reset();
  268 + },
259 // 表单重置 269 // 表单重置
260 reset() { 270 reset() {
261 - this.bpmnData = {}  
262 - this.bpmnXML = "" 271 + this.form = {
  272 + key: undefined,
  273 + name: undefined,
  274 + description: undefined
  275 + };
  276 + this.resetForm("form");
263 }, 277 },
264 /** 搜索按钮操作 */ 278 /** 搜索按钮操作 */
265 handleQuery() { 279 handleQuery() {
@@ -274,9 +288,8 @@ export default { @@ -274,9 +288,8 @@ export default {
274 }, 288 },
275 /** 新增按钮操作 */ 289 /** 新增按钮操作 */
276 handleAdd() { 290 handleAdd() {
277 - this.$router.push({  
278 - path:"/bpm/manager/model/edit"  
279 - }); 291 + this.reset();
  292 + this.open = true;
280 }, 293 },
281 /** 修改按钮操作 */ 294 /** 修改按钮操作 */
282 handleUpdate(row) { 295 handleUpdate(row) {
@@ -287,6 +300,19 @@ export default { @@ -287,6 +300,19 @@ export default {
287 } 300 }
288 }); 301 });
289 }, 302 },
  303 + /** 提交按钮 */
  304 + submitForm() {
  305 + this.$refs["form"].validate(valid => {
  306 + if (!valid) {
  307 + return;
  308 + }
  309 + createModel(this.form).then(response => {
  310 + this.msgSuccess("新增成功");
  311 + this.open = false;
  312 + this.getList();
  313 + });
  314 + });
  315 + },
290 /** 删除按钮操作 */ 316 /** 删除按钮操作 */
291 handleDelete(row) { 317 handleDelete(row) {
292 const that = this; 318 const that = this;