因为flowable流程对于会签流转过程控制都是自动的,但要进行人为中间或后期干预,必须要用到执行监控器,在监控器中进行流程过程与监控,对满足要求进行处理。

1、首先在会签流程进行执行监控器的增加

基于jeecgboot的flowable复杂会签加用户选择流程实现_服务器

其中类名 com.nbcio.modules.flowable.listener.MutiInstanceExecutionListener

目前先只实现多实例会签的监控处理

2、在程序里增加相应的执行监控器类

/**
* 多实例会签审核结果全局监听器
* @author nbacheng
* @date 2022-09-22
*/
@Slf4j
@Component("MutiInstanceExecutionListener")
public class MutiInstanceExecutionListener implements ExecutionListener, ApplicationContextAware { private static final long serialVersionUID = 1L;
private static ApplicationContext applicationContext;
@Override
public void notify(DelegateExecution execution) {
// TODO Auto-generated method stub
RedisUtil redisUtil = applicationContext.getBean(RedisUtil.class);
FlowNode flowNode = (FlowNode) execution.getCurrentFlowElement();
if(Objects.nonNull(flowNode)) {
if(flowNode instanceof UserTask ){
UserTask userTask = (UserTask) flowNode;
MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
if (Objects.nonNull(multiInstance)) {
if (Objects.nonNull(execution.getVariable("nrOfCompletedInstances"))) {
int nrOfCompletedInstances = (int) execution.getVariable("nrOfCompletedInstances");
int nrOfInstances = (int) execution.getVariable("nrOfInstances");
if(multiInstance.isSequential()) {
if((nrOfCompletedInstances + 1) >= nrOfInstances){//结束会签流程前一个节点提示进行用户选择

redisUtil.set(CommonConstant.MUTIINSTANCE_NEXT_FINISH + execution.getProcessInstanceId(), execution.getProcessInstanceId());
}
}
else if(multiInstance.getCompletionCondition().equals("${nrOfCompletedInstances>=nrOfInstances}")) {
if((nrOfCompletedInstances + 1) >= nrOfInstances){//结束会签流程前一个节点提示进行用户选择
redisUtil.set(CommonConstant.MUTIINSTANCE_NEXT_FINISH + execution.getProcessInstanceId(), execution.getProcessInstanceId());
}
}
else if(multiInstance.getCompletionCondition().startsWith("${nrOfCompletedInstances/nrOfInstances>=")) {//后续根据需要实现

}
/*log.info(execution.getId() + " - " + execution.getProcessInstanceId()
+ " - " + execution.getEventName()
+ " - " + execution.getCurrentActivityId()
+ " - " + execution.getProcessInstanceBusinessKey());
log.info("UserExecutionListener会签方式:" + multiInstance.isSequential());
log.info("UserExecutionListener会签条件:" + multiInstance.getCompletionCondition());
log.info("UserExecutionListener总会签数:" + execution.getVariable("nrOfInstances"));
log.info("UserExecutionListener激活的会签数:" + execution.getVariable("nrOfActiveInstances"));
log.info("UserExecutionListener已经完成会签数:" + execution.getVariable("nrOfCompletedInstances"));*/
}
}

}
}

} @Override
public void setApplicationContext(ApplicationContext applicationContextNew) throws BeansException {
// TODO Auto-generated method stub
applicationContext = applicationContextNew;
}
}

上面自己类没办法注入,所以采用ApplicationContextAware方式

同时对下一个任务是进行redis数据读取判断,同时前端也做一下处理

具体流程图与流程流转情况如下:

基于jeecgboot的flowable复杂会签加用户选择流程实现_服务器_02