火力规则打击规则实现
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
// 直接修改红方任务对象
|
||||
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<Weapon> 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<Weapon> 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user