---
name: weekly-revenue-chart
description: 周报收入趋势图一键生成（自包含离线交互 HTML，~1MB）。当用户说"跑周报趋势图"、"更新周报数据"、"生成收入趋势"、"周报出图"时触发。
version: 3.0.0
---

# 周报收入趋势图 Skill

## 概述
从 Excel/ODPS 数据生成 1 份自包含 ECharts 交互 HTML（~1MB，断网可用，含 12 张双 panel 图：左堆积面积 + 右 YoY 折线）。默认不生成 PNG。

## 前提条件
- Python 3.8+ 已安装
- 依赖包：matplotlib, numpy, openpyxl
- 脚本位置：`~/.qoderwork/skills/weekly-revenue-chart/weekly_revenue_chart.py`
- 默认输出目录：`/Users/huangwenwu/Desktop/工作/2026/周报数据AI/`

## Steps

### 1. 确认数据源
向用户确认数据来源（如果用户已给文件路径则跳过询问）：
- **Excel 模式（推荐，5秒出图）**：用户提供 `.xlsx` 文件路径，或默认使用 `/Users/huangwenwu/Desktop/工作/2026/周报数据AI/周报数据测试.xlsx`
- **ODPS 模式**：直接从 MaxCompute 拉取（需 odpscmd 已配置，耗时较长）
- **CSV 模式**：用户提供 `.csv/.tsv` 文件

### 2. 运行脚本
默认仅生成 1 份自包含离线 HTML（已内联 ECharts，~1MB），无需第二步处理：

```bash
# Excel 模式（最常用）
python3 ~/.qoderwork/skills/weekly-revenue-chart/weekly_revenue_chart.py \
  --file "<EXCEL_PATH>" \
  --output-dir "/Users/huangwenwu/Desktop/工作/2026/周报数据AI"

# ODPS 模式（无 --file 参数）
python3 ~/.qoderwork/skills/weekly-revenue-chart/weekly_revenue_chart.py \
  --output-dir "/Users/huangwenwu/Desktop/工作/2026/周报数据AI"
```

可选开关：
- `--cdn`：HTML 用 CDN 引入 ECharts（更小 ~30KB，但需联网）；不加则默认内联
- `--with-png`：除 HTML 外，同时输出 12 张 PNG（默认不生成）

### 3. 报告结果
告知用户输出文件位置：
- 交互 HTML：`周报趋势图_汇总.html`（~1MB，自包含可离线、可直接发给同事）

提供 file:// 链接供用户查看。

## 数据格式要求
Excel 文件需包含以下列（中文列头，顺序不限）：
- 日（int，如 20260520）
- 行业（医疗/教培）
- 直渠（直营/渠道/电销）
- 总收入
- 新签年费
- 续签年费
- 广告现金收入
- 品牌广告收入
- 佣金收入（可选，含 '-' 字符串会自动处理）

日期范围需覆盖 2024.04 至今（YoY 计算需去年同期数据）。

## 图表说明
- 横轴三段式：季度(最近4个) + 月度(最近4个) + 周度(最近4个完整周)
- 左图：日均收入堆积面积图，段内标占比%（整数，字号10），顶部标日均合计
  - 占比阈值 4.5%（pct < 4.5% 或绝对高度 < 总额×4% 的段不显示文字，避免重叠）
  - 边缘感知：首列 ha='left'，末列 ha='right'，xlim=(-0.7, n-0.3) 防裁切
- 右图：YoY 折线图，总收入黑虚粗线为基准（始终标注），分项/团队为彩色实线
  - 防重叠按列分簇：CLUSTER_THRESH=8ppt 内视为同簇
  - 簇内按 [(-22,14),(22,14),(-22,-16),(22,-16)] xoff/yoff 错位标注
  - 簇大小 ≥3 仅保留绝对值最大的辅线
  - ECharts 端用 labelLayout:{hideOverlap:true,moveOverlap:'shiftY'}
- 12 张图覆盖：①整体×收入 ②整体×团队 ③医疗×收入 ④教培×收入 ⑤⑥⑦⑧四个收入×团队 ⑨⑩直营×医疗/教培 ⑪⑫直营/渠道×收入
- HTML 交互版：月/周范围可任意筛选，图表即时重绘

## Pitfalls
- Excel 中佣金列含 '-' 字符串，脚本已用 try/except 兜底，无需预处理
- ODPS 模式需要 JAVA_HOME 正确设置，脚本内置自动检测逻辑
- 如果用户更新了 Excel 结构（列名变化），脚本按中文表头自动定位列，一般无需修改
- 离线 HTML ~1MB，通过钉钉/企微发送时不会被限制
- 内联 ECharts 用 `str.replace` 而非 `re.sub`：echarts.min.js 含 `\d`/`\w` 等元字符会触发 `bad escape`
- Python 三引号 HTML 模板内嵌 JS 字符串的换行必须用 `'\\n'`（双反斜杠），否则 JS 解析失败
- 内联失败时（如 jsdelivr 拉不下来）脚本会自动 fallback 到 CDN 版本并 WARN
- 加 `--with-png` 后会生成 PNG，需中文字体（PingFang SC / Heiti SC / Songti SC）支持
- 末列（W21 等）标签若被裁切，检查 `ax1.set_xlim` 是否为 `(-0.7, n-0.3)` 且末列文本是否 `ha='right'`

## Verification
运行完成后检查：
1. 脚本退出码为 0
2. 输出目录存在 `周报趋势图_汇总.html`，大小约 1MB（说明 ECharts 已内联）
3. 浏览器打开可见 12 张双 panel 图（顶部锚点导航 + YoY 总表）+ 月/周筛选器
