这两天在写一个指派任务的功能,本来在jpdl.xml中以配置好每一步审批的用户、角色等信息,但是客户希望能够在表单页面上指定下一步的处理人,所以这两天想办法把这问题解决了,大致步骤如下。
首页新建类实现AssignmentHandler接口,代码如下:
然后修改jpdl.xml,在有可能被指派的任务上配置assignment-handler,如下:
然后在这一步执行时把所指派的用户传参给当前的流程,参数名与代码中的对应(assignUsers),值就是所选用户的用户名(或者ID),多个用英文逗号隔开,代码大致如下(大概意思下,具体参数应该从表单页面中传过来):
到这里差不多了,另外注意下这句:execution.removeVariable("assignUsers");,将参数删掉,避免又被之后的任务用到(下一步不一定会选择指派人)。
首页新建类实现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);
- }
- }
- }
- }
- <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);