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

Drools(MVEL方言):按年度计算支出总和并更新合同详情字段求助

Drools(MVEL) 子表单支出求和规则修复方案

原规则的核心问题

  • ContractDetails模式匹配语法错误:ContractDetails(currentObject, $totalSpend: totalSpendTracking) 不符合Drools模式匹配规范,currentObject未明确条件逻辑,且$totalSpend变量未使用属于冗余。
  • Accumulate语法结构不清晰:原写法中集合遍历的关联逻辑易被MVEL方言解析错误。
  • 未触发工作内存对象更新:修改属性后未通知Drools,导致更新无法被规则引擎感知。

修正后的规则代码

package com.bmssolutions.analytics;
dialect "mvel"
import java.util.List;
import com.bmssolutions.analytics.ContractDetails;
import com.bmssolutions.analytics.FinancialYear;

rule "Sum of spend tracking"
when
    // 提取ContractDetails实例及其关联的财年子表单集合
    $contract: ContractDetails($fyList: financialYear)
    // 对财年集合中的支出字段求和
    $totalSum: Number() from accumulate(
        FinancialYear($spend: spend) from $fyList,
        sum($spend)
    )
then
    // 更新总支出跟踪字段
    $contract.setTotalSpendTracking($totalSum);
    // 通知Drools对象已修改,触发相关规则重评估
    update($contract);
end

关键修正说明

  1. 模式匹配优化:
    移除冗余的currentObject和未使用变量,通过$fyList: financialYear正确提取ContractDetails中的财年子表单集合(需确保该属性为List<FinancialYear>类型,且类中提供对应的getter方法或public属性)。
  2. Accumulate语法规范:
    明确将提取的$fyList作为遍历源,accumulate结构更清晰,MVEL方言可正确解析求和逻辑(需确保FinancialYear的spend字段为数值类型,如Integer、Double)。
  3. 对象更新通知:
    添加update($contract)调用,强制Drools工作内存感知对象变更,保证更新后的totalSpendTracking字段能被后续规则或外部系统正确读取。

额外注意事项

  • 若currentObject是ContractDetails中需判断的有效标识(如标记当前对象为待处理),可在模式匹配中补充条件:ContractDetails(currentObject == true, $fyList: financialYear)。
  • 确保实体类的属性访问权限符合Drools要求(public属性或提供public getter方法)。

内容的提问来源于stack exchange,提问作者Sql

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:20:12