# 工作流功能说明
---
### 1.流程设计
可以新建一个流程或者直接导入BPMN定义文件
融租易的环境有一些样例,可以下载学习。
以下截图以`请假流程`为例

使用activiti editor设计流程

![](/assets/act_vacationReq_ed.png)
如图点击编辑按钮会弹出流程设计器页面
![](/assets/act_vacationReq_exp.png)

> 左边有各种节点,事件等,可以拖拽到中间,右边是当前节点的属性烂

关于常用节点,以及常用属性,参考[流程设计器简易教程](activiti_editor_helper.md)

  
### 2.流程部署
流程设计好以后,点击流程设计页面操作栏的最后一个按钮(勾)即可发布流程
> 未发布过的流程或者改动过的流程,勾会以绿色展示,反之灰色

发布以后可以在流程部署页面查看部署情况
> 如果有旧的流程启动了,发布的新版不会影响旧流程的运行


### 3.流程启动
实际项目中需要客户化开发流程启动页面,参考`工作流测试`页面
工作流测试页面可以动态解析`表单属性`,请假流程的启动页面如图所示
![](/assets/act_vacationReq_exp_start.png)

### 4.待办事项与历史流程
可以在`我的待办`中查看当前登录用户(根据员工号)需要处理的待办事项
> 管理员可以在`待办事项中(管理员)`查看所有人的待办

在待办页面点击办理,即可处理相应事项。
![](/assets/act_vacationReq_exp_deal.png)
右上角的`审批动作`可以在通过在流程设计器里设置当前`人工任务`的表单属性动态生成,默认为
   * 同意
   * 拒绝
   * 转交
   
>  对于activiti,审批动作仅仅是传回后台的值不一样

这里的表单信息也需要需要客户化开发的,其实是一个iframe嵌套的页面,会在待办页面自动解析
>  页面路径在流程设计器里指定当前任务的`表单的标识Key`
demo放在`view/activiti/include`下

`历史流程`页面可以查看已经结束和正在运行的流程信息

## 审批链
---

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

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

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

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


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

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

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

主要属性说明:

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

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

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

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

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

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

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


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



## 自定义任务超时时间和动态调整优先级
---

对于人工任务节点,在流程设计器中可以设置任务到期时间

![](/assets/wfl_user_task_approve.png)

支持ISO8601 标准的日期格式,也可以写流程变量。如PT8H(ISO8601标准支持),表明该节点的任务的限定时间是8小时。

HAP 实现了一个简单任务,每30分钟执行一次,会动态调整设置了到期日期的任务的优先级。

如何自定义超时时间的计算方式以及自定义优先级调整策略?

实现 `ICustomTaskProcessor` 即可:

```java

    /**
     *  @param task 任务节点
     *  动态设置task的优先级,调用getDueTime,获取任务剩余时间
     *  建议不要改动其他属性,仅仅设置优先级
     *  @return 一般情况返回参数task
     */
    Task processPriority(Task task);

    /**
     *  @param startDate task的创建时间
     *  @param dueTime 当前task的任务的限定时间
     *
     *  根据task的创建时间和限定时间,返回任务的剩余时间,单位秒
     *
     *  @return  返回经过计算后的任务剩余时间 ,负数表示超时时间
     */
    Long getDueTime(Date startDate,Long dueTime);

    /**
     * 是否继续处理,如果返回false,不会再继续执行其他实现类
     * */
    boolean processorContinue();

    int getOrder();
    
```

参考 HAP 提供的一个默认实现 `DefaultCustomTaskProcessor` 
超时时间没做特殊处理,如果剩余时间不足三分之二将优先级上调一级,如果不足三分之一把优先级设置为高。超时则设置为最高(100)

1.首先实现 `getDueTime` 方法,该方法应该返回实际意义上,当前任务剩余的时间。
> 比如我们设置了PT8H,但是我们想让这个任务的时效是8个工时,则可以在这里写好处理逻辑

> 参数 `dueTime` 是一个 Long 类型的参数,它的值是设置的超时时间(比如8小时,任务的dueDate与startDate的时间差)

2.`processPriority` 方法则可以自定义优先级的调整规则,这里应该调用`getDueTime` 拿到任务的剩余时间或者超时时间,通过设置一定的规则,调整优先级(`task.setPriority(xx)`) 

3.`getOrder` 方法用于实现类排序,数值越小,执行该实现类的优先级越高,框架的默认实现类order = 999,想只执行自己的实现类,设置一个较小的数值,重写 `processorContinue` 方法,并返回false 即可