activiti7实现完成当前节点后下个节点可以多个人处理,即会签功能

 

1.画流程图并部署

流程图如下:

 

 

activiti7实现完成当前节点后下个节点可以多个人处理,即会签功能

 

 

 

2.部署流程图后,在需求发起节点设置需求发起节点和拆任务节点的审批人,并根据拆任务拆了多少个任务设置排期节点有几个人审批,排期节点的审批人是拆任务节点中指定的,模型训练节点的审批人是在排期节点设置的。也就是说需要在排期节点需要实现用户任务多实例。

3.通过监听器实现用户实例多任务,首先,在拆任务节点设置监听器,监听当拆任务完成后,设置排期节点的审批人,如下图所示 

 

activiti7实现完成当前节点后下个节点可以多个人处理,即会签功能

 

 

4.在排期节点设置多实例参数,如下图所示

4.1在mainconfig中配置如下

 

 

activiti7实现完成当前节点后下个节点可以多个人处理,即会签功能

 

4.2在multi instance中配置如下

 

 

 

activiti7实现完成当前节点后下个节点可以多个人处理,即会签功能

 

 

流程图都配置好之后,部署

在Java代码中实现监听器

package com.zk.config;

import com.zk.common.utils.SpringUtil;
import com.zk.domain.XqRequirement;
import com.zk.domain.XqTask;
import com.zk.service.IRequirementService;
import com.zk.service.IXqTaskService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
@Component
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("执行任务完成========="+delegateTask.getName());
IRequirementService requirementService = SpringUtil.getObject(IRequirementService.class);
IXqTaskService xqTaskService = SpringUtil.getObject(IXqTaskService.class);
XqRequirement requirement = requirementService.selectByInstId(delegateTask.getProcessInstanceId());
List<XqTask> xqTaskList = xqTaskService.findXqTaskList(requirement.getId(), null);

//添加会签的人员,这里可以根据自己的业务逻辑去动态获取列表
List<String> assigneeList = new ArrayList<String>();
xqTaskList.forEach(t->{
assigneeList.add(t.getLeader());
});
delegateTask.setVariable("daterList",assigneeList);
}
}
 

 

这时,当拆任务节点执行完之后,会在排期节点根据拆任务节点产生的任务数生成单个用户多个实例。

设置模型训练节点的审批人:

通过设置变量实现,流程图设置,如下图

 

activiti7实现完成当前节点后下个节点可以多个人处理,即会签功能

 

 

通过Java设置变量,代码如下:

package com.zk.config;

import com.zk.common.utils.SpringUtil;
import com.zk.domain.XqRequirement;
import com.zk.domain.XqTask;
import com.zk.service.IRequirementService;
import com.zk.service.IXqTaskService;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class TestServiceListener{
public String getUser(String requirementId) {
IRequirementService requirementService = SpringUtil.getObject(IRequirementService.class);
IXqTaskService xqTaskService = SpringUtil.getObject(IXqTaskService.class);
XqRequirement requirement = requirementService.getRequirementById(requirementId);
System.out.println("任务完成========="+requirementId);
List<XqTask> xqTaskList = xqTaskService.findXqTaskList(requirement.getId(), "模型训练");
return xqTaskList.get(0).getLeader();
}
}

到此复杂节点的审批人都设置完了。

在上述代码实现中用到工具类SpringUtil,代码如下:

package com.zk.common.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtil implements ApplicationContextAware {

/**
* 当前IOC
*
*/
private static ApplicationContext applicationContext;
/**
* 设置applicationContext
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

/**
* 从当前IOC获取bean
*/
public static <T> T getObject(Class<T> clazz){
return applicationContext.getBean(clazz);
}

public static void showClass(){
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for(String beanDefinitionName : beanDefinitionNames){
System.out.println(beanDefinitionName);
}
}
}

因为springcloud项目中加载顺序是listener -> filter -> servlet,而在设置审批人功能中,需要在listener中调用servlet,如果不使用SpringUtil工具类,会一直加载不到servlet,然后报错空指针。
上一篇:Activiti7 启动流程实例


下一篇:activiti7__02ProcessDefinition