---
name: baoyu-work-report-analysis
description: >
  宝锐生物工作汇报分析 - 从结构化工作汇报文件夹读取三部门月度销售统计表，
  提取销售员级KPI，构建多月份趋势对比，输出Excel多Sheet报告和HTML仪表盘。
triggers:
  - 指向工作汇报文件夹做趋势分析
  - 分析销售过程指标趋势
  - 工作汇报分析或月度汇报数据
category: productivity
---

# 宝锐生物工作汇报分析

## 数据源

工作汇报文件夹结构：
```
~/work/secure/2026/6月工作汇报/2026年/
├── 诊断原料大客户_生命科学销售部/{m}月份/
│   ├── 1.大客户部销售数据统计表（{m}月）.xlsx
│   └── 1.生命科学销售部销售数据统计表（{m}月）.xlsx
└── 诊断原料销售拓展部/{m}月份/
    └── 1.销售拓展部销售数据统计表（{m}月）.xlsx
```

⚠️ **1月文件格式差异**：1月份没有"统计表"文件，而是"月度数据"文件（如 `2026月度数据-诊断原料大客户销售部.xlsx`），其数据在 Sheet **"1）年度指标达成情况"** 中，列结构与月度明细表不同。需要单独解析或直接从该Sheet提取月度销售额。

⚠️ **2月生命科学部**：有时文件夹名为"科研销售部"而非"生命科学销售部"，且人员名单可能不同（如早期的黄建佳/黄自鑫后来离职未出现在后续月份）。

## 核心Sheet

用 `if '月度明细' in sname` 模糊匹配Sheet名。

## 列索引识别

各月列位置可能漂移，动态扫描表头行找 `订单数量` 和 `订单金额` 列索引。

## 离职人员合并

`黄明月（离职）` -> `黄明月`: `name.replace('（离职）','')`

## 输出

Excel (3 Sheets): 全员排名, 部门汇总, 分析结论
HTML: 深色主题, 4 KPI + 4 ECharts图表 + 明细表

## HTML 生成

使用 `%s` 占位符 + `% (val1, val2, ...)` 格式化，避免嵌套 f-string 的转义噩梦：

```python
html = '''... data:%s ...''' % (json.dumps(my_array),)
```

ECharts 数据用 `json.dumps()` 生成 JS 数组。图表配置中每个 series 的 data 数组**必须逐部门独立计算**，不要把同一数组重复注入三次（如 `dept_m3, dept_m3, dept_m3` → 所有柱子都是3月数据）。

## 半年度/年度管理汇报PPT生成\n\n当用户要求「做半年度汇报」「填汇报模板」「出工作汇报PPT」时，从现有仪表盘和订单数据中提取关键指标，填入企业PPT模板。\n\n### 数据来源（按优先级）\n1. **综合管理仪表盘**：KPI（总目标/达成/率）、allSalesData（全员排名+月度分解）\n2. **客户分析仪表盘**：top20Data（集团排名）、customerGroups（分级数据）、月度趋势\n3. **同比异动分析HTML**：区域YoY数据、客户波动明细、分级异动统计\n4. **订单文件**：月度营收数组、区域汇总、客户明细\n5. **框架文件**（仪表盘框架-*.xlsx）：部门目标分解、月度达成\n\n### PPT模板典型结构\n```\n封面 → 目录 → 目标达成(表格+图表) → 回款达成 → 工作总结 →\n问题分析与改善(表格) → 下半年目标(表格) → 竞争分析 → 组织能力 → 结束页\n```\n\n### 填充策略\n- **Slide 3 目标达成**：填写21行×12列表格。Row3=2026总计，Row4=2025总计，Rows5-7=三部门，Rows8-13=关键人员。月度数据从m26/m25数组取。\n- **Slide 4 回款**：通常数据滞后，标注「待财务数据」，附已知逾期总额。\n- **Slide 5 工作总结**：用 `add_textbox()` 添加5-6条要点（目标达成/区域增长/客户开发/人员变动/结构调整）。\n- **Slide 6 问题改善**：4项×4列表格（问题描述/原因分析/改善措施/完成时间）。\n- **Slide 7 下半年目标**：3列（目标/行动措施/时间），4行。\n- **Slide 8 竞争分析**：双栏布局——左侧竞品对比，右侧SWOT。使用 `add_textbox()` 添加。\n- **Slide 9 组织能力**：团队现状/优点/待完善/培养计划 4段。\n\n### 关键数据口径\n- 总目标：大客户部2650万 + 销售拓展部3400万 + 生命科学部600万 = 6650万（框架文件中可能超过此值，以部门分解为准）\n- 年度达成：1-6月累计（从框架文件或订单聚合）\n- 月度数据：从订单文件按区域+月份聚合（去测试单、按单据编号去重）\n- 同比：2026年1-6月 vs 2025年1-6月\n- 部门名称：诊断原料销售部（含生命科学销售、销售拓展、大客户）\n\n### python-pptx操作要点\n- 封面标题替换：文字可能分散在多个run中，需join后replace再clear+add_run\n- 表格填充：`tbl.cell(r,c).text = \"\"` 后设 paragraph\n- 新增文本框：`slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))`\n- 字体：正文13pt/标题16pt，颜色 `RGBColor(0x06,0x5A,0x82)` 深蓝标题\n- 保存后验证：用python-pptx重新读取，打印每个slide的文本摘要确认\n\n### 与 dashboard-update 的协作\n- 回款数据更新后，需同步更新PPT Slide 4 + 综合仪表盘回款模块\n- 框架文件更新后，需同步更新PPT Slide 3 + 综合仪表盘 allSalesData\n- 客户分析更新后，需同步PPT竞争分析章节的客户洞察\n\n## 常见陷阱

- 生命科学部3月金额Col 10, 4月Col 11: 必须动态识别列索引
- `for _,v in people` → 报错 `string indices must be integers`，必须写 `people.items()`
- HTML图表数据重复注入：每个部门用独立数组（dept_dk / dept_tz / dept_sm），不可复用同一变量
- `json.dumps()` 生成JS数组，注意中文无需额外转义
