---
name: vip-report-monthly-sales
description: 负责从 EC Monthly Sales Report 的 Tableau 视图采集 S02/S03 数据，并生成与模板完全一致的素材。
---

# VIP Report Monthly Sales

## 范围

- `S02 Monthly Sales`：需还原顶部 Sales 图、中部绩效表与底部 summary strip（与模板上 `图片 4/6/7` 所在位置一一对应）。
- `S03 KPI LFL`：以 Template 中 `图片 1` 的 KPI 四宫格为目标（目前尚在验证到底是 `Overview` 下半区还是 `Store KPI LFL`）。

## 数据来源

- Tableau workbook：`EC Monthly Sales Report`，source group `tableau_ec_monthly_sales`。具体 view 见 `slide-source-map.yaml` 中 S02/S03 的 `note_views` 和 `effective_views`。
- 映射文件：`C:\workspace\cursor\output\vip-report\slide-source-map.yaml`。S02 与 S03 的 notes 均指向 `Overview`，但 `S02` 的 summary strip 也应参考 `Store Sales in Detail`，`S03` 则最终以 `Store KPI LFL` 为准。
- Tableau 登录：使用 `config.yaml` 中的 `tableau.username`/`password`（当前 `ec_user01`），需要 screenshot 时先登录后再激活 `Overview`。
- 原始截图存放在工作目录 `C:\workspace\cursor\output\vip-report\monthly-sales-overview.png`，素材按 crop 规则生成至 `assets/monthly-sales`。

## 生成流程

1. 运行 `sync_monthly_sales_assets.py`，默认登录 `Overview`，应用 Filters（`Year=2026`、`Month=一月`、`Brand=CK`、`Storename=CKC-VIP`、`Sales Type=GMV`、`year1/year2`）。
2. 脚本根据 `assets` 中的 crop 定义裁切 `monthly-sales-overview.png` 并输出 `render-ops.monthly-sales.live.json`，`monthly-sales-assets.live.json` 记录素材元数据、shape_id、source view 说明。
3. `vip-report-render.ps1` 读取 `render-ops`，按 `shape_id` 精准替换模板图片，以 `COM` 保留层级与 Z-order。
4. 生成 PPT 后运行 `compare_pptx.py` 对比 `C:\Users\niuniu\Desktop\Report.pptx`，确保仅 `slide2.xml/slide3.xml` 与 `ppt/media/image*.png` 被替换。

## 自动化入口

- 日常生成：`powershell -ExecutionPolicy Bypass -File C:\Users\niuniu\.codex\skills\vip-report\bin\vip-report-monthly-sales-sync.ps1`
- 只采集素材：`python C:\Users\niuniu\.codex\skills\vip-report\scripts\sync_monthly_sales_assets.py --config C:\Users\niuniu\.codex\vip-report\config.yaml --slides S02,S03`
- 渲染并比对：追加 `-Render` 参数后会调用 `vip-report-render.ps1` 并输出 `generated-monthly-sales-live.compare.json`

## 口径与校准

- `S02` 的截图必须覆盖 `Overview` 中顶部 Chart、S02 表格以及 summary strip，底部 strip 也参考 `Store Sales in Detail` 的行。
- `S03` 目标是模板上的 KPI 四宫格（GP/Con/ATV/Returnqty），目前以 `Store KPI LFL` 作为最终源；若维持 `Overview` 截图，应确保裁切包含 `GP chart` 等四个图与底部表格线。
- 所有裁切和替换都使用 `shape_id`（`shape_name` 为辅助），避免中文名称因为环境差异被显式依赖。
