一、前言
本章繼續學習activiti6.0的核心api之TaskService??? 博客已經轉至簡書 (csdn寫博客太痛苦了)
二、activiti6.0的核心api之TaskService
??? 1、復制 testProcess.bpmn20.xml 流程定義文件,并將其改名為 testProcess-task.bpmn20.xml
??? 2、修改 testProcess-task.bpmn20.xml中內容如下:
<process id="myProcess" isClosed="false" isExecutable="true" name="測試流程" processType="None">
? <startEvent id="startevent1" name="Start"/>
? <endEvent id="endevent1" name="End"/>
? <userTask activiti:candidateUsers="張三,李四,王五" activiti:exclusive="true" id="test" name="用戶">
? ? <documentation>test task ${message}
? <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="test"/>
? <sequenceFlow id="flow2" sourceRef="test" targetRef="endevent1"/>
</process>
3、測試代碼如下:
/**
*
*? ? 測試taskService? Task為任務,通常就是我們所說的代辦任務
*? ? taskService作用:
*? ? ? 1、對用戶任務(UserTask)進行管理和流程的控制
*? ? ? ? a)Task對象的創建和刪除
*? ? ? ? b)查詢Task,并驅動Task節點完成執行
*? ? ? ? c)Task相關參數變量(variable)設置
*? ? ? 2、設置用戶任務(UserTask)的權限信息(擁有者,候選人,辦理人)
*? ? ? 3、針對用戶任務添加任務附件、任務評論和事件記錄
*? ? ? ? a)任務附件(Attachment)創建與查詢
*? ? ? ? b)任務評論(Comment)創建與查詢
*? ? ? ? c)事件記錄(Event)創建與查詢
* @author chaoge
* @since 2018/10/8 15:00
*/
public class TaskServiceTest {
private static final LoggerLOGGER = LoggerFactory.getLogger(RuntimeServiceTest.class);
? ? @Rule
? ? public ActivitiRulerule =new ActivitiRule();
? ? /**
? ? * 測試taskService設置和獲取變量,完成任務
? ? */
? ? @Test
? ? @Deployment(resources ="processes/testProcess-task.bpmn20.xml")
public void testTaskService(){
Map variables = Maps.newHashMap();
? ? ? ? //可以在此處傳遞參數,在流程文件中通過${message}的方式接收參數,流程引擎會自動將其替換成設置的參數
? ? ? ? variables.put("message","測試信息");
? ? ? ? ProcessInstance myProcess =rule.getRuntimeService().startProcessInstanceByKey("myProcess",variables);
? ? ? ? TaskService taskService =rule.getTaskService();
? ? ? ? Task task = taskService.createTaskQuery().singleResult();
? ? ? ? LOGGER.info("task = {}",ToStringBuilder.reflectionToString(task,ToStringStyle.JSON_STYLE));
? ? ? ? LOGGER.info("task name = {}",task.getName());
? ? ? ? LOGGER.info("task des = {}",task.getDescription());
? ? ? ? System.out.println("task =? " + ToStringBuilder.reflectionToString(task,ToStringStyle.JSON_STYLE));
? ? ? ? //設置和獲取變量? taskService.getVariables(task.getId())能獲取到流程變量和本地變量,即第一種包含了第二種和第三種的變量
? ? ? ? Map taskServiceVariables = taskService.getVariables(task.getId());
? ? ? ? Map taskServiceVariablesLocal = taskService.getVariablesLocal(task.getId());
? ? ? ? Map processVariables =rule.getRuntimeService().getVariables(task.getExecutionId());
? ? ? ? LOGGER.info("taskServiceVariables = {}",ToStringBuilder.reflectionToString(taskServiceVariables,ToStringStyle.JSON_STYLE));
? ? ? ? LOGGER.info("taskServiceVariablesLocal = {}",ToStringBuilder.reflectionToString(taskServiceVariablesLocal,ToStringStyle.JSON_STYLE));
? ? ? ? LOGGER.info("processVariables = {}",ToStringBuilder.reflectionToString(processVariables,ToStringStyle.JSON_STYLE));
? ? ? ? //當前流程節點設置完成并走向下一個節點,同時設置參數
? ? ? ? Map variables2 = Maps.newHashMap();
? ? ? ? variables2.put("user1","chaoge");
? ? ? ? taskService.complete(task.getId(),variables2);
? ? ? ? Task task1 = taskService.createTaskQuery().taskId(task.getId()).singleResult();
? ? ? ? LOGGER.info("task1 = {}",task1);
? ? }
/**
? ? * 其中有兩個字段:OWNER_,ASSIGNEE_
? ? * 這兩個字段的意義是:
? ? * 1,ASSIGNEE_(受理人):task任務的受理人,就是執行TASK的人,這個又分兩種情況(有值,NULL)
? ? * ? ? 1),有值的情況:XML流程里面定義的受理人,TASK會直接填入這個人;
? ? * ? ? 2),NULL:XML沒有指定受理人或者只指定了候選組;
? ? *? ? ? ? 沒有值的時候,可以使用簽收功能去指定受理人,就是候選組里面誰簽收誰就成了受理人
? ? * 2,OWNER_(委托人):受理人委托其他人操作該TASK的時候,受理人就成了委托人OWNER_,其他人就成了受理人ASSIGNEE_
*/
? ? @Test
? ? @Deployment(resources ="processes/testProcess-task.bpmn20.xml")
public void testTaskServiceUser(){
Map variables = Maps.newHashMap();
? ? ? ? //可以在此處傳遞參數,在流程文件中通過${message}的方式接收參數,流程引擎會自動將其替換成設置的參數
? ? ? ? variables.put("message","測試信息");
? ? ? ? ProcessInstance myProcess =rule.getRuntimeService().startProcessInstanceByKey("myProcess",variables);
? ? ? ? TaskService taskService =rule.getTaskService();
? ? ? ? Task task = taskService.createTaskQuery().singleResult();
? ? ? ? LOGGER.info("task = {}",ToStringBuilder.reflectionToString(task,ToStringStyle.JSON_STYLE));
? ? ? ? LOGGER.info("task des = {}",task.getDescription());
? ? ? ? taskService.setOwner(task.getId(),"user1");//owner通常是流程的發起人
? ? ? ? //taskService.setAssignee(task.getId(),"張三");//設置代辦人,此種方式會覆蓋掉原來的代辦人,不推薦使用
? ? ? ? List taskList = taskService.createTaskQuery()
.taskCandidateUser("張三")//設置了辦理用戶是張三
? ? ? ? ? ? ? ? .taskUnassigned()//沒有設置代辦人
? ? ? ? ? ? ? ? .listPage(1, 100);
? ? ? ? try {
//當用戶已經指定一個代辦人的時候claim獲取是會報錯的
? ? ? ? ? ? taskList.forEach(task1->taskService.claim(task1.getId(),"張三"));//設置代辦人
? ? ? ? }catch (Exception e) {
LOGGER.error(e.getMessage(),e);
? ? ? ? }
//獲取任務相關的辦理人,包括owner、candidateUsers
? ? ? ? List identityLinks = taskService.getIdentityLinksForTask(task.getId());
? ? ? ? identityLinks.forEach(identityLink->LOGGER.info("identityLink = {}",identityLink));
? ? ? ? //獲取代辦人是張三的任務
? ? ? ? List tasks = taskService.createTaskQuery().taskAssignee("張三").listPage(0, 100);
? ? ? ? tasks.forEach(task1 ->taskService.complete(task1.getId()));
? ? ? ? List tasks2 = taskService.createTaskQuery().taskAssignee("張三").listPage(0, 100);
? ? ? ? tasks2.forEach(task1 ->LOGGER.info("張三的代辦任務task = {}",task1) );
? ? }
/**
? ? * 創建Attachment
*/
? ? @Test
? ? @Deployment(resources ="processes/testProcess-task.bpmn20.xml")
public void testTaskAttachment(){
Map variables = Maps.newHashMap();
? ? ? ? //可以在此處傳遞參數,在流程文件中通過${message}的方式接收參數,流程引擎會自動將其替換成設置的參數
? ? ? ? variables.put("message","測試信息");
? ? ? ? ProcessInstance myProcess =rule.getRuntimeService().startProcessInstanceByKey("myProcess",variables);
? ? ? ? TaskService taskService =rule.getTaskService();
? ? ? ? Task task = taskService.createTaskQuery().singleResult();
? ? ? ? LOGGER.info("task = {}",ToStringBuilder.reflectionToString(task,ToStringStyle.JSON_STYLE));
? ? ? ? LOGGER.info("task des = {}",task.getDescription());
? ? ? ? taskService.createAttachment("url",task.getId(),task.getProcessInstanceId(),"name","desc","/url/test.png");
? ? ? ? List taskAttachments = taskService.getTaskAttachments(task.getId());
? ? ? ? taskAttachments.forEach(taskAttach->LOGGER.info("taskAttach = {}",ToStringBuilder.reflectionToString(taskAttach,ToStringStyle.JSON_STYLE)));
? ? }
/**
? ? * 創建Comment 查詢事件信息
? ? */
? ? @Test
? ? @Deployment(resources ="processes/testProcess-task.bpmn20.xml")
public void testTaskComment(){
Map variables = Maps.newHashMap();
? ? ? ? //可以在此處傳遞參數,在流程文件中通過${message}的方式接收參數,流程引擎會自動將其替換成設置的參數
? ? ? ? variables.put("message","測試信息");
? ? ? ? ProcessInstance myProcess =rule.getRuntimeService().startProcessInstanceByKey("myProcess",variables);
? ? ? ? TaskService taskService =rule.getTaskService();
? ? ? ? Task task = taskService.createTaskQuery().singleResult();
? ? ? ? LOGGER.info("task = {}",ToStringBuilder.reflectionToString(task,ToStringStyle.JSON_STYLE));
? ? ? ? LOGGER.info("task des = {}",task.getDescription());
? ? ? ? //添加評論
? ? ? ? taskService.addComment(task.getId(),task.getProcessInstanceId(),"這是我的評論");
? ? ? ? taskService.addComment(task.getId(),task.getProcessInstanceId(),"這還是我的評論");
? ? ? ? //查詢評論
? ? ? ? List taskComments = taskService.getTaskComments(task.getId());
? ? ? ? taskComments.forEach(taskComment->LOGGER.info("taskComment = {}",ToStringBuilder.reflectionToString(taskComment,ToStringStyle.JSON_STYLE)));
? ? ? ? //查詢事件
? ? ? ? List taskEvents = taskService.getTaskEvents(task.getId());
? ? ? ? taskEvents.forEach(taskEvent->LOGGER.info("taskEvent = {}",ToStringBuilder.reflectionToString(taskEvent,ToStringStyle.JSON_STYLE)));
? ? }
}