`
VerRan
  • 浏览: 459649 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

JBPM+Drools实现订单流程管理-初探

    博客分类:
  • JAVA
阅读更多

背景介绍:

电信BOSS系统其中很重要的信息就是订单,所有的业务受理,投诉,建议,咨询,报障信息都是依托订单来实现的,订单贯穿于整个业务的执行流程。订单生命周期描述如下:

 

1.       通过受理中心生成订单信息。

2.       对订单进行收费。

3.       营业厅班长对订单进行审核。(包括人工审核和自动审核)。审核校验订单的信息,后台的审核包括对订单的流向进行初步分流,比如有些订单是不需要进入后台施工流程的,此时审核就将此单流程定向到待竣工,如果要走后台流程则将订单放入分解队列进行分解。

4.       订单进行分解,将需要发送后台施工的订单进行分解,通过分解来细化订单这里分解遵循一定的分解规则,比如每个产品单分解成一个服务订单由于发送后台施工。通过分解队列获取需要分解的订单,并根据特定规则进行分解。

5.       订单发送,将分解完的订单通过订单发送将订单发送到后台施工系统(在电信里负责后台施工调度的是 服务开通系统),这里的发送需要将分解后的订单,将订单相关的产品信息,产品属性信息,产品地址信息,产品资源信息…..等信息组织成xml信息发送到后台。

6.       后台施工完毕返单,当后台施工完毕后 服务开通系统通过返单操作,通知前台受理系统订单后台施工完毕,综合受理系统将订单迁移到待竣工状态。

7.       订单竣工,当订单下的所有明细都到待竣工状态时通过竣工将订单包含的信息持久化到统一客户资料系统,统一客户资料系统并将数据同步到计费系统。这样前台的数据就都处理完成了,剩下的就是计费去算费用了。

 

从流程化和规则化可配置化的角度考虑,订单的整个生命周期可以理解为一个工作流程,包含了以下流程节点:

订单受理、收费、订单审核、订单分解、订单发送、返单、订单竣工

 

* 流程定义:

<?xml version="1.0" encoding="UTF-8"?>

<process name="OrderManage" xmlns="http://jbpm.org/4.4/jpdl">
	<start g="128,-6,48,48" name="start1">
		<transition g="-47,-4" name="to Caculate deciFee" to="DeciFee" />
	</start>
	<java class="com.lht.OrderManagement.FeeManagement" g="264,126,92,52"
		method="caculateFee" name="CaculateFee" var="retMsg">
		<arg>
			<object expr="#{orderId}" />
		</arg>
		<transition g="-53,-19" name="to OrderAudit" to="OrderAudit" />
	</java>
	<java class="com.lht.OrderManagement.OrderAuditRule" g="142,136,92,52"
		method="audit" name="OrderAudit">
		<arg>
			<object expr="#{orderId}" />
		</arg>
		<transition g="-85,-6" name="to OrderDispatch" to="OrderDispatch" />
	</java>
	<java class="com.lht.OrderManagement.OrderDispathRule" g="125,217,92,52"
		method="dispatch" name="OrderDispatch">
		<arg>
			<object expr="#{orderId}" />
		</arg>
		<transition g="-70,-7" name="to OrderSend" to="OrderSend" />
	</java>
	<java class="com.lht.OrderManagement.OrderSendRule" g="147,294,92,52"
		method="send" name="OrderSend">
		<arg>
			<object expr="#{orderId}" />
		</arg>
		<transition g="-82,-18" name="to OrderArchive" to="OrderArchive" />
	</java>
	<java class="com.lht.OrderManagement.OrderArchiveRule" g="150,369,92,52"
		method="achive" name="OrderArchive">
		<arg>
			<object expr="#{orderId}" />
		</arg>
		<transition g="-42,-11" name="to OrderEnd" to="OrderEnd" />
	</java>
	<end g="170,458,48,48" name="OrderEnd" />
	<end-cancel g="34,15,48,48" name="Cancel" />
	<decision name="DeciFee" g="309,56,48,48">
		<handler class="com.lht.dao.decisionHandler.OrderFeeDecisionHandler" />
		<transition name="to errorDeal" to="ErrorDeal" g="-54,-18">
		</transition>
		<transition name="to CaculateFee" to="CaculateFee" g="-78,-18"></transition>
	</decision>
	<java class="com.lht.OrderManagement.ErrorDealRule" g="35,93,92,52"
		method="errorDeal" name="ErrorDeal">
		<transition g="-44,-5" name="to Cancel" to="Cancel" />
	</java>
</process>

 

 

 

 

当订单状态不为10(收费环节)时订单直接终止,不走自动流程并返回费用未收取。

 * 流程节点执行操作实现

 

 收费环节:

 

 

 

package com.lht.OrderManagement;

import com.lht.dao.CustOrderDAO;
import com.lht.util.LogUtil;
import com.lht.vo.Order;

public class FeeManagement {

	public FeeManagement() {

	}

	public String caculateFee(String orderId) {
		Order order = new CustOrderDAO().queryOrderIngfo(orderId);
		String ret = "20";
		LogUtil.debug("开始计算费用信息 订单编号是:" + order.getOrderId() + ";"
				+ order.getOrderState());
		OrderManagementRule rule = new OrderManagementRule();
		rule.validateOrderExists("OrderManage.drl", order);
		return ret;
	}

}

 

收费环节调用 订单管理规则,执行Drools定义的订单收费规则。

 

* Drools 实现收费业务规则

   ** drools 规则定义

    当订单编号不为空,同时订单状态为收费环节时则执行收费操作

 

package com.sample
import function com.lht.util.LogUtil.debug;
import com.lht.vo.Order;
import com.lht.dao.CustOrderDAO;
rule "isFeeState"
no-loop true
activation-group "feeState"
	when
		$order:Order(orderId!=null&&orderId!=""&&orderState=="10");
	then
		debug("订单处于收费岗"); 
		CustOrderDAO dao=new CustOrderDAO();
		boolean flag=dao.isOrderExists($order.getOrderId());
		debug("收费完毕订单状态转移到审核岗");
		$order.setMsg("收费成功");
		$order.setOrderState("20");
		update($order);
end

rule "isNotFeeState"
no-loop true
enabled false
activation-group "feeState"
	when
		$order:Order(orderId!=null&&orderId!=""&&orderState!="10");
	then
		debug("订单不在收费岗,终止流程"); 
		$order.setMsg("订单未收费");
		update($order);
end

 

 

 isFeeState 规则执行了以上判断

 boolean flag=dao.isOrderExists($order.getOrderId()); 实现了收费操作。

 

* 订单管理规则类调用drools规则,执行收费操作

package com.lht.OrderManagement;

import org.drools.KnowledgeBase;
import org.drools.runtime.StatefulKnowledgeSession;

import com.lht.util.DroolsUtil;
import com.lht.util.LogUtil;
import com.lht.vo.Order;

public class OrderManagementRule {

	public OrderManagementRule() {

	}

	public String validateOrderExists(String drlFile, Order order) {
		KnowledgeBase kbase = DroolsUtil.readKnowledgeBase(drlFile);
		StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
		ksession.insert(order);
		ksession.fireAllRules();
		LogUtil.debug("Next OrderState is " + order.getOrderState());
		LogUtil.debug("流程处理结果:" + order.getMsg());
		return order.getMsg();
	}

}

 

package com.lht.util;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;

public class DroolsUtil {
	public static KnowledgeBase readKnowledgeBase(String drlFile) {
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
				.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory.newClassPathResource(drlFile),
				ResourceType.DRL);
		KnowledgeBuilderErrors errors = kbuilder.getErrors();
		if (errors.size() > 0) {
			for (KnowledgeBuilderError error : errors) {
				System.err.println(error);
			}
			throw new IllegalArgumentException("Could not parse knowledge.");
		}
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
		return kbase;
	}

}

 

droolsUtil 实现规则文件的执行,创建知识库

 

* 启动业务流程引擎

package com.lht.test;

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

import org.jbpm.api.Configuration;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;

import com.lht.dao.CustOrderDAO;
import com.lht.util.LogUtil;
import com.lht.vo.Order;

public class ProcessEngineLearn {

	public static String deployProcess(ProcessEngine pe, String jpdlPath) {
		return pe.getRepositoryService().createDeployment()
				.addResourceFromClasspath(jpdlPath).deploy();
	}

	public static void deleteProcessInst(ProcessEngine pe, String processInstId) {
		pe.getRepositoryService().deleteDeployment(processInstId);
	}

	public static ProcessInstance excuteProcess(ProcessEngine pe, String key,
			Map<String, Object> variables) {
		return pe.getExecutionService().startProcessInstanceByKey(key,
				variables);
	}

	/**
	 * @param args
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException {
		ProcessEngine pe = new Configuration().buildProcessEngine();
		deployProcess(pe, "com\\lht\\OrderManagement\\OrderManage.jpdl.xml");
		Map<String, Object> variables = new HashMap<String, Object>();
		String orderId="1016921081";
		Order order = new CustOrderDAO().queryOrderIngfo(orderId);
		variables.put("orderId", order.getOrderId());// 传入流程的参数
		variables.put("orderState", order.getOrderState());// 传入流程的参数
	}
}

 

 * 执行结果

 

2010-08-04 17:39:13  开始计算费用信息 订单编号是:1016921081;10
2010-08-04 17:39:18  订单处于收费岗
2010-08-04 17:39:19  收费结果是:true
2010-08-04 17:39:19  收费完毕订单状态转移到审核岗
2010-08-04 17:39:19  Next OrderState is 20
2010-08-04 17:39:19  流程处理结果收费成功
2010-08-04 17:39:20  开始订单审核1016921081
2010-08-04 17:39:21  开始订单分解1016921081
2010-08-04 17:39:22  开始订单发送1016921081
2010-08-04 17:39:23  订单开始竣工1016921081

 

 

分享到:
评论

相关推荐

    drools+jbpm

    jBPM(jBoss Business Process Management)则是一个开源的工作流和业务流程管理系统,用于管理业务流程的生命周期,包括设计、部署、执行、监控和优化。jBPM支持BPMN2.0标准,提供图形化的流程设计工具,使得流程的...

    jbpm+S2SH请假流程经典实现及源码

    这个“jbpm+S2SH请假流程经典实现及源码”是一个实际的应用示例,它将jbpm的工作流引擎与S2SH框架集成,用于实现一个完整的请假流程管理。 首先,jbpm的核心功能包括流程建模、流程实例管理、任务管理和事件处理等...

    jBPM4+drools实战_1_课程介绍及项目需求.ppt

    jBPM4+drools实战_1_课程介绍及项目需求.ppt

    jbpm-jpdl-designer-site-3.1.7.zip

    jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip

    jbpm-jpdl-designer-nodeps-3.1.4

    综上所述,"jbpm-jpdl-designer-nodeps-3.1.4"提供了独立于特定依赖环境的Jbpm流程设计器,便于开发者通过JPDL来定义和管理业务流程。它包含的文档和资源有助于用户安装、理解和使用该工具,同时遵守相应的开源许可...

    jbpm-jpdl-designer-nodeps-3.0.13.zip

    JBPM是一个开源的工作流和业务流程管理系统,它提供了对业务流程的建模、部署、执行、监控和管理功能。这款3.0.13版本的jdpm编辑器是MyEclipse集成开发环境的一个插件,用于图形化设计流程定义语言(JPDL)。 JPDL...

    jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)

    jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载

    drools-persistence-jpa-5.2.0.Final-sources.jar

    drools-persistence-jpa-5.2.0.Final-sources.jar jbpm5 源码

    jbpm+SSH实例(报销流程)

    本实例"jbpm+SSH实例(报销流程)"旨在帮助初学者理解如何利用jbpm设计和实现一个报销流程,并结合SSH框架进行部署和运行。报销流程是企业日常运营中常见的例子,它包括申请、审批、支付等环节,非常适合用来展示工作...

    JBoss+jBPM+jPDL用户开发手册_3.2.3

    《JBoss+jBPM+jPDL用户...通过阅读《JBoss+jBPM+jPDL用户开发手册_3.2.3》,开发者能够熟练掌握在JBoss平台上利用jBPM和jPDL进行业务流程自动化的方法,从而提升企业的流程管理效率,实现更高效、更灵活的业务运营。

    jbpm4 s2sh 请假流程

    在这个教程中,我们将深入理解jbpm4的工作原理以及如何将其与SSH框架集成,以构建一个完整的业务流程管理系统。 jbpm4是Java Business Process Management的第四个版本,它是一个开源的工作流和业务流程管理(BPM)...

    jbpm-6.5.0.Final-installer-full.zip

    Jbpm是一个开源的工作流程管理系统,它主要用于设计、部署和执行业务流程。这个"jbpm-6.5.0.Final-installer-full.zip"压缩包是JbPM 6.5.0最终版本的完整安装程序,包含了所有必要的组件,方便用户在本地环境中搭建...

    jbpm5初级demo的安装过程-基于eclipse

    在这个过程中,Eclipse作为开发工具,可以辅助进行流程图的设计和调试,drools-guvnor则提供了规则管理,designer用于图形化设计流程,而jbpm-gwt-console则是用户交互的前端界面。 请注意,由于jbpm5的版本较旧,...

    SSH所有jar+jbpm+json+extjs

    标题中的"SSH所有jar+jbpm+json+extjs"提到了几个关键的软件开发组件,这些组件在Java Web开发中扮演着重要角色。SSH是一个常见的缩写,它代表Spring、Struts和Hibernate三个框架,它们是Java企业级应用开发的基石。...

    SpringMVC+jbpm+ibatis+Hibernate框架

    jbpm,全称为Business Process Management,是一个开源的工作流和业务流程管理平台。它可以用于设计、执行和管理业务流程。jbpm允许开发者定义流程图,这些流程图可以描述一系列的任务和决策,从而自动化复杂的业务...

    drools集成springboot demo

    此外,还可以考虑使用工作流引擎如jBPM来配合drools,实现更复杂的业务流程控制。 这个"drools集成springboot demo"项目,就是一个实际的应用示例,展示了如何在SpringBoot环境中有效地使用drools进行业务规则的...

    jbpm+bibernate jar包

    在"jbpm+bibernate jar包"中,`lib`目录很可能包含了jbPM和Hibernate的jar文件,以及其他依赖库,这些库可能包含了用于数据库连接、日志记录、XML解析等功能的组件。为了使用这些框架,开发者需要将这些jar文件添加...

    jbpm + struts + spring + tomcat

    【jbpm + struts + spring + tomcat】项目是一个经典的Java企业级应用架构组合,它将业务流程管理(BPM)工具jbpm、MVC框架Struts、依赖注入容器Spring和应用服务器Tomcat整合在一起,为开发高效、可维护的企业应用...

    jbpm+ssh整合

    【jbpm+ssh整合】是将企业级工作流引擎jbpm与流行的SSH(Struts、Spring、Hibernate)框架集成,实现一个完整的业务流程管理系统。jbpm是一个开源的工作流引擎,可以处理复杂的业务流程自动化,而SSH是Java开发中...

    jbpm_ssh.zip_jbpm+ssh

    这份文档对于想要学习或实践jbpm与SSH集成的开发者来说是一份宝贵的资源,可以帮助他们快速理解和实现业务流程管理与Web应用的无缝结合。 通过这个示例,开发者可以学习到如何在实际项目中有效地整合各种技术,提升...

Global site tag (gtag.js) - Google Analytics