这两天在写一个指派任务的功能,本来在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: