# 诊单视频录制回放上传入口 ## 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`