火力规则打击规则实现

This commit is contained in:
MHW
2026-03-27 11:35:17 +08:00
parent 18827cfbe7
commit c4cc3cc30b
3 changed files with 111 additions and 9 deletions

View File

@@ -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;
}

View File

@@ -1,6 +1,7 @@
package com.solution.rule.simpstrategy.impl; package com.solution.rule.simpstrategy.impl;
import com.solution.rule.domain.simplerulepojo.Task; 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.FireRUleType;
import com.solution.rule.simpstrategy.FireRuleStrategy; import com.solution.rule.simpstrategy.FireRuleStrategy;
import org.kie.api.KieBase; import org.kie.api.KieBase;
@@ -18,11 +19,14 @@ public class BlowStrategy implements FireRuleStrategy {
@Override @Override
public Task mappingTask(Task task) { public Task mappingTask(Task task) {
KieSession kieSession = kieBase.newKieSession(); KieSession kieSession = kieBase.newKieSession();
FactTask factTask = new FactTask();
Task redTask = new Task(); Task redTask = new Task();
redTask.setTargetId(task.getId()); redTask.setTargetId(task.getId());
redTask.setSide("红方");
kieSession.insert(redTask); factTask.setRedTask(redTask);
kieSession.insert(task); factTask.setBlueTask(task);
kieSession.insert(factTask);
// 👇 核心:根据策略选择规则组 // 👇 核心:根据策略选择规则组
kieSession.getAgenda() kieSession.getAgenda()

View File

@@ -1,14 +1,100 @@
package rules; 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 com.solution.rule.domain.simplerulepojo.Task
import java.util.ArrayList
rule "任务入口" global java.util.Map globalParams;
rule "任务匹配1"
agenda-group "打击任务" agenda-group "打击任务"
when when
$task : Task(dataType == "A") $task : FactTask(blueTask.side == "蓝方", blueTask.drawName contains "F-16--7")
$redTask : FactTask(redTask.side == "红方")
then then
kcontext.getKieRuntime().getAgenda() // 直接修改红方任务对象
.getAgendaGroup("MATCH") Task redTask = $redTask.getRedTask();
.setFocus(); redTask.setDrawName("F-16打击任务");
end 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);
}