1. 程式人生 > >Activiti工作流--組任務角色的設定--之十二(完結)

Activiti工作流--組任務角色的設定--之十二(完結)

將任務分配給某個角色
  • 在流程設計當中指定處理任務的某個角色 (注意:新增處理人員不是在assignee選項 而是 cadidate group)
  • 在流程設計的時候用流程變數的方式指定某個角色作為處理人,然後在前面的流程處理完的時候用流程變數指定某些角色的人傳入到下一個流程 .
  • 在流程設計的時候給流程任務新增一個監聽器 ,在業務程式碼裡面指定某個角色

注意: 查詢任務方式的不一樣(只能通過候選者引數查詢) 處理的過程中有個拾取的動作

獲取連線’

private ProcessEngine processEngine ;
	
@Before
public void initProcessEngine
(){ processEngine = ProcessEngines.getDefaultProcessEngine(); }
流程的定義及部署
/**
 * 流程定義(流程圖的設計)好以後,需要部署
 * 流程部署涉及到的幾個動作和表
 * 流程部署表 act_re_deployment
 * 流程定義表 act_re_procdef
 * 流程資源表 act_ge_bytearray
 * */
@Test
public void testProcessDeploy(){
	/*//1:通過流程定義相關的介面 respositoryService 來建立部署構建器
	RepositoryService respositoryService = 
				processEngine.getRepositoryService();  //流程部署和流程定義相關的服務介面
	DeploymentBuilder deploymentBuilder  = respositoryService.createDeployment();
	//2:新增資源
	deploymentBuilder.addClasspathResource("diagrams/leave.bpmn");
	deploymentBuilder.addClasspathResource("diagrams/leave.png");
	deploymentBuilder.name("請假流程");
	//3 :進行部署
	Deployment deploy = deploymentBuilder.deploy();*/
//activiti支援鏈式程式設計 Deployment deploy = processEngine.getRepositoryService() .createDeployment() .addClasspathResource("diagrams/groupTaskDelegate.bpmn") .addClasspathResource("diagrams/groupTaskDelegate.png") .name("分配角色任務") .deploy(); System.out.
println("流程部署ID:"+deploy.getId()); System.out.println("流程部署的名稱:"+deploy.getName()); IdentityService identityService = processEngine.getIdentityService(); //建立角色 identityService.saveGroup(new GroupEntity("部門主管")); identityService.saveGroup(new GroupEntity("部門經理")); identityService.saveGroup(new GroupEntity("CTO")); //建立使用者 identityService.saveUser(new UserEntity("張三")); identityService.saveUser(new UserEntity("李四")); identityService.saveUser(new UserEntity("王五")); identityService.saveUser(new UserEntity("趙六")); identityService.saveUser(new UserEntity("田七")); identityService.saveUser(new UserEntity("胡八")); //建立角色和使用者的對應關係 identityService.createMembership("張三", "部門主管"); identityService.createMembership("李四", "部門主管"); identityService.createMembership("王五", "部門經理"); identityService.createMembership("趙六", "部門經理"); identityService.createMembership("田七", "CTO"); identityService.createMembership("胡八", "CTO"); }

流程圖 groupTaskDelegate.bpmn程式碼

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="groupTaskDelegate" name="groupTaskDelegateProcess" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="部門主管審批" activiti:candidateGroups="部門主管"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="部門經理審批" activiti:candidateGroups="${manageId}"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <userTask id="usertask3" name="技術總監審批">
      <extensionElements>
        <activiti:taskListener event="create" class="com.tz.activitiTest.listener.GroupTaskListener"></activiti:taskListener>
      </extensionElements>
    </userTask>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_groupTaskDelegate">
    <bpmndi:BPMNPlane bpmnElement="groupTaskDelegate" id="BPMNPlane_groupTaskDelegate">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="290.0" y="100.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="255.0" y="200.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="255.0" y="310.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
        <omgdc:Bounds height="55.0" width="105.0" x="257.0" y="420.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="292.0" y="510.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="307.0" y="135.0"></omgdi:waypoint>
        <omgdi:waypoint x="307.0" y="200.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="307.0" y="255.0"></omgdi:waypoint>
        <omgdi:waypoint x="307.0" y="310.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="307.0" y="365.0"></omgdi:waypoint>
        <omgdi:waypoint x="309.0" y="420.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="309.0" y="475.0"></omgdi:waypoint>
        <omgdi:waypoint x="309.0" y="510.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

流程圖

租任務角色設定
/** 
 * 
 * 流程的啟動(流程例項的產生) new Class->Object	
 * 涉及到的表 :
 * 			act_ru_execution  流程例項表
 * 			act_ru_task 會產生一條待執行的任務記錄
 * 			act_hi_taskinst 也會產生一條歷史任務記錄(注意:endtime is null)
 * 注意: 以流程定義的key啟動的話,預設會進入版本最新的流程
 */
@Test
public void testStartProcess(){
	String processDefinitionKey = "groupTaskDelegate";
	//流程定義的key啟動的話,預設會進入版本最新的流程
	ProcessInstance processInstance = processEngine.getRuntimeService() //與流程例項執行相關的服務類
				  .startProcessInstanceByKey(processDefinitionKey);//啟動流程 ,生成一個流程例項
	
	System.out.println("流程部署的ID:"+processInstance.getDeploymentId());
	System.out.println("流程定義的ID:"+processInstance.getProcessDefinitionId());
	System.out.println("流程例項的ID:"+processInstance.getProcessInstanceId());
	
}

/**
 * 流程處理過程:查詢個人任務
 * 處理流程的步驟:查詢個人任務 完成個人任務
 * 涉及到的表:act_ru_task
 * 
 */
@Test
public void testQueryMyTask(){		
	String assignee = "張三";
	String processinstanceId = "147501";
	List<Task> taskList= processEngine.getTaskService()  //跟任務處理相關的服務類
				 .createTaskQuery() //建立一個任務查詢 
				 .taskAssignee(assignee) //加入查詢條件
				 .processInstanceId(processinstanceId)
				 .list();					//返回形式
		
	if(taskList!=null&&taskList.size()>0){
		for(Task task:taskList){
			System.out.println("流程定義ID:"+task.getProcessDefinitionId());
			System.out.println("流程例項ID:"+task.getProcessInstanceId());
			System.out.println("執行物件ID:"+task.getExecutionId());
			System.out.println("任務ID:"+task.getId());//任務ID:10004
			System.out.println("任務名稱:"+task.getName());
			System.out.println("任務的建立時間:"+task.getCreateTime());
			
		}
	}
}


@Test
public void testQueryMyGroupTask(){		
	String assignee = "田七";
	String processinstanceId = "147501";
	List<Task> taskList= processEngine.getTaskService()  //跟任務處理相關的服務類
				 .createTaskQuery() //建立一個任務查詢 
				 .taskCandidateUser(assignee) //加入查詢條件
				 .processInstanceId(processinstanceId)
				 .list();					//返回形式
		
	if(taskList!=null&&taskList.size()>0){
		for(Task task:taskList){
			System.out.println("流程定義ID:"+task.getProcessDefinitionId());
			System.out.println("流程例項ID:"+task.getProcessInstanceId());
			System.out.println("執行物件ID:"+task.getExecutionId());
			System.out.println("任務ID:"+task.getId());//任務ID:130004
			System.out.println("任務名稱:"+task.getName());
			System.out.println("任務的建立時間:"+task.getCreateTime());
			
		}
	}
}

//因為一組人都具有任務許可權 ,我們得到任務ID之後,可以根據任務ID來查詢哪些人具有此次任務的處理許可權
@Test
public void testQueryGroupUserByTaskId(){
	String taskId ="147504";
	List<IdentityLink> identityLinkList = processEngine.getTaskService()
										.getIdentityLinksForTask(taskId);
	if(identityLinkList!=null&&identityLinkList.size()>0){
		for(IdentityLink identityLink:identityLinkList){
			System.out.println(identityLink.getGroupId());
			System.out.println(identityLink.getUserId());
			System.out.println(identityLink.getTaskId());
			}
	}
}


//任務拾取
//我們設定的任務處理人員暫時都只是候選人 ,並不是實際處理人,必須經過任務拾取的過程來確定誰來處理任務 (task assignee)
//任務拾取的過程,就是給執行任務表指定assginee欄位值的過程
@Test
public void claimTask(){
	String taskId = "157502";
	String userId = "胡八";
	processEngine.getTaskService().claim(taskId, userId);
	
	//任務拾取以後, 可以回退給組
	//processEngine.getTaskService().setAssignee(taskId, null);
	//任務拾取以後,可以轉給別人去處理(別人可以是組成員也可以不是)
	//processEngine.getTaskService().claim(taskId, "xiaoxi");
}


/**
 * 流程處理過程:完成個人任務
 * 處理流程的步驟:查詢個人任務 完成個人任務
 * 涉及到的表:act_ru_task
 * 
 */
@Test
public void testCompleteMyTask(){
	String taskId = "157502"; //
	Map<String,Object> mapVariables = new HashMap<String,Object>();
	mapVariables.put("manageId", "部門經理");
	
	processEngine.getTaskService()
					.complete(taskId,mapVariables);
	

	System.out.println("第三個任務完成");
	
	/*String taskId = "25002";
	processEngine.getTaskService()
					.complete(taskId);
	System.out.println("審批任務完成");*/
}


/**
 * 在流程的執行過程中,我們需要查詢流程執行到了那一個狀態
 */
@Test
public void testQueryProinstanceState(){
	String processInstanceId = "115001";
	ProcessInstance processInstance = processEngine.getRuntimeService()
								.createProcessInstanceQuery()
								.processInstanceId(processInstanceId)
								.singleResult();
	if(processInstance!=null){
		System.out.println("當前流程執行到:"+processInstance.getActivityId());
	}else{
		System.out.println("當前流程已結束");

	}
}


/**
 * 當某個任務結束以後,在任務表act_ru_task中的記錄會被刪除 ,
 * 但是act_hi_taskinst記錄的endtime會加上 ,所以我們可以從這個表查詢我們的任務執行歷史記錄
 *  
 * 
 */
@Test
public void testQueryHistoryTask(){
	String assignee = "vicky";
	List<HistoricTaskInstance> historyTaskList = processEngine.getHistoryService()
								.createHistoricTaskInstanceQuery()
								.taskAssignee(assignee)
								.list();
	if(historyTaskList!=null&&historyTaskList.size()>0){
		for(HistoricTaskInstance hisTask:historyTaskList){
			System.out.println("流程定義ID:"+hisTask.getProcessDefinitionId());
			System.out.println("流程例項ID:"+hisTask.getProcessInstanceId());
			System.out.println("執行物件ID:"+hisTask.getExecutionId());
			System.out.println("歷史任務ID:"+hisTask.getId());//任務ID:12502
			System.out.println("歷史任務名稱:"+hisTask.getName());
			System.out.println("歷史任務的結束時間:"+hisTask.getEndTime());
			System.out.println("---------------------");

			
		}
	}
}

/**
 * 當某個流程例項執行完以後以後,在流程例項表表act_ru_execution中的記錄會被刪除 ,
 * 但是act_hi_procinst表中記錄的endtime會加上 ,所以我們可以從這個表查詢我們的歷史流程例項記錄
 * 
 */
@Test
public void testQueryHistoryProcessInstance(){
	String processInstanceId = "130001";
	HistoricProcessInstance hisProcessInst = processEngine.getHistoryService()
				 .createHistoricProcessInstanceQuery()
				 .processInstanceId(processInstanceId)
				 .singleResult();
	 
	if(hisProcessInst!=
            
           

相關推薦

Activiti工作--任務角色設定--完結

將任務分配給某個角色 在流程設計當中指定處理任務的某個角色 (注意:新增處理人員不是在assignee選項 而是 cadidate group) 在流程設計的時候用流程變數的方式指定某個角色作為處理人,然後在前面的流程處理完的時候用流程變數指定某些角色的人傳

Activiti工作--流程變數的設定與應用--

流程變數 在流程執行或者任務執行過程中,用於設定和獲取變數,工作流引擎通過使用流程變數在溜車鞥的執行過程中傳遞引數。 流程變數的作用域 只對應一個流程例項,也就是各個流程之間的變數是相互不影響的。 流程變數的設定 流程變數可以在流程例項啟動的時候,在任

Activiti工作--並行閘道器--

流程的業務描述 會議記錄會籤 並行閘道器是不需要設定流程變數的,並行閘道器不在流程變數的範圍內 比如: 在開完某個產品設計會以後,需要對會議約定一些事項進行簽字畫押涉及到兩個部門(產品部/研發部)的主管和經理 確認的順序: a:產品部的主管確認然後產品部的經

【笨木頭Unity】入門旅010完結:Demo四處找死_UI

UI是遊戲裡必不可少的元素,在Unity裡新增UI是比較輕鬆的事情,但要玩好它,可就不那麼輕鬆了。 沒關係,先入門。   笨木頭花心貢獻,啥?花心?不,是用心。 轉載請註明,原文地址:http://www.benmutou.com/archives/2196

VS2013/MFC程式設計入門對話方塊:屬性頁對話方塊及相關類的介紹

本節開始講一種特殊的對話方塊--屬性頁對話方塊。        屬性頁對話方塊的分類        屬性頁對話方塊想必大家並不陌生,XP系統中桌面右鍵點屬性,彈出的就是屬性頁對話方塊,它通過標籤切換各個頁面。另外,我們在建立MFC工程時使用的嚮導對話方塊也屬於屬性頁對

Java設計模式代理模式

一、什麼是代理模式 Proxy模式又叫做代理模式,是構造型的設計模式之一,它可以為其他物件提供一種代理(Proxy)以控制對這個物件的訪問。 所謂代理,是指具有與代理元(被代理的物件)具有相同的介面的類,客戶端必須通過代理與被代理的目標類互動,而代理一般在互動的過程中(互

JAVA WEBJavaScriptDOM

一、js的String物件 二、js的Array物件 三、js的Date物件 四、js的math物件 五、js的全域性函式 六、js函式的過載 七、js的bom物件

COM技術縱橫初學者

COM縱橫談之二 元件中分配了一塊記憶體,然後建起通過一個引數(可能是一個返回的指 針)傳遞給了客戶,這是一種非常常見的做法。問題是:誰來釋放這塊 記憶體?這主要是由於組建和客戶可能是有不同的程式設計師實現的,他們之 間沒有

Linux C編程1 libevent基本概念

通信 == socket通信 驅動 1.4 event http linu make 一、libevent是幹什麽的 1. 開源的庫, 提高開發效率 封裝了socket通信 封裝了IO多路轉接 2. 精簡, 專註於網絡, 性能高 3

activiti 工作 動態 設定 指定 節點任務人、責任人、 的實現方式

首先給大家看一下我的流程圖: 流程檔案leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/2

Activiti工作筆記——分配任務的三種方式

目錄 1.直接指定辦理人 測試程式碼: package cn.itcast.l_groupTask; import java.io.InputStream; import java.util.HashMap; import java.util.Li

Activiti工作--任務的分配--

使用者任務分配主要有三種方式 將任務分配個某個人 將任務分配個某群人 將任務分配個某個角色(組) 將任務分配個某個人有三個途徑 在流程設計當中指定處理任務的某個人 在流程設計的時候用流程變數的方式指定任務處理人,然後在前面的流程處理完的時候用流程變數指定某

Activiti工作任務的執行/查詢/完成

8張表: SELECT * FROM act_re_deployment; -- 一 流程部署表 SELECT * FROM act_ge_bytearray; -- 二 流程二進位制表

Activiti工作--流程定義--

       由於概念性的東西這裡就不在做更多的介紹了,下面直接對activiti的流程進行介紹,為了方便大家的更快的熟悉流程,在此處我就直接上程式碼介紹,本人技術水平有限,有不正確之處還請大家指出,多謝大家的海涵,在此謝過了!!! 配置資料庫連線 activi

Activiti工作--流程變數應用之一:選擇連線--

流程的業務描述 財務報賬審批流程: 如果財務主管接到審批任務,發現金額只有500時,自己審批完流程結束 如果財務主管接到審批任務,發現金額是1000時,審批完以後轉給財務經理繼續審批,財務經理審批完流程結束 先獲取連線 private ProcessEngi

Activiti工作簡介與環境搭建

簡介 工作流: 業務過程的部分或整體在計算機應用環境下的自動化,使在多個參與者之間按照某種預定義的規則傳遞文件、資訊或任務的過程自動進行,從而實現某個預期的業務目標 工作流系統: 它是一個軟體系統,它完成工作量的定義和管理,並按照在系統中預先定義好的工作流規則進行工作流

Activiti工作流程變數

以請假單為例, 流程變數的意義在於將請假單跟這個流程繫結在一起, 流程走到哪裡, 請假單的狀態就跟到哪裡, 相當於定義了一個流程變數來儲存相對應的狀態. 流程變數存在兩個級別位置, 一是流程例項級別的的流程變數(在流程例項啟動時就將流程變數放入), 二是流程任務級別的流程變

Activiti工作閘道器

回顧: 排他閘道器 新建一個"報銷單"的bpmn: 注: 在部署流程的時候需要注意的是, 當排他閘道器的預設flow是有值的時候, 必須該條flow不能有條件, 否則無

activiti 工作任務回退sql實現

今天說一下activiti中任務回退的實現,業務場景:流程中任意節點除了開始節點,每個任務節點都能回退到上級節點,會籤(暫時沒考慮),來個簡單流程圖 1、簡單介紹下activiti開啟流程後表之間的關係,回退任務就是根據表資料的關係,修改表資料完成回退。 ACT_RU_

Activiti工作異常處理一

SpringMVC + Activiti部署應用時出現文章最後的異常程式碼。這裡說明一下,在部署應用時使用Spring自動部署流程。 首先,仔細檢查各個Service的@Service標識是否都寫上,沒問題下一步。 然後,檢查Acticiti的act_ge_property