Drools校验诊断编码列表是否包含指定集合元素的问题排查
问题原因
你的规则无法触发主要有三个核心错误:
memberOf运算符用法错误:该运算符是用来判断单个元素是否属于右侧集合,你将完整的List对象放在左侧进行判断,语法不生效。- 右侧匹配对象类型错误:你写的
"F77 EOO F99"是普通字符串,不是Drools可识别的集合类型,无法做包含判断。 - 匹配值不对应:你实际输出的诊断编码列表是
[Z590, E0800],但规则里写的匹配值是F77、EOO、F99,二者没有交集,就算语法正确也不会触发规则。
解决方法
调整Drools规则写法,先遍历诊断编码列表,再判断是否存在任意元素属于你指定的目标编码集合,正确规则示例如下:
rule "Problems related to social environment" when // 拿到业务对象,且编码列表不为空 $eligibilityDomainObject:EligibilityDomainObject($listOfString : listOfString != null) // 遍历列表,只要有一个元素属于目标集合就匹配成功 exists(String(this memberOf {"F77", "E00", "F99", "Z590", "E0800"}) from $listOfString) then $eligibilityDomainObject.setIsComplexPhysicalHealth(true); end
如果你的目标编码集合不需要频繁修改,直接用上述{}语法在规则内定义集合即可。
额外优化建议
- 给
isComplexPhysicalHealth属性设置默认值false,避免规则未触发时返回null:private Boolean isComplexPhysicalHealth = false; - 如果目标编码集合需要动态调整,可以把它作为单独的事实对象插入KieSession,再在规则中引用即可。
内容的提问来源于stack exchange,提问作者cluis92
相关产品推荐
相关产品推荐

