将 otg_swift OTG 引擎迁入 Core/CameraOTG,并接入旅拍有线传图与历史导入。

恢复 USB 相机连接、边拍边传、三品牌驱动与 SwiftUI 历史导入页,通过适配层对接现有本地上传与 OSS 管道。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 11:22:07 +08:00
parent d7fec35715
commit be9c844bd3
50 changed files with 5721 additions and 20 deletions

View File

@ -47,32 +47,50 @@ WiredTransferHeaderView # 蓝色顶栏:相册名 + 手机号
WiredTransferControlCard # 浮动白卡片:设备存储 / 连接状态 / 筛选 Chip / Tab
WiredTransferSelectAllBar # 勾选模式全选栏(条件显示)
WiredTransferPhotoListPanel # 时间侧栏 + 30 分钟分组列表
WiredTransferBottomBar # 批量上传 + 指定上传
WiredTransferBottomBar # 批量上传 + 指定上传 + 历史导入
SpecifyUploadBottomSheet # 指定上传选项弹层
CameraHistoryImportView # 相机 SD 卡历史导入全屏 Sheet
SonyMTPHelpView # Sony MTP 模式帮助说明
```
## 有线传图交互流程
1. **刷新**:顶部连接区「刷新」按钮 → `refreshCameraFiles()` → 刷新本地持久化记录
2. **批量上传三态**
1. **USB 连接**:进入页面后 `OTGLiveTransferCoordinator` 驱动 `Core/CameraOTG``ConnectionManager` 搜索并连接 Sony / Canon / Nikon 相机;连接成功 Toast 提示,断开时弹窗警告
2. **刷新**catalog 就绪后点击「刷新」→ `refreshCameraFiles()` 同步相机内已有照片(拍后传输模式仅下载不上传);未连接时刷新本地持久化记录
3. **历史导入**:底部「历史导入」在 `catalogReady && 已连接` 时可点,打开 `CameraHistoryImportView` 按日多选导入Sony catalog 为空时展示 MTP 帮助入口
4. **批量上传三态**
- 首次点击 → 进入勾选模式
- 有选中项 → 上传选中照片
- 无选中项 → 取消选择
3. **指定上传**:底部 Sheet 选择「上传所有未上传的照片」或「上传所有今日拍摄的照片」
5. **指定上传**:底部 Sheet 选择「上传所有未上传的照片」或「上传所有今日拍摄的照片」
- 指定上传会同时处理当前管道任务和本地持久化记录;仅存在本地记录的照片会先按本地路径恢复到传输管道,再上传 OSS 并登记素材
4. **时间侧栏**:按 30 分钟时间段分组,点击侧栏滚动到对应 section
5. **格式 Chip**:当前固定展示 JPG与「不修图」一样不可点击RAW 等格式后续扩展
6. **传输模式**:「边拍边传 / 拍后传输」按账号缓存,下次进入有线传图页自动恢复
- 「边拍边传」只自动上传该模式下由相机新照片事件发现的照片
- 「拍后传输」下载到 App 的照片切换模式后不会自动传,需通过批量上传、指定上传、勾选上传或单张重试显式上传
6. **时间侧栏**:按 30 分钟时间段分组,点击侧栏滚动到对应 section
7. **格式 Chip**:当前固定展示 JPG与「不修图」一样不可点击RAW 等格式后续扩展
8. **传输模式**:「边拍边传 / 拍后传输」按账号缓存,下次进入有线传图页自动恢复
- 「边拍边传」相机新照片经 OTG 落盘后自动进入上传队列(最多 3 张并发)
- 「拍后传输」下载到 App 的照片自动传,需通过批量上传、指定上传、勾选上传或单张重试显式上传
9. **前后台**App 回到前台且未连接时自动重新搜索相机;离开页面仅 detach UI保持设备缓存与 demo 一致)
## OTG 与上传管道
```
WiredCameraTransferView → WiredCameraTransferViewModel
→ OTGLiveTransferCoordinator → ConnectionManager (Core/CameraOTG)
→ TravelAlbumOTGPhotoSink → WiredCameraTransferPipeline → OSS 上传
CameraHistoryImportView → CameraHistoryImportViewModel → CameraDriver + OTGPhotoSink
```
- OTG 引擎详见 `Core/CameraOTG/CameraOTG.md`
- 边拍边传路径:`ConnectionManager` live shot → `OTGPhotoSink``pipeline.ingestDownloadedAsset(autoUpload:)``TravelAlbumMaterialUploader`
- 历史导入路径:批量下载落盘,不自动上传,导入完成后刷新主列表
## 业务流程
1. 创建任务:`POST .../travel-album/create`
2. 进入有线传图:有线传图 UI 页USB/OTG 相机连接能力已移除,保留页面与本地照片上传)
2. 进入有线传图:USB 连接相机,边拍边传或拍后传输 / 历史导入
3. OSS 上传:复用 `OSSUploadService.uploadAlbumFile`
4. 素材登记:`POST .../travel-album/upload-material`
5. 本地照片路径以账号 + 相册 scoped 目录持久化(`CameraDownloads/<accountKey>/<albumID>/originals/xxx.JPG`,该功能未上线,不兼容旧版全局目录记录
5. 本地照片路径以账号 + 相册 scoped 目录持久化(`CameraDownloads/<accountKey>/<albumID>/originals/xxx.JPG`
## 有线传图性能策略
@ -85,16 +103,17 @@ SpecifyUploadBottomSheet # 指定上传选项弹层
- `WiredCameraTransferPipeline` 只依赖 `CameraAssetUploadSink` 协议
- `TravelAlbumMaterialUploader` 实现 OSS + 后端登记
- `OTGLiveTransferCoordinator` 桥接 `Core/CameraOTG` 与旅拍上传管道,通过 `OTGPhotoSink` 注入存储
- 与「相册管理」(`Features/Assets`API、Store、路由完全隔离
## 依赖模块
- `Features/TravelAlbum/Services` — 本地存储、上传编排
- `Core/CameraOTG` — USB 连接、品牌 Driver、边拍边传、PTP
- `Features/TravelAlbum/Services` — 本地存储、上传编排、OTG 协调器
- `Core/Upload` — OSS STS 上传
## 二期待补齐
- RAW 预览
- USB/OTG 相机有线连接与边拍边传
- 格式 Chip 扩展 RAW / JPEG+RAW并与 `WiredCameraTransferPipeline` 联动
- 设备存储不足时的业务侧限制(当前仅 UI 提示弹窗)