activiti 連線
https://blog.csdn.net/oChangWen/article/details/51910929
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zcy
* @version 2019/9/21
* Created by zcy on 2019/9/21.
*/
@RestController
@RequestMapping("/study")
@Api("study")
public class StudyController {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
private static String processDefindKey= "mySecondProcess";
@ApiOperation("啓動實例")
@GetMapping("startProcess")
public void startProcess(){
System.out.println("啓動實例");
//設置提交人變量
Map paramMap = new HashMap<>();
paramMap.put("submituser","王小寶");
runtimeService.startProcessInstanceByKey(processDefindKey,paramMap);
}
@ApiOperation("完成提交任務")
@GetMapping("submitTaskProcess")
public void submitTaskProcess(){
System.out.println("完成提交任務");
String taskId = "50028";
Map paramMap = new HashMap();
//連線的判斷條件
paramMap.put("leaveDay",4);
//設置變量
taskService.setVariable(taskId,"manerUsers","小A,小B,小C,小D");
taskService.complete(taskId,paramMap);
}
@ApiOperation("指派其他人員處理")
@GetMapping("assignUser")
public void assignUser(){
System.out.println("指派其他人員處理");
String taskId = "50033";
//刪除指派人
taskService.deleteCandidateUser(taskId,"小A");
//指定其他小E處理
taskService.addCandidateUser(taskId,"小E");
//chian 就變成單個人,不是組了。以前的組就沒有了
//taskService.claim(taskId,"小K");
}
@ApiOperation("經理審批")
@GetMapping("mangerTaskProcess")
public void mangerTaskProcess(){
System.out.println("經理審批");
String taskId = "50004";
taskService.complete(taskId);
}
}
指定處理人
https://blog.csdn.net/oChangWen/article/details/52504210
3-1.個人任務--分配個人任務方式一(直接指定辦理人)
1:流程圖中任務節點的配置
3-2.分配個人任務方式二(使用流程變量)
@ApiOperation("啓動實例")
@GetMapping("startProcess")
public void startProcess(){
System.out.println("啓動實例");
Map paramMap = new HashMap<>();
paramMap.put("submituser","王小寶");
runtimeService.startProcessInstanceByKey(processDefindKey,paramMap);
}
3-3.分配個人任務方式三(使用類)
assgin 不要配置,在listener 裏面 設置
@Service("secondListenr")
public class SecondListner implements TaskListener{
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("-----SecondListner--- "+delegateTask.getId());
delegateTask.setAssignee("王二寶");
}
}
查人指派人的任務
List<Task> taskList2 = taskService.createTaskQuery().taskAssignee("王小寶").list();
for (Task task : taskList2) {
System.out.println("taskname:" + task.getName() + " taskId:" + task.getId() + " assgin:" + task.getAssignee());
}
總結
個人任務及三種分配方式:
1:在taskProcess.bpmn中直接寫 assignee=“張三丰"
2:在taskProcess.bpmn中寫 assignee=“#{userID}”,變量的值要是String的。
使用流程變量指定辦理人
3,使用TaskListener接口,要使類實現該接口,在類中定義:
delegateTask.setAssignee(assignee);// 指定個人任務的辦理人
3-4、分配組任務方式一(直接指定辦理人)
3-5、分配個人任務方式二(使用流程變量)
@ApiOperation("完成提交任務")
@GetMapping("submitTaskProcess")
public void submitTaskProcess(){
System.out.println("完成提交任務");
String taskId = "50028";
Map paramMap = new HashMap();
paramMap.put("leaveDay",4);
// 設置組人員 變量
taskService.setVariable(taskId,"manerUsers","小A,小B,小C,小D");
taskService.complete(taskId,paramMap);
}
3-6.分配個人任務方式三(使用類)
@Service("thirdLister")
public class TaskListenerImpl implements TaskListener {
/**用來指定任務的辦理人*/
@Override
public void notify(DelegateTask delegateTask) {
//指定個人任務的辦理人,也可以指定組任務的辦理人
//個人任務:通過類去查詢數據庫,將下一個任務的辦理人查詢獲取,然後通過setAssignee()的方法指定任務的辦理人
//delegateTask.setAssignee("滅絕師太");
//組任務:
delegateTask.addCandidateUser("郭靖");
delegateTask.addCandidateUser("黃蓉");
}
指定組人員的 查詢任務:
@ApiOperation("查詢任務:指定人")
@GetMapping("queryTaskByAssgin")
public void queryTaskByAssgin() {
System.out.println("查詢任務:指定人");
//組人員的任務查詢
List<Task> taskList = taskService.createTaskQuery().taskCandidateUser("小D").list();
System.out.println("-----------------1");
for (Task task : taskList) {
System.out.println("taskname:" + task.getName() + " taskId:" + task.getId() + " assgin:" + task.getAssignee());
}
System.out.println("-----------------2");
//單個人任務查詢
List<Task> taskList2 = taskService.createTaskQuery().taskAssignee("小D").list();
for (Task task : taskList2) {
System.out.println("taskname:" + task.getName() + " taskId:" + task.getId() + " assgin:" + task.getAssignee());
}
}
任務獲取組人員:
@ApiOperation("查詢任務:指定流程實例")
@GetMapping("queryTask")
public void queryTask(){
List<Task> taskList = taskService.createTaskQuery().processInstanceId("50023").list();
for(Task task : taskList){
System.out.println("taskname:"+task.getName()+" taskId:"+task.getId()+" assgin:"+task.getAssignee());
List<IdentityLink> list = taskService
.getIdentityLinksForTask(task.getId());
if(list!=null && list.size()>0){
for(IdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
}
查找歷史的任務的組人員
public void findHistoryPersonTask(){
//流程實例ID
String processInstanceId = "6201";
List<HistoricIdentityLink> list = processEngine.getHistoryService()//
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
if(list!=null && list.size()>0){
for(HistoricIdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
組人員的任務 指派給個人
public void claim(){
//將組任務分配給個人任務
//任務ID
String taskId = "7204";
//分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
String userId = "小D";
processEngine.getTaskService()//
.claim(taskId, userId);
}
這樣查詢任務就是:taskService.createTaskQuery().taskAssignee("小D").list()
而之前查詢:taskService.createTaskQuery().taskCandidateUser("小D").list()
將個人任務回退到組任務,前提,之前一定是個組任務
public void setAssigee(){
//任務ID
String taskId = "6204";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
向組任務中添加成員
public void addGroupUser(){
//任務ID
String taskId = "6204";
//成員辦理人
String userId = "大H";
processEngine.getTaskService()//
.addCandidateUser(taskId, userId);
}
從組任務中刪除成員
public void deleteGroupUser(){
//任務ID
String taskId = "6204";
//成員辦理人
String userId = "小B";
processEngine.getTaskService()//
.deleteCandidateUser(taskId, userId);
}
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", "大大,小小,中中");
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(參與者)
網關
https://blog.csdn.net/oChangWen/article/details/52504062
監聽、任務類型
任務類型中有幾種類型,我選user task 和 service task 介紹
一般流程都選user task 裏面需要設置assgin等,也可以設置listener。需要執行complete 纔可以完成任務,執行下一個節點。
service task,不需要complete,就會執行。例如:第一個是user task 1執行完complte後,後面跟着service task2 在更正user task3。會執行完service task2後,創建user task3,等待user task3 執行
service task 使用 express 的使用:
新建Service接口和實現類
public interface ResumeService {
void storeResume();
}
@Service("resumeService")
public class ResumeServiceImpl implements ResumeService {
@Override
public void storeResume() {
System.out.println("任務已經執行.....................................");
}
}
監聽器listener
https://msd.misuland.com/pd/3255817997595449232
監聽器分爲三種:JavaDelegate
TaskListener
ExecutionListener
用戶任務(UserTask)的監聽器爲TaskListener
Java服務任務(Service Task)的監聽器爲JavaDelegate
其他的服務的監聽器爲ExecutionListener
TaskListener中參數(DelegateTask)是有關於userTask的
JavaDelegate和ExecutionListener參數(DelegateExecution)是有關於流程的
使用監聽器的方式有三種:
1.直接是用class的方式,如下標籤
activiti:class="org.activiti.examples.bpmn.servicetask.ToUpperCaseFieldInjected"
class ToUpperCaseFieldInjected implment TaskListener
2.用expression的方式(這種方式還沒有試驗過,之後補充)
<activiti:expression>${genderBean.getGenderString(gender)}</activiti:expression>
@Service("genderBean")
class GenderBean implment TaskListener {
public void getGenderString(String gender){
}
}
3.用delegateExpression的方式
activiti:delegateExpression="${someJavaDelegateBean}"
@Service("someJavaDelegateBean")
class SomeJavaDelegateBeanimplment TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("--FiveListner--notify taskId:"+delegateTask.getId()+" assin:"+delegateTask.getAssignee());
}
}
這種方式是利用bean進行查找類的,someJavaDelegateBean是bean,比如現在項目都是由spring管理的,可以在監聽器的類上直接加上@Service("someJavaDelegateBean");
利用這種方式可以和spring進行無縫對接,也解決自定義的service無法注入的問題。第一種方式是服務自定注入自定義service的;@Autowired
以上的implment 都是 TaskListener。那是因爲是user task,如果換成 Service Task)的 implment JavaDelegate
其實這個在畫圖時候,就有提示: