# TravelAlbum

## 职责

旅拍相册（新增相册 / 新建相册任务）模块，包含任务创建、相册详情、小程序码与 USB 有线传图上传。

## 入口

- 权限 URI：`travel_album` → `TravelAlbumEntryView`
- Android 对照：`ui/travelalbum` → `WiredCameraTransferScreen.kt`

## 核心页面

| 页面 | 说明 |
| --- | --- |
| `TravelAlbumEntryView` | 新增相册列表、新建任务入口；卡片主区域点击进入详情，底部保留「拍传」「相册码」 |
| `CreateTravelAlbumSheet` | 先拍再买 / 买了再拍创建弹窗 |
| `TravelAlbumDetailView` | 相册详情与素材管理（UI 对齐 Android） |
| `WiredCameraTransferView` | 有线传图页（UI 对齐 Android） |

## 相册详情 UI 结构

Android 对照：`zhiflyfollow/.../TravelAlbumDetailScreen.kt`

```
TravelAlbumDetailInfoCard        # 信息卡片：手机号 + 创建时间 + 拨号
TravelAlbumDetailPhotoManageCard # 白卡片：Tab / 排序 / 批量选择 + 网格
TravelAlbumDetailMaterialGridItem# 缩略图 + 已购买角标（条件显示）+ 文件名 + 大小
BottomBar                        # 上传照片 + 条件删除选中
```

## 相册详情交互流程

1. **Tab**：全部照片 / 已购照片，切换后重载素材列表
2. **排序**：创建时间正序/倒序、文件名正序/倒序
3. **批量删除**：仅在「全部照片」Tab 可选，且仅未购买素材可删
4. **上传照片**：底部按钮进入 `WiredCameraTransferView`，返回后自动刷新
5. **删除相册**：右上角更多菜单
6. **图片预览**：非选择模式下点击网格项打开大图预览，可左右滑动浏览当前列表

## 有线传图 UI 结构

Android 对照：`zhiflyfollow/.../WiredCameraTransferScreen.kt`

```
WiredTransferHeaderView          # 蓝色顶栏：相册名 + 手机号
WiredTransferControlCard         # 浮动白卡片：设备存储 / 连接状态 / 筛选 Chip / Tab
WiredTransferSelectAllBar        # 勾选模式全选栏（条件显示）
WiredTransferPhotoListPanel      # 时间侧栏 + 30 分钟分组列表
WiredTransferBottomBar           # 批量上传 + 指定上传
SpecifyUploadBottomSheet         # 指定上传选项弹层
```

## 有线传图交互流程

1. **刷新**：顶部连接区「刷新」按钮 → `refreshCameraFiles()` → 同步相机历史文件
2. **批量上传三态**：
   - 首次点击 → 进入勾选模式
   - 有选中项 → 上传选中照片
   - 无选中项 → 取消选择
3. **指定上传**：底部 Sheet 选择「上传所有未上传的照片」或「上传所有今日拍摄的照片」
   - 指定上传会同时处理当前管道任务和本地持久化记录；仅存在本地记录的照片会先按本地路径恢复到传输管道，再上传 OSS 并登记素材
4. **时间侧栏**：按 30 分钟时间段分组，点击侧栏滚动到对应 section
5. **格式 Chip**：当前固定展示 JPG，与「不修图」一样不可点击；RAW 等格式后续扩展
6. **传输模式**：「边拍边传 / 拍后传输」按账号缓存，下次进入有线传图页自动恢复
   - 「边拍边传」只自动上传该模式下由相机新照片事件发现的照片
   - 「拍后传输」下载到 App 的旧照片切换模式后不会自动补传，需通过批量上传、指定上传、勾选上传或单张重试显式上传

## 业务流程

1. 创建任务：`POST .../travel-album/create`
2. 进入有线传图：Sony/Canon USB 有线传图（`Core/CameraTethering`，自动识别品牌）
3. OSS 上传：复用 `OSSUploadService.uploadAlbumFile`
4. 素材登记：`POST .../travel-album/upload-material`
5. 本地照片路径以账号 + 相册 scoped 目录持久化（如 `CameraDownloads/<accountKey>/<albumID>/originals/xxx.JPG`），该功能未上线，不兼容旧版全局目录记录

## 有线传图性能策略

- 本地下载原图只用于上传与大图预览，按 `accountCachePrefix + albumId` 写入 `CameraDownloads/<accountKey>/<albumID>/originals/`；列表缩略图在后台下采样生成到同 scope 的 `thumbnails/`，由 Kingfisher 统一加载与缓存。
- 连拍上传进度采用节流通知和任务签名去重，下载/上传关键状态立即刷新，普通进度合并后再更新 UI；边拍边传、指定上传和勾选上传最多 3 张照片并发上传，避免滚动时高频触发整页重绘或网络资源被打满。
- `WiredCameraTransferViewModel` 缓存当前 Tab、时间侧栏和 30 分钟分组；新增/删除/切换 Tab 才重建分组，单张进度变化只替换对应行数据。
- 本地记录和物理文件都以账号上下文和相册维度隔离，状态终态、路径变化立即保存，普通进度按步长或时间间隔降频保存；删除相册会清理当前账号当前相册的 scoped 文件目录，不影响同手机号下其他账号或其他相册。

## 解耦关系

- `CameraTransferPipeline` 只依赖 `CameraAssetUploadSink` 协议
- `TravelAlbumMaterialUploader` 实现 OSS + 后端登记
- 与「相册管理」（`Features/Assets`）API、Store、路由完全隔离

## 依赖模块

- `Core/CameraTethering` — USB/PTP 相机
- `Core/CameraTransfer` — 传输编排
- `Core/Upload` — OSS STS 上传

## 二期待补齐

- RAW 预览
- 格式 Chip 扩展 RAW / JPEG+RAW，并与 `CameraTransferPipeline` 联动
- 设备存储不足时的业务侧限制（当前仅 UI 提示弹窗）
