paed01 / bpmn-engine

BPMN 2.0 execution engine. Open source javascript workflow engine.
MIT License
885 stars 167 forks source link

subprocess #13

Closed zhaochy1990 closed 7 years ago

zhaochy1990 commented 7 years ago

Can you give an subprocess example, struggled... ..

zhaochy1990 commented 7 years ago

my test bpmn file.

<bpmn:process id="Process_1" isExecutable="true">
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>f0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:userTask id="Task1" name="isPassed">
      <bpmn:extensionElements>
        <camunda:formData />
      </bpmn:extensionElements>
      <bpmn:incoming>f0</bpmn:incoming>
      <bpmn:outgoing>f1</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:dataObjectReference id="DataObjectReference_0n4aw7g" dataObjectRef="DataObject_1xzg760" />
    <bpmn:dataObject id="DataObject_1xzg760" />
    <bpmn:sequenceFlow id="f0" sourceRef="StartEvent_1" targetRef="Task1" />
    <bpmn:sequenceFlow id="f1" sourceRef="Task1" targetRef="Task2" />
    <bpmn:userTask id="Task2">
      <bpmn:extensionElements>
        <camunda:inputOutput>
          <camunda:outputParameter name="x">
            <camunda:script scriptFormat="javascript">51</camunda:script>
          </camunda:outputParameter>
        </camunda:inputOutput>
      </bpmn:extensionElements>
      <bpmn:incoming>f1</bpmn:incoming>
      <bpmn:outgoing>f2</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:exclusiveGateway id="decision">
      <bpmn:incoming>f2</bpmn:incoming>
      <bpmn:outgoing>f3</bpmn:outgoing>
      <bpmn:outgoing>f4</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="f2" sourceRef="Task2" targetRef="decision" />
    <bpmn:userTask id="Task3">
      <bpmn:incoming>f3</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_08dd7y2</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:sequenceFlow id="f3" sourceRef="decision" targetRef="Task3">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression" language="javascript"><![CDATA[this.variables.x>50]]></bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="f4" sourceRef="decision" targetRef="Task4">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression" language="javascript"><![CDATA[this.variables.x<50]]></bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:userTask id="Task4">
      <bpmn:incoming>f4</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_0d6etvm</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:endEvent id="end2">
      <bpmn:incoming>SequenceFlow_0d6etvm</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="SequenceFlow_0d6etvm" sourceRef="Task4" targetRef="end2" />
    <bpmn:sequenceFlow id="SequenceFlow_08dd7y2" sourceRef="Task3" targetRef="sub1" />
    <bpmn:subProcess id="sub1">
      <bpmn:incoming>SequenceFlow_08dd7y2</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_1qxjnxw</bpmn:outgoing>
      <bpmn:startEvent id="StartEvent_02jk9c8">
        <bpmn:outgoing>SequenceFlow_19gop1o</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:task id="Task5">
        <bpmn:incoming>SequenceFlow_19gop1o</bpmn:incoming>
        <bpmn:outgoing>SequenceFlow_0l52das</bpmn:outgoing>
      </bpmn:task>
      <bpmn:sequenceFlow id="SequenceFlow_19gop1o" sourceRef="StartEvent_02jk9c8" targetRef="Task5" />
      <bpmn:endEvent id="EndEvent_1kq7h55">
        <bpmn:incoming>SequenceFlow_0l52das</bpmn:incoming>
      </bpmn:endEvent>
      <bpmn:sequenceFlow id="SequenceFlow_0l52das" sourceRef="Task5" targetRef="EndEvent_1kq7h55" />
    </bpmn:subProcess>
    <bpmn:endEvent id="end1">
      <bpmn:incoming>SequenceFlow_1qxjnxw</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="SequenceFlow_1qxjnxw" sourceRef="sub1" targetRef="end1" />
  </bpmn:process>

I add a listener for the usertask Task5, but it never be triggered.

paed01 commented 7 years ago

Since all ids within a definition must be unique you can listen for start-Task5:

const BpmnEngine = require('bpmn-engine');
const listener = new EventEmitter();

listener.on('start-Task5', (task) => {
  console.log(`${task.id} has started`);
});

listener.on('wait', (task) => {
  console.log(`${task.type} <${task.id}> is waiting for signal`);
  task.signal();
});

const engine = new BpmnEngine.Engine({source: aboveSource});
engine.execute({
  listener,
  variables: {
    x: 51
  }
}, (err, definitions) => {
  console.log(err, definitions)
});
engine.once('end', () => {
  console.log('completed');
});

Just a friendly remark: What if x = 50?

zhaochy1990 commented 7 years ago

thanks a lot, it works. I want to use your lib in my project, this is just a test.