最近接到一个用户需求:

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


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

    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;		
	}

由以上代码可以获取到所有的用户任务,剩下的就是把这些信息存到数据库中,然后写一个配置页面,配置用户任务的处理组是什么就OK了。


下面是ProcessTaskVO

public class ProcessTaskVO extends BaseVO {

	
	/**
	 * 
	 */
	private static final long serialVersionUID = 940722257892628250L;


	//流程实例ID
	private String processInsId;	
	
	private String processDefinitionId;
	
	//任务名称
	private String taskName;
	//任务key
	private String taskKey;
	//任务ID
	private String taskId;
	
	private UserVO handleUser;
	//认领时间	
	private Date claimTime;
	
	private Date startTime;
	
	private Date endTime;
	
	private Map<String, Object> processVariables;


	public String getTaskName() {
		return taskName;
	}

	public void setTaskName(String taskName) {
		this.taskName = taskName;
	}

	public String getTaskKey() {
		return taskKey;
	}

	public void setTaskKey(String taskKey) {
		this.taskKey = taskKey;
	}

	public String getTaskId() {
		return taskId;
	}

	public void setTaskId(String taskId) {
		this.taskId = taskId;
	}

	public String getProcessInsId() {
		return processInsId;
	}

	public void setProcessInsId(String processInsId) {
		this.processInsId = processInsId;
	}

	
	public Date getClaimTime() {
		return claimTime;
	}

	public void setClaimTime(Date claimTime) {
		this.claimTime = claimTime;
	}

	public Date getStartTime() {
		return startTime;
	}

	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}

	public Date getEndTime() {
		return endTime;
	}

	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}

	public Map<String, Object> getProcessVariables() {
		return processVariables;
	}

	public void setProcessVariables(Map<String, Object> processVariables) {
		this.processVariables = processVariables;
	}

	public String getProcessDefinitionId() {
		return processDefinitionId;
	}

	public void setProcessDefinitionId(String processDefinitionId) {
		this.processDefinitionId = processDefinitionId;
	}

	public UserVO getHandleUser() {
		return handleUser;
	}

	public void setHandleUser(UserVO handleUser) {
		this.handleUser = handleUser;
	}


	
}


下面是用户任务与处理组的对应关系表:

CREATE TABLE `xxx_process_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `task_key` varchar(255) DEFAULT NULL COMMENT '用户任务业务主键',
  `task_name` varchar(255) DEFAULT NULL COMMENT '用户任务名称',
  `timeout` int(11) DEFAULT NULL COMMENT '此任务的超时时间',
  `role_id` int(11) DEFAULT NULL COMMENT '此任务所分配的角色ID',
  `processdefinition_id` varchar(255) DEFAULT NULL COMMENT '流程定义ID',
  `create_date` date DEFAULT NULL COMMENT '创建时间',
  `create_user` varchar(50) DEFAULT NULL COMMENT '创建人',
  `update_date` date DEFAULT NULL COMMENT '更新时间',
  `update_user` varchar(50) DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


编码过程中的问题:

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


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

    

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

2,配置任务监听器

wKioL1mQ-iXSV9OuAABVnPzt1WM059.png-wh_50

      其中${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());
			}
		}
		
		
	}

}