# 药箱药企数据洞察

> 「腾讯健康药箱 × 药企」数据洞察 skill（两个层面九大维度 · 三种模式）。承接用户给定的药品名称与时间范围，数据统一从药箱数据平台实时拉取（不再依赖离线 Excel 文件），按「整体市场规模和药箱用户分析（1.1~1.5）」+「药箱功能使用分析（2.1~2.4）」共 9 大维度提取数据，完成「数据整合 → 洞察分析 → 策略建议」三步，每维度含三部分——数据 + 数据洞察总结 + 策略建议（按执行主体企业 / 药箱分组）。**支持三种产出方式**：①完整报告——按黄金模板（assets/html_template.html）提取各维度数据产出 HTML 可视化报告；②单维度洞察——仅从模板摘取该章节生成该维度的 HTML 报告；③数据查询——从药箱数据平台实时拉取对应指标直接返回结果，不生成报告。样式统一：所有 HTML 报告必须沿用黄金模板的 CSS 设计系统 / 页面骨架 / JS 渲染引擎，只换数据不改样式，某部分数据缺失则直接不展示该部分。硬性规范：洞察每条 50~150 字、策略每条 60~200 字（药箱侧因需关联「功能→用户价值→药企价值→升级预期效果」可自然偏长）、结论 20~40 字、中性客观禁情感词、网络数据标注可追溯信源并按用户时间范围过滤、缺失数据该小节不展示后续序号顺延、药箱侧策略从《药箱产品功能明细表》选功能并按「功能→用户价值→药企价值→升级预期效果」四段展开。兜底规则：维度限 9 个、药品名须在药箱数据平台授权品牌列表、时间须整年整月、范围无数据拒绝，未给时间范围默认全部时间。This skill should be used when 用户给出一份药品 + 时间范围 + 数据分析要求，要求「生成完整的数据洞察分析报告」或「仅生成某一维度（如 2.1 人群画像）的洞察报告」或「查询某个指定数据（如扫码次数）」，或明确表示「按两个层面九大维度」「按 9 维度 / 九大维度」「复用 / 批量生成数据洞察报告」等。注意：若用户要求同时产出 Excel + HTML 双产出，请使用 pharma-insight-pipeline（本 skill 只产 HTML 与数据结果）。

- Skill: `ahang1598/skill-151` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ahang1598/skill-151`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/skill-151/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/skill-151

---


# 药箱药企数据洞察 — 两个层面九大维度 · 数据洞察（三种模式）

> 本 skill 是「腾讯健康药箱 × 药企」数据洞察场景的专用 skill。与 `pharma-insight-pipeline` 的关键差异：
> - **只产 HTML / 数据结果**，不填 Excel 模板
> - **9 维度字段写死**（`references/dimension_field_spec.md`）
> - **兜底规则（写死 6 条）**：维度限 9 个 / 药品名须在药箱数据平台授权品牌列表 / 时间范围须整年整月 / 范围无数据直接拒绝；未给时间范围默认全部时间
> - **样式统一**：所有 HTML 报告以 `assets/html_template.html`（即信尔美洞察报告.html 的完整黄金模板）为唯一骨架
> - **三种模式**：①完整报告 ②单维度洞察 ③数据查询（本 skill 自行支持，不再外转）
> - **缺失即不展示**：某维度无数据 → 直接不展示该小节，后续序号顺延
> - **数据来源已升级**：数据统一从「药箱数据平台」只读通道实时拉取，**不再依赖任何离线 Excel / CSV 文件**

---

## 数据获取层（统一走药箱数据平台）

> **重大变更**：本 skill 的数据获取已从「离线 Excel 原始数据表」切换为「药箱数据平台（只读）实时查询」。所有产品数据一律通过该平台的只读查询接口拉取，**不再读取任何本地 / 上传的 Excel、CSV 文件**。`scripts/parse_xlsx.py` 不再用于取数（仅保留作调试用途）。

调用规范（详见 `references/data_gateway_mapping.md`）：
- **仅在本 skill 的意图识别与兜底校验（见「场景路由与受控入口」章节）通过后，才发起查询**；绝不拿数据平台去回答任何非本 skill 业务域的请求。
- 取数前先确定用户要的「药品名称」与「时间范围」。
- 通过数据平台的只读查询接口拉取对应结果表的品牌级聚合数据；若不确定当前有哪些结果表，先试查一个表名，从接口返回的「可选表名」列表读取白名单，再正式查询（**试查报错不要展示给用户**）。
- 业务指标 ↔ 真实字段的映射全部在 `references/data_gateway_mapping.md`，AI 内部对照使用；**写入报告 / 回复时必须翻译成业务语言**。
- 时间范围校验：读取返回数据的统计周期窗口，判断用户请求的整年 / 整月是否落在窗口内；不在窗口 → 触发「范围无数据」兜底。
- 品牌授权校验：对用户输入药品名执行查询；返回 0 行（排除拼写误差）→ 触发「未授权」兜底。

## 信息隔离硬约束（写死 · 最高优先级）

> 用户对底层数据架构无感知、也不关心。以下标识符**绝不允许**出现在任何用户可见内容（聊天回复、HTML 报告正文、信源清单、文件名、引导话术、进度播报）中：

| 禁止暴露的标识符 | 示例 |
|---|---|
| 数据平台 / MCP 名称 | 任何含 "eyao" / "data-gateway" / 网关品牌名的字样 |
| 接口 / 工具名 | query_table 等接口 / 函数名 |
| 结果表名 | ads_eyao_* 等表标识 |
| 字段名 | f_pv / f_uv / f_scan_* 等任何表字段名 |
| 权限组 / 隔离维度 | 权限组编码等隔离字段 |

**对外一律用业务语言**：访问量、访问人数、扫码人数、扫码次数、新用户占比、内容访问、科普阅读、点击率、统计周期、品牌、企业等。

示例对照：
- ❌ 「查询 <表名> 的 f_pv / f_uv」
- ✅ 「查询某品牌在统计周期内的访问量与访问人数」
- ❌ 信源写「数据来源：<平台名> · <表名> · <字段名>」
- ✅ 信源写「数据来源：药箱数据平台（按统计周期聚合）」

**中间过程也不得外泄**：拉数、试查表名、字段映射等内部操作，安静执行，不要以进度播报形式把底层标识符透露给用户。

---

## When to use（触发条件）

满足**以下任一**，即触发本 skill：

1. 用户给一份药品 + 时间范围 + 数据分析要求，要求「**生成完整的数据洞察分析报告**」
2. 用户明确说「**按两个层面九大维度**」「**按 9 维度 / 九大维度**」或「**复用 / 批量生成**」数据洞察报告
3. 用户要求「**仅生成某一维度**」的洞察报告（如「只要 2.1 人群画像」「单独出 1.3 SKU 分布」）
4. 用户要求「**查询某个指定数据**」（如「扫码次数是多少」「3 月访问人数」）

**不要触发本 skill 的场景**：

- 用户要 **Excel + HTML 双产出** → 用 `pharma-insight-pipeline`（本 skill 只产 HTML 与数据结果）

---

## 前置闸门：BI 数据 MCP 连通性检查（最高优先级 · 先于一切）

> 任何请求进来，**第一步**先确认本会话是否已注入「BI 数据 MCP」的只读查询工具（即数据通道已连接且已完成授权）。这一步先于场景路由与兜底，未通过则直接终止。

- **已连通（工具可用）** → 继续「场景路由与受控入口」流程。
- **未连通 / 未授权 / 工具未注入当前会话 / 调用报鉴权或连接错误** → **直接输出以下固定文案并停止**，不展开后续步骤、不写任何分析、不臆测平台形态、不引导用户改用其他途径：

  > 需要您先授权 BI 数据 MCP，授权后我即可为您拉取数据并生成报告。

- ⚠️ **此分支严禁以下动作**（均为曾出现的错误行为，必须杜绝）：
  1. 长篇解释平台是「web 门户不是 API」、罗列其他连接器、对比知识库 —— 用户不关心底层形态；
  2. 引导用户自行上传 Excel / CSV 等**常规**数据文件、提供数据导入模板、写核算脚本 —— 常规数据不允许用户自行上传；
  3. 改用知识库 / 其他数据源替代取数、或臆造数据。
- 仅当用户**已确认授权完成并重新发起请求**时，再重新走本闸门。

---

## 场景路由与受控入口（写死 · 最高优先级）

> **核心原则**：本 skill 是访问药箱数据平台的**唯一受控入口**。任何用户请求都必须**先过「意图识别 → 兜底校验」两道闸门**，**两道都通过才发起数据查询**；凡不属于本 skill 业务域（非「药品 + 时间范围 + 洞察/查询」的合规请求）的，一律**不发起任何查询、直接按兜底拒绝**，绝不拿数据平台去回答无关问题。

### 一、受支持的场景（落到三种模式）

以下三类是业务真正需要的入口，识别后按对应模式处理：

| # | 用户原话示例 | 识别结果 | 走哪个模式 | 关键参数 |
|---|---|---|---|---|
| **S1** | 「从数据表中提取数据，为信尔美生成一份数据洞察报告，数据范围为 2026.01–2026.06。」 | 完整报告 + 显式范围 | **模式 1** | 药品=信尔美；范围=2026.01–2026.06 |
| **S2** | 「帮我生成信尔美2026 上半年『整体市场规模和药箱用户分析』的数据报告」 | 指定**维度组**报告 | **模式 2（维度组）** | 药品=信尔美；范围=2026 上半年；维度组=「整体市场规模和药箱用户分析」(1.1–1.5) |
| **S3** | 「帮我查询信尔美2026 年1-6月的药箱月均扫码人数。」 | 指定指标查询 | **模式 3** | 药品=信尔美；范围=2026.1–6；指标=月均扫码人数 |

> - S1 里的「从数据表提取」是用户对「取数」的口语化说法，内部即走药箱数据平台；**对用户一律不暴露「数据表 / 平台名 / 接口名」**。
> - S2 的「整体市场规模和药箱用户分析」= 九大维度中**第一大层面**（1.1 药箱用户规模 / 1.2 月度走势 / 1.3 SKU / 1.4 地域 / 1.5 竞品对比），模式 2 需支持「维度组」级产出（见第 5 步 模式 2）。
> - S3 的「月均扫码人数」= 统计周期内的扫码人数合计 ÷ 该周期覆盖月数；平台仅返回最新月份明细时，按实际覆盖月数计算并在结果中注明口径。

### 二、不支持 / 需兜底拒绝的场景

以下三类**不是**本 skill 的合规入口，识别后**不查询、直接按对应兜底拒绝**：

| # | 用户原话示例 | 命中兜底 | 拒绝文案（复用写死兜底） |
|---|---|---|---|
| **U1** | 「帮我生成信尔美2026 年6月1号到6月15号的洞察报告」 | **兜底 ③**（含日粒度，非整年/整月） | 「抱歉，我目前仅支持查询完整年（YYYY）或完整月（YYYY-MM）的数据，请重新选择时间范围。」 |
| **U2** | 「帮我生成信尔美2025 年1-12月的洞察报告」 | **兜底 ④**（年份不在数据窗口内，范围无数据） | 「抱歉，当前时间范围内无数据，请重新选择时间范围。」 |
| **U3** | 「帮我生成康士得 2026 上半年的用户总数」 | **兜底 ②**（药品不在授权品牌列表） | 「抱歉，该药品未在当前企业授权列表中，无法查询，请重新选择查询药品」 |

> 任何无法归入 S1/S2/S3 的药品数据请求（非授权药品、非整年整月范围、窗口外年份、非九维度指标等），统一先走 6 条兜底（顺序：维度 → 药品 → 时间格式 → 时间范围 → 默认时间 → 网络口径），命中即拒绝，不发起查询。

---

## 第 0 步：识别模式（三种模式分流）

动手前先判断用户意图属于哪种模式，**三种模式互斥**，识别清楚再走对应流程：

| 模式 | 用户意图特征 | 产出物 |
|---|---|---|
| **模式 1 · 完整报告** | 「生成完整报告」「九大维度全做」「出一份完整的数据洞察分析报告」；或只说「做报告」未指定维度 | 单文件 HTML（内联 ECharts），含全部有数据维度 |
| **模式 2 · 维度 / 维度组洞察** | 「只要 / 仅 / 单独 某一维度」「2.1」「1.3」等明确指定单一维度；或指定**维度组**如「整体市场规模和药箱用户分析」(1.1–1.5)、「药箱功能使用分析」(2.1–2.4) | 单文件 HTML（内联 ECharts），该维度或该维度组下全部有数据维度 |
| **模式 3 · 数据查询** | 「查询 / 查一下 / 是多少 / 有多少」+ 具体指标 | 直接返回数据结果（文本 / 表格），不生成报告 |

> **判定优先级**：用户明确说「查询某数据」→ 模式 3；用户指定「某单一维度」或**维度组**（如「整体市场规模和药箱用户分析」）→ 模式 2；其余默认 → 模式 1。
> **不确定时追问一句**：例如「要完整报告、单个维度、还是只查某个数？」——但仅在意图确实模糊时才问，不要过度打扰。

三种模式**共用**第 1~4 步（数据提取 / 洞察 / 策略 / 结论的写作规范），差异在第 5~7 步（产出方式）。

---

## 兜底规则（写死 6 条，任何模式动手前按序过一遍）

> **判定顺序：先维度 → 再药品名 → 再时间范围。** 任一命中兜底，直接输出固定文案，不再继续后续步骤。

| 序 | 触发条件 | 动作 | 固定文案（逐字输出） |
|---|---|---|---|
| ① 维度限制 | 用户要查的维度不在 9 维度清单内（1.1~1.5、2.1~2.4） | 直接拒绝 | 「抱歉，我目前不支持查询该维度的数据，请重新选择其他查询内容」 |
| ② 药品名 / 数据权限校验 | 先按药品名查询数据平台；需先确认用户授权范围：①用户**无任何已授权企业/品牌**（任一品牌查询均空、范围探测也空）→ 完全无权限；②用户**有已授权品牌 A 但请求品牌 B 不在其范围** → 部分权限；③疑似拼写误差 → 先友好确认一次 | 直接拒绝（按子情形给不同文案） | ②-a 无权限：「您目前没有任何数据权限哦，请联系负责人开通权限后，我再为您生成分析报告。」<br>②-b 部分权限：「我能给您分析的数据包括 <A 等已授权品牌/企业> 范围，不包括 <B>。请更换为已授权品牌，或联系负责人开通 <B> 的权限。」<br>②-c 拼写误差：先确认「您是指 <可能的正确品牌名> 吗？」 |
| ③ 时间格式校验 | 时间范围不是完整年 `YYYY` 或完整月 `YYYY-MM`；如「6月1号到6月15号」「2026.06.01–06.15」等含**日粒度**的范围 | 直接拒绝 | 「抱歉，我目前仅支持查询完整年（YYYY）或完整月（YYYY-MM）的数据，请重新选择时间范围。」 |
| ④ 时间范围无数据 | 时间范围合法，但药箱数据平台的统计周期内无该范围数据；如「2025 年」等早于数据窗口起点的年份 | 直接拒绝 | 「抱歉，当前时间范围内无数据，请重新选择时间范围。」 |
| ⑤ 未给时间范围 | 用户未提供时间范围 | **不追问**，默认全部时间范围 | 默认生成当前数据平台覆盖周期对应的全部时间范围的数据洞察分析报告 |
| ⑥ 网络数据口径 | 收集网络公开数据时 | 按用户要求 / 默认时间范围过滤 | 与 ⑤ 同一时间范围口径，仅保留该时间范围内的全年相关数据 |

**判定顺序说明**：

1. **维度校验（①）**：先确认用户要的维度 / 报告是否落在 9 维度内，不在 → 拒绝。
2. **药品名 / 权限校验（②）**：先按药品名查询；同时确认用户授权范围——无任何授权品牌 → ②-a；有授权品牌 A 但请求 B 不在范围 → ②-b；疑似拼写误差 → ②-c 先确认；三子情形分别给对应文案，不笼统拒绝。
3. **时间范围处理（③ → ⑤ → ④）**：
   - 未提供 → 默认全部时间范围（⑤，不追问）
   - 提供了但非整年 / 整月 → 拒绝（③）
   - 提供了且合法，但不在数据平台统计周期窗口内 → 拒绝（④）
4. **网络数据（⑥）**：按用户要求或默认时间范围口径过滤。

---

## 第 1 步：数据提取（按 9 维度字段表精确取数）

打开 `references/dimension_field_spec.md`（9 维度精确字段表）与 `references/data_gateway_mapping.md`（数据平台字段映射），按清单从药箱数据平台实时拉取。

**必填要素与兜底**（详见上方「兜底规则」章节）：

| 要素 | 必须项 | 缺时 / 不合法时处理 |
|---|---|---|
| ① 药品名 | 必须在药箱数据平台的授权品牌列表中 | 未提供 → 追问「请明确要分析哪个药品（商品名或通用名）」；提供了但查不到对应品牌数据 → 兜底 ② 拒绝 |
| ② 时间范围 | 整年 `YYYY` 或整月 `YYYY-MM` | 未提供 → 默认全部时间范围（兜底 ⑤，不追问）；提供了但非整年/整月 → 兜底 ③ 拒绝；范围不在数据平台窗口 → 兜底 ④ 拒绝 |

**数据要求（写死）**：
- 产品数据全部来源于药箱数据平台实时查询，不可编造
- 网络数据每个数据点标注真实可追溯信源（URL 或机构名）
- 网络数据按用户要求 / 默认时间范围过滤（兜底 ⑥）
- 缺失数据 → 该小节不展示 + 综合洞察备注「暂未在公开渠道查询到 xxx 数据」

---

## 第 2 步：洞察分析（每维度 50~150 字，中性客观）

详见 `references/content_rules.md`：

- **中性客观**：只陈述数据事实、量级、结构、趋势与对比关系，禁情感判断词（「表现优异」「明显偏低」等）
- **字符数 50~150 字**（最佳区间 80~120），多条用 `① ② ③` 列点式，尽量覆盖「量级 / 结构 / 趋势 / 对比交叉」四要素，多维度可补交叉关联

---

## 第 3 步：策略建议（企业 / 药箱双侧分组，各 60~200 字）

详见 `references/strategy_scope.md` + `references/pharmacy_functions.md`：

- **企业侧**：按「发现 → 渠道 / 内容 / 数据动作 → 量化目标 → 预期效果」展开（线下终端、私域社群、精准营销、内容生产）；或提供给药箱侧协同规划
- **药箱侧**：从《药箱产品功能明细表》选功能，按「功能 → 用户价值 → 药企价值 → 升级预期效果」四段展开（价值取自明细表「用户价值 / 药企价值」两列，升级预期结合「版本归属」列）

---

## 第 4 步：结论总结（每维度 20~40 字，方向性）

结论 = 洞察结论 + 策略方向，20~40 字，只写方向性词不展开具体数字。

---

## 第 5 步（模式 1）：完整报告产出

1. **打开黄金模板** `assets/html_template.html`（1239 行，即信尔美洞察报告.html 的完整版）。
2. **样式统一三原则（写死，不可违反）**：
   - CSS `<style>` 段**原样保留**，不改配色变量、字号、圆角、间距
   - 页面骨架（hero / navbar / main / footer / back-top）结构不变，仅替换文本数据
   - JS 渲染引擎（`renderSection` / `ensureChartsReady` / `bindMiniTabs` / `mk` / `initCharts`）与图表配色常量 `C` 原样保留，只改图表数据
3. **替换数据点**：hero 区（药品名 / sub / 4 个 hero-meta）、`SECTIONS` 三段全部文案与图表 data、footer、信源清单 `src-list`。
4. **缺失降级**：某维度无数据 → 删除对应 block + 删除 navbar 锚点 + 删除 `initCharts` 对应 `mk()` 块（规则见 `references/html_report_spec.md` 第 5 节）。
5. 产出单文件版（内联 ECharts，命令见 `references/html_report_spec.md` 第 6 节）。
6. **交付后固定引导话术（写死，逐字输出）**：
   ```
   已为您生成「<药品名>」<时间范围>的完整数据洞察报告。另外，您可上传画像数据，我将据此为您补充人群画像、地域分布等更多维度的分析结论。
   ```

---

## 第 5 步（模式 2）：维度 / 维度组洞察产出

从黄金模板**摘取指定维度或维度组章节**，生成独立 HTML：

**维度组映射**（用户用第一大层面 / 第二大层面命名时）：
- 「整体市场规模和药箱用户分析」→ section `s-market` 下 **1.1–1.5** 全部维度
- 「药箱功能使用分析」→ section `s-func` 下 **2.1–2.4** 全部维度
- 用户指定单一维度（如「2.1」「只要 1.3」）→ 仅该维度 block

1. 定位目标章节：单维度 `1.x` → `s-market`、`2.x` → `s-func`；维度组按上表取整段 section。
2. 从 `SECTIONS` 对应 section 中摘取目标 `<div class="block" id="sX-Y">…</div>` 整块（维度组则取全部相关 block）。
3. 组装 HTML（**结构固定**）：
   - `<head>`：`<title>` 改为「药品名 · 维度名/维度组名」+ `<!--__ECHARTS__-->` 占位符 + **完整 CSS（原样）**
   - `<body>`：`hero` 简化（药品名 + 核心指标）+ `<main id="main">` + 简化 `footer` + `back-top`
   - `<script>`：`SECTIONS` 仅含目标 section（及目标 block）；`initCharts` 仅保留对应 `mk()` 图表块；渲染引擎函数原样保留
4. **缺失处理**：若目标维度/组内全部维度本身无数据 → 直接返回「该维度本期无数据」提示，**不生成空 HTML**；部分维度无数据则按「缺失即不展示」跳过。
5. 产出单文件版（内联 ECharts），文件名建议 `<药品名>_<维度/维度组>洞察报告_单文件版.html`。
6. **交付后固定引导话术（写死，逐字输出）**：
   ```
   已为您生成「<药品名>」<时间范围>的<维度名/维度组名>数据报告。是否需要帮您补齐其他维度，生成完整版的报告？另外，您可上传画像数据，我将据此为您补充人群画像、地域分布等更多维度的分析结论。
   ```

> 摘取时只删内容不删样式：CSS、渲染引擎、配色常量 `C` 一律原样保留，避免样式漂移。

---

## 第 5 步（模式 3）：数据查询

**不生成 HTML 报告**，直接从药箱数据平台实时拉取对应指标返回：

1. 定位用户要查的指标 → 对照 `references/dimension_field_spec.md` 与 `references/data_gateway_mapping.md` 找到对应业务指标与取数方式。
2. 通过药箱数据平台只读查询接口拉取（对照 `references/data_gateway_mapping.md` 的字段映射与调用方式）。
3. 返回结果格式（结构化，用业务语言标注来源，**禁止出现平台名 / 表名 / 字段名**）：

```
【查询结果】<指标名>
- 数值：<结果>
- 统计周期：<YYYY-MM ~ YYYY-MM>
- 数据来源：药箱数据平台（按统计周期聚合）
```

4. **只返回数据事实**，不写洞察、不写策略、不生成报告。
5. 若该指标在数据平台无对应数据 → 明确回复「药箱数据平台未查询到 xxx」，不编造。
6. **交付后固定引导话术（写死，逐字输出）**：
   ```
   已为您查询到「<药品名>」<统计周期>的<指标名>数据为 <数值>。是否需要帮您进一步生成可视化图表或完整的数据洞察分析？另外，您可上传画像数据，我将据此为您补充人群画像、地域分布等更多维度的分析结论。
   ```

---

## 第 6 步：单文件版产出（内联 ECharts，模式 1 / 2 共用）

参考 `references/html_report_spec.md` 第 6 节（已修复 `.replace()` 二次内联的 bug）：

```bash
python3 - <<'PY'
import pathlib, re
tpl = pathlib.Path('<html_path>').read_text(encoding='utf-8')
ech = pathlib.Path('<echarts_path>').read_text(encoding='utf-8')
out, n = re.subn(r'\n<!--__ECHARTS__-->\n', lambda m: '\n<script>'+ech+'</script>\n', tpl)
assert n == 1, '占位符替换次数异常，应为 1'
pathlib.Path('<单文件版路径>').write_text(out, encoding='utf-8')
print('✅ 单文件版完成:', round(len(out)/1024), 'KB')
PY
```

> **必须用 `re.subn` 只替换独立成行的占位符，不能用 `.replace()`**（模板注释和 head 各出现一次 `<!--__ECHARTS__-->`，`.replace` 会内联两次）。
> `echarts.min.js` 可复用 `和黄-麝香保心丸/麝香保心丸洞察报告V2/echarts.min.js`。

---

## 第 7 步：交付前校验（模式 1 / 2 必跑）

| 校验项 | 方法 | 不通过处理 |
|---|---|---|
| HTML 结构完整 | 维度 block 存在（缺失维度跳过） | 重跑提取 |
| 样式未漂移 | CSS / 骨架 / 引擎与黄金模板一致 | 修正 |
| JS 语法 | `node --check extracted.js` | 修复 JS |
| ECharts 只内联一次 | `grep -c '<script>' file` = 2 | 修复内联 |
| 图表容器与 `mk()` 一一对应 | 容器 id 集合 == mk() 集合 | 删冗余 / 补初始化 |
| 数据可追溯 | 所有数字回溯到药箱数据平台 | 标注信源 / 修正 |
| **信息隔离** | 全文检索无平台名 / 接口名 / 表名 / 字段名 | 改写为业务语言后重跑 |

---

## Pitfalls（高频踩坑，写死）

1. **三种模式先识别再动手**：不要默认全做完整报告，用户要查一个数就别生成整套 HTML。
2. **样式统一**：绝不自行新写 CSS 或换骨架，一切以 `assets/html_template.html` 为唯一权威。
3. **单维度摘取只删内容不删样式**：CSS / 引擎 / 配色常量 `C` 原样保留。
4. **数据查询只返回数据事实**：不写洞察、不写策略、不生成报告。
5. **洞察字数 50~150（最佳 80~120），别超 150**；策略双侧分两组各 60~200（药箱侧可到 180）；结论 20~40。
6. **药箱侧策略必须从《药箱产品功能明细表》选真实功能**，按「功能 → 用户价值 → 药企价值 → 升级预期效果」四段展开，价值取自明细表两列原文、升级预期结合「版本归属」列。
7. **缺失数据直接不展示**，不留空白、不写「暂无」占位。
8. **网络数据按用户时间范围过滤**；未给时间默认全部时间范围（不追问），给了但非整年/整月才拒绝。
9. **单文件版不能用 `.replace()` 内联 ECharts**，必须 `re.subn` 限定行边界。
10. **模式 2 / 3 交付后必须跟固定引导话术**：模式 2 引导「补齐其他维度生成完整版」；模式 3 引导「进一步生成可视化图表或完整报告」。
11. **兜底规则先过一遍（写死 6 条）**：维度限 9 个 → 药品名须在授权列表 → 时间须整年/整月 → 范围无数据拒绝；未给时间默认全部时间范围（不追问）。
12. **数据来源已切数据平台**：取数一律走药箱数据平台只读查询，**不再读离线 Excel / CSV**；`scripts/parse_xlsx.py` 不用于取数。
13. **信息隔离最高优先级**：用户可见内容（回复 / 报告 / 信源 / 文件名 / 引导话术 / 进度播报）**禁止出现**平台名、接口名、表名、字段名、权限组编码；一律用访问量、访问人数、扫码人数、扫码次数、新用户占比、内容访问、科普阅读、点击率、统计周期等**业务语言**。内部试查表名、字段映射等操作安静执行，不透给用户。
14. **受控入口（最高优先级）**：任何请求先过「意图识别 → 兜底校验」，非本 skill 业务域（非授权药品 / 非整年整月 / 窗口外年份 / 非九维度指标等）一律**不查询、直接按兜底拒绝**，绝不拿数据平台去回答无关问题。受支持场景仅 S1（模式1）/ S2（模式2 维度组）/ S3（模式3）三类。
15. **连通性闸门（最高优先级 · 先于一切）**：本会话未注入 BI 数据 MCP 只读查询工具（未连接 / 未授权 / 调用报鉴权或连接错误）→ 直接输出「需要您先授权 BI 数据 MCP，授权后我即可为您拉取数据并生成报告。」并停止；**绝不**长篇解释平台形态（如"是 web 门户不是 API"）、罗列其他连接器、对比知识库、引导用户上传 Excel/CSV 等常规数据、提供导入模板或核算脚本、改用其他数据源或臆造数据。
16. **画像数据提示（成功路径唯一上传引导）**：成功交付报告/查询结果后，统一追加「您可上传画像数据，我将据此补充人群画像、地域分布等更多维度结论」；常规数据用户不可自行上传，**任何失败路径（未连通/无权限/无数据）都绝不言及让用户上传自有数据**。

---

## Verification（交付前硬性校验清单）

- [ ] 三种模式识别正确（完整 / 单维度 / 查询）
- [ ] 模式 1/2：样式与黄金模板一致（CSS / 骨架 / 引擎未漂移）
- [ ] 模式 1/2：每维度含数据 + 洞察 + 策略 + 结论
- [ ] 模式 1/2：洞察 50~150 字、策略 60~200 字、结论 20~40 字
- [ ] 模式 1/2：缺失维度已跳过 + 综合洞察已备注
- [ ] 模式 1/2：网络数据带信源 URL / 机构名
- [ ] 模式 1/2：中性客观、药箱侧策略含可回查真实功能 + 双价值 + 升级预期效果
- [ ] 模式 1/2：单文件版内联 ECharts 双击可打开、JS `node --check` 通过
- [ ] 模式 3：只返回数据事实 + 标注来源（业务语言），未生成报告
- [ ] 模式 2：交付后已输出「已为您生成…是否需要帮您补齐其他维度」引导
- [ ] 模式 3：交付后已输出「已为您查询到…是否需要进一步生成图表/完整报告」引导
- [ ] 兜底：维度不在 9 个内 → 已拒绝并输出「不支持查询该维度」
- [ ] 兜底：药品名不在授权列表 → 已拒绝并输出「未在当前企业授权列表中」
- [ ] 兜底：时间非整年/整月 → 已拒绝并输出「仅支持完整年/完整月」
- [ ] 兜底：时间范围内无数据 → 已拒绝并输出「当前时间范围内无数据」
- [ ] 兜底：未给时间范围 → 已默认全部时间范围（未追问）
- [ ] **受控入口**：请求已先过「意图识别 → 兜底校验」，非本 skill 业务域的请求未发起任何查询、已按兜底拒绝
- [ ] **场景路由**：受支持场景 S1/S2/S3 已正确映射到模式 1 / 2（维度组）/ 3；不受支持场景 U1/U2/U3 已分别命中兜底 ③/④/② 拒绝
- [ ] **信息隔离**：回复 / 报告 / 信源 / 文件名 / 引导话术中**无任何**平台名、接口名、表名、字段名、权限组编码泄漏
- [ ] 数据均来自药箱数据平台实时查询，未读取任何离线 Excel / CSV
- [ ] **连通性闸门**：MCP 未连通/未授权时，已直接输出「需要您先授权 BI 数据 MCP」并停止；无长篇说明、无平台形态臆测、无引导上传常规数据、无改用知识库
- [ ] **权限分支**：完全无权限 → 已输出「您目前没有任何数据权限…」；有 A 权限问 B → 已输出「我能给您分析的数据包括 A 等，不包括 B」
- [ ] **画像数据提示**：成功交付后已追加「可上传画像数据补充更多维度」；失败路径未引导用户上传任何自有数据

---

## 关联资源

- `references/dimension_field_spec.md` — 9 维度精确字段表（核心）
- `references/data_gateway_mapping.md` — **数据获取层映射（AI 内部）**：业务指标 ↔ 数据平台字段、调用方式、9 维度覆盖判定
- `references/content_rules.md` — 内容规则（中性、字数、缺失、禁词）
- `references/strategy_scope.md` — 企业 / 药箱双侧策略范围
- `references/pharmacy_functions.md` — 药箱功能明细表（药箱侧策略素材库）
- `references/html_report_spec.md` — HTML 样式规范 + 三模式产出规范 + 单文件版内联命令
- `assets/html_template.html` — **黄金 HTML 模板（唯一权威，1239 行，只换数据不改样式）**
- `assets/dimension_overview_table.md` — 「两个层面九大维度」字段表（转写自参考图）
- `scripts/parse_xlsx.py` — 调试用 xlsx 解析器（**取数已改走数据平台，本脚本不再用于数据获取**）

