# Weekly Report Oci

> OCI周报全功能：大盘多维汇总与月度Top10排行 + 客户周用量折线图 + 客户月度用量柱状图。按销售汇总CSPA/Runrate客户的多维用量，列出本月前十客户排行，生成周用量折线图（标记最高/最低点），以及按客户×月份分组的柱状图。触发词：OCI周报 / Oracle周报 / 周报 / 大盘汇总 / 客户排行 / 周用量 / 折线图 / 波动图 / 月度柱状图

- Skill: `agw-sales-ops/weekly-report-oci` (Agent Skill)
- Install (CLI): `npx skillmds@latest add agw-sales-ops/weekly-report-oci`
- Raw SKILL.md: https://api.skillmd.com/api/skills/agw-sales-ops/weekly-report-oci/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: agw-sales-ops (https://skillmd.com/u/agw-sales-ops)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/agw-sales-ops/weekly-report-oci

---


# OCI 销售周报精简与视觉高规格优化版 (SKILL.md)

## 📌 一、全局核心规范
1. **统一计价币种**：全局所有表格、图表、文本中的数据统一使用 **USD（美元）**。金额前缀一律为 `$`，数值千分位取整，格式化为 `${:,.0f}`。
2. **数据源最小化**：仅允许拉取**当前年份（2026）**的明细数据，从源头上切断全表扫描，彻底杜绝 1.5 小时超时隐患。
3. **精准收敛核心**：功能二（折线图）和功能三（柱状图）在绘图前，【必须且仅保留】功能一 Step 6 筛选出的当月 Top 10 核心客户，长尾小客户一律在数据层直接剔除。
4. **清理机制**：执行完毕后必须自动调用 `rm -f *.csv` 销毁所有中间临时文件。

---

## 📊 二、功能一：大盘多维汇总与月度 Top 10 排行表

### ⚙️ 1. 前置步骤：创建本地高性能临时表
在同一个 DuckDB 会话中，优先建立当年销售数据的本地快照，后续 Step 1 至 Step 7 的查询必须全部基于该临时表执行：
```sql
CREATE TEMPORARY TABLE temp_oci_current AS
SELECT
 customer_name,
 customer_type,
 cost_date,
 year,
 month,
 CAST(cost_list_price_cost AS DOUBLE) as cost_list_price_cost
FROM sales_bills_db.sales_bills.v_bill_oci_detail
WHERE sales_name = '${sales_name}' AND year = '2026';
```


⚙️ 2. 数据提取核心 SQL (精简版)
- Step 1（当季累计）: 筛选 cost_date 在当年当季区间，按 customer_type 分组聚合导出。
- Step 2 & 3（本月/上月累计）: 分别筛选当前月份与上月月份，按 customer_type 分组聚合导出（用于计算月环比 MoM）。
- Step 4 & 5（本周/当年累计）: 分别按本周一至今、当年 1 月 1 日至今，按 customer_type 分组聚合导出。
- Step 6（清洗并锁定 Top 10）:
SQL
```PLAIN_TEXT
SELECT
 TRIM(REGEXP_REPLACE(customer_name, '[\n\r]', '', 'g')) as customer_name,
 customer_type,
 SUM(cost_list_price_cost) as month_cost
FROM temp_oci_current
WHERE month = '${current_month}'
GROUP BY 1, 2
ORDER BY month_cost DESC LIMIT 10;
```

🎨 3. PIL 绘图与排版硬约束（解决冗余行与空列缺陷）
1. 取消冗余合计行【核心修复】：
 - 绘制上半部分大盘汇总表时，CSPA 和 Runrate 各自仅允许展示一行综合汇总数据。
 - 严禁生成任何形如 CSPA 合计 或 Runrate 合计 的重复冗余行。整个大盘表严格限定为 3 行：CSPA 汇总行、Runrate 汇总行、以及底部的加粗浅蓝（#D6E4F0）总计行。
2. 剔除无用白列【核心修复】：
 - 下半部分排行表的列数严格锁定为 5 列，不允许出现任何未命名标题的空白列。
 - 标准列结构：# (序号) | 客户名称 | 类型 | 本月用量 | 上月用量 | 月环比。
3. 自适应画布高度：
 - 严格执行动态高度公式：Canvas_Height = Total_Rows * 34px + 280px。确保图像上下紧凑，绝不截断。
📈 三、功能二：客户周用量折线图（自适应 Y 轴与大额续费防压扁）
🎨 1. 周用量数据聚合
基于功能一 Step 6 锁定的 10 个客户名，从 temp_oci_current 中提取他们 2026 年每一周（WEEK(cost_date)）的用量总和，存入 weekly.csv。
🎨 2. 坐标轴防压扁与"穿舱"高亮算法【核心修复】
1. 第一步：剔除异常单点，计算真实 Y 轴上限：
 - 在计算 Y 轴最大刻度前，必须先在内存中判定是否存在大额异常点（定义：某周用量高于该客户自身非零周平均用量的 3 倍）。
 - 坐标轴刻度锁定：过滤掉这几个瞬间暴涨的异常点后，计算日常数据的最大值。设置 y_max = 正常最大值 * 1.2。使左侧 Y 轴的坐标刻度线（如 $10,000, $20,000）完美贴合日常波动，确保普通周的用量曲线清晰饱满。
2. 第二步：大额续费点的"穿舱"悬浮绘制：
 - 绘制折线时，如果遇到刚才被判定为异常的大额单点，强行将其 Y 轴绘图坐标死死钉在画布的最顶端（Cap at canvas top）。
 - 视觉对比：由于日常刻度很低，这个点被强行拉到顶端后，会在视觉上形成极具冲击力的断层，完美呈现"大额续费远超日常"的业务事实。
 - 黑色标注：在画布顶端该点的正上方，用黑色加粗字体标注其实际金额，格式为：$真实金额 (⚠️大额续费)。
📊 四、功能三：客户月度用量柱状图（看客户的月份变化趋势）
⚙️ 1. 月度分组数据提取
基于 Top 10 客户列表，按客户名称和月份（1月~当前月）进行 SUM(cost_list_price_cost) 聚合，确保每个客户内部都拥有完整的月度连续数据流。
🎨 2. X 轴与分组反转【架构修复】
- 横轴（X 轴）：必须是【当月 Top 10 核心客户名称】。横轴水平平铺 10 个主类目。
- 柱子分组：在每一个客户名下，将该客户 1 月、2 月、3 月……至当前月的用量柱子并排挨着紧凑排列，以此直观展现该客户的逐月用量变化。
🎨 3. 彻底规避文字截断与图例防撞车【排版修复】
1. 强行放大底部留白：
 - 绘图脚本开头必须强制注入 plt.subplots_adjust(bottom=0.35)（若使用 PIL 则必须在画布下方为 X 轴文本预留至少 200px 的垂直安全空间）。
 - 确保长公司名（如包含 LIMITED、股份有限公司）在旋转后，后半截文字绝对不会掉出图片边界。
2. 防止文字重叠与间距微调：
 - 设置 plt.xticks(rotation=45, ha='right')，让文字向右下方倾斜对齐。
 - 将 10 个客户类目之间的横轴间距（Category Gap）强行放大至原来的 1.5 倍，在类目内部，缩短不同月份柱子之间的间隙，留出足够的视觉呼吸空间。
3. 图例位置安全隔离：
 - 严禁将代表月份的彩色图例（1月、2月...）横置在底部客户名字上方！
 - 必须使用 plt.legend(loc='upper right', bbox_to_anchor=(1.0, 1.0)) 将图例彻底扔到图表的【右上角内部空白处】，或者画布的最顶端。让图例与底部 X 轴标签在空间上绝对隔离，互不干扰。

