From e82455a220ba4d4464229d1ee080fffd590543ee Mon Sep 17 00:00:00 2001 From: MHW Date: Tue, 14 Apr 2026 15:10:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=9C=BA=E6=99=AF=E5=85=B3?= =?UTF-8?q?=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/scene/SceneController.java | 11 + .../resources/mapper/rule/FireRuleMapper.xml | 2 +- .../resources/sql/rule/001_rule_schema.sql | 67 ++++++ .../sql/rule/002_rule_seed_from_drl.sql | 213 ++++++++++++++++++ .../scene}/domain/PlatformCommunication.java | 2 +- .../solution/scene/mapper/SceneMapper.java | 8 + .../solution/scene/service/SceneService.java | 8 + .../scene/service/impl/SceneServiceImpl.java | 15 ++ .../resources/mapper/scene/SceneMapper.xml | 6 + 9 files changed, 330 insertions(+), 2 deletions(-) create mode 100644 auto-solution-rule/src/main/resources/sql/rule/001_rule_schema.sql create mode 100644 auto-solution-rule/src/main/resources/sql/rule/002_rule_seed_from_drl.sql rename {auto-solution-behaviour/src/main/java/com/solution/system => auto-solution-scene/src/main/java/com/solution/scene}/domain/PlatformCommunication.java (93%) diff --git a/auto-solution-admin/src/main/java/com/solution/web/controller/scene/SceneController.java b/auto-solution-admin/src/main/java/com/solution/web/controller/scene/SceneController.java index 311cbed..7116aa6 100644 --- a/auto-solution-admin/src/main/java/com/solution/web/controller/scene/SceneController.java +++ b/auto-solution-admin/src/main/java/com/solution/web/controller/scene/SceneController.java @@ -64,4 +64,15 @@ public class SceneController extends BaseController { public AjaxResult getAllTree(@PathVariable Integer id){ return success(sceneService.getAllTree(id)); } + + /** + * 根据场景id获取场景下所有关系 + * @param id + * @return + */ + @GetMapping("/getAllRelation/{id}") + @ApiOperation("根据场景id获取场景下所有关系") + public AjaxResult getAllRelation(@PathVariable Integer id){ + return success(sceneService.getAllRelation(id)); + } } diff --git a/auto-solution-rule/src/main/resources/mapper/rule/FireRuleMapper.xml b/auto-solution-rule/src/main/resources/mapper/rule/FireRuleMapper.xml index 8b45634..865658d 100644 --- a/auto-solution-rule/src/main/resources/mapper/rule/FireRuleMapper.xml +++ b/auto-solution-rule/src/main/resources/mapper/rule/FireRuleMapper.xml @@ -112,7 +112,7 @@ FROM platform p LEFT JOIN platform_component pc ON p.id = pc.platform_id WHERE pc.type = 'comm' - AND p.scenario_id = #{scenarioId} + AND p.scenario_id = #{scenarioId} ORDER BY p.name,pc.name diff --git a/auto-solution-rule/src/main/resources/sql/rule/001_rule_schema.sql b/auto-solution-rule/src/main/resources/sql/rule/001_rule_schema.sql new file mode 100644 index 0000000..365f598 --- /dev/null +++ b/auto-solution-rule/src/main/resources/sql/rule/001_rule_schema.sql @@ -0,0 +1,67 @@ +-- 规则主数据表结构(MySQL 8+) +-- 说明:用于前端按“层级->种类->规则项”进行展示与增删改查。 + +CREATE TABLE IF NOT EXISTS `rule_dict` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `dict_type` VARCHAR(32) NOT NULL COMMENT '字典类型(level/kind/task_type/status)', + `dict_code` VARCHAR(64) NOT NULL COMMENT '字典编码', + `dict_name` VARCHAR(64) NOT NULL COMMENT '字典名称', + `sort_no` INT NOT NULL DEFAULT 0 COMMENT '排序号', + `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用(1是0否)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_rule_dict_type_code` (`dict_type`, `dict_code`), + KEY `idx_rule_dict_type_enabled` (`dict_type`, `enabled`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则字典表'; + +CREATE TABLE IF NOT EXISTS `rule_item` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码', + `rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称', + `level_code` VARCHAR(32) NOT NULL COMMENT '规则层级(task/action/platform)', + `kind_code` VARCHAR(32) NOT NULL COMMENT '规则种类(select/assign/deploy/config/mode/spacetime/relation/limit)', + `module_code` VARCHAR(32) NOT NULL COMMENT '规则模块(equipment/target/position/track/group)', + `priority_no` INT NOT NULL DEFAULT 100 COMMENT '优先级(数字越小越先执行)', + `condition_expr` VARCHAR(1024) DEFAULT NULL COMMENT '条件表达式(展示用)', + `action_expr` VARCHAR(1024) DEFAULT NULL COMMENT '动作表达式(展示用)', + `version_no` INT NOT NULL DEFAULT 1 COMMENT '版本号', + `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用(1是0否)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_rule_item_code` (`rule_code`), + KEY `idx_rule_item_level_kind` (`level_code`, `kind_code`), + KEY `idx_rule_item_module_enabled` (`module_code`, `enabled`), + KEY `idx_rule_item_priority` (`priority_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则主表'; + +CREATE TABLE IF NOT EXISTS `rule_item_task_type` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码', + `task_type_code` VARCHAR(32) NOT NULL COMMENT '任务类型编码', + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_rule_task_type` (`rule_code`, `task_type_code`), + KEY `idx_rule_task_type` (`task_type_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则适用任务类型关联表'; + +CREATE TABLE IF NOT EXISTS `rule_item_param` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `rule_code` VARCHAR(64) NOT NULL COMMENT '规则编码', + `param_key` VARCHAR(128) NOT NULL COMMENT '参数键', + `param_val` TEXT NOT NULL COMMENT '参数值(统一文本存储)', + `val_type` VARCHAR(16) NOT NULL DEFAULT 'string' COMMENT '值类型(string/number/bool/json)', + `param_name` VARCHAR(128) DEFAULT NULL COMMENT '参数名称', + `sort_no` INT NOT NULL DEFAULT 0 COMMENT '排序号', + `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用(1是0否)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_rule_param` (`rule_code`, `param_key`), + KEY `idx_rule_param_key` (`param_key`), + KEY `idx_rule_param_enabled` (`enabled`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则参数表'; diff --git a/auto-solution-rule/src/main/resources/sql/rule/002_rule_seed_from_drl.sql b/auto-solution-rule/src/main/resources/sql/rule/002_rule_seed_from_drl.sql new file mode 100644 index 0000000..aa15d46 --- /dev/null +++ b/auto-solution-rule/src/main/resources/sql/rule/002_rule_seed_from_drl.sql @@ -0,0 +1,213 @@ +-- 从 rules/rule.drl 提取的初始化数据 +-- 说明:本文件提供字典、规则主数据、规则参数与任务类型关联的初始记录。 + +-- 1) 字典数据 +INSERT INTO `rule_dict` (`dict_type`, `dict_code`, `dict_name`, `sort_no`, `enabled`, `remark`) VALUES +('level', 'task', '任务级', 10, 1, '任务层面的选择/分配/限制'), +('level', 'action', '行动级', 20, 1, '行动层面的航迹/编组/模式'), +('level', 'platform', '平台级', 30, 1, '平台层面的部署/时空约束'), +('kind', 'select', '选择', 10, 1, '对象选择与评分'), +('kind', 'assign', '分配', 20, 1, '目标分配'), +('kind', 'deploy', '部署', 30, 1, '阵位与部署'), +('kind', 'config', '配置', 40, 1, '通用配置参数'), +('kind', 'mode', '工作模式', 50, 1, '算法与模式选择'), +('kind', 'spacetime', '时空约束', 60, 1, '空间和时间相关约束'), +('kind', 'relation', '关联关系', 70, 1, '蓝红关键词关联'), +('kind', 'limit', '限制条件', 80, 1, '阈值和边界'), +('task_type', 'strike', '打击任务', 10, 1, '典型任务类型'), +('task_type', 'recon', '侦察任务', 20, 1, '典型任务类型'), +('task_type', 'intercept', '拦截任务', 30, 1, '典型任务类型'), +('task_type', 'support', '支援任务', 40, 1, '典型任务类型'), +('task_type', 'jamming', '干扰任务', 50, 1, '典型任务类型'), +('status', 'enabled', '启用', 10, 1, '通用状态'), +('status', 'disabled', '停用', 20, 1, '通用状态') +ON DUPLICATE KEY UPDATE +`dict_name` = VALUES(`dict_name`), +`sort_no` = VALUES(`sort_no`), +`enabled` = VALUES(`enabled`), +`remark` = VALUES(`remark`); + +-- 2) 规则主数据(层级->种类->规则项) +INSERT INTO `rule_item` +(`rule_code`, `rule_name`, `level_code`, `kind_code`, `module_code`, `priority_no`, `condition_expr`, `action_expr`, `version_no`, `enabled`, `remark`) +VALUES +('R_TASK_SELECT_BASE', '任务级-装备选择基础规则', 'task', 'select', 'equipment', 100, 'task!=null', 'equipmentRule(fact, params)', 1, 1, '来自装备匹配主流程'), +('R_TASK_SELECT_SLOT_1', '任务级-规则槽1', 'task', 'relation', 'equipment', 101, 'containsAny(blue,slot1Blue)&&containsAny(red,slot1Red)', 'score += ruleScore_1*weight', 1, 1, '蓝红关键词槽位匹配'), +('R_TASK_SELECT_SLOT_2', '任务级-规则槽2', 'task', 'relation', 'equipment', 102, 'containsAny(blue,slot2Blue)&&containsAny(red,slot2Red)', 'score += ruleScore_2*weight', 1, 1, '蓝红关键词槽位匹配'), +('R_TASK_SELECT_SLOT_3', '任务级-规则槽3', 'task', 'relation', 'equipment', 103, 'containsAny(blue,slot3Blue)&&containsAny(red,slot3Red)', 'score += ruleScore_3*weight', 1, 1, '蓝红关键词槽位匹配'), +('R_TASK_REL_AIR_PLATFORM', '任务级-关联关系-空中平台', 'task', 'relation', 'equipment', 104, 'bluePlatformKeywords_air && redPreferredWhenBlueAir', 'score += airScore*weight', 1, 1, '兼容层空中平台关联'), +('R_TASK_REL_AIR_TASK', '任务级-关联关系-空中任务', 'task', 'relation', 'equipment', 105, 'airTaskKeywords && redPreferredWhenBlueAir', 'score += airTaskScore*weight', 1, 1, '兼容层空中任务关联'), +('R_TASK_REL_GROUND_TASK', '任务级-关联关系-地面任务', 'task', 'relation', 'equipment', 106, 'groundTaskKeywords && redPreferredWhenGround', 'score += groundScore*weight', 1, 1, '兼容层地面任务关联'), +('R_TASK_REL_TANK', '任务级-关联关系-坦克装甲', 'task', 'relation', 'equipment', 107, 'tankKeywords && redMatchKeywords_tank', 'score += tankScore*weight', 1, 1, '兼容层坦克关联'), +('R_TASK_REL_MISSILE', '任务级-关联关系-导弹火箭', 'task', 'relation', 'equipment', 108, 'missileKeywords && redMatchKeywords_missile', 'score += missileScore*weight', 1, 1, '兼容层导弹关联'), +('R_TASK_ASSIGN_TARGET', '任务级-目标分配规则', 'task', 'assign', 'target', 90, 'task!=null', 'target(fact, params)', 1, 1, '目标分配与execute填充'), +('R_TASK_LIMIT_SUPPLEMENT', '任务级-低命中率补拿限制', 'task', 'limit', 'target', 89, 'hitRate selectAllTreeBySceneId(Integer id); + + /** + * 根据场景id获取场景下所有关系 + * @param id + * @return + */ + List selectAllRelationBySceneId(Integer id); } diff --git a/auto-solution-scene/src/main/java/com/solution/scene/service/SceneService.java b/auto-solution-scene/src/main/java/com/solution/scene/service/SceneService.java index 6f875d9..56644a8 100644 --- a/auto-solution-scene/src/main/java/com/solution/scene/service/SceneService.java +++ b/auto-solution-scene/src/main/java/com/solution/scene/service/SceneService.java @@ -2,6 +2,7 @@ package com.solution.scene.service; import com.solution.scene.domain.AfsimScenario; import com.solution.scene.domain.AfsimScenarioForm; +import com.solution.scene.domain.PlatformCommunication; import com.solution.system.domain.Behaviortree; import java.util.List; @@ -33,4 +34,11 @@ public interface SceneService { * @return */ List getAllTree(Integer id); + + /** + * 根据场景id获取场景下所有关系 + * @param id + * @return + */ + List getAllRelation(Integer id); } diff --git a/auto-solution-scene/src/main/java/com/solution/scene/service/impl/SceneServiceImpl.java b/auto-solution-scene/src/main/java/com/solution/scene/service/impl/SceneServiceImpl.java index d50ed19..91c8125 100644 --- a/auto-solution-scene/src/main/java/com/solution/scene/service/impl/SceneServiceImpl.java +++ b/auto-solution-scene/src/main/java/com/solution/scene/service/impl/SceneServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import com.solution.common.constant.ExceptionConstants; import com.solution.scene.domain.AfsimScenario; import com.solution.scene.domain.AfsimScenarioForm; +import com.solution.scene.domain.PlatformCommunication; import com.solution.scene.mapper.PlatFormCommunicationMapper; import com.solution.scene.mapper.SceneMapper; import com.solution.scene.service.SceneService; @@ -90,4 +91,18 @@ public class SceneServiceImpl implements SceneService { return allTree; } + /** + * 根据场景id获取场景下所有关系 + * @param id + * @return + */ + @Override + public List getAllRelation(Integer id) { + List result = sceneMapper.selectAllRelationBySceneId(id); + if(CollUtil.isEmpty( result)){ + throw new RuntimeException("该场景下不存在关系"); + } + return result; + } + } diff --git a/auto-solution-scene/src/main/resources/mapper/scene/SceneMapper.xml b/auto-solution-scene/src/main/resources/mapper/scene/SceneMapper.xml index 7c9481b..f782c1b 100644 --- a/auto-solution-scene/src/main/resources/mapper/scene/SceneMapper.xml +++ b/auto-solution-scene/src/main/resources/mapper/scene/SceneMapper.xml @@ -31,6 +31,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" FROM behaviortree WHERE scenario_id=#{id} + update afsim_scenario