更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
上一节把数据库与相关基础数据字典准备好,下面就来实现相应的功能,目前先针对自定义业务表单的规则。
1、前端部分
在流程模型的列表里增加配置,如下图
相应前端代码如下:
<el-button type="text" size="mini" icon="el-icon-setting" v-hasPermi="['workflow:model:config']" @click.native="handleConfig(scope.row)" >配置</el-button>
下面的组件可以通过生成的流程配置代码修改,具体下一节再说。
<el-dialog :title="flowConfigData.title" :visible.sync="flowConfigOpen" append-to-body fullscreen> <flow-config :key="flowConfigOpen" style="border:1px solid rgba(0, 0, 0, 0.1);" ref="flowConfig" v-loading="flowConfigData.loading" :flowConfigData="flowConfigData" /> </el-dialog>
/** 配置流程 */ handleConfig(row) { this.loading = true; console.log("row=",row); getAppType(row.category).then(res => { console.log("res=",res); configModel(row.modelId,res.data[0].id).then(response => { this.$modal.msgSuccess(response.msg); this.flowConfigOpen = true; this.flowConfigData.modelId = row.modelId; console.log("response=",response); }).finally(() => { this.loading = false; }) }).finally(() => { this.loading = false; }) },
2、后端接口
@Override @Transactional(rollbackFor = Exception.class) public String configModel(String modelId, String appType) { // 获取流程模型 Model model = repositoryService.getModel(modelId); if (ObjectUtil.isNull(model)) { throw new RuntimeException("流程模型不存在!"); } // 获取流程图 byte[] bpmnBytes = repositoryService.getModelEditorSource(modelId); if (ArrayUtil.isEmpty(bpmnBytes)) { throw new RuntimeException("请先设计流程图!"); } String bpmnXml = StringUtils.toEncodedString(bpmnBytes, StandardCharsets.UTF_8); BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml); String processName = model.getName(); Process process = bpmnModel.getMainProcess(); Collection<FlowElement> flowElements = process.getFlowElements(); for (FlowElement flowElement : flowElements) { WfFlowConfigBo flowConfigBo = new WfFlowConfigBo(); if (flowElement instanceof StartEvent) { StartEvent startEvent = (StartEvent)flowElement; WfFlowConfigVo flowConfigVo = new WfFlowConfigVo(); flowConfigVo.setModelId(modelId); flowConfigVo.setNodeKey(startEvent.getId()); if(ObjectUtils.isEmpty(flowConfigService.selectByModelIdAndNodeKey(flowConfigVo))) { flowConfigBo.setModelId(modelId); flowConfigBo.setAppType(appType); flowConfigBo.setFormKey(startEvent.getFormKey()); flowConfigBo.setNodeName(startEvent.getName()); flowConfigBo.setNodeKey(startEvent.getId()); flowConfigService.insertByBo(flowConfigBo); } else { flowConfigVo.setAppType(appType); flowConfigVo.setFormKey(startEvent.getFormKey()); flowConfigVo.setNodeName(startEvent.getName()); flowConfigService.updateFlowConfig(flowConfigVo); } } if (flowElement instanceof UserTask) { UserTask userTask = (UserTask)flowElement; WfFlowConfigVo flowConfigVo = new WfFlowConfigVo(); flowConfigVo.setModelId(modelId); flowConfigVo.setNodeKey(userTask.getId()); if(ObjectUtils.isEmpty(flowConfigService.selectByModelIdAndNodeKey(flowConfigVo))) { flowConfigBo.setModelId(modelId); flowConfigBo.setAppType(appType); flowConfigBo.setFormKey(userTask.getFormKey()); flowConfigBo.setNodeName(userTask.getName()); flowConfigBo.setNodeKey(userTask.getId()); flowConfigService.insertByBo(flowConfigBo); } else { flowConfigVo.setAppType(appType); flowConfigVo.setFormKey(userTask.getFormKey()); flowConfigVo.setNodeName(userTask.getName()); flowConfigService.updateFlowConfig(flowConfigVo); } } } return modelId; }
3、相应界面如下: