|
用戶任務(wù)需要用戶手動來完成的任務(wù),可以直接分配給一個用戶,也可以指定用戶組,再由用戶認(rèn)領(lǐng)。本文我們來介紹一下如何將任務(wù)指派給個人,流程圖如下:

方式一:
定義流程圖時直接指定完成任務(wù)人(項目開發(fā)中任務(wù)的辦理人不要放置XML文件中,不夠靈活,較少使用)

流程圖代碼:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www./spec/BPMN/20100524/MODEL" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema" xmlns:activiti="http:///bpmn" xmlns:bpmndi="http://www./spec/BPMN/20100524/DI" xmlns:omgdc="http://www./spec/DD/20100524/DC" xmlns:omgdi="http://www./spec/DD/20100524/DI" typeLanguage="http://www./2001/XMLSchema" expressionLanguage="http://www./1999/XPath" targetNamespace="http://www./test">
<process id="personalAssignee1" name="PersonalAssignee1" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="審批" activiti:assignee="crystal"></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_personalAssignee1">
<bpmndi:BPMNPlane bpmnElement="personalAssignee1" id="BPMNPlane_personalAssignee1">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="360.0" y="20.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="325.0" y="100.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="360.0" y="200.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="377.0" y="55.0"></omgdi:waypoint>
<omgdi:waypoint x="377.0" y="100.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="377.0" y="155.0"></omgdi:waypoint>
<omgdi:waypoint x="377.0" y="200.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
方式二:
定義流程圖時配置任務(wù)節(jié)點變量,完成任務(wù)之前由流程變量指定任務(wù)辦理人。在開發(fā)中,可以在頁面中指定下一個任務(wù)的辦理人,通過流程變量設(shè)置下一個任務(wù)的辦理人。

流程圖代碼
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www./spec/BPMN/20100524/MODEL" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema" xmlns:activiti="http:///bpmn" xmlns:bpmndi="http://www./spec/BPMN/20100524/DI" xmlns:omgdc="http://www./spec/DD/20100524/DC" xmlns:omgdi="http://www./spec/DD/20100524/DI" typeLanguage="http://www./2001/XMLSchema" expressionLanguage="http://www./1999/XPath" targetNamespace="http://www./test">
<process id="personalTask2" name="PersonalTask2" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="審批" activiti:assignee="#{userId}"></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_personalTask2">
<bpmndi:BPMNPlane bpmnElement="personalTask2" id="BPMNPlane_personalTask2">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="380.0" y="40.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="345.0" y="110.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="380.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="397.0" y="75.0"></omgdi:waypoint>
<omgdi:waypoint x="397.0" y="110.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="397.0" y="165.0"></omgdi:waypoint>
<omgdi:waypoint x="397.0" y="210.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
方式三:
流程圖中不指定任務(wù)辦理人,添加監(jiān)聽類,需要實現(xiàn)TaskListener接口。

流程圖代碼:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www./spec/BPMN/20100524/MODEL" xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema" xmlns:activiti="http:///bpmn" xmlns:bpmndi="http://www./spec/BPMN/20100524/DI" xmlns:omgdc="http://www./spec/DD/20100524/DC" xmlns:omgdi="http://www./spec/DD/20100524/DI" typeLanguage="http://www./2001/XMLSchema" expressionLanguage="http://www./1999/XPath" targetNamespace="http://www./test">
<process id="personalTask3" name="PersonalTask3" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="審批">
<extensionElements>
<activiti:taskListener event="create" class="com.activiti.test.TaskListenerImpl"></activiti:taskListener>
</extensionElements>
</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_personalTask3">
<bpmndi:BPMNPlane bpmnElement="personalTask3" id="BPMNPlane_personalTask3">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="310.0" y="20.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="275.0" y="100.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="310.0" y="200.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="327.0" y="55.0"></omgdi:waypoint>
<omgdi:waypoint x="327.0" y="100.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="327.0" y="155.0"></omgdi:waypoint>
<omgdi:waypoint x="327.0" y="200.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
監(jiān)聽類 TaskListenerImpl.java
package com.activiti.test;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TaskListenerImpl implements TaskListener {
/**
* 指定個人任務(wù)和組任務(wù)的辦理人
*/
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("crystal");// 指派個人任務(wù)
}
}
測試類:
package com.activiti.test;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class PersonalTask {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定義,啟動流程實例
*/
@Test
public void deployAndStart() {
processEngine.getRepositoryService()
.createDeployment()
.name("指定個人任務(wù)")
.addClasspathResource("diagrams/personalTask3.bpmn")
.addClasspathResource("diagrams/personalTask3.png")
.deploy();
System.out.println("部署成功!");
// 方式一
/*ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey("personalTask1");*/
// 方式二
/*Map<String, Object> variables = new HashMap<String, Object>();
variables.put("userId", "crystal");
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey("personalTask2", variables);*/
// 方式三
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey("personalTask3");
System.out.println("流程實例啟動成功!實例ID:" + pi.getId());
}
/**
* 查詢我的個人任務(wù)列表
*/
@Test
public void findMyTaskList(){
String userId = "crystal";
List<Task> list = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(userId)//指定個人任務(wù)查詢
.list();
if (list != null && list.size()>0) {
for(Task task : list){
System.out.println("task id="+task.getId());
System.out.println("name="+task.getName());
System.out.println("assinee="+task.getAssignee());
System.out.println("executionId="+task.getExecutionId());
System.out.println("=====================================");
}
}
}
/**
* 完成我的個人任務(wù)
*/
@Test
public void complete() {
String taskId = "167508";
processEngine.getTaskService().complete(taskId);
System.out.println("完成任務(wù)");
}
/**
* 可以分配個人任務(wù)從一個人到另一個人
*/
@Test
public void setAssigneeTask(){
String taskId = "172508";//任務(wù)ID
String userId = "barry";//指定任務(wù)的辦理者
processEngine.getTaskService().setAssignee(taskId, userId);
System.out.println("指派成功");
}
}
總結(jié):
個人任務(wù)及三種分配方式:
1:在taskProcess.bpmn中直接寫 assignee=”crystal”
2:在taskProcess.bpmn中寫 assignee=“#{userID}”,變量的值要是String的(使用流程變量指定辦理人)。
3: 使用TaskListener接口,要使類實現(xiàn)該接口,在類中定義:
delegateTask.setAssignee(assignee);// 指定個人任務(wù)的辦理人
使用任務(wù)ID和辦理人重新指定辦理人:
processEngine.getTaskService().setAssignee(taskId, userId);
|