天天看点

Activiti流程图乱码

1、直接部署流程文件

    这种方式部署后引擎会自动生成流程图,存在的问题:在Activiti Designer里面设计与自动生成的流程图 坐标不一致 ,还有 中文乱码 问题(可以通过添加字体解决)和 Flow上文字不显示 或者坐标错位等问题。   解决乱码问题可以在引擎配置中添加:

  1. <property name="activityFontName" value="宋体"/>
  2. <property name="labelFontName" value="宋体"/>

复制代码 获取图片的代码如下(完整代码在kft-activiti-demo项目的ActivitiController.java中)

  1. InputStream imageStream = ProcessDiagramGenerator.generateDiagram(bpmnModel, "png");

复制代码 2、一劳永逸的部署方式——Zip

    一般开发人员设计流程会选择使用Activiti Designer,这个插件会在设计流程时自动创建PNG格式的图片,图片中的组件坐标与bpmn文件里面的坐标一致,部署时可以 把bpmn文件和png图片文件打包成Zip文件部署 ,这种方式引擎 不会自动生成流程图 ,因为zip包里面存在了同名的图片文件。

    所以推荐大家选择这种方式部署,一劳永逸,没有坐标错位问题,流程跟踪也方便。

    读取流程图的代码:

  1. String resourceName = processDefinition.getDiagramResourceName();
  2. resourceAsStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName);
  3. byte[] b = new byte[1024];
  4. int len = -1;
  5. while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
  6.     response.getOutputStream().write(b, 0, len);
  7. }

复制代码 ----------------   流程跟踪  ----------------

与部署方式对应的流程跟踪方式也有集中,在kft-activiti-demo中分别对三种方式做了演示(demo里面有三个按钮可以切换不同的跟踪方式)。

1、通过引擎生成png图片,并标记当前节点

  1. List<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);
  2. InputStream imageStream = ProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds);
  3.         // 输出资源内容到相应对象
  4.         byte[] b = new byte[1024];
  5.         int len;
  6.         while ((len = imageStream.read(b, 0, 1024)) != -1) {
  7.             response.getOutputStream().write(b, 0, len);
  8.         }

复制代码 得到的图片是引擎自动生成的,并把当前节点用红色边框标记出来,弊端和直接部署流程文件生成的图片问题一样。

2、读取图片后通过前段Javascript和Css配合跟踪

    这种方式依赖于zip部署方式,因为这种方式的流程图坐标与bpmn文件里面的坐标一致,所以可以根据坐标分析在前段用javascript和css配合动态标记当前节点,这种方式在优势灵活性很大,可以显示你要展示的所以信息,因为完全就是一堆信息点汇合起来的跟踪功能。

    需要后端提供数据给前端分析,例如有哪些Activity分别及其坐标、高度、宽度、是否当前节点等信息,json数据结构如下。

流程图跟踪示例:

3、通过Diagram Viewer跟踪(完全Javascript画图)

   这是官方提供的一个Javascript跟踪工具,使用方便,简单配置就可以使用,兼容各种浏览器,并且可以自己扩展;参考:

《集成Diagram Viewer》

继续阅读