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
关键修正说明
- 模式匹配优化:
移除冗余的currentObject和未使用变量,通过$fyList: financialYear正确提取ContractDetails中的财年子表单集合(需确保该属性为List<FinancialYear>类型,且类中提供对应的getter方法或public属性)。 - Accumulate语法规范:
明确将提取的$fyList作为遍历源,accumulate结构更清晰,MVEL方言可正确解析求和逻辑(需确保FinancialYear的spend字段为数值类型,如Integer、Double)。 - 对象更新通知:
添加update($contract)调用,强制Drools工作内存感知对象变更,保证更新后的totalSpendTracking字段能被后续规则或外部系统正确读取。
额外注意事项
- 若
currentObject是ContractDetails中需判断的有效标识(如标记当前对象为待处理),可在模式匹配中补充条件:ContractDetails(currentObject == true, $fyList: financialYear)。 - 确保实体类的属性访问权限符合Drools要求(public属性或提供public getter方法)。
内容的提问来源于stack exchange,提问作者Sql
相关产品推荐
相关产品推荐

