【整合篇】JBPM4.4業務與流程的整合
來源:程序員人生 發布時間:2015-02-04 09:11:36 閱讀次數:3281次
在這次學習工作流的進程中,工作流如何與業務結合有多種方式,雖然很簡單,但是每次都要再次梳理幾分鐘,這次拿出來整理1下,將它真正成為自己的知識。
從啟動流程開始說:
申請頁面:選擇所用流程(即畫的流程圖的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⑻859⑴"),"utf⑻");
reason=new String(reason.getBytes("iso⑻859⑴"),"utf⑻");
application.setApplicant(getCurrentUser()); // 申請人,當前用戶
application.setTitle(title);
application.setReason(reason);
String processDefinitionKeyStr=new String(processDefinitionKey.getBytes("iso⑻859⑴"),"utf⑻");
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()// 查詢出本流程實例中當前唯一的1個任務“提交申請”
.processInstanceId(pi.getId())//
.uniqueResult();
processEngine.getTaskService().completeTask(task.getId());
}
當點擊提交申請時application,我們來看看工作流的各個表的變化:

jbpm4_execution:

jbpm4_task:


jbpm4_variable:

那末通過查看上面表的變化,我們不難發現履行的流程是通過甚么和業務綁定的,即jbpm4_execution和jbpm4_variable的關系。
從流程的啟動開始,就與業務綁定關系,那末接下來如何利用呢?
下面只是簡單介紹,對1些結合業務的查詢問題會單獨再說明:
查看待辦任務:1般是根據用戶名來查看(當前登陸用戶)
/** 待我審批(我的任務列表) */
public String myTaskList() throws Exception {
List<TaskView> taskViewList = applicationService.getMyTaskViewList(getCurrentUser());
//List<TaskView> taskViewList = applicationService.getMyTaskViewList(user);
ActionContext.getContext().put("taskViewList", taskViewList);
return "myTaskList";
}
審批處理:
本環節由于單獨出來有1個審批意見表,故會將所有的審批意見添加的審批意見表中,故這個環節的內容是保存數據然后辦理任務并判斷流程是不是結束。固然我們也能夠不單獨設計審批意見表,而是將所有的審批意見存儲到流程變量中。
辦理任務需要獲得任務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⑻859⑴"),"utf⑻");
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⑻859⑴"),"utf⑻");
}
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); // 1定要先取出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 {
// 如果本環節同意,而且本環節是最后1個環節,則流程實例正常結束,申請的狀態為:已通過
if (pi == null) { // 本環節是最后1個環節,即流程已結束了
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⑻859⑴"),"utf⑻");
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";
}
總結:
其實寫這篇博客的目的是結合工作流的數據庫來分析業務與流程是如何綁定的,那末對流程中需要的1些經常使用方法的使用在這里也簡單的介紹了1番,這樣做的目的也是為后面的Activiti中的利用實例的經常使用方法介紹做個對照,其實不管是JBPM4.4還是它的升級版Activiti本質上都是1樣的。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈