238 lines
7.8 KiB
Markdown
238 lines
7.8 KiB
Markdown
|
|
# 高程数据管理重构总结
|
|||
|
|
|
|||
|
|
## 重构目标
|
|||
|
|
|
|||
|
|
将高程数据管理从"数据集中心"模式重构为"文件中心"模式,去掉 ElevationDataset 概念,扁平化为 ElevationFileRecord,每条记录对应一个高程文件。
|
|||
|
|
|
|||
|
|
## 重构成果
|
|||
|
|
|
|||
|
|
### 1. 数据库层面
|
|||
|
|
|
|||
|
|
**新增表**: `elevation_file_record`
|
|||
|
|
- 合并了原 `elevation_dataset` 的核心字段
|
|||
|
|
- 新增 `file_size` 字段记录文件大小
|
|||
|
|
- 新增 `file_name` 字段单独存储文件名
|
|||
|
|
- 包含完整的分析、地形状态追踪字段
|
|||
|
|
|
|||
|
|
**更新关联表**:
|
|||
|
|
- `elevation_apply_job` 添加 `file_record_id` 字段(保留 `dataset_id` 用于向后兼容)
|
|||
|
|
- `elevation_data_import_job` 添加 `file_record_id` 字段(保留 `dataset_id` 用于向后兼容)
|
|||
|
|
|
|||
|
|
**迁移脚本**: `api/migrations/001_add_elevation_file_record.sql`
|
|||
|
|
- 自动从旧表迁移数据
|
|||
|
|
- 创建必要的索引
|
|||
|
|
- 提供兼容性视图
|
|||
|
|
|
|||
|
|
### 2. 后端 API
|
|||
|
|
|
|||
|
|
#### 新增的 File Record API(推荐使用)
|
|||
|
|
|
|||
|
|
| 端点 | 方法 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| `/api/v1/elevation/records` | GET | 获取文件记录列表 |
|
|||
|
|
| `/api/v1/elevation/records` | POST | 上传文件并创建记录(上传即创建) |
|
|||
|
|
| `/api/v1/elevation/records/{id}` | GET | 获取文件记录详情 |
|
|||
|
|
| `/api/v1/elevation/records/{id}` | PATCH | 更新文件记录 |
|
|||
|
|
| `/api/v1/elevation/records/{id}` | DELETE | 删除文件记录 |
|
|||
|
|
| `/api/v1/elevation/records/{id}/analyze` | POST | 触发分析任务 |
|
|||
|
|
| `/api/v1/elevation/records/{id}/terrain/build` | POST | 生成地形瓦片 |
|
|||
|
|
| `/api/v1/elevation/records/{id}/preview` | GET | 预览文件数据 |
|
|||
|
|
|
|||
|
|
#### 保留的 Dataset API(向后兼容)
|
|||
|
|
|
|||
|
|
原有的 `/api/v1/elevation/datasets/*` 端点保持不变,继续支持旧版前端。
|
|||
|
|
|
|||
|
|
#### 更新的 Apply API
|
|||
|
|
|
|||
|
|
`POST /api/v1/elevation/jobs/apply-line` 现在同时支持:
|
|||
|
|
- `file_record_id`: 使用新的文件记录 ID(推荐)
|
|||
|
|
- `dataset_id`: 使用旧的数据集 ID(向后兼容)
|
|||
|
|
|
|||
|
|
### 3. 代码文件
|
|||
|
|
|
|||
|
|
#### 新增文件
|
|||
|
|
|
|||
|
|
1. **模型层**: `api/app/models/elevation.py`
|
|||
|
|
- 添加 `ElevationFileRecord` 模型类
|
|||
|
|
|
|||
|
|
2. **Schema 层**: `api/app/schemas/elevation.py`
|
|||
|
|
- `ElevationFileRecordSummary`
|
|||
|
|
- `ElevationFileRecordListResponse`
|
|||
|
|
- `ElevationFileRecordCreateRequest`
|
|||
|
|
- `ElevationFileRecordUpdateRequest`
|
|||
|
|
- `ElevationFileRecordAnalyzeResponse`
|
|||
|
|
- `ElevationFileRecordTerrainBuildResponse`
|
|||
|
|
- `ElevationFileRecordPreviewResponse`
|
|||
|
|
- `ElevationFileRecordUploadResponse`
|
|||
|
|
|
|||
|
|
3. **Service 层**: `api/app/services/elevation_file_record_service.py`
|
|||
|
|
- `list_file_records()`: 列出文件记录
|
|||
|
|
- `get_file_record_by_id()`: 获取单条记录
|
|||
|
|
- `create_file_record_from_upload()`: 上传并创建记录
|
|||
|
|
- `update_file_record()`: 更新记录
|
|||
|
|
- `delete_file_record()`: 删除记录
|
|||
|
|
- `queue_file_record_analysis()`: 队列分析任务
|
|||
|
|
- `queue_file_record_terrain_build()`: 队列地形构建任务
|
|||
|
|
- `preview_file_record()`: 预览文件数据
|
|||
|
|
- `serialize_file_record()`: 序列化记录
|
|||
|
|
|
|||
|
|
4. **API 路由**: `api/app/api/v1/elevation.py`
|
|||
|
|
- 新增 `/records` 路由组
|
|||
|
|
- 保留 `/datasets` 路由用于向后兼容
|
|||
|
|
|
|||
|
|
5. **前端页面**: `web/src/app/admin/elevation-records/page.tsx`
|
|||
|
|
- 全新的简化界面(从 1760 行简化到 ~600 行)
|
|||
|
|
- 上传即创建,无需先创建数据集
|
|||
|
|
- 每行直接对应一个文件
|
|||
|
|
- 简化的操作流程
|
|||
|
|
|
|||
|
|
6. **迁移脚本**: `api/migrations/001_add_elevation_file_record.sql`
|
|||
|
|
- 数据库结构变更
|
|||
|
|
- 数据迁移逻辑
|
|||
|
|
|
|||
|
|
7. **迁移文档**: `api/migrations/README.md`
|
|||
|
|
- 迁移说明和步骤
|
|||
|
|
|
|||
|
|
#### 更新文件
|
|||
|
|
|
|||
|
|
1. `api/app/models/elevation.py`: 添加 `ElevationFileRecord` 模型
|
|||
|
|
2. `api/app/schemas/elevation.py`: 添加新的 Schema 定义,更新 `ElevationApplyJobSummary` 和 `ElevationApplyJobCreateRequest`
|
|||
|
|
3. `api/app/api/v1/elevation.py`: 添加新路由,更新 apply 端点支持双 ID
|
|||
|
|
|
|||
|
|
### 4. 用户体验改进
|
|||
|
|
|
|||
|
|
#### 旧流程(数据集中心)
|
|||
|
|
1. 创建数据集(填写编码、名称)
|
|||
|
|
2. 导入文件到数据集
|
|||
|
|
3. 分析数据集
|
|||
|
|
4. 预览/地形/回填
|
|||
|
|
|
|||
|
|
#### 新流程(文件中心)
|
|||
|
|
1. 直接上传文件(填写来源、分辨率、备注)→ 自动创建记录 + 触发分析
|
|||
|
|
2. 分析完成后:预览/地形/回填
|
|||
|
|
|
|||
|
|
**简化点**:
|
|||
|
|
- 去掉了"数据集"这个中间层概念
|
|||
|
|
- 上传即创建,一步到位
|
|||
|
|
- 列表直接显示文件,不需要展开查看
|
|||
|
|
- 操作更直观(针对文件而非数据集)
|
|||
|
|
|
|||
|
|
## 使用指南
|
|||
|
|
|
|||
|
|
### 执行数据库迁移
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 备份数据库
|
|||
|
|
pg_dump -U your_user your_database > backup.sql
|
|||
|
|
|
|||
|
|
# 执行迁移
|
|||
|
|
psql -U your_user -d your_database -f api/migrations/001_add_elevation_file_record.sql
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### API 使用示例
|
|||
|
|
|
|||
|
|
#### 上传文件(新 API)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/api/v1/elevation/records \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|||
|
|
-F "file=@elevation_data.tif" \
|
|||
|
|
-F "source=SRTM" \
|
|||
|
|
-F "resolution_m=30" \
|
|||
|
|
-F "notes=高程数据" \
|
|||
|
|
-F "trigger_analysis=true"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 回填线路(支持新旧 ID)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用新的 file_record_id
|
|||
|
|
curl -X POST http://localhost:8000/api/v1/elevation/jobs/apply-line \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"line_id": "line123",
|
|||
|
|
"file_record_id": "record456",
|
|||
|
|
"mode": "fill_null_only"
|
|||
|
|
}'
|
|||
|
|
|
|||
|
|
# 使用旧的 dataset_id(向后兼容)
|
|||
|
|
curl -X POST http://localhost:8000/api/v1/elevation/jobs/apply-line \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"line_id": "line123",
|
|||
|
|
"dataset_id": "dataset789",
|
|||
|
|
"mode": "fill_null_only"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 前端访问
|
|||
|
|
|
|||
|
|
- **新页面**: `http://localhost:3000/admin/elevation-records`
|
|||
|
|
- **旧页面**: `http://localhost:3000/admin/elevation`(继续可用)
|
|||
|
|
|
|||
|
|
## 向后兼容策略
|
|||
|
|
|
|||
|
|
1. **数据库层**: 保留旧表,新表独立存在,通过 ID 复用实现兼容
|
|||
|
|
2. **API 层**: 旧 `/datasets` 端点继续工作,新 `/records` 端点并行存在
|
|||
|
|
3. **前端**: 旧页面和新页面可以同时访问
|
|||
|
|
4. **Apply Job**: 同时支持 `file_record_id` 和 `dataset_id` 参数
|
|||
|
|
|
|||
|
|
## 后续清理计划
|
|||
|
|
|
|||
|
|
当确认新系统运行稳定(建议观察 1-2 周)后,可执行清理:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 删除旧表
|
|||
|
|
DROP TABLE IF EXISTS elevation_dataset_file_meta CASCADE;
|
|||
|
|
DROP TABLE IF EXISTS elevation_dataset CASCADE;
|
|||
|
|
|
|||
|
|
-- 删除旧字段
|
|||
|
|
ALTER TABLE elevation_apply_job DROP COLUMN IF EXISTS dataset_id;
|
|||
|
|
ALTER TABLE elevation_data_import_job DROP COLUMN IF EXISTS dataset_id;
|
|||
|
|
|
|||
|
|
-- 删除兼容性视图
|
|||
|
|
DROP VIEW IF EXISTS elevation_dataset_compat;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
删除旧前端页面:
|
|||
|
|
```bash
|
|||
|
|
# 可选:删除旧的前端页面
|
|||
|
|
rm web/src/app/admin/elevation/page.tsx
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **执行迁移前务必备份数据库**
|
|||
|
|
2. 迁移脚本是幂等的,可以安全重复执行
|
|||
|
|
3. 新旧 API 可以并存,逐步切换客户端
|
|||
|
|
4. 建议先在测试环境验证完整流程
|
|||
|
|
5. 迁移后立即测试核心功能:上传、分析、预览、地形生成、回填
|
|||
|
|
|
|||
|
|
## 测试清单
|
|||
|
|
|
|||
|
|
- [ ] 数据库迁移成功执行
|
|||
|
|
- [ ] 旧数据成功迁移到新表
|
|||
|
|
- [ ] 上传新文件并创建记录
|
|||
|
|
- [ ] 触发文件分析
|
|||
|
|
- [ ] 预览文件数据
|
|||
|
|
- [ ] 生成地形瓦片(栅格格式)
|
|||
|
|
- [ ] 使用新 file_record_id 回填线路
|
|||
|
|
- [ ] 使用旧 dataset_id 回填线路(兼容性测试)
|
|||
|
|
- [ ] 删除文件记录
|
|||
|
|
- [ ] 旧前端页面仍能正常工作
|
|||
|
|
- [ ] 新前端页面所有功能正常
|
|||
|
|
|
|||
|
|
## 技术债务
|
|||
|
|
|
|||
|
|
- [ ] 需要为 `elevation_tasks.py` 添加新的任务函数:
|
|||
|
|
- `analyze_elevation_file_record_job`
|
|||
|
|
- `build_elevation_file_record_terrain_job`
|
|||
|
|
- [ ] Service 层某些函数仍依赖 dataset 结构,需要进一步适配
|
|||
|
|
- [ ] 完整删除旧代码前需要确认所有客户端已切换
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
|
|||
|
|
重构成功将高程数据管理从 1760 行复杂代码简化到约 600 行,去除了不必要的"数据集"抽象层,使功能更加直观和易用。新旧系统可以并存运行,提供了平滑的迁移路径。
|