# 终止和撤回

# 终止

终止事件是实例级事件,包括INSTANCE_KILLING和INSTANCE_KILLED,前者通常被用于检查流程是否允许终止,后者通常被用于将状态同步到业务系统并处理相关业务逻辑。

现在的需求是当流程流转到人事审批节点后,只要不是被人事审核否决的话就不允许终止了。

为此我们需要表单上创建一个标记变量fieldHrApprove,数据类型布尔,渲染类型Hidden。设置这个变量的值最方便的方法是在流程的以下三个动作执行时修改。

其中除了否决动作上需要设置fieldHrApprove为false,其他两个动作上设置fieldHrApprove为true

现在添加INSTANCE_KILLING事件代码

@Override
public InfoPlusResponse onInstanceKilling(InfoPlusEvent e) {
    Leave form = e.toBean(Leave.class);
    if (form.isHrApprove()) {
        throw new InfoPlusException("已到达人事审批,无法终止");
    }
    return null;
}
1
2
3
4
5
6
7
8

记得勾上实例级Killing事件后保存流程,然后就可以观察效果了,在到达人事审批前终止成功,到达人事审批后提示无法终止。

INSTANCE_KILLED事件简单说一下,就是在Messenger里添加onInstanceKilled方法,作用主要是同步流程状态并处理业务逻辑

@Override
public InfoPlusResponse onInstanceKilled(InfoPlusEvent e) {
    Leave form = e.toBean(Leave.class);
    // 根据表单数据更新业务数据库,修改状态并处理业务逻辑
    return null;
}
1
2
3
4
5
6

# 撤回

撤回是步骤级事件,包括STEP_WITHDRAWING和STEP_WITHDRAWN,和终止事件非常相似,前者可用于判断是否允许撤回,后者用于业务系统同步状态执行业务逻辑,具体的代码就不再举例了。

# 案例地址

download 流程链接
download 主表单模版
download Messenger代码