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

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