使用CKRule实现促销管理系统
1, 常见的促销模型
促销管理系统在很多地方都有使用,大家去超市就经常体现到,感受到,不少中小型单位都其促销活动,要搞促销活动最好是有应用软件支持,这样就比较灵活管理也方便。而依靠手工处理的话效率会比较低下的。常见的促销活动,其分类及举例如下:
模型分类 |
序号 |
例子 |
捆绑促销 |
1 |
购买TK001+TK002各1件,优惠10元。(TK001,TK002为产品编码,不同的单位有不同的定义,下同。) |
2 |
购买TK001+TK002各1件,赠送商品TK003一件。 |
|
3 |
购买TK001商品2件,TK002商品1件,赠送TK002商品2件。 |
|
4 |
购买TK001+TK002各一件,享受8折。 |
|
5 |
购买TK001+TK002数量各一件,享受优惠价10元。 |
|
单品促销 |
1 |
购买TK001商品,促销价10元。 |
2 |
购买TK001享受8折。 |
|
3 |
购买TK001,优惠5元。 |
|
4 |
购买TK001商品2个,赠送TK003商品1个。 |
|
组合促销 |
1 |
购买TK001,TK002,TK003,TK004任一件95折,任两件89折。 |
2 |
购买PK01牌商品任意一件95折,两件92折。 |
|
3 |
购买PK01,PC02,PA03牌商品满足3件,每件促销价20元。 |
|
4 |
购买PK01,PC02,PA03牌商品任意1件,可10元购买TK014商品。 |
|
5 |
购买PK01,PC02,PA03牌商品任意1件,赠送TK004,TK005,TK006商品中任意一件。 |
|
6 |
购买PK01,PC02牌商品任意1件,可特价2元购买TK006,TK007中任意商品一件。 |
|
客单价促销 |
1 |
购买TK001满200元,赠送TK006一件,满300元,赠送商品TK007,TK008,TK009各一件。 |
2 |
全场购物满50元,可特价2元购买TK011。 |
|
3 |
购买TK001满200元,优惠30元,满400元优惠60元,满600元优惠90元。 |
|
客单量促销 |
1 |
购买PA01牌商品,除商品TK017外,任意2件赠送TK003一件。 |
2 |
购买PA01牌商品,除商品TK017外,可特价1元购买商品TK003。 |
2, 软件模型抽象
根据上面的业务模型,可以抽象出品牌,商品名称,商品编号,购买件数,实际单价,原单价,单项金额,优惠类型,折扣,备注。其中优惠类型可分为无、折扣、特价、促销、优惠、赠送,这几个类型的特点如下:
名称 |
说明 |
无 |
无任何优惠。 |
折扣 |
使用打折来做优惠。 |
特价 |
固定一个很低的价格。 |
促销 |
与特价类似,但价格不一定低,只是比原价略有减少。 |
优惠 |
直接在原价格上面减去一定的金额。 |
赠送 |
客户不用钱。 |
由于有赠送或直接降低价格的活动,所以固定几个特殊的商品很重要。
序号 |
商品编号 |
含义 |
1 |
L00001 |
0.01元 |
2 |
L00010 |
0.1元 |
3 |
L00100 |
1元 |
4 |
L01000 |
10元 |
3, CKRule上面建模
对象的定义相对简单,是直接参考上面的定义的
自定义类就是销售记录信息,包含单价,数据,打折等内容。这些内容可以根据终端客户的需要增加,如商品条形码等信息。
而主表记录就是客户的基本信息。
要实现上面提到有多样化规则,一般都需要客户自己来设置,不要由软件开发商来设置,否则会忙坏软件开发者,而得不到一点收益。要让客户的计算机管理员可以设置,那设置的办法就要相对简单易懂。在逻辑比较界面中有购物车的商品判断,如含品牌,含商品,含商品件数等等。对商品的操作都是使用商品编号的,这样会比较方便电脑识别。
而结论&操作部分就精彩了,如优惠,打折,促销,特价等操作都会出现。
这些逻辑判断和操作都是前台用户设置时所必备的内容。
4, 促销系统实现方式
看了促销系统的需求,从业务上觉得很正常,是很多商场,商家常常做的活动,也不太复杂。但仅仅从技术实现来看,那就直接觉得太恐怖了,不好处理,有些东西好像仅仅是自然语言来表达,在程序上不好跟进。
好像每一个促销都要写一个类来控制,这样就会出现非常多的类才能搞定问题,如果某天客户想增加一些新的规则,那原来的类就要修改或变化。从简单的角度来看,的确要这样做的,也可以使用一些更加复杂的设计模式来处理问题。
从更标准的角度来看的话,应该做更多业务抽象,架构抽象,对象抽象的工作,但如果开发者刚刚接解这个行业或公司资源不足,难以做更深入的抽象和分析呢?那这个促销的项目基本上没得做了,匆匆上马的话,后面修改的工作量会非常大,最后工作越做越多,但是始终做不到收益。
CKRule从业务规则管理的角度来解决促销问题,把经常变化的规则封装入规则管理系统中,规则的变化不影响主程序代码,技术人员和业务专家都可以按自身的需求不断修改规则,并且都可以在程序运行时修改和部署规则。这大大方便了促销系统的开发。
5, 软件实现
销售订单的定义包含销售主体和明细的商品信息,而商品信息要使用促销规则再进行计算一次,从而判断那些商品可以打折或有什么优惠,如果可以优惠的商品就进行优惠。在实现的计算中,可以会遇到冲突的问题,即符合多个优惠条件的情况,当前软件没有判断冲突,都会生效,实际的计算可能会选其中一两条优惠。
促销管理的业务规则可以在程序运行时配置,不影响其他代码的编写,而配置界面就是调用CKRule上面的配置内容。
初始化规则界面
_curPackage = new RuleFacade().GetPkgInst(RuleInstName); foreach (var item in _curPackage.RuleLib.PoolRules.Keywords) { ListViewItem _lvi = new ListViewItem(); _lvi.Text = item.Name; _lvi.Tag = item; //_lvi.ImageKey = "PicProperty"; _lvi.Group = lvTips.Groups[0]; lvTips.Items.Add(_lvi); } foreach (var item in _curPackage.RuleLib.PoolRules.LgcOperaWords) { ListViewItem _lvi = new ListViewItem(); _lvi.Text = item.Name; _lvi.Tag = item; //_lvi.ImageKey = "PicMethod"; _lvi.Group = lvTips.Groups[1]; lvTips.Items.Add(_lvi); } foreach (var item in _curPackage.RuleLib.PoolRules.ConclusionWords) { ListViewItem _lvi = new ListViewItem(); _lvi.Text = item.Name; _lvi.Tag = item;// new List<CallDef>() { item }; //_lvi.ImageKey = "PicMethod"; _lvi.Group = lvTips.Groups[2]; lvTips.Items.Add(_lvi); } |
保存规则之后,需要刷新规则引擎,使用如下方法进行刷新。
new RuleFacade().Refresh(RuleInstName); |
在计算界面就使用如下命名进行规则计算
_cond = new RuleFacade().Exec(FrmRulePoolSet.RuleInstName, _cond); |
使用CKRule实现促销管理系统的更多相关文章
- Ckrule业务规则管理系统简介
1. 简述 Ckrule业务规则管理系统(BRMS)是一个集成的应用程序存储.管理.执行和测试的平台,允许组织定义.部署.监控和维护运营系统使用的各种复杂决策逻辑.Ckrule BRMS 独立于核 ...
- CKRule业务规则管理系统部署说明
1. 程序包说明 软件是使用WinForm开发的,包含服务端和客户端,服务端部署在IIS上面,客户端可以在已经安装.Net4.0的windows上面运行. 1.1. 服务端程序包 CKBrmsS ...
- 【Java EE 学习 55】【酒店会员管理系统项目总结】
本酒店会员管理系统使用了SSH框架和传值播客提供的协同OA静态页面. 项目地址:https://github.com/kdyzm/HotelMembersManagement 一.需求分析 酒店会员管 ...
- ckrule规则编辑器在wpf中的使用
当前,ckrule的IDE和业务管理系统都是由winform开发的,规则编辑器也只提供了winform的版本,所以很多的朋友都提出意见,要有wpf的版本.wpf的界面设置和管理都更加的方便. 事实上可 ...
- 规则引擎ILog和CKRule的对比
IBM™ WebSphere™ ILOG是业界最有影响力的业务规则商业软件,它提供了最好的业务规则管理系统,在Java领域更是有广泛的成功案例.网上关于ILOG的技术资料非常多,大家都比较了解ILOG ...
- C——货物管理系统
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> ...
- .NET开源项目 QuarkDoc 一款自带极简主义属性的文档管理系统
有些话说在前头 因为公司产品业务重构且功能拆分组件化,往后会有很多的接口文档需要留存,所以急需一款文档管理系统.当时选型要求3点: 1.不能是云平台上的Saas服务,整个系统都要在自己公司部署维护(数 ...
- Mysql 设计超市经营管理系统,包括商品信息表(goods) 和 商品类型表(goodstype)
互联网技术学院周测机试题(一) 一 需求分析 为进一步完善连锁超市经营管理,提高管理效率,减少管理成本,决定开发一套商品管理系统,用于日常的管理.本系统分为商品管理.员工管理.店铺管理,库存管理等功 ...
- 130_传析阅管理系统accdb64位版本
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 几年前笔者针对家居门店的进销存.人员管理.工资管理.任务系统.门店经营盈亏管理.销售分析.考勤请假等息息相关的业务基于Ac ...
随机推荐
- docker加速器配置
我使用docker的原因 最近自己一直在强迫自己使用docker,一方面是docker的容器化服务,使得每一个配置相互独立,易于维护.而且如果到后面如果深入了的话,通过自己编写dockerfile,那 ...
- libcaffe.so.1.0.0: cannot open shared object file: No such file or directory 运行时报错
caffe安装好后lib没有配置到/usr/lib或/usr/local/lib中,需手动配置: sudo vim ~/.bashrc export LD_LIBRARY_PATH=your_path ...
- django' 前端 self.status.split(' ',1)[0], self.bytes_sent AttributeError: 'NoneType' object has no attribute 'split'
form 表单 post之后 ,重新定向当前页面的get请求 这是因为,form表单提交的时候,按钮在form表单里面
- python xlwt 与 xlsxwriter 模块差别
Xlwt 模块有一个bug, 就是所用样式过多的话,之后的数据将使用不了样式,相反xlsxwriter 模块 不会有此问题. 用Xlwt模块的同学们,请务必转换用xlsxwriter模块 !!!!!! ...
- 洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)
题目背景 公元 \(2044\) 年,人类进入了宇宙纪元. 题目描述 公元\(2044\) 年,人类进入了宇宙纪元. L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个 ...
- 【前缀和】【two-pointer】【贪心】洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解
解法众多的一道毒瘤题? 题目描述 奶牛Bessie很喜欢闪亮亮的东西(Baling~Baling~),所以她喜欢在她的空余时间开采钻石!她现在已经收集了\(N\)颗不同大小的钻石,现在她想在谷 ...
- P2801 教主的魔法
传送门 $N$ 太大了主席树过不了 考虑分块 对每个块内的元素排序,询问就对大块二分查找,对两边小的部分暴力枚举 修改时维护 $add[i]$ 标记,维护当前块内整块已经加的数 那么整块的就直接修改 ...
- Tensorlflow-神经网络解决非线性回归问题
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt #使用numpy生成200个随机点,范围从-0.5到0 ...
- nvm安装
1.下载安装包,地址:https://github.com/coreybutler/nvm-windows 2.解压后,点击 nvm-setup 安装,一路默认安装,next下去 3.打开安装位置,然 ...
- Hibernate复合主键的注解
[转自] http://blog.csdn.net/happylee6688/article/details/17636801 最近做项目用到了Hibernate框架,采用了纯面向对象的思想,使用OR ...