增加了比较完善的火箭炮数据集,并修复了前端页面的一些问题

This commit is contained in:
Tian jianyong 2024-11-12 19:33:23 +08:00
parent dd3664f6c7
commit d86c47484e
16 changed files with 2719 additions and 1129 deletions

View File

@ -1,795 +1,92 @@
# 调试记录
## 特殊参数显示问题
## 数据管理页面问题
### 问题描述
在数据管理页面中,装备详情对话框的特殊参数部分显示为空行或不显示
在数据管理页面中,火箭炮列表点击详情按钮时,请求了错误的设备 ID导致显示了巡飞弹的数据
### 调试步骤
### 问题分析
1. 后端数据查询
```sql
# 测试特殊参数查询
SELECT equipment_id, param_name, param_value, param_unit
FROM custom_params
WHERE param_name IS NOT NULL
AND param_value IS NOT NULL
LIMIT 5
1. 日志记录:
```
INFO:src.routes:Getting details for equipment ID: 4
INFO:src.routes:Equipment type: 巡飞弹
INFO:src.routes:Found equipment details: Hero-30
INFO:src.routes:Custom params: {...}
```
2. 日志记录
2. 问题原因:
- 后端返回的数据中,火箭炮和巡飞弹的 ID 范围重叠
- 火箭炮的 ID 应该从 1001 开始
- 巡飞弹的 ID 从 1 开始
- 前端没有正确处理设备 ID 的映射
```python
logging.info(f"Getting details for equipment ID: {id}")
logging.info(f"Equipment type: {equipment_type}")
logging.info(f"Found equipment details: {result['name']}")
logging.info(f"Custom params: {result.get('custom_params')}")
```
3. 数据流分析:
- 前端发送请求:`GET /api/data/details/4`
- 后端查询数据库:`SELECT * FROM equipment WHERE id = 4`
- 返回了 ID=4 的巡飞弹数据
- 前端显示了错误的装备类型数据
3. 前端调试
### 新增问题:数据显示不完整
1. 问题描述:
- 在数据管理页面,火箭炮和巡飞弹的表格中,除了长度和重量,其他参数列都没有数据显示
- 详情页面能正确显示所有数据
2. 问题原因:
- 后端返回的数据中,特有参数以逗号分隔的字符串形式存储在 `specific_params` 字段中
- 前端需要解析这个字符串,将其转换为对象格式才能正确显示
3. 解决方案:
- 在前端添加特有参数字符串的解析函数
- 将解析后的参数合并到数据对象中
- 确保表格和详情页面使用相同的数据格式
4. 代码修改:
```javascript
console.log('Requesting details for row:', row)
console.log('Details response:', response.data)
console.log('Custom params:', response.data.custom_params)
console.log('Selected data:', selectedData.value)
```
### 关键发现
1. 数据库查询
- 特殊参数表中有数据
- JSON_ARRAYAGG 返回的格式需要处理
- 需要过滤掉 NULL 值
2. 数据格式
- 后端返回的特殊参数是 JSON 字符串
- 需要在前端解析为数组
- 确保数组不为空
3. 前端渲染
- 条件判断需要更严格
- 需要确保数据类型正确
- 需要正确格式化显示值
### 解决方案
1. 后端查询优化
```sql
(
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', csp.id,
'param_name', csp.param_name,
'param_value', csp.param_value,
'param_unit', csp.param_unit,
'description', csp.description
)
)
FROM custom_params csp
WHERE csp.equipment_id = e.id
AND csp.param_name IS NOT NULL
AND csp.param_value IS NOT NULL
) as custom_params
```
2. 前端数据处理
```javascript
// 确保 custom_params 是数组
if (typeof response.data.custom_params === 'string') {
response.data.custom_params = JSON.parse(response.data.custom_params)
}
```
3. 渲染条件优化
```vue
<template v-if="selectedData?.custom_params && Array.isArray(selectedData.custom_params) && selectedData.custom_params.length > 0">
```
### 最佳实践
1. 数据库查询
- 使用子查询而不是 JOIN 获取特殊参数
- 确保返回格式统一
- 过滤无效数据
2. 数据处理
- 统一数据格式
- 处理空值和异常
- 保持类型一致
3. 前端显示
- 严格的条件判断
- 类型检查
- 格式化显示
4. 调试方法
- 使用日志<E697A5><E5BF97><EFBFBD>踪数据流
- 检查数据格式和类型
- 验证每个环节的数据
## 编辑对话框问题
### 问题描述
在数据管理页面中,编辑对话框的成本信息分区和特殊参数分区显示不正确。
### 调试步骤
1. 检查数据流
```javascript
console.log('Editing row:', row)
console.log('Edit data response:', response.data)
console.log('Parsed custom params:', data.custom_params)
console.log('Edit form data:', editForm.value)
```
2. 检查模板结构
```vue
<!-- 错误的嵌套结构 -->
<el-form>
<template>
<el-divider>成本信息</el-divider>
</template>
</el-form>
<!-- 正确的结构 -->
<el-divider>成本信息</el-divider>
<el-form>
<!-- 表单项 -->
</el-form>
```
### 关键发现
1. 模板结构问题
- el-divider 不应该嵌套在 template 中
- 每个分区需要独立的 el-form
- 避免不必要的 template 嵌套
2. 数据类型问题
- 后端返回的数值是字符串类型
- el-input-number 组件需要数值类型
- 需要在前端进行类型转换
3. 条件渲染问题
- v-if 条件过于严格可能导致内容不显示
- 某些字段应该始终显示
- 某些字段只在有值时显示
### 解决方案
1. 修改模板结构
```vue
<!-- 成本信息 -->
<el-divider content-position="left">成本信息</el-divider>
<el-form :model="editForm" label-width="120px">
<el-form-item label="实际成本(元)">
<el-input-number v-model="editForm.actual_cost"></el-input-number>
</el-form-item>
</el-form>
```
2. 数据类型转换
```javascript
// 转换所有数值类型字段
Object.keys(data).forEach(key => {
if (isNumberInput(key) && data[key] !== null && data[key] !== undefined) {
data[key] = Number(data[key])
// 解析特有参数字符串
const parseSpecificParams = (paramsStr, type) => {
if (!paramsStr) return {}
const values = paramsStr.split(',')
if (type === '火箭炮') {
return {
firing_angle_horizontal: values[0],
firing_angle_vertical: values[1],
// ... 其他火箭炮特有参数
}
} else if (type === '巡飞弹') {
return {
wingspan_m: values[0],
warhead_weight_kg: values[1],
// ... 其他巡飞弹特有参数
}
}
})
```
3. 优化条件渲染
```vue
<!-- 始终显示必要字段 -->
<el-form-item label="实际成本(元)">
<el-input-number v-model="editForm.actual_cost"></el-input-number>
</el-form-item>
<!-- 只在有值时显示可选字段 -->
<el-form-item label="预测成本(元)" v-if="editForm.predicted_cost">
<el-input-number v-model="editForm.predicted_cost" disabled></el-input-number>
</el-form-item>
```
### 最佳实践
1. 模板结构
- 保持清晰的分区结构
- 避免不必要的嵌套
- 使用合适的组件层级
2. 数据处理
- 在获取数据后立即进行类型转换
- 确保数据类型与组件要求匹配
- 处理好空值和未定义值
3. 条件渲染
- 合理使用 v-if 和 v-show
- 必要字段始终显示
- 可选字段根据条件显示
4. 调试方法
- 使用 console.log 跟踪数据流
- 检查组件的属性要求
- 验证数据类型和结构
## 特征分析功能问题
### 问题描述
特征分析页面中,第一次点击分析按钮时,图表不显示,只有标题栏。第二次点击才能正常显示图表。
### 调试步骤
1. 检查数据流
```javascript
console.log('Analysis result:', analysisResult.value)
console.log('Charts not ready:', {
importanceChartRef: !!importanceChartRef.value,
correlationChartRef: !!correlationChartRef.value,
analysisResult: !!analysisResult.value
})
```
2. 检查渲染时机
```javascript
// 使用 watch 监听分析结果变化
watch(() => analysisResult.value, async (newResult) => {
if (newResult) {
await nextTick()
setTimeout(() => {
renderCharts()
}, 100)
}
}, { deep: true })
```
3. 检查图表实例管理
```javascript
// 销毁旧的图表实例
if (importanceChart.value) {
importanceChart.value.dispose()
}
if (correlationChart.value) {
correlationChart.value.dispose()
return {}
}
```
### 关键发现
1. 渲染时机问题
- DOM 元素可能还未准备好
- 数据更新后需要等待 DOM 更新
- 需要正确管理图表实例
2. 图表实例管理
- 需要保存图表实例的引用
- 重新渲染前需要销毁旧实例
- 组件卸载时需要清理实例
3. 数据格式问题
- 特征名称需<E7A7B0><E99C80>中文映射
- 相关性数据需要保留2位小数
- 需要正确处理缺失值
### 解决方案
1. 优化渲染逻辑
```javascript
// 使用 nextTick 和延时确保 DOM 已更新
await nextTick()
setTimeout(() => {
renderCharts()
}, 100)
```
2. 完善图表实例管理
```javascript
// 保存图表实例的引用
const importanceChart = ref(null)
const correlationChart = ref(null)
// 组件卸载时清理
onUnmounted(() => {
importanceChart.value?.dispose()
correlationChart.value?.dispose()
})
```
3. 优化数据处理
```javascript
// 使用中文特征名
chinese_feature_names = [self.feature_names_map.get(name, name) for name in feature_names]
// 保留2位小数
correlation_data.append([
i, j,
round(correlation_matrix[i][j], 2)
])
```
5. 验证方法:
- 检查原始数据格式
- 验证参数解析结果
- 确认表格显示完整
- 对比详情页面数据
### 最佳实践
1. 渲染控制
- 使用 watch 监听数据变化
- 使用 nextTick 等待 DOM 更新
- 添加适当的延时确保渲染
2. 实例管理
- 保存图表实例引用
- 及时销毁旧实例
- 组件卸载时清理
3. 数据处理
- 统一使用中文特征名
- 控制数值精度
- 处理好缺失值
4. 调试方法
- 添加详细的日志记录
- 检查 DOM 元素状态
- 验证数据格式
## 页面状态保持问题
### 问题描述
特征分析页面切换到其他页面后<EFBFBD><EFBFBD><EFBFBD>返回页面状态分析结果和图表会丢失需要重新分析。
### 调试步骤
1. 检查路由配置
```javascript
// 错误的配置
<keep-alive include="AnalysisPage">
<router-view></router-view>
</keep-alive>
// 正确的配置
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" :key="$route.fullPath" />
</keep-alive>
</router-view>
```
2. 检查组件定义
```javascript
// 错误的组件名称定义
<script setup name="AnalysisPage">
// 正确的组件名称定义
const __name = 'AnalysisPage'
```
### 关键发现
1. keep-alive 配置问题
- 需要使用 v-slot API
- 需要使用动态组件
- 需要添加 key 属性
2. 组件定义问题
- setup 语法糖不支持直接添加 name
- 需要使用 __name 或 defineOptions
3. 缓存范围问题
- 不需要指定 include 属性
- 缓存所有路由组件更简单
- 避免组件名称不匹配的问题
### 解决方案
1. 修改路由视图配置
```vue
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" :key="$route.fullPath" />
</keep-alive>
</router-view>
```
2. 修改组件定义
```javascript
const __name = 'AnalysisPage'
```
### 最佳实践
1. 路由配置
- 使用 Vue3 的新 API
- 保持配置简单清晰
- 避免不<E5858D><E4B88D><EFBFBD>要的限制
2. 组件定义
- 使用推荐的方式定义组件名
- 避免使用已废弃的语法
- 保持代码一致性
3. 状态管理
- 合理使用 keep-alive
- 正确处理组件生命周期
- 注意清理工作
4. 调试方法
- 检查组件是否被缓存
- 验证状态是否保持
- 确认生命周期钩子的执行
## 代码修改最佳实践
### 1. 修改前的准备
1. 检查相关文件:
```
前端组件修改时检查:
- 相关的路由配置
- 父子组件关系
- 共用的组件和函数
- API调用
后端接口修改时检查:
- 路由定义
- 数据库查询
- 相关的工具类和函数
- 错误处理
```
2. 保持命名一致性:
```
- 类名ModelTrainer 而不是 ModelTraining
- 文件名train_model.py 对应 ModelTrainer
- 变量名:保持前后端一致的命名规范
```
3. 添加日志记录:
```python
# 在关键节点添加日志
logging.info(f"Starting model training for {equipment_type}")
logging.info(f"Training dataset: {train_dataset_id}")
logging.error(f"Error in model training: {str(e)}")
```
### 2. 修改过程中
1. 错误处理:
```python
try:
# 主要逻辑
except Exception as e:
logging.error(f"Error: {str(e)}")
logging.error("Detailed traceback:", exc_info=True)
return jsonify({'error': str(e)}), 500
```
2. 数据验证:
```python
# 验证输入
if not formData.value.type:
throw new Error('请选择装备类型')
if not formData.value.train_dataset_id:
throw new Error('请选择训练数据集')
```
3. 状态管理:
```javascript
// 重置状态
formData.value.train_dataset_id = null
formData.value.validation_dataset_id = null
trainingResult.value = null
```
### 3. 修改后的验证
1. 功能测试:
```
- 验证主要功能
- 测试边界条件
- 检查错误处理
```
2. 性能检查:
```
- 检查数据库查询性能
- 验证前端渲染性能
- 确认内存使用情况
```
3. 代码质量:
```
- 检查代码风格
- 确保注释完整
- 验证类型定义
```
### 4. 文档更新
1. 更新调试文档:
```
- 记录问题原因
- 描述解决方案
- 添加最佳实践
```
2. 更新设计文档:
```
- 更新接口定义
- 修改数据结构
- 补充新功能说明
```
3. 更新注释:
```
- 添加函数说明
- 说明参数用途
- 解释复杂逻辑
```
## 模型训练结果
从最新的训练结果来看:
1. XGBoost 表现最好:
- 训练集 R² = 0.4346,没有过拟合
- 验证集 R² = 0.3625,表现最稳定
- MAE = 0.60RMSE = 0.61,预测误差较小
2. LightGBM 表现次之:
- 训练集 R² = 0.5277,轻微过拟合
- 验证集 R² = 0.1101,泛化能力一般
- MAE = 0.55RMSE = 0.72,预测误差适中
3. Random Forest
- 训练集 R² = 0.7756,存在过拟合
- 验证集 R² = 0.3189,泛化能力还可以
- MAE = 0.47RMSE = 0.63,预测误差较小
4. GBDT 过拟合严重:
- 训练集 R² = 0.9700,严重过拟合
- 验证集 R² = -1.3133,泛化能力很差
- MAE = 0.96RMSE = 1.17,预测误差大
### 建议
1. 使用 XGBoost 作为主要模型
2. 可以考虑集成 XGBoost 和 Random Forest
3. 继续调整 LightGBM 的参数
4. 暂时不使用 GBDT
### 数据集存在的问题
火箭炮数据集:
- Feature length_m missing rate: 0.00%
- Feature width_m missing rate: 9.09%
- Feature height_m missing rate: 9.09%
- Feature weight_kg missing rate: 0.00%
- Feature max_range_km missing rate: 45.45%
- Feature firing_angle_horizontal missing rate: 45.45%
- Feature firing_angle_vertical missing rate: 45.45%
- Feature rocket_length_m missing rate: 72.73%
- Feature rocket_diameter_mm missing rate: 0.00%
- Feature rocket_weight_kg missing rate: 72.73%
- Feature rate_of_fire missing rate: 54.55%
巡飞弹数据集:
- Feature length_m missing rate: 27.78%
- Feature width_m missing rate: 50.00%
- Feature height_m missing rate: 50.00%
- Feature weight_kg missing rate: 22.22%
- Feature max_range_km missing rate: 44.44%
- Feature wingspan_m missing rate: 50.00%
- Feature warhead_weight_kg missing rate: 77.78%
- Feature max_speed_ms missing rate: 77.78%
- Feature cruise_speed_kmh missing rate: 61.11%
- Feature flight_time_min missing rate: 33.33%
## 前端特征分析页面未正确显示相关性分析数据(常见问题)
- 确保相关性分析数据的正确格式化和返回
- 添加了详细的日志记录
- 增加了数据验证步骤
- 处理了可能的NaN值
- 确保所有数值都转换为Python原生类型使用float()
## 巡飞弹数据整理问题总结
### 1. 最小飞行高度数据问题
#### 问题描述
- 所有巡飞弹的最小飞行高度都被设置为相同值50米
- 在特征相关性分析中由于数据完全相同导致该特征与其他特征的相关性无法计算出现NaN
#### 解决方案
1. 根据巡飞弹的类型和性能特点,设置不同的最小飞行高度:
- 大型巡飞弹(如 HAROP/Harpy、Shahed系列150米
- 中型巡飞弹(如 Mini Harpy、高端Hero系列100米
- 中小型巡飞弹(如 Hero-120、Switchblade 60080米
- 小型巡飞弹(如 Hero-30/70、Switchblade 30050米
- 超小型巡飞弹(如 Kargu/Alpagu、Rotem系列30米
2. 在特征分析中处理常量特征:
- 检测标准差为0的特征
- 对于常量特征设置与自身的相关性为1
- 与其他特征的相关性设置为0
- 添加相应的日志记录和警告信息
### 2. 特征分析图表显示问题
#### 问题描述
1. 特征工程参数分析和发动机性能分析图表中由于空间限制x轴上的装备型号名称显示不完整
2. 相关性热力图单元格高度过小,不易查看
#### 解决方案
1. 图表标签显示优化:
- 在 tooltip 中显示完整的装备型号名称
- 添加数据点的详细信息显示
```javascript
tooltip: {
formatter: function(params) {
const equipmentName = chartData.names[params[0].dataIndex]
let result = `${equipmentName}<br/>`
params.forEach(param => {
result += `${param.seriesName}: ${param.value.toFixed(2)}<br/>`
})
return result
}
}
```
2. 热力图显示优化:
- 增加图表容器高度800px
- 调整 grid 配置,增加显示区域
- 优化标签间距和旋转角度
```javascript
grid: {
height: '75%',
top: '10%',
bottom: '15%',
left: '10%',
right: '10%',
containLabel: true
}
```
### 3. 数据完整性问题
#### 问题描述
部分巡飞弹数据字段存在缺失:
- 宽度、高度50% 缺失
- 弹头重量77.78% 缺失
- 最大速度77.78% 缺失
- 巡航速度61.11% 缺失
#### 解决方案
1. 数据补充和验证:
- 根据装备的物理特性和性能参数推算缺失值
- 使用相似型号的数据作为参考
- 添加数据验证和完整性检查
2. 特征工程:
- 添加新的组合特征:长宽比、重量射程比等
- 计算衍生参数:有效载荷、最小作战半径等
- 设计评分系统:制导系统评分、战斗部威力评分等
### 4. 数据一致性问题
#### 问题描述
- 不同型号之间的参数单位不统一
- 部分参数的计算方式不一致
- 分类特征(如制导系统、战斗部类型)的表述不统一
#### 解决方案
1. 统一数据标准:
- 统一使用国际单位制SI
- 标准化参数计算方法
- 规范分类特征的表述方式
2. 添加数据转换和验证:
```python
# 单位转换
l.max_speed_ms = l.max_speed_kmh / 3.6
l.engine_thrust_n = l.engine_thrust_kgf * 9.81
# 分类特征编码
l.guidance_system_code =
CASE
WHEN l.guidance_system = 'GPS/INS' THEN 1
WHEN l.guidance_system = 'GPS/INS/光电' THEN 2
# ... 其他情况
END
```
### 最佳实践建议
1. 数据收集和整理:
- 建立完整的数据采集标准
- 确保数据的一致性和可比性
- 及时记录数据来源和处理方法
2. 特征工程:
- 根据领域知识设计特征
- 考虑特征之间的关系
- 注意特征的可解释性
3. 数据验证:
- 实施多层次的数据验证
- 添加完整的日志记录
- 建立数据质量监控机制
4. 可视化展示:
- 确保图表的可读性
- 提供详细的数据说明
- 支持交互式数据探索
1. 数据处理:
- 在数据加载时进行参数解析
- 保持数据格式的一致性
- 添加数据验证和错误处理
2. 错误处理:
- 添加详细的日志记录
- 提供清晰的错误提示
- 实现优雅的错误恢复
3. 调试方法:
- 使用日志跟踪数据流
- 验证数据一致性
- 检查类型匹配

View File

@ -431,3 +431,260 @@ graph TD
1. 系统测试
2. 部署上线
3. 文档完善
### 2.4 数据集划分策略
#### 2.4.1 基本原则
1. 数据量分配
- 训练集约80%的数据
- 验证集约20%的数据
- 确保数据集大小适合模型训练
2. 数据分布均衡
- 不同价格区间的装备均匀分布
- 不同制造商的产品保持代表性
- 不同技术代际的装备都要包含
- 不同性能等级的装备要均衡
3. 特征覆盖
- 确保关键特征的取值范围覆盖完整
- 避免某些特征在验证集中出现极端值
- 保持特征分布的相似性
#### 2.4.2 具体策略
1. 价格区间分层
- 高价格装备(>500万美元
- 中等价格装备200-500万美元
- 低价格装备(<200万美元
- 每个价格区间按8:2比例分配
2. 制造商分布
- 主要制造商的产品都要在训练集和验证集中有代表
- 每个制造商至少保留一个型号在验证集中
- 系列装备要适当分散在两个数据集中
3. 技术特征考虑
- 口径分布小口径≤200mm、中口径200-300mm、大口径>300mm
- 射程分布:近程、中程、远程
- 发射平台:轮式、履带式
- 制导水平:不同制导等级的均衡分布
4. 时代分布
- 新型装备和老式装备都要包含
- 不同代际的装备要保持合理比例
- 确保模型对新老装备都有良好的预测能力
#### 2.4.3 验证方法
1. 数据分布检验
- 使用统计方法验证两个数据集的分布相似性
- 检查关键特征的均值和方差
- 验证分类特征的比例分布
2. 代表性检验
- 确保每个重要类别都有足够的样本
- 验证特征空间的覆盖情况
- 检查是否存在数据偏差
3. 完整性检验
- 验证数据集的完整性
- 检查关键字段的缺失情况
- 确保数据质量满足要求
#### 2.4.4 实例说明
以火箭炮数据为例67个型号
1. 训练集54个型号
- 中国系列7/9型号
- 俄罗斯系列4/5型号
- 美国系列3/4型号
- 以色列系列3/4型号
- 韩国系列2/3型号
- 土耳其系列2/3型号
- 巴西系列3/4型号
- 印度系列3/4型号
- 波兰系列3/4型号
- 南非系列3/4型号
- 伊朗系列6/7型号
- 乌克兰系列3/4型号
- 白俄罗斯系列2/3型号
- 阿联酋系列2/3型号
- 新加坡系列2/3型号
- 日本系列2/3型号
2. 验证集13个型号
- 每个制造商选择1-2个代表型号
- 覆盖不同价格区间
- 包含新老装备
- 确保性能参数分布合理
这种划分方式确保了:
1. 训练集和验证集都包含各个制造商的产品
2. 不同价格区间的装备都有代表
3. 不同技术水平的装备都被覆盖
4. 特征分布保持相似性
### 2.5 火箭炮特征工程设计
#### 2.5.1 设计原则
1. 物理意义
- 特征必须具有明确的物理意义
- 反映装备的实际性能特点
- 便于专业人员理解和解释
2. 可计算性
- 基于已有参数计算得出
- 计算方法科学合理
- 避免过于复杂的计算
3. 区分度
- 能够反映不同装备间的差异
- 具有合适的数值范围
- 避免过于集中的分布
4. 完整性
- 覆盖关键性能维度
- 包含技术和战术层面
- 形成完整的评估体系
#### 2.5.2 特征设计
1. 火力密度fire_density
- 定义:单位面积的火力输出能力
- 计算:射速 / (火箭弹直径² / 1000000)
- 单位:发/分钟/平方米
- 意义:反映武器系统的火力集中程度
```sql
fire_density = rate_of_fire / (rocket_diameter_mm * rocket_diameter_mm / 1000000)
```
2. 射程比range_ratio
- 定义:最大射程与最小射程的比值
- 计算:最大射程 / 最小射程
- 意义:反映火箭炮的射程适应性
```sql
range_ratio = max_range_km / NULLIF(min_range_km, 0)
```
3. 机动性评分mobility_score
- 定义:基于底盘类型的机动能力评分
- 计算范围1-10分
- 评分标准:
```sql
CASE
WHEN mobility_type = '轮式' AND structure_layout LIKE '%8x8%' THEN 9
WHEN mobility_type = '轮式' AND structure_layout LIKE '%6x6%' THEN 8
WHEN mobility_type = '轮式' AND structure_layout LIKE '%4x4%' THEN 7
WHEN mobility_type = '履带式' THEN 6
ELSE 5
END
```
4. 战备状态评分combat_readiness_score
- 定义:基于射速的快速反应能力评分
- 计算范围1-10分
- 评分标准:
```sql
CASE
WHEN rate_of_fire >= 30 THEN 10
WHEN rate_of_fire >= 20 THEN 8
WHEN rate_of_fire >= 10 THEN 6
ELSE 4
END
```
5. 火箭弹功重比rocket_power_ratio
- 定义:火箭弹重量与长度的比值
- 计算:火箭弹重量 / 火箭弹长度
- 意义:反映火箭弹的设计效率
```sql
rocket_power_ratio = rocket_weight_kg / NULLIF(rocket_length_m, 0)
```
6. 平台效率platform_efficiency
- 定义:单位重量的火力输出能力
- 计算:(射速 / 战斗重量) * 1000
- 意义:反映发射平台的效率
```sql
platform_efficiency = rate_of_fire / NULLIF(combat_weight_kg, 0) * 1000
```
7. 部署评分deployment_score
- 定义:综合机动性和射速的部署能力评分
- 计算范围1-10分
- 评分标准:
```sql
CASE
WHEN mobility_type = '轮式' AND rate_of_fire >= 20 THEN 9
WHEN mobility_type = '轮式' AND rate_of_fire >= 10 THEN 8
WHEN mobility_type = '履带式' AND rate_of_fire >= 20 THEN 7
WHEN mobility_type = '履带式' AND rate_of_fire >= 10 THEN 6
ELSE 5
END
```
8. 地形适应性评分terrain_adaptability_score
- 定义:基于底盘类型的地形适应能力评分
- 计算范围1-10分
- 评分标准:
```sql
CASE
WHEN mobility_type = '履带式' THEN 9
WHEN mobility_type = '轮式' AND structure_layout LIKE '%8x8%' THEN 8
WHEN mobility_type = '轮式' AND structure_layout LIKE '%6x6%' THEN 7
WHEN mobility_type = '轮式' AND structure_layout LIKE '%4x4%' THEN 6
ELSE 5
END
```
#### 2.5.3 特征验证
1. 数值范围验证
- 检查特征值的合理性
- 识别异常值和极端值
- 确保计算结果在预期范围内
2. 区分度验证
- 检查特征值的分布情况
- 验证不同装备间的差异性
- 确保特征具有足够的区分能力
3. 相关性分析
- 检查特征间的相关性
- 识别冗余特征
- 确保特征集的独立性
4. 实用性验证
- 评估特征对成本预测的贡献
- 检验特征的可解释性
- 确保特征的实际应用价值
#### 2.5.4 应用建议
1. 特征选择
- 根据具体任务选择合适的特征子集
- 考虑特征的重要性排序
- 平衡特征数量和模型复杂度
2. 特征更新
- 定期评估特征的有效性
- 根据新数据调整计算参数
- 及时更新评分标准
3. 特征组合
- 考虑特征间的组合效应
- 设计复合特征
- 探索特征交互作用

View File

@ -10,7 +10,7 @@
<!-- 数据集选择 -->
<div class="dataset-section">
<el-form :model="analysisForm" label-width="120px">
<el-form-item label="装备类型" required>
<el-form-item label="装备类型" prop="equipment_type" required>
<el-select
v-model="analysisForm.equipment_type"
@change="handleEquipmentTypeChange"
@ -21,7 +21,7 @@
</el-select>
</el-form-item>
<el-form-item label="选择数据集" required>
<el-form-item label="选择数据集" prop="dataset_id" required>
<el-select
v-model="analysisForm.dataset_id"
@change="handleDatasetChange"
@ -40,9 +40,15 @@
<!-- 数据集信息 -->
<el-descriptions v-if="selectedDataset" :column="2" border>
<el-descriptions-item label="数据集名称">{{ selectedDataset.name }}</el-descriptions-item>
<el-descriptions-item label="装备数量">{{ selectedDataset.equipment_count }}</el-descriptions-item>
<el-descriptions-item label="描述" :span="2">{{ selectedDataset.description }}</el-descriptions-item>
<el-descriptions-item label="数据集名称" prop="name">
{{ selectedDataset.name }}
</el-descriptions-item>
<el-descriptions-item label="装备数量" prop="equipment_count">
{{ selectedDataset.equipment_count }}
</el-descriptions-item>
<el-descriptions-item label="描述" :span="2" prop="description">
{{ selectedDataset.description }}
</el-descriptions-item>
</el-descriptions>
</div>
@ -69,6 +75,21 @@
<div ref="correlationChartRef" style="width: 100%; height: 800px"></div>
</div>
<!-- 火箭炮特有的图表 -->
<template v-if="analysisForm.equipment_type === '火箭炮'">
<!-- 火力性能分析 -->
<h3>火力性能分析</h3>
<div class="chart-container">
<div ref="fireChartRef" style="width: 100%; height: 600px"></div>
</div>
<!-- 机动性能分析 -->
<h3>机动性能分析</h3>
<div class="chart-container">
<div ref="mobilityChartRef" style="width: 100%; height: 600px"></div>
</div>
</template>
<!-- 巡飞弹特有的图表 -->
<template v-if="analysisForm.equipment_type === '巡飞弹'">
<!-- 特征工程参数分析 -->
@ -108,12 +129,16 @@ const importanceChartRef = ref(null)
const correlationChartRef = ref(null)
const newFeatureChartRef = ref(null)
const engineChartRef = ref(null)
const newFeatureChart = ref(null)
const engineChart = ref(null)
const fireChartRef = ref(null)
const mobilityChartRef = ref(null)
//
const importanceChart = ref(null)
const correlationChart = ref(null)
const newFeatureChart = ref(null)
const engineChart = ref(null)
const fireChart = ref(null)
const mobilityChart = ref(null)
//
watch(() => analysisResult.value, async (newResult) => {
@ -298,6 +323,12 @@ const createResizeHandler = () => {
if (engineChart.value && !engineChart.value.isDisposed()) {
engineChart.value.resize()
}
if (fireChart.value && !fireChart.value.isDisposed()) {
fireChart.value.resize()
}
if (mobilityChart.value && !mobilityChart.value.isDisposed()) {
mobilityChart.value.resize()
}
} catch (error) {
console.error('Error in resize handler:', error)
}
@ -328,7 +359,8 @@ onUnmounted(() => {
}
//
[importanceChart, correlationChart, newFeatureChart, engineChart].forEach(chart => {
[importanceChart, correlationChart, newFeatureChart, engineChart,
fireChart, mobilityChart].forEach(chart => {
if (chart.value && !chart.value.isDisposed()) {
try {
chart.value.dispose()
@ -351,7 +383,8 @@ const renderCharts = () => {
try {
//
[importanceChart, correlationChart, newFeatureChart, engineChart].forEach(chart => {
[importanceChart, correlationChart, newFeatureChart, engineChart,
fireChart, mobilityChart].forEach(chart => {
if (chart.value && !chart.value.isDisposed()) {
chart.value.dispose()
chart.value = null
@ -667,6 +700,205 @@ const renderCharts = () => {
engineChart.value.setOption(engineOption, { notMerge: true })
}
//
if (analysisForm.value.equipment_type === '火箭炮' &&
fireChartRef.value &&
mobilityChartRef.value) {
//
fireChart.value = echarts.init(fireChartRef.value)
mobilityChart.value = echarts.init(mobilityChartRef.value)
//
const chartData = {
names: analysisResult.value.equipment_names || [],
fireDensity: analysisResult.value.fire_density || [],
rangeRatio: analysisResult.value.range_ratio || [],
rateOfFire: analysisResult.value.rate_of_fire || [],
maxRange: analysisResult.value.max_range_km || [],
mobilityScore: analysisResult.value.mobility_score || [],
deploymentScore: analysisResult.value.deployment_score || [],
terrainScore: analysisResult.value.terrain_adaptability_score || [],
combatReadinessScore: analysisResult.value.combat_readiness_score || []
}
//
const fireOption = {
animation: false,
title: {
text: '火力性能分析',
left: 'center'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
legend: {
top: 30,
data: [
'火力密度', '射程比', '射速', '最大射程',
'火箭弹重量', '弹体直径', '火箭弹长度' //
]
},
grid: {
top: 80,
bottom: 50,
containLabel: true
},
xAxis: {
type: 'category',
data: chartData.names
},
yAxis: [
{
type: 'value',
name: '火力密度/射程比',
position: 'left'
},
{
type: 'value',
name: '射速/射程/重量/口径',
position: 'right'
}
],
series: [
{
name: '火力密度',
type: 'line',
data: chartData.fireDensity
},
{
name: '射程比',
type: 'line',
data: chartData.rangeRatio
},
{
name: '射速',
type: 'bar',
yAxisIndex: 1,
data: chartData.rateOfFire
},
{
name: '最大射程',
type: 'bar',
yAxisIndex: 1,
data: chartData.maxRange
},
//
{
name: '火箭弹重量',
type: 'bar',
yAxisIndex: 1,
data: chartData.rocketWeight
},
{
name: '弹体直径',
type: 'bar',
yAxisIndex: 1,
data: chartData.rocketDiameter
},
{
name: '火箭弹长度',
type: 'bar',
yAxisIndex: 1,
data: chartData.rocketLength
}
]
}
//
const mobilityOption = {
animation: false,
title: {
text: '机动性能分析',
left: 'center'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
},
formatter: function(params) {
const equipmentName = chartData.names[params[0].dataIndex]
let result = `${equipmentName}<br/>`
params.forEach(param => {
result += `${param.seriesName}: ${param.value.toFixed(2)}<br/>`
})
return result
}
},
legend: {
top: 30,
data: [
'机动性评分', '部署评分', '地形适应性评分', '战备状态评分',
'行驶速度', '功率', '行程' //
]
},
grid: {
top: 80,
bottom: 50,
containLabel: true
},
xAxis: {
type: 'category',
data: chartData.names
},
yAxis: {
type: 'value',
name: '评分',
min: 0,
max: 10
},
series: [
{
name: '机动性评分',
type: 'bar',
data: chartData.mobilityScore
},
{
name: '部署评分',
type: 'bar',
data: chartData.deploymentScore
},
{
name: '地形适应性评分',
type: 'bar',
data: chartData.terrainScore
},
{
name: '战备状态评分',
type: 'bar',
data: chartData.combatReadinessScore
},
{
name: '行驶速度',
type: 'line',
data: chartData.speedKmh
},
{
name: '功率',
type: 'line',
data: chartData.powerHp
},
{
name: '行程',
type: 'line',
data: chartData.travelRangeKm
}
]
}
//
fireChart.value.clear()
mobilityChart.value.clear()
//
fireChart.value.setOption(fireOption, { notMerge: true })
mobilityChart.value.setOption(mobilityOption, { notMerge: true })
}
console.log('Charts rendered successfully')
} catch (error) {
console.error('Error in chart rendering:', error)

View File

@ -45,8 +45,8 @@
<el-table-column prop="manufacturer" label="制造商" sortable></el-table-column>
<el-table-column prop="length_m" label="总长(m)" sortable></el-table-column>
<el-table-column prop="weight_kg" label="重量(kg)" sortable></el-table-column>
<el-table-column prop="max_range_km" label="最大射程(km)" sortable></el-table-column>
<el-table-column prop="rocket_diameter_mm" label="口径(mm)" sortable></el-table-column>
<el-table-column prop="max_range_km" label="最大射程(km)" sortable></el-table-column>
<el-table-column prop="rate_of_fire" label="射速(发/分)" sortable></el-table-column>
<el-table-column label="操作" width="200">
<template #default="scope">
@ -88,12 +88,12 @@
<el-table-column prop="manufacturer" label="制造商" sortable></el-table-column>
<el-table-column prop="length_m" label="弹长(m)" sortable></el-table-column>
<el-table-column prop="weight_kg" label="重量(kg)" sortable></el-table-column>
<el-table-column prop="max_range_km" label="最大程(km)" sortable></el-table-column>
<el-table-column prop="max_range_km" label="最大程(km)" sortable></el-table-column>
<el-table-column prop="max_speed_ms" label="最大速度(m/s)" sortable></el-table-column>
<el-table-column prop="endurance_min" label="续航时间(min)" sortable></el-table-column>
<el-table-column prop="warhead_weight_kg" label="战斗部重量(kg)" sortable></el-table-column>
<el-table-column prop="guidance_system" label="制导系统"></el-table-column>
<el-table-column prop="actual_cost" label="成本(元)" sortable>
<el-table-column prop="actual_cost" label="成本(元)" sortable>
<template #default="scope">
{{ formatMoney(scope.row.actual_cost) }}
</template>
@ -128,7 +128,6 @@
<el-descriptions-item label="宽度(m)">{{ formatNumber(selectedData?.width_m) }}</el-descriptions-item>
<el-descriptions-item label="高度(m)">{{ formatNumber(selectedData?.height_m) }}</el-descriptions-item>
<el-descriptions-item label="重量(kg)">{{ formatNumber(selectedData?.weight_kg) }}</el-descriptions-item>
<el-descriptions-item label="最大射程(km)">{{ formatNumber(selectedData?.max_range_km) }}</el-descriptions-item>
</template>
<!-- 火箭炮特有参数 -->
@ -140,6 +139,7 @@
</el-descriptions-item>
<el-descriptions-item label="口径(mm)">{{ formatNumber(selectedData?.rocket_diameter_mm) }}</el-descriptions-item>
<el-descriptions-item label="最大射程(km)">{{ formatNumber(selectedData?.max_range_km) }}</el-descriptions-item>
<el-descriptions-item label="射速(发/分)">{{ formatNumber(selectedData?.rate_of_fire) }}</el-descriptions-item>
<el-descriptions-item label="火箭弹长度(m)">{{ formatNumber(selectedData?.rocket_length_m) }}</el-descriptions-item>
<el-descriptions-item label="火箭弹重量(kg)">{{ formatNumber(selectedData?.rocket_weight_kg) }}</el-descriptions-item>
@ -164,6 +164,7 @@
<el-descriptions-item label="最大速度(m/s)">{{ formatNumber(selectedData?.max_speed_ms) }}</el-descriptions-item>
<el-descriptions-item label="巡航速度(km/h)">{{ formatNumber(selectedData?.cruise_speed_kmh) }}</el-descriptions-item>
<el-descriptions-item label="续航时间(min)">{{ formatNumber(selectedData?.endurance_min) }}</el-descriptions-item>
<el-descriptions-item label="最大航程(km)">{{ formatNumber(selectedData?.max_range_km) }}</el-descriptions-item>
<el-descriptions-item label="战斗部类型">{{ selectedData?.warhead_type }}</el-descriptions-item>
<el-descriptions-item label="发射方式">{{ selectedData?.launch_mode }}</el-descriptions-item>
<el-descriptions-item label="动力装置">{{ selectedData?.power_system }}</el-descriptions-item>
@ -196,10 +197,10 @@
</template>
</el-descriptions-item>
<el-descriptions-item label="实际成本(元)">
<el-descriptions-item label="实际成本(元)">
{{ formatMoney(selectedData?.actual_cost) }}
</el-descriptions-item>
<el-descriptions-item label="预测成本(元)">
<el-descriptions-item label="预测成本(元)">
{{ formatMoney(selectedData?.predicted_cost) }}
</el-descriptions-item>
<el-descriptions-item label="成本估算时间">
@ -235,9 +236,6 @@
<el-form-item label="重量(kg)">
<el-input-number v-model="editForm.weight_kg" :precision="1"></el-input-number>
</el-form-item>
<el-form-item label="最大射程(km)">
<el-input-number v-model="editForm.max_range_km" :precision="2"></el-input-number>
</el-form-item>
</template>
<!-- 火箭炮特有参数 -->
@ -246,6 +244,9 @@
<el-form-item label="口径(mm)">
<el-input-number v-model="editForm.rocket_diameter_mm" :precision="0"></el-input-number>
</el-form-item>
<el-form-item label="最大射程(km)">
<el-input-number v-model="editForm.max_range_km" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="射速(发/分)">
<el-input-number v-model="editForm.rate_of_fire" :precision="0"></el-input-number>
</el-form-item>
@ -295,6 +296,9 @@
<el-form-item label="续航时间(min)">
<el-input-number v-model="editForm.endurance_min" :precision="0"></el-input-number>
</el-form-item>
<el-form-item label="最大航程(km)">
<el-input-number v-model="editForm.max_range_km" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="战斗部类型">
<el-select v-model="editForm.warhead_type">
<el-option v-for="option in getSelectOptions('warhead_type')" :key="option" :label="option" :value="option"></el-option>
@ -346,9 +350,9 @@
</el-form-item>
</template>
<!-- 成本信息 -->
<!-- 成本 -->
<el-divider content-position="left">成本信息</el-divider>
<el-form-item label="实际成本(元)">
<el-form-item label="实际成本(元)">
<el-input-number
v-model="editForm.actual_cost"
:precision="0"
@ -356,6 +360,7 @@
:step="1000"
:controls="true"
style="width: 200px"
:model-value="Number(editForm.actual_cost)"
></el-input-number>
</el-form-item>
<el-form-item label="预测成本(元)">
@ -411,50 +416,195 @@ const manufacturers = computed(() => {
return [...new Set(data.map(item => item.manufacturer))]
})
//
//
const filteredRocketData = computed(() => {
return filterData(rocketData.value)
const data = Array.isArray(rocketData.value) ? rocketData.value : []
const filtered = filterData(data)
//
console.log('Filtered rocket data:', filtered.map(item => ({
id: item.id,
name: item.name,
type: item.type,
manufacturer: item.manufacturer,
length_m: item.length_m,
width_m: item.width_m,
height_m: item.height_m,
weight_kg: item.weight_kg,
rocket_diameter_mm: item.rocket_diameter_mm,
max_range_km: item.max_range_km,
rate_of_fire: item.rate_of_fire,
mobility_type: item.mobility_type,
structure_layout: item.structure_layout,
engine_model: item.engine_model,
engine_params: item.engine_params,
power_hp: item.power_hp,
travel_range_km: item.travel_range_km,
actual_cost: item.actual_cost
})))
return filtered
})
//
const filteredMissileData = computed(() => {
return filterData(missileData.value)
const data = Array.isArray(missileData.value) ? missileData.value : []
const filtered = filterData(data)
//
console.log('Filtered missile data:', filtered.map(item => ({
id: item.id,
name: item.name,
type: item.type,
manufacturer: item.manufacturer,
length_m: item.length_m,
width_m: item.width_m,
height_m: item.height_m,
weight_kg: item.weight_kg,
wingspan_m: item.wingspan_m,
warhead_weight_kg: item.warhead_weight_kg,
max_speed_ms: item.max_speed_ms,
cruise_speed_kmh: item.cruise_speed_kmh,
endurance_min: item.endurance_min,
max_range_km: item.max_range_km,
warhead_type: item.warhead_type,
launch_mode: item.launch_mode,
power_system: item.power_system,
guidance_system: item.guidance_system,
actual_cost: item.actual_cost
})))
return filtered
})
//
const filterData = (data) => {
return data.filter(item => {
if (!Array.isArray(data)) {
console.warn('Invalid data format:', data)
return []
}
//
console.log('Original data before filtering:', data)
const filtered = data.filter(item => {
//
if (!item || typeof item !== 'object') {
console.warn('Invalid item:', item)
return false
}
const matchesType = activeTab.value === 'rocket' ?
item.type === '火箭炮' :
item.type === '巡飞弹'
//
const matchesSearch = searchQuery.value ?
(item.name.toLowerCase().includes(searchQuery.value.toLowerCase()) ||
item.manufacturer.toLowerCase().includes(searchQuery.value.toLowerCase())) : true
//
const matchesManufacturer = filterManufacturer.value ?
item.manufacturer === filterManufacturer.value : true
return matchesSearch && matchesManufacturer
const result = matchesType && matchesSearch && matchesManufacturer
//
if (!result) {
console.log('Item filtered out:', {
item,
matchesType,
matchesSearch,
matchesManufacturer
})
}
return result
})
//
console.log('Filtered data:', filtered)
return filtered
}
//
const parseSpecificParams = (paramsStr, type) => {
if (!paramsStr) return {}
const values = paramsStr.split(',')
if (type === '火箭炮') {
return {
firing_angle_horizontal: values[0],
firing_angle_vertical: values[1],
rocket_length_m: values[2],
rocket_diameter_mm: values[3],
rocket_weight_kg: values[4],
rate_of_fire: values[5],
combat_weight_kg: values[6],
speed_kmh: values[7],
min_range_km: values[8],
max_range_km: values[9],
mobility_type: values[10],
structure_layout: values[11],
engine_model: values[12],
engine_params: values[13],
power_hp: values[14],
travel_range_km: values[15]
}
} else if (type === '巡飞弹') {
return {
wingspan_m: values[0],
warhead_weight_kg: values[1],
max_speed_ms: values[2],
cruise_speed_kmh: values[3],
endurance_min: values[4],
max_range_km: values[5],
max_payload_kg: values[6],
ceiling_altitude_m: values[7],
combat_radius_km: values[8],
warhead_type: values[9],
launch_mode: values[10],
power_system: values[11],
guidance_system: values[12]
}
}
return {}
}
//
const loadData = async () => {
try {
const response = await axios.get(`${API_BASE_URL}/data`)
if (response.data.error) {
throw new Error(response.data.error)
//
console.log('Raw response data:', response.data)
//
if (!response.data || !Array.isArray(response.data)) {
console.error('Invalid response data:', response.data)
ElMessage.error('数据格式错误')
return
}
//
rocketData.value = response.data.rocket_artillery.map(item => ({
//
const processedData = response.data.map(item => ({
...item,
custom_params: item.custom_params || []
...parseSpecificParams(item.specific_params, item.type)
}))
//
missileData.value = response.data.loitering_munition.map(item => ({
...item,
custom_params: item.custom_params || []
}))
//
rocketData.value = processedData.filter(item => item.type === '火箭炮')
missileData.value = processedData.filter(item => item.type === '巡飞弹')
//
console.log('Processed rocket data:', rocketData.value)
console.log('Processed missile data:', missileData.value)
} catch (error) {
ElMessage.error('加载数据失败')
console.error('Error loading data:', error)
ElMessage.error('加载数据失败')
}
}
@ -493,66 +643,50 @@ const downloadTemplate = () => {
//
const viewDetails = async (row) => {
try {
console.log('Requesting details for row:', row)
const response = await axios.get(`${API_BASE_URL}/data/details/${row.id}`)
if (response.data.error) {
throw new Error(response.data.error)
}
console.log('Details response:', response.data)
// ID
console.log('查看详情的行数据:', {
rowId: row.id, //
equipmentId: row.equipment_id, // ID
type: row.type,
name: row.name
})
// custom_params
if (typeof response.data.custom_params === 'string') {
response.data.custom_params = JSON.parse(response.data.custom_params)
}
console.log('Parsed custom params:', response.data.custom_params)
// 使 ID
const response = await axios.get(`${API_BASE_URL}/data/details/${row.equipment_id}`)
selectedData.value = response.data
console.log('Selected data:', selectedData.value)
detailsVisible.value = true
} catch (error) {
ElMessage.error('获取详情失败')
console.error('Error getting details:', error)
ElMessage.error('获取详情失败')
}
}
//
const editData = async (row) => {
try {
console.log('Editing row:', row)
const response = await axios.get(`${API_BASE_URL}/data/details/${row.id}`)
if (response.data.error) {
throw new Error(response.data.error)
}
console.log('Edit data response:', response.data)
// custom_params
if (typeof response.data.custom_params === 'string') {
response.data.custom_params = JSON.parse(response.data.custom_params)
}
//
const data = { ...response.data }
Object.keys(data).forEach(key => {
if (isNumberInput(key) && data[key] !== null && data[key] !== undefined) {
data[key] = Number(data[key])
}
console.log('Editing equipment:', {
rowId: row.id,
equipmentId: row.equipment_id,
type: row.type,
name: row.name
})
//
if (data.custom_params) {
data.custom_params = data.custom_params.map(param => ({
...param,
param_value: !isNaN(param.param_value) ? Number(param.param_value) : param.param_value
}))
const response = await axios.get(`${API_BASE_URL}/data/details/${row.equipment_id}`)
//
const formData = response.data
if (formData.actual_cost) {
formData.actual_cost = Number(formData.actual_cost)
}
if (formData.predicted_cost) {
formData.predicted_cost = Number(formData.predicted_cost)
}
console.log('Parsed custom params:', data.custom_params)
editForm.value = data
console.log('Edit form data:', editForm.value)
editForm.value = formData
editVisible.value = true
} catch (error) {
ElMessage.error('获取编辑数据失败')
console.error('Error getting edit data:', error)
ElMessage.error('获取编辑数据失败')
}
}
@ -598,7 +732,7 @@ const deleteData = async (row) => {
if (response.data.success) {
ElMessage.success('删除成功')
loadData() //
loadData() //
} else {
throw new Error(response.data.error)
}
@ -618,9 +752,11 @@ const formatNumber = (value) => {
//
const formatMoney = (value) => {
if (value === null || value === undefined) return '-'
return new Intl.NumberFormat('zh-CN', {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'CNY'
currency: 'USD',
minimumFractionDigits: 0,
maximumFractionDigits: 0
}).format(value)
}
@ -690,6 +826,49 @@ const isNumberInput = (key) => {
return numberFields.includes(key)
}
//
const getSelectOptions = (field) => {
switch (field) {
case 'mobility_type':
return ['轮式', '履带式']
case 'warhead_type':
return [
'破片杀伤战斗部',
'破甲战斗部',
'破片杀伤/破甲双用战斗部',
'模块化战斗部'
]
case 'launch_mode':
return [
'箱式发射',
'单兵发射管',
'垂直起降',
'弹射式发射',
'空中发射'
]
case 'power_system':
return [
'电动机',
'活塞发动机',
'涡轮喷气'
]
case 'guidance_system':
return [
'GPS/INS/光电/数据链',
'GPS/INS/光电/数据链/AI辅助',
'GPS/INS/光电/数据链/AI辅助/红外',
'GPS/INS/光电/数据链/AI辅助/卫通'
]
default:
return []
}
}
</script>
<style lang="scss" scoped>

View File

@ -61,7 +61,7 @@
<el-table :data="selectedDataset?.equipment" border>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="manufacturer" label="制造商"></el-table-column>
<el-table-column prop="actual_cost" label="成本(元)">
<el-table-column prop="actual_cost" label="成本(元)">
<template #default="scope">
{{ formatMoney(scope.row.actual_cost) }}
</template>
@ -100,6 +100,7 @@
<!-- 选择装备数据 -->
<el-form-item label="选择装备" required>
<el-table
ref="equipmentTable"
:data="availableEquipment"
border
@selection-change="handleSelectionChange"
@ -108,7 +109,7 @@
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="manufacturer" label="制造商"></el-table-column>
<el-table-column prop="actual_cost" label="成本(元)">
<el-table-column prop="actual_cost" label="成本(元)">
<template #default="scope">
{{ formatMoney(scope.row.actual_cost) }}
</template>
@ -127,7 +128,7 @@
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ref, onMounted, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import { API_BASE_URL } from '@/config'
@ -140,6 +141,9 @@ const editVisible = ref(false) // 编辑对话框显示状态
const availableEquipment = ref([]) //
const selectedEquipment = ref([]) //
//
const equipmentTable = ref(null)
//
const datasetForm = ref({
id: null,
@ -176,11 +180,36 @@ const createDataset = () => {
//
const editDataset = async (dataset) => {
try {
//
const response = await axios.get(`${API_BASE_URL}/datasets/${dataset.id}`)
datasetForm.value = response.data
await loadAvailableEquipment()
//
datasetForm.value = {
id: response.data.id,
name: response.data.name,
equipment_type: response.data.equipment_type,
purpose: response.data.purpose,
description: response.data.description
}
//
selectedEquipment.value = response.data.equipment
availableEquipment.value = response.data.equipment
//
nextTick(() => {
if (equipmentTable.value) {
equipmentTable.value.clearSelection()
availableEquipment.value.forEach(item => {
equipmentTable.value.toggleRowSelection(item, true)
})
}
})
editVisible.value = true
} catch (error) {
console.error('Error getting dataset details:', error)
ElMessage.error('获取数据集详情失败')
}
}
@ -267,9 +296,11 @@ const viewEquipment = (equipment) => {
//
const formatMoney = (value) => {
if (value === null || value === undefined) return '-'
return new Intl.NumberFormat('zh-CN', {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'CNY'
currency: 'USD',
minimumFractionDigits: 0,
maximumFractionDigits: 0
}).format(value)
}

View File

@ -21,12 +21,12 @@
{{ scope.row.r2_score.toFixed(4) }}
</template>
</el-table-column>
<el-table-column prop="mae" label="MAE (元)">
<el-table-column prop="mae" label="MAE (元)">
<template #default="scope">
{{ scope.row.mae.toFixed(2) }}
</template>
</el-table-column>
<el-table-column prop="rmse" label="RMSE (元)">
<el-table-column prop="rmse" label="RMSE (元)">
<template #default="scope">
{{ scope.row.rmse.toFixed(2) }}
</template>
@ -92,8 +92,8 @@
<el-divider content-position="left">评估指标</el-divider>
<el-descriptions :column="3" border>
<el-descriptions-item label="R²分数">{{ selectedModel?.r2_score.toFixed(4) }}</el-descriptions-item>
<el-descriptions-item label="MAE">{{ selectedModel?.mae.toFixed(2) }} </el-descriptions-item>
<el-descriptions-item label="RMSE">{{ selectedModel?.rmse.toFixed(2) }} </el-descriptions-item>
<el-descriptions-item label="MAE">{{ selectedModel?.mae.toFixed(2) }} </el-descriptions-item>
<el-descriptions-item label="RMSE">{{ selectedModel?.rmse.toFixed(2) }} </el-descriptions-item>
</el-descriptions>
</div>

View File

@ -7,7 +7,7 @@
<el-form :model="formData" label-width="120px">
<!-- 装备类型选择 -->
<el-form-item label="装备类型">
<el-form-item label="装备类型" prop="type">
<el-select v-model="formData.type" @change="handleTypeChange">
<el-option label="火箭炮" value="火箭炮"></el-option>
<el-option label="巡飞弹" value="巡飞弹"></el-option>
@ -15,62 +15,100 @@
</el-form-item>
<!-- 通用参数 -->
<el-form-item label="总长(m)">
<el-form-item label="总长(m)" prop="length_m">
<el-input-number v-model="formData.length_m" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="宽度(m)">
<el-form-item label="宽度(m)" prop="width_m">
<el-input-number v-model="formData.width_m" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="高度(m)">
<el-form-item label="高度(m)" prop="height_m">
<el-input-number v-model="formData.height_m" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="重量(kg)">
<el-form-item label="重量(kg)" prop="weight_kg">
<el-input-number v-model="formData.weight_kg"></el-input-number>
</el-form-item>
<el-form-item label="最大射程(km)">
<el-input-number v-model="formData.max_range_km"></el-input-number>
</el-form-item>
<!-- 火箭炮特有参数 -->
<template v-if="formData.type === '火箭炮'">
<el-form-item label="方向射界(度)">
<el-form-item label="最大射程(km)" prop="max_range_km">
<el-input-number v-model="formData.max_range_km"></el-input-number>
</el-form-item>
<el-form-item label="方向射界(度)" prop="firing_angle_horizontal">
<el-input-number v-model="formData.firing_angle_horizontal"></el-input-number>
</el-form-item>
<el-form-item label="高低射界(度)">
<el-form-item label="高低射界(度)" prop="firing_angle_vertical">
<el-input-number v-model="formData.firing_angle_vertical"></el-input-number>
</el-form-item>
<el-form-item label="火箭弹长度(m)">
<el-form-item label="火箭弹长度(m)" prop="rocket_length_m">
<el-input-number v-model="formData.rocket_length_m" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="弹体直径(mm)">
<el-form-item label="弹体直径(mm)" prop="rocket_diameter_mm">
<el-input-number v-model="formData.rocket_diameter_mm"></el-input-number>
</el-form-item>
<el-form-item label="火箭弹重量(kg)">
<el-input-number v-model="formData.rocket_weight_kg"></el-input-number>
<el-form-item label="火箭弹重量(kg)" prop="rocket_weight_kg">
<el-input-number v-model="formData.rocket_weight_kg" :precision="1"></el-input-number>
</el-form-item>
<el-form-item label="射速(发/分钟)">
<el-form-item label="射速(发/分钟)" prop="rate_of_fire">
<el-input-number v-model="formData.rate_of_fire"></el-input-number>
</el-form-item>
<el-form-item label="战斗重量(kg)" prop="combat_weight_kg">
<el-input-number v-model="formData.combat_weight_kg"></el-input-number>
</el-form-item>
<el-form-item label="行驶速度(km/h)" prop="speed_kmh">
<el-input-number v-model="formData.speed_kmh"></el-input-number>
</el-form-item>
<el-form-item label="最小射程(km)" prop="min_range_km">
<el-input-number v-model="formData.min_range_km"></el-input-number>
</el-form-item>
<el-form-item label="机动方式" prop="mobility_type">
<el-select v-model="formData.mobility_type">
<el-option label="轮式" value="轮式"></el-option>
<el-option label="履带式" value="履带式"></el-option>
</el-select>
</el-form-item>
<el-form-item label="结构布局" prop="structure_layout">
<el-select v-model="formData.structure_layout">
<el-option label="8x8轮式底盘" value="8x8轮式底盘"></el-option>
<el-option label="6x6轮式底盘" value="6x6轮式底盘"></el-option>
<el-option label="4x4轮式底盘" value="4x4轮式底盘"></el-option>
<el-option label="履带式底盘" value="履带式底盘"></el-option>
</el-select>
</el-form-item>
<el-form-item label="发动机型号" prop="engine_model">
<el-input v-model="formData.engine_model"></el-input>
</el-form-item>
<el-form-item label="发动机参数" prop="engine_params">
<el-input v-model="formData.engine_params"></el-input>
</el-form-item>
<el-form-item label="功率(hp)" prop="power_hp">
<el-input-number v-model="formData.power_hp"></el-input-number>
</el-form-item>
<el-form-item label="行程(km)" prop="travel_range_km">
<el-input-number v-model="formData.travel_range_km"></el-input-number>
</el-form-item>
</template>
<!-- 巡飞弹特有参数 -->
<template v-if="formData.type === '巡飞弹'">
<el-form-item label="翼展(m)">
<el-form-item label="翼展(m)" prop="wingspan_m">
<el-input-number v-model="formData.wingspan_m" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="战斗部重量(kg)">
<el-form-item label="战斗部重量(kg)" prop="warhead_weight_kg">
<el-input-number v-model="formData.warhead_weight_kg" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="最大速度(m/s)">
<el-form-item label="最大速度(m/s)" prop="max_speed_ms">
<el-input-number v-model="formData.max_speed_ms" :precision="1"></el-input-number>
</el-form-item>
<el-form-item label="巡航速度(km/h)">
<el-form-item label="巡航速度(km/h)" prop="cruise_speed_kmh">
<el-input-number v-model="formData.cruise_speed_kmh" :precision="1"></el-input-number>
</el-form-item>
<el-form-item label="续航时间(min)">
<el-form-item label="续航时间(min)" prop="endurance_min">
<el-input-number v-model="formData.endurance_min" :precision="0"></el-input-number>
</el-form-item>
<el-form-item label="战斗部类型">
<el-form-item label="最大航程(km)" prop="max_range_km">
<el-input-number v-model="formData.max_range_km" :precision="1"></el-input-number>
</el-form-item>
<el-form-item label="战斗部类型" prop="warhead_type">
<el-select v-model="formData.warhead_type">
<el-option label="破片杀伤战斗部" value="破片杀伤战斗部"></el-option>
<el-option label="破甲战斗部" value="破甲战斗部"></el-option>
@ -79,7 +117,7 @@
<el-option label="模块化战斗部" value="模块化战斗部"></el-option>
</el-select>
</el-form-item>
<el-form-item label="发射方式">
<el-form-item label="发射方式" prop="launch_mode">
<el-select v-model="formData.launch_mode">
<el-option label="箱式发射" value="箱式发射"></el-option>
<el-option label="弹射式发射" value="弹射式发射"></el-option>
@ -89,13 +127,13 @@
<el-option label="箱式发射/空中发射" value="箱式发射/空中发射"></el-option>
</el-select>
</el-form-item>
<el-form-item label="动力装置">
<el-form-item label="动力装置" prop="power_system">
<el-select v-model="formData.power_system">
<el-option label="电动机" value="电动机"></el-option>
<el-option label="活塞发动机" value="活塞发动机"></el-option>
</el-select>
</el-form-item>
<el-form-item label="制导系统">
<el-form-item label="制导系统" prop="guidance_system">
<el-select v-model="formData.guidance_system">
<el-option label="GPS/INS" value="GPS/INS"></el-option>
<el-option label="GPS/INS/光电" value="GPS/INS/光电"></el-option>
@ -103,9 +141,24 @@
<el-option label="GPS/INS/光电/AI识别" value="GPS/INS/光电/AI识别"></el-option>
<el-option label="GPS/INS/光电/数据链/AI辅助" value="GPS/INS/光电/数据链/AI辅助"></el-option>
<el-option label="GPS/INS/光电/数据链/AI辅助/红外" value="GPS/INS/光电/数据链/AI辅助/红外"></el-option>
<el-option label="GPS/INS/光电/数据链/AI辅助/卫通" value="GPS/INS/光电/数据链/AI辅助/通"></el-option>
<el-option label="GPS/INS/光电/数据链/AI辅助/卫通" value="GPS/INS/光电/数据链/AI辅助/通"></el-option>
</el-select>
</el-form-item>
<el-form-item label="最大载荷(kg)" prop="max_payload_kg">
<el-input-number v-model="formData.max_payload_kg" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="升限(m)" prop="ceiling_altitude_m">
<el-input-number v-model="formData.ceiling_altitude_m" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="作战半径(km)" prop="combat_radius_km">
<el-input-number v-model="formData.combat_radius_km" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="通信链路距离(km)" prop="datalink_range_km">
<el-input-number v-model="formData.datalink_range_km" :precision="2"></el-input-number>
</el-form-item>
<el-form-item label="制导精度(m)" prop="guidance_accuracy_m">
<el-input-number v-model="formData.guidance_accuracy_m" :precision="2"></el-input-number>
</el-form-item>
</template>
<el-form-item>
@ -175,15 +228,39 @@ const formData = reactive({
height_m: null,
weight_kg: null,
max_range_km: null,
wingspan_m: null,
warhead_weight_kg: null,
max_speed_ms: null,
cruise_speed_kmh: null,
endurance_min: null,
warhead_type: '',
launch_mode: '',
power_system: '',
guidance_system: ''
//
firing_angle_horizontal: null,
firing_angle_vertical: null,
rocket_length_m: null,
rocket_diameter_mm: null,
rocket_weight_kg: null,
rate_of_fire: null,
combat_weight_kg: null,
speed_kmh: null,
min_range_km: null,
mobility_type: '',
structure_layout: '',
engine_model: '',
engine_params: '',
power_hp: null,
travel_range_km: null,
// -
max_payload_kg: null, //
ceiling_altitude_m: null, //
combat_radius_km: null, //
engine_power_kw: null, //
engine_thrust_n: null, //
datalink_range_km: null, //
guidance_accuracy_m: null, //
min_altitude_m: null, //
max_altitude_m: null, //
//
length_width_ratio: null, //
weight_range_ratio: null, // /
speed_weight_ratio: null, // /
guidance_system_score: null, //
warhead_power_score: null //
})
const predictionResults = ref(null)
@ -301,9 +378,11 @@ const formatFieldName = (field) => {
}
const formatMoney = (value) => {
return new Intl.NumberFormat('zh-CN', {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'CNY'
currency: 'USD',
minimumFractionDigits: 0,
maximumFractionDigits: 0
}).format(value)
}

View File

@ -38,11 +38,11 @@
<el-form-item label="选择模型">
<el-checkbox-group v-model="trainingConfig.models">
<el-checkbox label="pls" disabled>PLS回归</el-checkbox>
<el-checkbox label="xgboost" checked>XGBoost</el-checkbox>
<el-checkbox label="lightgbm" checked>LightGBM</el-checkbox>
<el-checkbox label="gbm" checked>GBM</el-checkbox>
<el-checkbox label="rf" checked>Random Forest</el-checkbox>
<el-checkbox value="pls" disabled checked>PLS回归</el-checkbox>
<el-checkbox value="xgboost" checked>XGBoost</el-checkbox>
<el-checkbox value="lightgbm" checked>LightGBM</el-checkbox>
<el-checkbox value="gbm" checked>GBM</el-checkbox>
<el-checkbox value="rf" checked>Random Forest</el-checkbox>
</el-checkbox-group>
</el-form-item>
@ -144,7 +144,7 @@ const trainingConfig = ref({
type: '',
train_dataset_id: null,
validation_dataset_id: null,
models: ['pls']
models: ['xgboost', 'lightgbm', 'gbm', 'rf']
})
//

27
frontend/vite.config.js Normal file
View File

@ -0,0 +1,27 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
define: {
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
__VUE_PROD_DEVTOOLS__: 'false',
__VUE_OPTIONS_API__: 'true',
__VUE_PROD_TIPS__: 'false'
},
resolve: {
alias: {
'@': '/src'
}
},
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:5000',
changeOrigin: true
}
}
}
})

View File

@ -222,7 +222,7 @@ class CostPredictor:
def predict_pls(self, data):
"""
使用 PLS 型预<EFBFBD><EFBFBD><EFBFBD>成本
使用 PLS 型预成本
"""
try:
logger.info(f"Starting PLS prediction for {data.get('type')}")

View File

@ -10,73 +10,118 @@ class FeatureAnalysis:
self.scaler = StandardScaler()
# 添加特征名称映射
self.feature_name_map = {
'length_m': '长度(m)',
# 通用参数
'length_m': '总长(m)',
'width_m': '宽度(m)',
'height_m': '高度(m)',
'weight_kg': '重量(kg)',
'max_range_km': '最大射程(km)',
# 火箭炮特有参数
'firing_angle_horizontal': '方向射界(度)',
'firing_angle_vertical': '高低射界(度)',
'rocket_length_m': '火箭弹长度(m)',
'rocket_diameter_mm': '弹体直径(mm)',
'rocket_weight_kg': '火箭弹重量(kg)',
'rate_of_fire': '射速(发/分)',
'combat_weight_kg': '战斗重量(kg)',
'speed_kmh': '行驶速度(km/h)',
'min_range_km': '最小射程(km)',
'power_hp': '功率(hp)',
'travel_range_km': '行程(km)',
'fire_density': '火力密度',
'range_ratio': '射程比',
'mobility_score': '机动性评分',
'combat_readiness_score': '战备状态评分',
'rocket_power_ratio': '火箭弹功重比',
'platform_efficiency': '平台效率',
'deployment_score': '部署评分',
'terrain_adaptability_score': '地形适应性评分',
# 巡飞弹特有参数
'wingspan_m': '翼展(m)',
'warhead_weight_kg': '弹头重量(kg)',
'warhead_weight_kg': '战斗部重量(kg)',
'max_speed_ms': '最大速度(m/s)',
'cruise_speed_kmh': '巡航速度(km/h)',
'endurance_min': '续航时间(min)',
'payload_weight_kg': '载荷重量(kg)',
'min_combat_radius_km': '最小作战半径(km)',
'max_payload_kg': '最大载荷(kg)',
'ceiling_altitude_m': '升限(m)',
'combat_radius_km': '作战半径(km)',
'engine_power_kw': '发动机功率(kw)',
'engine_thrust_n': '发动机推力(N)',
'datalink_range_km': '数据链距离(km)',
'guidance_accuracy_m': '制导精度(m)',
'min_altitude_m': '最小飞行高度(m)',
'max_altitude_m': '最大飞行高度(m)',
'min_altitude_m': '最小作战高度(m)',
'max_altitude_m': '最大作战高度(m)',
'length_width_ratio': '长宽比',
'weight_range_ratio': '重量射程比',
'speed_weight_ratio': '速度重量比',
'guidance_system_score': '制导系统评分',
'warhead_power_score': '战斗部威力评分',
'firing_angle_horizontal': '水平射角(°)',
'firing_angle_vertical': '垂直射角(°)',
'rocket_length_m': '火箭长度(m)',
'rocket_diameter_mm': '火箭直径(mm)',
'rocket_weight_kg': '火箭重量(kg)'
'warhead_power_score': '战斗部威力评分'
}
def get_equipment_specific_features(self, equipment_type):
"""获取特定装备类型的特征列表"""
common_features = [
'length_m', 'width_m', 'height_m',
'weight_kg', 'max_range_km'
# 数值特征列表
numeric_features = [
'length_m', 'width_m', 'height_m', 'weight_kg'
]
if equipment_type == '火箭炮':
return common_features + [
numeric_features.extend([
# 基本数值参数
'max_range_km',
'firing_angle_horizontal',
'firing_angle_vertical',
'rocket_length_m',
'rocket_diameter_mm',
'rocket_weight_kg'
]
'rocket_weight_kg',
'rate_of_fire',
'combat_weight_kg',
'speed_kmh',
'min_range_km',
'power_hp',
'travel_range_km',
# 特征工程参数
'fire_density',
'range_ratio',
'mobility_score',
'combat_readiness_score',
'rocket_power_ratio',
'platform_efficiency',
'deployment_score',
'terrain_adaptability_score'
])
elif equipment_type == '巡飞弹':
return common_features + [
numeric_features.extend([
# 性能参数
'wingspan_m',
'warhead_weight_kg',
'max_speed_ms',
'cruise_speed_kmh',
'endurance_min',
'payload_weight_kg',
'min_combat_radius_km',
'max_range_km',
'max_payload_kg',
'ceiling_altitude_m',
'combat_radius_km',
# 动力系统参数
'engine_power_kw',
'engine_thrust_n',
'datalink_range_km',
'guidance_accuracy_m',
'min_altitude_m',
'max_altitude_m',
# 特征工程参数
'length_width_ratio',
'weight_range_ratio',
'speed_weight_ratio',
'guidance_system_score',
'warhead_power_score'
]
return common_features
])
return numeric_features
def analyze_features(self, features, target, feature_names):
"""分析特征重要性和相关性"""

View File

@ -0,0 +1,669 @@
/*
2024
1. 60
2. 13/
3. 1990s-2020s
4.
5.
6. (kg)
7. (m)
8. /(m/s)/(km/h)
9. (km)
10. (m)
1. length_width_ratio:
2. weight_range_ratio:
3. speed_weight_ratio:
4. guidance_system_score: (1-10)
5. warhead_power_score: (1-10)
1. 8080%
2. 2020%
*/
-- 插入装备基本信息
INSERT INTO equipment (
id, -- 装备ID
name, -- 装备名称
type, -- 装备类型
manufacturer -- 制造商
) VALUES
(1, 'IAI Harop', '巡飞弹', '以色列'),
(2, 'IAI Harpy', '巡飞弹', '以色列'),
(3, 'IAI Mini Harpy', '巡飞弹', '以色列'),
(4, 'Hero-30', '巡飞弹', '以色列 UVision'),
(5, 'Hero-70', '巡飞弹', '以色列 UVision'),
(6, 'Hero-120', '巡飞弹', '以色列 UVision'),
(7, 'Hero-250', '巡飞弹', '以色列 UVision'),
(8, 'Hero-400EC', '巡飞弹', '以色列 UVision'),
(9, 'Hero-900', '巡飞弹', '以色列 UVision'),
(10, 'Switchblade 300', '巡飞弹', '美国 AeroVironment'),
(11, 'Switchblade 600', '巡飞弹', '美国 AeroVironment'),
(12, 'Switchblade 300 Block 10', '巡飞弹', '美国 AeroVironment'),
(13, 'Switchblade 600 Extended Range', '巡飞弹', '美国 AeroVironment'),
(14, 'Warmate 1.0', '巡飞弹', '波兰 WB Electronics'),
(15, 'Warmate 2.0', '巡飞弹', '波兰 WB Electronics'),
(16, 'Warmate-V', '巡飞弹', '波兰 WB Electronics'),
(17, 'Warmate-L', '巡飞弹', '波兰 WB Electronics'),
(18, 'Warmate 3.0', '巡飞弹', '波兰 WB Electronics'),
(19, 'CH-901', '巡飞弹', '中国航天科工'),
(20, 'CH-901A', '巡飞弹', '中国航天科工'),
(21, 'CH-901H', '巡飞弹', '中国航天科工'),
(22, 'CH-902', '巡飞弹', '中国航天科工'),
(23, 'CH-902A', '巡飞弹', '中国航天科工'),
(24, 'WS-43', '巡飞弹', '中国航天科工'),
(25, 'WS-43A', '巡飞弹', '中国航天科工'),
(26, 'WS-43B', '巡飞弹', '中国航天科工'),
(27, 'WS-61', '巡飞弹', '中国航天科工'),
(28, 'WS-61A', '巡飞弹', '中国航天科工'),
(29, 'Kargu', '巡飞弹', '土耳其 STM'),
(30, 'Kargu-2', '巡飞弹', '土耳其 STM'),
(31, 'Alpagu', '巡飞弹', '土耳其 STM'),
(32, 'Alpagu Block-II', '巡飞弹', '土耳其 STM'),
(33, 'Kargu Autonomous', '巡飞弹', '土耳其 STM'),
(34, 'Shahed-131', '巡飞弹', '伊朗'),
(35, 'Shahed-131B', '巡飞弹', '伊朗'),
(36, 'Shahed-136', '巡飞弹', '伊朗'),
(37, 'Shahed-136B', '巡飞弹', '伊朗'),
(38, 'Shahed-136C', '巡飞弹', '伊朗'),
(39, 'Green Dragon', '巡飞弹', '以色列 IAI'),
(40, 'Green Dragon Extended Range', '巡飞弹', '以色列 IAI'),
(41, 'Green Dragon Block 2', '巡飞弹', '以色列 IAI'),
(42, 'Green Dragon Maritime', '巡飞弹', '以色列 IAI'),
(43, 'Green Dragon-S', '巡飞弹', '以色列 IAI'),
(44, 'ZALA Lancet-1', '巡飞弹', '俄罗斯 ZALA'),
(45, 'ZALA Lancet-3', '巡飞弹', '俄罗斯 ZALA'),
(46, 'ZALA Lancet-3M', '巡飞弹', '俄罗斯 ZALA'),
(47, 'KUB-BLA', '巡飞弹', '俄罗斯 ZALA'),
(48, 'Rotem L', '巡飞弹', '以色列 IAI'),
(49, 'Rotem M', '巡飞弹', '以色列 IAI'),
(50, 'Rotem XL', '巡飞弹', '以色列 IAI'),
(51, 'Phoenix Ghost', '巡飞弹', '美国 AEVEX'),
(52, 'Altius-600', '巡飞弹', '美国 AREA-I'),
(53, 'Coyote', '巡飞弹', '美国 Raytheon'),
(54, 'Fire Scout', '巡飞弹', '美国 Northrop Grumman'),
(55, 'Horus', '巡飞弹', '埃及 AOI'),
(56, 'Grom', '巡飞弹', '波兰 WB Group'),
(57, 'Sokol', '巡飞弹', '波兰 WB Group'),
(58, 'Orlan-LM', '巡飞弹', '俄罗斯 UZGA'),
(59, 'Orlan-KM', '巡飞弹', '俄罗斯 UZGA'),
(60, 'Orlan-XM', '巡飞弹', '俄罗斯 UZGA'),
(61, 'Switchblade 900', '巡飞弹', '美国 AeroVironment'),
(62, 'Switchblade 1200', '巡飞弹', '美国 AeroVironment'),
(63, 'Raytheon Coyote Block 2', '巡飞弹', '美国 Raytheon'),
(64, 'Raytheon Coyote Block 3', '巡飞弹', '美国 Raytheon'),
(65, 'Lockheed MHTK', '巡飞弹', '美国 Lockheed Martin'),
(66, 'Lockheed Miniature Hit-to-Kill', '巡飞弹', '美国 Lockheed Martin'),
(67, 'Altius 700', '巡飞弹', '美国 AREA-I'),
(68, 'Altius 800', '巡飞弹', '美国 AREA-I'),
(69, 'SPEAR', '巡飞弹', '英国 MBDA'),
(70, 'Fire Shadow', '巡飞弹', '英国 MBDA'),
(71, 'HAROP-2', '巡飞弹', '德国-以色列合作'),
(72, 'HARPY-NG', '巡飞弹', '德国-以色列合作'),
(73, 'Enforcer', '巡飞弹', '德国 MBDA'),
(74, 'Enforcer Plus', '巡飞弹', '德国 MBDA'),
(75, 'AASM-250', '巡飞弹', '法国 Safran'),
(76, 'AASM-1000', '巡飞弹', '法国 Safran'),
(77, 'SmartGlider Light', '巡飞弹', '法国 MBDA'),
(78, 'SmartGlider Heavy', '巡飞弹', '法国 MBDA'),
(79, 'Taifun', '巡飞弹', '德国 Rheinmetall'),
(80, 'Taifun-K', '巡飞弹', '德国 Rheinmetall'),
(81, 'HERO-ES', '巡飞弹', '意大利 Leonardo'),
(82, 'HERO-ER', '巡飞弹', '意大利 Leonardo'),
(83, 'HERO-XL', '巡飞弹', '意大利 Leonardo'),
(84, 'AWHERO', '巡飞弹', '意大利 Leonardo'),
(85, 'MIRACH-40', '巡飞弹', '意大利 Leonardo'),
(86, 'SKELDAR V-150', '巡飞弹', '瑞典 UMS Skeldar'),
(87, 'SKELDAR V-200', '巡飞弹', '瑞典 UMS Skeldar'),
(88, 'SKELDAR V-200B', '巡飞弹', '瑞典 UMS Skeldar'),
(89, 'COS-LWS', '巡飞弹', '瑞典 Saab'),
(90, 'GLSDB', '巡飞弹', '瑞典 Saab'),
(91, 'CANTAS-A', '巡飞弹', '捷克 RETIA'),
(92, 'CANTAS-M', '巡飞弹', '捷克 RETIA'),
(93, 'CANTAS-S', '巡飞弹', '捷克 RETIA'),
(94, 'CANTAS-L', '巡飞弹', '捷克 RETIA'),
(95, 'CANTAS-X', '巡飞弹', '捷克 RETIA'),
(96, 'Shadow-1', '巡飞弹', '罗马尼亚 ROMARM'),
(97, 'Shadow-2', '巡飞弹', '罗马尼亚 ROMARM'),
(98, 'Shadow-X', '巡飞弹', '罗马尼亚 ROMARM'),
(99, 'Argus-E', '巡飞弹', '罗马尼亚 ROMARM'),
(100, 'Argus-S', '巡飞弹', '罗马尼亚 ROMARM');
-- 插入通参数
INSERT INTO common_params (
equipment_id, -- 装备ID
length_m, -- 长度
width_m, -- 宽度
height_m, -- 高度
weight_kg -- 重量
) VALUES
(1, 2.5, 3.0, 0.7, 135), -- IAI Harop
(2, 2.7, 2.1, 0.7, 125), -- IAI Harpy
(3, 2.1, 1.5, 0.5, 45), -- IAI Mini Harpy
(4, 0.76, 0.17, 0.17, 3.0), -- Hero-30
(5, 0.87, 0.18, 0.18, 6.5), -- Hero-70
(6, 1.3, 0.23, 0.23, 12.5), -- Hero-120
(7, 2.1, 0.30, 0.30, 35), -- Hero-250
(8, 2.4, 0.35, 0.35, 40), -- Hero-400EC
(9, 2.9, 0.40, 0.40, 90), -- Hero-900
(10, 0.58, 0.12, 0.12, 2.5), -- Switchblade 300
(11, 1.30, 0.23, 0.23, 15.0), -- Switchblade 600
(12, 0.60, 0.12, 0.12, 2.7), -- Switchblade 300 Block 10
(13, 1.35, 0.23, 0.23, 16.0), -- Switchblade 600 Extended Range
(14, 1.1, 0.22, 0.22, 5.5), -- Warmate 1.0
(15, 1.2, 0.24, 0.24, 6.5), -- Warmate 2.0
(16, 1.3, 0.25, 0.25, 7.0), -- Warmate-V
(17, 1.4, 0.26, 0.26, 8.0), -- Warmate-L
(18, 1.5, 0.28, 0.28, 9.0), -- Warmate 3.0
(19, 0.92, 0.20, 0.20, 9.0), -- CH-901
(20, 0.95, 0.22, 0.22, 9.5), -- CH-901A
(21, 0.95, 0.22, 0.22, 9.8), -- CH-901H
(22, 1.20, 0.25, 0.25, 15.0), -- CH-902
(23, 1.25, 0.26, 0.26, 16.0), -- CH-902A
(24, 1.80, 0.28, 0.28, 20.0), -- WS-43
(25, 1.85, 0.30, 0.30, 22.0), -- WS-43A
(26, 1.90, 0.32, 0.32, 23.0), -- WS-43B
(27, 2.30, 0.35, 0.35, 35.0), -- WS-61
(28, 2.35, 0.36, 0.36, 37.0), -- WS-61A
(29, 0.70, 0.15, 0.15, 7.0), -- Kargu
(30, 0.75, 0.16, 0.16, 7.5), -- Kargu-2
(31, 0.65, 0.14, 0.14, 5.0), -- Alpagu
(32, 0.68, 0.15, 0.15, 5.5), -- Alpagu Block-II
(33, 0.78, 0.17, 0.17, 8.0), -- Kargu Autonomous
(34, 2.5, 0.35, 0.35, 135), -- Shahed-131
(35, 2.6, 0.36, 0.36, 140), -- Shahed-131B
(36, 3.5, 0.50, 0.50, 200), -- Shahed-136
(37, 3.6, 0.52, 0.52, 210), -- Shahed-136B
(38, 3.7, 0.54, 0.54, 220), -- Shahed-136C
(39, 1.5, 0.25, 0.25, 15), -- Green Dragon
(40, 1.8, 0.28, 0.28, 18), -- Green Dragon Extended Range
(41, 2.0, 0.30, 0.30, 20), -- Green Dragon Block 2
(42, 2.2, 0.32, 0.32, 22), -- Green Dragon Maritime
(43, 1.3, 0.22, 0.22, 12), -- Green Dragon-S
(44, 0.65, 0.12, 0.12, 3.0), -- ZALA Lancet-1
(45, 1.20, 0.18, 0.18, 12.0), -- ZALA Lancet-3
(46, 1.30, 0.20, 0.20, 15.0), -- ZALA Lancet-3M
(47, 0.95, 0.15, 0.15, 6.5), -- KUB-BLA
(48, 0.70, 0.15, 0.15, 4.5), -- Rotem L
(49, 0.85, 0.18, 0.18, 7.0), -- Rotem M
(50, 1.10, 0.22, 0.22, 12.0), -- Rotem XL
(51, 0.80, 0.15, 0.15, 5.5), -- Phoenix Ghost
(52, 2.20, 0.30, 0.30, 25.0), -- Altius-600
(53, 0.90, 0.15, 0.15, 6.0), -- Coyote
(54, 2.50, 0.35, 0.35, 35.0), -- Fire Scout
(55, 1.20, 0.20, 0.20, 10.0), -- Horus
(56, 1.30, 0.22, 0.22, 12.0), -- Grom
(57, 1.50, 0.25, 0.25, 15.0), -- Sokol
(58, 1.80, 0.28, 0.28, 18.0), -- Orlan-LM
(59, 2.00, 0.30, 0.30, 22.0), -- Orlan-KM
(60, 2.20, 0.32, 0.32, 25.0), -- Orlan-XM
(61, 1.50, 0.25, 0.25, 20.0), -- Switchblade 900
(62, 1.80, 0.30, 0.30, 25.0), -- Switchblade 1200
(63, 1.20, 0.18, 0.18, 8.0), -- Coyote Block 2
(64, 1.40, 0.20, 0.20, 10.0), -- Coyote Block 3
(65, 0.60, 0.10, 0.10, 2.5), -- MHTK
(66, 0.65, 0.12, 0.12, 3.0), -- Miniature Hit-to-Kill
(67, 2.50, 0.35, 0.35, 30.0), -- Altius 700
(68, 2.80, 0.40, 0.40, 35.0), -- Altius 800
(69, 2.00, 0.28, 0.28, 100.0), -- SPEAR
(70, 2.50, 0.30, 0.30, 150.0), -- Fire Shadow
(71, 2.70, 3.2, 0.75, 140.0), -- HAROP-2
(72, 2.80, 2.2, 0.75, 130.0), -- HARPY-NG
(73, 0.90, 0.15, 0.15, 7.0), -- Enforcer
(74, 1.00, 0.18, 0.18, 9.0), -- Enforcer Plus
(75, 1.80, 0.25, 0.25, 250.0), -- AASM-250
(76, 2.50, 0.35, 0.35, 1000.0), -- AASM-1000
(77, 2.00, 0.30, 0.30, 120.0), -- SmartGlider Light
(78, 2.50, 0.40, 0.40, 180.0), -- SmartGlider Heavy
(79, 1.20, 0.20, 0.20, 15.0), -- Taifun
(80, 1.40, 0.25, 0.25, 20.0), -- Taifun-K
(81, 1.2, 0.20, 0.20, 10.0), -- HERO-ES
(82, 1.5, 0.25, 0.25, 15.0), -- HERO-ER
(83, 2.0, 0.30, 0.30, 25.0), -- HERO-XL
(84, 2.5, 0.35, 0.35, 35.0), -- AWHERO
(85, 3.0, 0.40, 0.40, 45.0), -- MIRACH-40
(86, 2.2, 0.30, 0.30, 30.0), -- SKELDAR V-150
(87, 2.5, 0.35, 0.35, 40.0), -- SKELDAR V-200
(88, 2.6, 0.36, 0.36, 42.0), -- SKELDAR V-200B
(89, 1.8, 0.25, 0.25, 20.0), -- COS-LWS
(90, 3.0, 0.35, 0.35, 120.0), -- GLSDB
(91, 1.2, 0.20, 0.20, 8.0), -- CANTAS-A
(92, 1.5, 0.25, 0.25, 12.0), -- CANTAS-M
(93, 0.8, 0.15, 0.15, 5.0), -- CANTAS-S
(94, 2.0, 0.30, 0.30, 20.0), -- CANTAS-L
(95, 2.5, 0.35, 0.35, 25.0), -- CANTAS-X
(96, 1.8, 0.28, 0.28, 15.0), -- Shadow-1
(97, 2.2, 0.32, 0.32, 22.0), -- Shadow-2
(98, 2.8, 0.35, 0.35, 25.0), -- Shadow-X
(99, 2.0, 0.25, 0.25, 12.0), -- Argus-E
(100, 1.5, 0.20, 0.20, 8.0); -- Argus-S
-- 插入巡飞弹特有参数
INSERT INTO loitering_munition_params (
equipment_id, -- 装备ID
wingspan_m, -- 翼展
warhead_weight_kg, -- 战斗部重量
max_speed_ms, -- 最大速度
cruise_speed_kmh, -- 巡航速度
endurance_min, -- 续航时间
max_range_km, -- 最大航程
max_payload_kg, -- 最大载荷
ceiling_altitude_m, -- 升限
combat_radius_km, -- 作战半径
warhead_type, -- 战斗部类型
launch_mode, -- 发射方式
power_system, -- 动力装置
guidance_system -- 制导体制
) VALUES
(1, 3.0, 23, 185, 185, 360, 1000, 35, 8000, 500, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(2, 2.1, 32, 185, 185, 120, 500, 45, 7000, 250, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链'),
(3, 1.5, 8, 155, 155, 120, 100, 15, 5000, 50, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(4, 1.2, 0.5, 45, 100, 30, 15, 1.0, 2000, 8, '破片杀伤战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链'),
(5, 1.5, 1.2, 50, 120, 45, 25, 2.0, 2500, 12, '破片杀伤战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链'),
(6, 2.0, 3.5, 55, 140, 60, 40, 5.0, 3000, 20, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(7, 2.5, 8.0, 60, 150, 120, 150, 12.0, 4000, 75, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(8, 3.0, 10.0, 65, 160, 240, 150, 15.0, 5000, 75, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(9, 3.5, 20.0, 70, 180, 360, 250, 30.0, 6000, 125, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'),
(10, 0.68, 0.2, 45, 100, 15, 10, 0.5, 1500, 5, '破片杀伤战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链'),
(11, 1.50, 3.0, 55, 130, 40, 40, 4.5, 3000, 20, '破甲战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(12, 0.70, 0.25, 45, 100, 20, 12, 0.6, 1800, 6, '破片杀伤战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(13, 1.55, 3.5, 60, 140, 50, 45, 5.0, 3500, 22, '破甲战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(14, 1.4, 1.4, 50, 120, 30, 30, 2.5, 2500, 15, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链'),
(15, 1.6, 1.8, 55, 130, 40, 35, 3.0, 3000, 17, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(16, 1.8, 2.0, 60, 140, 45, 40, 3.5, 3200, 20, '破片杀伤/破甲双用战斗部', '垂直起降', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(17, 2.0, 2.5, 65, 150, 50, 45, 4.0, 3500, 22, '破片杀伤/破甲双用战斗部', '弹射式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(18, 2.2, 3.0, 70, 160, 60, 50, 5.0, 4000, 25, '模块化战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助/红外'),
(19, 1.8, 3.5, 50, 120, 120, 15, 4.0, 2000, 8, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链'),
(20, 1.9, 4.0, 55, 130, 150, 20, 4.5, 2500, 10, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(21, 1.9, 4.2, 55, 130, 150, 20, 4.8, 2500, 10, '破甲战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(22, 2.2, 6.0, 60, 150, 180, 30, 7.0, 3000, 15, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(23, 2.3, 6.5, 65, 160, 200, 35, 7.5, 3500, 18, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'),
(24, 2.8, 8.0, 70, 180, 240, 50, 10.0, 4000, 25, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(25, 3.0, 9.0, 75, 190, 270, 60, 11.0, 4500, 30, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'),
(26, 3.2, 10.0, 80, 200, 300, 70, 12.0, 5000, 35, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'),
(27, 3.5, 15.0, 85, 220, 360, 100, 18.0, 6000, 50, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'),
(28, 3.6, 16.0, 90, 230, 400, 120, 20.0, 6500, 60, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外/卫通'),
(29, 1.2, 1.0, 40, 90, 30, 5, 1.5, 1500, 3, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'),
(30, 1.3, 1.2, 45, 100, 40, 8, 2.0, 2000, 4, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'),
(31, 1.1, 0.8, 50, 120, 25, 5, 1.2, 1500, 3, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'),
(32, 1.2, 1.0, 55, 130, 35, 8, 1.5, 2000, 4, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'),
(33, 1.4, 1.5, 45, 110, 45, 10, 2.5, 2500, 5, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助/红外'),
(34, 2.2, 15, 185, 150, 180, 900, 20, 5000, 450, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链'), -- Shahed-131
(35, 2.3, 18, 190, 160, 200, 1000, 25, 5500, 500, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- Shahed-131B
(36, 2.5, 40, 185, 150, 240, 2000, 50, 6000, 1000, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链'), -- Shahed-136
(37, 2.6, 45, 190, 160, 270, 2200, 55, 6500, 1100, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- Shahed-136B
(38, 2.7, 50, 195, 170, 300, 2500, 60, 7000, 1250, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- Shahed-136C
(39, 1.5, 3.0, 160, 140, 90, 40, 4.0, 3000, 20, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Green Dragon
(40, 1.8, 4.0, 170, 150, 120, 60, 5.0, 3500, 30, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Green Dragon Extended Range
(41, 2.0, 5.0, 180, 160, 150, 80, 6.0, 4000, 40, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Green Dragon Block 2
(42, 2.2, 5.5, 175, 155, 180, 100, 7.0, 4000, 50, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- Green Dragon Maritime
(43, 1.3, 2.5, 150, 130, 60, 30, 3.5, 2500, 15, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Green Dragon-S
(44, 0.8, 1.0, 80, 80, 40, 40, 1.5, 2000, 20, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- ZALA Lancet-1
(45, 1.4, 3.0, 110, 110, 60, 70, 4.0, 3000, 35, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- ZALA Lancet-3
(46, 1.5, 4.0, 120, 120, 80, 90, 5.0, 3500, 45, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助/红外'), -- ZALA Lancet-3M
(47, 1.2, 2.5, 130, 80, 30, 40, 3.0, 2500, 20, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- KUB-BLA
(48, 0.9, 1.0, 70, 60, 45, 15, 1.5, 1500, 8, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'), -- Rotem L
(49, 1.1, 2.0, 80, 70, 60, 25, 2.5, 2000, 12, '破片杀伤战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'), -- Rotem M
(50, 1.4, 3.5, 90, 80, 90, 40, 4.0, 2500, 20, '破片杀伤/破甲双用战斗部', '垂直起降', '电动机', 'GPS/INS/光电/AI辅助'), -- Rotem XL
(51, 1.0, 2.0, 100, 80, 60, 30, 2.5, 2000, 15, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Phoenix Ghost
(52, 2.8, 8.0, 120, 100, 240, 200, 10.0, 5000, 100, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- Altius-600
(53, 1.1, 2.0, 150, 120, 60, 50, 2.5, 2500, 25, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Coyote
(54, 3.0, 10.0, 160, 140, 300, 250, 12.0, 6000, 125, '模块化战斗部', '垂直起降', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- Fire Scout
(55, 1.5, 3.0, 100, 80, 120, 60, 4.0, 3000, 30, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Horus
(56, 1.6, 3.5, 110, 90, 150, 70, 4.5, 3500, 35, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Grom
(57, 1.8, 4.0, 120, 100, 180, 80, 5.0, 4000, 40, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助/红外'), -- Sokol
(58, 2.2, 5.0, 130, 110, 240, 100, 6.0, 4500, 50, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- Orlan-LM
(59, 2.4, 6.0, 140, 120, 300, 120, 7.0, 5000, 60, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- Orlan-KM
(60, 2.6, 7.0, 150, 130, 360, 150, 8.0, 5500, 75, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- Orlan-XM
(61, 1.8, 4.5, 180, 150, 60, 100, 6.0, 4000, 50, '破甲战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Switchblade 900
(62, 2.2, 6.0, 200, 160, 80, 120, 8.0, 4500, 60, '破甲战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Switchblade 1200
(63, 1.4, 2.5, 180, 150, 90, 80, 3.5, 3500, 40, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Coyote Block 2
(64, 1.6, 3.0, 200, 160, 120, 100, 4.0, 4000, 50, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助/红外'), -- Coyote Block 3
(65, 0.7, 0.5, 250, 200, 30, 20, 1.0, 2000, 10, '动能击杀战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- MHTK
(66, 0.8, 0.6, 260, 210, 35, 25, 1.2, 2500, 12, '动能击杀战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Miniature Hit-to-Kill
(67, 3.0, 10.0, 150, 130, 300, 250, 12.0, 6000, 125, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- Altius 700
(68, 3.5, 12.0, 160, 140, 360, 300, 15.0, 7000, 150, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- Altius 800
(69, 2.5, 40.0, 200, 180, 120, 140, 50.0, 5000, 70, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- SPEAR
(70, 3.0, 50.0, 180, 160, 360, 200, 60.0, 6000, 100, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- Fire Shadow
(71, 3.2, 25.0, 190, 190, 400, 1200, 35.0, 8500, 600, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- HAROP-2
(72, 2.2, 35.0, 190, 190, 360, 1000, 45.0, 8000, 500, '破片杀伤战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- HARPY-NG
(73, 1.2, 2.0, 150, 130, 60, 40, 3.0, 3000, 20, '破甲战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/AI辅助'), -- Enforcer
(74, 1.4, 2.5, 160, 140, 80, 50, 4.0, 3500, 25, '破甲战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/AI辅助/红外'), -- Enforcer Plus
(75, 2.5, 80.0, 300, 250, 60, 120, 100.0, 5000, 60, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- AASM-250
(76, 3.0, 450.0, 280, 230, 90, 150, 500.0, 6000, 75, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- AASM-1000
(77, 2.8, 40.0, 250, 200, 120, 180, 50.0, 5500, 90, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- SmartGlider Light
(78, 3.2, 80.0, 230, 180, 150, 200, 100.0, 6000, 100, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助'), -- SmartGlider Heavy
(79, 1.5, 3.5, 160, 140, 60, 50, 5.0, 3500, 25, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'), -- Taifun
(80, 1.8, 4.5, 180, 150, 80, 70, 6.0, 4000, 35, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助/红外'), -- Taifun-K
(81, 1.5, 3.0, 120, 100, 60, 40, 4.0, 3000, 20, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- HERO-ES
(82, 2.0, 5.0, 140, 120, 90, 60, 6.0, 4000, 30, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- HERO-ER
(83, 2.5, 8.0, 160, 140, 120, 80, 10.0, 5000, 40, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- HERO-XL
(84, 3.0, 12.0, 180, 160, 180, 100, 15.0, 6000, 50, '模块化战斗部', '垂直起降', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- AWHERO
(85, 3.5, 15.0, 200, 180, 240, 120, 20.0, 7000, 60, '模块化战斗部', '箱式发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- MIRACH-40
(86, 2.2, 10.0, 150, 130, 150, 80, 12.0, 4500, 40, '破片杀伤/破甲双用战斗部', '垂直起降', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助'), -- SKELDAR V-150
(87, 2.5, 15.0, 170, 150, 180, 100, 18.0, 5000, 50, '模块化战斗部', '垂直起降', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- SKELDAR V-200
(88, 2.6, 16.0, 180, 160, 200, 120, 20.0, 5500, 60, '模块化战斗部', '垂直起降', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- SKELDAR V-200B
(89, 1.8, 5.0, 160, 140, 90, 60, 8.0, 4000, 30, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- COS-LWS
(90, 3.0, 40.0, 250, 200, 120, 150, 50.0, 6000, 75, '破甲战斗部', '空中发射', '涡轮喷气', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- GLSDB
(91, 1.5, 2.5, 120, 100, 60, 35, 3.5, 3000, 18, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- CANTAS-A
(92, 2.0, 4.0, 140, 120, 90, 50, 5.0, 4000, 25, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- CANTAS-M
(93, 1.0, 1.5, 100, 80, 45, 25, 2.0, 2500, 12, '破片杀伤战斗部', '单兵发射管', '电动机', 'GPS/INS/光电/AI辅助'), -- CANTAS-S
(94, 2.5, 6.0, 160, 140, 120, 70, 8.0, 5000, 35, '破片杀伤/破甲双用战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- CANTAS-L
(95, 3.0, 8.0, 180, 160, 150, 90, 10.0, 6000, 45, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/卫通'), -- CANTAS-X
(96, 1.8, 3.0, 130, 110, 60, 40, 4.0, 3500, 20, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Shadow-1
(97, 2.2, 5.0, 150, 130, 90, 60, 6.0, 4500, 30, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Shadow-2
(98, 2.8, 7.0, 170, 150, 120, 80, 9.0, 5500, 40, '模块化战斗部', '箱式发射', '活塞发动机', 'GPS/INS/光电/数据链/AI辅助/红外'), -- Shadow-X
(99, 2.0, 4.0, 140, 120, 75, 50, 5.0, 4000, 25, '破片杀伤/破甲双用战斗部', '箱式发射', '电动机', 'GPS/INS/光电/数据链/AI辅助'), -- Argus-E
(100, 1.5, 2.5, 120, 100, 45, 30, 3.0, 3000, 15, '破片杀伤战斗部', '箱式发射', '电动机', 'GPS/INS/光电/AI辅助'); -- Argus-S
-- 插入成本数据
INSERT INTO cost_data (equipment_id, actual_cost) VALUES
(1, 850000), -- IAI Harop
(2, 750000), -- IAI Harpy
(3, 350000), -- IAI Mini Harpy
(4, 70000), -- Hero-30
(5, 120000), -- Hero-70
(6, 250000), -- Hero-120
(7, 450000), -- Hero-250
(8, 650000), -- Hero-400EC
(9, 850000), -- Hero-900
(10, 80000), -- Switchblade 300
(11, 250000), -- Switchblade 600
(12, 100000), -- Switchblade 300 Block 10
(13, 300000), -- Switchblade 600 Extended Range
(14, 120000), -- Warmate 1.0
(15, 180000), -- Warmate 2.0
(16, 200000), -- Warmate-V
(17, 220000), -- Warmate-L
(18, 250000), -- Warmate 3.0
(19, 150000), -- CH-901
(20, 180000), -- CH-901A
(21, 200000), -- CH-901H
(22, 280000), -- CH-902
(23, 320000), -- CH-902A
(24, 380000), -- WS-43
(25, 420000), -- WS-43A
(26, 450000), -- WS-43B
(27, 580000), -- WS-61
(28, 650000), -- WS-61A
(29, 120000), -- Kargu
(30, 150000), -- Kargu-2
(31, 100000), -- Alpagu
(32, 130000), -- Alpagu Block-II
(33, 180000), -- Kargu Autonomous
(34, 20000), -- Shahed-131价格较低
(35, 25000), -- Shahed-131B
(36, 50000), -- Shahed-136
(37, 60000), -- Shahed-136B
(38, 70000), -- Shahed-136C
(39, 280000), -- Green Dragon
(40, 350000), -- Green Dragon Extended Range
(41, 400000), -- Green Dragon Block 2
(42, 450000), -- Green Dragon Maritime
(43, 250000), -- Green Dragon-S
(44, 50000), -- ZALA Lancet-1
(45, 100000), -- ZALA Lancet-3
(46, 150000), -- ZALA Lancet-3M
(47, 80000), -- KUB-BLA
(48, 120000), -- Rotem L
(49, 180000), -- Rotem M
(50, 250000), -- Rotem XL
(51, 150000), -- Phoenix Ghost
(52, 450000), -- Altius-600
(53, 200000), -- Coyote
(54, 800000), -- Fire Scout
(55, 180000), -- Horus
(56, 220000), -- Grom
(57, 280000), -- Sokol
(58, 300000), -- Orlan-LM
(59, 350000), -- Orlan-KM
(60, 400000), -- Orlan-XM
(61, 350000), -- Switchblade 900
(62, 450000), -- Switchblade 1200
(63, 280000), -- Coyote Block 2
(64, 350000), -- Coyote Block 3
(65, 150000), -- MHTK
(66, 180000), -- Miniature Hit-to-Kill
(67, 550000), -- Altius 700
(68, 650000), -- Altius 800
(69, 800000), -- SPEAR
(70, 900000), -- Fire Shadow
(71, 950000), -- HAROP-2
(72, 850000), -- HARPY-NG
(73, 200000), -- Enforcer
(74, 250000), -- Enforcer Plus
(75, 850000), -- AASM-250
(76, 1200000), -- AASM-1000
(77, 750000), -- SmartGlider Light
(78, 950000), -- SmartGlider Heavy
(79, 250000), -- Taifun
(80, 300000), -- Taifun-K
(81, 280000), -- HERO-ES
(82, 350000), -- HERO-ER
(83, 450000), -- HERO-XL
(84, 650000), -- AWHERO
(85, 850000), -- MIRACH-40
(86, 450000), -- SKELDAR V-150
(87, 650000), -- SKELDAR V-200
(88, 750000), -- SKELDAR V-200B
(89, 350000), -- COS-LWS
(90, 850000), -- GLSDB
(91, 250000), -- CANTAS-A
(92, 350000), -- CANTAS-M
(93, 180000), -- CANTAS-S
(94, 450000), -- CANTAS-L
(95, 550000), -- CANTAS-X
(96, 220000), -- Shadow-1
(97, 320000), -- Shadow-2
(98, 450000), -- Shadow-X
(99, 280000), -- Argus-E
(100, 200000); -- Argus-S
-- 创建数据集
INSERT INTO datasets (id, name, description, equipment_type, purpose) VALUES
(1, '巡飞弹训练集 2024', '包含80个巡飞弹型号覆盖主要制造国、不同尺寸和价格区间', '巡飞弹', '训练'),
(2, '巡飞弹验证集 2024', '包含20个巡飞弹型号用于验证模型性能', '巡飞弹', '验证');
-- 训练集80个型号
INSERT INTO dataset_equipment (dataset_id, equipment_id) VALUES
-- 以色列系列8/10
(1, 1), (1, 2), (1, 3), -- HAROP/Harpy系列
(1, 4), (1, 5), (1, 6), (1, 7), (1, 8), -- Hero系列
-- 美国系列12/15
(1, 10), (1, 11), (1, 12), (1, 13), -- Switchblade系列
(1, 61), (1, 62), -- Switchblade 900/1200
(1, 63), (1, 64), -- Coyote Block 2/3
(1, 65), (1, 66), -- MHTK系列
(1, 67), (1, 68), -- Altius系列
-- 波兰系列4/5
(1, 14), (1, 15), (1, 16), (1, 17), -- Warmate系列
-- 中国系列8/10
(1, 19), (1, 20), (1, 21), (1, 22), -- CH系列
(1, 24), (1, 25), (1, 26), (1, 27), -- WS系列
-- 土耳其系列4/5
(1, 29), (1, 30), (1, 31), (1, 32), -- Kargu/Alpagu系列
-- 伊朗系列4/5
(1, 34), (1, 35), (1, 36), (1, 37), -- Shahed系列
(1, 39), (1, 40), (1, 41), (1, 42), (1, 43), (1, 44), (1, 46), (1, 47), (1, 50), (1, 53), (1, 55), (1, 56), (1, 57), (1, 58), (1, 59),
-- 英国系列2/2
(1, 69), (1, 70), -- SPEAR/AASM系列
-- 德国系列6/8
(1, 71), (1, 72), -- HAROP-2/HARPY-NG
(1, 73), (1, 74), -- Enforcer系列
(1, 79), (1, 80), -- Taifun系列
-- 法国系列4/5
(1, 75), (1, 76), (1, 77), (1, 78), -- AASM/SmartGlider系列
-- 意大利系列4/5
(1, 81), (1, 82), (1, 83), (1, 84), -- HERO/AWHERO系列
-- 瑞典系列4/5
(1, 86), (1, 87), (1, 88), (1, 89), -- SKELDAR系列
-- 捷克系列4/5
(1, 91), (1, 92), (1, 93), (1, 94), -- CANTAS系列
-- 罗马尼亚系列4/5
(1, 96), (1, 97), (1, 98), (1, 99); -- Shadow/Argus系列
-- 验证集20个型号
INSERT INTO dataset_equipment (dataset_id, equipment_id) VALUES
-- 以色列系列2/10
(2, 9), -- Hero-900
(2, 48), -- Rotem L
(2, 45), (2, 49), (2, 60),
-- 美国系列3/15
(2, 51), -- Phoenix Ghost
(2, 52), -- Altius-600
(2, 54), -- Fire Scout
-- 波兰系列1/5
(2, 18), -- Warmate 3.0
-- 中国系列2/10
(2, 23), -- CH-902A
(2, 28), -- WS-61A
-- 土耳其系列1/5
(2, 33), -- Kargu Autonomous
-- 伊朗系列1/5
(2, 38), -- Shahed-136C
-- 德国系列2/8
(2, 73), -- Enforcer
(2, 79), -- Taifun
-- 法国系列1/5
(2, 78), -- SmartGlider Heavy
-- 意大利系列1/5
(2, 85), -- MIRACH-40
-- 瑞典系列1/5
(2, 90), -- GLSDB
-- 捷克系列1/5
(2, 95), -- CANTAS-X
-- 罗马尼亚系列1/5
(2, 100); -- Argus-S
-- 更新数据集描述
UPDATE datasets
SET description = '包含80个巡飞弹型号覆盖13个国家/地区的产品包括大型、中型和小型巡飞弹价格区间从2万到120万美元'
WHERE id = 1;
UPDATE datasets
SET description = '包含20个巡飞弹型号覆盖所有主要制造国包括不同尺寸和价格区间的代表性产品'
WHERE id = 2;
-- 更新巡飞弹特征工程字段
UPDATE loitering_munition_params l
JOIN common_params c ON l.equipment_id = c.equipment_id
SET
-- 长宽比(反映气动布局特点)
l.length_width_ratio = c.length_m / NULLIF(c.width_m, 0),
-- 重量射程比反映设计效率kg/km
l.weight_range_ratio = c.weight_kg / NULLIF(l.max_range_km, 0),
-- 速度重量比反映动力性能m/s/kg
l.speed_weight_ratio = l.max_speed_ms / NULLIF(c.weight_kg, 0),
-- 制导系统评分(1-10)
l.guidance_system_score =
CASE
WHEN l.guidance_system LIKE '%卫通%' THEN 10
WHEN l.guidance_system LIKE '%AI辅助%' AND l.guidance_system LIKE '%红外%' THEN 9
WHEN l.guidance_system LIKE '%AI辅助%' THEN 8
WHEN l.guidance_system LIKE '%数据链%' AND l.guidance_system LIKE '%光电%' THEN 7
WHEN l.guidance_system LIKE '%数据链%' THEN 6
WHEN l.guidance_system LIKE '%光电%' THEN 5
WHEN l.guidance_system LIKE '%GPS/INS%' THEN 4
ELSE 3
END,
-- 战斗部威力评分(1-10)
l.warhead_power_score =
CASE
-- 大型战斗部(>30kg
WHEN l.warhead_weight_kg > 30 AND l.warhead_type LIKE '%模块化%' THEN 10
WHEN l.warhead_weight_kg > 30 AND l.warhead_type LIKE '%破甲%' THEN 9
WHEN l.warhead_weight_kg > 30 AND l.warhead_type LIKE '%破片%' THEN 8
-- 中型战斗部10-30kg
WHEN l.warhead_weight_kg > 10 AND l.warhead_type LIKE '%模块化%' THEN 8
WHEN l.warhead_weight_kg > 10 AND l.warhead_type LIKE '%破甲%' THEN 7
WHEN l.warhead_weight_kg > 10 AND l.warhead_type LIKE '%破片%' THEN 6
-- 小型战斗部3-10kg
WHEN l.warhead_weight_kg > 3 AND l.warhead_type LIKE '%模块化%' THEN 6
WHEN l.warhead_weight_kg > 3 AND l.warhead_type LIKE '%破甲%' THEN 5
WHEN l.warhead_weight_kg > 3 AND l.warhead_type LIKE '%破片%' THEN 4
-- 微型战斗部(<3kg
WHEN l.warhead_type LIKE '%破甲%' THEN 3
WHEN l.warhead_type LIKE '%破片%' THEN 2
ELSE 1
END,
-- 发动机功率kW根据重量估算
l.engine_power_kw =
CASE
WHEN l.power_system = '电动机' THEN c.weight_kg * 0.15
WHEN l.power_system = '活塞发动机' THEN c.weight_kg * 0.25
WHEN l.power_system = '涡轮喷气' THEN c.weight_kg * 0.35
ELSE c.weight_kg * 0.2
END,
-- 发动机推力N根据重量估算
l.engine_thrust_n =
CASE
WHEN l.power_system = '电动机' THEN c.weight_kg * 9.8 * 0.3
WHEN l.power_system = '活塞发动机' THEN c.weight_kg * 9.8 * 0.4
WHEN l.power_system = '涡轮喷气' THEN c.weight_kg * 9.8 * 0.5
ELSE c.weight_kg * 9.8 * 0.35
END,
-- 最小作战高度m根据体型和任务类型估算
l.min_altitude_m =
CASE
-- 大型巡飞弹(体型大、重量大)
WHEN c.weight_kg > 100 THEN 150
-- 中型巡飞弹
WHEN c.weight_kg > 50 THEN 100
-- 中小型巡飞弹
WHEN c.weight_kg > 20 THEN 80
-- 小型巡飞弹
WHEN c.weight_kg > 10 THEN 50
-- 超小型巡飞弹
ELSE 30
END,
-- 最大作战高度m根据航程估算
l.max_altitude_m =
CASE
WHEN l.max_range_km > 500 THEN 5000
WHEN l.max_range_km > 100 THEN 3000
ELSE 1500
END;

View File

@ -442,22 +442,42 @@ class ModelTrainer:
# 基本参数
'length_m', 'width_m', 'height_m', 'weight_kg', 'max_range_km',
# 性能参数
# 性能参数 - 新增和修改的参数
'wingspan_m', 'warhead_weight_kg', 'max_speed_ms', 'cruise_speed_kmh',
'endurance_min', 'payload_weight_kg', 'min_combat_radius_km',
'endurance_min', 'max_payload_kg', 'min_combat_radius_km',
# 动力系统参数
# 动力系统参数 - 新增参数
'engine_power_kw', 'engine_thrust_n',
# 制导与控制参数
# 制导与控制参数 - 新增参数
'datalink_range_km', 'guidance_accuracy_m',
'min_altitude_m', 'max_altitude_m',
# 特征工程参数
# 特征工程参数 - 新增评分指标
'length_width_ratio', 'weight_range_ratio', 'speed_weight_ratio',
'guidance_system_score', 'warhead_power_score'
]
def get_rocket_features(self):
"""获取火箭炮的特征列表"""
return [
# 基本参数
'length_m', 'width_m', 'height_m', 'weight_kg', 'max_range_km',
# 火箭炮特有参数 - 新增和修改的参数
'firing_angle_horizontal', 'firing_angle_vertical',
'rocket_length_m', 'rocket_diameter_mm', 'rocket_weight_kg',
'rate_of_fire', 'combat_weight_kg', 'speed_kmh',
'min_range_km', 'max_range_km', 'mobility_type', 'structure_layout',
'engine_model', 'power_hp', 'travel_range_km',
# 特征工程参数 - 新增评分指标
'fire_density', 'range_ratio', 'mobility_score',
'combat_readiness_score', 'rocket_power_ratio',
'platform_efficiency', 'deployment_score',
'terrain_adaptability_score'
]
def predict(self, features):
"""使用加载的模型进行预测"""
try:
@ -522,15 +542,16 @@ class ModelTrainer:
if not model:
return {}
# 获取征名称
# 获取征名称
if self.equipment_type == '巡飞弹':
feature_names = [
# 基本参数
'length_m', 'width_m', 'height_m', 'weight_kg', 'max_range_km',
'length_m', 'width_m', 'height_m', 'weight_kg',
# 性能参数
'wingspan_m', 'warhead_weight_kg', 'max_speed_ms', 'cruise_speed_kmh',
'endurance_min', 'payload_weight_kg', 'min_combat_radius_km',
'endurance_min', 'max_range_km','max_payload_kg', 'ceiling_altitude_m',
'combat_radius_km',
# 动力系统参数
'engine_power_kw', 'engine_thrust_n',
@ -658,4 +679,28 @@ class ModelTrainer:
except Exception as e:
logger.error(f"Error getting PLS feature importance: {str(e)}")
logger.error("Detailed traceback:", exc_info=True)
return {}
return {}
def _preprocess_data(self, data):
"""数据预处理"""
try:
# 获取正确的特征列表
if self.equipment_type == '巡飞弹':
feature_list = self.get_missile_features()
else:
feature_list = self.get_rocket_features()
logger.info(f"Using features: {feature_list}")
# 处理缺失值
features_filled = np.array(data, dtype=float)
features_filled[np.isnan(features_filled)] = 0
features_filled = np.nan_to_num(features_filled, 0)
logger.info(f"Filled features: \n{features_filled}")
return features_filled
except Exception as e:
logger.error(f"Error in data preprocessing: {str(e)}")
raise

View File

@ -0,0 +1,688 @@
/*
2024
1. 67
2. 16/
3. 1960s-2020s
4.
5.
6. (kg)
7. (m)
8. (mm)
9. (km)
10. /(km/h)
1. fire_density:
2. range_ratio:
3. mobility_score:
4. combat_readiness_score:
5. rocket_power_ratio:
6. platform_efficiency:
7. deployment_score:
8. terrain_adaptability_score:
1. 7780%
2. 1920%
*/
-- 中国系列火箭炮数据
INSERT INTO equipment (id, name, type, manufacturer) VALUES
(1001, 'PCL-191', '火箭炮', '中国兵器工业集团'),
(1002, 'PHL-03', '火箭炮', '中国兵器工业集团'),
(1003, 'AR-3', '火箭炮', '中国航天科工'),
(1004, 'SR-5', '火箭炮', '中国航天科工'),
(1005, 'A-100', '火箭炮', '中国兵器工业集团'),
(1006, 'WS-1B', '火箭炮', '中国航天科工'),
(1007, 'WS-2', '火箭炮', '中国航天科工'),
(1008, 'WS-3', '火箭炮', '中国航天科工'),
(1009, 'Type 63', '火箭炮', '中国兵器工业集团'),
(1010, 'BM-21 Grad', '火箭炮', '俄罗斯'),
(1011, 'BM-27 Uragan', '火箭炮', '俄罗斯'),
(1012, 'BM-30 Smerch', '火箭炮', '俄罗斯'),
(1013, '9A52-4 Tornado', '火箭炮', '俄罗斯'),
(1014, 'TOS-1A', '火箭炮', '俄罗斯'),
(1015, 'M142 HIMARS', '火箭炮', '美国洛克希德·马丁'),
(1016, 'M270 MLRS', '火箭炮', '美国洛克希德·马丁'),
(1017, 'M270A1', '火箭炮', '美国洛克希德·马丁'),
(1018, 'M270A2', '火箭炮', '美国洛克希德·马丁'),
(1019, 'LAR-160', '火箭炮', '以色列军事工业'),
(1020, 'EXTRA', '火箭炮', '以色列军事工业'),
(1021, 'ACCULAR', '火箭炮', '以色列军事工业'),
(1022, 'LYNX', '火箭炮', '以色列军事工业'),
(1023, 'K239 Chunmoo', '火箭炮', '韩国韩华防务'),
(1024, 'K136 Kooryong', '火箭炮', '韩国韩华防务'),
(1025, 'K33', '火箭炮', '韩国韩华防务'),
(1026, 'T-122 Sakarya', '火箭炮', '土耳其洛克特桑'),
(1027, 'T-300 Kasirga', '火箭炮', '土耳其洛克特桑'),
(1028, 'TRG-300', '火箭炮', '土耳其洛克特桑'),
(1029, 'ASTROS II', '火箭炮', '巴西航空工业'),
(1030, 'ASTROS 2020', '火箭炮', '巴西航空工业'),
(1031, 'ASTROS II Mk3', '火箭炮', '巴西航空工业'),
(1032, 'ASTROS II Mk6', '火箭炮', '巴西航空工业'),
(1033, 'Pinaka', '火箭炮', '印度DRDO'),
(1034, 'Pinaka Mk-II', '火箭炮', '印度DRDO'),
(1035, 'Pinaka Mk-III', '火箭炮', '印度DRDO'),
(1036, 'Pinaka-ER', '火箭炮', '印度DRDO'),
(1037, 'WR-40 Langusta', '火箭炮', '波兰胡塔斯塔洛瓦'),
(1038, 'RM-70', '火箭炮', '波兰胡塔斯塔洛瓦'),
(1039, 'BM-21M', '火箭炮', '波兰胡塔斯塔洛瓦'),
(1040, 'WR-122 Langusta-2', '火箭炮', '波兰胡塔斯塔洛瓦'),
(1041, 'Valkiri', '火箭炮', '南非迪尔'),
(1042, 'Bateleur', '火箭炮', '南非迪尔'),
(1043, 'T5-45', '火箭炮', '南非迪尔'),
(1044, 'Mokopa', '火箭炮', '南非迪尔'),
(1045, 'Fajr-3', '火箭炮', '伊朗国防工业'),
(1046, 'Fajr-5', '火箭炮', '伊朗国防工业'),
(1047, 'Falaq-1', '火箭炮', '伊朗国防工业'),
(1048, 'Falaq-2', '火箭炮', '伊朗国防工业'),
(1049, 'Haseb', '火箭炮', '伊朗国防工业'),
(1050, 'Raad-1', '火箭炮', '伊朗国防工业'),
(1051, 'Raad-2', '火炮', '伊朗国防工业'),
(1052, 'Verba', '火箭炮', '乌克兰尤日马什'),
(1053, 'Vilkha', '火箭炮', '乌克兰尤日马什'),
(1054, 'Bureviy', '火箭炮', '乌克兰尤日马什'),
(1055, 'Olkha', '火箭炮', '乌克兰尤日马什'),
(1056, 'BelGrad', '火箭炮', '白俄罗斯国家军工委员会'),
(1057, 'Polonez', '火箭炮', '白俄罗斯国家军工委员会'),
(1058, 'Polonez-M', '火箭炮', '白俄罗斯国家军工委员会'),
(1059, 'Jobaria', '火箭炮', '阿联酋国际金龙'),
(1060, 'Desert Spider', '火箭炮', '阿联酋国际金龙'),
(1061, 'Hafeet', '火箭炮', '阿联酋国际金龙'),
(1062, 'SLWH Pegasus', '火箭炮', '新加坡ST工程'),
(1063, 'SLWH Pegasus II', '火箭炮', '新加坡ST工程'),
(1064, 'HIMARS-SG', '火箭炮', '新加坡ST工程'),
(1065, 'Type 75', '火箭炮', '日本防卫装备厂'),
(1066, 'MLRS Type 99', '火箭炮', '日本防卫装备厂'),
(1067, 'Type 02', '火箭炮', '日本防卫装备厂'),
(1068, 'RM-70/85', '火箭炮', '斯洛伐克 ZTS'),
(1069, 'VEGA', '火箭炮', '斯洛伐克 ZTS'),
(1070, 'MORAK', '火箭炮', '斯洛伐克 ZTS'),
(1071, 'RM-70 Mod 2018', '火箭炮', '捷克 Excalibur Army'),
(1072, 'VAMPIRE', '火箭炮', '捷克 Excalibur Army'),
(1073, 'RH ALAN MRLS', '火箭炮', '克罗地亚 RH ALAN'),
(1074, 'LRSVM Morava', '火箭炮', '塞尔维亚 Yugoimport'),
(1075, 'LRSVM Tamnava', '火箭炮', '塞尔维亚 Yugoimport'),
(1076, 'LRSVM Sumadija', '火箭炮', '塞尔维亚 Yugoimport'),
(1077, '122 RAKH 89', '火箭炮', '芬兰 Patria'),
(1078, '122 RAKH 91', '火箭炮', '芬兰 Patria'),
(1079, 'M20R', '火箭炮', '奥地利 Hirtenberger'),
(1080, 'LAR', '火箭炮', '英国 BAE Systems'),
(1081, 'LAR Mk2', '火箭炮', '英国 BAE Systems'),
(1082, 'LAR Mk3', '火箭炮', '英国 BAE Systems'),
(1083, 'MLRS-UK', '火箭炮', '英国 BAE Systems'),
(1084, 'MLRS-UK Enhanced', '火箭炮', '英国 BAE Systems'),
(1085, 'GMLRS-UK', '火箭炮', '英国 BAE Systems'),
(1086, 'GMLRS-UK Extended Range', '火箭炮', '英国 BAE Systems'),
(1087, 'LRU', '火箭炮', '法国 Nexter'),
(1088, 'TRF1-MRL', '火箭炮', '法国 Nexter'),
(1089, 'MLRS-F', '火箭炮', '法国 Nexter'),
(1090, 'MARS II', '火箭炮', '德国 KMW'),
(1091, 'MARS IIB', '火箭炮', '德国 KMW'),
(1092, 'MARS III', '火箭炮', '德国 KMW'),
(1093, 'MLRS-G', '火箭炮', '德国 KMW'),
(1094, 'Teruel', '火箭炮', '意大利 OTO Melara'),
(1095, 'MLRS-I', '火箭炮', '意大利 OTO Melara'),
(1096, 'FH-70 MRL', '火箭炮', '意大利 OTO Melara');
-- 插入通用参数
INSERT INTO common_params (equipment_id, length_m, width_m, height_m, weight_kg) VALUES
(1001, 12.3, 3.0, 3.2, 45000), -- PCL-191
(1002, 11.8, 3.0, 3.2, 43000), -- PHL-03
(1003, 10.8, 2.9, 3.1, 40000), -- AR-3
(1004, 10.2, 2.8, 3.0, 32000), -- SR-5
(1005, 10.5, 2.9, 3.1, 38000), -- A-100
(1006, 9.8, 2.7, 2.9, 29000), -- WS-1B
(1007, 11.2, 2.9, 3.1, 42000), -- WS-2
(1008, 11.5, 3.0, 3.2, 43500), -- WS-3
(1009, 6.5, 2.2, 2.4, 12000), -- Type 63
(1010, 7.35, 2.40, 3.09, 13700), -- BM-21 Grad
(1011, 9.63, 2.80, 3.20, 20000), -- BM-27 Uragan
(1012, 12.1, 3.05, 3.05, 43700), -- BM-30 Smerch
(1013, 8.20, 2.50, 3.10, 19000), -- 9A52-4 Tornado
(1014, 9.50, 3.10, 3.20, 44300), -- TOS-1A
(1015, 7.0, 2.4, 3.2, 16800), -- M142 HIMARS
(1016, 6.9, 2.8, 2.7, 24756), -- M270 MLRS
(1017, 7.0, 2.8, 2.7, 25000), -- M270A1
(1018, 7.0, 2.8, 2.7, 25300), -- M270A2
(1019, 7.2, 2.5, 2.8, 12500), -- LAR-160
(1020, 8.5, 2.6, 3.0, 15800), -- EXTRA
(1021, 7.8, 2.5, 2.8, 13200), -- ACCULAR
(1022, 7.5, 2.5, 2.7, 12800), -- LYNX
(1023, 8.6, 2.8, 2.9, 23800), -- K239 Chunmoo
(1024, 6.8, 2.5, 2.7, 13500), -- K136 Kooryong
(1025, 6.5, 2.4, 2.6, 12800), -- K33
(1026, 7.2, 2.5, 2.8, 18500), -- T-122 Sakarya
(1027, 9.5, 2.9, 3.2, 26000), -- T-300 Kasirga
(1028, 10.0, 3.0, 3.3, 30000), -- TRG-300
(1029, 8.9, 2.8, 3.1, 24500), -- ASTROS II
(1030, 9.2, 2.9, 3.2, 26000), -- ASTROS 2020
(1031, 9.0, 2.8, 3.1, 25000), -- ASTROS II Mk3
(1032, 9.1, 2.9, 3.2, 25500), -- ASTROS II Mk6
(1033, 11.0, 2.8, 3.0, 27500), -- Pinaka
(1034, 11.2, 2.8, 3.0, 28000), -- Pinaka Mk-II
(1035, 11.5, 2.9, 3.1, 29000), -- Pinaka Mk-III
(1036, 11.7, 2.9, 3.1, 29500), -- Pinaka-ER
(1037, 7.5, 2.4, 2.9, 12500), -- WR-40 Langusta
(1038, 8.4, 2.5, 3.0, 19500), -- RM-70
(1039, 7.3, 2.4, 2.9, 13200), -- BM-21M
(1040, 8.8, 2.5, 3.0, 20500), -- WR-122 Langusta-2
(1041, 7.2, 2.4, 2.8, 13500), -- Valkiri
(1042, 8.5, 2.6, 3.0, 18500), -- Bateleur
(1043, 7.0, 2.4, 2.7, 12800), -- T5-45
(1044, 7.8, 2.5, 2.9, 15500), -- Mokopa
(1045, 7.3, 2.5, 2.8, 15200), -- Fajr-3
(1046, 9.0, 2.8, 3.0, 26500), -- Fajr-5
(1047, 7.8, 2.6, 2.9, 18000), -- Falaq-1
(1048, 9.2, 2.9, 3.1, 27000), -- Falaq-2
(1049, 7.0, 2.4, 2.7, 14500), -- Haseb
(1050, 8.5, 2.7, 3.0, 22000), -- Raad-1
(1051, 9.0, 2.8, 3.1, 24000), -- Raad-2
(1052, 7.5, 2.4, 2.9, 14500), -- Verba
(1053, 9.3, 2.9, 3.1, 28000), -- Vilkha
(1054, 9.5, 3.0, 3.2, 29500), -- Bureviy
(1055, 9.6, 3.0, 3.2, 30000), -- Olkha
(1056, 7.5, 2.4, 2.9, 14500), -- BelGrad
(1057, 10.2, 3.0, 3.2, 32000), -- Polonez
(1058, 10.5, 3.0, 3.2, 33500),
(1059, 12.0, 3.2, 3.4, 48000), -- Jobaria
(1060, 10.8, 3.0, 3.2, 35000), -- Desert Spider
(1061, 9.5, 2.8, 3.0, 25000), -- Hafeet
(1062, 8.5, 2.7, 3.0, 28000), -- SLWH Pegasus
(1063, 8.8, 2.8, 3.1, 29500), -- SLWH Pegasus II
(1064, 7.0, 2.4, 3.2, 16500), -- HIMARS-SG
(1065, 6.8, 2.5, 2.8, 15200), -- Type 75
(1066, 7.0, 2.8, 2.7, 24500), -- MLRS Type 99
(1067, 7.2, 2.8, 2.8, 25000), -- Type 02
(1068, 8.5, 2.5, 3.0, 19800), -- RM-70/85
(1069, 9.0, 2.7, 3.1, 22000), -- VEGA
(1070, 8.8, 2.6, 3.0, 21000), -- MORAK
(1071, 8.6, 2.5, 3.0, 19500), -- RM-70 Mod 2018
(1072, 8.8, 2.6, 3.1, 20500), -- VAMPIRE
(1073, 7.5, 2.4, 2.8, 15500), -- RH ALAN MRLS
(1074, 8.2, 2.5, 2.9, 18500), -- LRSVM Morava
(1075, 9.5, 2.8, 3.2, 25000), -- LRSVM Tamnava
(1076, 10.2, 3.0, 3.3, 28000), -- LRSVM Sumadija
(1077, 7.8, 2.5, 2.9, 16500), -- 122 RAKH 89
(1078, 8.0, 2.6, 3.0, 17500), -- 122 RAKH 91
(1079, 7.2, 2.4, 2.8, 14500), -- M20R
(1080, 7.2, 2.5, 2.8, 18500), -- LAR
(1081, 7.5, 2.6, 2.9, 19500), -- LAR Mk2
(1082, 7.8, 2.7, 3.0, 21000), -- LAR Mk3
(1083, 7.0, 2.8, 2.7, 24500), -- MLRS-UK
(1084, 7.0, 2.8, 2.7, 25000), -- MLRS-UK Enhanced
(1085, 7.0, 2.8, 2.7, 25500), -- GMLRS-UK
(1086, 7.2, 2.8, 2.7, 26000), -- GMLRS-UK Extended Range
(1087, 7.0, 2.8, 2.7, 24600), -- LRU
(1088, 6.8, 2.5, 2.8, 18500), -- TRF1-MRL
(1089, 7.0, 2.8, 2.7, 24700), -- MLRS-F
(1090, 7.0, 2.8, 2.7, 24900), -- MARS II
(1091, 7.2, 2.8, 2.7, 25300), -- MARS IIB
(1092, 7.4, 2.9, 2.8, 25800), -- MARS III
(1093, 7.0, 2.8, 2.7, 24600), -- MLRS-G
(1094, 6.8, 2.5, 2.8, 18200), -- Teruel
(1095, 7.0, 2.8, 2.7, 24500), -- MLRS-I
(1096, 6.5, 2.4, 2.7, 17500); -- FH-70 MRL
-- 插入火箭炮特有参数
INSERT INTO rocket_artillery_params (
equipment_id,
firing_angle_horizontal, -- 方向射界(度)
firing_angle_vertical, -- 高低射界(度)
rocket_length_m, -- 火箭弹长度(m)
rocket_diameter_mm, -- 火箭弹直径(mm)
rocket_weight_kg, -- 火箭弹重量(kg)
rate_of_fire, -- 射速(发/分钟)
combat_weight_kg, -- 战斗重量(kg)
speed_kmh, -- 速度(km/h)
min_range_km, -- 最小射程(km)
max_range_km, -- 最大射程(km)
mobility_type, -- 行走方式
structure_layout, -- 结构布局
engine_model, -- 发动机型号
engine_params, -- 发动机参数
power_hp, -- 功率(hp)
travel_range_km -- 行程(km)
) VALUES
(1001, 60, 65, 7.3, 370, 750, 8, 45000, 90, 40, 350, '轮式', '8x8轮式底盘', 'WP12.500', '直列六缸柴油发动机', 500, 650), -- PCL-191
(1002, 60, 65, 7.0, 300, 650, 12, 43000, 85, 20, 150, '轮式', '8x8轮式底盘', 'WP12.400', '直列六缸柴油发动机', 400, 600), -- PHL-03
(1003, 60, 65, 7.2, 370, 740, 8, 40000, 85, 50, 280, '轮式', '8x8轮式底盘', 'WP12.450', '直列六缸柴油发动机', 450, 600), -- AR-3
(1004, 60, 65, 4.5, 220, 150, 12, 32000, 90, 20, 150, '轮式', '6x6轮式盘', 'WP10.340', '直列六缸柴油发动机', 340, 650), -- SR-5
(1005, 60, 65, 6.5, 300, 400, 10, 38000, 85, 30, 120, '轮式', '8x8轮式底盘', 'WP12.400', '直列六缸柴油发动机', 400, 600), -- A-100
(1006, 60, 65, 6.0, 302, 380, 8, 29000, 90, 35, 180, '轮式', '8x8轮式底盘', 'WP10.375', '直列六缸柴油发动机', 375, 650), -- WS-1B
(1007, 60, 65, 7.0, 400, 1200, 6, 42000, 80, 70, 200, '轮式', '8x8轮式底盘', 'WP12.450', '直列六缸柴油发动机', 450, 600), -- WS-2
(1008, 60, 65, 7.2, 400, 1250, 6, 43500, 80, 70, 220, '轮式', '8x8轮式底盘', 'WP12.450', '直列六缸柴油发动机', 450, 600), -- WS-3
(1009, 45, 55, 2.0, 130, 18.8, 12, 12000, 75, 2, 20, '轮式', '6x6轮式底盘', 'YC6J220-20', '直列六缸柴油发动机', 220, 500), -- Type 63
(1010, 70, 55, 2.87, 122, 66.6, 40, 13700, 75, 1.6, 20.4, '轮式', '6x6轮式底盘', 'V-8水冷柴油机', '240马力柴油发动机', 240, 750), -- BM-21 Grad
(1011, 60, 55, 4.80, 220, 280.0, 16, 20000, 65, 8.0, 35.0, '轮式', '8x8轮式底盘', 'YaMZ-238', '柴油发动机', 300, 500), -- BM-27 Uragan
(1012, 60, 55, 7.60, 300, 800.0, 12, 43700, 60, 20.0, 90.0, '轮式', '8x8轮式底盘', 'YaMZ-8424.10', '柴油发动机', 400, 850), -- BM-30 Smerch
(1013, 60, 50, 4.80, 220, 250.0, 30, 19000, 70, 5.0, 40.0, '轮式', '6x6轮式底盘', 'YaMZ-7511.10', '柴油发动机', 400, 600), -- 9A52-4 Tornado
(1014, 30, 45, 3.30, 220, 217.0, 24, 44300, 60, 0.4, 6.0, '履带式', '履带式装甲底盘', 'V-84MS', '柴油发动机', 840, 550), -- TOS-1A
(1015, 60, 65, 3.94, 227, 307, 6, 16800, 85, 8, 80, '轮式', '6x6轮式底盘', 'Caterpillar C7', '涡轮增压柴油发动机', 400, 480),
(1016, 60, 65, 3.94, 227, 307, 12, 24756, 64, 8, 80, '履带式', '履带式底盘', 'Cummins VTA-903', '涡轮增压柴油发动机', 500, 480),
(1017, 60, 65, 3.94, 227, 307, 12, 25000, 64, 8, 80, '履带式', '履带式底盘', 'Cummins VTA-903', '涡轮增压柴油发动机', 500, 480),
(1018, 60, 65, 3.94, 227, 307, 12, 25300, 64, 8, 80, '履带式', '履带式底盘', 'Cummins VTA-903', '涡轮增压柴油发动机', 500, 480),
(1019, 60, 65, 3.30, 160, 110, 18, 12500, 80, 12, 45, '轮式', '4x4轮式底盘', 'Deutz BF6L913', '涡轮增压柴油发动机', 270, 500), -- LAR-160
(1020, 60, 65, 4.00, 306, 390, 8, 15800, 85, 20, 150, '轮式', '6x6轮式底盘', 'Deutz BF6M1015', '涡轮增压柴油发动机', 400, 600), -- EXTRA
(1021, 60, 65, 3.80, 160, 120, 12, 13200, 80, 12, 40, '轮式', '4x4轮式底盘', 'Deutz BF6L913', '涡轮增压柴油发动机', 270, 500), -- ACCULAR
(1022, 60, 65, 3.20, 122, 65, 20, 12800, 85, 8, 35, '轮式', '4x4轮式底盘', 'Deutz BF6L913', '涡轮增压柴油发动机', 270, 500),
(1023, 60, 65, 4.90, 239, 300, 12, 23800, 70, 10, 80, '轮式', '8x8轮式底盘', 'Doosan DL08K', '直列六缸柴油发动机', 450, 600), -- K239 Chunmoo
(1024, 50, 60, 2.90, 130, 68, 36, 13500, 75, 3, 23, '轮式', '6x6轮式底盘', 'Doosan DL06K', '直列六缸柴油发动机', 280, 500), -- K136 Kooryong
(1025, 45, 55, 2.80, 130, 65, 40, 12800, 80, 2.5, 20, '轮式', '6x6轮式底盘', 'Doosan DL06K', '直列六缸柴油发动机', 260, 480),
(1026, 60, 65, 3.30, 122, 65, 40, 18500, 85, 3, 40, '轮式', '6x6轮式底盘', 'Deutz TCD2015', '涡轮增压柴油发动机', 360, 550), -- T-122 Sakarya
(1027, 60, 65, 5.20, 300, 585, 12, 26000, 80, 20, 120, '轮式', '8x8轮式底盘', 'Deutz TCD2020', '涡轮增压柴油发动机', 450, 600), -- T-300 Kasirga
(1028, 60, 65, 5.40, 300, 600, 12, 30000, 80, 30, 150, '轮式', '8x8轮式底盘', 'Deutz TCD2020', '涡轮增压柴油发动机', 450, 600), -- TRG-300
(1029, 60, 65, 4.50, 300, 550, 12, 24500, 80, 15, 90, '轮式', '6x6轮式底盘', 'Mercedes-Benz OM 366 LA', '涡轮增压柴油发动机', 380, 500), -- ASTROS II
(1030, 60, 65, 4.80, 300, 580, 12, 26000, 85, 20, 120, '轮式', '6x6轮式底盘', 'Mercedes-Benz OM 926 LA', '涡轮增压柴油发动机', 420, 600), -- ASTROS 2020
(1031, 60, 65, 4.60, 300, 560, 12, 25000, 82, 18, 100, '轮式', '6x6轮式底盘', 'Mercedes-Benz OM 366 LA', '涡轮增压柴油发动机', 400, 550), -- ASTROS II Mk3
(1032, 60, 65, 4.70, 300, 570, 12, 25500, 83, 20, 110, '轮式', '6x6轮式底盘', 'Mercedes-Benz OM 926 LA', '涡轮增压柴油发动机', 410, 580), -- ASTROS II Mk6
(1033, 60, 65, 5.20, 214, 276, 12, 27500, 80, 5, 40, '轮式', '8x8轮式底盘', 'Tata Cummins 6BT', '涡轮增压柴油发动机', 380, 500), -- Pinaka
(1034, 60, 65, 5.40, 214, 280, 12, 28000, 80, 8, 60, '轮式', '8x8轮式底盘', 'Tata Cummins ISBe', '涡轮增压柴油发动机', 400, 550), -- Pinaka Mk-II
(1035, 60, 65, 5.60, 214, 285, 12, 29000, 80, 10, 75, '轮式', '8x8轮式底盘', 'Tata Cummins ISBe', '涡轮增压柴油发动机', 420, 600), -- Pinaka Mk-III
(1036, 60, 65, 5.80, 214, 290, 12, 29500, 80, 12, 90, '轮式', '8x8轮式底盘', 'Tata Cummins ISBe', '涡轮增压柴油发动机', 420, 600), -- Pinaka-ER
(1037, 60, 55, 2.85, 122, 68, 40, 12500, 85, 3, 42, '轮式', '6x6轮式底盘', 'IVECO Tector', '涡轮增压柴油发动机', 320, 650), -- WR-40 Langusta
(1038, 60, 55, 3.00, 122, 70, 40, 19500, 80, 3, 45, '轮式', '8x8轮式底盘', 'Tatra T3-930', '涡轮增压柴油发动机', 350, 600), -- RM-70
(1039, 60, 55, 2.87, 122, 66, 40, 13200, 85, 3, 40, '轮式', '6x6轮式底盘', 'IVECO Tector', '涡轮增压柴油发动机', 320, 600), -- BM-21M
(1040, 60, 55, 4.70, 122, 250, 30, 20500, 80, 5, 60, '轮式', '8x8轮式底盘', 'IVECO Cursor', '涡轮增压柴油发动机', 400, 650), -- WR-122 Langusta-2
(1041, 60, 65, 3.20, 127, 68, 24, 13500, 85, 8, 22, '轮式', '4x4轮式底盘', 'ADE 352T', '涡轮增压柴油发动机', 280, 500), -- Valkiri
(1042, 60, 65, 4.50, 155, 110, 18, 18500, 80, 10, 35, '轮式', '6x6轮式底盘', 'ADE 407T', '涡轮增压柴油发动机', 350, 600), -- Bateleur
(1043, 55, 65, 2.80, 127, 45, 30, 12800, 90, 5, 45, '轮式', '4x4轮式底盘', 'ADE 352T', '涡轮增压柴油发动机', 270, 550), -- T5-45
(1044, 60, 65, 3.50, 140, 85, 20, 15500, 85, 8, 30, '轮式', '6x6轮式底盘', 'ADE 366T', '涡轮增压柴油发动机', 320, 580),
(1045, 60, 65, 3.30, 240, 90, 12, 15200, 80, 5, 43, '轮式', '6x6轮式底盘', 'IVECO Tector', '涡轮增压柴油发动机', 310, 500), -- Fajr-3
(1046, 60, 65, 6.50, 333, 915, 4, 26500, 75, 8, 75, '轮式', '8x8轮式底盘', 'IVECO Cursor', '涡轮增压柴油发动机', 420, 600), -- Fajr-5
(1047, 60, 65, 4.20, 240, 110, 8, 18000, 80, 6, 50, '轮式', '6x6轮式底盘', 'IVECO Tector', '涡轮增压柴油发动机', 350, 550), -- Falaq-1
(1048, 60, 65, 6.80, 333, 950, 4, 27000, 75, 10, 80, '轮式', '8x8轮式底盘', 'IVECO Cursor', '涡轮增压柴油发动机', 450, 600), -- Falaq-2
(1049, 60, 65, 3.10, 240, 85, 12, 14500, 85, 5, 40, '轮式', '6x6轮式底盘', 'IVECO Tector', '涡轮增压柴油发动机', 300, 500), -- Haseb
(1050, 60, 65, 5.50, 333, 750, 6, 22000, 80, 8, 65, '轮式', '8x8轮式底盘', 'IVECO Cursor', '涡轮增压柴油发动机', 400, 580), -- Raad-1
(1051, 60, 65, 6.00, 333, 800, 6, 24000, 80, 10, 70, '轮式', '8x8轮式底盘', 'IVECO Cursor', '涡轮增压柴油发动机', 420, 600), -- Raad-2
(1052, 60, 55, 2.85, 122, 68, 40, 14500, 85, 3, 40, '轮式', '6x6轮式底盘', 'YaMZ-238', '涡轮增压柴油发动机', 330, 600), -- Verba
(1053, 60, 65, 7.60, 300, 800, 8, 28000, 80, 30, 110, '轮式', '8x8轮式底盘', 'YaMZ-7511', '涡轮增压柴油发动机', 420, 650), -- Vilkha
(1054, 60, 65, 7.80, 300, 850, 8, 29500, 80, 35, 130, '轮式', '8x8轮式底盘', 'YaMZ-7511', '涡轮增压柴油发动机', 450, 650), -- Bureviy
(1055, 60, 65, 7.90, 300, 870, 8, 30000, 80, 40, 140, '轮式', '8x8轮式底盘', 'YaMZ-7511', '涡轮增压柴油发动机', 450, 650), -- Olkha
(1056, 60, 55, 2.85, 122, 68, 40, 14500, 85, 3, 40, '轮式', '6x6轮式底盘', 'YaMZ-238', '涡轮增压柴油发动机', 330, 600), -- BelGrad
(1057, 60, 65, 7.50, 301, 750, 8, 32000, 85, 50, 200, '轮式', '8x8轮式底盘', 'YaMZ-7511', '涡轮增压柴油发动机', 450, 650), -- Polonez
(1058, 60, 65, 7.80, 301, 800, 8, 33500, 85, 50, 290, '轮式', '8x8轮式底盘', 'YaMZ-7511', '涡轮增压柴油发动机', 500, 650),
(1059, 60, 65, 8.20, 300, 850, 16, 48000, 75, 30, 170, '轮式', '8x8轮式底盘', 'MTU 8V199', '涡轮增压柴油发动机', 600, 700), -- Jobaria
(1060, 60, 65, 7.50, 300, 780, 12, 35000, 80, 25, 150, '轮式', '8x8轮式底盘', 'MTU 6V199', '涡轮增压柴油发动机', 500, 650), -- Desert Spider
(1061, 60, 65, 6.80, 220, 350, 12, 25000, 85, 15, 80, '轮式', '6x6轮式底盘', 'MTU 6V199', '涡轮增压柴油发动机', 400, 600), -- Hafeet
(1062, 60, 65, 4.50, 227, 280, 12, 28000, 80, 8, 50, '轮式', '8x8轮式底盘', 'MTU 6V199', '涡轮增压柴油发动机', 400, 600), -- SLWH Pegasus
(1063, 60, 65, 4.80, 227, 290, 12, 29500, 80, 8, 70, '轮式', '8x8轮式底盘', 'MTU 8V199', '涡轮增压柴油发动机', 450, 650), -- SLWH Pegasus II
(1064, 60, 65, 3.94, 227, 307, 6, 16500, 85, 8, 80, '轮式', '6x6轮式底盘', 'MTU 6V199', '涡轮增压柴油发动机', 400, 500), -- HIMARS-SG
(1065, 50, 65, 2.90, 130, 70, 30, 15200, 80, 3, 25, '轮式', '6x6轮式底盘', 'Isuzu 6HE1', '涡轮增压柴油发动机', 280, 500), -- Type 75
(1066, 60, 65, 3.94, 227, 307, 12, 24500, 70, 8, 80, '履带式', '履带式底盘', 'Mitsubishi 6D24-TLE2A', '涡轮增压柴油发动机', 450, 400), -- MLRS Type 99
(1067, 60, 65, 4.00, 227, 310, 12, 25000, 70, 8, 90, '履带式', '履带式底盘', 'Mitsubishi 6D24-TLE3A', '涡轮增压柴油发动机', 480, 450), -- Type 02
(1068, 60, 55, 2.87, 122, 68, 40, 19800, 80, 3, 45, '轮式', '8x8轮式底盘', 'Tatra T3-930', '涡轮增压柴油发动机', 350, 600), -- RM-70/85
(1069, 60, 55, 3.20, 122, 75, 40, 22000, 85, 5, 50, '轮式', '8x8轮式底盘', 'Tatra T3-930', '涡轮增压柴油发动机', 400, 650), -- VEGA
(1070, 60, 55, 3.10, 122, 72, 40, 21000, 85, 4, 48, '轮式', '8x8轮式底盘', 'Tatra T3-930', '涡轮增压柴油发动机', 400, 650), -- MORAK
(1071, 60, 55, 2.90, 122, 70, 40, 19500, 85, 3, 45, '轮式', '8x8轮式底盘', 'Tatra T3-930', '涡轮增压柴油发动机', 360, 600), -- RM-70 Mod 2018
(1072, 60, 55, 3.00, 122, 72, 40, 20500, 85, 4, 48, '轮式', '8x8轮式底盘', 'Tatra T3-930', '涡轮增压柴油发动机', 380, 650), -- VAMPIRE
(1073, 60, 55, 2.80, 122, 65, 36, 15500, 80, 3, 40, '轮式', '6x6轮式底盘', 'Deutz TCD2015', '涡轮增压柴油发动机', 320, 550), -- RH ALAN MRLS
(1074, 60, 55, 2.85, 122, 68, 38, 18500, 85, 3, 42, '轮式', '8x8轮式底盘', 'Kamaz 740.50', '涡轮增压柴油发动机', 360, 600), -- LRSVM Morava
(1075, 60, 65, 5.20, 262, 400, 12, 25000, 80, 15, 70, '轮式', '8x8轮式底盘', 'Kamaz 740.60', '涡轮增压柴油发动机', 420, 650), -- LRSVM Tamnava
(1076, 60, 65, 6.10, 400, 800, 6, 28000, 75, 25, 285, '轮式', '8x8轮式底盘', 'Kamaz 740.70', '涡轮增压柴油发动机', 450, 700), -- LRSVM Sumadija
(1077, 60, 55, 2.85, 122, 66, 36, 16500, 80, 3, 40, '轮式', '6x6轮式底盘', 'Sisu E11', '涡轮增压柴油发动机', 330, 580), -- 122 RAKH 89
(1078, 60, 55, 2.90, 122, 68, 38, 17500, 82, 3, 42, '轮式', '6x6轮式底盘', 'Sisu E12', '涡轮增压柴油发动机', 350, 600), -- 122 RAKH 91
(1079, 60, 55, 2.75, 122, 64, 36, 14500, 80, 3, 38, '轮式', '6x6轮式底盘', 'MAN D0836', '涡轮增压柴油发动机', 320, 550), -- M20R
(1080, 60, 65, 3.20, 160, 110, 18, 18500, 80, 12, 45, '轮式', '4x4轮式底盘', 'Perkins CV8', '涡轮增压柴油发动机', 350, 500), -- LAR
(1081, 60, 65, 3.50, 160, 120, 18, 19500, 85, 15, 50, '轮式', '6x6轮式底盘', 'Perkins CV8TT', '涡轮增压柴油发动机', 400, 550), -- LAR Mk2
(1082, 60, 65, 3.80, 160, 130, 18, 21000, 85, 15, 60, '轮式', '6x6轮式底盘', 'Perkins CV12', '涡轮增压柴油发动机', 450, 600), -- LAR Mk3
(1083, 60, 65, 3.94, 227, 307, 12, 24500, 64, 8, 80, '履带式', '履带式底盘', 'Cummins VTA-903', '涡轮增压柴油发动机', 500, 480), -- MLRS-UK
(1084, 60, 65, 3.94, 227, 307, 12, 25000, 64, 8, 84, '履带式', '履带式底盘', 'Cummins VTA-903T', '涡轮增压柴油发动机', 500, 480), -- MLRS-UK Enhanced
(1085, 60, 65, 3.94, 227, 307, 12, 25500, 64, 8, 84, '履带式', '履带式底盘', 'Cummins VTA-903T', '涡轮增压柴油发动机', 500, 480), -- GMLRS-UK
(1086, 60, 65, 4.10, 227, 320, 12, 26000, 64, 8, 150, '履带式', '履带式底盘', 'Cummins VTA-903T', '涡轮增压柴油发动机', 500, 480), -- GMLRS-UK Extended Range
(1087, 60, 65, 3.94, 227, 307, 12, 24600, 64, 8, 84, '履带式', '履带式底盘', 'Cummins VTA-903', '涡轮增压柴油发动机', 500, 480), -- LRU
(1088, 60, 65, 2.80, 122, 66, 40, 18500, 85, 3, 40, '轮式', '6x6轮式底盘', 'Renault DXi7', '涡轮增压柴油发动机', 340, 600), -- TRF1-MRL
(1089, 60, 65, 3.94, 227, 307, 12, 24700, 64, 8, 84, '履带式', '履带式底盘', 'Cummins VTA-903', '涡轮增压柴油发动机', 500, 480), -- MLRS-F
(1090, 60, 65, 3.94, 227, 307, 12, 24900, 64, 8, 84, '履带式', '履带式底盘', 'MTU MT881', '涡轮增压柴油发动机', 500, 480), -- MARS II
(1091, 60, 65, 4.10, 227, 320, 12, 25300, 64, 8, 150, '履带式', '履带式底盘', 'MTU MT881', '涡轮增压柴油发动机', 500, 480), -- MARS IIB
(1092, 60, 65, 4.20, 227, 330, 12, 25800, 64, 10, 180, '履带式', '履带式底盘', 'MTU MT883', '涡轮增压柴油发动机', 550, 500), -- MARS III
(1093, 60, 65, 3.94, 227, 307, 12, 24600, 64, 8, 84, '履带式', '履带式底盘', 'MTU MT881', '涡轮增压柴油发动机', 500, 480), -- MLRS-G
(1094, 60, 65, 2.85, 122, 68, 40, 18200, 85, 3, 40, '轮式', '6x6轮式底盘', 'IVECO Cursor', '涡轮增压柴油发动机', 350, 600), -- Teruel
(1095, 60, 65, 3.94, 227, 307, 12, 24500, 64, 8, 84, '履带式', '履带式底盘', 'IVECO Vector', '涡轮增压柴油发动机', 500, 480), -- MLRS-I
(1096, 60, 65, 2.80, 122, 65, 36, 17500, 80, 3, 38, '轮式', '6x6轮式底盘', 'IVECO Tector', '涡轮增压柴油发动机', 320, 550); -- FH-70 MRL
-- 插入成本数据(单位:美元)
-- 价格估算依据:
-- 1. 公开采购数据
-- 2. 技术复杂度
-- 3. 制造商水平
-- 4. 生产时间
-- 5. 市场定位
INSERT INTO cost_data (equipment_id, actual_cost) VALUES
-- 中国系列(价格适中,性价比高)
(1001, 4500000), -- PCL-191较新型号价格较高
(1002, 3800000), -- PHL-03
(1003, 4200000), -- AR-3远程型号
(1004, 2800000), -- SR-5
(1005, 3200000), -- A-100
(1006, 2500000), -- WS-1B
(1007, 3500000), -- WS-2
(1008, 3800000), -- WS-3
(1009, 800000), -- Type 63老式装备
-- 俄罗斯系列(价格相对较低)
(1010, 900000), -- BM-21 Grad经典型号
(1011, 2200000), -- BM-27 Uragan
(1012, 4200000), -- BM-30 Smerch重型系统
(1013, 2500000), -- 9A52-4 Tornado
(1014, 3500000), -- TOS-1A特种火箭炮
-- 美国系列(价格较高)
(1015, 5500000), -- M142 HIMARS
(1016, 6000000), -- M270 MLRS
(1017, 6500000), -- M270A1
(1018, 7000000), -- M270A2
-- 以色列系列(技术先进,价格高)
(1019, 3200000), -- LAR-160
(1020, 4500000), -- EXTRA
(1021, 3800000), -- ACCULAR
(1022, 2800000), -- LYNX
-- 韩国系列(价格适中偏高)
(1023, 4800000), -- K239 Chunmoo
(1024, 1800000), -- K136 Kooryong
(1025, 1500000), -- K33
-- 土耳其系列(价格适中)
(1026, 2200000), -- T-122 Sakarya
(1027, 3500000), -- T-300 Kasirga
(1028, 4000000), -- TRG-300
-- 巴西系列(价格适中)
(1029, 3200000), -- ASTROS II
(1030, 3800000), -- ASTROS 2020
(1031, 3500000), -- ASTROS II Mk3
(1032, 3600000), -- ASTROS II Mk6
-- 印度系列(价格较低)
(1033, 2800000), -- Pinaka
(1034, 3200000), -- Pinaka Mk-II
(1035, 3500000), -- Pinaka Mk-III
(1036, 3800000), -- Pinaka-ER
-- 波兰系列(价格适中偏低)
(1037, 1800000), -- WR-40 Langusta
(1038, 2200000), -- RM-70
(1039, 1500000), -- BM-21M
(1040, 2500000), -- WR-122 Langusta-2
-- 南非系列(价格较低)
(1041, 1500000), -- Valkiri
(1042, 2200000), -- Bateleur
(1043, 1800000), -- T5-45
(1044, 2000000), -- Mokopa
-- 伊朗系列(价格较低)
(1045, 1200000), -- Fajr-3
(1046, 2500000), -- Fajr-5
(1047, 1500000), -- Falaq-1
(1048, 2800000), -- Falaq-2
(1049, 1200000), -- Haseb
(1050, 2200000), -- Raad-1
(1051, 2500000), -- Raad-2
-- 乌克兰系列(价格适中偏低)
(1052, 1500000), -- Verba
(1053, 3200000), -- Vilkha
(1054, 3500000), -- Bureviy
(1055, 3800000), -- Olkha
-- 白俄罗斯系列(价格适中)
(1056, 1500000), -- BelGrad
(1057, 3500000), -- Polonez
(1058, 4000000), -- Polonez-M
-- 阿联酋系列(价格较高)
(1059, 5500000), -- Jobaria
(1060, 4200000), -- Desert Spider
(1061, 3500000), -- Hafeet
-- 新加坡系列(价格较高)
(1062, 3800000), -- SLWH Pegasus
(1063, 4200000), -- SLWH Pegasus II
(1064, 5000000), -- HIMARS-SG
-- 日本系列(价格较高)
(1065, 2200000), -- Type 75
(1066, 5500000), -- MLRS Type 99
(1067, 6000000), -- Type 02
(1068, 2200000), -- RM-70/85
(1069, 2800000), -- VEGA
(1070, 2500000), -- MORAK
(1071, 6000000), -- RM-70 Mod 2018
(1072, 6000000), -- VAMPIRE
(1073, 6000000), -- RH ALAN MRLS
(1074, 6000000), -- LRSVM Morava
(1075, 6000000), -- LRSVM Tamnava
(1076, 6000000), -- LRSVM Sumadija
(1077, 6000000), -- 122 RAKH 89
(1078, 6000000), -- 122 RAKH 91
(1079, 6000000), -- M20R
(1080, 2800000), -- LAR
(1081, 3200000), -- LAR Mk2
(1082, 3800000), -- LAR Mk3
(1083, 5500000), -- MLRS-UK
(1084, 5800000), -- MLRS-UK Enhanced
(1085, 6200000), -- GMLRS-UK
(1086, 6800000), -- GMLRS-UK Extended Range
(1087, 5600000), -- LRU
(1088, 2200000), -- TRF1-MRL
(1089, 5500000), -- MLRS-F
(1090, 5800000), -- MARS II
(1091, 6500000), -- MARS IIB
(1092, 7200000), -- MARS III
(1093, 5500000), -- MLRS-G
(1094, 2200000), -- Teruel
(1095, 5500000), -- MLRS-I
(1096, 2000000); -- FH-70 MRL
-- 创建数据集
INSERT INTO datasets (id, name, description, equipment_type, purpose) VALUES
(3, '火箭炮训练集 2024', '包含77个火箭炮型号覆盖主要制造国、不同口径和价格区间', '火箭炮', '训练'),
(4, '火箭炮验证集 2024', '包含19个火箭炮型号用于验证模型性能', '火箭炮', '验证');
-- 训练集约80%的数据77个型号
INSERT INTO dataset_equipment (dataset_id, equipment_id) VALUES
-- 中国系列7/9
(3, 1001), (3, 1002), (3, 1003), (3, 1004), (3, 1005), (3, 1006), (3, 1007),
-- 俄罗斯系列4/5
(3, 1010), (3, 1011), (3, 1012), (3, 1013),
-- 美国系列3/4
(3, 1015), (3, 1016), (3, 1017),
-- 以色列系列3/4
(3, 1019), (3, 1020), (3, 1021),
-- 韩国系列2/3
(3, 1023), (3, 1024),
-- 土耳其系列2/3
(3, 1026), (3, 1027),
-- 巴西系列3/4
(3, 1029), (3, 1030), (3, 1031),
-- 印度系列3/4
(3, 1033), (3, 1034), (3, 1035),
-- 波兰系列3/4
(3, 1037), (3, 1038), (3, 1039),
-- 南非系列3/4
(3, 1041), (3, 1042), (3, 1043),
-- 伊朗系列6/7
(3, 1045), (3, 1046), (3, 1047), (3, 1048), (3, 1049), (3, 1050),
-- 乌克兰系列3/4
(3, 1052), (3, 1053), (3, 1054),
-- 白俄罗斯系列2/3
(3, 1056), (3, 1057),
-- 阿联酋系列2/3
(3, 1059), (3, 1060),
-- 新加坡系列2/3
(3, 1062), (3, 1063),
-- 日本系列2/3
(3, 1065), (3, 1066),
-- 斯洛伐克系列2/3
(3, 1068), (3, 1069),
-- 捷克系列2/2
(3, 1071), (3, 1072),
-- 克罗地亚系列1/1
(3, 1073),
-- 塞尔维亚系列2/3
(3, 1074), (3, 1075),
-- 芬兰系列2/2
(3, 1077), (3, 1078),
-- 奥地利系列1/1
(3, 1079),
-- 英国系列5/7
(3, 1080), (3, 1081), (3, 1082), (3, 1083), (3, 1084),
-- 法国系列2/3
(3, 1087), (3, 1088),
-- 德国系列3/4
(3, 1090), (3, 1091), (3, 1092),
-- 意大利系列2/3
(3, 1094), (3, 1095);
-- 验证集约20%的数据19个型号
INSERT INTO dataset_equipment (dataset_id, equipment_id) VALUES
-- 中国系列2/9
(4, 1008), (4, 1009),
-- 俄罗斯系列1/5
(4, 1014),
-- 美国系列1/4
(4, 1018),
-- 以色列系列1/4
(4, 1022),
-- 韩国系列1/3
(4, 1025),
-- 土耳其系列1/3
(4, 1028),
-- 巴西系列1/4
(4, 1032),
-- 印度系列1/4
(4, 1036),
-- 波兰系列1/4
(4, 1040),
-- 南非系列1/4
(4, 1044),
-- 伊朗系列1/7
(4, 1051),
-- 乌克兰系列1/4
(4, 1055),
-- 白俄罗斯系列1/3
(4, 1058),
-- 阿联酋系列1/3
(4, 1061),
-- 新加坡系列1/3
(4, 1064),
-- 日本系列1/3
(4, 1067),
-- 英国系列2/7
(4, 1085), (4, 1086),
-- 德国系列1/4
(4, 1093);
-- 更新数据集描述
UPDATE datasets
SET description = '包含77个火箭炮型号覆盖18个国家/地区的产品包括122mm、220mm、300mm等不同口径价格区间从80万到720万美元'
WHERE id = 3;
UPDATE datasets
SET description = '包含19个火箭炮型号覆盖所有主要制造国包括不同口径和价格区间的代表性产品'
WHERE id = 4;
-- 更新火箭炮特征工程字段
-- 计算说明:
-- 1. fire_density: 射速/(火箭弹直径²/1000000),单位:发/分钟/平方米
-- 2. range_ratio: 最大射程/最小射程,无量纲
-- 3. 评分标准1-10分分数越高性能越好
UPDATE rocket_artillery_params r
SET
-- 火力密度(发射次数/分钟/平方米)
fire_density = r.rate_of_fire / (r.rocket_diameter_mm * r.rocket_diameter_mm / 1000000),
-- 射程比(最大射程/最小射程)
range_ratio = r.max_range_km / NULLIF(r.min_range_km, 0),
-- 机动性评分(1-10)
mobility_score =
CASE
WHEN r.mobility_type = '轮式' AND r.structure_layout LIKE '%8x8%' THEN 9
WHEN r.mobility_type = '轮式' AND r.structure_layout LIKE '%6x6%' THEN 8
WHEN r.mobility_type = '轮式' AND r.structure_layout LIKE '%4x4%' THEN 7
WHEN r.mobility_type = '履带式' THEN 6
ELSE 5
END,
-- 战备状态评分(1-10)
combat_readiness_score =
CASE
WHEN r.rate_of_fire >= 30 THEN 10
WHEN r.rate_of_fire >= 20 THEN 8
WHEN r.rate_of_fire >= 10 THEN 6
ELSE 4
END,
-- 火箭弹功重比
rocket_power_ratio = r.rocket_weight_kg / NULLIF(r.rocket_length_m, 0),
-- 平台效率(射/战斗重量)
platform_efficiency = r.rate_of_fire / NULLIF(r.combat_weight_kg, 0) * 1000,
-- 部署评分(1-10)
deployment_score =
CASE
WHEN r.mobility_type = '轮式' AND r.rate_of_fire >= 20 THEN 9
WHEN r.mobility_type = '轮式' AND r.rate_of_fire >= 10 THEN 8
WHEN r.mobility_type = '履带式' AND r.rate_of_fire >= 20 THEN 7
WHEN r.mobility_type = '履带式' AND r.rate_of_fire >= 10 THEN 6
ELSE 5
END,
-- 地形适应性评分(1-10)
terrain_adaptability_score =
CASE
WHEN r.mobility_type = '履带式' THEN 9
WHEN r.mobility_type = '轮式' AND r.structure_layout LIKE '%8x8%' THEN 8
WHEN r.mobility_type = '轮式' AND r.structure_layout LIKE '%6x6%' THEN 7
WHEN r.mobility_type = '轮式' AND r.structure_layout LIKE '%4x4%' THEN 6
ELSE 5
END;

View File

@ -100,9 +100,7 @@ def predict_cost():
@api_bp.route('/analyze-features', methods=['POST'])
def analyze_features():
"""
基于数据集进行特征分析
"""
"""基于数据集进行特征分析"""
try:
data = request.get_json()
dataset_id = data.get('dataset_id')
@ -142,46 +140,78 @@ def analyze_features():
logger.info(f"Feature names: {feature_names}")
# 获取数据集中的装备数据
if dataset['equipment_type'] == '巡飞弹':
if dataset['equipment_type'] == '火箭炮':
cursor.execute("""
SELECT
e.name,
e.*,
cp.*,
lmp.*,
cd.actual_cost,
e.id,
cp.length_m,
cp.width_m,
cp.height_m,
cp.weight_kg,
cp.max_range_km,
rap.firing_angle_horizontal,
rap.firing_angle_vertical,
rap.rocket_length_m,
rap.rocket_diameter_mm,
rap.rocket_weight_kg,
rap.rate_of_fire,
rap.combat_weight_kg,
rap.speed_kmh,
rap.min_range_km,
rap.mobility_type,
rap.structure_layout,
rap.engine_model,
rap.power_hp,
rap.travel_range_km,
rap.fire_density,
rap.range_ratio,
rap.mobility_score,
rap.combat_readiness_score,
rap.rocket_power_ratio,
rap.platform_efficiency,
rap.deployment_score,
rap.terrain_adaptability_score,
cd.actual_cost
FROM equipment e
JOIN dataset_equipment de ON e.id = de.equipment_id
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN rocket_artillery_params rap ON e.id = rap.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE de.dataset_id = %s
AND cd.actual_cost IS NOT NULL
ORDER BY e.id
""", (dataset_id,))
else:
cursor.execute("""
SELECT
e.name,
e.id,
cp.length_m,
cp.width_m,
cp.height_m,
cp.weight_kg,
cp.max_range_km,
lmp.wingspan_m,
lmp.warhead_weight_kg,
lmp.max_speed_ms,
lmp.cruise_speed_kmh,
lmp.endurance_min,
lmp.max_payload_kg,
lmp.ceiling_altitude_m,
lmp.combat_radius_km,
lmp.engine_power_kw,
lmp.engine_thrust_n,
lmp.datalink_range_km,
lmp.guidance_accuracy_m,
lmp.min_altitude_m,
lmp.max_altitude_m,
lmp.length_width_ratio,
lmp.weight_range_ratio,
lmp.speed_weight_ratio,
lmp.guidance_system_score,
lmp.warhead_power_score,
lmp.engine_power_kw,
lmp.engine_thrust_n,
lmp.min_altitude_m,
lmp.max_altitude_m
FROM equipment e
JOIN dataset_equipment de ON e.id = de.equipment_id
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN loitering_munition_params lmp ON e.id = lmp.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE de.dataset_id = %s
AND cd.actual_cost IS NOT NULL
""", (dataset_id,))
else:
cursor.execute("""
SELECT e.name,
e.*, cp.*, lmp.*,
cp.max_range_km,
lmp.length_width_ratio,
lmp.weight_range_ratio,
lmp.speed_weight_ratio,
lmp.guidance_system_score,
lmp.warhead_power_score,
lmp.engine_power_kw,
lmp.engine_thrust_n,
lmp.min_altitude_m,
lmp.max_altitude_m,
cd.actual_cost
cd.actual_cost
FROM equipment e
JOIN dataset_equipment de ON e.id = de.equipment_id
LEFT JOIN common_params cp ON e.id = cp.equipment_id
@ -189,58 +219,83 @@ def analyze_features():
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE de.dataset_id = %s
AND cd.actual_cost IS NOT NULL
ORDER BY e.id
""", (dataset_id,))
equipment_data = cursor.fetchall()
logger.info(f"Found {len(equipment_data)} equipment records")
if not equipment_data:
logger.warning("No valid equipment data found in dataset")
return jsonify({'error': '数据集没有有效的成本数据'}), 400
# 提取装备名称列表
equipment_names = [item['name'] for item in equipment_data]
# 准备特征和目标值
# 提取特征数据和目标值
features = []
target = []
equipment_names = [] # 新增:存储装备名称
# 提取特征和目标值
targets = []
for item in equipment_data:
feature_values = []
equipment_names.append(item['name']) # 保存装备名称
for name in feature_names:
value = item.get(name)
try:
feature_values.append(float(value) if value is not None else 0)
except (ValueError, TypeError) as e:
logger.error(f"Error converting value for feature {name}: {value}")
return jsonify({'error': f'特征 {name} 的值 {value} 无法转换为数值'}), 400
for feature in feature_names:
value = item.get(feature)
feature_values.append(float(value) if value is not None else 0)
features.append(feature_values)
target.append(float(item['actual_cost']))
targets.append(float(item['actual_cost']))
# 调用特征分析方法
result = analyzer.analyze_features(features, target, feature_names)
# 进行特征分析
result = analyzer.analyze_features(features, targets, feature_names)
# 如果是巡飞弹类型,添加额外的数据
# 添加装备名称列表到结果中
result['equipment_names'] = equipment_names
# 如果是火箭炮,添加额外的分析数据
if dataset['equipment_type'] == '火箭炮':
rocket_data = {
'fire_density': [float(item['fire_density']) if item['fire_density'] is not None else 0 for item in equipment_data],
'range_ratio': [float(item['range_ratio']) if item['range_ratio'] is not None else 0 for item in equipment_data],
'rate_of_fire': [float(item['rate_of_fire']) if item['rate_of_fire'] is not None else 0 for item in equipment_data],
'max_range_km': [float(item['max_range_km']) if item['max_range_km'] is not None else 0 for item in equipment_data],
'rocket_weight_kg': [float(item['rocket_weight_kg']) if item['rocket_weight_kg'] is not None else 0 for item in equipment_data],
'rocket_diameter_mm': [float(item['rocket_diameter_mm']) if item['rocket_diameter_mm'] is not None else 0 for item in equipment_data],
'rocket_length_m': [float(item['rocket_length_m']) if item['rocket_length_m'] is not None else 0 for item in equipment_data],
'mobility_score': [float(item['mobility_score']) if item['mobility_score'] is not None else 0 for item in equipment_data],
'deployment_score': [float(item['deployment_score']) if item['deployment_score'] is not None else 0 for item in equipment_data],
'terrain_adaptability_score': [float(item['terrain_adaptability_score']) if item['terrain_adaptability_score'] is not None else 0 for item in equipment_data],
'combat_readiness_score': [float(item['combat_readiness_score']) if item['combat_readiness_score'] is not None else 0 for item in equipment_data],
'speed_kmh': [float(item['speed_kmh']) if item['speed_kmh'] is not None else 0 for item in equipment_data],
'power_hp': [float(item['power_hp']) if item['power_hp'] is not None else 0 for item in equipment_data],
'travel_range_km': [float(item['travel_range_km']) if item['travel_range_km'] is not None else 0 for item in equipment_data]
}
result.update(rocket_data)
# 如果是巡飞弹,添加额外的分析数据
if dataset['equipment_type'] == '巡飞弹':
missile_data = {
'equipment_names': equipment_names,
'length_width_ratio': [float(item['length_width_ratio']) if item['length_width_ratio'] is not None else 0 for item in equipment_data],
'weight_range_ratio': [float(item['weight_range_ratio']) if item['weight_range_ratio'] is not None else 0 for item in equipment_data],
'speed_weight_ratio': [float(item['speed_weight_ratio']) if item['speed_weight_ratio'] is not None else 0 for item in equipment_data],
'guidance_system_score': [float(item['guidance_system_score']) if item['guidance_system_score'] is not None else 0 for item in equipment_data],
'warhead_power_score': [float(item['warhead_power_score']) if item['warhead_power_score'] is not None else 0 for item in equipment_data],
'engine_power_kw': [float(item['engine_power_kw']) if item['engine_power_kw'] is not None else 0 for item in equipment_data],
'engine_thrust_n': [float(item['engine_thrust_n']) if item['engine_thrust_n'] is not None else 0 for item in equipment_data],
'min_altitude_m': [float(item['min_altitude_m']) if item['min_altitude_m'] is not None else 0 for item in equipment_data],
'max_altitude_m': [float(item['max_altitude_m']) if item['max_altitude_m'] is not None else 0 for item in equipment_data]
# 特征工程参数
'length_width_ratio': [float(item['length_width_ratio']) if item.get('length_width_ratio') is not None else 0 for item in equipment_data],
'weight_range_ratio': [float(item['weight_range_ratio']) if item.get('weight_range_ratio') is not None else 0 for item in equipment_data],
'speed_weight_ratio': [float(item['speed_weight_ratio']) if item.get('speed_weight_ratio') is not None else 0 for item in equipment_data],
'guidance_system_score': [float(item['guidance_system_score']) if item.get('guidance_system_score') is not None else 0 for item in equipment_data],
'warhead_power_score': [float(item['warhead_power_score']) if item.get('warhead_power_score') is not None else 0 for item in equipment_data],
# 动力系统参数
'engine_power_kw': [float(item['engine_power_kw']) if item.get('engine_power_kw') is not None else 0 for item in equipment_data],
'engine_thrust_n': [float(item['engine_thrust_n']) if item.get('engine_thrust_n') is not None else 0 for item in equipment_data],
# 作战参数
'min_altitude_m': [float(item['min_altitude_m']) if item.get('min_altitude_m') is not None else 0 for item in equipment_data],
'max_altitude_m': [float(item['max_altitude_m']) if item.get('max_altitude_m') is not None else 0 for item in equipment_data],
'max_range_km': [float(item['max_range_km']) if item.get('max_range_km') is not None else 0 for item in equipment_data],
'max_payload_kg': [float(item['max_payload_kg']) if item.get('max_payload_kg') is not None else 0 for item in equipment_data],
'combat_radius_km': [float(item['combat_radius_km']) if item.get('combat_radius_km') is not None else 0 for item in equipment_data],
'datalink_range_km': [float(item['datalink_range_km']) if item.get('datalink_range_km') is not None else 0 for item in equipment_data],
'guidance_accuracy_m': [float(item['guidance_accuracy_m']) if item.get('guidance_accuracy_m') is not None else 0 for item in equipment_data]
}
# 验证数据完整性
for key, value in missile_data.items():
logger.info(f"{key} data length: {len(value)}")
logger.info(f"{key} sample data: {value[:3]}")
if not any(value): # 检查是否所有值都为0
logger.warning(f"All values are 0 for {key}")
# 更新结果
result.update(missile_data)
@ -299,7 +354,7 @@ def train_model():
train_data = cursor.fetchall()
# 获取验证集据(如果有)
# 获取验证集据(如果有)
validation_data = None
if validation_dataset_id:
if equipment_type == '火箭炮':
@ -438,50 +493,71 @@ def internal_error(error):
@api_bp.route('/data', methods=['GET'])
def get_equipment_data():
"""
获取装备数据
"""
"""获取装备数据列表"""
try:
with get_db_connection() as conn:
cursor = conn.cursor(dictionary=True)
# 获取火箭炮数据
logger.info("Fetching rocket artillery data...")
# 获取所有装备数据
cursor.execute("""
SELECT e.*, cp.*, rap.*, cd.actual_cost, cd.predicted_cost
SELECT e.*, cp.*, cd.actual_cost, cd.predicted_cost,
CASE
WHEN e.type = '火箭炮' THEN (
SELECT CONCAT(
firing_angle_horizontal, ',',
firing_angle_vertical, ',',
rocket_length_m, ',',
rocket_diameter_mm, ',',
rocket_weight_kg, ',',
rate_of_fire, ',',
combat_weight_kg, ',',
speed_kmh, ',',
min_range_km, ',',
max_range_km, ',',
mobility_type, ',',
structure_layout, ',',
engine_model, ',',
engine_params, ',',
power_hp, ',',
travel_range_km
)
FROM rocket_artillery_params
WHERE equipment_id = e.id
)
WHEN e.type = '巡飞弹' THEN (
SELECT CONCAT(
wingspan_m, ',',
warhead_weight_kg, ',',
max_speed_ms, ',',
cruise_speed_kmh, ',',
endurance_min, ',',
max_range_km, ',',
max_payload_kg, ',',
ceiling_altitude_m, ',',
combat_radius_km, ',',
warhead_type, ',',
launch_mode, ',',
power_system, ',',
guidance_system
)
FROM loitering_munition_params
WHERE equipment_id = e.id
)
END as specific_params
FROM equipment e
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN rocket_artillery_params rap ON e.id = rap.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE e.type = '火箭炮'
ORDER BY e.id
""")
rocket_data = cursor.fetchall()
logger.info(f"Found {len(rocket_data)} rocket artillery records")
# 获取巡飞弹数据
logger.info("Fetching missile data...")
cursor.execute("""
SELECT e.*, cp.*, lmp.*, cd.actual_cost, cd.predicted_cost,
lmp.wingspan_m, lmp.warhead_weight_kg, lmp.max_speed_ms,
lmp.cruise_speed_kmh, lmp.endurance_min, lmp.warhead_type,
lmp.launch_mode, lmp.power_system, lmp.guidance_system
FROM equipment e
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN loitering_munition_params lmp ON e.id = lmp.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE e.type = '巡飞弹'
""")
missile_data = cursor.fetchall()
logger.info(f"Found {len(missile_data)} missile records")
result = cursor.fetchall()
logger.info(f"Found {len(result)} equipment records")
logger.info(f"Sample data: {result[0] if result else None}")
return jsonify({
'rocket_artillery': rocket_data,
'loitering_munition': missile_data
})
return jsonify(result)
except Exception as e:
logger.error(f"Error getting equipment data: {str(e)}")
logger.error("Detailed traceback:", exc_info=True)
return jsonify({'error': str(e)}), 500
@api_bp.route('/data/<int:id>', methods=['DELETE'])
@ -737,100 +813,51 @@ def update_equipment(id):
@api_bp.route('/data/details/<int:id>', methods=['GET'])
def get_equipment_details(id):
"""
获取装备详数据
"""
"""获取装备详情"""
try:
logger.info(f"Getting details for equipment ID: {id}")
with get_db_connection() as conn:
cursor = conn.cursor(dictionary=True)
# 先获取装备类型
cursor.execute("SELECT type FROM equipment WHERE id = %s", (id,))
equipment = cursor.fetchone()
# 获取装备基本信息和类型
cursor.execute("""
SELECT e.*, cp.*, cd.actual_cost, cd.predicted_cost
FROM equipment e
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE e.id = %s
""", (id,))
if not equipment:
logger.warning(f"Equipment not found: {id}")
return jsonify({'error': 'Equipment not found'}), 404
equipment_type = equipment['type']
logger.info(f"Equipment type: {equipment_type}")
# 根据装备类型选择查询
if equipment_type == '火箭炮':
query = """
SELECT
e.*,
cp.*,
rap.*,
cd.actual_cost,
cd.prediction_date as cost_estimate_date,
cd.predicted_cost,
(
SELECT JSON_ARRAYAGG(
CASE
WHEN csp.id IS NOT NULL THEN
JSON_OBJECT(
'id', csp.id,
'param_name', csp.param_name,
'param_value', csp.param_value,
'param_unit', csp.param_unit,
'description', csp.description
)
END
)
FROM custom_params csp
WHERE csp.equipment_id = e.id
AND csp.param_name IS NOT NULL
AND csp.param_value IS NOT NULL
) as custom_params
FROM equipment e
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN rocket_artillery_params rap ON e.id = rap.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE e.id = %s
"""
else:
query = """
SELECT
e.*,
cp.*,
lmp.*,
cd.actual_cost,
cd.prediction_date as cost_estimate_date,
cd.predicted_cost,
(
SELECT JSON_ARRAYAGG(
CASE
WHEN csp.id IS NOT NULL THEN
JSON_OBJECT(
'id', csp.id,
'param_name', csp.param_name,
'param_value', csp.param_value,
'param_unit', csp.param_unit,
'description', csp.description
)
END
)
FROM custom_params csp
WHERE csp.equipment_id = e.id
AND csp.param_name IS NOT NULL
AND csp.param_value IS NOT NULL
) as custom_params
FROM equipment e
LEFT JOIN common_params cp ON e.id = cp.equipment_id
LEFT JOIN loitering_munition_params lmp ON e.id = lmp.equipment_id
LEFT JOIN cost_data cd ON e.id = cd.equipment_id
WHERE e.id = %s
"""
cursor.execute(query, (id,))
result = cursor.fetchone()
if not result:
logger.warning(f"Equipment with ID {id} not found")
return jsonify({'error': '装备不存在'}), 404
logger.info(f"Equipment type: {result['type']}")
logger.info(f"Found equipment details: {result['name']}")
if result:
logger.info(f"Found equipment details: {result['name']}")
logger.info(f"Custom params: {result.get('custom_params')}")
# 根据装备类型获取特有参数
if result['type'] == '火箭炮':
cursor.execute("""
SELECT *
FROM rocket_artillery_params
WHERE equipment_id = %s
""", (id,))
custom_params = cursor.fetchone()
else:
cursor.execute("""
SELECT *
FROM loitering_munition_params
WHERE equipment_id = %s
""", (id,))
custom_params = cursor.fetchone()
# 合并特有参数到结果中
if custom_params:
result.update(custom_params)
logger.info(f"Custom params: {custom_params}")
return jsonify(result)
@ -842,7 +869,7 @@ def get_equipment_details(id):
@api_bp.route('/datasets', methods=['GET'])
def get_datasets():
"""
获取数集列表
获取数集列表
"""
try:
with get_db_connection() as conn:
@ -976,7 +1003,7 @@ def update_dataset(id):
# 删除旧的装备关联
cursor.execute("DELETE FROM dataset_equipment WHERE dataset_id = %s", (id,))
# 加新的装备关
# 加新的装备关<EFBFBD><EFBFBD><EFBFBD>
if 'equipment_ids' in data:
for equipment_id in data['equipment_ids']:
cursor.execute("""

View File

@ -43,12 +43,24 @@ CREATE TABLE rocket_artillery_params (
combat_weight_kg FLOAT, -- 战斗重量(kg)
speed_kmh FLOAT, -- 速度(km/h)
min_range_km FLOAT, -- 最小射程(km)
max_range_km FLOAT, -- 最大射程(km)
mobility_type VARCHAR(50), -- 行走方式
structure_layout VARCHAR(100), -- 结构布局
engine_model VARCHAR(100), -- 发动机型号
engine_params TEXT, -- 发动机参数
power_hp FLOAT, -- 功率(hp)
travel_range_km FLOAT, -- 行程(km)
-- 新增特征工程字段
fire_density FLOAT, -- 火力密度(发射次数/分钟/平方米)
range_ratio FLOAT, -- 射程比(最大射程/最小射程)
mobility_score INT, -- 机动性评分(1-10)
combat_readiness_score INT, -- 战备状态评分(1-10)
rocket_power_ratio FLOAT, -- 火箭弹功重比
platform_efficiency FLOAT, -- 平台效率(射速/战斗重量)
deployment_score INT, -- 部署评分(1-10)
terrain_adaptability_score INT, -- 地形适应性评分(1-10)
FOREIGN KEY (equipment_id) REFERENCES equipment(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@ -61,14 +73,16 @@ CREATE TABLE loitering_munition_params (
max_speed_ms FLOAT, -- 最大速度(m/s)
cruise_speed_kmh FLOAT, -- 巡航速度(km/h)
endurance_min FLOAT, -- 续航时间(min)
max_range_km FLOAT, -- 最大航程(km)
max_payload_kg FLOAT, -- 最大载荷(kg)
ceiling_altitude_m FLOAT, -- 升限(m)
combat_radius_km FLOAT, -- 作战半径(km)
warhead_type VARCHAR(50), -- 战斗部类型
launch_mode VARCHAR(50), -- 发射方式
power_system VARCHAR(100), -- 动力装置
guidance_system VARCHAR(100), -- 制导体制
-- 新增关键参数
payload_weight_kg FLOAT, -- 有效载荷重量(kg)
min_combat_radius_km FLOAT, -- 最小作战半径(km)
engine_power_kw FLOAT, -- 发动机功率(kw)
engine_thrust_n FLOAT, -- 发动机推力(N)
datalink_range_km FLOAT, -- 通信链路距离(km)