BPM流程变量问题

我想做个请假审批演示流程,在填写请假信息的screen中通过注解@ProcessVariable和saveInjectedProcessVariables方法设置流程变量。但是在审批screen中用@ProcessVariable发现流程变量注入值为null,而且用runtimService获取也是为null。请问一下有什么解决方法吗?
1660532670132
1660532962125

根据你的介绍,功能大概是:

  1. 有一个请假的实体。
  2. 在填写请假的界面想通过 @ProcessVariable 和 saveInjectedProcessVariables 设置流程变量
  3. 希望在审批的界面用 @ProcessVariable 和 runtimService 获取流程变量

是的,并且我想在两个界面共用同一个填写表单的Fragment

我正在做一个小 demo,也就是说流程变量是放在这个 fragment 里面?

流程变量我是在父界面声明的,Fragment通过InstanceContainer的provided="true"获得实体数据。
1660641971745
1660642007599

你的这个问题,应该是在审批的时候 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();
}