Jbpm4监听的实现

Jbpm4监听的实现 ,包括验证下一个节点是否有审批人,如果没有提示审批不了,还有更改业务数据的状态,实现如下:[@more@]



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

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







JbpmEventListener实现如下

/**
* Name: net.uni.ap.jbpm.handle.JbpmEventListener.java
* Version: 1.0
* Date: 2012-4-18
* Author: 孙伟
*/
package net.uni.ap.jbpm.handle;

import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.uni.ap.exp.BOException;
import net.uni.ap.jbpm.BaseJbpmVar;
import net.uni.ap.jbpm.JbpmConstants;
import net.uni.ap.jbpm.bo.IJbpmBO;
import net.uni.in1.bo.IUserBO;
import net.uni.in1.model.User;

import org.jbpm.api.JbpmException;
import org.jbpm.api.listener.EventListener;
import org.jbpm.api.listener.EventListenerExecution;

/**
* 处理内容:jbpm监听实现类
* @version: 1.0
* @see:net.uni.ap.jbpm.handle.JbpmEventListener.java
* @date:2012-4-18
* @author:孙伟
*/
public class JbpmEventListener implements EventListener {

private static final long serialVersionUID = -6222489823315634987L;

protected IJbpmBO jbpmService;//注入的jbpmservice
protected String sql;//需要执行的业务sql

//下面这几个属性是为了判断下一个节点是否有审批人用的
//第一个节点只要在开始节点的启动事件中监听就行了,后面的节点就在前一个节点监听
protected String roleIds;//角色ID
protected String userIds;//用户ID串
protected String roleTypes;//角色类型
protected String orgIds;//机构ID
protected String orgTypes;//机构类型
protected IUserBO userService;//用户接口

protected String appRole;//角色ID对应的审批表主键
protected String appOrg;//机构ID对应的审批表主键
protected String corpId;//发起审批的人所在的公司

protected String entityId;//业务数据的Id或者Id串

@Override
public void notify(EventListenerExecution execution) throws JbpmException {
try{
//先获取发起审批的时候传递的参数
BaseJbpmVar jbpm= (BaseJbpmVar)execution.getVariable("var");
Map jbpmArgs = jbpm.getJbpmArgs();//argsKey如果只有一个参数,默认不用穿
corpId = jbpm.getCorpId();//当前审批所在的公司
entityId = jbpm.getApplyEntityId();//审批的业务数据ID
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{
//这个是为了兼容以前的程序,最新的写法都不需要这个
if(roleIds!=null&&orgIds!=null){
userList= this.userService.getJbpmUserList(roleIds, roleTypes, orgIds, orgTypes);
}
}

//查看有没有直接指定用户ID的
if(userIds!=null){
String[] userId = userIds.split(",");
for(String id:userId){
User user = new User();
user.setId(Long.parseLong(id));
userList.add(user);
}
}
//如果下一个节点没有用户,则提示失败
if(userList!=null&&userList.size()<1){
throw new JbpmException("您好,下一个节点没有对应的审批人,请联系管理员");
}

//如果下一个节点没有用户,则提示失败
if(userList!=null&&userList.size()>0){
//下一个节点的用户存放入流程变量中,用来在页面上提示用户下一个节点谁来审批
StringBuffer userStr = new StringBuffer("下一个节点的审批人是:");
for(User user : userList){
userStr.append(user.getUserName()+"/"+user.getLoginName()+";");
}
execution.setVariable(JbpmConstants.NEXT_NODE_USER, userStr.toString());

}

//更新业务数据的审批状态
//sql里可能带问号,需要把参数拼进去
if(sql!=null&&!sql.trim().equals("")){
//包含问号的说明sql只传递数据主键的参数
if(sql.indexOf("?")>-1){
sql = sql.replaceAll("[?]", jbpm.getApplyEntityId());
}else if(sql.indexOf("#")>-1){
//如果sql里包含#,说明传递的参数有多个,存放在参数map中

//正则表达式替换--尾部为空格;
String regex = "#w+(s)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(sql);
StringBuffer sbf = new StringBuffer();
while(matcher.find()){
//System.out.println(sql.substring(matcher.start()+1, matcher.end()-1));
//System.out.println(sql.substring(matcher.start()+1, matcher.end()-1).trim());
String argsValue = jbpmArgs.get(sql.substring(matcher.start()+1, matcher.end()-1).trim());
matcher.appendReplacement(sbf,argsValue);
sbf.append(" ");
}
matcher.appendTail(sbf);

sql = sbf.toString();
//正则表达式替换--尾部是字符串结尾
regex = "#w+($)";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(sql);
sbf = new StringBuffer();
while(matcher.find()){
//System.out.println(sql.substring(matcher.start()+1, matcher.end()));
//System.out.println(sql.substring(matcher.start()+1, matcher.end()).trim());
String argsValue = jbpmArgs.get(sql.substring(matcher.start()+1, matcher.end()).trim());
matcher.appendReplacement(sbf,argsValue);
sbf.append(" ");
}
matcher.appendTail(sbf);
sql=sbf.toString();

//正则表达式替换--尾部是括号的
regex = "#w+())";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(sql);
sbf = new StringBuffer();
while(matcher.find()){
//System.out.println(sql.substring(matcher.start()+1, matcher.end()));
//System.out.println(sql.substring(matcher.start()+1, matcher.end()).trim());
String argsValue = jbpmArgs.get(sql.substring(matcher.start()+1, matcher.end()-1).trim());
matcher.appendReplacement(sbf,argsValue);
sbf.append(" ) ");
}
matcher.appendTail(sbf);
sql=sbf.toString();

//正则表达式替换--尾部是;的
regex = "#w+(;)";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(sql);
sbf = new StringBuffer();
while(matcher.find()){
//System.out.println(sql.substring(matcher.start()+1, matcher.end()));
//System.out.println(sql.substring(matcher.start()+1, matcher.end()).trim());
String argsValue = jbpmArgs.get(sql.substring(matcher.start()+1, matcher.end()-1).trim());
matcher.appendReplacement(sbf,argsValue);
sbf.append(" ; ");
}
matcher.appendTail(sbf);
sql=sbf.toString();

//正则表达式替换--尾部是,的
regex = "#w+(,)";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(sql);
sbf = new StringBuffer();
while(matcher.find()){
//System.out.println(sql.substring(matcher.start()+1, matcher.end()));
//System.out.println(sql.substring(matcher.start()+1, matcher.end()).trim());
String argsValue = jbpmArgs.get(sql.substring(matcher.start()+1, matcher.end()-1).trim());
matcher.appendReplacement(sbf,argsValue);
sbf.append(" , ");
}
matcher.appendTail(sbf);
sql=sbf.toString();
}

//处理多条sql的情况,如果有多条sql,用分号分隔
String[] sqlStr = sql.split(";");
for(String mySql:sqlStr){
if(mySql!=null&&!mySql.trim().equals("")){
jbpmService.update(mySql);
}
}
}



/*//判断下一个节点是否有人审批,如果没有人审批提示它下一个节点没有人审批,请联系管理员
List userList =null;
if((appRole==null||appRole.equals(""))&&(appOrg==null||appOrg.equals(""))){
userList= this.userService.getJbpmUserList(roleIds, roleTypes, orgIds, orgTypes);
}else if(appRole!=null&&!appRole.trim().equals("")&&orgIds!=null&&!orgIds.trim().equals("")){
//角色使用审批角色ID,机构通过流程参数传递过来的
userList = this.userService.getJbpmUserListAppRoleOrgIds(appRole, orgIds, corpId);
}else{
userList = this.userService.getJbpmUserList(appRole, appOrg, corpId);
}

if(userIds!=null){
String[] userId = userIds.split(",");
for(String id:userId){
User user = new User();
user.setId(Long.parseLong(id));
userList.add(user);
}
}
if(userList.size()<1){
throw new JbpmException("您好,下一个节点没有对应的审批人,请联系管理员");
}
*/


}catch(BOException e){
throw new JbpmException(e.getMessage());
}catch(Exception e){
throw new JbpmException(e.getMessage());
}
}

public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public IJbpmBO getJbpmService() {
return jbpmService;
}
public void setJbpmService(IJbpmBO jbpmService) {
this.jbpmService = jbpmService;
}
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 IUserBO getUserService() {
return userService;
}
public void setUserService(IUserBO userService) {
this.userService = userService;
}
public String getUserIds() {
return userIds;
}
public void setUserIds(String userIds) {
this.userIds = userIds;
}
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;
}
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25261409/viewspace-1059011/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25261409/viewspace-1059011/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值