Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drools规则逻辑未按预期工作_Drools - Fatal编程技术网

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)语句。我更新了我的答案,看看这个:)完美。多谢。