activiti-helper.md 6.47 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
# 工作流功能说明
---
### 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 即可