如何根据用户任务结果设置 BPMN 流程变量?

How to set a BPMN process variable from a user task outcome?

我有一个简单的审批 BPMN 工作流程。我想将用户任务 ("Approve") 的结果(数据输出?)分配给一个流程变量,然后在该用户任务之后的独占网关中使用该变量。完成任务时,用户任务结果设置在 data/variables 映射中的 Java 内。无论我尝试和搜索什么,我都无法让它工作。我一直收到错误 "XOR split could not find at least one valid outgoing connection for split Approved?"。有人可以帮忙吗?

我试过指定一个 with 和 a 等等。

我的 BPMN 来源:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:ns2="http://www.omg.org/spec/DD/20100524/DI"
             xmlns:ns3="http://www.omg.org/spec/DD/20100524/DC"
             xmlns:ns4="http://www.omg.org/spec/BPMN/20100524/DI"
             targetNamespace="http://www.omg.org/bpmn20">

  <itemDefinition id="_approval" isCollection="false" structureRef="java.lang.Boolean"/>

  <process id="modelio-approval"
           name="Process"
           isClosed="false"
           processType="None">

    <property id="approval" name="approval" itemSubjectRef="_approval"/>

    <startEvent id="StartId"
                name="Start"
                isInterrupting="true"
                parallelMultiple="false">
      <outgoing>FromStartToApprove</outgoing>
    </startEvent>

    <sequenceFlow id="FromStartToApprove"
                  name="FromStartToApprove"
                  sourceRef="StartId"
                  targetRef="ApproveId"/>

    <userTask id="ApproveId"
              name="Approve"
              isForCompensation="false"
              startQuantity="1"
              completionQuantity="1">
      <incoming>FromStartToApprove</incoming>
      <outgoing>ToApprovedGateway</outgoing>
      <ioSpecification>
        <dataOutput id="approvalOutRef" itemSubjectRef="_approval" name="approvalOut"/>
        <outputSet id="OutputSet_1">
          <dataOutputRefs>approvalOutRef</dataOutputRefs>
        </outputSet>
      </ioSpecification>
      <dataOutputAssociation id="doAssIdApproval">
        <sourceRef>approvalOutRef</sourceRef>
        <targetRef>approval</targetRef>
      </dataOutputAssociation>
    </userTask>

    <sequenceFlow id="ToApprovedGateway"
                  name="ToApprovedGateway"
                  sourceRef="ApproveId"
                  targetRef="ApprovedGateway"/>

    <exclusiveGateway id="ApprovedGateway"
                      name="Approved?"
                      gatewayDirection="Diverging">
      <incoming>ToApprovedGateway</incoming>
      <outgoing>ToFinish</outgoing>
      <outgoing>ToDisapproved</outgoing>
    </exclusiveGateway>

    <sequenceFlow id="ToFinish"
                  name="ToFinish"
                  sourceRef="ApprovedGateway"
                  targetRef="FinishId">
      <conditionExpression>approval == true</conditionExpression>
    </sequenceFlow>

    <sequenceFlow id="ToDisapproved"
                  name="disapproved"
                  sourceRef="ApprovedGateway"
                  targetRef="DisapprovedId">
      <conditionExpression>approval == false</conditionExpression>
    </sequenceFlow>

    <userTask id="FinishId"
              name="Finish"
              isForCompensation="false"
              startQuantity="1"
              completionQuantity="1">
      <incoming>ToFinish</incoming>
      <outgoing>ToEnd</outgoing>
    </userTask>

    <sequenceFlow sourceRef="FinishId"
                  targetRef="EndId"
                  name="ToEnd"
                  id="ToEnd"/>

    <endEvent id="EndId" name="End">
      <incoming>ToEnd</incoming>
    </endEvent>

    <endEvent id="DisapprovedId" name="Disapproved">
      <incoming>ToDisapproved</incoming>
    </endEvent>

  </process>

</definitions>

在 Java 代码中,我尝试在 "Approval" 用户任务上设置任务 "approval" 数据,如下所示:

Map<String, Object> data = new HashMap(1);
data.put("approvalOut", true);
taskService.complete(taskId, userId, data);

但错误信息总是:

错误:[modelio-approval:25 - Approved?:6] -- XOR split 找不到至少一个有效的 outgoing connection for split Approved?

我希望流程转到 "Finish" 任务 (sequenceFlow "ToFinish"),但出现错误 "XOR split could not find at least one valid outgoing connection for split Approved?".

我是否应该使用数据 输入 而不是输出? taskService.complete(taskId, userId, data); 实际设置了什么?可惜没有Javadoc.

这里的问题是您的任务无法将其数据输出到进程,因此无法输出到 XOR。 我认为你的任务输出映射是错误的。

快速解决方案:

  1. 在编辑器中单击您的用户任务(批准)并转到属性 window。查找名为 'Assignments'.
  2. 的部分
  3. 在 'Data Inputs and Assignments' 中,创建布尔类型的名为 'userAction' 的变量。
  4. 在 'Data Outputs and Assignments' 中,使用相同的名称 'userAction',键入布尔值,在 'target' 中,select 您的过程变量 'approval'。在 'target' 中,它应该在下拉列表中可用,否则认为您的过程变量创建有误。
  5. 保存并部署您的 bpmn。
  6. Java 执行代码将更改为
Map<String, Object> data = new HashMap(1);
data.put("userAction", true);
taskService.complete(taskId, userId, data);

请尝试此解决方案,如果您遇到任何问题,请告诉我。

说明: 为此,您需要了解不同变量的范围。

  1. 流程变量 - 它们可跨整个流程元素访问。

  2. 任务变量 - 这些变量在任务启动时创建,在任务结束时销毁。

当我们设计任务时,我们创建了任务变量。如果我们需要对此任务进行任何输入,则使用 'input assignment' 将流程变量数据放入任务变量中。任务变量用于任务处理。任务工作完成后,如果我们需要发送任务输出,则任务变量将在 'output assignment' 的帮助下映射到流程变量。

如果您有任何疑问,请告诉我。很高兴能帮到你。