Jbpm4會籤的實現

livedba發表於2012-07-26
Jbpm會籤的實現,透過動態構建子task節點,來實現會籤[@more@]

jbpm配置檔案內容





<!--把對應的報價單審批狀態置為審批中--&gt

<!--看下一個部門經理有沒有人,沒有人提示--&gt










<!--把審批任務分配給部門經理,發起人所在的部門並且部門型別為銷售部的部門經理角色--&gt











<!--把對應的報價單審批狀態置為審批不透過--&gt








<!--把對應的報價單審批狀態置為審批透過--&gt





<!--看下一個部門總監有沒有人,沒有人提示--&gt












<!--把審批任務分配給部門總監,業務總監審批,只需要一個角色ID和公司ID控制--&gt










<!--把對應的報價單審批狀態置為審批不透過--&gt










<!--把對應的報價單審批狀態置為審批透過--&gt





<!--看下一個業務副總經理和財務副總經理有沒有人,沒有人提示--&gt










<!--把審批任務分配給業務副總經理和財務副總經理,現在業務副總和財務副總都掛在頂層虛擬機器構下面--&gt











<!--把審批任務分配給總經理,現在總經理掛在頂層虛擬機器構下面--&gt










<!--把對應的報價單審批狀態置為審批不透過--&gt





<!--把對應的報價單審批狀態置為審批透過--&gt








<!--把對應的報價單審批狀態置為審批不透過--&gt





<!--把對應的報價單審批狀態置為審批透過--&gt





<!--看下一個總經理有沒有人,沒有人提示--&gt









會籤的任務人分配類

/**
* 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 userList =null;
//如果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 var = getTaskVariableByTaskId(taskId);
//設定是否指定總經理
if(applyInfo!=null&&applyInfo.equals("yes")){
var.put(JbpmConstants.IS_SUBMIT_MANAGER, "yes");
}
BaseJbpmVar baseJbpm = (BaseJbpmVar)var.get(JbpmConstants.VAR);
Map applyTask = baseJbpm.getApplyTask();
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 listTask = taskService.getSubTasks(taskId);
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 = new HashMap();
//設定會籤節點的審批結果,透過還是不透過
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章