activiti學習--13:組任務分配方式1直接方式+查詢正在執行的任務辦理人表+查詢歷史任務的辦理人表+拾取任務+將個人任務回退到組任務+向組任務中新增/刪除成員
組任務及三種分配方式:
1:在taskProcess.bpmn中直接寫 candidate-users=“a,b,c,d”
2:在taskProcess.bpmn中寫 candidate-users =“#{userIDs}”,變數的值要是String的。
使用流程變數指定辦理人
Map< String, Object> variables = new HashMap< String, Object>();
variables.put(“userIDs”, “a,b,c,d”);
3,使用TaskListener介面,使用類實現該介面,在類中定義:
//新增組任務的使用者
delegateTask.addCandidateUser(userId1);
delegateTask.addCandidateUser(userId2);
組任務分配給個人任務(認領任務):
processEngine.getTaskService().claim(taskId, userId);
個人任務分配給組任務:
processEngine.getTaskService(). setAssignee(taskId, null);
向組任務新增人員:
processEngine.getTaskService().addCandidateUser(taskId, userId);
向組任務刪除人員:
processEngine.getTaskService().deleteCandidateUser(taskId, userId);
個人任務和組任務存放辦理人對應的表:
act_ru_identitylink表存放正在執行任務的辦理人,包括個人任務和組任務
act_hi_identitylink表存放歷史任務的辦理人,包括個人任務和組任務
區別在於:如果是個人任務TYPE的型別表示participant(參與者)
如果是組任務TYPE的型別表示candidate(候選者)和participant(參與者)
流程介紹
1分配組任務(一組代理人)
2每個代理人檢視個人任務看不到資料,因為任務在組中
3每個代理人檢視可以檢視組任務
4每個代理人都可以從組任務中接受任務,一旦接受,組任務中就沒有該任務,該任務只能在對應的代理人的個人任務中存在
5使用者接受組任務,組任務就把相應任務撤銷,使用者撤銷自己的組任務,對應組任務就出現在組任務中,每個代理人都可以拾取任務。
方式1
task.bpmn
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="task" name="taskProcess" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="審批" activiti:candidateUsers="a,b,c,d"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_task">
<bpmndi:BPMNPlane bpmnElement="task" id="BPMNPlane_task">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="390.0" y="50.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="355.0" y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="390.0" y="270.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="407.0" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="407.0" y="150.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="407.0" y="205.0"></omgdi:waypoint>
<omgdi:waypoint x="407.0" y="270.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
測試程式碼
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service
.createDeployment()//建立一個部署物件
.name("組任務")//新增部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
// 輸出:
// 部署ID:5201
// 部署名稱:組任務
}
/**啟動流程例項*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
// /**啟動流程例項的同時,設定流程變數,使用流程變數用來指定任務的辦理人,對應task.pbmn檔案中#{userIDs}*/
// Map<String, Object> variables = new HashMap<String, Object>();
// variables.put("userids", "a,b,c,d");
// ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
// .startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程例項ID:"+pi.getId());//流程例項ID
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID
// 輸出:
// 流程例項ID:5301
// 流程定義ID:task:6:5204
}
任務出現在組任務中,個人任務不出現
/**查詢當前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "a";
List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
.createTaskQuery()//建立任務查詢物件
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用建立時間的升序排列
/**返回結果集*/
.list();//返回列表
if(list!=null && list.size()>0){
System.out.println("--關聯表: ACT_RU_TASK----");
for(Task task:list){
System.out.println("--------"+task.getAssignee()+"任務:"+task.getName()+"-----------------");
System.out.println("任務ID:"+task.getId());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的建立時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程例項ID:"+task.getProcessInstanceId());
System.out.println("執行物件ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
}
}
}
/**查詢當前人的組任務*/
@Test
public void findMyGroupTask(){
String candidateUser = "a";
List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
.createTaskQuery()//建立任務查詢物件
/**查詢條件(where部分)*/
.taskCandidateUser(candidateUser)//組任務的辦理人查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用建立時間的升序排列
/**返回結果集*/
.list();//返回列表
if(list!=null && list.size()>0){
System.out.println("--關聯表: ACT_RU_TASK----");
for(Task task:list){
System.out.println("--------"+task.getAssignee()+"任務:"+task.getName()+"-----------------");
System.out.println("任務ID:"+task.getId());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的建立時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程例項ID:"+task.getProcessInstanceId());
System.out.println("執行物件ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
// --關聯表: ACT_RU_TASK----
// --------null任務:審批-----------------
// 任務ID:5304
// 任務名稱:審批
// 任務的建立時間:Thu Sep 07 15:29:53 CST 2017
// 任務的辦理人:null
// 流程例項ID:5301
// 執行物件ID:5301
// 流程定義ID:task:6:5204
影響的表
ACT_RU_TASK
act_ru_identitylink表存正在執行任務的辦理人
act_hi_identitylink表存放歷史任務的辦理人
查詢正在執行的任務辦理人表
/**查詢正在執行的任務辦理人表*/
@Test
public void findRunPersonTask(){
//任務ID
String taskId = "5304";
List<IdentityLink> list = processEngine.getTaskService()//
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
System.out.println("任務ID---------型別---------流程例項id---------使用者id");
for(IdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+
"---------"+identityLink.getType()+
"---------"+identityLink.getProcessInstanceId()+
"---------"+identityLink.getUserId());
// 輸出:
// 任務ID---------型別---------流程例項id---------使用者id
// 5304---------candidate---------null---------c
// 5304---------candidate---------null---------a
// 5304---------candidate---------null---------d
// 5304---------candidate---------null---------b
}
}
}
查詢歷史任務的辦理人表
/**查詢歷史任務的辦理人表*/
@Test
public void findHistoryPersonTask(){
//流程例項ID
String processInstanceId = "5301";
List<HistoricIdentityLink> list = processEngine.getHistoryService()//
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
if(list!=null && list.size()>0){
System.out.println("任務ID---------型別---------流程例項id---------使用者id");
for(HistoricIdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+
"---------"+identityLink.getType()+
"---------"+identityLink.getProcessInstanceId()+
"---------"+identityLink.getUserId());
// 任務ID---------型別---------流程例項id---------使用者id
// null---------participant---------5301---------c
// null---------participant---------5301---------a
// null---------participant---------5301---------d
// null---------participant---------5301---------b
}
}
}
a代理人拾取任務
/**拾取任務,將組任務分給個人任務,指定任務的辦理人欄位*/
@Test
public void claim(){
//將組任務分配給個人任務
//任務ID
String taskId = "5304";
//分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
String userId = "a";
processEngine.getTaskService()//
.claim(taskId, userId);
}
ACT_RU_TASK;
這個時候,代理人在組任務中看不到任務
將個人任務回退到組任務
/**將個人任務回退到組任務,前提,之前一定是個組任務*/
@Test
public void setAssigee(){
//任務ID
String taskId = "5304";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
ACT_RU_TASK;
這個時候,代理人可以檢視到組任務
向組任務中新增成員
/**向組任務中新增成員*/
@Test
public void addGroupUser(){
//任務ID
String taskId = "5304";
//成員辦理人
String userId = "e";
processEngine.getTaskService()//
.addCandidateUser(taskId, userId);
}
ACT_RU_IDENTITYLINK
從組任務中刪除成員
/**從組任務中刪除成員*/
@Test
public void deleteGroupUser(){
//任務ID
String taskId = "5304";
//成員辦理人
String userId = "e";
processEngine.getTaskService()//
.deleteCandidateUser(taskId, userId);
}
ACT_RU_IDENTITYLINK
這個時候候選者e消失了