• 浅谈Activiti Modeler 的扩展


    • 为什么要扩展
            最近项目打算用activiti工作流中activiti modeler来做模块的可视化订阅,但是原生的activiti任务节点,有一些不符合业务需要,比如
      • 配置项多,属性暴露。比如service task,配置时就要暴露其Java Degelete方法类,这样以后实施人员去配置的时候,第一他每次去配个service task都要去配置,第二他不会知道这个任务要配什么委托类,所以这对职责单一的一个service task来说,比如就需要一个解析xml的任务,那么我除了id ,name,其他都是不需要的,内部封装属性,不暴露出去。
      • 图标单一,一眼看不出任务职责。
      • 子流程内容跟父流程内容在一个面板,流程定制面视觉效果不好,而且固定子流程不能得到复用。
                对以上一些不足,其实对activiti来说,他要考虑的当然是多开放配置,更容易兼容场景,或许有些人会认为这都不是事,做这种扩展没有必要,大题小作。仁者见仁智者见智吧,我认为这种扩展,
                对使用会更便捷,用户友好性也更好,具有一定的业务特色,也不改变原生activiti任务的职能,何乐不为。
     
    • 如何扩展
             首先考虑一下可行性,这种扩展以什么为切入点。扩展任务节点,那就得发现service task这个任务的特性,它不想user task,script task的只能那么单一,它可以指定委托处理类,来达到执行目的。
              因此,在任务定制这方面,完全可以由service task进行属性扩展和封闭。具体扩展细节,如下考虑   
     
      • UI上扩展属性
        • 扩展stencilset.json文件。propertyPackages对象中增加自定义的package(基本类型直接使用,复杂类型需要扩展),另外stenclis对象的节点中增加package引用
        • 针对复杂类型自定义package的扩展。properties.js中增加复杂类型配置(复杂类型的展现及赋值采用angularjs1.2实现)
      •  bpmn中扩展属性
        • 自定义XSD
        • 在extensionElements元素中实现扩展
        • 通过repositoryService获取bpmnModel,进而获取指定元素的扩展
      • 解析UI上的扩展到bpmn 
        • UI的图形及属性信息会解析成JSON,包含自定义扩展
        • 从JSON中提取扩展转换成bpmn中的元素。通过BpmnJsonConverter把Json数据转换为BpmnModel,把Json中的扩展转换成BpmnModel对应元素的extensionElements属性,通过BpmnXmlConverter把BpmnModel转换为bpmn文件 
               那么还有一个难题,就是子流程的独立展示改造,在这方面的可行性分析和设计,是这么思考的。 
          
      • 子流程怎么存储?
        • 把子流程作为独立的模型进行编辑和保存,这样可以使用现有的建模工具及持久化方式
      • 部署时怎么组装子流程?
        • 由于定制化的模型数据不符合标准,需要在部署前转换为标准的bpmn
        • 将子流程的标识用真正的子流程定义替换掉
        • 子流程的标识通过子流程模型ID进行关联
        • 从流程定义查看流程图时,坐标会有问题,子流程替换后,坐标需要调整(难点)
      • 展现设计
        • 在建模的页面中添加子流程的下拉框(所有后代子流程,流程树)
        • 扩展一个子流程标识节点,该节点可以设置关联的子流程
        • 双击子流程标识节点可以进入以该子流程为根的建模页面
      • 后端设计
        • 根据父流程查询所有后代子流程
        • 部署时数据的转换,子流程数据的替换(重点) 
    •  编后语
           在子流程这方面需要考虑的还很多,比如后续的流程跟踪该如何处理,以及上述部署组装bpmn文件的坐标问题等。这要继续看下activiti源码(ps:activiti 源码写的很漂亮,very  good,建议去看,
            然后一起探讨),后续会更新一些现有的实现。
     
  • 相关阅读:
    SVN 初级教程
    572 node包管理工具
    571 node的events模块
    570 node内置模块fs
    569 node内置模块path
    568 node之JavaScript模块化:exports,module.exports,import,对象的引用赋值,require查找规则,export、import关键字,CommonJS的加载过程,ES Module加载过程
    567 node概述:Node程序传递参数,常见的全局对象,特殊的全局对象
    566 手写37个 原生JavaScript 系列汇总(含promise A+)
    565 手写promise源码
    564 函数的防抖和节流
  • 原文地址:https://www.cnblogs.com/fightingcoding/p/6419349.html
Copyright © 2020-2023  润新知