TaskService
- 對用戶任務(wù)UserTask的管理和流程的控制
- 設(shè)置用戶任務(wù)的權(quán)限信息(設(shè)置候選人等)
- 針對用戶任務(wù)添加任務(wù)附件,任務(wù)評論和事件記錄
TaskService對Task的管理和控制
- Task對象的創(chuàng)建和刪除
- 查詢Task,驅(qū)動Task節(jié)點完成執(zhí)行
- Task相關(guān)參數(shù)變量variable設(shè)置
TaskService變量的作用域
// 查詢task
Task task1 = taskService.createTaskQuery().singleResult();
// 設(shè)置全局變量
taskService.setVariable(task1.getId(),"key1","value1");
// 設(shè)置局部變量
taskService.setVariableLocal(task1.getId(),"key2","value2");
// 獲取全局變量
Map<String,Object> a = taskService.getVariables(task1.getId());
// 獲取局部變量
Map<String,Object> b = taskService.getVariablesLocal(task1.getId());
// 獲取全局變量
Map<String,Object> c = runtimeService.getVariables(processInstance.getId());
使用taskService設(shè)置局部變量后,局部變量的作用域只限于當(dāng)前任務(wù)內(nèi),如果任務(wù)結(jié)束后,那么局部變量也就隨著消失了。
除了直接設(shè)置變量外,在任務(wù)提交的時候也可以附帶變量,即使用taskService.complete(),這個complete方法多個重載方法:
public void complete(String taskId);
public void complete(String taskId, Map<String, Object> variables);
public void complete(String taskId, Map<String, Object> variables, boolean localScope) ;
其中:taskId(對應(yīng)act_ru_task中的id_),variables(下一次任務(wù)所需要的參數(shù)),作用是完成這一次任務(wù),并且下一步任務(wù)需要流程變量的。要注意的是localScope這個參數(shù):localScope(存儲范圍:本任務(wù)) 。當(dāng)這個布爾值為true表示作用范圍為當(dāng)前任務(wù),當(dāng)任務(wù)結(jié)束后,再也取不到這個值了,act_ru_variables這個表中也沒有這個參數(shù)的信息了;如果為false表示這個變量是全局的,任務(wù)結(jié)束后在act_ru_variables表中仍然能查到變量信息。相關(guān)內(nèi)容可以查看下面這篇文章:
https://blog.csdn.net/u013026207/article/details/53405265
TaskService設(shè)置Task權(quán)限信息
- 候選用戶candidateUser和候選組candidateGroup
- 指定擁有人Owner和辦理人Assignee
- 通過claim設(shè)置辦理人(簽收 )
示例:
首先編寫流程文件如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1536107421286" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
<process id="second_approve" isClosed="false" isExecutable="true" name="二級審批" processType="None">
<startEvent id="startEvent" name="開始"/>
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="myTask"/>
<userTask id="myTask" name="my-task" activiti:candidateUsers="yubuyun">
</userTask>
<sequenceFlow id="flow2" sourceRef="myTask" targetRef="endEvent"/>
<endEvent id="endEvent" name="取消"/>
</process>
</definitions>
其中設(shè)置了節(jié)點的候選人為yubuyun。
后臺代碼如下:
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
.taskCandidateUser("yubuyun")
.taskUnassigned()
.listPage(0,100);
logger.info("taskList={}",taskList);
for(Task task : taskList){
taskService.claim(task.getId(),"yubuyun");
}
上述代碼中先對任務(wù)進(jìn)行查詢,查詢條件為候選人為yubuyun,并且還沒有被簽收,然后才對查詢結(jié)果進(jìn)行簽收。這樣做的原因是,如果某個task之前已經(jīng)被簽收claim了,再次執(zhí)行claim命令的時候就會拋出異常,記一個任務(wù)只能被簽收一次,為此防止拋出異常,可以先查詢?nèi)蝿?wù)是否被簽收。
OWNER 和 ASSIGNEE 的區(qū)別
在act_ru_task表中有OWNER_和ASSIGNEE_兩個字?jǐn)唷?br>
這兩個字段的意義是:
1,ASSIGNEE_(受理人):task任務(wù)的受理人,就是執(zhí)行TASK的人,這個又分兩種情況(有值,NULL)
- 有值的情況:XML流程里面定義的受理人,TASK會直接填入這個人;
- NULL:XML沒有指定受理人或者只指定了候選組;
沒有值的時候,可以使用簽收功能去指定受理人,就是候選組里面誰簽收誰就成了受理人。
- OWNER_(委托人):受理人委托其他人操作該TASK的時候,受理人就成了委托人OWNER_,其他人就成了受理人ASSIGNEE_
owner字段就是用于受理人委托別人操作的時候運用的字段。
Task task=taskService.createTaskQuery().singleResult();
//簽收
taskService.claim(task.getId(), "billy");
logger.info(taskService.createTaskQuery().singleResult().getAssignee());
//結(jié)果:billy
//委托
taskService.delegateTask(task.getId(), "cc");
logger.info(taskService.createTaskQuery().singleResult().getOwner());
logger.info(taskService.createTaskQuery().singleResult().getAssignee());
//結(jié)果:owner是Billy,assignee是cc
TaskService設(shè)置Task附加信息
- 任務(wù)附件Attachment創(chuàng)建與查詢
- 任務(wù)評論Comment創(chuàng)建與查詢
- 事件記錄Event創(chuàng)建與查詢
添加附件示例
// 添加附件(地址位于/url/test.png)到task中
taskService.createAttachment("url",task.getId(),
processInstance.getId(),
"name",
"desc",
"/url/test.png");
// 查詢附件
List<Attachment> attachmentList = taskService.getTaskAttachments(task.getId());
for(Attachment attachment : attachmentList){
logger.info("attach={}",attachment);
}
最終打印結(jié)果是一個對象,說明附件作為對象保存到數(shù)據(jù)庫中。
attach=org.activiti.engine.impl.persistence.entity.AttachmentEntityImpl@680d4a6a
添加評論示例
taskService.addComment(task.getId(),processInstance.getId(),"record note 1");
taskService.addComment(task.getId(),processInstance.getId(),"record note 2");
List<Comment> commentList = taskService.getTaskComments(task.getId());
for(Comment comment : commentList){
logger.info("comment={}", ToStringBuilder.reflectionToString(comment, ToStringStyle.MULTI_LINE_STYLE));
}
評論對象輸出為:
[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:49:53 CST 2018,105008,105004,AddComment,record note 2,record note 2,105016,false,false,false
[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:49:53 CST 2018,105008,105004,AddComment,record note 1,record note 1,105015,false,false,false
事件記錄
事件記錄查詢?yōu)椋?/p>
List<Event> eventList = taskService.getTaskEvents(task.getId());
for(Event event : eventList){
logger.info("event={}",ToStringBuilder.reflectionToString(event,ToStringStyle.SIMPLE_STYLE));
}
輸出結(jié)果如下:
[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 2,record note 2,107516,false,false,false
[main] INFO com.activiti.HelloWorld - comment=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 1,record note 1,107515,false,false,false
[main] INFO com.activiti.HelloWorld - event=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 2,record note 2,107516,false,false,false
[main] INFO com.activiti.HelloWorld - event=comment,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddComment,record note 1,record note 1,107515,false,false,false
[main] INFO com.activiti.HelloWorld - event=event,<null>,Tue Oct 02 22:52:35 CST 2018,107508,107504,AddAttachment,name,<null>,107514,false,false,false
[main] INFO com.activiti.HelloWorld - event=event,<null>,Tue Oct 02 22:52:35 CST 2018,107508,<null>,AddUserLink,lizongyu_|_owner,<null>,107512,false,false,false
從日志可以看出comment和event結(jié)果相同,但是event除了相同部分外,還有添加附件和添加用戶的事件記錄。