我想做个请假审批演示流程,在填写请假信息的screen中通过注解@ProcessVariable和saveInjectedProcessVariables方法设置流程变量。但是在审批screen中用@ProcessVariable发现流程变量注入值为null,而且用runtimService获取也是为null。请问一下有什么解决方法吗?
根据你的介绍,功能大概是:
- 有一个请假的实体。
- 在填写请假的界面想通过 @ProcessVariable 和 saveInjectedProcessVariables 设置流程变量
- 希望在审批的界面用 @ProcessVariable 和 runtimService 获取流程变量
是的,并且我想在两个界面共用同一个填写表单的Fragment
我正在做一个小 demo,也就是说流程变量是放在这个 fragment 里面?
流程变量我是在父界面声明的,Fragment通过InstanceContainer的provided="true"获得实体数据。
你的这个问题,应该是在审批的时候 processFormContext 中并没有之前存下的流程变量,也就是审批的时候并没有用之前的流程实例启动审批界面。下面的示例是如何根据选择的请假实体启动对应的流程,你根据代码中的注释看看:
@ProcessVariable
private LeaveApplication leaveApplication;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
protected ProcessFormScreens processFormScreens;
// 这是一个在列表中选中请假实体后,点击“审批”按钮的响应方法
@Subscribe("approveBtn")
public void onApproveClick(Button.ClickEvent event) {
Set<LeaveApplication> leaveApps = leaveApplicationsTable.getSelected();
if (leaveApps.isEmpty()) {
notifications.create()
.withType(Notifications.NotificationType.HUMANIZED)
.withDescription("请选择要审批的请假")
.show();
return;
}
// 拿到表格中的请假实例,并设置为流程变量
leaveApplication = leaveApps.stream().findFirst().get();
// 根据实例的 ID 查询流程变量。这里要在前一步启动流程时,将实例的 id 存在流程变量 "leaveAppId" 里。
List<ProcessInstance> procInstances = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(PROCESS_KEY)
.variableValueEquals("leaveAppId", leaveApplication.getId())
.active()
.list();
ProcessInstance procInstance = procInstances.get(0);
// 根据流程实例,查找对应的任务
List<Task> tasks = taskService.createTaskQuery()
.processInstanceId(procInstances.get(0).getId())
.active()
.list();
// 用任务创建流程表单,由于任务是通过实例 id 查找出来的,因此启动流程后便能访问之前存储的流程变量。
Screen taskForm = processFormScreens.createTaskProcessForm(tasks.get(0), this);
// 设置表单中的实体
if (taskForm instanceof EditorScreen) {
((EditorScreen<LeaveApplication>) taskForm).setEntityToEdit(leaveApplication);
}
// 审批结束后刷新表格
taskForm.addAfterCloseListener(afterCloseEvent -> {
refreshTable();
});
taskForm.show();
}