火力规则打击规则实现
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;
|
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()
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user