Преглед изворни кода

change(dms): 1887 助手会话不再写入,只写 1889 问答记录

用户指示:「只传具体的会话记录,另一个接口不传了」。

按项目约定**注释而非删除**,各调用点标 [已停用] 并写明原因:
- sendMessage / submitQuestionAnswers:去掉 upsertDmsSession(会话行不再新建或更新)
- renameSessionAt:改名只改本地,不再同步到服务端
- 首轮完成的标题同步:整块注释
- syncSessionTitleToServer 函数整体注释;upsertDmsSession / updateSessionInfo 的 import 一并去掉
- 保留:1889 问答记录写入(title = 问题文本)、反馈写入、删除会话仍清理 1889 记录

验证:
- verify-dms-payload-fields.mjs 扩到 **12 项**(新增第 4 节**源码级断言**):
  composable 里不得有未注释的 upsertDmsSession / syncSessionTitleToServer 调用,
  且停用点以注释保留 —— 12/12 通过(这条靠注释实现,必须防被顺手改回)
- verify-dms-chat-storage.mjs(打真实 DMS)43/43;npm run build 通过

⚠️ 附带发现:该脚本**偶发不稳定**——6 次里 1 次 40/43(未捕获失败项,随后 5 次连过)。
已记进 progress.md,若再现先看 FAIL 行,免得误判成改动引入的。

⚠️ 影响:1887 栏目不再有新数据,前端会话列表退化为纯本地(mergeRemoteSessions
拿到空数组无害,行为与接 DMS 前一致)。四个必填字段的处理随 1887 停用而不再触发,
代码与断言保留备用。

Co-Authored-By: Claude Code <noreply@anthropic.com>
gongtianxiao пре 2 дана
родитељ
комит
061bcfc1ca

+ 6 - 0
README.md

@@ -169,6 +169,12 @@
   - 新增回归脚本:`verify-chat-task-utils.mjs`(33 项,含把「响应式容器破坏对象同一性」
     这个陷阱钉死的断言)、`verify-coordinator-multi-instance.mjs`
     (11 项,验证多实例事件隔离——并行化的地基)
+- DMS 写入范围收窄为**只写问答记录**:
+  - **1887 助手会话不再写入**(用户指示「只传具体的会话记录,另一个接口不传了」)——
+    新建会话、改名都不再同步;会话列表退化为纯本地(与接 DMS 之前一致)
+  - 1889 问答记录照常写入(含 `title` = 问题文本);删除会话仍清理其名下的 1889 记录
+  - 调用点按约定**注释保留**并标 `[已停用]`,同时在 `verify-dms-payload-fields.mjs`
+    里加了**源码级断言**(不得出现未注释的 `upsertDmsSession` 调用),防止被顺手改回
 - DMS 写入补齐 `title` 与运营分析字段:
   - 会话(1887):每次 upsert 都显式带 `title` = 会话标题 —— DMS 的系统字段 `title`
     原本只在创建时初始化,**改 `c_title` 不会带动它**,所以前端改名后 DMS 里看到的标题不变

Разлика између датотеке није приказан због своје велике величине
+ 3 - 2
harness/feature_list.json


+ 36 - 0
harness/progress.md

@@ -1814,3 +1814,39 @@
     (但 payload 脚本不需要 token,随时可跑)
 - **下一步最佳动作**:等业务方给这几个字段的取值口径(或确认由后端回填)
 
+## Session 043
+
+- **日期**:2026-09-18
+- **本轮目标**:用户指示「只传具体的会话记录,另一个接口不传了」
+  → **只写 1889 问答记录,1887 会话不再写**
+- **已完成**(按项目约定**注释而非删除**,各调用点都标了 `[已停用]` 与原因):
+  - `sendMessage`:去掉 `upsertDmsSession`(会话行不再新建/更新)
+  - `submitQuestionAnswers`:同上
+  - 改名(`renameSessionAt`):不再同步到服务端,只改本地
+  - 首轮完成时的标题同步:整块注释
+  - `syncSessionTitleToServer` 函数整体注释;`upsertDmsSession` / `updateSessionInfo`
+    两个 import 一并去掉(注释说明去处)
+  - **保留**:1889 问答记录写入(含 `title`=问题文本)、反馈写入、**删除会话仍清理 1889 记录**
+- **运行过的验证**:
+  - **`verify-dms-payload-fields.mjs` 扩到 12 项**(新增第 4 节**源码级断言**):
+    断言 composable 里**不再有**未注释的 `upsertDmsSession` / `syncSessionTitleToServer` 调用,
+    且停用点以注释形式保留 —— **12/12 通过**
+    (这条是为防「以后被顺手改回去」——毕竟它是靠注释实现的)
+  - `verify-dms-chat-storage.mjs`(打真实 DMS):**43/43**,跑了 6 次
+  - `npm run build` 通过
+- **⚠️ 发现该脚本偶发不稳定**:6 次里有 **1 次 40/43**(未捕获到具体失败项,随后 5 次连过)。
+  未做进一步追查——**若再现,先看 FAIL 行**再判断是 DMS 抖动还是脚本假设有问题。
+  记录在此,免得下次误以为是本次改动引入的
+- **已记录证据**:本文件 Session 043;`verify-dms-payload-fields.mjs` 第 4 节
+- **更新过的文件或工件**:`src/components/business-assistant/useBusinessAssistantChat.ts`、
+  `harness/tools/verify-dms-payload-fields.mjs`、根 `README.md`、
+  `harness/feature_list.json`、本文件
+- **已知风险或未解决问题**:
+  - ⚠️ **1887 栏目从此不再有新数据**:DMS 的「助手会话」列表不会再增长;
+    前端会话列表退化为**纯本地**(`mergeRemoteSessions` 拿到空数组是无害的,行为与接 DMS 前一致)
+  - ⚠️ **删除会话仍会删 1887 的旧行**(若历史上有):这是清理而非新增,按「留着无害」保留;
+    若你希望连删除也别碰 1887,说一声
+  - ⚠️ 那四个必填字段的处理(空值)随 1887 停用而**不再被触发**——相关代码与断言保留,
+    将来若恢复 1887 写入可直接复用
+- **下一步最佳动作**:浏览器确认「问答记录仍正常写入、会话列表走本地」;业务口径定了再议 1887
+

+ 20 - 0
harness/tools/verify-dms-payload-fields.mjs

@@ -37,6 +37,8 @@ globalThis.fetch = async (url, init = {}) => {
   return json({ code: 200, message: '成功', content: '' });
 };
 
+import { readFileSync } from 'node:fs';
+
 const { upsertDmsSession, upsertDmsRecord } = await import('./_dms.mjs');
 
 let pass = 0;
@@ -114,5 +116,23 @@ const hit = [...captured].reverse().find((c) => c.url.includes('/content/addCont
 const content = JSON.parse(new URLSearchParams(hit.body).get('content'));
 check('**title 的值就是问题文本**', content.title === '这是问题文本', JSON.stringify(content.title));
 
+console.log('\n【4】会话写入(1887)必须保持停用 —— 源码级断言');
+{
+  // 用户 2026-09-18 指示:只写问答记录(1889),会话行(1887)不写了。
+  // 这条靠「调用点被注释掉」实现,极易在后续改动里被顺手恢复,所以在源码上钉死。
+  const file = 'src/components/business-assistant/useBusinessAssistantChat.ts';
+  const lines = readFileSync(file, 'utf8').split('\n');
+  const live = lines
+    .map((l, i) => ({ l, n: i + 1 }))
+    .filter(({ l }) => !l.trim().startsWith('//') && /(upsertDmsSession|syncSessionTitleToServer)\s*\(/.test(l));
+  check(
+    '不再调用 upsertDmsSession / syncSessionTitleToServer(1887 已停用)',
+    live.length === 0,
+    live.map(({ l, n }) => `第${n}行: ${l.trim()}`).join(' | ')
+  );
+  const commented = lines.filter((l) => l.trim().startsWith('//') && /upsertDmsSession\s*\(/.test(l));
+  check('停用的调用点以注释形式保留(符合项目「注释不删除」的约定)', commented.length >= 2, `找到 ${commented.length} 处`);
+}
+
 console.log(`\n===== 通过 ${pass} 项,失败 ${fail} 项 =====`);
 process.exit(fail ? 1 : 0);

+ 21 - 15
src/components/business-assistant/useBusinessAssistantChat.ts

@@ -32,8 +32,10 @@ import {
 import { buildTestDocumentLineStreamChunks } from './test-document-line-stream';
 
 import { getChatHistoryStorageKey, enterpriseInfo } from '@/components/useEnterpriseAuth';
-import { fetchRemoteSessionRecords, updateSessionInfo, deleteSessionInfo, type RemoteSession } from '@/network/api/chat-sessions';
-import { upsertDmsSession, upsertDmsRecord } from '@/network/api/dms/chat-sessions-dms';
+import { fetchRemoteSessionRecords, deleteSessionInfo, type RemoteSession } from '@/network/api/chat-sessions';
+// [已停用] updateSessionInfo 随 1887 会话写入一并停用
+import { upsertDmsRecord } from '@/network/api/dms/chat-sessions-dms';
+// [已停用] upsertDmsSession 随 1887 会话写入一并停用
 import { collectPolicyCardsFromMessages } from '../Chat/policy-match-utils';
 
 interface UseBusinessAssistantChatOptions {
@@ -106,10 +108,13 @@ export function useBusinessAssistantChat(options: UseBusinessAssistantChatOption
     void upsertDmsRecord(params);
   };
 
-  // DMS 版本不再要求登录:访客的记录也要落库(c_credit_code = 访客_<访客id>)
-  const syncSessionTitleToServer = (sessionId: string, title: string) => {
-    void updateSessionInfo(sessionId, getCreditCode(), title);
-  };
+  // [已停用] 不再往 DMS 的 1887「助手会话」栏目写数据(用户 2026-09-18 指示:
+  // 「只传具体的会话记录,另一个接口不传了」)。原来这里做会话标题同步,
+  // 现在改名只改本地;1887 那套写入(含标题同步)整条链路停用。
+  // 原实现:
+  // const syncSessionTitleToServer = (sessionId: string, title: string) => {
+  //   void updateSessionInfo(sessionId, getCreditCode(), title);
+  // };
 
   const syncSessionDeleteToServer = (sessionId: string) => {
     void deleteSessionInfo(sessionId, getCreditCode());
@@ -327,10 +332,10 @@ export function useBusinessAssistantChat(options: UseBusinessAssistantChatOption
         });
       }
 
-      // 首轮完成时同步标题(会话行在发送时已建,这里按 c_session_id 更新
-      if (session && session.messages.length <= 2) {
-        syncSessionTitleToServer(session.id, session.title || '');
-      }
+      // [已停用] 首轮完成时同步标题到 DMS 会话行(1887 不再写入
+      // if (session && session.messages.length <= 2) {
+      //   syncSessionTitleToServer(session.id, session.title || '');
+      // }
 
       finishTask(task);
     });
@@ -461,9 +466,9 @@ export function useBusinessAssistantChat(options: UseBusinessAssistantChatOption
     saveHistory();
     await options.afterSend?.();
 
-    // 点击提交即写 DMS:会话 upsert(没有就新增、有就更新)+ 本轮问答(先写 question)
+    // 点击提交即写 DMS:**只写本轮问答记录(1889)**,不再写会话行(1887)
+    // [已停用] void upsertDmsSession({ sessionId: session.id, title: session.title });
     // fire-and-forget,失败只 warn,不影响聊天
-    void upsertDmsSession({ sessionId: session.id, title: session.title });
     saveTurnToDms({ sessionId: session.id, recordId: pendingAiMessage.id, question: text });
 
     void coordinator.generateAnswer(text);
@@ -1523,7 +1528,8 @@ export function useBusinessAssistantChat(options: UseBusinessAssistantChatOption
     }
     chatHistory.value[index].title = nextTitle;
     saveHistory();
-    syncSessionTitleToServer(chatHistory.value[index].id, nextTitle);
+    // [已停用] 改名不再同步到 DMS 会话行(1887 不再写入)——只改本地
+    // syncSessionTitleToServer(chatHistory.value[index].id, nextTitle);
     return true;
   };
 
@@ -1662,9 +1668,9 @@ export function useBusinessAssistantChat(options: UseBusinessAssistantChatOption
     saveHistory();
     await options.afterSend?.();
 
-    // 补问也是一轮问答:记进 DMS。问题存**真实提交文本**(answerText),
+    // 补问也是一轮问答:记进 DMS 的问答记录(1889)。问题存**真实提交文本**(answerText),
     // 不存界面上那句「已提交企业信息补充」——否则从 DMS 读回的历史会失真
-    void upsertDmsSession({ sessionId: session.id, title: session.title });
+    // [已停用] void upsertDmsSession({ sessionId: session.id, title: session.title });
     saveTurnToDms({ sessionId: session.id, recordId: pendingAiMessage.id, question: answerText });
 
     void coordinator.generateAnswer(answerText);

Неке датотеке нису приказане због велике количине промена