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