簡介: 使用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 }