activiti默認是不帶有選人的功能的,它默認的是在調用complete 方法的時候自動根據下一個節點的 assignee屬性或者candidate屬性 設置下一節點的候選人或者 assginee。
因爲項目的緣由咱們須要實如今上一個節點提交的時候設置就要從幾個候選審批人員中選擇一個或者幾個審批人員,下面的代碼寫了個Junit 的demo。
java
- package test.java.org.activiti.designer.test;
-
- import static org.junit.Assert.*;
-
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.io.FileInputStream;
-
- import org.activiti.bpmn.model.BpmnModel;
- import org.activiti.bpmn.model.FlowElement;
- import org.activiti.bpmn.model.Process;
- import org.activiti.bpmn.model.SequenceFlow;
- import org.activiti.engine.IdentityService;
- import org.activiti.engine.RepositoryService;
- import org.activiti.engine.RuntimeService;
- import org.activiti.engine.TaskService;
- import org.activiti.engine.impl.persistence.entity.TaskEntity;
- import org.activiti.engine.runtime.ProcessInstance;
- import org.activiti.engine.task.Task;
- import org.activiti.engine.test.ActivitiRule;
- import org.junit.Rule;
- import org.junit.Test;
-
- public class ProcessTest {
-
- private String filename = "E:\\workspace4.3\\kft-activiti-demo-no-maven\\resources\\diagrams\\test2.bpmn";
-
- @Rule
- public ActivitiRule activitiRule = new ActivitiRule();
- static RuntimeService runtimeService;
- static TaskService taskService;
- static IdentityService identityService;
-
- static RepositoryService repositoryService;
-
-
-
- private String processDefinitionId ;
-
-
-
- private String processInstanceId;
- @Test
- public void mainTest() throws Exception {
-
- repositoryService = activitiRule.getRepositoryService();
- runtimeService = activitiRule.getRuntimeService();
- taskService = activitiRule.getTaskService();
-
- ProcessTest ptm = new ProcessTest();
-
-
- String taskId;
-
- taskId = ptm.startProcess();
-
-
-
-
- List<String> userList= ptm.getNextTaskUserByTaskId(taskId);
-
- ptm.setApproveUser(taskId, "feng");
-
- taskId = ptm.getNextNodeId(1,"feng");
-
-
- ptm.completeByAssignee("feng","xiaozhang");
-
-
-
-
- taskId = ptm.getNextNodeId(1,"xiaozhang");
-
- userList= ptm.getNextTaskUserByTaskId(taskId);
-
- ptm.completeByAssignee("xiaozhang","xiaoming");
-
- ptm.getNextNodeId(1,"xiaoming");
-
-
- ptm.completeByAssignee("xiaoming","xiangwang");
-
-
-
-
- }
-
- public String startProcess() throws Exception {
-
- repositoryService.createDeployment().addInputStream("test2.bpmn20.xml",new FileInputStream(filename)).deploy();
- Map<String, Object> variableMap = new HashMap<String, Object>();
- variableMap.put("name", "Activiti");
-
-
-
- ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("test2", variableMap);
-
- processDefinitionId = processInstance.getProcessDefinitionId();
- processInstance.getId();
- List<TaskEntity> tList = ((org.activiti.engine.impl.persistence.entity.ExecutionEntity) processInstance).getTasks();
-
- this.setProcessInstanceId( processInstance.getId() );
-
- this.setProcessDefinitionId(processDefinitionId);
-
- if(tList.size()!=1) {
- System.err.println("start節點的輸出路由不能有多個");
- }
- return tList.get(0).getId();
-
- }
-
- public void queryProcessInstance() {
- List<ProcessInstance> instanceList = runtimeService
- .createProcessInstanceQuery().processDefinitionKey("test")
- .list();
-
- for (ProcessInstance queryProcessInstance : instanceList) {
- queryProcessInstance.getActivityId();
-
- System.out.print("-----queryProcessInstance:"+queryProcessInstance.getActivityId());
-
- assertEquals(false, queryProcessInstance.isEnded());
- System.out.println("id " + queryProcessInstance.getId()
- + ", ended=" + queryProcessInstance.isEnded()+",ProcessDefinitionId="+queryProcessInstance.getProcessDefinitionId());
- }
- }
-
- public void queryTask(String assignee) {
-
-
-
-
- Task task= taskService.createTaskQuery().taskAssignee(assignee).singleResult();
-
-
- System.out.println("審批人爲【"+assignee+"】的任務有:任務編號爲【" + task.getId() + "】"+ task.getTaskDefinitionKey());
-
- }
- /**
- *
- * @param queryType 查詢類型1 根據 assignee 查詢 2 根據candidateuser查詢
- * @param str
- */
- public String getNextNodeId(int queryType,String str) {
-
-
- Task task = null;
- if(queryType==1) {
- task = taskService.createTaskQuery().taskAssignee(str).singleResult();
- }else if(queryType==2){
- task = taskService.createTaskQuery().taskCandidateUser(str).singleResult();
-
- }else if(queryType==3){
- task = taskService.createTaskQuery().taskCandidateGroup(str).singleResult();
-
- }
-
- List<FlowElement> list = getNextNode(task.getId());
-
-
- if(task==null) {
- return null;
- }
-
-
- for(FlowElement e :list) {
-
- }
-
- return task.getId();
-
- }
-
- private List<FlowElement> getNextNode(String taskId) {
-
- Task task = null;
- task = taskService.createTaskQuery().taskId(taskId).singleResult();
- if(task==null) {
- return null;
- }
- List<FlowElement> list = new ArrayList<FlowElement>();
-
- ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
-
-
- String activitiId = processInstance.getActivityId();
-
- System.out.println("當前節點是【"+activitiId+"】");
-
-
- BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
-
- List<Process> processList = bpmnModel.getProcesses();
-
-
- for(Process process:processList) {
-
-
- Collection<FlowElement> cColl = process.getFlowElements();
-
- for(FlowElement f :cColl) {
-
-
-
- if(f.getId().equals(activitiId)) {
-
- List<SequenceFlow> sequenceFlowList = new ArrayList<SequenceFlow>();
-
- if(f instanceof org.activiti.bpmn.model.StartEvent) {
-
- sequenceFlowList = ((org.activiti.bpmn.model.StartEvent) f).getOutgoingFlows();
- }else if(f instanceof org.activiti.bpmn.model.UserTask) {
-
- sequenceFlowList = ((org.activiti.bpmn.model.UserTask) f).getOutgoingFlows();
-
-
- for(SequenceFlow sf :sequenceFlowList) {
-
- String targetRef = sf.getTargetRef();
- FlowElement ref = process.getFlowElement(targetRef);
-
-
-
- list.add(ref);
- }
-
- }else if(f instanceof org.activiti.bpmn.model.SequenceFlow) {
-
-
- }else if(f instanceof org.activiti.bpmn.model.EndEvent) {
- sequenceFlowList = ((org.activiti.bpmn.model.EndEvent) f).getOutgoingFlows();
- }
- break;
- }
-
- }
-
- }
- return list;
- }
-
- public void completeByAssignee(String assignee,String nextUser) throws Exception {
-
- HashMap<String,Object> map = new HashMap<String,Object>();
-
- map.put("nextUser", nextUser);
- Task task = taskService.createTaskQuery().taskAssignee(assignee).singleResult();
- taskService.complete(task.getId(),map);
- System.out.println("完成任務 編號爲【" + task.getId() + "】,名稱爲【"+task.getName()+"】的任務");
- }
-
- public void setApproveUser(String taskId,String user) {
- Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
- task.setAssignee(user);
- taskService.saveTask(task);
- }
-
-
- public List<String> getNextTaskUserByTaskId(String taskId) {
- List<String> list = new ArrayList<String>();
-
- List<FlowElement> fList = getNextNode(taskId);
-
-
- for(FlowElement u:fList){
-
- String str = ((org.activiti.bpmn.model.UserTask) u).getAssignee();
- list.add(str);
- }
- return list ;
- }
-
-
- public List<String> getThisTaskUser(String taskId) {
- List<String> list = new ArrayList<String>();
- Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
- String taskUser = task.getAssignee();
-
-
-
- list.add(taskUser);
- return list ;
- }
- public String getProcessDefinitionId() {
- return processDefinitionId;
- }
-
- public void setProcessDefinitionId(String processDefinitionId) {
- this.processDefinitionId = processDefinitionId;
- }
-
- public String getProcessInstanceId() {
- return processInstanceId;
- }
-
- public void setProcessInstanceId(String processInstanceId) {
- this.processInstanceId = processInstanceId;
- }
- }
另外再繪製流程圖的時候除了首節點,其他每一個節點要設置listener ,能夠設置一個公共的listener 傳遞不一樣的參數代碼如: sql
整個選人過程的其實比較簡單 是:提交流程的時候將下一審批人做爲流程變量提交到流程引擎,流程引擎會調用如上代碼塊的notify 方法(固然須要在usertask上配置 配置下圖) ,在notify方法內delegateTask.setAssignee設置下一個節點的審批人
apache