📄 workflowmanagerimpl.java
字号:
package com.bjsxt.oa.managers.impl;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.bjsxt.oa.managers.SystemException;
import com.bjsxt.oa.managers.WorkflowManager;
import com.bjsxt.oa.model.Document;
import com.bjsxt.oa.model.Workflow;
/**
* 集成方法之一:
*
* 直接注入JbpmConfiguration对象,在获取JbpmContext对象的时候
* 将当前session与JbpmContext绑定!
* @author Administrator
*
*/
public class WorkflowManagerImpl extends HibernateDaoSupport implements
WorkflowManager {
private JbpmConfiguration jbpmConfiguration;
//获取系统已定义的所有流程名称列表!
public List searchAllProcessDefinition() {
JbpmContext context = getJbpmContext();
//获得已定义的所有流程(最高的版本的记录,不包含同一个流程的低版本记录)
List list = context.getGraphSession().findLatestProcessDefinitions();
if(list != null && !list.isEmpty()){
List defs = new ArrayList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
ProcessDefinition def = (ProcessDefinition) iter.next();
defs.add(def.getName());
}
return defs;
}
return null;
}
//搜索流转到用户username的所有的流程实例(实际上就是公文!)
public List searchCurrentProcessInstances(String username) {
JbpmContext context = getJbpmContext();
List docIds = new ArrayList();
//从工作流引擎中,根据actor-id的值,获得分配给这个actor-id的所有任务!
List taskInstances = context.getTaskMgmtSession().findTaskInstances(username);
for (Iterator iter = taskInstances.iterator(); iter.hasNext();) {
TaskInstance ti = (TaskInstance) iter.next();
//如果这个任务是正在等待被完成的状态
if(ti.isSignalling()){
docIds.add(new Integer(ti.getProcessInstance().getKey()));
}
}
return docIds;
}
//流向下一步!
public void flowToNextStep(int documentId, String transitionName) {
Document document = (Document)getHibernateTemplate().load(Document.class, documentId);
JbpmContext context = getJbpmContext();
//根据流程名称获得流程定义对象
ProcessDefinition processDefinition = context.getGraphSession()
.findLatestProcessDefinition(document.getWorkflow());
//根据流程定义对象以及key值,获得流程实例
ProcessInstance processInstance = context.getProcessInstance(processDefinition, ""+documentId);
if(transitionName == null){
processInstance.signal();
}else{
processInstance.signal(transitionName);
}
//设置公文的状态为当前节点的名称
document.setStatus(processInstance.getRootToken().getNode().getName());
//如果已经是终点,则设置公文为已完成状态
//当流程到达终点
if(processInstance.getRootToken().hasEnded()){
document.setStatus(Document.STATUS_END);
}
getHibernateTemplate().update(document);
}
//获得文档的下一步流向,返回流向名称列表
public List searchNextSteps(int documentId) {
Document document = (Document)getHibernateTemplate().load(Document.class, documentId);
JbpmContext context = getJbpmContext();
//根据流程名称获得流程定义对象
ProcessDefinition processDefinition = context.getGraphSession()
.findLatestProcessDefinition(document.getWorkflow());
//根据流程定义对象以及key值,获得流程实例
ProcessInstance processInstance = context.getProcessInstance(processDefinition, ""+documentId);
//查看当前流程是否已经结束
if(processInstance.getRootToken().hasEnded()){
throw new SystemException("流程已结束");
}
//获得当前节点的下一步都有哪些流向
List list = processInstance.getRootToken().getNode().getLeavingTransitions();
List transitions = new ArrayList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
//获得流向名称列表
Transition transition = (Transition) iter.next();
transitions.add(transition.getName());
}
return transitions;
}
//删除流程定义文件
public void delProcessDefinition(String name) {
JbpmContext context = getJbpmContext();
//搜索JBPM中所有版本的流程定义记录
List allversions = context.getGraphSession().findAllProcessDefinitionVersions(name);
if(allversions != null){
//逐个删除
for (Iterator iter = allversions.iterator(); iter.hasNext();) {
ProcessDefinition def = (ProcessDefinition) iter.next();
context.getGraphSession().deleteProcessDefinition(def);
}
}
//删除对应的Workflow对象
getSession().delete(
(Workflow)getSession()
.createQuery("select w from Workflow w where w.name = ?")
.setParameter(0, name)
.uniqueResult()
);
}
//部署流程定义
public void deployProcessDefinition(byte[] processdef, byte[] processimage) {
if(processdef == null){
return;
}
ProcessDefinition def = ProcessDefinition.parseXmlInputStream(new ByteArrayInputStream(processdef));
JbpmContext context = getJbpmContext();
//将流程定义文件部署到JBPM
context.deployProcessDefinition(def);
Workflow wf = (Workflow)getSession()
.createQuery("select w from Workflow w where w.name = ?")
.setParameter(0, def.getName())
.uniqueResult();
if(wf != null){
wf.setProcessdefinition(processdef);
wf.setProcessimage(processimage);
getSession().update(wf);
return;
}
wf = new Workflow();
wf.setName(def.getName());
wf.setProcessdefinition(processdef);
wf.setProcessimage(processimage);
getSession().save(wf);
}
//查找特定流程
public Workflow findWorkflow(String name) {
return (Workflow)getSession()
.createQuery("select w from Workflow w where w.name = ?")
.setParameter(0, name)
.uniqueResult();
}
//根据公文标识创建流程实例
public void addProcessInstance(int documentId) {
JbpmContext context = getJbpmContext();
Document document = (Document)getHibernateTemplate().load(Document.class, documentId);
//根据公文对应的流程名称,获得流程定义对象
ProcessDefinition processDefinition = context.getGraphSession()
.findLatestProcessDefinition(document.getWorkflow());
//根据流程定义对象,创建一个流程实例
ProcessInstance processInstance = new ProcessInstance(processDefinition);
//将流程实例与公文绑定
processInstance.setKey(""+documentId);
context.save(processInstance);
}
//删除流程实例!
public void delProcessInstance(int documentId) {
Document document = (Document)getHibernateTemplate().load(Document.class, documentId);
JbpmContext context = getJbpmContext();
//根据流程名称获得流程定义对象
ProcessDefinition processDefinition = context.getGraphSession()
.findLatestProcessDefinition(document.getWorkflow());
//根据流程定义对象以及key值,获得流程实例
ProcessInstance processInstance = context.getProcessInstance(processDefinition, ""+documentId);
context.getGraphSession().deleteProcessInstance(processInstance);
}
//获取JbpmContext对象
private JbpmContext getJbpmContext(){
JbpmContext context = jbpmConfiguration.createJbpmContext();
//关键的一个步骤,我们需要将JBPM使用的session对象跟OA系统所使用的
//session对象整合起来。
context.setSession(getSession());
return context;
}
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
this.jbpmConfiguration = jbpmConfiguration;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -