Files
zyt/.trellis/tasks/archive/2026-05/05-07-diagnosis-video-upload-entry/prd.md
T

4.2 KiB
Raw Blame History

诊单视频录制回放上传入口

Goal

在诊单编辑抽屉的「视频录制回放记录」tab 中增加手动上传入口,支持大容量视频自动分片上传,并在上传完成后把视频回放地址关联到对应通话记录,供后台直接回放。

What I already know

  • 入口页面在 admin/src/views/tcm/diagnosis/edit.vuetab 组件为 admin/src/views/tcm/diagnosis/components/CallRecordPanel.vue
  • 当前回放面板只能展示 recording_urls_list,没有手动上传入口。
  • 管理端现有视频上传能力只有整文件 POST /upload/video,前端封装在 admin/src/api/file.tsuploadVideoBlob / 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_urlsJSON 数组)与 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

  • 诊单编辑页 tabadmin/src/views/tcm/diagnosis/edit.vue
  • 回放面板:admin/src/views/tcm/diagnosis/components/CallRecordPanel.vue
  • 通话记录 APIadmin/src/api/tcm.ts
  • 上传 APIadmin/src/api/file.ts
  • 服务端上传:server/app/common/service/UploadService.php
  • 通话记录逻辑:server/app/adminapi/logic/tcm/DiagnosisLogic.php