dms-chat-storage.md 4.7 KB

会话/问答记录/反馈落地 DMS

状态:✅ 已完成并人工验证(2026-09-17 归档到 completed/结果:会话、问答记录、反馈全部切到 DMS;回归脚本 36/36 通过(打真实 DMS); 浏览器人工点验通过(用户确认)存储粒度一问一答一条(1889 幂等键 c_record_id)。曾一度改成「一个会话一行、 整段对话 JSON 塞进 c_answer」,同日按用户要求改回本版——理由是这样更贴近库表原本的 语义(chat_record 就是一行一轮问答),也便于按轮次检索/统计。 实测留痕:用户真实提问后库中数据 —— 1887 该会话 1 行(c_title=首问、 c_credit_code=访客_68e82b71…)、1889 两轮问答 2 行(同 c_session_id、不同 c_record_idc_question/c_answer 均已写入),与约定完全一致。 日期:2026-09-17 前置../active/dms-api-replacement.md(DMS 替换总方案)

目标

把会话、问答记录、反馈从旧接口 {VITE_API}/chat/* 迁到 DMS 数据管理服务 (栏目 1887 助手会话 / 1889 助手问答记录),并且:

  • 存储粒度是一个会话一行(用户明确要求):不要把每轮问答各存一行, 一行里要包含该会话窗口的全部消息
  • 访客(未登录)也要存
  • 反馈写进 DMS

现状(动手前的事实)

  • 前端会话标识 = session.id(UUID,恒等于聊天协议 thread_id,跨刷新稳定)
  • DMS 两个栏目已建好但全空,F4 数据迁移未开始
  • DMS 的 content 读写接口在原文档里全是「📄 未实测」

关键决策

决策 选择 理由
会话标识 session.idc_session_id 恒等于协议 thread_id,可与协议对账;跨刷新稳定
问答存储粒度 一个会话一行,整段消息 JSON 存 c_answer 用户要求:一行拿到整个会话
写入方式 每次以本地 messages 为准整段重写 本地状态是权威;避免「读-改-写」的并发覆盖
反馈存储 写进该行 JSON 里对应那条消息 用户选择;反馈仍能精确定位到某一轮
访客归属 c_credit_code = 访客_<埋点访客id> 复用现有访客 id,跨刷新稳定,零新增代码
token vite 代理注入,前端产物不含 避免把数据管理权限发给每个访客

步骤(已完成部分)

  1. Step-0 实测 DMS(见 progress.md Session 022):addContent 不需要 c_id、 返回记录 uuid(纯字符串)、删除是 POST /content/updateAudit + state=4、 时间戳格式与长文本往返
  2. ✅ 基建:.env.developmentVITE_DMS_API / VITE_DMS_TARGETvite.config.ts/dms-api/ 代理(补 /dms 前缀 + 注入 token)、 runtime-config.tsgetDmsApiBaseUrl()index.html 注入
  3. ✅ DMS 客户端 src/network/api/dms/client.ts + 业务层 chat-sessions-dms.ts
  4. chat-sessions.ts 换内部实现(签名不变,调用方零改动)
  5. ✅ 写入挂钩:sendMessage / totalResponse / close / submitQuestionAnswers
  6. ✅ 反馈接线 BusinessRecord.vue
  7. 改存储粒度为一会话一行(本轮):saveDmsTranscript() 整段重写; fetchDmsSessionRecords() 从 JSON 还原问答对;writeDmsFeedback() 改成 「读整行 → 改那条消息 → 写回」,并与对话写入共用 session: 顺序链
  8. ✅ 顺带修:去掉开发环境硬编码账号的自动登录(它导致「没登录也进登录态」)

验证

  • npm run build 通过
  • node harness/tools/verify-dms-chat-storage.mjs <代理地址> —— 36/36 通过, 其中关键断言:第二轮后仍是一行(不是一封问答一行)、反馈只改命中那条消息、 另一条消息未被误改、定位不到时不新增行
  • 代理注入 token 实证:经代理 202,直连不带 token 208 无token

风险 / 未决

  • ⚠️ 浏览器端到端未人工点过:发消息 → DMS 出现一行 → 刷新 → 列表/历史 → 反馈
  • ⚠️ DMS token 2026-09-17 22:19 过期;过期后写入静默降级(仅控制台 warn)
  • ⚠️ 生产未接:需 nginx 等价转发 + 长效凭据(现在给的是临时 token)
  • ⚠️ 反馈状态刷新后不恢复:JSON 里存着,但 BusinessRecordlocalFeedback 初始恒为 None,未做「从 DMS 读回反馈态」的回填。要做得另接一条线。
  • ⚠️ 跨标签页同时写同一会话可能相互覆盖(单页内已由顺序链串行化)
  • ⚠️ 旧会话不在 DMS:切换后远端列表为空(本地历史仍在);F4 迁移未开始