如何从与给定状态关联的任务重新启动工作流

How to Restart a Workflow From the Task Associated With a Given Status

我需要创建一个工作流,让用户可以从数据库中检索实体、审查它,最后批准或放弃它。如果用户批准该实体,应用程序仅将其状态更新为 APPROVED,否则如果用户放弃该实体,应用程序将其状态更新为 DISCARDED.

当新实体存储到数据库中时,其状态默认为 DRAFT。当用户开始审查实体时,状态将设置为 IN_REVIEW – 审查可能会持续几天。

为了实现工作流程,我定义了以下 JavaDelegate 类:

public class ReviewEntityTask implements JavaDelegate { 
    public void execute(DelegateExecution execution) {
        // set entity status to IN_REVIEW and update DB
    }
}

public class ApproveEntityTask implements JavaDelegate { 
    public void execute(DelegateExecution execution) {
        // set entity status to APPROVED and update DB
    }
}

public class DiscardEntityTask implements JavaDelegate { 
    public void execute(DelegateExecution execution) {
        // set entity status to DISCARDED and update DB
    }
}

然后,查看官方文档,工作流程应该是这样设置的:

@Service
public class MyWorkflowService {
    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    public void startProcess(Article article) {
        Map<String, Object> variables = new HashMap<>();
        ...
        runtimeService.startProcessInstanceByKey("entityReview", variables);
    }

    public void updateOnReview(final MyEntity myEntity) {
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("review", myEntity.getStauts == "IN_REVIEW");
        taskService.complete(myEntity.getId(), variables);
    }

    public void updateOnApprove(final MyEntity myEntity) {
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("approved", myEntity.getStauts == "APPROVED");
        taskService.complete(myEntity.getId(), variables);
    }

    public void updateOnDiscard(final MyEntity myEntity) {
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("discarded", myEntity.getStauts == "DISCARDED");
        taskService.complete(myEntity.getId(), variables);
    }
}

在 运行 任何任务之前,我需要调用 runtimeService.startProcessInstanceByKey 来启动进程。所以我的问题是:如何从给定的 [previous] 状态重新启动工作流?例如,假设今天我通过调用 updateOnReview(状态转到 IN_REVIW)开始审查......两天后我将通过调用 updateOnApprove(状态转到 APPROVED),我应该如何调用 runtimeService.startProcessInstanceByKey 以从我之前离开的任务(即与状态 IN_REVIEW 关联的任务)开始工作流?谢谢。

根据我对您的场景的理解,您之前启动的流程实例现在正在用户任务中等待更新。您使用 taskService 完成用户任务并提交数据更新。您的问题是如何将更新操作与正确的 运行ning 实例相匹配。

当您启动流程实例时,您需要包含一个唯一标识符,稍后可用于此匹配。自然的选择是实体 ID。您可以将其包含在流程数据中,但将其设置为 businssKey 会更好。 https://www.flowable.com/open-source/docs/javadocs/org/flowable/engine/RuntimeService.html#startProcessInstanceById(java.lang.String)

稍后,当您需要更新流程实例时,您可以使用 TaskService 运行 以 businessKey(或流程数据)作为搜索条件的查询。 https://www.flowable.com/open-source/docs/javadocs/org/flowable/engine/TaskService.html#createTaskQuery()

https://www.flowable.com/open-source/docs/task-javadocs/org/flowable/task/api/TaskInfoQuery.html#processInstanceBusinessKey(java.lang.String)

查询将return您属于正确流程实例的用户任务。现在您可以使用 TaskService 和 returned 任务的 ID(不是您的实体的 ID)完成此用户任务。