简介: 使用activiti 监听器 实现会签功能
使用监听器存储会签人员信息,在监听器启动时取出会签人员信息 ,写入流程变量之中,实现会签功能。
1.用户任务配置
1 /** 2 * 创建用户任务节点 3 * 多人审批(会签) 4 * sign 是否会签 5 * assignee 操作组人员id集合 6 */ 7 public static UserTask createUsersTask(String id, String name, List<String> assignee,boolean sign){ 8 UserTask userTask = new UserTask(); 9 userTask.setName(name); 10 userTask.setId(id); 11 //会签 使用监听器完成 12 if(sign){ 13 //编组会签人员id 14 String assigneeList=""; 15 for(String str:assignee){ 16 assigneeList+=str+","; 17 } 18 //去除最后一位逗号 19 assigneeList=assigneeList.substring(0,assigneeList.length()-1); 20 21 //会签配置 22 MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics1 = new MultiInstanceLoopCharacteristics(); 23 //会签循环次数(等于操作组数量) 24 multiInstanceLoopCharacteristics1.setLoopCardinality(String.valueOf(assignee.size())); 25 //会签通过条件(通过人数等于审批人数) 26 multiInstanceLoopCharacteristics1.setCompletionCondition("${nrOfActiveInstances == nrOfInstances}"); 27 //会签 28 multiInstanceLoopCharacteristics1.setSequential(false); 29 //审批人集合参数 30 multiInstanceLoopCharacteristics1.setInputDataItem("assigneeList"); 31 //迭代集合 32 multiInstanceLoopCharacteristics1.setElementVariable("assignee"); 33 //写入参数 34 userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics1); 35 36 45 46 //配置监听器2 47 ArrayList<ActivitiListener> listener = new ArrayList<>(); 48 ActivitiListener activitiListener = new ActivitiListener(); 49 //开始执行 50 activitiListener.setEvent("start"); 51 //执行方式 52 activitiListener.setImplementationType("class"); 53 //实现类 54 activitiListener.setImplementation("com.windseeker.common.activiti.utils.MyTaskListener"); 55 //监听器参数 56 FieldExtension file2=new FieldExtension(); 57 //会签操作组 58 file2.setFieldName("assignee"); 59 file2.setStringValue(assigneeList); 60 List<FieldExtension> list2=new ArrayList<>(); 61 list2.add(file2); 62 //写入参数 63 activitiListener.setFieldExtensions(list2); 64 listener.add(activitiListener); 65 userTask.setExecutionListeners(listener); 66 67 //设置会签操作组人员配置 68 userTask.setAssignee("${assignee}"); 69 }else{ 70 //非会签 直接写入操作组 71 userTask.setCandidateUsers(assignee); 72 } 73 return userTask; 74 }
2.监听类配置
1 /** 2 * activiti 监听器实现类 5 * 6 */ 7 public class MyTaskListener implements ExecutionListener{ 8 9 /** 10 * 会签操作组对象 11 */ 12 private Expression assignee; 13 14 public Expression getAssignee() { 15 return assignee; 16 } 17 18 public void setAssignee(Expression assignee) { 19 this.assignee = assignee; 20 } 21 57 /** 58 * 会签功能实现方法 59 * @param delegateTask 60 */ 61 62 @Override 63 public void notify(DelegateExecution delegateTask) { 64 String eventName = delegateTask.getEventName(); 65 if ("start".equals(eventName)) { 66 // 流程开始 67 System.out.println("start......"); 68 } else if ("end".equals(eventName)) { 69 // 流程结束 70 System.out.println("end......"); 71 } else if ("take".equals(eventName)) { 72 // 连线监听器 73 System.out.println("take......"); 74 } 75 // delegateTask 可以操作activiti引擎的一些东西 76 77 //获取会签操作组信息 78 List<String> assigneeList1 = new ArrayList<>(); 79 String[] result = assignee.getValue(delegateTask).toString().split(","); 80 for(int k=0;k<result.length;k++){ 81 if(!result[k].equals("")){ 82 assigneeList1.add(result[k]); 83 } 84 } 85 //将会签操作组信息写入流程实例变量 86 delegateTask.setVariable("assigneeList",assigneeList1); 87 88 } 93 }