增加了比较完善的火箭炮数据集,并修复了前端页面的一些问题
This commit is contained in:
parent
dd3664f6c7
commit
d86c47484e
@ -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.60,RMSE = 0.61,预测误差较小
|
||||
2. LightGBM 表现次之:
|
||||
- 训练集 R² = 0.5277,轻微过拟合
|
||||
- 验证集 R² = 0.1101,泛化能力一般
|
||||
- MAE = 0.55,RMSE = 0.72,预测误差适中
|
||||
3. Random Forest:
|
||||
- 训练集 R² = 0.7756,存在过拟合
|
||||
- 验证集 R² = 0.3189,泛化能力还可以
|
||||
- MAE = 0.47,RMSE = 0.63,预测误差较小
|
||||
4. GBDT 过拟合严重:
|
||||
- 训练集 R² = 0.9700,严重过拟合
|
||||
- 验证集 R² = -1.3133,泛化能力很差
|
||||
- MAE = 0.96,RMSE = 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 600):80米
|
||||
- 小型巡飞弹(如 Hero-30/70、Switchblade 300):50米
|
||||
- 超小型巡飞弹(如 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. 调试方法:
|
||||
- 使用日志跟踪数据流
|
||||
- 验证数据一致性
|
||||
- 检查类型匹配
|
||||
|
||||
@ -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. 特征组合
|
||||
- 考虑特征间的组合效应
|
||||
- 设计复合特征
|
||||
- 探索特征交互作用
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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
27
frontend/vite.config.js
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -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')}")
|
||||
|
||||
@ -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):
|
||||
"""分析特征重要性和相关性"""
|
||||
|
||||
669
src/loitering_munition_data.sql
Normal file
669
src/loitering_munition_data.sql
Normal 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. 训练集:80个型号(约80%)
|
||||
2. 验证集:20个型号(约20%)
|
||||
*/
|
||||
|
||||
-- 插入装备基本信息
|
||||
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;
|
||||
@ -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
|
||||
688
src/rocket_artillery_data.sql
Normal file
688
src/rocket_artillery_data.sql
Normal 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. 训练集:77个型号(约80%)
|
||||
2. 验证集:19个型号(约20%)
|
||||
*/
|
||||
|
||||
-- 中国系列火箭炮数据
|
||||
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;
|
||||
395
src/routes.py
395
src/routes.py
@ -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("""
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user