Browse Source

change(dms): qpyszx/qyzt/rzqpyx 三个字段前端不再传值

用户指示:这三个字段不要传值,后续要传哪些会告知。属业务口径,前端不再替它们猜值。

- chat-sessions-dms.ts 的 buildAnalyticsFields 只保留 summary(会话用标题、记录用问题文本)
- 注释写明:这三个不再传值,且它们在 DMS 模型里是 must=true ——
  写入若出现 214 先看这里,别急着改业务逻辑
- 验证脚本那条「qpyszx 应为 true」的断言改为只断言 summary(否则会误报)

⚠️ 本轮未能验证:**DMS 临时 token 已于 2026-09-17 22:19 过期**,
打真实 DMS 全部返回 212 无效token(32 项失败全由此引起,与本次改动无关)。
因此「去掉这三个字段后写入是否仍成功」未知;按 must 约束推断很可能被 214 拒绝,
但也可能 DMS 侧会放宽。已如实记进 progress.md Session 039。

验证:npm run build 通过;validate-harness 通过。

Co-Authored-By: Claude Code <noreply@anthropic.com>
gongtianxiao 2 days ago
parent
commit
b513e9fc4c

+ 3 - 3
README.md

@@ -174,9 +174,9 @@
     原本只在创建时初始化,**改 `c_title` 不会带动它**,所以前端改名后 DMS 里看到的标题不变
   - 问答记录(1889):`title` 与 `summary` 用**问题文本**(原先库里是字符串 "null",
     在 DMS 列表里看不出是哪一轮)
-  - 补上 DMS 模型新增的 4 个 `must=true` 字段(`summary` / `qpyszx` / `qyzt` / `rzqpyx`)——
-    不带它们写入会被 `214 数据错误` 拒绝;其中「是否落户青浦意向」前端无从判断,
-    先给 `false` 待确认
+  - 补上 DMS 模型新增的 `must=true` 字段(`summary`)——不带会被 `214 数据错误` 拒绝
+  - `qpyszx`(是否青浦营商咨询)/ `qyzt`(是否识别到企业主体)/ `rzqpyx`(是否落户青浦意向)
+    这三个字段**前端不传值**(业务口径由业务方决定,前端不再替它们猜值)
 - 环境变量整理:**地址类配置收进 env,不再写死在代码里**
   - 新增 `VITE_CHAT_TARGET`(聊天后端真实地址)——此前它硬编码在 `vite.config.ts` 的
     代理配置里;现由 `vite.config.ts` 从 env 读取(保留同值兜底)

+ 31 - 0
harness/progress.md

@@ -1673,3 +1673,34 @@
     本轮补上 must 字段后恢复。若用户看到的"正常"另有原因,请告知
 - **下一步最佳动作**:确认上面三个分析字段的业务口径
 
+## Session 039
+
+- **日期**:2026-09-18
+- **本轮目标**:用户指示 —— `qpyszx` / `qyzt` / `rzqpyx` 三个字段**不要传值**,
+  后续要传哪些他会告知
+- **已完成**:
+  - `chat-sessions-dms.ts` 的 `buildAnalyticsFields` 去掉那三个字段,**只保留 `summary`**
+    (会话用标题、记录用问题文本)
+  - 代码注释写明:这三个属业务口径、**前端不再替它们猜值**(此前一度传过 true/false 已去掉),
+    并记下「它们在 DMS 模型里是 `must=true`,若再出 214 先看这里」
+- **⚠️ 本轮未能验证(重要)**:
+  - **DMS 的临时 token 已于 2026-09-17 22:19 过期**,验证脚本打真实 DMS 时全部报
+    `212 无效token`(32 项失败**全部**由此引起,与本次改动无关)
+  - 因此「去掉三个字段后写入是否仍成功」**未知** —— 但那三个字段在模型里是 `must=true`,
+    按 Step-0/上一轮的实测规律,**缺 must 字段很可能再次被 `214 数据错误` 拒绝**
+  - ⚠️ 也就是说:**在拿到新 token 之前,前端往 DMS 的写入可能又是不通的**
+    (或需要 DMS 侧放宽 must 约束)
+- **运行过的验证**:
+  - `node harness/tools/verify-dms-chat-storage.mjs` → **因 token 过期无法验证**(已如实记录,
+    未把失败算到改动头上)
+  - 把验证脚本里那条「qpyszx 应为 true」的断言改成只断言 `summary`(否则会误报)
+- **已记录证据**:本文件 Session 039;`verify-dms-chat-storage.mjs` 第 7 节的注释
+- **更新过的文件或工件**:`src/network/api/dms/chat-sessions-dms.ts`、
+  `harness/tools/verify-dms-chat-storage.mjs`、根 `README.md`、本文件
+- **已知风险或未解决问题**:
+  - ⚠️ **需要新的 DMS token** 才能继续验证与联调(放 `.env.development.local` 的 `DMS_TOKEN`
+    并重启 dev server)
+  - ⚠️ 去掉三个 must 字段后写入是否被拒,**未知**;若被拒,需要用户告知是指望 DMS 侧放宽
+    must 约束,还是这三个字段仍要传(那就得定取值口径)
+- **下一步最佳动作**:拿到新 token 后重跑 `verify-dms-chat-storage.mjs`,确认写入是否仍通
+

+ 3 - 5
harness/tools/verify-dms-chat-storage.mjs

@@ -192,11 +192,9 @@ console.log('\n【7】title 字段');
   await upsertDmsSession({ sessionId: SID2, title: '标题甲', creditCode: TEST_CREDIT });
   let row = await rowOf(DMS_COLUMN_SESSION, 'c_session_id', SID2);
   check('新建会话带上了系统 title', row?.title === '标题甲', JSON.stringify(row?.title));
-  check(
-    '运营分析字段已写入(must 字段,不带会 214)',
-    row?.summary === '标题甲' && row?.qpyszx === true,
-    JSON.stringify([row?.summary, row?.qpyszx])
-  );
+  check('摘要字段已写入', row?.summary === '标题甲', JSON.stringify(row?.summary));
+  // 注:qpyszx / qyzt / rzqpyx 三个字段按要求**前端不传值**(2026-09-18 用户指示),
+  // 它们在 DMS 模型里是 must=true —— 写入若出现 214,先看这里,别急着改业务逻辑
 
   await upsertDmsSession({ sessionId: SID2, title: '标题乙', creditCode: TEST_CREDIT });
   row = await rowOf(DMS_COLUMN_SESSION, 'c_session_id', SID2);

+ 7 - 16
src/network/api/dms/chat-sessions-dms.ts

@@ -44,27 +44,18 @@ export const resolveDmsCreditCode = (): string =>
   enterpriseInfo.value?.credit_code || `访客_${getOrCreateAssistantVisitorId()}`;
 
 /**
- * 会话 / 问答记录共用的「运营分析字段」
+ * 写入时附带的「摘要」字段
  *
- * ⚠️ 这几个在 DMS 的栏目模型里是 **`must=true`**(2026-09-17 模型扩充后加的),
- * **写入时必须带上**,否则 `addContent` 会被 `214 数据错误` 拒绝(实测:
- * 不带就是 214,带上就 200)。字段与取值依据:
+ * ⚠️ **只发 summary**。`qpyszx`(是否青浦营商咨询)、`qyzt`(是否识别到企业主体)、
+ * `rzqpyx`(是否落户青浦意向)这三个字段**前端不传值** —— 属业务口径,
+ * 由用户后续决定要不要传、怎么传(2026-09-18 明确)。
+ * 代码里不要再替它们猜值(此前一度传过 true/false,已按要求去掉)。
  *
- * | 字段 | 别名 | 前端怎么取值 |
- * |---|---|---|
- * | `summary` | 摘要 | 会话用标题、记录用问题文本 |
- * | `qpyszx` | 是否为青浦营商咨询 | 恒 `true`(本助手就是青浦营商咨询) |
- * | `qyzt` | 是否识别到企业主体 | 有企业信用代码(非访客)为 `true` |
- * | `rzqpyx` | 是否落户青浦意向 | **前端无从判断** → 先给 `false`,等后端回填 |
- *
- * ⚠️ `rzqpyx` 的取值是**猜的**(属业务判断,前端拿不到依据)——若不对,
- * 改这一个常量即可;也可能该由后端在分析会话后回填。
+ * 另注:DMS 的栏目模型里这几个是 `must=true`,实测不带上会被 `214 数据错误` 拒绝;
+ * 若写入再次出现 214,先看这里,别急着改业务逻辑。
  */
 const buildAnalyticsFields = (summary: string): DmsRow => ({
   summary: summary || "",
-  qpyszx: true,
-  qyzt: !!enterpriseInfo.value?.credit_code,
-  rzqpyx: false,
 });
 
 /** 写 DMS 的时间格式(Step-0 实测:`YYYY-MM-DD HH:mm:ss` 被接受) */