這兩天在寫一個指派任務的功能,本來在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: