1.画流程图并部署
流程图如下:
2.部署流程图后,在需求发起节点设置需求发起节点和拆任务节点的审批人,并根据拆任务拆了多少个任务设置排期节点有几个人审批,排期节点的审批人是拆任务节点中指定的,模型训练节点的审批人是在排期节点设置的。也就是说需要在排期节点需要实现用户任务多实例。
3.通过监听器实现用户实例多任务,首先,在拆任务节点设置监听器,监听当拆任务完成后,设置排期节点的审批人,如下图所示
4.在排期节点设置多实例参数,如下图所示
4.1在mainconfig中配置如下
4.2在multi instance中配置如下
流程图都配置好之后,部署
在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); } }
|
这时,当拆任务节点执行完之后,会在排期节点根据拆任务节点产生的任务数生成单个用户多个实例。
设置模型训练节点的审批人:
通过设置变量实现,流程图设置,如下图
通过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,然后报错空指针。