工作流开发指南
---
## UserTask
---
### 指定审批人、组

在流程设计器中,选定`人工任务`节点,右边属性栏,点击`任务派遣` 弹出对话框

<img width='600' src='/assets/usertask-assignment.png'/>

其中:
* 指派对象    
只能有一个人,可以点击`选择`按钮来从系统中选择员工
* 候选用户   
可以添加多个,每个指定一个`员工工号`
* 候选组   
可以添加多个,每个指定一个`岗位代码`



### 动态审批人、组

与 上面类似,不过动态的审批人和组不是选择的,而是通过表达式计算得来。   

表达式有两种情况
   * 引用变量   
   比如`${initiator}`, 其中`initiator` 就是一个变量
   * 调用 service 方法   
   比如`${orgStructure.getDirector(initiator)}`,其中 `orgStructure` 是一个自定的用于工作流的 `bean`,参数则可以使用任意的变量、常量等
   
   > `execution` 是一个固有的、特殊的变量,指代 `org.activiti.engine.delegate.DelegateExecution`,非常有用

关于自定义在工作流中用的 `bean`:   
HAP 提供一个 接口 `com.hand.hap.activiti.custom.IActivitiBean`。   
实现这个接口并被定义注册为 bean,其中的任何 `public` 方法都可以在工作流表达式中直接调用。   
默认 bean 的 名字就是引用名,也可以覆盖接口的默认实现,指定名称。

### 审批动作
Hap 的工作流在审批的时候默认有两个标准的动作:
* 同意(APPROVED)
* 拒绝(REJECTED)

当审批者点击按钮以后,审批动作 id 会被保存到流程的共享变量区域。
key 为 `approveResult`,这个变量可以直接在表达式中使用。

```
${approveResult=='REJECTED'}
```


流程设计时,可以控制这两个按钮显示的文本;也可以控制只显示其中的一个。


允许自定义额外的审批动作,自动动作的 id 同样会保存在 `approveResult` 变量中,通常需要流程显示处理(比如选择网关)。

<img width='920' src='/assets/custom-approve-action.png'/>



### 自动结束流程(HAP 扩展特性)

当一个任务被拒绝时,绝大多数情况下,这个流程应该直接结束。   
但在工作流中,`审批拒绝`和`审批同意` 仅仅是给变量赋的参数值不同而已,如果希望流程结束,应该加一个 `选择网关`,判断审批结果是否为 `拒绝` ,然后引导流程走向`结束事件`。

显然,这很繁琐,尤其是当流程中`人工任务`节点比较多时。   

HAP 做了一个优化:   
> 如果一个`人工任务` 的下一个节点仍然是 `任务(Task 类型)`,那么 HAP 将会自动插入一个`选择网关`和`终止事件` 来自动做结束流程的操作

这个优化在流程的图上是看不出来的,用户完全无感知。

### 会签设置

自定义属性:`nrOfApproved`,`nrOfRejected`

集合

变量

任务派遣

完成条件

## 网关
---

选择网关

> 选择网关`必须` 指定一个默认的连线,否则会出现不固定的行为。

并行网关

> 并行网关会在`所有连入`的连线都激活以后才会开始执行

## ServiceTask
---

## 待办通知
---

## 审批链
---
审批链功能不是 Activiti 的标准功能,属于 HAP 开发的外挂性质的扩展。

功能入口是在 `流程设计` 界面。

<img width='460' src='/assets/approve_chain_entry.png'/>

点击 编辑图标 进入该流程的审批链配置界面

<img width='900' src='/assets/approve_chain@2x.png'/>


在这个编辑页面中,所有的 `UserTask` 节点会以 标签页的形式自动列出来。

切换标签页,下方表格中的数据会自动刷新为对应节点的数据。

上方的 操作按钮 是针对每个 标签页 操作的,并非针对整个页面。

主要属性说明:

* 名称   
自定义,任意。`不允许重复`。    
节点原始名称 和 审批链的名称 拼接起来 作为运行时的名称。
* 审批人   
内置 3 种 
   * 申请人(自己)
   * 上级(申请人直接领导)
   * 申请人部门领导   
   
   其他情况统统归为 `自定义表达式`
   
 > 注意,这个功能要求流程的初始化器(Initiator)必须指定为 `initiator`

* 审批岗位   
支持选择系统中的`岗位`,也支持自定义的`表达式`

> 目前在指定了审批人的情况下,再指定审批岗位是无效果的

* 表单   
允许该轮次的审批显示指定的单据明细页面。   
如果没有指定,则显示该节点原始设置的值。
* 顺序号   
用来控制审批的先后 (目前尚不支持多人同时在同一轮次审批)
* 跳过条件   
表达式,有值,且值为 true 时,当前轮次跳过。   
默认留空,表示不跳过。
* 当前轮次因为 `跳过条件`被跳过时,是否直接结束审批链
* 启用   
高优先级过滤条件(不启用肯定就没有作用)
* 描述   
无明确用途

---
在设计器中设计审批节点时,由审批链控制的节点,不需要在去指定 `任务派遣`,可以完全在审批链中定义。即使指定了,也会被审批链中的值覆盖!

除了与审批人、岗位有关的属性以外,其他属性的含义、作用保持不变。

`名称`稍微有变化:会和审批链的名称拼接在一起


> 请注意:目前审批链还不支持多例(会签)