⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workflowmanagerimpl.java

📁 这是一个jbpm的高级应用,是一个oa工作流的系统,里面用到了spring,hibernate技术等.实为学习jbpm的好资料!
💻 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 + -