【整合篇】JBPM4.4業務與流程的整合
在這次學習工作流的過程中,工作流如何與業務結合有多種方式,雖然很簡單,但是每次都要再次梳理幾分鐘,這次拿出來整理一下,將它真正成為自己的知識。
從啟動流程開始說:
申請頁面:選擇所用流程(即畫的流程圖的id)
<table cellpadding="0" cellspacing="0" class="mainForm"> <tr> <td width="120px"> <div> 所用流程:<s:select name="processDefinitionKey" cssClass="SelectStyle" list="processDefinitionList" listKey="key" listValue="key"/> </div> </td> </tr> <tr> <td>申請名稱:</td> <td><input type="text" name="title" cssClass="InputStyle" /></td> </tr> <tr> <td>申請理由:</td> <td><input type="text" name="reason" cssClass="InputStyle" /></td> </tr> </table>
提交申請:獲取前臺傳來的值
/** 提交申請 */ public String submit() throws Exception { // 封裝申請資訊 Application application = new Application(); title=new String(title.getBytes("iso-8859-1"),"utf-8"); reason=new String(reason.getBytes("iso-8859-1"),"utf-8"); application.setApplicant(getCurrentUser()); // 申請人,當前使用者 application.setTitle(title); application.setReason(reason); String processDefinitionKeyStr=new String(processDefinitionKey.getBytes("iso-8859-1"),"utf-8"); application.setProcessDefinitionKey(processDefinitionKeyStr); // 呼叫業務方法(儲存申請資訊,並啟動流程開始流轉) applicationService.submit(application); return "toMyApplicationList"; // 成功後轉到"我的申請查詢" } public void submit(Application application) { // 1,設定屬性並儲存application application.setApplyTime(sdf.format(new Date())); // 申請時間,當前時間 application.setStatus(Application.STATUS_RUNNING); // 2,啟動程程例項開始流轉 // >> 準備流程變數 Map<String, Object> variablesMap = new HashMap<String, Object>(); variablesMap.put("application", application); // >> 啟動流程例項,並帶上流程變數(當前的申請資訊) //獲取流程定義的key String pdKey = application.getProcessDefinitionKey(); //根據流程定義的key值和相應的流程變數啟動流程 ProcessInstance pi = processEngine.getExecutionService()// .startProcessInstanceByKey(pdKey, variablesMap); application.setExecuteId(pi.getId()); getSession().save(application); // 儲存 // >> 辦理完第1個任務“提交申請” Task task = processEngine.getTaskService()// .createTaskQuery()// 查詢出本流程例項中當前僅有的一個任務“提交申請” .processInstanceId(pi.getId())// .uniqueResult(); processEngine.getTaskService().completeTask(task.getId()); }
當點選提交申請時application,我們來看看工作流的各個表的變化:
jbpm4_execution:
jbpm4_task:
jbpm4_variable:
那麼通過檢視上面表的變化,我們不難發現執行的流程是通過什麼和業務繫結的,即jbpm4_execution和jbpm4_variable的關係。
從流程的啟動開始,就與業務繫結關係,那麼接下來如何應用呢?
下面只是簡單介紹,對於一些結合業務的查詢問題會單獨再說明:
檢視待辦任務:一般是根據使用者名稱來檢視(當前登陸使用者)
/** 待我審批(我的任務列表) */ public String myTaskList() throws Exception { List<TaskView> taskViewList = applicationService.getMyTaskViewList(getCurrentUser()); //List<TaskView> taskViewList = applicationService.getMyTaskViewList(user); ActionContext.getContext().put("taskViewList", taskViewList); return "myTaskList"; }
審批處理:
本環節因為單獨出來有一個審批意見表,故會將所有的審批意見新增的審批意見表中,故這個環節的內容是儲存資料然後辦理任務並判斷流程是否結束。當然我們也可以不單獨設計審批意見表,而是將所有的審批意見儲存到流程變數中。
辦理任務需要獲取任務id,也就是在檢視任務列表中獲取taskViewList。
審批處理頁面,審批處理:
/** 審批處理頁面 */
public String approveUI() throws Exception {
Set<String> outcomes = applicationService.getOutcomesByTaskId(taskId);
ActionContext.getContext().put("outcomes", outcomes);
return "approveUI";
}
/** 審批處理 */
public String approve() throws Exception {
// 封裝
ApproveInfo approveInfo = new ApproveInfo();
comment=new String(comment.getBytes("iso-8859-1"),"utf-8");
approveInfo.setComment(comment);
approveInfo.setApproval(approval);
approveInfo.setApplication(applicationService.getById(applicationId));
approveInfo.setApprover(getCurrentUser()); // 審批人,當前登入使用者
approveInfo.setApproveTime(sdf.format(new Date())); // 當前時間
if(outcome!=null){
// 呼叫用業務方法(儲存本次審批資訊,並辦理完任務,並維護申請的狀態)
outcome=new String(outcome.getBytes("iso-8859-1"),"utf-8");
}
applicationService.approve(approveInfo, taskId, outcome);
return "toMyTaskList"; // 成功後轉到待我審批頁面
}
//辦理任務
public void approve(ApproveInfo approveInfo, String taskId, String outcome) {
// 1,儲存本次審批資訊
getSession().save(approveInfo);
// 2,辦理完任務
Task task = processEngine.getTaskService().getTask(taskId); // 一定要先取出Task物件,再完成任務,否則拿不到,因為執行完就變成歷史資訊了。
if (outcome == null) {
processEngine.getTaskService().completeTask(taskId);
} else {
processEngine.getTaskService().completeTask(taskId, outcome);
}
// >> 取出所屬的流程例項,如果取出的為null,說明流程例項執行完成了,已經變成了歷史記錄
ProcessInstance pi = processEngine.getExecutionService().findProcessInstanceById(task.getExecutionId());
// 3,維護申請的狀態
Application application = approveInfo.getApplication();
if (!approveInfo.isApproval()) {
// 如果本環節不同意,則流程例項直接結束,申請的狀態為:未通過
if (pi != null) { // 如果流程還未結束
processEngine.getExecutionService().endProcessInstance(task.getExecutionId(), ProcessInstance.STATE_ENDED);
}
application.setStatus(Application.STATUS_REJECTED);
} else {
// 如果本環節同意,而且本環節是最後一個環節,則流程例項正常結束,申請的狀態為:已通過
if (pi == null) { // 本環節是最後一個環節,即流程已經結束了
application.setStatus(Application.STATUS_APPROVED);
}
}
getSession().update(application);
}
檢視流轉記錄:即類似淘寶檢視物流資訊類似,完全使用業務資訊
/** 檢視流轉記錄 applicationId*/
public String approveHistory() throws Exception {
Application application = applicationService.getById(applicationId);
System.out.println(application.getTitle());
ActionContext.getContext().put("approveInfos", application.getApproveInfos());
return "approveHistory";
}
檢視我的申請:完全檢視自己的業務資訊表即可
/** 我的申請查詢 */
public String myApplicationList() throws Exception {
String strHQL="from Application where applicant="+getCurrentUser().getUserId() ;
// 準備資料
List<Application> applicationList = applicationService.findByHql(strHQL);
ActionContext.getContext().put("applicationList", applicationList);
return "myApplicationList";
}
/**
* 檢視流程圖,高亮當前正在執行的節點
*/
public String showProcessImageUI() throws Exception {
/*boolean isEnded = "true".equals(request.getParameter("isEnded")); // 是否已執行完
String processInstanceId = getParameter(request, "processInstanceId");*/
//未考慮是否完成情況
//boolean isEnded=false;
//啟動的例項id
//String processInstanceId="ApplyDepartment.8";
// 1,獲取當前正在執行的活動名稱
String deploymentId = null;
String processDefinitionId = null;
Set<String> activityNames = null;
status=new String(status.getBytes("iso-8859-1"),"utf-8");
if (!status.equals("審批中")) {
// 已執行完的,就查詢歷史
HistoryProcessInstance hpi = processEngine.getHistoryService()//
.createHistoryProcessInstanceQuery()//
.processInstanceId(processInstanceId)//
.uniqueResult();
processDefinitionId = hpi.getProcessDefinitionId();
activityNames = new HashSet<String>();
activityNames.add(hpi.getEndActivityName()); // 結束的活動名稱
} else {
// 正在執行的,就使用ExecutionService查詢
ProcessInstance pi = processEngine.getExecutionService()//
.createProcessInstanceQuery()//
.processInstanceId(processInstanceId)//
.uniqueResult();
processDefinitionId = pi.getProcessDefinitionId();
activityNames = new HashSet<String>(pi.findActiveActivityNames()); // 當前正在執行的活動的名稱
}
ActionContext.getContext().put("processDefinitionId", processDefinitionId);
// 2,找出他們的座標
Set<ActivityCoordinates> coordList = new HashSet<ActivityCoordinates>();
for (String activityName : activityNames) {
ActivityCoordinates coord = processEngine.getRepositoryService().getActivityCoordinates(
processDefinitionId, activityName);
coordList.add(coord);
}
ActionContext.getContext().put("coordList", coordList);
// 3,獲取 deploymentId
deploymentId = processEngine.getRepositoryService().createProcessDefinitionQuery()//
.processDefinitionId(processDefinitionId)//
.uniqueResult()//
.getDeploymentId();
ActionContext.getContext().put("deploymentId", deploymentId);
return "showProcessImageUI";
}
總結:
其實寫這篇部落格的目的是結合工作流的資料庫來分析業務與流程是如何繫結的,那麼對於流程中需要的一些常用方法的使用在這裡也簡單的介紹了一番,這樣做的目的也是為後面的Activiti中的應用例項的常用方法介紹做個對比,其實無論是JBPM4.4還是它的升級版Activiti本質上都是一樣的。
相關推薦
【整合篇】JBPM4.4業務與流程的整合
在這次學習工作流的過程中,工作流如何與業務結合有多種方式,雖然很簡單,但是每次都要再次梳理幾分鐘,這次拿出來整理一下,將它真正成為自己的知識。 從啟動流程開始說: 申請頁面:選擇所用流程(即畫的流程圖的id) <table cellpadding="0" ce
【整合篇】JBPM4.4與Spring整合
我們大家都知道容器的好處,那麼工作流也提供了與spring整合的方式,將工作流引擎由spring容器統一管理起來,共同擁有容器的特性。下面來從程式碼的角度來看看整合與不整合的對比: 未整合: 引入相應的jar包,使用hibernate來持久化 配
【升級篇】JBPM4.4過渡到Activiti
簡單介紹一下Activiti背景 Activiti的出現: Activiti的創始人Tom Baeyens是JBPM的創始人,由於與合作伙伴在JBPM的未來架構上產生意見分歧,Tom Baeyens在2010年離開了JBoss並加入Alfresco公司。Tom B
從零構建AR APP新手教程【Android篇】(4)-APP互動邏輯及嵌入呼叫Unity
學習AR應用開發有一段時間了,自己開發了一款簡單的APP來練手,在這裡分享給大家。 前面介紹了Unity3D部分的實現,現在就來介紹Android原生部分的編碼實現。 1.APP基礎UI框架及互動邏輯 首頁就是簡單的ViewPager+Fragment,其中資料用
3、非線性結構--樹與二叉樹——數據結構【基礎篇】
位置 enter 深度 基礎 表達式 左右 -a 基礎篇 先序遍歷 非線性結構--樹與二叉樹 二叉樹的基礎知識: 二叉樹的特點: 1、每個結點的度<=2 2、二叉樹是有序樹 二叉樹的五種不
【Spark篇】---Spark中資源調度源碼分析與應用
部分 app post 類名 inf master 執行過程 efault spark 一、前述 Spark中資源調度是一個非常核心的模塊,尤其對於我們提交參數來說,需要具體到某些配置,所以提交配置的參數於源碼一一對應,掌握此節對於Spark在任務執行過程中的資源分配會更上
26、【opencv入門】輪廓查找與繪制(4)——正外接矩形
waitkey font 定義 truct 形狀 esp 圖片 namespace open 一、簡介 1、使用特定形狀的輪廓包圍 在實際應用中, 經常會有將檢測到的輪廓用多邊形表示出來的需求, 提取包圍輪廓的多邊形也方便我們做進一步分析, 輪廓包圍主要有一下幾種: 輪
【PHP篇】變數與常量
變數: 變數的作用域為函式區域 判斷是否存在:isset($變數名);//返回bool 判斷是否為空:empty($變數名)//變數未宣告或者值為空返回1,否則返回false 清除變數:unset($變數名) 或者 $變數名=null; 引用:$a=10; $b
Python學習之路【第一篇】:Python簡介與入門
Python簡介 一、什麼是Python Python 是一個高層次的結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。 Python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。 Python 是一種解釋型語言:原始碼不是
【Android Web】騰訊X5瀏覽器的整合與常見問題
近年來,混合開發也越來越用的更多,而原生webview的各種坑,比如說 上傳圖片、檔案問題、視訊全屏問題(什麼在微信上開啟都是好的,你這怎麼全屏不了)、版本差異問題,所以還是建議使用騰訊x5瀏覽器。 廢話不多說,我們開始整合吧 1.去官網上下載最新的jar、so檔案等 連結點這裡
【JVM第九篇】:Executor框架與執行緒池
Executor框架簡介 在Java 5之後,併發程式設計引入了一堆新的啟動、排程和管理執行緒的API。Executor框架便是Java 5中引入的,其內部使用了執行緒池機制,它在java.util.cocurrent 包下,通過該框架來控制執行緒的啟動、執行和關閉,可以簡化併發程式設計
【輔助駕駛】KITTI鐳射資料與影象資料的融合MATLAB實現[4]——稠密深度圖實現
一、實現效果 二、思路與程式碼 由於鐳射點雲資料比較稀疏,直接將鐳射雷達資料對映到影象上,會有很多點不匹配,對於缺失的深度資訊,可以通過周圍點的深度的權重進行填充。 % Written by Muhammet Balcilar, France % All rights rese
【資料庫篇】——4.使用者登入註冊系統設計和分析思路
1.功能需求分析 本系統的功能就兩個:使用者登入和註冊。a.使用者登入需要我們根據使用者的輸入的資訊到資料查詢使用者的賬號密碼是否能夠匹配的上。b.使用者註冊需要我們將使用者的資訊加入到資料庫中。2.架構設計:MVC的模式(模式一) 在這裡我們採用MVC的模式進行開發,這
【JAVA併發第一篇】Java的程序與執行緒
# 1、程序與執行緒 ## 1.1、程序 程序可以看作是程式的執行過程。一個程式的執行需要CPU時間、記憶體空間、檔案以及I/O等資源。作業系統就是以程序為單位來分配這些資源的,所以說程序是分配資源的基本單位。 (1)、程序是動態的,程式是靜態的 程式是靜態的,它本身作為一種軟體資源可以長期儲存在磁碟(常
【框架篇】mvc、mvp、mvvm使用關系總結
mvc模型 details eset 網站架構 特性 自動 分享 規模 arch MVC MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯
【51CTO學院】預熱4周年慶,福利領領領!!!
獎品 福利 會員 51cto學院 周年慶 4年前的7月1日,51CTO學院平臺誕生了!自此每年的7月1日,學院都會為粉絲們準備一大福利,今年也不例外,而且是兩大波!!!來來來~~~我們先看看第一波,第二波福利比第一波大了NNNNNNN倍,文章最後會有劇透喲 ^_^ 51CTO學院4周年回饋
給佳能相機加一個功能外掛——魔燈【安裝篇】
nbsp 文件大小 重啟 bin eas wid 拓展 pan 破壞 #背景 佳能是老牌的單反廠商,旗下擁有眾多消費級的單反相機覆蓋了入門、進階和專業。 而我們今天的主角,是一款叫“魔燈magic lantern”的外掛程序,他不是相機的ROM,而是放在SD
【入門篇】ANDROID開發之BUG專講
world 自然 執行 類型 效率 str 積累 全部 href 話說諸葛亮是一個優秀的程序員,每個錦囊都是應對不同的case而編寫的。可是優秀的程序員也敵只是更優秀的bug。六出祈山。七進中原,鞠躬盡瘁,死而後已的諸葛亮僅僅由於有一
【實戰篇】手把手教你接LSI9211-8I卡
lsi9211 8i卡接法 小編馬上手把手教你一次接8個硬盤,為批處理修復硬盤做好準備。先讓大家看一下整體接法一覽圖。白口接電源,黑口接SAS~~輕松簡易視頻體積稍大,建議WIFI環境下觀看http://www.hddup.com/CustomMovie/LSI9211-8I%E5%8D%A1%E6%
PowerShell【IF篇】
比較運算 rsh contain powers 比較運算符 tex 裏的 nbsp str 1 [int]$num=0 2 do 3 { 4 $num+=1 5 if($num%2) 6 { 7 "$num"+" 是奇數" 8 }e