`
AngelAndAngel
  • 浏览: 234385 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jbpm学习笔记(四) 模拟借款申请以及各级审批 熟悉各种服务API调用

    博客分类:
  • jbpm
阅读更多
首先,我们来思考一个这样的逻辑,如下图,
[img]
http://dl.iteye.com/upload/picture/pic/79595/dd99a470-0acd-3bd4-b51c-ba9458c97792.png
[/img]                                        



用文字描述是这样的:公司员工在申请借款时,首先填写借款申请,然后部门经理审批,不通过,则取消,若通过,并且金额《5000时,由财务拨款,完成申请,假如金额》=5000,则由总经理审批,通过,则由财务拨款,完成申请,不通过,取消。

通过这个流程图,我们设计jbpm流程定义文件(jbdl),实际上 上面的图就是GPD工具(图形化流程设计器)生成的,源码如下:

Loan.jpdl.xml:
<?xml version="1.0" encoding="UTF-8"?>

<process name="loan" xmlns="http://jbpm.org/4.4/jpdl">
 
 <start name="start">
 <transition name="startLoan" to="inputLoan"/>
 </start>
 
 <task assignee="#{proposer}" name="inputLoan">
 <transition name="submitApplication" to="managerCheck" />
 </task>
 
 <task assignee="manager" name="managerCheck">
 <transition name="managerNotPass" to="cancel" />
 <transition name="managerPass" to="moneyCheck" />
 </task>
 
 <decision name="moneyCheck" expr="#{money&gt;=5000?'x1':'x2'}">
 <transition name="x1" to="ceoCheck"/>
 <transition name="x2" to="financeGet"/>
 </decision>
 
 <end name="end" />
 <end-cancel name="cancel" />
 
 <task assignee="ceo" name="ceoCheck">
 <transition name="ceoPass" to="financeGet" />
 <transition name="ceoNotPass" to="cancel" />
 </task>
 
 <task assignee="finance" name="financeGet">
 <transition name="finishFinance"  to="end"/>
 </task>
 
 
</process>

(注:最开始我的name全部写的中文,发觉在运行的时候会报一个错,改成字母就好了)
有的人比较模糊task和state的区别:task有分配,state没有。


在编码过程中,我们经常会用到jbpm API服务帮我们“走”流程,上一篇中说过,jbpm中JbpmTestCase是作为jbpm4框架的单元测试超类出现的,而且帮我们初始化了如下6个流程引擎服务:
//资源库服务
Protected static RepositoryService repositoryService;

//执行服务
Protected static ExecutionService executionService;

//管理服务
Protected static ManagementService managementService;

//任务服务
Protected static TaskService taskService;

//历史服务
Protected static HistoryService historyService;

//身份认证服务
Protected static IdentiryService identiryService;

这些比较常用


package org.test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jbpm.api.ProcessInstance;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.task.Task;
import org.jbpm.test.JbpmTestCase;

/**
 * 模拟借款
 * 
 * @author 阿飞哥
 * 
 */
public class LoanTest extends JbpmTestCase {
	String deploymentId;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		deploymentId = repositoryService.createDeployment()
				.addResourceFromClasspath("org/test/loan.jpdl.xml").deploy();
	}

	@Override
	protected void tearDown() throws Exception {
		repositoryService.deleteDeploymentCascade(deploymentId);
		super.tearDown();
	}

	/************ 测试例子 ***********/

	/**
	 * 张山 申请4000元,部门经理驳回
	 */
	/*public void test1(){
		String curUser = "张山";
                  //创建流程实例
		ProcessInstance pi =  startLoanProcess(curUser);
		String piId = pi.getId();
		fillOutApplication(piId,curUser,4000);		
		curUser = "manager";
                   //部门经理不同意
		managerCheck(piId,curUser,false,"最近资金紧张);
		pi = executionService.findProcessInstanceById(piId);
		assertNull(pi);// 结束 
		HistoryProcessInstance hpi = getHistoryProcessInstanceById(piId);   
                 // 流程结束状态是cancel , 取消
		assertEquals(hpi.getState(), "cancel"); 

	}*/
	
	/**
	 * 李四 申请4000元,部门经理同意
	 */
	public void test2(){
		String curUser="李四";
                   //创建流程实例
		ProcessInstance pi= startLoanProcess(curUser);
		String piId=pi.getId();
		fillOutApplication(piId,curUser,4000);
		
		curUser="manager";
		managerCheck(piId,curUser,true,"同意");//部门经理同意
		pi=executionService.findProcessInstanceById(piId);
		assertNotNull(pi);//流程未结束
		
		/**
		 * pi.findActiveExecutionIn("financeGet")的意思是
                         在给出的活动名中查询处于活动的可执行活动,假如没有则返回
                          null
		 */
		assertNotNull(pi.findActiveExecutionIn("financeGet"));//财务拨款处于活动状态
		
		
		/*
		 * Set<String> activityNames=pi.findActiveActivityNames();
		 * for(Iterator it=activityNames.iterator();it.hasNext();){
			System.out.println(it.next());
		}
		*可以看看执行活动名
		*/
		
		curUser="finance";
		earmark(piId,curUser,"我拨款了 哈哈");
		pi=executionService.findProcessInstanceById(piId);
		assertNull(pi);//流程结束
		HistoryProcessInstance   
                  hpi=getHistoryProcessInstanceById(piId);

                  //流程结束状态是end,正常结束
		assertEquals(hpi.getState(),"ended");
	}
	

	/**
	 * wang wu申请6000元,部门经理同意,总经理驳回
	 */
	public void test3(){
		String curUser="wang wu";
                  //创建流程实例
		ProcessInstance pi= startLoanProcess(curUser);
               	String piId=pi.getId();
		fillOutApplication(piId,curUser,6000);
		
		curUser="manager";
		managerCheck(piId,curUser,true,"同意");//部门经理同意
		pi=executionService.findProcessInstanceById(piId);
		assertNotNull(pi);

                  //既然部门经理同意,而且money>5000,那么必须得有总经理审批
		assertNotNull(pi.findActiveExecutionIn("ceoCheck"));		
		curUser="ceo";
		ceoCheck(piId,curUser,false,"不同意");//总经理驳回
		pi=executionService.findProcessInstanceById(piId);
		assertNull(pi);//流程结束
		
		HistoryProcessInstance 
                   hpi=getHistoryProcessInstanceById(piId);
                  //流程结束状态是cancel,取消
		assertEquals(hpi.getState(),"cancel");
		
		
		
	}
	
	/**
	 * afei 申请6000,部门经理同意,总经理同意
	 */
	public void test4(){
		String curUser="afei";
                   //创建流程实例
		ProcessInstance pi= startLoanProcess(curUser);
		String piId=pi.getId();
		fillOutApplication(piId,curUser,6000);
		
		curUser="manager";
                   //部门经理同意
		managerCheck(piId, curUser, true,"manager ok");
		pi=executionService.findProcessInstanceById(piId);
		assertNotNull(pi);
		assertNotNull(pi.findActiveExecutionIn("ceoCheck"));//总经理审批处于活动状态
		
		curUser="ceo";
		ceoCheck(piId, curUser, true, "ceo ok");//总经理同意
		pi=executionService.findProcessInstanceById(piId);
		assertNotNull(pi);
		assertNotNull(pi.findActiveExecutionIn("financeGet"));//财务拨款处于活动状态
		
		curUser="finance";
		earmark(piId, curUser, "拨款");
		pi=executionService.findProcessInstanceById(piId);
		assertNull(pi);//流程结束
		HistoryProcessInstance hpi=getHistoryProcessInstanceById(piId);
                  //流程结束状态是ended,正常结束
		assertEquals(hpi.getState(),"ended");
		
		
	}
	/*** 其他方法 ***/

	/**
	 * 用户发起借款申请
	 */
	public ProcessInstance startLoanProcess(String user) {
		Map<String, Object> valMap = new HashMap<String, Object>();
		valMap.put("proposer", user);
		
		//创建流程实例
		return executionService.startProcessInstanceByKey("loan", valMap);
	}

	/**
	 * 填写借款说明
	 * 
	 * @param piId
	 * @param user
	 * @param money
	 * @throws Exception
	 */
	public void fillOutApplication(String piId, String user, double money){
		List<Task> tasks = taskService.findPersonalTasks(user);//获取任务列表
		Task filloutTask = null;
		for (Task task : tasks) {
			if (task.getExecutionId().equals(piId)) {
				filloutTask = task;//匹配任务
				break;
			}
		}
        System.out.println("piId: "+piId);
		assertNotNull(filloutTask);//任务不为空
		Map<String, Object> valMap = new HashMap<String, Object>();
		valMap.put("money", money);//申请金额

                     //设置变量参数
		executionService.setVariables(piId, valMap);
				
		/*
		 * 删除这个任务,标记相关任务为完成,
		 * 假如任务在流程执行的上下文中被创建,
		 * 这个操作可能导致一个流程实例被触发
		 * (这是我自己翻译的)
		 * */
		taskService.completeTask(filloutTask.getId());

	}

	/**
	 * 部门经理审批
	 * 
	 * @param piId
	 * @param user
	 * @param isPass
	 * @param comment
	 * @throws Exception
	 */
	public void managerCheck(String piId, String user, boolean isPass,
			String comment) {
		List<Task> tasks = taskService.findPersonalTasks(user);
		Task checkTask = null;
		for (Task task : tasks) {
			if (task.getExecutionId().equals(piId)) {
				checkTask = task;
				break;
			}
		}
		assertNotNull(checkTask);
		taskService.addTaskComment(checkTask.getId(), comment);
		taskService.completeTask(checkTask.getId(), isPass ? "managerPass"
				: "managerNotPass");

	}

	/**
	 * 总经理审批
	 * 
	 * @param piId
	 * @param user
	 * @param isPass
	 * @param comment
	 * @throws Exception
	 */
	public void ceoCheck(String piId, String user, boolean isPass,
			String comment){
		List<Task> tasks = taskService.findPersonalTasks(user);
		Task checkTask = null;
		for (Task task : tasks) {
			if (task.getExecutionId().equals(piId)) {
				checkTask = task;
				break;
			}
		}
		assertNotNull(checkTask);
		taskService.addTaskComment(checkTask.getId(), comment);
		taskService.completeTask(checkTask.getId(), isPass ? "ceoPass"
				: "ceoNotPass");
	}

	/**
	 * 财务拨款
	 * 
	 * @param piId
	 * @param user
	 * @param comment
	 */
	public void earmark(String piId, String user, String comment) {
		List<Task> tasks = taskService.findPersonalTasks(user);
		Task earTask = null;
		for (Task task : tasks) {
			if (task.getExecutionId().equals(piId)) {
				earTask = task;
				break;
			}
		}
		assertNotNull(earTask);
		taskService.addTaskComment(earTask.getId(), comment);
		String proposer = (String) executionService.getVariable(piId,
				"proposer");

		// 通知借款申请人
		System.out.println("hello:" + proposer + ",财务已经给你拨款了,请查收");
		taskService.completeTask(earTask.getId());


	}
   	/**
	 * 得到流程实例历史
	 * @param piId
	 * @return
	 */
	public HistoryProcessInstance getHistoryProcessInstanceById(String piId) {
		return historyService.createHistoryProcessInstanceQuery()
				.processInstanceId(piId).uniqueResult();
	}
}

再次说明,此测试类继承JbpmTestCase,很多service服务都已经初始化好了,直接run junit就ok了,它会把所有test开头的类当做测试用例执行下去,假如测试出有误,那么会给你报出来。这个例子主要是稍微熟悉一下service api,主要是对各种情况的判断或流转有一个清晰地认识。
分享到:
评论

相关推荐

    工作流引擎jbpm学习笔记

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

    jbpm学习笔记jbpm学习笔记

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

    jbpm学习笔记体会很深刻

    通过JBPM学习杂记,我们可以了解如何创建和配置这些元素,以及如何将它们连接起来形成一个完整的业务流程。 接着,我们需要了解jbpm的数据模型,包括实体类和持久化。jbpm的核心实体如ProcessInstance、Task、Job等...

    JBPM3学习笔记

    **JBPM3学习笔记** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了对业务流程的建模、部署、执行和监控的能力。在本文中,我们将深入探讨JBPM3的核心概念、功能和使用方法,以帮助...

    《jBPM学习笔记_框架设计简介》

    ### jBPM学习笔记_框架设计简介 #### JPDL与jBPM框架设计概述 jBPM(Java Business Process Model)是一种开源的工作流引擎,它提供了用于定义、执行和管理业务流程的功能。JPDL(jBPM Process Definition ...

    JBPM4.3 学习笔记

    【JBPM4.3 学习笔记】 JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于设计、执行和管理业务流程。JBPM4.3是JBPM的一个重要版本,它提供了强大的流程建模、执行和服务集成能力,是...

    jBPM-jPDL学习笔记

    jBPM(Java Business Process Management)是一款开源的工作流管理系统,用于在Java应用程序中实现业务流程自动化。jPDL(jBPM Process Definition Language)是jBPM用来描述和执行业务流程的一种专用语言,它基于...

    jBPM-jPDL学习笔记——流程设计与控制

    下面,我们将通过学习笔记,了解jBPM-jPDL的流程设计与控制机制。 流程设计 在jBPM-jPDL中,流程设计是指定义业务流程的结构和行为。流程设计通常包括定义流程的各个节点、 переход和操作。jPDL(Java ...

    Jbpm工作流实例—报销申请

    在这个“报销申请”的实例中,我们将探讨如何利用Jbpm来处理日常的报销流程,包括报销单的提交、审批、财务审核以及支付等步骤。 首先,我们需要理解工作流的基本概念。工作流是一种定义和执行业务过程的方式,它...

    jbpm5.4 api javadocs

    jbpm5.4 API Javadocs 是一套详细的技术文档,主要涵盖了jbpm 5.4.0.Final版本的核心功能和API接口。jbpm(Java Business Process Management)是一款开源的工作流管理系统,它允许开发者设计、执行和管理业务流程。...

    jbpm-jpdl 学习笔记

    入门材料 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记 jbpm-jpdl 学习笔记

    JBPM4学习笔记

    【JBPM4学习笔记】 JBPM4是一款开源的工作流管理系统,它提供了强大的流程定义和执行能力,被广泛应用于企业的业务流程自动化。本学习笔记将深入探讨JBPM4的核心特性和使用方法,帮助读者掌握如何利用它来实现高效...

    jbpm学习资料,jbpm教程

    8. **集成能力**:jbpm能够与其他Java应用程序、服务和数据库无缝集成,提供了丰富的API和工具,便于开发人员将工作流集成到现有系统中。 9. **监控与调试**:jbpm提供了图形化的监控工具,允许管理员查看流程实例...

    jbpm3.1.4经典学习教程

    这个实例有助于巩固你的理解,并让你熟悉jbpm的API。 "JBPM工作流开发指南v10-20070706.rar"这份文档可能是较新的指南,虽然版本号与标题不符,但依然能提供关于jbpm更广泛和深入的信息,包括最佳实践、优化技巧...

    jbpm 4.4 学习笔记

    在本文档中,主要讨论的是jbpm 4.4 版本的学习笔记。作者通过实践学习并整理了关于jbpm的一些关键概念和操作。 首先,流程图是jbpm设计流程的核心,它包含了一系列的流程元素。在提到的订购流程中,主要包括以下...

    JBPM4.4完整可用审批流程

    在实际应用中,开发者需要了解JBPM4的工作原理,包括流程实例、任务实例、信号和事件的概念,以及如何通过API或服务任务与外部系统交互。熟悉Maven的使用也是至关重要的,包括理解POM文件的结构、如何添加和排除依赖...

    JBPM4学习笔记(全)

    **JBPM4学习笔记概述** JBPM(JBoss Business Process Management)是一款开源的工作流程管理系统,主要专注于业务流程的建模、执行和监控。JBPM4是JBPM的第四个主要版本,它提供了一整套工具和服务,使得企业能够...

    JBPM_6.0.1_API(最新API)

    - **自动化审批流程**: 如财务报销、请假申请等,通过JBPM API实现审批流程的自动化。 - **工作流监控**: 跟踪和分析流程实例的状态,提供报表和优化建议。 - **规则驱动的业务逻辑**: 在流程中引入Drools规则,根据...

    JBPM创建数据库,流程定义以及发布学习笔记

    【JBPM创建数据库,流程定义以及发布学习笔记】 JBPM(Java Business Process Management)是一个开源的工作流管理系统,用于实现业务流程自动化。本笔记主要涉及如何创建JBPM所需数据库,定义流程,以及发布流程。...

Global site tag (gtag.js) - Google Analytics