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