# 打印和导出

打印和导出这两个事件用法类似,所以合并在一起说明。这两个事件都是既有实例级事件(INSTANCE_PRINTING、INSTANCE_EXPORTING),又有步骤级事件(STEP_PRINTING、STEP_EXPORTING),其中实例级的用于管理员打印和导出,步骤级的就是普通用户在执行步骤时的打印和导出,我们以步骤级为例说明。

# 打印

打印和导出事件的目的都是在打印和导出前预处理数据,在流程表单数据和打印或者导出的数据结构完全一致情况下就不用预处理数据了,直接使用表单渲染打印页或者导出即可,只有在两者数据有所差异时才需要预处理数据。

现在说一下这次的需求,我们要在用户最后确认的那步可以打印和导出,打印的内容包括这次的请假信息,以及本年度所有请假信息列表。本年度已请假列表不是这个流程的填表内容,只是可以从业务数据库中读取并放到打印或导出模板上方便用户查看历史信息。

首先我们需要制作一个打印模板,如下图

其中数据结构如下图

由于所有视图的数据结构都必须是主表单的一个子集,所以我们还需要更新主表单数据结构如下图

更新主表单后就可以上传打印模板了

接下来我们需要在工作流编辑器中把最后确认步骤的Printing事件给勾上,并保存流程。

在Messenger里添加确认步骤Printing方法onStepConfirmPrinting。

public InfoPlusResponse onStepConfirmPrinting(InfoPlusEvent e) {
    Leave form = e.toBean(Leave.class);
    // 这里从业务数据库中获取本年度历史数据并填充,以下数据仅做演示
    List<LeaveHistory> historyList = new ArrayList<>();
    historyList.add(new LeaveHistory("2023-01-10", "2023-01-11", "2023-01-11", "01", 1));
    historyList.add(new LeaveHistory("2023-05-10", "2023-05-15", "2023-05-16", "02", 2));
    form.setHistory(historyList);
    return new InfoPlusResponse(e, form);
}
1
2
3
4
5
6
7
8
9

好了,现在可以试一下效果了,调试流程至最后一步,按打印按钮可以看到打印页内容如下

这完全符合我们的预期,如果没有onStepConfirmPrinting方法对数据的预处理,那么打印页将智慧有上半部分,请假清单这里将会空白。

# 导出

接下来完成导出功能,我们新建一下导出模版,并上传Word模板,在申请人确认步骤选择Word模版,再勾上步骤的Exporting事件后保存流程。

导出模板如图所示

在Messenger中添加onStepConfirmExporting方法

public InfoPlusResponse onStepConfirmExporting(InfoPlusEvent e) {
    Leave form = e.toBean(Leave.class);
    // 这里从业务数据库中获取本年度历史数据并填充,以下数据仅做演示
    List<LeaveHistory> historyList = new ArrayList<>();
    historyList.add(new LeaveHistory("2023-01-10", "2023-01-11", "2023-01-11", "事假", 1));
    historyList.add(new LeaveHistory("2023-05-10", "2023-05-15", "2023-05-16", "病假", 2));
    form.setHistory(historyList);
    return new InfoPlusResponse(e, form);
}
1
2
3
4
5
6
7
8
9

现在在流程最后一步就可以导出文件了,效果如图



# 案例地址

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