• springboot中实现查看flowable流程图和xml文件功能


    • flowable中提供了查看流程图和xml文件的API,只需要一行代码就可以搞定获取到InputStream流,先来看下核心代码也就是flowable官方提供的API
    
      InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream("流程定义ID", "要查看的流程图或xml文件名称");
      
    
    • 1
    • 2
    • 3
    流程定义ID:

    查询时用到的 流程定义ID 指的是 act_re_deployment 表中的 ID_ 字段。

    在这里插入图片描述

    流程图或xml文件名:

    查询时用到的 流程图或xml文件名 指的是 act_re_procdef 表中的 RESOURCE_NAME_ 字段。
    PS 可以发现 act_re_deployment 中的 ID 和 act_re_procdef 中的 DEPLOYMENT_ID_ 是关联一致的

    在这里插入图片描述

    • 实现查看流程图和xml文件功能主要就是依靠上面的一行代码完成的。也可以根据自己的业务逻辑去增加其他处理,接下来介绍下在springboot中编写该功能接口。

    pom依赖:

    详细介绍springboot整合flowable引擎的可以查看这里

    			<dependency>
                    <groupId>org.flowable</groupId>
                    <artifactId>flowable-spring-boot-starter</artifactId>
                    <version>6.3.0</version>
                </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    基础功能接口:

    实现根据数据获取对应的文件流并写入本地存储功能

    
    	@Autowired
        private ProcessEngine processEngine; //注入flowable提供的ProcessEngine,包含了查看流程图和xml功能
    
    	 /**
        * @Author: ljh
        * @Description: 查看流程图或xml
        * @DateTime: 10:41 2022/9/17
        * @Params:  flowId流程ID
         * photoName 流程图名称或者xml文件名称
        * @Return 
        */
        public void loadFlowXml(String flowId,String photoName){
            //根据ID和名称获取到流
            InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream(flowId, photoName);
            try {
                //将流写出到本地磁盘存储
                FileUtils.copyInputStreamToFile(resourceAsStream, new File("D://1.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    结合应用功能接口:

    实现根据前端页面送的数据拼接出来流程图的本地存储路径,然后判断该流程图是否存在本地,如果存在就直接将该文件路径映射为url返回给前端,如果不存在就使用flowable提供的api重新获取,接着依然存储在本地后再将路径映射为url返回前端(方便后面再获取该图片时直接从本地读取即可,不需要每次都使用flowable的api)

    
    	// 本地磁盘D://
    	@Value("${bpmn.path:{null}}") 
        private String bpmnPath;
    	@Autowired
        private ProcessEngine processEngine; //注入flowable提供的ProcessEngine,包含了查看流程图和xml功能
    
    	@ApiOperation("查看流程图")
        @PostMapping("/loadFlowPhoto")
        public Result loadFlowPhoto(@RequestBody Flow flow){ //自己封装的请求参数实体类
            Result result = new Result();
            String photoUrlByFileName = null;
            try {
            	//流程图名称
                String pngName = null;
                if(flow.getFlowPhotoName().contains("/")){
                    pngName = flow.getFlowPhotoName().substring(flow.getFlowPhotoName().indexOf("/")+1,flow.getFlowPhotoName().length());
                }else{
                    pngName = flow.getFlowPhotoName().substring(flow.getFlowPhotoName().indexOf("\\")+1,flow.getFlowPhotoName().length());
                }
                //pngPath 本地存储流程图的路径  bpmnPath是在yml中配置的路径 D://  pngName是上面切割出来的流程图名称
                String pngPath = bpmnPath+pngName; 
                //判断是否已存在
                File file = new File(pngPath);
                if(file.exists()){
                    //存在
                    //getPhotoUrlByFileName 方法是我自己封装的获取图片url地址的方法
                    photoUrlByFileName = photoUtils.getPhotoUrlByFileName(pngName);
                }else{
                    //不存在
                    InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream(flow.getFlowId(), flow.getFlowPhotoName());
                    //写入本地
                    FileUtils.copyInputStreamToFile(resourceAsStream, new File(pngPath));
                    //getPhotoUrlByFileName 方法是我自己封装的获取图片url地址的方法
                    photoUrlByFileName = photoUtils.getPhotoUrlByFileName(pngName);
                }
                //result是自己封装的数据结构 
                result.setStatus(200);
                //将路程图的url地址返回 供前端页面使用
                result.setData(photoUrlByFileName);
                result.setMessage("获取成功");
            } catch (IOException e) {
                e.printStackTrace();
                result.setStatus(500);
                result.setMessage("获取失败");
            }
            return result;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    使用到的工具类

    
    	//在yml文件中配置好的端口好 
    	@Value("${server.port:{null}}")
        private String port;
    
    /**
         * @Author: ljh
         * @Description: 映射本地图片地址
         * @DateTime: 11:25 2022/7/19
         * @Params:
         * @Return
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            /**
             * 访问路径:http://localhost:8086/image/2022001.png
             * "/image/**" 为前端URL访问路径
             * "file:" + bmpPath 是本地磁盘映射
             */
            registry.addResourceHandler("/image/**").addResourceLocations("file:" + bpmnPath);
        }
    
    
    /**
         * @Author: ljh
         * @Description: 获取图片url地址
         * @DateTime: 16:30 2022/7/21
         * @Params: 图片名称
         * @Return 图片url地址
         */
        public String getPhotoUrlByFileName(String name){
            String hostAddress = null;
            //获取本地IP地址
            try {
                hostAddress = InetAddress.getLocalHost().getHostAddress();
            } catch (UnknownHostException e) {
                return null;
            }
            String photoUrl = null;
            if(name.contains(".png")){
                photoUrl = "http://"+hostAddress+":"+port+"/api/image/"+name;
            }else{
                photoUrl = "http://"+hostAddress+":"+port+"/api/image/"+name+".png";
            }
    
            return photoUrl;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    清洁、对话、带娃,扫地机摆脱“人工智障”标签
    PPT文字很多的排版,PPT图片很多的排版,PPT图文排版
    C/C++特殊求和 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
    JVM核心知识体系
    【C#项目实战】控制台游戏勇士斗恶龙(1)——游戏初始设置以及开始界面
    .Net Core/.net 6/.Net 8 实现Mqtt服务器
    SpringBoot与Loki的那些事
    lua环境搭建数据类型
    8应用服务与领域服务
    redis过期事件监听
  • 原文地址:https://blog.csdn.net/weixin_45151960/article/details/126901971