zoukankan      html  css  js  c++  java
  • C# 规则引擎

    根据不同的城市以及购买数量,加载json文件,得到优化折扣,运行结果:

      

    DisCount.json

    [
      {
        "WorkflowName": "Discount",
        "Rules": [
          {
            "RuleName": "rule1",
            "SuccessEvent": "9",
            "ErrorMessage": "One or more adjust rules failed.",
            "ErrorType": "Error",
            "RuleExpressionType": "LambdaExpression",
            "Expression": "input1.city == "厦门" AND input2.totalOrders >=0"
          },
          {
            "RuleName": "rule2",
            "SuccessEvent": "8",
            "ErrorMessage": "One or more adjust rules failed.",
            "ErrorType": "Error",
            "RuleExpressionType": "LambdaExpression",
            "Expression": "input1.city == "泉州" AND input2.totalOrders >=1"
          }
        ]
      }
    ]
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
    using RulesEngine.Extensions;
    using RulesEngine.Models;
    using System;
    using System.Collections.Generic;
    using System.Dynamic;
    using System.IO;
    using System.Windows.Forms;
    
    namespace RulesEngineDemo
    {
        public partial class MainForm : Form
        {
            // NuGet -> RulesEngine
    
            public MainForm()
            {
                InitializeComponent();
    
                cmbCity.SelectedIndex = 0;
            } 
    
            private void btnSubmit_Click(object sender, EventArgs e)
            {
                string city = cmbCity.Text;
                string count = txtCount.Text.Trim();
    
                var basicInfo = "{"city": "" + city +""}";
                var orderInfo = "{"totalOrders": " + count + "}";
    
                var converter = new ExpandoObjectConverter();
    
                dynamic input1 = JsonConvert.DeserializeObject<ExpandoObject>(basicInfo, converter);
                dynamic input2 = JsonConvert.DeserializeObject<ExpandoObject>(orderInfo, converter);
    
                var inputs = new dynamic[]
                {
                  input1,
                  input2
                };
    
                // 加载规则
                var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "Discount.json", SearchOption.AllDirectories);
                if (files == null || files.Length == 0)
                {
                    lblMsg.Text = "Rules not found.";
                    return;
                }
    
                var fileData = File.ReadAllText(files[0]);
                var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(fileData);
    
                // 初始化规则引擎
                var bre = new RulesEngine.RulesEngine(workflowRules.ToArray(), null);
    
                string note = "没有折扣";
    
                // 执行规则
                List<RuleResultTree> resultList = bre.ExecuteAllRulesAsync("Discount", inputs).Result;
    
                // 处理结果
                resultList.OnSuccess((eventName) =>
                {
                    note = $"打 {eventName} 折";
                });
    
                resultList.OnFail(() =>
                {
                    note = "不打折";
                });
    
                lblMsg.Text = note;
            }
        }
    }
    qq:505645074
  • 相关阅读:
    Auto.js 入门教程
    几乎纯css实现弹出框
    php curl访问https 域名接口一直报错的问题
    金山打字通刷打字速度脚本
    centos 安装 图像识别工具 tesseract-ocr 流程
    js 实现俄罗斯方块(三)
    小程序报错 .wxss 无法找到
    Redis存储数组
    问题记录-databinding/hilt踩坑记录
    问题记录-CoordinatorLayout+WebView使用遇到的问题
  • 原文地址:https://www.cnblogs.com/chen1880/p/14950162.html
Copyright © 2011-2022 走看看