# 工作流功能说明 --- ### 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 即可