`
xuantian868
  • 浏览: 30409 次
  • 性别: 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学习.doc

    jbpm学习资料 1. 新建一个项目 2. 在项目里面添加流程定义,如下图所示:

    JBPM5.1入门学习

    3.4 学习使用JBPM控制台 11 3.5 学习使用drools-guvnor设计器 13 4 用TOMCAT+SSH+JOTM+MYSQL+JBPM移植DEMO 14 4.1 环境准备 14 4.1.1 安装JDK 14 4.1.2 安装Ant 14 4.1.3 安装Eclipse 15 4.1.4 安装Tomcat 15 4.1.5 ...

    SSH+JBPM4.3的整合 JBPM4.3

    SSH+JBPM4.3的整合 JBPM4.3 转载别人的博客,里面包含2份整合框架的资料,2份关于JBPM的学习

    jbpm4.4学习笔记

    2 工作流的过程 7 3 Jbpm4.4介绍 7 3.1工作流引擎 8 3.2jpdl 8 3.3数据库 8 3.3.1资源库和运行时表结构 8 3.3.2历史数据库表 9 3.3.3身份认证表 9 3.4jbpm.cfg.xml 9 3.5 jbpm.hibernate.cfg.xml 10 3.6logging....

    第二部分、安装和配置JBPM5.4及Eclipse流程插件安装.rar

    基于java及JBPM5.4流程引擎技术开发.鉴于JBPM5.4版本较新,而目前网上基本上没有对应的简单实例,更不要说... JBPM是属于特有领域的专项技术,学习成本较高,目前掌握该技术的程序员北上广地区待遇月薪至少是1万2以上

    JBPM工作流开发指南

    二、第一个流程 5 2.1、开始前的准备 5 2.2 、Hello World 例子 6 三、学习JPDL 11 3.1 、简介 11 3.2 、流程版本(Version) 11 3.3 、流程定义 12 3.3.1 process-definition(流程定义) 12 3.3.2 node(自动节点) 13...

    jbpm4.4+ssh整合

    jbpm4.4+ssh整合还需要安装插件进入到myeclipse中 将相应的jar文件放进去 就能够运行 ...ssh(strut2,hibernate3,spring3)三大框架整合的jar包 例子是 请假流程 代码中有很好的注释 便于初学者学习

    jbpm源代码阅读视频—第三次阅读part2

    1.1构建jbpm4.4源代码于都工程 1.2配置文件解析过程 1.3对象创建过程与binding解析过程 同时由于本人能力有限,时间有限. 这些东西仅仅为抛砖引玉,我是转而已。可能会有一些不到位的地方。 如有不同意见可以...

    jbpm 4.3 视频教程

    jbpm 4.3 视频教程,swf格式,教程简单明了,仅用于个人学习,请勿用于商业

    第三部分、使用JBOSS7.1及对JBPM5.4事件学习.rar

    基于java及JBPM5.4流程引擎技术开发.鉴于JBPM5.4版本较新,而目前网上基本上没有对应的简单实例,更不要说... JBPM是属于特有领域的专项技术,学习成本较高,目前掌握该技术的程序员北上广地区待遇月薪至少是1万2以上

    J2EE平台下SSH+JBPM+ExtJs

    后台使用目前中小型开发较为常用的SSH2作为框架,囊括了JBPM4.4工作流引擎。 课程经由基础学习向高阶跨进,一步一步介绍了前后台的关系,以及前后台的整合、JBPM的整合等等,都是属于目前较为重要的技术点。

    第四部分、SSH2结合JBPM5.4.rar

    基于java及JBPM5.4流程引擎技术开发.鉴于JBPM5.4版本较新,而目前网上基本上没有对应的简单实例,更不要说... JBPM是属于特有领域的专项技术,学习成本较高,目前掌握该技术的程序员北上广地区待遇月薪至少是1万2以上

    jbpm4.4整合s2sh 请假流程例子

    jbpm4.4整合s2sh 请假流程例子,项目很好,是学习JBPM的很好的例子,已经测试过,很好用,可以下载后好好研究一下

    jbpm 4 视频教程(1、2)

    jbpm 4 完整视频教程,让你从零开始学习jbpm在java开发中的开发和使用,共包含九讲以及一个示例。(由于上传限制,共分4个压缩包,分享给大家)

    一个Jbpm员工请假流程的实例

    说明,这篇文章说使用的流程实例是,学习《一个JBPM工作流管理示例》文章中的流程而来。原文中的流程实例不是jbpm3.1版本,不能适用于jbpm3.1。本人将其改写,并加入自己的设计和实现。 2. 流程说明 假设应用背景...

    深入浅出jBPM3.2.part2

    JBPM3.2,扫描版本,还算很清晰,虽然比较老,但是用来学习下还算不错,而且是中文,此文件因为太大,所以分为两个压缩包压缩,都已全部上传,请全部下载再解压缩。

    jpbm4.4学习文档及数据库表结构

    jbpm4.4入门学习的好文档 1.工作流基础 2.开发环境 3.核心概念与相关api 4.processenginee serviceapi 5.管理流程定义 6.执行流程实例 7.流程定义语言 8.应用 与其他框架的集成

    第一部分、工作流开发基础-为什么学习工作流.rar

    基于java及JBPM5.4流程引擎技术开发.鉴于JBPM5.4版本较新,而目前网上基本上没有对应的简单实例,更不要说... JBPM是属于特有领域的专项技术,学习成本较高,目前掌握该技术的程序员北上广地区待遇月薪至少是1万2以上

Global site tag (gtag.js) - Google Analytics