@@ -0,0 +1,70 @@
# 诊单视频录制回放上传入口
## Goal
在诊单编辑抽屉的「视频录制回放记录」tab 中增加手动上传入口,支持大容量视频自动分片上传,并在上传完成后把视频回放地址关联到对应通话记录,供后台直接回放。
## What I already know
* 入口页面在 `admin/src/views/tcm/diagnosis/edit.vue` , tab 组件为 `admin/src/views/tcm/diagnosis/components/CallRecordPanel.vue` 。
* 当前回放面板只能展示 `recording_urls_list` ,没有手动上传入口。
* 管理端现有视频上传能力只有整文件 `POST /upload/video` ,前端封装在 `admin/src/api/file.ts` 的 `uploadVideoBlob` / `uploadMaterialFile` 。
* 服务端上传实现位于 `server/app/common/service/UploadService.php` ,视频上传目前只接收一次性文件流,不支持分片合并。
* 诊单通话记录接口为 `GET /tcm.diagnosis/getCallRecords` ,服务端逻辑在 `DiagnosisLogic::getCallRecords` 。
* 当前“浏览器本地录制上传后关联回放”的接口是 `POST /tcm.diagnosis/attachLocalCallRecording` ,它按 `diagnosis_id + admin_id` 回退到最近一条通话记录,不支持显式指定 `call_record_id` 。
* 回放数据存储在 `tcm_call_record.recording_urls` ( JSON 数组)与 `recording_status` 。
* `tcm_call_record` 基础字段定义在 `server/sql/tcm_call_record.sql` ;录制相关补充字段定义在 `server/sql/add_call_recording_fields.sql` 。
* 当前 Trellis 目录下没有 `.trellis/spec/` ,本任务的实现上下文需要依赖 PRD / research 文件本身。
## Assumptions (temporary)
* 大容量视频上传采用后端落盘分片 + 最终合并的方式,不依赖云厂商 Multipart SDK。
* 无通话记录时允许直接上传,服务端自动生成一条模拟 `tcm_call_record` 承载该视频回放。
## Open Questions
* 暂无
## Requirements (evolving)
* 在诊单编辑的「视频录制回放记录」tab 提供视频上传入口。
* 有通话记录时,上传入口按“每条通话记录”逐行提供,用户在目标记录行内上传视频。
* 无通话记录时,tab 顶部也要提供上传入口;上传后服务端自动生成一条模拟通话记录并展示在列表中。
* 支持大容量视频自动切片上传,避免单次请求过大导致失败。
* 下方列表数据来源保持为 `tcm_call_record` ,不得引入独立的“上传视频列表”数据源。
* 上传完成后必须将视频地址写入目标通话记录的 `recording_urls` ,并同步维护相关状态字段,确保列表立即可见。
* 对于自动生成的模拟通话记录,房间号、通话类型、状态等无真实来源字段使用系统默认值,但仍落在 `tcm_call_record` 同表中。
* 保持现有云端录制 / 本地浏览器录制展示逻辑兼容,不破坏已有回放列表。
* 仅允许视频文件类型,沿用现有视频格式白名单。
## Acceptance Criteria (evolving)
* [ ] 在诊单编辑页打开「视频录制回放记录」tab 时可以看到上传入口。
* [ ] 即使当前没有通话记录,也可以直接上传视频。
* [ ] 选择较大视频文件后,前端自动分片并完成上传,无需用户手工处理。
* [ ] 上传成功后,目标通话记录立即能看到新增回放视频。
* [ ] 列表中的上传视频信息仍然来自 `tcm_call_record` ,不会写到别的表导致数据割裂。
* [ ] 已有录制回放仍能正常展示与播放。
* [ ] 错误场景有明确提示,失败后不会写入脏的回放地址。
## Definition of Done (team quality bar)
* Tests added/updated (unit/integration where appropriate)
* Lint / typecheck / CI green
* Docs/notes updated if behavior changes
* Rollout/rollback considered if risky
## Out of Scope (explicit)
* 不改造 TRTC 云端录制流程
* 不新增独立的视频转码/压缩流程
* 不做前台/小程序端上传入口
## Technical Notes
* 诊单编辑页 tab: `admin/src/views/tcm/diagnosis/edit.vue`
* 回放面板:`admin/src/views/tcm/diagnosis/components/CallRecordPanel.vue`
* 通话记录 API: `admin/src/api/tcm.ts`
* 上传 API: `admin/src/api/file.ts`
* 服务端上传:`server/app/common/service/UploadService.php`
* 通话记录逻辑:`server/app/adminapi/logic/tcm/DiagnosisLogic.php`