jbpm4指派任務

      這兩天在寫一個指派任務的功能,本來在jpdl.xml中以配置好每一步審批的用戶、角色等信息,但是客戶希望能夠在表單頁面上指定下一步的處理人,所以這兩天想辦法把這問題解決了,大致步驟如下。

      首頁新建類實現AssignmentHandler接口,代碼如下:

public class UserAssignHandler implements AssignmentHandler{
    private static final long serialVersionUID = 1L;
	
    String users;			//授權用戶
    String groups;			//授權分組
    
    @Override
    public void assign(Assignable assignable, OpenExecution execution) throws Exception {
		/**
		 * 首先從流程參數中獲取指派人,如果有指派人,則任務只分給指派人,jpdl.xml配置的參數無效
		 * 如果沒有指派人,則按jpdl.xml中的配置分配,users和groups可以同時生效
		 */
		
		//從參數中獲取指派人,執行完移除該變量,則不會影響之後的步驟
		String assignUsers = (String)execution.getVariable("assignUsers");
		if(assignUsers!=null&&assignUsers.length()>0){
			String[] uids = assignUsers.split(",");
			if(uids!=null&&uids.length>0){
				for(String uid:uids){
					assignable.addCandidateUser(uid);
				}
			}else{
				assignable.setAssignee(assignUsers);
			}
			//移除指派人蔘數
			execution.removeVariable("assignUsers");
			return;
		}
		if(users!=null&&users.length()>0){
			String[] us = users.split(",");
			if(us!=null&&us.length>0){
				for(String u:us){
					assignable.addCandidateUser(u);
				}
			}else{
				assignable.setAssignee(users);
			}
		}
		if(groups!=null&&groups.length()>0){
			String[] gs = groups.split(",");
			if(gs!=null&&gs.length>0){
				for(String g:gs){
					assignable.addCandidateGroup(g);
				}
			}else{
				assignable.addCandidateGroup(groups);
			}
		}
	}
}
      然後修改jpdl.xml,在有可能被指派的任務上配置assignment-handler,如下:
<task form="/project/hzzfw/problem/form/techAccept.jsp" g="190,100,92,52" name="技術科受理">
    <assignment-handler class="com.shine.sourcedesk.jbpm.identity.UserAssignHandler">
      	<field name="groups">
      		<string value="TECH_EMPLOYEE"/>
      	</field>
    </assignment-handler>
    <transition g="236,204:-66,-24" name="提交給主任" to="主任審批"/>
    <transition g="128,126;128,286;129,372:-60,-46" name="直接處理" to="技術科處理"/>
</task>

      然後在這一步執行時把所指派的用戶傳參給當前的流程,參數名與代碼中的對應(assignUsers),值就是所選用戶的用戶名(或者ID),多個用英文逗號隔開,代碼大致如下(大概意思下,具體參數應該從表單頁面中傳過來):
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("assignUsers", "jkp,admin");
taskService.completeTask("taskID","技術科受理",vars);
      到這裏差不多了,另外注意下這句:execution.removeVariable("assignUsers");,將參數刪掉,避免又被之後的任務用到(下一步不一定會選擇指派人)。

PS:

      參考資料:http://man1900.iteye.com/blog/825697

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章