You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Drools查找最低价供应商规则运行结果不符合预期求助

问题根因
  • 规则条件逻辑写反:现有规则使用exists Supplier($best.price < price) from $suppliers,含义是「只要集合中存在报价比当前$best更高的供应商,当前$best就满足匹配条件」,也就是说所有不是最高价的供应商都会被规则匹配到。Drools默认按照事实插入顺序匹配,你示例中的S2、S3都满足「存在比自己报价高的供应商(S1)」,规则最后一次匹配到的是S3,所以触发规则后输出了错误结果。
  • 缺少最低价判定逻辑:找报价最低的供应商,正确的判定逻辑应该是「集合中不存在报价比当前$best更低的供应商」,和现有条件完全相反。
  • 缺少产品维度分组:如果集合中存在多个不同产品的报价,现有规则不会按产品筛选最优供应商,会出现跨产品比价的错误。
  • 规则动作逻辑不合理:规则命中后直接删除了整个供应商集合,插入当前匹配到的$best,后续即使有更符合条件的供应商也不会再匹配,最终保留的是最后一个命中规则的供应商,而非真正的最优供应商。
优化方案

方案1:修正原有判定逻辑

直接调整条件,把exists改成not,加上产品匹配即可:

global org.slf4j.Logger log;

rule "Find_Best_Supplier"
    // 不需要多产品支持可去掉no-loop属性和产品分组逻辑
    no-loop true
    when
        $suppliers: Collection(size > 0)
        // 提取集合内所有产品,按产品分组筛选
        $product: String() from accumulate(Supplier($p:product) from $suppliers, collectSet($p))
        $best: Supplier(product == $product) from $suppliers
        // 核心逻辑:当前产品下不存在比$best报价更低的供应商
        not Supplier(product == $product, price < $best.price) from $suppliers
    then
        log.info("{}: Supplier {} is preferred for Product {}",
            drools.getRule().getName(),
            $best.getSupplier(),
            $best.getProduct());
end

方案2:使用accumulate聚合函数直接计算最低价

逻辑更直观,性能也更稳定:

global org.slf4j.Logger log;

rule "Find_Best_Supplier"
    no-loop true
    when
        $suppliers: Collection(size > 0)
        $product: String() from accumulate(Supplier($p:product) from $suppliers, collectSet($p))
        // 聚合计算当前产品的最低报价
        accumulate(Supplier(product == $product, $price:price) from $suppliers,
                   $minPrice: min($price))
        $best: Supplier(product == $product, price == $minPrice) from $suppliers
    then
        log.info("{}: Supplier {} is preferred for Product {}",
            drools.getRule().getName(),
            $best.getSupplier(),
            $best.getProduct());
end
额外优化建议
  • 报价字段建议从double改为BigDecimal类型,避免浮点运算精度误差导致比价错误。
  • 如果规则触发后需要保留最优供应商事实,建议不要删除原集合,而是单独插入标记了最优状态的对象,避免影响其他规则的匹配。

内容的提问来源于stack exchange,提问作者S.Bhaskar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 14:30:01