Drools规则逻辑未按预期工作
层次结构:Drools规则逻辑未按预期工作,drools,Drools,层次结构: 如果任何员工的工资为10万英镑,则Organization.maxSalary=10万英镑。 如果任何员工的工资为50k,如果没有其他人收到100k,则Organization.maxSalary=50k DRL rule "Salary 100000" when $org: Organization() $empDetail: EmployeeDetail() from $org.employeeDetail $employe
如果任何员工的工资为10万英镑,则Organization.maxSalary=10万英镑。
如果任何员工的工资为50k,如果没有其他人收到100k,则Organization.maxSalary=50k DRL
rule "Salary 100000"
when
$org: Organization()
$empDetail: EmployeeDetail() from $org.employeeDetail
$employee: Employee( $org.maxSalary != 100000,
salary == 100000
) from $empDetail.employees
then
System.out.println("Salary 100000: " + $org.maxSalary);
$org.maxSalary = 100000;
end
rule "Salary 50000"
when
$org: Organization()
$empDetail: EmployeeDetail() from $org.employeeDetail
$employee: Employee( $org.maxSalary != 100000
&& $org.maxSalary != 50000,
salary == 50000
) from $empDetail.milestoneDetails
then
System.out.println("Salary 50000: " + $org.maxSalary);
$org.maxSalary = 50000;
end
输入JSON 1:
{
"Organization": {
"EmployeeDetail": {
"Employees" : [
{
"name": "willie"
"salary": "50000",
},
{
"name": "john"
"salary": "100000",
},
{
"name": "jack"
"salary": "50000",
},
{
"name": "jim"
"salary": "50000",
}
]
}
}
}
{
"Organization": {
"EmployeeDetail": {
"Employees" : [
{
"name": "willie"
"salary": "50000",
},
{
"name": "jack"
"salary": "50000",
},
{
"name": "jim"
"salary": "50000",
}
]
}
}
}
预期控制台输出:100000:null
实际控制台输出:100000:null
一切都好
输入JSON 2:
{
"Organization": {
"EmployeeDetail": {
"Employees" : [
{
"name": "willie"
"salary": "50000",
},
{
"name": "john"
"salary": "100000",
},
{
"name": "jack"
"salary": "50000",
},
{
"name": "jim"
"salary": "50000",
}
]
}
}
}
{
"Organization": {
"EmployeeDetail": {
"Employees" : [
{
"name": "willie"
"salary": "50000",
},
{
"name": "jack"
"salary": "50000",
},
{
"name": "jim"
"salary": "50000",
}
]
}
}
}
预期控制台输出:50000:null
实际控制台输出:
在这两种情况下,如果
Organization.maxSalary
设置正确,JSON结果都很好。但是为什么控制台输出奇怪呢?您想通过检查org.maxSalary来触发规则。但是,您不应该从Employee对象内部检查$org.maxSalary,因为这不是Eployee的属性,而是Orgranization的属性
此外,在组织上设置maxSalary后,您应该使用新值(maxSalary)更新组织事实<代码>更新()使规则引擎知道事实已被修改
这是完整的规则代码
rule "Salary 100000"
when
$org: Organization(maxSalary != 100000)
$empDetail: EmployeeDetail() from $org.employeeDetail
$employee: Employee( salary == 100000
) from $empDetail.employees
then
System.out.println("Salary 100000: " + $org.maxSalary);
$org.maxSalary = 100000;
update($org);
end
rule "Salary 50000"
when
$org: Organization(maxSalary != 100000 && maxSalary != 50000)
$empDetail: EmployeeDetail() from $org.employeeDetail
$employee: Employee(
salary == 50000
) from $empDetail.employees
then
System.out.println("Salary 50000: " + $org.maxSalary);
$org.maxSalary = 50000;
update($org);
end
Json2上的输出是
Salary 50000: null
我也不明白有这样的逻辑
System.out.println("Salary 50000: " + $org.maxSalary);
$org.maxSalary = 50000;
而不是
$org.maxSalary = 50000;
System.out.println("Salary 50000: " + $org.maxSalary);
首先打印一个空的maxSalary,然后将金额分配给maxSalary,这似乎很奇怪。下面是您提供的代码的输出,更奇怪的是:Salary 100000:null;工资50000:100000;工资50000:50000;工资50000:50000;$org.maxSalary被错误地设置为50000。System.out和我在这里发布的代码不是我的实际用例。这只是一个例子来说明我遇到的奇怪情况,我想知道我是否做错了什么。$empDetail.milestoneDetails和$empDetail.employees之间有什么区别?工资和最高工资是什么类型的?它们是弦吗?我将尝试运行您的代码
Salary 50000:null
maxSalary不是原语,它是一个包含数字或字符串的对象吗?我错过了update($org)语句。我更新了我的答案,看看这个:)完美。多谢。