1. 程式人生 > >Activiti技術流程的啟動與終止

Activiti技術流程的啟動與終止

1、Activity流程啟動和終止的方法如下:


    /**
     * 通過 流程的key 啟動流程 
     * @param defintionkey
     * @param params 包含使用者id
     * @return
     */
    public ProcessInstance startProcessInstanceByKey(String defintionkey, Map<String, Object> params) {
    	//dedmenlopmentProcess(defintionkey);
    	Long userId = Securitys.getAuthenticationUser().getId();//獲取當前登入使用者id(方法可能不同)
    	if(params == null) {
    		params = new HashMap<String, Object>();
    	}
    	params.put("startUserId", userId.toString());
    	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(defintionkey, params);
    	return processInstance;
    }
    
    public void dedmenlopmentProcess(String defKey) {	
    	long count = runtimeService.createProcessInstanceQuery().processDefinitionKey(defKey).count();
    	if(count <= 0) {
    		repositoryService.createDeployment().
    		addClasspathResource(/*這裡一般放流程路徑*/).deploy();
    	}	
    }
    
    /**
     *  完成當前節點
     * @param taskId
     * @param params 包含使用者id
     */
    public void completeCurrentTask(String taskId, Map<String, Object> params) {
    	taskService.complete(taskId, params);
    	//taskService.claim(taskId, userId);
    }
    
    public void completeTask(Task task, Map<String, Object> variables){
    	runtimeService.setVariablesLocal(task.getExecutionId(), variables);
    	taskService.complete(task.getId());
    }
    
    /**
     * 該方法我自己用到少
     * 認領任務  true : 成功!   false: 失敗
     * @param taskId
     * @param userId
     * @return
     */
    public boolean claimTheTask(String taskId, String userId) {
    	//Long userId = Securitys.getAuthenticationUser().getId();
    	try {
    		taskService.claim(taskId, userId);
    		return true;
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    		return false;
    	}
    }
    
    /**
     * @see   is Acitiviti
     * 
     * 根據使用者id 獲取該使用者在某個流程例項的能夠接受的任務列表
     * @param userId
     * @param pageParams
     * @return 
     */
    public List<Task> findTaskByProcessAndCandidate(String userId,String processId){
    	TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(processId).taskCandidateOrAssigned(userId).active();
    	List<Task> resultTask = taskQuery.list();
    	return resultTask;
    }
    
    /**
     * 啟用任務
     * @param processId
     */
    @AjaxRpcMethod
    public void activeTaskByProcessId(String processId){
    	runtimeService.activateProcessInstanceById(processId);
    }
    
    /**
     * 掛起任務
     * @param processId
     */
    @AjaxRpcMethod
    public void suspendTaskByProcessId(String processId){
    	runtimeService.suspendProcessInstanceById(processId);
    }
    
    /**
     * 完結任務
     * @param processId
     */
    @AjaxRpcMethod
    public void deleteTaskByProcessId(String processId){
    	runtimeService.deleteProcessInstance(processId, "結束");
    }

2、接下來就是方法的呼叫 ,例項進入流程的方法我分開為兩步寫(實際情況下可以合併的),方法如下:

/**
 * 第一步
 * 啟動流程
 * @param user 登入使用者
 * @param commentAccessory 進入流程的例項
 * @param nextUserId 指定的下一個使用者id
 * @param userIds
 * @param processName 流程名稱
 * @param resultId
 * @return
 */
public void startOrEnterActiviti(User user, CommentAccessory commentAccessory, String nextUserId,  String processName){
	
	Map<String, Object> params = new HashMap<String, Object>();
	params.put("userId", user.getId().toString());
	params.put("result", resultId);
	
	//通過 流程的key 啟動流程 (該方法在上面內容中已寫好)
	ProcessInstance process = startProcessInstanceByKey(processName, params);
	
	//根據使用者id和流程id 獲取該使用者在某個流程例項的能夠接受的任務列表 (該方法在上面內容中已寫好)
	List<Task> taskList = findTaskByProcessAndCandidate(user.getId().toString(), process.getId());
	if(taskList.size()>0){
		Task task = taskList.get(0);
		params.clear();
		params.put("userId", nextUserId);
		params.put("messagerId", user.getId());
		
		//完成當前任務(該方法在上面內容中已寫好)
		completeTask(task, params);
		
		commentAccessory.setTaskId(task.getId());//在定義的例項中儲存任務id	
		commentAccessory.setProcessId(process.getId());//在定義的例項中儲存流程id
		commentAccessoryManager.save(commentAccessory);
	}	
}



/**
 * 進入流程(第二步開始)
 * @param user
 * @param commentAccessoryId 例項id
 * @param nextUserId
 * @return 
 */
public void enterActiviti(User user, Integer commentAccessoryId, String nextUserId) {
	try {
		CommentAccessory commentAccessory = commentAccessoryManager.load(commentAccessoryId);
		String processId = commentAccessory.getProcessId();
		List<Task> taskList = findTaskByProcessAndCandidate(user.getId().toString(), processId);
		Map<String, Object> params = new HashMap<String, Object>();
		if(taskList.size()>0){
			Task task = taskList.get(0);
			completeCurrentTask(task.getId(), params);
			commentAccessory.setTaskId(task.getId());
			commentAccessoryManager.save(commentAccessory);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}