概要设计
- 工作流是系统内的一个通用模块,可以理解为工作流引擎模块,它依赖于表单引擎。
- 工作流引擎、表单引擎,均不包含业务数据,需要对接使用。
- 表单引擎完全独立,可以单独使用。
- 业务模块可使用
workflow-client通用包进行对接工作流引擎,来完成业务逻辑。 - 表单引擎、工作流引擎会对一些通用数据提供基础支持,如:员工、角色、技能等。
- 表单引擎、工作流引擎均支持
category参数,方便各个模块查询自己的数据。
Category 规则
category 是全系统通用的唯一标识,用于区分不同的业务数据。不同的业务模块都有自己的 category,并且在整个系统中通用且唯一。这就保证了业务数据间的隔离。 工作流也可以根据这个参数进行访问自己业务的通用数据,目前支持 category 只有工作流和表单引擎,后续可能会增加更多业务模块。
业务对接
在提供的 workflow-client 包中,提供了 WorkflowClient 类,该类提供了 start、claim、complete 等方法,用于对接工作流引擎。 这些方法其实就是对工作流模块进行的 RPC 调用的封装,让业务模块直接调用即可。
关键词
竟签
多人任务的一种处理方式,只会产生一个任务实例。只要有其中一个人认领该任务,该任务将不能再被其他人认领,除非该人解除了认领。
并签
多人任务的一种处理方式,产生多个任务实例。这些任务同时进行,当达到配置的条件时整个并签任务完成。
串签
多人任务的一种处理方式,产生多个任务实例。这些任务实例不会同时创建,而是按照设定的顺序进行创建,当然任务完成达到配置的条件时整个串任务完成。
多派
多派其实与并签类似,但标准流程推荐使用网关 (Gateway)来完成。多使用并行网关 (Parallel Gateway)或包容网关 (Inclusive Gateway)来完成。
网关 (Gateway)
网关用来控制流程的执行流向,当在拆分路径时产生令牌,在合并路径时消费令牌。常用网关可分为排他网关、并行网关和包容网关。
排他网关 (Exclusive Gateway)
定义了一组分支的唯一决策,所有流出的分支被顺序评估,第一个条件被评估为true的分支被执行,并不再继续评估下面的分支。
并行网关 (Parallel Gateway)
用于并行执行多个分支,所有分支都会被执行。 并行网关用于无条件的拆分或合并分支,该类网关对连线条件是忽略的。并行网关有分支和合并两种行为,允许多进多出。
包容网关 (Inclusive Gateway)
是排他网关和并行网关的综合体。当决策时,与排他网关所不同的是,所有条件为true的后继分支都会被执行。
所有者 (owner)
主要用于表示流程实例或任务的初始创建者或者原始责任人。与 assignee (当前处理任务的人)不同,owner 不一定是指当前正在执行任务的用户,而是更倾向于记录谁是这个任务或流程的发起人或原始所有者。
受让人 (assignee)
它代表了任务 (Task)当前被分配给的执行者或者负责人。当流程中的一个任务节点需要由特定用户来处理时,该任务的 assignee 属性就会被设置为这个用户的标识符,例如用户名、用户ID或其他唯一表示用户的字符串。
流程任务服务 (TaskService)
对 Task 和表单相关操作的访问的服务,这是一个核心服务。
任务是工作流核心概念之一,每个工作流可以产生多个任务,甚至每个工作流的节点都可以产生多个任务。有些任务可以同时存在,有些任务会有依赖关系。简而言之,一个工作流的执行过程就是通过产生和关闭各种各样的任务完成的。
认领 (claim)
认领后的任务才能进行处理。如果任务有且只有一个受让人,那么系统会进行自动认领操作。
取消认领 (unclaim)
已认领的任务可以进行取消认领,取消认领后,该任务将重新开放,其他人可以认领此任务。
完成 (complete)
将当前任务设置为完成,这个完成并不是整个工作流程的完成,而是当前节点的自己的任务完成,工作流会根据配置判断继续流转还是结束。
委派 (delegate)
所有者委托了任务,并希望在受让人解决任务后查看结果。当受让人完成任务时,该任务将被标记为 RESOLVED 并发送回所有者。发生这种情况时,所有者将被设置为受让人,以便所有者在待办事项中重新获得该任务。
转办 (transfer)
将给定任务的受让人 (assignee)更改为给定的用户,当受让人完成任务时,视为任务完成继续流转。
退回 (back)
将任务退回给上一个节点,任务将被标记为 REJECTED 并发送回上一个节点。
撤回 (revoke)
同时满足以下几点才可以撤回:
- 任务处理下一个节点。
- 如果是组任务,那么保证任务未被认领。
- 如果任务直接有处理人,那么必须任务还处于未完成的状态。
- 如果是多任务,那么所有的任务都必须是未完成状态。