boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续) ...

打印 上一主题 下一主题

主题 862|帖子 862|积分 2588

boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续)
书接上回
项目源码仓库github
项目源码仓库gitee
boot-admin 是一款采用前后端分离模式、基于SpringCloud微服务架构的SaaS后台管理框架。系统内置基础管理、权限管理、运行管理、定义管理、代码生成器和办公管理6个功能模块,集成分布式事务Seata、工作流引擎Flowable、业务规则引擎Drools、后台作业调度框架Quartz等,技术栈包括Mybatis-plus、Redis、Nacos、Seata、Flowable、Drools、Quartz、SpringCloud、Springboot Admin Gateway、Liquibase、jwt、Openfeign、I18n等。
在上一篇博文中,已经介绍了 boot-admin 对 editor-app 前端代码的集成改造,接下来我们看看后端代码。
提供汉化资源json数据
  1.    /**
  2.      * 获取汉化资源
  3.      * @return
  4.      */
  5.     @RequestMapping(value = "/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
  6.     public String getStencilset() {
  7.         InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");
  8.         try {
  9.             return IOUtils.toString(stencilsetStream, "utf-8");
  10.         } catch (Exception e) {
  11.             throw new FlowableException("Error while loading stencil set", e);
  12.         }
  13.     }
复制代码
资源包stencilset.json需放在resources文夹下,这里提供下载:点击下载汉化包
分页获取模型列表

controller:
  1. @RequestMapping("/api/workflow/auth/activiti")
  2. @RestController
  3. @Slf4j
  4. public class ModelController extends BaseController {
  5.     @Resource
  6.     private FormValidator formValidator;
  7.     @Autowired
  8.     private MyModelService modelService;
  9.     @PostMapping("/model/page")
  10.     @ApiOperation("分页获取项目数据表列表")
  11.     public ResultDTO getTablePage(@Valid @RequestBody ModelQueryVO queryVO, BindingResult bindingResult) throws Exception {
  12.         if (bindingResult.hasErrors()) {
  13.             return formValidator.generateMessage(bindingResult);
  14.         }
  15.         return modelService.getPage(queryVO);
  16.     }
  17. }   
复制代码
service:
  1.     @Override
  2.     public ResultDTO getPage(ModelQueryVO queryVO) throws Exception {
  3.         int offset = (queryVO.getCurrentPage() - 1) * queryVO.getPageSize() + 0;
  4.         List<Model> list = repositoryService.createModelQuery().listPage(offset
  5.                 , queryVO.getPageSize());
  6.         int total = (int) repositoryService.createModelQuery().count();
  7.         Page<Model> page = new Page<>();
  8.         page.setRecords(list);
  9.         page.setTotal(total);
  10.         return ResultDTO.success(page);
  11.     }
复制代码
读取模型数据

controller:
  1. @RequestMapping("/api/workflow/auth/activiti")
  2. @RestController
  3. @Slf4j
  4. public class ModelController extends BaseController {
  5.     @Autowired
  6.     private RepositoryService repositoryService;
  7.     @Autowired
  8.     private ObjectMapper objectMapper;
  9.     /**
  10.      * 获取用于编辑的模型JSON数据
  11.      * @param modelId 模型ID
  12.      * @return
  13.      */
  14.     @GetMapping(value = "/model/json")
  15.     public ObjectNode getEditorJson(@RequestParam("modelId") String modelId) {
  16.         ObjectNode modelNode = null;
  17.         Model model = repositoryService.getModel(modelId);
  18.         if (model != null) {
  19.             try {
  20.                 if (StringUtils.isNotEmpty(model.getMetaInfo())) {
  21.                     modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
  22.                 } else {
  23.                     modelNode = objectMapper.createObjectNode();
  24.                     modelNode.put(MODEL_NAME, model.getName());
  25.                 }
  26.                 modelNode.put(MODEL_ID, model.getId());
  27.                 ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
  28.                         new String(repositoryService.getModelEditorSource(model.getId()), "utf-8"));
  29.                 modelNode.put("model", editorJsonNode);
  30.             } catch (Exception e) {
  31.                 log.error("Error creating model JSON", e);
  32.                 throw new FlowableException("Error creating model JSON", e);
  33.             }
  34.         }
  35.         return modelNode;
  36.     }
  37. }   
复制代码
增加新模型

controller:
  1. @RequestMapping("/api/workflow/auth/activiti")
  2. @RestController
  3. @Slf4j
  4. public class ModelController extends BaseController {
  5.     @Resource
  6.     private FormValidator formValidator;
  7.     @Autowired
  8.     private MyModelService modelService;
  9.    
  10.     @PostMapping("/model/add")
  11.     @ApiOperation("保存数据")
  12.     public ResultDTO save(@Valid @RequestBody ModelDataVO dataVO, BindingResult bindingResult) throws Exception {
  13.         if (bindingResult.hasErrors()) {
  14.             return formValidator.generateMessage(bindingResult);
  15.         }
  16.         BaseUser baseUser = UserTool.getBaseUser();
  17.         return modelService.addNewModel(dataVO, baseUser);
  18.     }
  19. }
复制代码
service:
  1.     @Override
  2.     public ResultDTO addNewModel(ModelDataVO dataVO, BaseUser baseUser) throws Exception {
  3.         //初始化一个空模型
  4.         Model model = repositoryService.newModel();
  5.         //设置一些默认信息
  6.         String name = dataVO.getName();
  7.         String description = dataVO.getDescription();
  8.         int revision = 1;
  9.         String key = dataVO.getKey();
  10.         ObjectNode modelNode = objectMapper.createObjectNode();
  11.         modelNode.put(MODEL_NAME, name);
  12.         modelNode.put(MODEL_DESCRIPTION, description);
  13.         modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);
  14.         model.setName(name);
  15.         model.setKey(key);
  16.         model.setMetaInfo(modelNode.toString());
  17.         repositoryService.saveModel(model);
  18.         String id = model.getId();
  19.         //完善ModelEditorSource
  20.         ObjectNode editorNode = objectMapper.createObjectNode();
  21.         editorNode.put("id", "canvas");
  22.         editorNode.put("resourceId", "canvas");
  23.         ObjectNode stencilSetNode = objectMapper.createObjectNode();
  24.         stencilSetNode.put("namespace",
  25.                 "http://b3mn.org/stencilset/bpmn2.0#");
  26.         editorNode.put("stencilset", stencilSetNode);
  27.         repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8"));
  28.         return ResultDTO.success(id);
  29.     }
复制代码
保存模型数据
  1.     /**
  2.      * 保存模型数据
  3.      * @param modelId
  4.      * @param name
  5.      * @param description
  6.      * @param json_xml
  7.      * @param svg_xml
  8.      */
  9.     @RequestMapping(value = "/model/save", method = RequestMethod.PUT)
  10.     @ResponseStatus(value = HttpStatus.OK)
  11.     public void saveModel(@RequestParam("modelId") String modelId
  12.             , String name, String description
  13.             , String json_xml, String svg_xml) {
  14.         try {
  15.             Model model = repositoryService.getModel(modelId);
  16.             ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
  17.             modelJson.put(MODEL_NAME, name);
  18.             modelJson.put(MODEL_DESCRIPTION, description);
  19.             model.setMetaInfo(modelJson.toString());
  20.             model.setName(name);
  21.             repositoryService.saveModel(model);
  22.             repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));
  23.             InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
  24.             TranscoderInput input = new TranscoderInput(svgStream);
  25.             PNGTranscoder transcoder = new PNGTranscoder();
  26.             // Setup output
  27.             ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  28.             TranscoderOutput output = new TranscoderOutput(outStream);
  29.             // Do the transformation
  30.             transcoder.transcode(input, output);
  31.             final byte[] result = outStream.toByteArray();
  32.             repositoryService.addModelEditorSourceExtra(model.getId(), result);
  33.             outStream.close();
  34.         } catch (Exception e) {
  35.             log.error("Error saving model", e);
  36.             throw new FlowableException("Error saving model", e);
  37.         }
  38.     }
复制代码
删除模型

controller:
  1. @RequestMapping("/api/workflow/auth/activiti")
  2. @RestController
  3. @Slf4j
  4. public class ModelController extends BaseController {
  5.     @Resource
  6.     private FormValidator formValidator;
  7.     @Autowired
  8.     private MyModelService modelService;
  9.    
  10.     @PostMapping("/model/del")
  11.     @ApiOperation("删除数据")
  12.     public ResultDTO del(@Valid @RequestBody GuidContainerVO guidContainerVO, BindingResult bindingResult) throws Exception {
  13.         if (bindingResult.hasErrors()) {
  14.             return formValidator.generateMessage(bindingResult);
  15.         }
  16.         return modelService.delete(guidContainerVO.getGuid());
  17.     }   
  18. }
复制代码
service:
  1.     @Override
  2.     public ResultDTO delete(String guid) throws Exception {
  3.         repositoryService.deleteModel(guid);
  4.         return ResultDTO.success();
  5.     }
复制代码
发布(部署)模型
  1. @RequestMapping("/api/workflow/auth/activiti")
  2. @RestController
  3. @Slf4j
  4. public class ModelController extends BaseController {
  5.     @Resource
  6.     private FormValidator formValidator;
  7.     @Autowired
  8.     private MyModelService modelService;
  9.    
  10.     @PostMapping("/model/deploy")
  11.     public ResultDTO deploy(@Valid @RequestBody GuidContainerVO guidContainerVO, BindingResult bindingResult) throws Exception {
  12.         if (bindingResult.hasErrors()) {
  13.             return formValidator.generateMessage(bindingResult);
  14.         }
  15.         return modelService.deploy(guidContainerVO.getGuid());
  16.     }
  17. }   
复制代码
service:
  1.     @Override
  2.     public ResultDTO deploy(String guid) throws Exception {
  3.         /**获取模型 **/
  4.         Model modelData = repositoryService.getModel(guid);
  5.         byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
  6.         if (bytes == null) {
  7.             return ResultDTO.failureCustom("模型数据为空,请先设计流程并成功保存,再进行发布。");
  8.         }
  9.         JsonNode modelNode = new ObjectMapper().readTree(bytes);
  10.         BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
  11.         if (model.getProcesses().size() == 0) {
  12.             return ResultDTO.failureCustom("数据模型不符要求,请至少设计一条主线流程。");
  13.         }
  14.         /** 设置名称 **/
  15.         if(StringUtils.isNotBlank(modelData.getCategory())) {
  16.             model.setTargetNamespace(modelData.getCategory());
  17.         }
  18.         byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
  19.         /** 发布流程 .bpmn20.xml必需加 **/
  20.         String processName = modelData.getName() + ".bpmn20.xml";
  21.         Deployment deployment = repositoryService.createDeployment()
  22.                 .name(modelData.getName())
  23.                 .category(modelData.getCategory())
  24.                 .key(modelData.getKey())
  25.                 .addString(processName, new String(bpmnBytes, "UTF-8"))
  26.                 .deploy();
  27.         modelData.setDeploymentId(deployment.getId());
  28.         repositoryService.saveModel(modelData);
  29.         return ResultDTO.success();
  30.     }
复制代码
总结:经过集成改造,boot-admin与flowable editor-app模型设计器实现紧密整合,不但实现了BPMN流程编辑、修改、发布等功能,还实现前端 携带jwt按权限访问后端资源。
boot-admin 集成 flowable editor-app 运行效果如下图所示:

项目源码仓库github
项目源码仓库gitee

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表