Jbpm4會籤的實現
jbpm配置檔案內容
<!--把對應的報價單審批狀態置為審批中-->
<!--看下一個部門經理有沒有人,沒有人提示-->
<!--把審批任務分配給部門經理,發起人所在的部門並且部門型別為銷售部的部門經理角色-->
<!--把對應的報價單審批狀態置為審批不透過-->
<!--把對應的報價單審批狀態置為審批透過-->
<!--看下一個部門總監有沒有人,沒有人提示-->
<!--把審批任務分配給部門總監,業務總監審批,只需要一個角色ID和公司ID控制-->
<!--把對應的報價單審批狀態置為審批不透過-->
<!--把對應的報價單審批狀態置為審批透過-->
<!--看下一個業務副總經理和財務副總經理有沒有人,沒有人提示-->
<!--把審批任務分配給業務副總經理和財務副總經理,現在業務副總和財務副總都掛在頂層虛擬機器構下面-->
<!--把審批任務分配給總經理,現在總經理掛在頂層虛擬機器構下面-->
<!--把對應的報價單審批狀態置為審批不透過-->
<!--把對應的報價單審批狀態置為審批透過-->
<!--把對應的報價單審批狀態置為審批不透過-->
<!--把對應的報價單審批狀態置為審批透過-->
<!--看下一個總經理有沒有人,沒有人提示-->
會籤的任務人分配類
/**
* Name: net.uni.ap.jbpm.handle.CountAssignmentHandlerImpl.java
* Version: 1.0
* Date: 2012-6-20
* Author: 孫偉
*/
package net.uni.ap.jbpm.handle;
import java.util.List;
import net.uni.ap.jbpm.BaseJbpmVar;
import net.uni.in1.bo.IUserBO;
import net.uni.in1.model.User;
import org.jbpm.api.JbpmException;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.TaskService;
import org.jbpm.api.model.OpenExecution;
import org.jbpm.api.task.Assignable;
import org.jbpm.api.task.AssignmentHandler;
import org.jbpm.api.task.Participation;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.task.OpenTask;
/**
* 處理內容:會籤的任務人分配類
* @version: 1.0
* @see:net.uni.ap.jbpm.handle.CountAssignmentHandlerImpl.java
* @date:2012-6-20
* @author:孫偉
*/
public class CountAssignmentHandlerImpl implements AssignmentHandler {
/**
* @Fields serialVersionUID : TODO(用一句話描述這個變數表示什麼)
*/
private static final long serialVersionUID = 1550015943741463381L;
private String roleIds;//角色ID
private String roleTypes;//角色型別
private String orgIds;//機構ID
private String orgTypes;//機構型別
private IUserBO userService;//使用者介面
private ProcessEngine processEngine;
private TaskService taskService = null;
private String appRole;//角色ID對應的審批表主鍵
private String appOrg;//機構ID對應的審批表主鍵
private String corpId;//發起審批的人所在的公司
/**
* @param assignable
* @param execution
* @throws Exception
* @方法說明
* @date 2012-6-20
* @author 孫偉
*/
@Override
public void assign(Assignable assignable, OpenExecution execution) throws JbpmException {
try{
//先獲取發起審批的時候傳遞的引數
BaseJbpmVar jbpm= (BaseJbpmVar)execution.getVariable("var");
corpId = jbpm.getCorpId();//當前審批所在的公司
//獲取流程例項ID
String processInstanceId = execution.getProcessInstance().getId();
//獲取會籤活動的主任務物件,因為我們需要基於此主任務為所有會籤參與者建立子任務
Task mainTask = this.taskService.createTaskQuery().processInstanceId(processInstanceId)
.activityName(execution.getName()).uniqueResult();
List
//如果appRole和appOrg都不為空,則根據審批角色和審批機構去查詢使用者
if(appRole!=null&&appOrg!=null){
userList = this.userService.getJbpmUserList(appRole, appOrg, corpId);
}else if(appRole!=null&&orgIds!=null){
//角色是固定的,但是機構是動態的,例如提交本部門經理審批
userList = this.userService.getJbpmUserListAppRoleOrgIds(appRole, orgIds, corpId);
}else{
//這個是為了相容以前的程式,最新的寫法都不需要這個
userList= this.userService.getJbpmUserList(roleIds, roleTypes, orgIds, orgTypes);
}
//如果下一個節點沒有使用者,則提示失敗
if(userList.size()<1){
throw new JbpmException("jbpm業務流程處理失敗");
}else{
for(User user:userList){
//使用主任務物件的方法createSubTask(不會觸發持久化操作),為該會籤參與者建立子任務
Task subTask = ((OpenTask)mainTask).createSubTask();
subTask.setName(mainTask.getActivityName()+":"+user.getId());
//設定該會籤參與者為子任務的分配者
subTask.setAssignee(user.getId()+"");
//以下的操作意義在於:關聯會籤使用者到主任務
this.taskService.addTaskParticipatingUser(mainTask.getId(),user.getId()+"",Participation.CLIENT);
}
}
}catch(Exception e){
throw new JbpmException("jbpm業務流程處理失敗");
}
}
public String getAppRole() {
return appRole;
}
public void setAppRole(String appRole) {
this.appRole = appRole;
}
public String getAppOrg() {
return appOrg;
}
public void setAppOrg(String appOrg) {
this.appOrg = appOrg;
}
public String getCorpId() {
return corpId;
}
public void setCorpId(String corpId) {
this.corpId = corpId;
}
public String getRoleIds() {
return roleIds;
}
public void setRoleIds(String roleIds) {
this.roleIds = roleIds;
}
public String getRoleTypes() {
return roleTypes;
}
public void setRoleTypes(String roleTypes) {
this.roleTypes = roleTypes;
}
public String getOrgIds() {
return orgIds;
}
public void setOrgIds(String orgIds) {
this.orgIds = orgIds;
}
public String getOrgTypes() {
return orgTypes;
}
public void setOrgTypes(String orgTypes) {
this.orgTypes = orgTypes;
}
public void setUserService(IUserBO userService) {
this.userService = userService;
}
public ProcessEngine getProcessEngine() {
return processEngine;
}
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
this.taskService = this.processEngine.getTaskService();
}
}
會簽結果判斷
/**
* Name: net.uni.ap.jbpm.handle.quta.QutaCountDecisionHandlerImpl.java
* Version: 1.0
* Date: 2012-6-21
* Author: 孫偉
*/
package net.uni.ap.jbpm.handle.quta;
import net.uni.ap.jbpm.JbpmConstants;
import org.jbpm.api.model.OpenExecution;
/**
* 處理內容:報價單價格審批--會簽結果判斷
* @version: 1.0
* @see:net.uni.ap.jbpm.handle.quta.QutaCountDecisionHandlerImpl.java
* @date:2012-6-21
* @author:孫偉
*/
public class QutaCountDecisionHandlerImpl extends QutaDecisionHandler{
/**
* @Fields serialVersionUID : TODO(用一句話描述這個變數表示什麼)
*/
private static final long serialVersionUID = -3539858413505242187L;
/**
* @param execution
* @return
* @方法說明
* @date 2012-6-21
* @author 孫偉
*/
@Override
public String decide(OpenExecution execution) {
String result = (String)execution.getVariable(JbpmConstants.COUNT_SIGN_RES);
return result;
}
}
會籤的任務完成方法
/**
* @param taskId
* @param applyResult
* @param applyInfo
* @param userRole
* @throws BOException
* @方法說明 會籤的完成任務方法
* @date 2012-6-21
* @author 孫偉
*/
public String saveCompleteTask(JbpmTask jbpmTask,String applyResult,String applyInfo,User currUser) throws BOException{
try{
String taskId = jbpmTask.getId();
//更新流程變數-設定每個節點的審批的具體資訊
Map
//設定是否指定總經理
if(applyInfo!=null&&applyInfo.equals("yes")){
var.put(JbpmConstants.IS_SUBMIT_MANAGER, "yes");
}
BaseJbpmVar baseJbpm = (BaseJbpmVar)var.get(JbpmConstants.VAR);
Map
BaseJbpmTask baseJb = new BaseJbpmTask();
baseJb.setApplyUserId(currUser.getId().toString());
//baseJb.setApplyRoleId(userRole.getRoleId().toString());
//baseJb.setApplyOrgId(userRole.getOrgId().toString());
baseJb.setApplyTime(new Date());
baseJb.setApplySuggestMsg(jbpmTask.getAdvice());
baseJb.setOutCome(jbpmTask.getOutCome());
baseJb.setApplyResult(applyResult);
baseJb.setApplyInfo(applyInfo);
ProcessInstance pro = getProcessInstanceByTaskId(taskId);
//構建會籤任務提交命令
CountJoinsignTaskCmd subTaskCmd = new CountJoinsignTaskCmd(taskId,"to 會簽結果判斷");
List
Task subTask = null;
for(Task t:listTask){
if(t.getAssignee().equals(currUser.getId().toString())){
subTask = t;
}
}
if(subTask==null) throw new BOException("您已經完成會籤,不能重複審批了");
String subTaskId = subTask.getId();
String nextUser = "";
String pid = pro.getId();
applyTask.put(subTaskId,baseJb);
if(baseJbpm.getChildTaskId()==null){
baseJbpm.setChildTaskId(new HashMap
}
if(baseJbpm.getChildTaskId().get(taskId)==null){
baseJbpm.getChildTaskId().put(taskId, new ArrayList
}
baseJbpm.getChildTaskId().get(taskId).add(subTaskId);
this.taskService.setVariables(taskId, var);
Map
//設定會籤節點的審批結果,透過還是不透過
subVar.put(JbpmConstants.COUNT_SIGN,applyResult);
this.taskService.setVariables(subTask.getId(), subVar);
subTaskCmd.setSubTask(subTask);
boolean result = this.processEngineService.execute(subTaskCmd);
if(this.executionService.findProcessInstanceById(pid)!=null){
nextUser = (String)this.executionService.getVariable(pro.getId(), JbpmConstants.NEXT_NODE_USER);
}
return nextUser;
}catch(Exception e){
throw new BOException(e.getMessage(),e);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25261409/viewspace-1059012/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jbpm4監聽的實現
- 工作流會籤或籤的實現(基於flowable6
- jBPM4工作流開發實戰 之 第四部分 jBPM4和Web專案的結合[】Web
- <img>標籤的src=""空字元會出現的情況字元
- tag標籤是怎麼用OT實現的?
- MyBatis標籤實現的動態SQL語句MyBatisSQL
- 實現列表懸浮標籤「頂上去」的效果
- 用struts的標籤怎樣實現分頁?
- 06#Web 實戰:實現可滑動的標籤頁Web
- javascript實現文字框標籤驗證JavaScript
- 使用bringToFont實現標籤切換
- 標籤實現響應式圖片
- koa框架會用也會寫—(koa的實現)框架
- Jbpm4環境搭建和整合SpringSpring
- MySQL: kill 會話的實現原理MySql會話
- 《我們的約定會實現》
- HTMl中標籤中li橫向排列的實現示例HTML
- jQuery實現的刪除指定標籤程式碼例項jQuery
- js結合progress標籤實現的進度條效果JS
- css實現的禁止標籤中內容選中效果CSS
- 實現一個帶浮動標籤的輸入框
- 【原創】REDIS與MYSQL實現標籤的對比薦RedisMySql
- css3實現手機效果的“切換標籤”CSSS3
- 標籤實現預載入功能詳解
- Vue路由+Tab元件實現多頁籤功能Vue路由元件
- NET Core-TagHelper實現分頁標籤
- Pyqt5 實現多標籤頁面QT
- 標籤的最佳實踐
- 淺談使用者標籤的實現困境和搭建方法
- 如何實現瀏覽器標籤頁之間的通訊瀏覽器
- 如何實現pre標籤中的內容自動換行
- session會話的底層實現方式Session會話
- 原生JS實現移動端線上籤協議JS協議
- 支付寶 v3 驗籤如何實現
- Activiti7 回退與會籤
- 實現多個標籤頁之間通訊的幾種方法
- 僅用一個HTML標籤,實現帶動畫的抖音LOGOHTML動畫Go
- thymeleaf模板實現html5標籤的非嚴格檢查HTML