flowable 会签和或签的实现 任务多实例

会签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,需全部同意之后,审批才可到下一审批节点;

或签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,只要其中任意一人审批即可到下一审批节点。

如果一个活动是多实例,将通过在该活动底部的三条短线表示。三条线代表实例会并行执行,而三条线代表顺序执行。

 

用户任务配置多实例类型、集合、完成条件、元素变量、分配用户

完成条件通过这几个内置变量来决定

nrOfInstances一共有多少个实例
nrOfCompletedInstances已经完成的实例个数
nrOfActiveInstances未完成的实例个数

会签全部完成:

${nrOfCompletedInstances==nrOfInstances}

或签1人完成:

${nrOfCompletedInstances>=1}

由于我的前端是多个流程公用一个页面,传入参数名称固定的,所以使用循环加反射获取了一下选择的审批人,再填入list中
 

/**
 * 服务实现类
 * 通用审批流(平行&或签)
 * @author Chill
 */
@Slf4j
@Service
@AllArgsConstructor
public class ParallelAuditServiceImpl extends BaseServiceImpl<AuditMapper, ProcessAudit> implements IParallelAuditService {

	private final IFlowClient flowClient;

	@Override
	@Transactional(rollbackFor = Exception.class)
	// @GlobalTransactional
	public boolean startProcess(ProcessAudit audit) {
		String businessTable = FlowUtil.getBusinessTable(ProcessConstant.PARALLEL_AUDIT_KEY);
		if (Func.isEmpty(audit.getId())) {
			// 保存receive
			audit.setApplyTime(DateUtil.now());
			save(audit);
			List<String> taskUserList = new ArrayList<>();
			Method method=null;
			for (int i = 1; i <= 10; i++) {
				try {
					 method = audit.getClass().getMethod("getTaskUser" + i);
					if (Func.isNotEmpty(method.invoke(audit))) {
						taskUserList.add(TaskUtil.getTaskUser((String) method.invoke(audit)));
					} else {
						break;
					}
				} catch (NoSuchMethodException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}
			// 启动流程
			Kv variables = Kv.create()
				.set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserName())
				//taskUserList 为选择的审批人列表
				.set("taskUserList", taskUserList)
				//单据id
				.set("auditId", audit.getAuditId())
				//单据No
				.set("auditNo", audit.getAuditNo())
				//单据类型 领用、借用等
				.set("auditType", audit.getAuditType());
			R<BladeFlow> result = flowClient.startProcessInstanceById(audit.getProcessDefinitionId(), FlowUtil.getBusinessKey(businessTable, String.valueOf(audit.getId())), variables);
			if (result.isSuccess()) {
				log.debug("流程已启动,流程ID:" + result.getData().getProcessInstanceId());
				// 返回流程id写入receive
				audit.setProcessInstanceId(result.getData().getProcessInstanceId());
				updateById(audit);
			} else {
				throw new ServiceException("开启流程失败");
			}
		} else {

			updateById(audit);
		}
		return true;
	}

}

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flowable 中,要实现会签实例任务的退回,可以通过以下步骤进行操作: 1. 首先,创建一个实现了 MultiInstanceActivityBehavior 接口的自定义活动行为类。这个类将负责处理会签实例任务的具体逻辑。 ```java public class MyMultiInstanceActivityBehavior implements MultiInstanceActivityBehavior { // 实现 MultiInstanceActivityBehavior 接口的方法 // ... } ``` 2. 在该类中,实现 `leave` 方法,该方法负责处理会签任务每个实例完成后的操作。在这个方法中,可以判断每个实例的完成情况,并根据需要进行退回操作。 ```java @Override public void leave(ActivityExecution execution) { // 判断当前实例是否需要退回 if (shouldReject(execution)) { // 获取会签任务的执行实例 ExecutionEntity multiInstanceExecution = (ExecutionEntity) execution.getParent(); // 将当前实例退回到上一步 CommandContext commandContext = Context.getCommandContext(); commandContext.getExecutionEntityManager().deleteChildExecutions(execution.getParent()); commandContext.getAgenda().planContinueMultiInstanceOperation(multiInstanceExecution); } else { // 正常离开会签任务 super.leave(execution); } } ``` 3. 将自定义的活动行为类应用到会签实例任务的流程定义中。在 BPMN 文件中,使用 `class` 属性指定自定义类的全限定名。 ```xml <userTask id="multiInstanceTask" name="Multi-Instance Task" flowable:activiti:class="com.example.MyMultiInstanceActivityBehavior" /> ``` 通过以上步骤,就可以在 Flowable实现会签实例任务的退回功能。自定义的活动行为类中的 `leave` 方法可以根据业务逻辑判断是否需要退回,并执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值