获取Activiti所有用户任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取Activiti所有用户任务相关的知识,希望对你有一定的参考价值。

最近接到一个用户需求:

    要求在流程部署完成后可通过手动配置各用户任务的处理候选组,来控制流程走向。


解决此需求要解决以下问题:

    1,流程部署完成后,尚未有流程实例,如何获取所有用户任务?

    2,设置完各节点的处理候选组后,如何动态分配?


第二个问题好解决,通过设置任务监听器,来获取当前的用户任务KEY,从配置表中获取处理组进行设置。


下面来解决第一个问题,代码如下:

@Override
	public List<ProcessTaskVO> findProcessUserTaskByPdId(String processDefinitionId){
		List<ProcessTaskVO> processTasks = new ArrayList<ProcessTaskVO>();
		if(StringUtils.isEmpty(processDefinitionId)){
			return processTasks;
		}
		ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
		if(pd == null){
			return processTasks;
		}else{
			return findProcessUserTaskByPd(pd);
		}
	}
	
	private  List<ProcessTaskVO> findProcessUserTaskByPd(ProcessDefinition pd){
		List<ProcessTaskVO> processTasks = new ArrayList<ProcessTaskVO>();
		ProcessTaskVO processTask = null;
		String resName = pd.getResourceName();
		InputStream resouceStream =repositoryService.getResourceAsStream(pd.getDeploymentId(), resName);
		XMLInputFactory xif = XMLInputFactory.newInstance();  
		InputStreamReader in;  
		XMLStreamReader xtr;  
		try {  
		    in = new InputStreamReader(resouceStream, "UTF-8");  
		    xtr = xif.createXMLStreamReader(in);  
		    BpmnModel model = new BpmnXMLConverter().convertToBpmnModel(xtr);  
		    Collection<FlowElement> flowElements = model.getMainProcess().getFlowElements();
		    for(FlowElement e : flowElements) { 
		    	String clazz = e.getClass().toString();
		    	if(clazz.endsWith("UserTask")){
		    		processTask = new ProcessTaskVO();
		    		
		    		processTask.setTaskKey(e.getId());
		    		processTask.setTaskName(e.getName());
		    		
		    		processTasks.add(processTask);
		    	}
		    }  
		} catch (XMLStreamException e) {  
		    e.printStackTrace();  
		} catch (UnsupportedEncodingException e) {  
		    e.printStackTrace();  
		} 
	
		return processTasks;		
	}


编码过程中的问题:

在使用任务监听器过程中,发现监听器中无法自动注入自己service,解决方法:


1,确保包扫描能够扫描到任务监听器

    

<!-- 扫描所有监听 -->
	<context:component-scan base-package="com.xxxx.**.listener" />

2,配置任务监听器

技术分享

      其中${applyTaskListener},为任务监听器的bean名称

3,任务监听器写法:

@Service("applyTaskListener")
public class ApplyTaskListener implements TaskListener{

	/**
	 * 
	 */
	private static final long serialVersionUID = -7394227383264070902L;
	
	/**
	 * 用户查询流程用户任务的处理组的service
	 */
	@Autowired
	private IProcessTaskRoleService processTaskRoleService;

	
	@Override
	public void notify(DelegateTask delegateTask) {
		String taskKey = delegateTask.getTaskDefinitionKey();
		String processDefinitionId = delegateTask.getProcessDefinitionId();
		/**
		* 此变量含有流程发起人信息
		*/
		Map<String,Object> variables = delegateTask.getVariables();
				
		ProcessTaskRoleVO processTaskRole = processTaskRoleService.findByTaskKeyAndPdId(taskKey, processDefinitionId);
		//如未进行配置则处理人为流程发起人
		if(processTaskRole == null){
			delegateTask.setAssignee(variables.get("流程发起人在变量MAP中的key").toString());
		}else{
			RoleVO role = processTaskRole.getRole();
			if(role == null){
				//如配置的角色不存在则处理人为流程发起人
				delegateTask.setAssignee(variables.get("流程发起人在变量MAP中的key").toString());
			}else{
				delegateTask.addCandidateGroup(role.getId().toString());
			}
		}
		
		
	}

}


本文出自 “蓝色幽默” 博客,请务必保留此出处http://bluehumor.blog.51cto.com/2148378/1956007

以上是关于获取Activiti所有用户任务的主要内容,如果未能解决你的问题,请参考以下文章

activiti 怎么获取变量

activiti动态获取当前流程节点的操作按钮

activiti 挂起任务能查到吗

ACTIVITI如何获取下一步节点

activiti获取流程图中的所有信息包括变量名

activiti怎么通过taskid查询executionid