• Springboot整合Flowable6.x导出bpmn20


    项目源码仓库

    BPMN2.0(Business Process Model and Notation)是一套业务流程模型与符号建模标准,以XML为载体,以符号可视化业务,支持精准的执行语义来描述元素的操作。
    Flowable诞生于Activiti,是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义,可以十分灵活地加入你的应用/服务/构架。

    本文给出两种从flowable导出流程定义bpmn20.xml的方式。

    导入Maven依赖

            <dependency>
                <groupId>org.flowablegroupId>
                <artifactId>flowable-spring-boot-starter-basicartifactId>
                <version>6.4.1version>
            dependency>
            <dependency>
                <groupId>org.flowablegroupId>
                <artifactId>flowable-json-converterartifactId>
                <version>6.4.1version>
            dependency>
    

    从流程模型导出流程定义bpmn20.xml

    通过流程编辑器制作的流程模型(如下图所示), 可以通过模型ID(Model.id),调用flowable 的 RepositoryService 来生成bpmn20.xml。

    @Service
    public class MyModelServiceImpl implements MyModelService {
        @Autowired
        private RepositoryService repositoryService;
    
        /**
         * 通过模型ID,生成模型BPMN20.xml
         * @param guid 模型id,即model.id
         * @return
         * @throws Exception
         */
        @Override
        public ResultDTO genXml(String guid) throws Exception {
            /**通过ID获取模型 **/
            Model modelData = repositoryService.getModel(guid);
            byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
            if (bytes == null) {
                return ResultDTO.failureCustom("模型数据为空,请先设计流程并成功保存,再进行发布。");
            }
            JsonNode modelNode = new ObjectMapper().readTree(bytes);
            BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
            if (model.getProcesses().size() == 0) {
                return ResultDTO.failureCustom("数据模型不符要求,请至少设计一条主线流程。");
            }
            /** 设置名称 **/
            model.getMainProcess().setName(modelData.getName());
            /** 设置 targetNamespace **/
            if(StringUtils.isNotBlank(modelData.getCategory())) {
                model.setTargetNamespace(modelData.getCategory());
            }
            byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
            String xml = new String(bpmnBytes, "UTF-8");
            return ResultDTO.success(xml);
        }
    }
    

    运行效果如下:
    {% asset_img res1.gif 导出效果 %}

    从流程定义导出流程定义bpmn20.xml

    对于flowable已经部署的流程,可根据流程定义(ProcessDefinition.id),调用flowable 的RepositoryService来导出其bpmn20.xml。

    @RestController
    @Slf4j
    public class ProcessController {
        @Autowired
        private MyProcessService processService;
        
        /**
         * 通过processDefinition.id和resType导出流程XML或图片资源
         * @param id processDefinition.id
         * @param resType 取值 “image/png”或“text/xml”
         * @param response
         * @throws Exception
         */
        @GetMapping(value = "/res/exp")
        @ApiOperation("通过processDefinition.id和resType导出流程XML或图片资源")
        public void resourceRead(@RequestParam("id") String id,@RequestParam("resType") String resType, HttpServletResponse response) throws Exception {
            /** resType取值 “image/png”或“text/xml” **/
            InputStream resourceAsStream = processService.resourceRead(id,resType);
            byte[] b = new byte[1024];
            int len = -1;
            while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
                response.getOutputStream().write(b, 0, len);
            }
        }
    }
    
    
    @Service
    public class MyProcessServiceImpl implements MyProcessService {
        @Autowired
        private RepositoryService repositoryService;
        
        @Override
        public InputStream resourceRead(String id, String resType) throws Exception {
            ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult();
            String resourceName = "";
            if (resType.equals("image/png")) {
                resourceName = processDefinition.getDiagramResourceName();
            } else if (resType.equals("text/xml")) {
                resourceName = processDefinition.getResourceName();
            }
            InputStream resourceAsStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName);
            return resourceAsStream;
        }
    }
    

    运行效果如下:

    项目源码仓库

  • 相关阅读:
    按键精灵中的UI界面操作
    C语言——自定义类型之枚举
    车间ERP管理系统都有哪些?能带给企业什么好处
    OAuth2.0
    【玩转CSS】盒子模型
    c刷题(四)
    Lua-http库写一个爬虫程序怎么样 ?
    Visual Studio Code:Fortran
    『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件
    新机Word/PowerPoint新建空白文档后闪退问题
  • 原文地址:https://www.cnblogs.com/soft1314/p/17331429.html