接上一篇:
第12篇:Flowable-BPMN操作流程之用户任务UserTask
https://blog.csdn.net/weixin_40816738/article/details/102902596
文章目录
- 一、背景
- 二、原理
- 三、实现方案
- 3.1. 流程是否完成功能
- 3.2. 完成流程图
- 3.3. 控制器入口
- 四、验证测试
- 4.1. 创建流程
- 4.2. 启动流程
- 4.3. 调用查看流程接口
一、背景
流程启动后,为了方便我们查看流程的进展,Flowable提供了流程图可以直观的查看流程的进展,本节我们主要研究流程图呈现的相关内容,可以直接显示流程的进展。
二、原理
- 流程的一些进展是活动Activity和连线组成的,我们如果能够找到流程经过了哪些节点,给节点画上边框的话就可以直观的看到流程的进展信息。
三、实现方案
- Flowable的HistoryService提供了历史的查询服务,可以查询经过了哪些节点,进程的流程生成器ProcessDiagramGenerator,可以动态生成各种流程图,最后我们使用HttpServletResponse返回一个图像以供显示。
3.1. 流程是否完成功能
- 流程完后使用历史服务查询,流程未结束使用运行时服务查询,所以我们先提供一个流程是否完成的API,如下:
@Overridepublic boolean isFinished(String processInstanceId) {return historyService.createHistoricProcessInstanceQuery().finished().processInstanceId(processInstanceId).count() > 0;}
3.2. 完成流程图
- 流程通过使用ProcessDiagramGenerator完成流程图显示,具体实现如下:
@Overridepublic void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) {/*** 获得当前活动的节点*/String processDefinitionId = "";if (this.isFinished(processId)) {// 如果流程已经结束,则得到结束节点HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processId).singleResult();processDefinitionId=pi.getProcessDefinitionId();} else {// 如果流程没有结束,则取当前活动节点// 根据流程实例ID获得当前处于活动状态的ActivityId合集ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();processDefinitionId=pi.getProcessDefinitionId();}List<String> highLightedActivitis = new ArrayList<String>();/*** 获得活动的节点*/List<HistoricActivityInstance> highLightedActivitList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processId).orderByHistoricActivityInstanceStartTime().asc().list();for(HistoricActivityInstance tempActivity : highLightedActivitList){String activityId = tempActivity.getActivityId();highLightedActivitis.add(activityId);}List<String> flows = new ArrayList<>();//获取流程图BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();InputStream in = diagramGenerator.generateDiagram(bpmnModel, "bmp", highLightedActivitis, flows, engconf.getActivityFontName(),engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0, true);OutputStream out = null;byte[] buf = new byte[1024];int legth = 0;try {out = httpServletResponse.getOutputStream();while ((legth = in.read(buf)) != -1) {out.write(buf, 0, legth);}} catch (IOException e) {log.error("操作异常",e);} finally {IOUtils.closeQuietly(out);IOUtils.closeQuietly(in);}}
3.3. 控制器入口
@RequestMapping(value = "processDiagram")public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception {flowService.genProcessDiagram(httpServletResponse,processId);}
四、验证测试
4.1. 创建流程
http://localhost:8989/flow/create
4.2. 启动流程
流程启动链接:http://localhost:8989/flow/start?processKey=test_bpmn,
如下图所示:
4.3. 调用查看流程接口
http://localhost:8989/flow/processDiagram?processId=8d3fec54-ffb9-11e9-b9a1-f8a2d6bfea5a
,其中ProcessId为上图中显示的内容,最终结果如下图所示:
项目源码地址:
https://gitlab.com/gb-heima/flowablestudy/tree/master/flowablelech13
码云地址:https://gitee.com/gb_90/flowable-study/tree/master/flowablelech13
下一篇:
第14篇:Flowable-BPMN操作流程之任务完成
https://blog.csdn.net/weixin_40816738/article/details/102902647