package com.jbpm.comm;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springmodules.workflow.jbpm31.support.JbpmDaoSupport;
/*
* jbpm的基类
* 这个基类整合spring要改两个地方
* 1.继承JbpmDaoSupport
* 2.写一个方法来得到JbpmConfiguration
*/
public class JbpmBaseDao extends JbpmDaoSupport {
// 得到配置类的实例(单例)
//JbpmConfiguration configuration = JbpmConfiguration.getInstance();
private JbpmConfiguration getConfig(){
return super.getJbpmConfiguration();
}
// 创建表
public void createTable() {
// configuration.dropSchema(); //仅删除表
getConfig().createSchema(); // 先删除(如果存在)再创建表
}
// 得到上下文对象(相当于hibernate session)
public JbpmContext getContext() {
JbpmContext context = getConfig().getCurrentJbpmContext();
if (context == null)
context = getConfig().createJbpmContext();
return context;
}
// 发布流程到数据库(pname是流程的名字,这里就是报帐)
public void deploy() {
// 要发哪个流程定义图xml
ProcessDefinition pd = ProcessDefinition
.parseXmlResource("simple/processdefinition.xml");
// 发布
getContext().deployProcessDefinition(pd);
// 保存
getContext().close();
}
// 让流程定义跑起来(流程实例),由谁创建哪个流程定义的实例
public void createProcessInstance(String username, String pname) {
// 根据pname打流程定义对象
ProcessDefinition pd = getContext().getGraphSession()
.findLatestProcessDefinition(pname);
if (pd == null)
throw new RuntimeException("没有这个流程定义");
// 创建实例
ProcessInstance pi = pd.createProcessInstance();
// 把创建者保存到持久化变量中去
pi.getContextInstance().setVariable("start", username);
// 发信号
pi.signal();
// 保存
getContext().close();
}
// 写报销单 username哪个报销,money报多少,msg什么事
public void write(String username, float money, String msg) {
// 找出username的所有待办任务
List<TaskInstance> tis = getContext().getTaskList(username);
if (tis != null)
for (TaskInstance instance : tis) {
if (instance.getName().equals("写报销单任务")) {
instance.setVariable("money", money);
instance.setVariable("msg", msg);
instance.end(); // 结束任务,进入下一步
getContext().close();
break;
}
}
}
// 审批,tid任务编号,f同意否
public void agree(int tid, boolean f) {
// 根据任务编号找任务实例对象
TaskInstance ti = getContext().getTaskInstance(tid);
if (ti == null)
throw new RuntimeException("没有这个任务");
// 判断
if (f) {
ti.end("同意");
} else
ti.end("不同意");
getContext().close();
}
//得到某人的待办事项
public List getTaskPeding(String username){
// return getContext().getTaskList(username);
String hql = "from TaskInstance where ACTORID_=? and END_ is null";
Session session = getContext().getSession();
Query query = session.createQuery(hql);
query.setParameter(0, username);
return query.list();
}
//得到某某的经办事项(已办)
public List getTaskFinish(String username){
// return getContext().getTaskList(username);
String hql = "from TaskInstance where ACTORID_=? and END_ is not null";
Session session = getContext().getSession();
Query query = session.createQuery(hql);
query.setParameter(0, username);
return query.list();
}
//得到某某的发起事项
public List getTaskStart(String username){
// return getContext().getTaskList(username);
String hql = "from TaskInstance where ACTORID_=? and TASK_=1";
Session session = getContext().getSession();
Query query = session.createQuery(hql);
query.setParameter(0, username);
return query.list();
}
// 测试
public static void main(String[] args) {
JbpmBaseDao baseDao = new JbpmBaseDao();
// baseDao.createTable(); //生成表
// baseDao.deploy(); //发布流定义到数据库
// baseDao.createProcessInstance("bird", "报帐");
// baseDao.write("bird", 1500, "呷饭");
// baseDao.agree(2, false); //经理审核,同意
// baseDao.agree(3, true); //总经理,同意
}
}