# 保存数据

和保存相关的事件包括用户保存ACTION_SAVING和ACTION_SAVED事件,以及管理员保存INSTANCE_SAVING和INSTANCE_SAVED事件。其中管理员保存事件的使用极为罕见,这里就不举例说明了,我们以用户保存事件为例说明。

Saving事件和Saved事件的相关调用时序如下图

从这张图里我们也可以看到Saving事件里可以修改表单数据而Saved事件里不能,所以一般我们可以在Saving事件里验证并修改表单数据,而在Saved事件里将数据保存到业务数据库里。当然一般Saved事件里就需要保存到业务库里的场景并不多,一般都是在用户首次提交,或者在整个业务流程都结束的时候才真的保存到业务数据库里,这个可以根据实际需求来决定存库时机。

另外要记得工作流编辑器中需要勾选步骤的Saving、Saved事件钩子才能使之生效。

以下代码覆写了onActionSaving方法,检查了用户是否填了请假事由字段,如果没填写就通过抛一个InfoPlusException让流程前端页面报错。然后检查了请假类型是否是出差,如果是出差的话并且出差行程没数据就新增一行数据并且预填一下日期。示例代码展示了ACTION_SAVING事件的主要作用就是验证表单数据并可以修改。

@Override
public InfoPlusResponse onActionSaving(InfoPlusEvent e) {
    Leave form = e.toBean(Leave.class);
    if (StringUtils.isEmpty(form.getReason())) {
        // 抛错保存不成功,并会在填表页显示错误信息
        throw new InfoPlusException("请填写请假事由");
    }
    if (form.getType() != null && TRIP_CODE.equals(form.getType().getCodeId())) {
        if (form.getTrip() == null) {
            form.setTrip(new ArrayList<>());
        }
        // 没数据就添加一行
        if (form.getTrip().isEmpty()) {
            form.getTrip().add(new LeaveTrip(null,""));
        }
    }
    // 这里的return会将所有前面对表单数据的修改都保存下来
    return new InfoPlusResponse(e, form);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

以下代码覆写了onActionSaved方法,这个方法里可以写存业务库的逻辑,如果觉得这里的业务逻辑非常重要,可以将步骤的Saved方法勾选后面的Block图标,表示如果这个事件失败(比如业务数据库保存失败)就回滚流程数据,这样就能保证流程平台的数据和业务库里数据保持一致。

@Override
public InfoPlusResponse onActionSaved(InfoPlusEvent e) {
    Leave form = e.toBean(Leave.class);
    // 这里可以加上存业务数据库的逻辑
    return null;
}
1
2
3
4
5
6

# 案例地址

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