diff --git a/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/fact/FactTask.java b/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/fact/FactTask.java new file mode 100644 index 0000000..9ee9261 --- /dev/null +++ b/auto-solution-rule/src/main/java/com/solution/rule/domain/simplerulepojo/fact/FactTask.java @@ -0,0 +1,12 @@ +package com.solution.rule.domain.simplerulepojo.fact; + +import com.solution.rule.domain.simplerulepojo.Task; +import lombok.Data; + +@Data +public class FactTask { + + private Task blueTask; + + private Task redTask; +} diff --git a/auto-solution-rule/src/main/java/com/solution/rule/simpstrategy/impl/BlowStrategy.java b/auto-solution-rule/src/main/java/com/solution/rule/simpstrategy/impl/BlowStrategy.java index a921c76..66a9763 100644 --- a/auto-solution-rule/src/main/java/com/solution/rule/simpstrategy/impl/BlowStrategy.java +++ b/auto-solution-rule/src/main/java/com/solution/rule/simpstrategy/impl/BlowStrategy.java @@ -1,6 +1,7 @@ package com.solution.rule.simpstrategy.impl; import com.solution.rule.domain.simplerulepojo.Task; +import com.solution.rule.domain.simplerulepojo.fact.FactTask; import com.solution.rule.simpstrategy.FireRUleType; import com.solution.rule.simpstrategy.FireRuleStrategy; import org.kie.api.KieBase; @@ -18,11 +19,14 @@ public class BlowStrategy implements FireRuleStrategy { @Override public Task mappingTask(Task task) { KieSession kieSession = kieBase.newKieSession(); + FactTask factTask = new FactTask(); Task redTask = new Task(); redTask.setTargetId(task.getId()); + redTask.setSide("红方"); - kieSession.insert(redTask); - kieSession.insert(task); + factTask.setRedTask(redTask); + factTask.setBlueTask(task); + kieSession.insert(factTask); // 👇 核心:根据策略选择规则组 kieSession.getAgenda() diff --git a/auto-solution-rule/src/main/resources/rules/fire-rule.drl b/auto-solution-rule/src/main/resources/rules/fire-rule.drl index a8c02d7..dc92461 100644 --- a/auto-solution-rule/src/main/resources/rules/fire-rule.drl +++ b/auto-solution-rule/src/main/resources/rules/fire-rule.drl @@ -1,14 +1,100 @@ package rules; +import com.solution.rule.domain.simplerulepojo.fact.FactTask; +import com.solution.rule.domain.simplerulepojo.Task; +import com.solution.rule.domain.simplerulepojo.Weapon; +import java.util.List +import java.util.Map import com.solution.rule.domain.simplerulepojo.Task +import java.util.ArrayList -rule "任务入口" +global java.util.Map globalParams; + +rule "任务匹配1" agenda-group "打击任务" when - $task : Task(dataType == "A") - + $task : FactTask(blueTask.side == "蓝方", blueTask.drawName contains "F-16--7") + $redTask : FactTask(redTask.side == "红方") then - kcontext.getKieRuntime().getAgenda() - .getAgendaGroup("MATCH") - .setFocus(); -end \ No newline at end of file + // 直接修改红方任务对象 + Task redTask = $redTask.getRedTask(); + redTask.setDrawName("F-16打击任务"); + redTask.setDataType("plane"); +end +//------------------------------------------------------------------------------- +rule "任务匹配2" +agenda-group "打击任务" +when + $task : FactTask(blueTask.side == "蓝方", blueTask.drawName contains "驱逐舰任务") + $redTask : FactTask(redTask.side == "红方") +then + // 直接修改红方任务对象 + Task redTask = $redTask.getRedTask(); + redTask.setDrawName("导弹发射车打击任务"); + redTask.setDataType("ground"); +end +//------------------------------------------------------------------------------- +rule "威胁等级规则" +agenda-group "打击任务" +when + //如果蓝方威胁等级大于等于3,则全局武器数量为3,添加插入导弹发射车辆和防空导弹武器 + $task : FactTask(blueTask.side == "蓝方",blueTask.threatLevel >= 3) + $redTask : FactTask(redTask.side == "红方") +then + //设置平台下组件的数量 + globalParams.put("platNum",3); + //威胁等级大于等于3固定插入导弹发射车辆 + // ========== 调用函数 ========== + threatLevel($redTask, globalParams); +end +//------------------------------------------------------------------------------- +rule "地面类型匹配规则" +agenda-group "打击任务" +when + //如果蓝方武器为地面类型且高度不超过500米,则使用插入空中力量打击 + $task : FactTask(blueTask.side == "蓝方") + $weapons : List() from $task.blueTask.taskWeapons + $weapon : Weapon(supportType == "ground") from $weapons +then + Task redTask = $task.getRedTask(); + List taskWeapons = redTask.getTaskWeapons(); + Weapon weapon = new Weapon(); + weapon.setName("F-16"); + weapon.setNumber((Integer) globalParams.get("platNum")); + weapon.setSupportType("plane"); + taskWeapons.add(weapon); +end +//------------------------------------------------------------------------------- +// kcontext.getKieRuntime().getAgenda() +// .getAgendaGroup("MATCH") +// .setFocus(); + + + +// ========== 定义函数 ========== +//威胁等级添加武器函数 +function void threatLevel(FactTask redFact, Map params) { + // 创建武器列表 + List weapons = new ArrayList<>(); + + // 创建导弹发射车 + Weapon weapon1 = new Weapon(); + weapon1.setNumber((Integer) params.get("platNum")); + weapon1.setSupportType("ground"); + weapon1.setEquipmentId("1"); + weapon1.setName("missile-launching-vehicle"); + + // 创建防空导弹武器 + Weapon weapon2 = new Weapon(); + weapon2.setNumber((Integer) params.get("platNum")); + weapon2.setSupportType("antiaircraft"); + weapon2.setEquipmentId("2"); + weapon2.setName("Anti-aircraft-missile-weapon"); + + // 添加到列表 + weapons.add(weapon1); + weapons.add(weapon2); + + // 设置到红方任务 + redFact.getRedTask().setTaskWeapons(weapons); +}