Odoo|手把手教你Odoo集成drools,完成物料规则配置与报价单自动审核!

一、背景介绍


在实际业务中,售前根据客户需求选择相应的产品和对应的物料来生成报价单。然而,在填写报价单的过程中,可能会出现物料漏选或数量不准确的情况,这会对后续备货和生产效率造成重大影响。此外,由于产品和物料种类繁多,数量众多,以及物料之间的关联规则复杂,传统的业务代码实现逻辑规则已经不再适用。

为了解决这一问题,我们采用了开源的Drools规则引擎结合低代码平台Odoo进行审单系统的开发。通过这种方式,成功实现了规则与程序的解耦,使业务人员能够自行配置所需的规则,从而实现真正的规则审核自动化。

这样一来,我们能够提高效率,减少人为错误,并确保整个流程的顺利进行。

二、引擎介绍

(一)规则引擎介绍

规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。

需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。

规则引擎其实就是一个输入输出平台。

系统中引入规则引擎后,业务规则不再以程序代码的形式驻留在系统中,取而代之的是处理规则的规则引擎,业务规则存储在规则库中,完全独立于程序。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。

业务规则被加载到规则引擎中供应用系统调用。

●使用规则引擎的优势如下

  1. 业务规则与系统代码分离,实现业务规则的集中管理
  2. 在不重启服务的情况下可随时对业务规则进行扩展和维护
  3. 可以动态修改业务规则,从而快速响应需求变更
  4. 规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则
  5. 减少了硬编码业务规则的成本和风险
  6. 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单

●规则引擎常用应用场景

对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下:

  1. 风险控制系统----风险贷款、风险评估
  2. 反欺诈项目----银行贷款、征信验证
  3. 决策平台系统----财务计算
  4. 促销平台系统----满减、打折、加价购

(二)drools规则引擎

drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

  • drools官网地址:https://drools.org/

  • drools源码下载地址:https://github.com/kiegroup/drools

Drools基本构成,主要由以下三部分组成:

  • Working Memory(工作内存)
  • Rule Base(规则库)
  • Inference Engine(推理引擎)


其中Inference Engine(推理引擎)又包括:Pattern Matcher(匹配器) 具体匹配哪一个规则,由这个完成,Agenda(议程),Execution Engine(执行引擎)

  • Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可
  • Fact:事实,是指在drools 规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象,例如本案例中的Order对象就属于Fact对象。Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。
  • Rule Base:规则库,我们在规则文件中定义的规则都会被加载到规则库中。
  • Pattern Matcher:匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。
  • Agenda:议程,用于存放通过匹配器进行模式匹配后被激活的规则。
  • Execution Engine:执行引擎,执行Agenda中被激活的规则。

● Drools基础语法:

规则文件的构成:

在使用Drools时最重要的工作就是编写规则文件,规则文件的后缀为.drl。drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。

Drools语法结构:由规则名称(唯一),规则对象属性,条件语句与执行语句结合成为一个完整的规则:

  • rule:关键字,表示规则开始,参数为规则的唯一名称。
  • attributes:规则属性,是rule与when之间的参数,为可选项。
  • when:关键字,后面跟规则的条件部分。
  • LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。(左手边)
  • then:关键字,后面跟规则的结果部分。
  • RHS(Right Hand Side):是规则的后果或行动部分的通用名称。(右手边)
  • end:关键字,表示一个规则结束。

● Pattern模式匹配:

Drools中的匹配器可以将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,我们需要在规则体的LHS部分定义规则并进行模式匹配。LHS部分由一个或者多个条件组成,条件又称为pattern。

pattern的语法结构为:绑定变量名:Object(Field约束),绑定变量既可以用在对象上,也可以用在对象的属性上,其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false的0个或多个表达式。

LHS部分可以定义多个pattern,多个pattern之间可以使用and或者or进行连接,也可以不写,默认连接为and。

Drools语法的比较操作符:

三、审单系统结合drools规则引擎

(一)业务流程

(二)为什么选用drools引擎

  1. drools完全开源免费,并且社区最大,适合采用
  2. drools规则语法简单,开发人员可快速上手
  3. 由于sdk代码在本地可调试,可实现不同的自定义规则解析
  4. 运行效率快,一条规则只需要0.005毫秒级左右
  5. 对比其余的规则引擎,无法达到既高效又解耦的效果,与审单系统业务场景相悖

(三)审单系统结合drools引擎实现自定义规则模式

审单系统首页展示:包括多型号规则匹配,规则运行数量与拦截数量。

1、业务部门导入规则(excel,xml)

由于drools没有excel导入规则的做法,也没有把业务部门规则语言转为drl的做法,所以这里自己实现文件解析,拼接规则成drl正确语法等:

用户导入规则时需要按照特定的模板来编写规则,excel中一共有7列数据,第一列为机器型号,第二列为规则名称(唯一),第三列为if条件,对应drools中的when关键字,第四列为then,对应drools中的then关键字,第五列为action,表示带出规则时,需要报价系统带出的物料和数量,第六列为msg,是规则不通过时的提示信息,第七列为规则状态,可选生效或者不生效:

excel编写示例规则:

2、规则加载到drools

规则在导入时会存入到数据库中,加载到drools引擎之前,需要将这样写的规则替换成drl语法的规则,可以看到经过处理之后的文档会变成很多drl文件,其中做到了自动转换为drl语法:

drl文件内容示例如下,已经将一行excel数据自动转换为drools引擎熟悉的语句:

3、报价单提交时执行批量规则

报价单在提交时会将配置传给drools,drools根据加载的规则执行每一条规则。每一条规则每一个配置都会执行,并且是毫秒级别,这就是drools的高效性。

4、返回规则执行结果(通过、未通过)

drools可以将未通过的规则,以及为什么不通过规则的物料返回,同时也会让通过的规则返回:

四、总结

本文章讲述了基于odoo平台开发的审单系统的业务以及drools规则引擎的结合,但是还有许多需要完善的地方,比如现在生成的drl文件是很多的,一条数据对应一个drl文件,后来考虑是否10条数据对应一个drl文件。

作者:李建伟| 后端开发工程师

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装docker的PHP环境NLMP环境在国产deepin操作系统上

1: 先安装docker 安装完后执行,权限设置 sudo usermod -aG docker $USER或者sudo usermod -aG docker kentrl#添加当前用户到Docker用户组中 sudo newgrp docker#更新用户组数据,必须执行否则无效 sudo systemctl restart docker 先看目录结构: 2:按照目录结构挂载磁盘,…

渐进式交付实践:通过 Argo Rollouts 和 FSM Gateway 实现金丝雀发布

渐进式交付(Progressive delivery)是一种软件发布策略,旨在更安全、更可控地将新版本软件逐步推出给用户。它是持续交付的进一步提升,允许开发团队在发布新版本时拥有更细粒度的控制,例如可以根据用户反馈、性能指标和…

一键恢复备忘录,3个方法快速找回丢失记忆

备忘录是我们日常生活中一个重要的记录工具,用来记录待办事项、重要日期、提醒事项等等。然而,有时我们可能会不小心删除一些重要的备忘录,导致信息的丢失。 这时候,恢复备忘录就变得非常重要。在本文中,我们将介绍三…

IDEA报错然后pycharm闪退

pycharm闪退,在C盘的USER文件夹下有报错文件 打开一看,说内存不足 # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 14596177920 bytes for G1 virtual space # Possib…

工业控制(ICS)---modbus

Modbus Modbus,市场占有率高、出题频率高,算是最常见的题目,因为这个协议也是工控领域最常见的协议之一,主要有三类 Modbus/RTU 从机地址1B功能码1B数据字段xBCRC值2B 最大长度256B,所以数据字段最大长度252B Modbus/ASCII …

嵌入式面试-回答I2C

说明: 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理,主要针对的是嵌入式软件面试中涉及到的问答,努力精准的抓住重点进行描述。若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源&…

项目7-音乐播放器6+评论区

1.准备前端界面 前端小白:怎么为你的网页增加评论功能?(一)_为网页添加评论区怎么弄-CSDN博客 参考的上述文章的前端代码 我们从上述前端图片知道,我们数据库需要准备的字段: id,commentuserName,coomen…

JavaWeb开发02-MYSQL-DDL-DML-DQL-多表设计-多表查询-事务-索引

一、MySQL概述 通过SQL语句可以操作数据库 关系型数据库: 只要是关系型数据库就可以用SQL语句这一统一标准进行操作数据库 1.MYSQL数据模型 客户端通过SQL语句交给了数据库管理系统DBMS,进行相应操作,创建一个一个数据库,体现为一…

python3如何提取汉字

采用正则表达式的方法对字符串进行处理。 str1 "{我%$是,《速$.度\发》中 /国、人"(1)提取汉字 汉字的范围为”\u4e00-\u9fa5“,这个是用Unicode表示的。 import re res1 .join(re.findall([\u4e00-\u9fa…

力扣HOT100 - 141. 环形链表

解题思路&#xff1a; public class Solution {public boolean hasCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return true;}head head.next;}return false;} }

基于Matlab机器人工具箱对Dobot机械臂的研究

文章目录 文章目录 前言 一、Dobot Mangician 分析 二、Matlab 机器人工具箱 1. 建立模型 2. DoBot 正向运动学 3. Dobot 逆运动学 4. Dobot workpace 5. Dobot轨迹规划 三、Dobot studio 1. DoBot teaching 2. DoBot Python 程序 总结 前言 在本实验中&#xf…

第四届大数据工程与教育国际会议(BDEE 2024)即将召开!

第四届大数据工程与教育国际会议&#xff08;BDEE 2024&#xff09;将于2024年8月9-11日在泰国清迈举行。数据驱动教育变革&#xff0c;智慧点亮未来课堂&#xff01;BDEE 2024是专注于大数据工程与教育领域的重要学术会议&#xff0c;全球大数据与教育精英齐聚&#xff0c;在数…

QTableView获取可见的行数

场景 当我们需要实时刷新QTableView时&#xff0c;而此时tableView的数据量较大&#xff0c;如果全部刷新显然不合理&#xff0c;如果可以只对用户看的到的数据进行刷新那就最好了&#xff0c;经过一番摸索找到了几种方式&#xff0c;可供参考 代码 方法1 QVector<int>…

李沐48_全连接卷积神经网络FCN——自学笔记

1.FCN是用深度神经网络来做语义分割的奠基性工作。 2.它用转置卷积层来替换CNN最后的全连接层&#xff0c;从而可以实现每个像素的预测。 %matplotlib inline import torch import torchvision from torch import nn from torch.nn import functional as F from d2l import t…

Ubuntu20.4版本安装ROS教程

一、配置源 安装成功的Ubuntu系统自带的工具下载速度慢&#xff0c;不太好用&#xff0c;所以我们可以使用国内稳定高速且免费的镜像网站。 清华源&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple 中科大&…

机器视觉【1】-机械臂视觉

文章目录 Eye-to-HandEye-in-Hand基于Eye-in-Hand型机械臂单目视觉定位单目相机标定针孔相机模型畸变标定方法机械臂手眼标定手眼标定求解图像预处理图像灰度化与二值化图像滤波图像特征匹配机械臂单目视觉定位目标物体图像深度信息目标物体中心定位参考文献根据机械臂与相机所…

FlinkCDC基础篇章2-数据源 SqlServerCDC写入到ES中

接着 上期FlinkCDC基础篇章1-安装使用 下载 Flink 和所需要的依赖包 # 下载 Flink 1.17.0 并将其解压至目录 flink-1.17.0 下载下面列出的依赖包&#xff0c;并将它们放到目录 flink-1.17.0/lib/ 下&#xff1a; 下载链接只对已发布的版本有效, SNAPSHOT 版本需要本地编译 …

视频批量高效剪辑,轻松翻转视频画面,支持将视频画面进行逆时针90度翻转。

在视频编辑的海洋中&#xff0c;你是否曾遇到过需要批量翻转视频画面的情况&#xff1f;传统的视频编辑工具在面对这样的需求时&#xff0c;往往显得力不从心&#xff0c;效率低下。今天&#xff0c;我要为大家介绍一款全新的视频编辑神器&#xff0c;它将彻底改变你的视频编辑…

小试牛刀!

1.从双倍数组中还原原数组&#xff08;力扣&#xff0c;vector&#xff09; java式c解法。 class Solution { public:vector<int> findOriginalArray(vector<int>& changed) {int n changed.size();if(n % 2 1) return {};map<int, int> mp;for(int c…

【最新可用】Claude国内镜像,可上传图片,可用Claude3全系模型,包括Pro版本的Opus),亲测比GPT好用

Claude对话、上传图片的超详细教程来啦&#xff01; 近期&#xff0c;Claude 3 Opus的发布引发了网络上的广泛关注与热议&#xff0c;有观点认为其性能已经凌驾于GPT-4之上。虽然网络上已经出现了大量基于这两款先进AI技术的实际应用案例&#xff0c;但仍有许多人对在国内如何…