Răsfoiți Sursa

docs: 补充「文档→话术库(ScriptAsset)」流程与两处消费端入口

FmodeAgent 1 zi în urmă
părinte
comite
d9d979921e
1 a modificat fișierele cu 20 adăugiri și 0 ștergeri
  1. 20 0
      SKILL.md

+ 20 - 0
SKILL.md

@@ -327,3 +327,23 @@ npx --yes skill-case-get@latest install     # 用户级 → ~/.claude/skills/ski
 
 
 验证方法:CDP `Browser.grantPermissions(origin, ['clipboardReadWrite','clipboardSanitizedWrite'])` + `Runtime.evaluate(..., userGesture=True)`,再 `navigator.clipboard.read()` 回读确认 item 的 type 是 `image/png`、size > 0。仅凭 console 无报错不算通过。
 验证方法:CDP `Browser.grantPermissions(origin, ['clipboardReadWrite','clipboardSanitizedWrite'])` + `Runtime.evaluate(..., userGesture=True)`,再 `navigator.clipboard.read()` 回读确认 item 的 type 是 `image/png`、size > 0。仅凭 console 无报错不算通过。
 
 
+## 文档 → 话术库(ScriptAsset):把官方销售话术文档接进案例库
+
+**触发**:用户给一份飞书/Word 话术文档,要求「存档进案例库 + 建话术库 + 支持归档时提取」。
+
+**流程**(每步都要真实回读,别信中间回执):
+
+1. **读原文**:`lark-cli docs +fetch --doc <docx-url> --doc-format markdown > /tmp/x.md`。输出是 **JSON 包一层**,内容在 `data.document.content`(直接当 markdown 当心被截断;重定向落盘再解析)。
+2. **抽图并下载**:markdown 里图片是 `https://feishu.cn/file/<token>`。**下载端点是 `GET /open-apis/drive/v1/medias/<token>/download`**(`drive +download` 走不通,会 403/127)。图片 alt 文本已是图片描述,直接当 `imageText` 用,无需再过视觉模型。
+3. **结构化解析**:`## Q<n>:<问题>` 抽出问题;bullet 行(`- A:…`)是话术要点数组。**注意文档自身的层级缺陷**:有的章节误用 `##` 而非 `#`(如「7)公司相关」),会被并进上一章 —— 解析前先按标题名正则修正层级;另有 `1. **问题:**答案` 式条目,加粗可能把正文裹进来,要按 `:` 或首个 `。` 切开。
+4. **素材落同源**:图片必须上传到**看板同源** `dev/<projectId>/`(`fmode-storage` 第 3 级项目 STS),否则 `s3.fmode.cn` 无 CORS,前端 `fetch` 取不到图、复制图片必失败。文件名 `NNN.<jpg|png>`(按魔数嗅探真实类型,别信扩展名)。
+5. **写库**:`ScriptAsset`(与 `CaseAsset` 同租户),字段:`question` / `category`(章节) / `chapter` / `answerPoints`(数组) / `images`(同源 URL 数组) / `imageText` / `fitStatus`(适用跟进状态) / `sourceDocId`+`sourceDocTitle`+`sourceRef`(可溯源)`/ order`。幂等键 = `tenantId + idempotencyKey`(由 `文档ID + 分类 + 问题` 派生),重复导入不产生重复条目。
+6. **写后回读**:`curl` 匿名 GET 同源图(200 + md5 同源),Parse 侧按 `idempotencyKey` 计数并抽条比对。
+
+**消费端两个入口(都要做,缺一不可)**:
+
+- **话术库页**(左侧独立栏位 `/scripts`):**列表主体是「问题」**,每项聚合该问题的话术要点 + 配图;检索维度必须与案例库对齐(分类 / 跟进状态 / 关键词,关键词要能命中的**话术正文**,不只标题)。
+- **案例归档「从话术库选取」**:抽成共享组件(`ScriptPickerComponent`),在**案例列表编辑**与**案例详情**两处复用;`ViewChild<ScriptPickerComponent>` 调 `openPicker()`,`(pickText)` 回填 `followUpScript`。列表页回填=**覆盖**(方便重挑),详情页=**追加**(不丢已有内容)。
+
+**坑**:编辑表单可能在**两个地方**(列表页内嵌 + 详情页),只改一处会出现「详情页有、列表页没有」;Angular 懒加载 chunk 名字哈希后会变,浏览器可能仍缓存旧 chunk —— 验证前先 `Network.setCacheDisabled` + `?v=<ts>`。
+