activiti 連線 、指定處理人、網關、監聽、任務類型

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

 

其實這個在畫圖時候,就有提示:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章