# 工作流程

# 关于流程引擎

工作流程采用的引擎是Activiti。Activiti是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持各类流程自动化需求。 相关具体知识可参考:Activiti (opens new window)

# 设计器介绍

流程设计器分为左、右两段布局结构:

  • 左:流程设计区域,在最左侧的悬浮框中有设计工具与流程组件,可以拖拽流程组件到设计器中,调整布局、连线等,构造基本的流程结构。点击流程组件后,在右侧将显示该组件的属性。
  • 右:属性区域,分为流程属性与组件属性
    • 流程属性:为选择组件时,显示流程属性
    • 表单属性:选择组件时,显示该组件属性

# 流程属性

  • 流程标识符:也称为流程ID,全局需唯一,推荐使用流程英文名
  • 流程名称:流程的显示名称
  • 执行监听器:详见监听器

# 组件属性

组件类型有以下几种:

  • 开始
  • 结束
  • 任务(用户任务)
  • 连线
  • 排他网关
  • 并行网关
  • 子流程(扩展子过程)

# 一般属性

  • ID:组件ID,需全局唯一,一般为系统自动生成,无需修改
  • 名称:组件的显示名称,以下为推荐的名称命名方式
    • 用户任务:使用任务动作作为名称,例如:审核、批准、起草人修改等
    • 连线:网关后的连线,将会根据名称生成审批按钮,因此建议使用相关审批操作作为名称,例如:通过、否决等
    • 以下组件类型一般无需指定名称:网关前的连线、网关
  • 表单:任务节点所使用的审批表单,仅以下组件类型可设置表单:开始、任务

说明

一个流程一般会有多个任务,每个任务所使用的表单可能不一样(每个任务节点显示、激活的表单字段可能不同),系统支持两种表单设置方式:

  1. (推荐)一个流程只设计一个表单,在表单字段属性的 条件显示、条件激活 中,指定字段的显示和激活状态
  2. 一个流程设计多个表单,对不同的任务节点指定不同的表单

推荐使用第1种方式,可以减少后期维护的工作量。

# 特有属性

# 任务(用户任务)

  • 任务
    • 处理用户:可以直接指定系统中用户的ID,或通过 ${变量名} 的方式指定变量(例如:${bpm_assignee}),关于变量值的指定:
      • 单实例任务:在执行监听器中指定
      • 多实例任务:通过多实例的循环变量属性来指定
  • 多实例
    • 类型
      • 顺序处理:一个任务由多人共同审批时,按顺序审批(前者完成任务后,后者才会接到待办事项)
      • 并行处理:一个任务由多人共同审批时,可同时审批(同时接到待办事项)
      • 无:单实例任务(一个任务只由一个人审批)
    • 集合:指定变量名,变量值是一个数组,在执行监听器中指定
    • 循环变量:将集合中变量指定的数组循环遍历,将每一次遍历的值存在循环变量中,任务的处理用户属性中,可以直接指定这个循环变量
    • 完成条件:在满足条件的情况下,任务提前结束。一般为一个条件表达式,例如:${wf_reviewOutcome=="Reject"},其中变量值可在执行监听器或任务监听器中指定。常用场景如下:
      • 无需所有人同意,当同意比例达到指定的值,任务就算审批通过
      • 只要有一人否决,其他人无需处理,任务将直接被否决退回

# 连线

  • 流转类型:
    • 普通流转路径:一般为网关前的连线
    • 默认流转路径:推荐将网关后 审批通过 的流转路线指定为默认,默认流转路径将会生成为表单上审批操作的第一个按钮
    • 条件流转路径:满足指定条件后流转的路径
      • 流转条件表达式:一般为一个条件表达式,例如:${wf_reviewOutcome=="Reject"},其中变量值可在执行监听器或任务监听器中指定。

# 监听器

监听器分为:

  • 执行监听器:流程、组件均可设置执行监听器
  • 任务监听器:只有任务组件可以设置任务监听器

执行监听器与任务监听器的触发时间点不同,一般的触发顺序为:

  1. 执行监听器 start:一般用于表单变量获取,任务负责人变量的指定等
  2. 任务监听器 create
  3. 任务监听器 assignment:一般用于为审批者设置文档的访问权限
  4. 任务监听器 complete:一般用于保存工作流处理日志
  5. 执行监听器 end:一般用于:
    • 流程:用于判断是否取消申请,取消申请的情况下,如有需要可以还原审批文档的状态
    • 开始组件:保存工作流处理日志
    • 结束组件:流程正常审批通过的处理事项,例如流程状态更新、文档状态或属性更新等

# 监听器的语法

监听器使用Javascript语法编写,具体语法可参考:Alfresco JavaScript API (opens new window) 除了 Alfresco JavaScript API 中的内置对象,工作流中的监听器还可以使用以下根对象:

  • bpm_package:指向工作流表单的Node,可通过此对象获取表单属性、审批文档等
    • 表单属性:bpm_package.properties["属性名"]的方式,例如:bpm_package.properties["idoc:isono"]
    • 审批文档:bpm_package.childAssocs["bpm:packageContains"],例如:var nodes = bpm_package.childAssocs["bpm:packageContains"];
  • wfUtil.saveHistory:保存工作流处理日志
    • 开始组件:
    // 记录流程历史
    wfUtil.saveHistory(bpm_package, "wfActionStart");
    
    • 任务组件:
      • 申请者修改
      // 记录流程历史
      wfUtil.saveHistory(bpm_package, "wfActionResubmit");
      
      • 其他任务
      // 将通过/否决的信息设置到流程变量,以便决定分支走向
      var wf_reviewOutcome = task.getVariable('wf_reviewOutcome');
      execution.setVariable('wf_reviewOutcome', wf_reviewOutcome);
      // 记录流程历史
      wfUtil.saveHistory(bpm_package, wf_reviewOutcome, task.getVariable('wf_comment'));
      
  • execution:整个流程执行过程中,可通过execution获取和设置流程变量,设置的流程变量在任意位置的监听器中均可被访问
    • 设置流程变量:execution.setVariable(变量名, 变量值),例如:execution.setVariable('wf_reviewOutcome', '');
    • 获取流程变量:execution.getVariable(变量名),例如:execution.getVariable('wf_reviewOutcome');
  • task:仅在任务组件中可被访问,可通过task.getVariable('wf_reviewOutcome')获取审批的通过/否决信息
// 将通过/否决的信息设置到流程变量,以便决定分支走向
var wf_reviewOutcome = task.getVariable('wf_reviewOutcome');
execution.setVariable('wf_reviewOutcome', wf_reviewOutcome);

# 版本管理

# 保存新版本

流程设计支持版本管理,点击工具栏 保存 按钮后方的图标,将显示 保存为新版本 按钮,点击后可将当前配置保存为新版本。

# 读取历史版本

设计器右侧流程属性面板下方显示流程文件的历史版本,可点击右方的 读取内容 按钮,读取历史版本内容并反应到设计器上。

# 流程生效

流程设计修改保存后,将立即发布生效。之后发起的流程将使用修改后的流程;之前发起的流程将沿用旧的流程逻辑。

更新时间: 2024年7月25日星期四凌晨12点05分