`
xuantian868
  • 浏览: 31097 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

Jbpm学习二

    博客分类:
  • JBPM
阅读更多
一个简单的流程定义文件
<?xml version="1.0" encoding="UTF-8"?>
<process-definition name="ExpenseAccountSwim">
	<swimlane name="initiator">
		<assignment actor-id="#{firstPerson}" />
		</swimlane>
	<start-state name="startLog">
		<transition name="到填写报销单" to="startExpense"></transition>
	</start-state>
	<task-node name="startExpense">
		<task name="填写报销单" swimlane="initiator">
		</task>
		<transition name="到经理审核" to="managerAudit"></transition>
	</task-node>
	<task-node name="managerAudit">
		<task name="经理审核">
			<assignment actor-id="1" />
		</task>
		<transition name="到会计审核" to="accountantAudit"></transition>
		<transition name="重新填写报销单" to="startExpense"></transition>
	</task-node>
	<task-node name="accountantAudit">
		<task name="会计审核">
			<assignment actor-id="3" />
		</task>

		<transition name="通知领款" to="lingkuan"></transition>
	</task-node>
		<task-node name="lingkuan">
		<task name="领款" swimlane="initiator">
		</task>

		<transition name="审核完毕" to="endLog"></transition>
	</task-node>
	<end-state name="endLog"></end-state>
</process-definition>


报销单对应的java是
public class ExpenseAccount  implements java.io.Serializable {
private int id;
	
	private int expense;//报销费用
	private String type;//报销类型
	/**
	 * 描述
	 * @hibernate.property
	 */
	private String description;
         private long processInstanceId;//流程实例id
.....getter
.....setter

}


发布完流程定义文件后。
我们填写报销单,并建立一个流程实例,将填写的报销单和这个流程实例绑定。
	public void saveExpenseAccount(IBean domain,String definitionName) {
		ExpenseAccount expenseAccount = (ExpenseAccount) domain;
		expenseAccount.setDeleteFlag("1");
		expenseAccount.setCreateDate(Common.getCurrentTime());
		allDao.insert(expenseAccount);
		
		//绑定流程实例
		allDao.createProcessInstance(definitionName,expenseAccount.getCreateUser(),expenseAccount.getId());
	}



/**
	 * 建立流程实例并绑定流程实例
	 * 
	 * @param definitionName
	 *            流程名称
	 * @param personId
	 *            提交人id
	 * @param docId
	 *            公文id(申请单id)
	 */
	public void createProcessInstance(String definitionName, String personId,
			int docId) {
		JbpmContext context = null;
		try {
			context = getContext();

			// 从数据库中加载ProcessDefinition对象
			ProcessDefinition definition = context.getGraphSession()
					.findLatestProcessDefinition(definitionName);

			// 从流程中创建一个流程实例
			ProcessInstance processInstance = new ProcessInstance(definition);


			// 加载公文
			ExpenseAccount doc = (ExpenseAccount) context.getSession().load(
					ExpenseAccount.class, docId);

			// 绑定流程实例到公文
			doc.setProcessInstanceId(processInstance.getId());

			// 绑定公文到流程实例(ContextInstance-相当于一个变量的实例)
			processInstance.getContextInstance().createVariable("document",
					doc.getId());
			processInstance.getContextInstance().setVariable("firstPerson",
					personId);
			
			processInstance.getContextInstance().setVariable("money",doc.getExpense());

			// 触发流程实例走向下一步
			processInstance.signal();

			// 将第一个提交人改为动态的,<assignment actor-id="#{firstPerson}" />,要设置任务的执行者。
			TaskInstance taskInstance = (TaskInstance) processInstance
					.getTaskMgmtInstance().getTaskInstances().iterator().next();
			taskInstance.setActorId(personId);
			taskInstance.setVariable("firstPerson", personId);
			// 存储流程实例的信息
			context.save(processInstance);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			context.close();
		}

	}


然后用户提交这个报销单。
/**
	 * 触发流程向下一步流动,适用于当前只用一个transition,通过页面选择的transition,直接end到transition
	 * 
	 * @param personId
	 *            登录人id
	 * @param processInstanceId
	 *            流程实例id
	 *            
	 * @param transitionName  transition名称           
	 */
	public String flowToNextNode(String personId, long processInstanceId,String transitionName) {

		JbpmContext context = jbpmConfiguration.createJbpmContext();
		context.setSession(getSession());
		try{
			List tasks = context.getTaskMgmtSession().findTaskInstances(personId);
						for (Iterator it = tasks.iterator(); it.hasNext();) {

				TaskInstance taskInstance = (TaskInstance) it.next();
				//判断流程实例是否一致
				if (processInstanceId == taskInstance.getProcessInstance().getId()) {
					taskInstance.end(transitionName);
				} else {
					continue;
				}
			}
		}finally{
			context.close();
		}
		

		return "";
	}

此时报销单回流转到
managerAudit,他的执行者是actor-id="1" .
查询actor-id="1"的任务列表。
	// 查找等待审批的公文
	public List searchApprovingDocuments(String aoctor_Id) {

		
		JbpmContext context = getContext();

		List docIds = new ArrayList();

		// 首先获得流转到用户的任务列表
		List tasks = context.getTaskMgmtSession().findTaskInstances(aoctor_Id);
		for (Iterator iter = tasks.iterator(); iter.hasNext();) {
			System.out.println("tasks");
			TaskInstance taskInstance = (TaskInstance) iter.next();

			// 任务实例是否正在等待审批,如果不是,则忽略(即不应该被列到待审批列表中!)
			if (!taskInstance.isSignalling()) {
				continue;
			}


			Integer docId = Integer.parseInt(String.valueOf(taskInstance
					.getProcessInstance().getContextInstance().getVariable(
							"document")));
			docIds.add(docId);
		}

		return docIds;
	}

//上面只是返回的任务id,然后可以根据id查询出该用户要审核的报销单:如下面
String docIds="1,2,3,4,5";
//select * from ExpenseAccount where id in(docIds);


上面会列出所有要审核的报销单,选择一个报销单时,因为该节点有一个或多个Transition
,如果是多个时,就要让用户选择Transition,所以可以显示的在页面上列出Transition供用户选择。
	 /**
	  * 获得当前流程实例下的transition
	  * @param processInstanceId 流程实例id
	  * */
	 public List getTransitions(String personId,long processInstanceId){
		 List list=new ArrayList();
		 TaskInstance taskInstance=null;
		 JbpmContext context=jbpmConfiguration.createJbpmContext();
		 context.setSession(this.getSession());
		 
		 try{
			 List tasks=context.getTaskMgmtSession().findTaskInstances(personId);
			 if(tasks!=null&&tasks.size()>0){
				 for(Iterator it=tasks.iterator();it.hasNext();){
					  taskInstance = (TaskInstance) it.next();
					 if(processInstanceId==taskInstance.getProcessInstance().getId()){
						
						 List listTrans=taskInstance.getTask().getTaskNode().getLeavingTransitions();
						 list.addAll(listTrans);
					 }
				 }
			 }
			 
			 
		 }catch(Exception e){
			 e.printStackTrace();
			
		 }finally{
			 context.close();
		 }
		 
		 return list;
		 
		 
	 }

我用struts2的<s:select >来显示
<c:if test="${!empty transList}">
							<s:select list="transList" name="transname" listKey="name" listValue="name" headerKey="0" headerValue="--请选择--"></s:select>
</c:if>

后面的审核都是反复的调用flowToNextNode方法。
actor-id="#{firstPerson}"  表示可以在java文件中定义执行者,可以看到上面在新增报销单时定义
processInstance.getContextInstance().setVariable("firstPerson",personId);

<swimlane name="initiator">
如果一个任务用同一个角色或人来执行,那么可以用swimlane 来定义任务参与者或执行者。在任务中只需要引用就行。
<task name="填写报销单" swimlane="initiator">

<task name="领款" swimlane="initiator">
分享到:
评论

相关推荐

    jbpm学习资料,jbpm教程

    本资料主要围绕jbpm的核心组件——jPDL进行讲解,帮助学习者深入理解jbpm的工作原理和应用。 jPDL(jBPM Process Definition Language)是jbpm使用的一种基于XML的语言,用于描述业务流程。它提供了一系列的元素和...

    jbpm学习笔记jbpm学习笔记

    在本篇jbpm学习笔记中,我们将深入探讨如何安装jbpm插件,配置运行环境,发布流程定义以及查看流程定义。 首先,下载jbpm的最新版本可以从官方指定的源获取,例如在SourceForge上...

    工作流引擎jbpm学习笔记

    工作流引擎jbpm学习笔记 jbpm是一个专业的工作流引擎,用于定义、管理和执行业务流程。它可以帮助我们简化工作流程的开发和维护,提高工作效率和可扩展性。 一、什么是公文流转? 公文流转是指公文在定义流转中的...

    JBPM学习视频11~14

    【JBPM学习视频11~14】是一系列关于企业级业务流程管理(Business Process Management,简称BPM)系统的教程,特别聚焦在JBoss提供的开源工具JBPM4.4版本。这一系列视频教程旨在帮助学习者深入理解并掌握JBPM框架,...

    jbpm3.1.4经典学习教程

    jbpm3.1.4是其历史版本之一,虽然现在有更高级的版本,但对于学习工作流基础概念和原理,这个版本仍然具有很高的价值。 首先,我们要理解jbpm的核心概念。jbpm提供了流程定义的语言(BPMN,Business Process Model ...

    jbpm学习笔记.docx

    jbpm学习笔记主要涵盖了jbpm(Java Business Process Management)的多个方面,包括Signavio的使用和配置、jBPM数据库的安装、Graphical Process Designer(GPD)的安装以及jBPM在Eclipse环境中的配置。以下是这些...

    JBPM5入门学习.doc

    ### JBPM5入门学习知识点详解 #### 一、JBPM5简介 **1.1 什么是JBPM** JBPM(Java Business Process Management)是一个开源的业务流程管理框架,旨在为开发者提供一个简单、灵活且可扩展的平台来设计、执行和...

    JBPM3学习笔记

    2. 官方文档:JBPM3的官方文档详细介绍了系统的安装、配置和使用方法,是学习的重要参考。 **七、总结** JBPM3作为一款强大的工作流管理系统,为企业的业务流程自动化提供了强大支持。理解并掌握其核心概念、功能和...

    自己写的jbpm学习资料

    ### jBPM学习资料知识点详解 #### 一、jBPM概述 jBPM,即Java Business Process Management,是一款基于J2EE的轻量级工作流管理系统,专为简化业务流程设计与执行而生。该项目自2004年加入JBoss家族以来,成为其...

    jBPM-jPDL学习笔记

    在开始jBPM-jPDL的学习之前,首先要搭建一个合适的运行环境。系统平台通常要求Java运行环境(JRE或JDK),因为jBPM是基于Java的。安装包通常包括jBPM的核心库、示例项目以及相关的开发工具。对于部署,可以将jBPM...

    jbpm4.4学习教程

    2. 学习流程设计:掌握BPMN 2.0语言,学习如何在jbpm中创建和编辑流程模型。 3. 实践操作:通过示例代码和项目实践,熟悉jbpm的部署、运行和管理工作流程。 4. 深入研究:探索任务服务、事件处理等高级特性,了解...

    jbpm学习资料汇总

    【jbpm学习资料汇总】 jbpm,全称是Java Business Process Management,是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。它提供了一种灵活的方式,使得开发人员和业务分析师能够协同工作,创建、...

    jBPM4学习总结

    【jBPM4学习总结】 jBPM,全称为Java Business Process Management,是一个开源的、灵活且可扩展的业务流程管理框架,涵盖了业务流程管理、工作流和服务协作等多个领域。自2004年10月加入JBoss组织后,jBPM逐渐成为...

    jbpm4jbpm5

    2. **jBPM开发指南**: [jBPM开发指南].高杰.文字版提供了jbpm的开发指导,可能涵盖了如何配置环境、创建流程定义(Process Definition)、设计工作流、处理事件、集成其他系统等方面的内容。开发者可以通过指南...

    Jbpm4学习文档chm

    **JBPM4学习文档CHM**是一份专为学习和理解JBPM4设计的工作流引擎技术文档,适合那些对工作流框架感兴趣的Java开发者,特别是希望将JBPM与Spring框架集成的人员。JBPM是一个开源的工作流程管理系统,它提供了一整套...

    jbpm4.4文档+学习资料

    2. 工具使用:学习使用jbpm提供的图形化建模工具,创建和编辑流程模型。 3. API及编程接口:深入理解jbpm的API,如ProcessEngine、RuntimeManager、TaskService等,学习如何通过代码控制流程。 4. 流程执行与控制:...

    jbpm学习.doc

    jbpm学习文档主要介绍了如何使用jbpm框架来创建和管理工作流程。jbpm是一个开源的业务流程管理系统(BPM),它允许开发者设计、部署和执行业务流程。以下是文档中的关键知识点: 1. **新建项目**:在开始jbpm流程...

    JBPM4 学习使用总结

    ### 二、JBPM4设计与部署 1. **流程设计器(Jbpm Designer)**:JBPM4提供了一个基于Eclipse的图形化流程设计器,用户可以通过拖拽节点来构建流程图。 2. **流程部署(Deployment)**:设计好的流程模型可以导出为...

    JBPM4.3培训学习视频, 包含了JBPM4.3的eclipse插件

    2. **jBPM 4视频教程02:管理流程定义** - 在这部分,学习者将学习如何使用JBPM的流程定义语言(BPMN 2.0)创建和管理流程模型。BPMN是一种标准化的建模语言,用于描述各种业务流程。这包括理解活动(Activity)、...

    JBPM学习视频06~10

    【JBPM学习视频06~10】是针对企业流程管理(Business Process Management,简称BPM)中的核心组件——JBPM进行深入学习的一系列教程。这些视频内容可能涵盖了JBPM 4.4版本的主要功能、架构、设计原理以及实际操作...

Global site tag (gtag.js) - Google Analytics