首页
搜索 搜索
聚焦

天天快讯:Springboot整合Flowable6.x导出bpmn20

2023-04-19 01:14:17 博客园


(资料图片)

项目源码仓库

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

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

导入Maven依赖
            org.flowable            flowable-spring-boot-starter-basic            6.4.1                            org.flowable            flowable-json-converter            6.4.1        
从流程模型导出流程定义bpmn20.xml

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

@Servicepublic 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@Slf4jpublic 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);        }    }}
@Servicepublic 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;    }}

运行效果如下:

项目源码仓库