ITPub博客

首页 > 应用开发 > Java > Jbpm4会签的实现

Jbpm4会签的实现

原创 Java 作者:livedba 时间:2012-07-26 08:28:48 0 删除 编辑
Jbpm会签的实现,通过动态构建子task节点,来实现会签[@more@]

jbpm配置文件内容

http://jbpm.org/4.4/jpdl">



<!--把对应的报价单审批状态置为审批中-->

<!--看下一个部门经理有没有人,没有人提示-->










<!--把审批任务分配给部门经理,发起人所在的部门并且部门类型为销售部的部门经理角色-->











<!--把对应的报价单审批状态置为审批不通过-->








<!--把对应的报价单审批状态置为审批通过-->





<!--看下一个部门总监有没有人,没有人提示-->












<!--把审批任务分配给部门总监,业务总监审批,只需要一个角色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 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博客 ” ,链接:https://blog.itpub.net/25261409/viewspace-1059012/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Jbpm4监听的实现
请登录后发表评论 登录
全部评论

注册时间:2011-01-21

  • 博文量
    115
  • 访问量
    483882