会签节点—非抢占式

1.实现代码
需求:
流程执行到会签节点,给用户选中的会签人发送待办信息。首先,因为是直接选中的会签人,所以无需弹框根据组织机构再选择会签人;其次,每一个会签人都要处理会签,非抢占式。

分析:
这里写图片描述
实现ExtendBinder接口需要弹框选择会签人,不符合需求。
实现GroupExtendBinder接口则是抢占式,也不符合需求。

解决方式:
这里写图片描述
虽然仍是实现GroupExtendBinder接口,但是通过上图这种方式,把每一个会签人当成一个组,然后再发送待办消息,每一组用户都要处理,就相当于”非抢占式“操作。

2.流程上的会签节点
这里写图片描述
会签节点属于流程的一部分,但是会签节点结束后必须回到选择会签的流程节点,即回到原地,不会触发执行下一步流程。
这里写图片描述
会签相当于分发,所以在会签的前一个节点要合并节点

### 实现 Flowable 自定义会签节点的方法 在 Flowable 中,会签节点通常指的是需要多个用户完成的任务节点,这些任务可以是并行或串行执行的。实现自定义会签节点的核心在于利用多实例任务机制,并结合流程变量和业务逻辑来动态控制任务的分配和完成条件。 #### 动态配置会签人员 会签节点的用户任务可以通过多实例(MultiInstance)机制动态创建,并通过任务候选人(Candidate Users)进行配置。例如,在流程设计时,可以动态设置候选人列表,使得每个会签任务由指定的用户处理。 ```java // 通过 RepositoryService 获取流程定义信息,并动态修改多实例设置 RepositoryService repositoryService = processEngine.getRepositoryService(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("myProcessKey") .singleResult(); // 获取流程定义中的 BPMN 模型 BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); // 遍历流程模型中的节点,找到需要修改的会签节点 for (Process process : bpmnModel.getProcesses()) { for (FlowElement flowElement : process.getFlowElements()) { if (flowElement instanceof UserTask) { UserTask userTask = (UserTask) flowElement; if ("signTask".equals(userTask.getId())) { // 设置为并行多实例 MultiInstanceLoopCharacteristics multiInstance = new MultiInstanceLoopCharacteristics(); multiInstance.setCollectionString("${candidateUsers}"); multiInstance.setElementVariable("assignee"); multiInstance.setSequential(false); // 并行模式 userTask.setLoopCharacteristics(multiInstance); } } } } // 重新部署流程定义 Deployment deployment = repositoryService.createDeployment() .addBpmnModel("modifiedProcess.bpmn", bpmnModel) .deploy(); ``` #### 动态控制会签完成条件 会签任务的完成条件可以根据业务需求进行动态配置,例如需要半数通过、全部通过等。可以通过流程变量来记录会签状态,并在任务完成时更新变量值,最终判断是否满足通过条件。 ```java // 在任务完成时更新会签计数器 TaskService taskService = processEngine.getTaskService(); RuntimeService runtimeService = processEngine.getRuntimeService(); String taskId = "任务ID"; taskService.complete(taskId); // 获取当前流程实例的执行ID String executionId = taskService.createTaskQuery().taskId(taskId).singleResult().getExecutionId(); // 获取当前会签计数 String currentSignCount = StringUtils.defaultString( runtimeService.getVariable(executionId, "signCount").toString(), "0"); // 更新会签计数 runtimeService.setVariable(executionId, "signCount", Integer.parseInt(currentSignCount) + 1); // 获取会签总人数 int totalSigners = (int) runtimeService.getVariable(executionId, "totalSigners"); // 判断是否满足通过条件(例如半数通过) if (Integer.parseInt(currentSignCount) + 1 >= totalSigners / 2 + 1) { // 触发流程继续执行 runtimeService.setVariable(executionId, "approvalDecision", true); } ``` #### 使用任务监听器处理会签逻辑 Flowable 提供了任务监听器(Task Listener)功能,可以在任务的生命周期事件中插入自定义逻辑。例如,在任务创建时动态分配候选人,在任务完成后更新流程变量。 ```java public class CustomTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { if ("create".equals(delegateTask.getEventName())) { // 动态设置候选人 delegateTask.addCandidateUser("user1"); delegateTask.addCandidateUser("user2"); } else if ("assignment".equals(delegateTask.getEventName())) { // 任务分配时的逻辑 } else if ("complete".equals(delegateTask.getEventName())) { // 任务完成时更新流程变量 } } } ``` 在 BPMN 文件中配置任务监听器: ```xml <userTask id="signTask" name="会签任务"> <extensionElements> <flowable:taskListener event="create" class="com.example.CustomTaskListener" /> </extensionElements> </userTask> ``` #### 使用并行网关汇总会签结果 在会签任务完成后,可以使用并行网关(Parallel Gateway)来汇总会签结果,并根据流程变量的值决定后续流程的走向。 ```xml <parallelGateway id="gateway1" /> <sequenceFlow id="flow1" sourceRef="signTask" targetRef="gateway1" /> <sequenceFlow id="flow2" sourceRef="gateway1" targetRef="decisionTask"> <conditionExpression xsi:type="tFormalExpression"> ${approvalDecision == true} </conditionExpression> </sequenceFlow> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值