From 586cd0c73257f1fab7439e0c9835260bb9de1f34 Mon Sep 17 00:00:00 2001 From: RiverLong Date: Mon, 20 Jan 2025 22:14:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E3=80=8A=E8=A7=84=E5=88=99?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=9A=84=E4=B8=B4=E6=97=B6=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.md" | 1 + ...1\347\256\227\347\273\223\346\236\234.png" | Bin 0 -> 22161 bytes ...4\345\210\231\351\241\265\351\235\242.png" | Bin 0 -> 48191 bytes .../index.md" | 3 +- ...64\346\227\266\346\226\271\346\241\210.md" | 251 ++++++++++++++++++ mkdocs.yml | 1 + 6 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 "docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/img/\351\242\204\350\255\246\350\247\204\345\210\231\350\256\241\347\256\227\347\273\223\346\236\234.png" create mode 100644 "docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/img/\351\242\204\350\255\246\350\247\204\345\210\231\351\241\265\351\235\242.png" create mode 100644 "docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/\350\247\204\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\344\270\264\346\227\266\346\226\271\346\241\210.md" diff --git "a/docs/\345\274\200\345\247\213\351\230\205\350\257\273/index.md" "b/docs/\345\274\200\345\247\213\351\230\205\350\257\273/index.md" index e8b63db..e09f248 100644 --- "a/docs/\345\274\200\345\247\213\351\230\205\350\257\273/index.md" +++ "b/docs/\345\274\200\345\247\213\351\230\205\350\257\273/index.md" @@ -22,6 +22,7 @@ hide: - [x] 线程池批量插入大量数据 - [x] Spring事务传播机制 - [x] Java中的空值处理和工具类 + - [x] 规则表达式的临时方案 - 二、面试题 - [x] 一些排序算法 - [x] 遇到的面试题整理(1-25) diff --git "a/docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/img/\351\242\204\350\255\246\350\247\204\345\210\231\350\256\241\347\256\227\347\273\223\346\236\234.png" "b/docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/img/\351\242\204\350\255\246\350\247\204\345\210\231\350\256\241\347\256\227\347\273\223\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..6895ef47cee4e9776c5a56e7fb7bd798ee381910 GIT binary patch literal 22161 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 iMgQsN|GSe}线程池批量插入大量数据 - Spring事务传播机制 -- Java中的空值处理和工具类 \ No newline at end of file +- Java中的空值处理和工具类 +- 规则表达式的临时方案 \ No newline at end of file diff --git "a/docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/\350\247\204\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\344\270\264\346\227\266\346\226\271\346\241\210.md" "b/docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/\350\247\204\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\344\270\264\346\227\266\346\226\271\346\241\210.md" new file mode 100644 index 0000000..0ec0c2e --- /dev/null +++ "b/docs/\345\274\200\345\247\213\351\230\205\350\257\273/\346\212\200\346\234\257\347\240\224\347\251\266/\350\247\204\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\344\270\264\346\227\266\346\226\271\346\241\210.md" @@ -0,0 +1,251 @@ +--- +title: 规则表达式的临时方案 +description: 规则表达式的临时方案 +--- + +# 规则表达式的临时方案 + +## 场景介绍 + +由于公司的客户对于市面上买卖丧葬用品的价格不透明,AB价格交易的情况有杜绝倾向,所以和公司商讨一套系统,用于管理这些用品及其交易情况, +有需要对订单进行管理,同时订单涉及到订单的物品,订单物品的类型等,用户在下单的时候,需要对下单的物品进行提醒, +告知物品的价格过高,明显不合理。那么就有一个面板需要对物品的类型进行管控,这一类的物品价格必须满足后台设置的给定值, +否则就给予预警。 + +那么后台对于预警规则的设置就需要一套规则,正常的思路就是集成规则引擎的框架,用于管理各类规则,但是项目给的时间少,要求尽快开发出来, +对于开发人员而言,还需要去调研规则引擎的选类,学习框架的使用,时间上面不允许,而且集成框架可能会对原有的老系统的资源, +有一定的影响。我们研发只能是自己规定设计一套勉强能用的方案。 + + + +## 前后端约定 + +首先需要和前后端约定,对于这个临时的规则的传参需要怎么设计: + +1. 首先前端需要按照要求传字符串,要求如代码注释 +2. 后端根据算法解析规则,判断价格是否超出预警阈值 +3. 数据库使用一个字段存储规则,使用`JSON`类型 + +=== "规则传递公共参数" + + ```java + @Data + @AllArgsConstructor + public class RuleScript { + /** + * 运算的类型 < <= > >= == 如<= + */ + private String symbol; + + /** + * 具体的数值 如20000.00 + */ + private BigDecimal value; + + /** + * 与后一个条件的关联关系 如或 + */ + private RuleConditionEnum condition; + + /**这个值前端不给值,后端零时使用*/ + private Boolean temp; + } + ``` + +=== "条件之间的连接" + + ```java + @Getter + @AllArgsConstructor + public enum RuleConditionEnum { + OR(1, "或"), + AND(2, "且"); + private final Integer value; + private final String label; + } + ``` + +## 算法设计 + +我们后端就需要对前端传递的数据,一个`List`进行解析、使用。 + +### 1️⃣对数据分组计算 + +- 首先遍历所有规则,计算物品价格是否满足当前的预警值(`true` 或 `false`),并将它存储在临时变量中(无需从前端传递) +- 将连续的 `AND` 条件视为一组,并通过 `OR` 条件分隔这些组。然后,对每一组执行逻辑 `AND` 操作以确定该组的最终布尔值。 + + +我们先操作第一条和第二条 + +```java +private List> groupScripts(List ruleScripts) { + List> groups = new ArrayList<>(); + int i = 0; + int size = ruleScripts.size(); + + while (i < size) { + if (ruleScripts.get(i).getCondition() == RuleConditionEnum.AND) { + List group = new ArrayList<>(); + // 把所有连续的AND加入组 + while (i < size && ruleScripts.get(i).getCondition() == RuleConditionEnum.AND) { + group.add(ruleScripts.get(i)); + i++; + } + // 如果还有元素,把下一个元素(可能是OR)加入组 + if (i < size) { + group.add(ruleScripts.get(i)); + i++; + } + groups.add(group); + } else if (Objects.isNull(ruleScripts.get(i).getCondition()) + || ruleScripts.get(i).getCondition() == RuleConditionEnum.OR) { + List group = new ArrayList<>(); + group.add(ruleScripts.get(i)); + groups.add(group); + // 如果有下一个元素,下一个元素单独成组 + if (i < size - 1) { + List nextGroup = new ArrayList<>(); + nextGroup.add(ruleScripts.get(i + 1)); + groups.add(nextGroup); + i += 2; + } else { + i++; + } + } else { + i++; + } + } + return groups; +} +``` + +### 2️⃣计算最终结果 + +- 最后,对所有组应用逻辑 `OR` 操作,以决定整个条件列表的最终布尔结果,从而判断是否需要触发预警。 + +```java +private boolean calculateFinalResult(List> groups) { + // 对每个组进行逻辑与操作,并收集结果 + List bools = groups.stream() + .map(group -> group.stream() + .allMatch(script -> script.getTemp() != null && script.getTemp())) + .collect(Collectors.toList()); + + // 对所有组的结果进行逻辑或操作 + return bools.stream().anyMatch(result -> result); +} +``` + +### 3️⃣每一条规则的计算和对前端规则的校验 + +- 那么每一条规则的计算如何避免复杂性,可以使用`枚举`的方式 +- 为了保证前端传递参数的准确性,我们还需要对规则进行校验 + +=== "规则枚举" + + ```java + @Getter + @AllArgsConstructor + public enum JudgeEnum { + ge(">=", "大于等于") { + @Override + public boolean compare(BigDecimal price, BigDecimal value) { + return price.compareTo(value) >= 0; + } + }, + gt(">", "大于") { + @Override + public boolean compare(BigDecimal price, BigDecimal value) { + return price.compareTo(value) > 0; + } + }, + eq("==", "等于") { + @Override + public boolean compare(BigDecimal price, BigDecimal value) { + return price.compareTo(value) == 0; + } + }, + le("<=", "小于等于") { + @Override + public boolean compare(BigDecimal price, BigDecimal value) { + return price.compareTo(value) <= 0; + } + }, + lt("<", "小于") { + @Override + public boolean compare(BigDecimal price, BigDecimal value) { + return price.compareTo(value) < 0; + } + }; + private final String value; + private final String label; + + /** + * 根据 value 获取对应的枚举值 + */ + public static JudgeEnum getByValue(String value) { + for (JudgeEnum judgeEnum : JudgeEnum.values()) { + if (judgeEnum.getValue().equals(value)) { + return judgeEnum; + } + } + return null; + } + + public abstract boolean compare(BigDecimal price, BigDecimal value); + } + ``` + +=== "校验与判断" + + ```java + private boolean takeRulesEffect(List ruleScripts, BigDecimal price) { + for (RuleScript ruleScript : ruleScripts) { + if (StrUtil.isNotBlank(ruleScript.getSymbol())) { + // 通过枚举值获取对应的比较逻辑 + JudgeEnum judgeEnum = JudgeEnum.getByValue(ruleScript.getSymbol()); + if (Objects.isNull(judgeEnum)) { + throw new RuntimeException("给予的规则不匹配,请重新设置"); + } + // 使用枚举类中的比较逻辑 + boolean hasWarn = judgeEnum.compare(price, ruleScript.getValue()); + ruleScript.setTemp(hasWarn); + } else { + ruleScript.setTemp(false); + } + } + return calculateFinalResult(groupScripts(ruleScripts)); + } + ``` + +### 4️⃣验算 + +写一个测试类,可以看到结果符合第四条和第五条的规则,返回`true`,可以多试几次,自己口算试试看是否是对的。 + +```java +public static void main(String[] args) { + BigDecimal price = new BigDecimal("2000.00"); + + List ruleScripts = Lists.newArrayList(); + ruleScripts.add(new RuleScript(">", new BigDecimal("100.00"), RuleConditionEnum.AND, null)); + ruleScripts.add(new RuleScript("<", new BigDecimal("200.00"), RuleConditionEnum.OR, null)); + ruleScripts.add(new RuleScript(">=", new BigDecimal("2000.00"), RuleConditionEnum.AND, null)); + ruleScripts.add(new RuleScript("<", new BigDecimal("3000.00"), RuleConditionEnum.OR, null)); + ruleScripts.add(new RuleScript(">=", new BigDecimal("5000.00"), RuleConditionEnum.AND, null)); + ruleScripts.add(new RuleScript("<=", new BigDecimal("7000.00"), RuleConditionEnum.AND, null)); + ruleScripts.add(new RuleScript(">", new BigDecimal("8000.00"), RuleConditionEnum.AND, null)); + ruleScripts.add(new RuleScript("<", new BigDecimal("9000.00"), RuleConditionEnum.OR, null)); + ruleScripts.add(new RuleScript(">", new BigDecimal("9000.00"), RuleConditionEnum.AND, null)); + ruleScripts.add(new RuleScript("<=", new BigDecimal("10000.00"), RuleConditionEnum.AND, null)); + + System.out.println(takeRulesEffect(ruleScripts, price)); +} +``` + + + +## 总结 + +没有过多的文字介绍,代码本身就是一种语言,它自己会说话传递信息,我就不多嘴了。这样的一种东西只能是临时使用, +它的优点就是轻,快,但是和规则引擎相比,业务代码要和计算逻辑耦合,无法使业务逻辑与这代码分离,也不便于维护和更新, +对于扩展和更复杂的逻辑处理,更是不可能,注定只是一种临时方案应付一下,但是应付的能力还是要有,故记录一下。 diff --git a/mkdocs.yml b/mkdocs.yml index 8f30a0e..fd8e3c2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -158,6 +158,7 @@ nav: - 线程池批量插入大量数据: 开始阅读/技术研究/线程池批量插入大量数据.md - Spring事务传播机制: 开始阅读/技术研究/Spring事务传播机制.md - Java中的空值处理和工具类: 开始阅读/技术研究/Java中的空值处理和工具类.md + - 规则表达式的临时方案: 开始阅读/技术研究/规则表达式的临时方案.md - 面试题: - 开始阅读/面试题/index.md - 一些排序算法: 开始阅读/面试题/一些排序算法.md