activiti7并行网关,一个审批通过,一个审批不通过,但是也要走完流程,这个如何画流程图

本文讨论了一个业务流程,其中涉及两个部门的审批。为了确保流程的高效结束,无论是两个部门都同意还是任一部门否决,都需要终止整个流程。实现这一逻辑的关键在于设计正确的图结构和控制代码。可以使用条件分支和并发处理来确保一旦有任何部门作出决定,流程就能及时停止。

目录

问题

我有一个图中的业务,需要两个部门审批都通过才结束,但是如果其中任意一个部门不同意的话,也要结束整个流程,请问这个图要怎么画,代码逻辑怎么实现呢。

在这里插入图片描述

实现

在这里插入图片描述

<think>好的,我现在需要解决用户的问题,即如何创建一个BPMN文件,使用Activiti并行网关实现只要有一个分支通过,整个流程就停止的功能。首先,我得回忆一下并行网关在BPMN中的作用以及用户提到的引用内容。 根据引用[1],并行网关在汇聚时会等待所有进入顺序流的分支到达,这与包含网关同。但用户的需求是只要有一个分支通过,流程就停止,这似乎与并行网关的默认行为符,因为并行网关会等待所有分支完成。这里可能存在理解上的偏差,或者用户需要其他方式来实现。 过用户明确提到使用并行网关,所以可能需要结合其他元素。例如,在并行网关的分支中,如果某个任务失败,可能需要终止整个流程。这时,可以考虑在每个分支中加入条件判断,如果条件满足,则触发终止事件。 参考引用[2],网关类型中的排他网关可以用于条件分支,而并行网关用于多分支同时执行。但用户希望的是并行执行的分支中任何一个失败则停止,这可能需要结合错误边界事件或终止事件。 另外,引用[3]中的代码示例展示了如何部署和启动流程,但关键还是BPMN的结构设计。可能的思路是:在并行网关后的每个分支中,如果某个任务通过,触发终止事件,这样整个流程实例会被终止。 因此,BPMN的结构可能如下:开始事件 → 并行网关(分裂)→ 多个服务任务(每个分支)→ 并行网关(汇聚)。但为了实现在任一分支失败时停止,每个分支的任务后面可以连接一个终止事件,当任务满足条件时抛出错误,触发终止。 过,并行网关的汇聚需要所有分支都到达才能继续,如果某个分支没有完成,流程会一直等待,这可能导致流程无法终止。因此,可能需要使用终止事件来立即结束整个流程,而是依赖网关的汇聚。 最终,正确的做法可能是在每个分支的任务后设置一个排他网关,判断是否通过,如果通过则导向终止事件,否则继续到汇聚并行网关。但这样如果有一个分支通过,流程实例会被终止,其他分支即使完成也无法汇聚,从而实现停止流程的效果。 需要验证这种设计是否符合Activiti的行为,当终止事件触发时,整个流程实例是否立即终止,无论其他分支的状态如何。根据BPMN规范,终止事件确实会结束整个流程实例,因此这可能是一个可行的解决方案。 总结步骤:使用并行网关分裂多个分支,每个分支执行任务后判断是否通过,如果通过则触发终止事件,否则继续到汇聚并行网关。但汇聚网关可能会被到达,因为终止事件会结束流程。因此,实际结构可能需要汇聚网关,而是每个分支独立判断,任一失败则终止整个流程。</think>为了通过Activiti并行网关实现“任一分支通过则流程停止”,需结合**终止事件**控制流程中断。以下是具体实现步骤和BPMN示例: --- ### **BPMN文件设计思路** 1. **使用并行网关拆分多个分支**:同时执行所有分支任务。 2. **每个分支添加条件判断**:通过排他网关检查任务是否“通过”。 3. **触发终止事件**:任一分支满足条件时,立即终止整个流程实例。 --- ### **BPMN 2.0 XML示例** ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://example.com/parallel-gateway-demo"> <process id="parallelGatewayDemo" name="并行网关任一分支失败终止流程示例"> <!-- 开始事件 --> <startEvent id="start" name="开始"/> <!-- 分裂并行网关 --> <parallelGateway id="forkGateway" name="分裂并行网关"/> <!-- 并行分支1 --> <sequenceFlow id="flow1" sourceRef="start" targetRef="forkGateway"/> <!-- 分支1:任务A --> <sequenceFlow id="flowToTaskA" sourceRef="forkGateway" targetRef="taskA"/> <serviceTask id="taskA" name="审核A" activiti:class="com.example.CheckTaskA"/> <!-- 分支1条件判断 --> <sequenceFlow id="flowToExclusiveA" sourceRef="taskA" targetRef="exclusiveGatewayA"/> <exclusiveGateway id="exclusiveGatewayA" name="判断A是否通过"/> <sequenceFlow id="flowA_pass" sourceRef="exclusiveGatewayA" targetRef="joinGateway"> <conditionExpression xsi:type="tFormalExpression">${taskAPassed}</conditionExpression> </sequenceFlow> <sequenceFlow id="flowA_fail" sourceRef="exclusiveGatewayA" targetRef="terminateEnd"> <conditionExpression xsi:type="tFormalExpression">${!taskAPassed}</conditionExpression> </sequenceFlow> <!-- 分支2:任务B --> <sequenceFlow id="flowToTaskB" sourceRef="forkGateway" targetRef="taskB"/> <serviceTask id="taskB" name="审核B" activiti:class="com.example.CheckTaskB"/> <!-- 分支2条件判断 --> <sequenceFlow id="flowToExclusiveB" sourceRef="taskB" targetRef="exclusiveGatewayB"/> <exclusiveGateway id="exclusiveGatewayB" name="判断B是否通过"/> <sequenceFlow id="flowB_pass" sourceRef="exclusiveGatewayB" targetRef="joinGateway"> <conditionExpression xsi:type="tFormalExpression">${taskBPassed}</conditionExpression> </sequenceFlow> <sequenceFlow id="flowB_fail" sourceRef="exclusiveGatewayB" targetRef="terminateEnd"> <conditionExpression xsi:type="tFormalExpression">${!taskBPassed}</conditionExpression> </sequenceFlow> <!-- 终止事件 --> <terminateEventDefinition id="terminateEndEventDef"/> <endEvent id="terminateEnd" name="流程终止"> <terminateEventDefinition/> </endEvent> <!-- 汇聚并行网关(实际会到达,仅占位) --> <parallelGateway id="joinGateway" name="汇聚并行网关"/> <sequenceFlow id="flowToEnd" sourceRef="joinGateway" targetRef="end"/> <endEvent id="end" name="正常结束"/> </process> </definitions> ``` --- ### **关键逻辑说明** 1. **分裂并行网关**:启动后同时执行`taskA`和`taskB`。 2. **条件判断**: - 每个分支通过排他网关检查变量(如`taskAPassed`、`taskBPassed`)。 - 若条件为`false`,流向终止事件。 3. **终止事件**:触发后**立即终止整个流程实例**,无论其他分支状态如何[^1][^4]。 4. **汇聚网关占位**:实际因终止事件会到达,但BPMN结构需保持完整。 --- ### **Java代码调用示例** ```java // 部署流程定义 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("parallel_gateway_demo.bpmn20.xml") .deploy(); // 启动流程实例并设置变量 Map<String, Object> variables = new HashMap<>(); variables.put("taskAPassed", true); variables.put("taskBPassed", false); // 分支B失败,触发终止 ProcessInstance instance = runtimeService.startProcessInstanceByKey("parallelGatewayDemo", variables); // 验证流程状态(应已被终止) ProcessInstance terminatedInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(instance.getId()) .singleResult(); assertNull(terminatedInstance); // 流程实例存在表示已终止 ``` --- ### **注意事项** - **变量传递**:确保每个分支任务返回`taskXPassed`变量。 - **终止事件权限**:需配置权限模型允许终止操作[^3]。 - **日志监控**:终止事件会记录`ACT_HI_PROCINST`表中流程状态为`ENDED`[^3]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一写代码就开心

你的打赏将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值