一个简单的规则引擎例子

本例使用的规则引擎包是RulesEngine,关于RulesEngine的介绍,请自行补充,这里只是一个极简单使用场景。

例子大体就是用户有一些优惠券,系统会根据用户订单情况,筛选可以使用的优惠券供用户选择,用户选择后会计算出优惠后金额。

代码相对简单,就不一一介绍了,奉上service中的代码:

using Microsoft.Extensions.Logging;
using RulesEngine.Extensions;
using RulesEngine.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;namespace RulesEngineSample.Services
{public class CouponService : ICouponService{private readonly ILogger<CouponService> _logger;private readonly List<Coupon> _userCoupons;private readonly Order _order;private readonly User _user;public CouponService(ILogger<CouponService> logger){_logger = logger;//假装用户用的优惠券_userCoupons = new List<Coupon>() {new Coupon{ID = 1,Code="YH01",Name = "满500减20",BeginTime = DateTime.Parse("2021-01-01"),EndTime = DateTime.Parse("2021-06-01"),Expression = "input1.Details.Sum(s => s.Price * Convert.ToDecimal(s.Quantity))>= 500",Symbol="-",Number=20},new Coupon{ID = 2,Code="YH02",Name = "新人5元券",BeginTime = DateTime.Parse("2021-01-01"),EndTime = DateTime.Parse("2021-06-01"),Expression = "input1.Details.Count>0",Symbol="-",Number=5},new Coupon{ID = 3,Code="YH03",Name = "商品C五折",BeginTime = DateTime.Parse("2021-01-01"),EndTime = DateTime.Parse("2021-06-01"),Expression = "input1.Details.Where(s=>s.GoodsID==\"SP0000003\").Count()>0",Symbol="*",Number=0.5f,GoodsID="SP0000003"},};//假装当前用户的订单_order = new Order{OrderNo = "NO00000001",OrderTime = DateTime.Now,Details = new List<Detail>{new Detail{ GoodsID="SP0000001", Name="商品A", Price=12.5m, Quantity=3},new Detail{ GoodsID="SP0000002", Name="商品B", Price=100m, Quantity=4},new Detail{ GoodsID="SP0000003", Name="商品C", Price=22.3m, Quantity=5},}};_user = new User { ID = 1, UserName = "zhangsan" };}/// <summary>/// 适配优惠券/// </summary>/// <returns></returns>public async Task<string> SelectCouponAsync(){var workRules = new RulesEngine.Models.WorkflowRules();workRules.WorkflowName = "优惠券";var rules = new List<Rule>();foreach (var coupon in _userCoupons.Where(s => s.BeginTime < DateTime.Now && s.EndTime > DateTime.Now)){var rule = new Rule{RuleName = coupon.Name,SuccessEvent = coupon.Code,ErrorMessage = "规则应用失败",ErrorType = ErrorType.Error,RuleExpressionType = RuleExpressionType.LambdaExpression,Expression = coupon.Expression};rules.Add(rule);}workRules.Rules = rules;var rulesEngine = new RulesEngine.RulesEngine(new WorkflowRules[] { workRules }, _logger, new ReSettings());var ruleResults = await rulesEngine.ExecuteAllRulesAsync("优惠券", _order, _user);// var valueCoupons = new List<string>();//处理结果var discountCoupons = new StringBuilder();foreach (var ruleResult in ruleResults){if (ruleResult.IsSuccess){discountCoupons.AppendLine($"可以使用的优惠券 “{_userCoupons.SingleOrDefault(s => s.Code == ruleResult.Rule.SuccessEvent)?.Name}”, Code是:{ruleResult.Rule.SuccessEvent}");//valueCoupons.Add(ruleResult.Rule.SuccessEvent);}}//resultList.OnSuccess((eventName) =>//{//    discountOffered += $"可以使用的优惠券“{userCoupons.SingleOrDefault(s => s.Code == eventName)?.Name}”,Code是:{eventName} ";//});ruleResults.OnFail(() =>{discountCoupons.AppendLine("您没有适合的优惠券!");});return discountCoupons.ToString();}/// <summary>/// 计算订单支付总额/// </summary>/// <param name="code"></param>/// <returns></returns>public string GetOrderAmount(string code){            var selectCoupon = _userCoupons.SingleOrDefault(s => s.Code == code);var orderAmount = 0m;switch (selectCoupon.Symbol){case "-":orderAmount = _order.Details.Sum(s => s.Price * Convert.ToDecimal(s.Quantity)) - Convert.ToDecimal(selectCoupon.Number);break;case "*":if (!string.IsNullOrWhiteSpace(selectCoupon.GoodsID)){orderAmount = _order.Details.Sum(s => s.Price * Convert.ToDecimal(s.Quantity));var detail = _order.Details.SingleOrDefault(s => s.GoodsID == selectCoupon.GoodsID);if (detail != null){orderAmount -= detail.Price * Convert.ToDecimal(detail.Quantity) * Convert.ToDecimal(1 - selectCoupon.Number);}}else{orderAmount = _order.Details.Sum(s => s.Price * Convert.ToDecimal(s.Quantity)) * Convert.ToDecimal(selectCoupon.Number);}break;}return $"订单总金额:{_order.Details.Sum(s => s.Price * Convert.ToDecimal(s.Quantity)) },优惠后请支付:{orderAmount}";}}public class Coupon{public int ID { get; set; }public string Code { get; set; }public string Name { get; set; }public DateTime BeginTime { get; set; }public DateTime EndTime { get; set; }public string Expression { get; set; }public string Symbol { get; set; }public float Number { get; set; }public string GoodsID { get; set; }}public class User{public int ID { get; set; }public string UserName { get; set; }}public class Order{public string OrderNo { get; set; }public DateTime OrderTime { get; set; }public List<Detail> Details { get; set; }}public class Detail{public string GoodsID { get; set; }public float Quantity { get; set; }public decimal Price { get; set; }public string Name { get; set; }}
}

api  /selectcoupon是查询可使用的优惠券

/getamount 按优惠券code,计算本次订单的应付金额:

优惠券YH01

优惠券YH02

优惠券YH03

相关文章:

  • C# 规则引擎RulesEngine

  • 从案例角度解析建模平台动态规则引擎

  • 成本计算引擎动态规则解析技术详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员面试必备的20条Python经典面试题

1、Python如何实现单例模式&#xff1f;Python有两种方式可以实现单例模式&#xff0c;下面两个例子使用了不同的方式实现单例模式&#xff1a;1.class Singleton(type):def __init__(cls, name, bases, dict):super(Singleton, cls).__init__(name, bases, dict)cls.instance …

Active Directory系列之十七:实战详解域信任关系

实战详解域信任关系上篇博文中我们对域信任关系作了一下概述&#xff0c;本文中我们将通过一个实例为大家介绍如何创建域信任关系。拓扑如下图所示&#xff0c;当前网络中有两个域&#xff0c;一个域是ITET.COM&#xff0c;另一个域是HOMEWAY.COM。两个域内各有一个域控制器&am…

vim 寄存器 操作_vim指令

vim 是一个基于【动词】 【名词】 建立的语法表。Vim 中常用的名词方位名词表基于字符的移动&#xff1a;h&#xff1a;左j&#xff1a;下k&#xff1a;上l&#xff1a;右 ^ | k 提示&#xff1a; h 的键位于左边&#xff0c;每次按下就会向…

35岁老程序员因身体原因没加班,老板:不想干就滚蛋

近日&#xff0c;某论坛上一名 35 岁老程序员说出了他最近的遭遇&#xff0c;高强度的工作本来就让他感觉越来越劳累&#xff0c;加上又在医院做了一个小手术&#xff0c;于是就按照公司的正常上下班时间下了班&#xff0c;但是领导却说了一句让他难以接受的话&#xff0c;都三…

客制化键盘编程_指尖运动会,谁是打字冠军,双十一机械键盘推荐

机械键盘就只能玩游戏吗&#xff1f;当然不是&#xff0c;其实机械键盘出现还远远早于薄膜键盘&#xff0c;早期类似IBM、AST、HP、康柏一类的品牌机都是标配机械键盘的。早期的机械键盘确实有点笨重&#xff0c;尤其是白轴的机械键盘&#xff0c;让你毕生难忘。比黑轴更加坚硬…

分布式数据库一定会替代Oracle吗?

在传统数据库领域&#xff0c;Oracle一直占据了很大的市场份额&#xff0c;很多企业的业务系统基于此实现OLTP交易场景。近年来&#xff0c;随着分布式技术的发展&#xff0c;分布式数据库逐渐占据了OLTP领域较大的市场&#xff0c;尤其在互联网领域&#xff0c;MYSQL、PG等分布…

数模国赛要点与注意事项全分享!

暑假咻地一下就过去了&#xff0c;转眼数学建模国赛快到了。为了给大家最最直接的帮助&#xff0c;超模君特邀请到周老师为参加国赛的模友们准备了一场干货满满的赛前冲刺直播课。全天候直播&#xff0c;助大家一臂之力&#xff0c;全力冲刺数模国赛&#xff01;周老师拥有多年…

android byte[] 转string 好多问号_#WIPI# Android使用HID设备

哈罗大家好。生活总是这样计划赶不上变化&#xff0c;今天为大家分享一下新加的小功能--使用Android设备连接HID设备。安卓内部已经内置了丰富的驱动&#xff0c;所以一般的设备我们只需要简单是设置就可灵活使用。首先对清单文件做简单修改<?xml version"1.0" e…

【Redis】有序集合的交集与并集

Redis支持多种类型的数据结构&#xff0c;最简单的字符串(strings)&#xff0c;适合存储对象的哈希(hash)&#xff0c;简单的字符串列表(list)&#xff0c;无序集合(set)&#xff0c;有序集合(sorted set)&#xff0c;以及用于做基数统计的HyperLogLog&#xff0c;其中使用频率…

从小害怕数学的他,却成为了科普数学教育的数学家

谈到数学&#xff0c;你们会想到什么&#xff1f;也许部分模友们会想到数学上的公式、定理、几何图形、微积分等等&#xff0c;也许会有模友们想到高数&#xff0c;&#xff08;多数大学生的痛&#xff09;也许大家还会想起高中数学老师课堂上的“循循教诲”——看书干嘛&#…

工作原理是什么_磁翻板液位计工作原理是什么?

液位计​大家都知道&#xff0c;是用来测量介质液位的仪表​&#xff0c;但是说到磁翻板液位计​这个概念可能大家都比较陌生&#xff0c;​磁翻板液位计​是根据浮力原理(阿基米德定律)结合磁性耦合作用研制而成&#xff0c;当被测量容器中的液位升降时&#xff0c;液位计主导…

我们该如何学习机器学习中的数学

数学在机器学习中非常重要&#xff0c;不论是在算法上理解模型代码&#xff0c;还是在工程上构建系统&#xff0c;数学都必不可少。通常离开学校后很难有机会静下心学习数学知识&#xff0c;因此我们最好能通过阅读小组或读书会等形式营造环境&#xff0c;并专注学习那些在实践…

标准梯度—lhMorpGradient

标准梯度 5*5正方形结构元素 标准梯度 7*7正方形结构元素 函数&#xff1a;lhMorpGradient 说明&#xff1a;形态学基本梯度运算&#xff0c;通过结构元素的改变&#xff0c;可以进行厚梯度&#xff0c;方向梯度等形态学计算 参数&#xff1a; src 输入图像 dst 输出图像 eleme…

神州云科DCN存储管理IP_干货!DCN校园网大二层解决方案详解

安徽水利水电职业技术学院始建于195年&#xff0c;是全国100所和安徽省3所国家示范性高职院校之一。学院坐落于安徽省省会合肥&#xff0c;交通便利&#xff0c;环境优美。校内设有九大实训中心&#xff0c;拥有实践性教学所必须的各类实验室、实训室、实习工厂等130个&#xf…

国产数据库占央采九成份额

3月&#xff0c;中央政府采购网发布《中国国家机关2021年数据库软件协议供货采购项目》成交公告&#xff0c;从入选采购名录的企业来看&#xff0c;除甲骨文和微软之外&#xff0c;其余入围的三十家企业均为本土企业。三十家本土企业中&#xff0c;既有阿里这种互联网巨头&…

应对程序员面试,你必须知道的8大数据结构

瑞士计算机科学家Niklaus Wirth在1976年写了一本书&#xff0c;名为《算法数据结构编程》。40多年后&#xff0c;这个等式仍被奉为真理。这就是为什么在面试过程中&#xff0c;需要考察软件工程师对数据结构的理解。几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是…

Windows Phone 知识锦(12月版)

很久没有更新Windows Phone 知识锦了&#xff0c;今天更新一下&#xff1a;将不同分类的文章进行归类&#xff0c;方便大家查看。 相信大家都喜欢jeffblankenburg的windows phone 31日开放谈吧&#xff0c;之前金山将它反映为中文了。如今他有退出了Mango版的31日开发谈&#…

自由、开源及其敌人 —— RMS事件簿

点击上方“开源社”关注我们| 作者&#xff1a;庄表伟| 编辑&#xff1a;沈于蓝| 设计&#xff1a;朱亿钦目前国际开源界和一些开源软件基金会对于道德和平权的争论正方兴未艾&#xff0c;我们觉得值得关注与了解。前置申明这是一篇严肃的八卦文&#xff0c;希望搞清楚一些社区…

Google 机器学习应用的43条经验法则

Google 的研究科学家 Martin Zinkevich 曾在 NIPS 2016 Workshop 分享了谷歌机器学习实践的四十三条法则。Martin Zinkevich 也在自己的博客上分享了这四十三条经验法则。文章《Rules of Machine Learning: Best Practices for ML Engineering》旨在帮助具备机器学习基础知识的…

lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合

本文整理自&#xff1a;ThinkWon 链接&#xff1a;blog.csdn.net/ThinkWon/article/details/104390752本文知识目录1、Java内存区域说一下 JVM 的主要组成部分及其作用&#xff1f;说一下 JVM 运行时数据区深拷贝和浅拷贝说一下堆栈的区别&#xff1f;队列和栈是什么&#xff…