# 工程研究中心数据更新指南

## 概述

本文档详细说明如何将 `src/assets/实验室.json` 中的工程研究中心数据导入到数据库中。当有新的工程研究中心数据或者数据需要更新时，请按照本指南进行操作。

## 文件说明

### 主要文件
- **数据源文件**: `src/assets/实验室.json` - 包含所有工程研究中心的多年度数据
- **导入脚本**: `backend/import_lab_data_full.py` - 完整的数据导入脚本
- **JSON修复脚本**: `backend/fix_json_format.py` - 修复JSON格式问题
- **数据类型修复脚本**: `backend/fix_year_data_types.py` - 修复年份字段类型问题
- **数据检查脚本**: `backend/check_specific_lab.py` - 检查特定工程研究中心数据
- **数据库模型**: `backend/models.py` - 定义Lab表结构
- **本文档**: `backend/LAB_DATA_UPDATE_GUIDE.md` - 操作指南

### 数据结构
JSON文件包含工程研究中心数组，每个工程研究中心包含：
```json
{
  "中心名称": "工程研究中心名称",
  "中心编号": "工程研究中心编号", 
  "年度数据": [
    {
      "归属年份": "2024",
      "所属学校": "学校名称",
      "主管部门": "部门名称",
      ... // 详细的年度数据
    }
  ]
}
```

## 数据库字段映射

### 基本信息字段
| JSON字段 | 数据库字段 | 类型 | 说明 |
|---------|-----------|------|------|
| 中心名称 | name | String | 工程研究中心名称 |
| 中心编号 | center_number | String | 工程研究中心编号 |
| 所属学校 | school | String | 所属学校 |
| 主管部门 | department | String | 主管部门 |
| 所属领域 | field | String | 所属领域 |
| 归属年份 | current_year | String | 当前评估年份 |

### 详细信息字段
| JSON字段 | 数据库字段 | 类型 | 说明 |
|---------|-----------|------|------|
| 技术攻关与创新情况 | innovation_situation | Text | 技术创新描述 |
| 1.总体情况 | overall_situation | Text | 总体情况描述 |
| 2.工程化案例 | engineering_cases | Text | 工程化案例 |
| 3.行业服务情况 | industry_service | Text | 行业服务情况 |
| 1.学科发展支撑情况 | discipline_support | Text | 学科发展支撑 |
| 2.人才培养情况 | talent_cultivation | Text | 人才培养情况 |
| 3.研究队伍建设情况 | team_building | Text | 队伍建设情况 |

### 统计数据字段
| JSON字段 | 数据库字段 | 类型 | 说明 |
|---------|-----------|------|------|
| 国家级科技奖励一等奖(项) | national_awards_first | Integer | 国家一等奖数量 |
| 国家级科技奖励二等奖(项) | national_awards_second | Integer | 国家二等奖数量 |
| 省、部级科技奖励一等奖(项) | provincial_awards_first | Integer | 省部一等奖数量 |
| 省、部级科技奖励二等奖(项) | provincial_awards_second | Integer | 省部二等奖数量 |
| 有效专利(项) | valid_patents | Integer | 有效专利数量 |
| 在读博士生 | doctoral_students | Integer | 博士生数量 |
| 在读硕士生 | master_students | Integer | 硕士生数量 |
| 固定人员(人) | fixed_personnel | Integer | 固定人员数量 |
| 流动人员(人) | mobile_personnel | Integer | 流动人员数量 |
| 当年项目到账总经费(万元) | total_funding | Float | 总经费 |

### 特殊字段
| 字段 | 说明 |
|-----|------|
| annual_data | JSON格式存储所有年度数据，包含多年完整信息 |
| id | 自动生成的UUID，作为主键 |
| idcode | 使用中心编号作为显示ID |

## 操作步骤

### 1. 准备工作

确保以下条件满足：
- [x] 后端服务已停止运行
- [x] 数据库文件 `backend/data/app.db` 存在
- [x] Python环境已激活 (`conda activate fast-dashboard-env`)
- [x] JSON数据文件 `src/assets/实验室.json` 已更新

### 2. 环境准备

在命令行中执行：
```powershell
# 激活conda环境
conda activate fast-dashboard-env

# 进入后端目录
cd backend
```

### 3. 执行数据导入

运行导入脚本：
```powershell
python import_lab_data_full.py
```

### 4. 导入过程说明

脚本会执行以下操作：

1. **数据验证**：检查JSON文件是否存在
2. **数据读取**：解析JSON文件内容
3. **数据处理**：
   - 遍历每个工程研究中心
   - 检查是否已存在（根据中心编号或名称）
   - 如果存在则更新，否则创建新记录
   - 处理多年度数据，提取最新年份作为当前数据
   - 安全转换数据类型（整数、浮点数、字符串）
4. **数据库操作**：
   - 添加新记录或更新现有记录
   - 提交事务
   - 显示统计信息

### 5. 输出信息解读

脚本运行时会显示：
- 📖 正在读取数据文件
- ✅ 成功读取数据，共 X 个工程研究中心
- 🔄 正在处理工程研究中心: XXX (编号: XXX)
- ➕ 创建新工程研究中心 / 📝 工程研究中心已存在，更新数据
- ✅ 年度数据: X 年, 最新年份: XXXX
- 💾 正在保存到数据库
- 📊 统计信息

### 6. 验证导入结果

导入完成后，可以通过以下方式验证：

1. **启动后端服务**：
   ```powershell
   uvicorn main:app --reload
   ```

2. **访问API接口**：
   ```
   GET http://localhost:8000/labs/
   ```

3. **查看前端页面**：
   打开前端应用，查看工程研究中心列表和详情页

## 常见问题及解决方案

### 1. JSON格式错误
**问题**: JSON文件中包含Python的`None`值，导致解析失败
**解决方案**: 
```bash
python fix_json_format.py
```

### 2. 年份字段类型错误
**问题**: 前端报错 `TypeError: b.year.localeCompare is not a function`
**原因**: 年度数据中的`归属年份`字段是数字类型，前端期望字符串类型
**解决方案**:
```bash
python fix_year_data_types.py
```

### 3. 检查特定工程研究中心数据
**用途**: 当某个工程研究中心出现问题时，可以单独检查其数据格式
**使用方法**:
```bash
python check_specific_lab.py
```
修改脚本中的工程研究中心名称来检查不同工程研究中心。

## 故障排除

### 常见错误及解决方案

#### 1. 文件不存在错误
```
❌ 错误：找不到数据文件
```
**解决方案**：确认 `src/assets/实验室.json` 文件存在且路径正确

#### 2. 数据库连接错误
```
❌ 数据库操作失败
```
**解决方案**：
- 确认数据库文件 `backend/data/app.db` 存在
- 确认没有其他进程占用数据库
- 确认有足够的磁盘空间

#### 3. JSON格式错误
```
❌ 导入失败: JSON decode error
```
**解决方案**：
- 使用JSON验证工具检查文件格式
- 确认文件编码为UTF-8
- 检查是否有多余的逗号或括号

#### 4. 数据类型转换错误
```
❌ 处理工程研究中心 XXX 时出错
```
**解决方案**：
- 检查JSON中数值字段是否包含非数字字符
- 脚本有safe_int和safe_float函数来处理大部分类型错误
- 如果持续出错，可以手动检查该工程研究中心的数据

### 数据一致性检查

导入后建议进行以下检查：

1. **数量检查**：
   ```sql
   SELECT COUNT(*) FROM labs;
   ```

2. **年度数据检查**：
   ```sql
   SELECT name, current_year, json_length(annual_data) as year_count 
   FROM labs 
   WHERE annual_data IS NOT NULL;
   ```

3. **统计数据检查**：
   ```sql
   SELECT name, valid_patents, doctoral_students, total_funding 
   FROM labs 
   ORDER BY total_funding DESC;
   ```

## 数据更新策略

### 完全重新导入
如果数据变化很大，建议：
1. 备份现有数据库
2. 清空labs表
3. 重新导入所有数据

### 增量更新
如果只是部分数据更新：
1. 脚本会自动检测已存在的工程研究中心
2. 根据中心编号或名称匹配
3. 更新现有记录的数据

### 数据备份
在大规模更新前，建议备份：
```powershell
copy backend\data\app.db backend\data\app_backup_$(Get-Date -Format "yyyyMMdd_HHmmss").db
```

## 性能优化

### 大量数据处理
如果数据量很大（>100个工程研究中心）：
1. 考虑分批处理
2. 添加进度条显示
3. 使用批量插入操作

### 内存优化
- 避免一次性加载所有数据到内存
- 使用流式处理方式
- 及时释放不需要的对象

## 维护建议

### 定期任务
1. **每月检查**：验证数据一致性
2. **每季度备份**：完整备份数据库
3. **每年更新**：根据新的数据字段要求更新脚本

### 版本控制
- 对导入脚本进行版本控制
- 记录每次数据更新的变更日志
- 保留历史数据备份

## 联系信息

如有问题或需要技术支持，请联系：
- 开发团队：AI助手
- 文档更新：每次数据模型变更时同步更新

---

**最后更新时间**：2024年度
**文档版本**：v1.0
**适用环境**：Windows + Python + FastAPI + SQLite 