# ERP 订单 → 销售员级月度销售额 口径（2026-09-08 校准）

从 ERP 订单 Excel 计算各销售员月度销售额（用于 KPI / 个人年度达成排名表）。核心脚本 `脚本/erp_sales_core.py`（`find_latest_erp()` 找最新 ERP 文件 + `aggregate()` 聚合 + `load_mappings()` 载人员/23客户映射）。

## 金额口径

- 单据类型 = `标准销售订单`（`测试销售订单`/`样机测试订单` 的价税合计全为 0；`预测订单` FO 开头单据编号不计销售）
- 单据状态 = `已审核`
- 金额 = `价税合计` / 10000 = 万元（价税合计是含税额，单位元）
- 月份从 `合同日期` 取，1-8月报告须过滤 `月<=8`

## 人员映射（岗位口径，关键）

```python
# 黄明月 / 张立娅 的订单 → 刘子研（大客户1岗前序）
# 刘新元 的订单：客户在「23家客户」内 → 刘子研（代管）；否则不计入 KPI 人员
# 其余按「销售员」字段 + person_dept 映射
```

刘子研岗位口径 = 黄明月(1-5月) + 张立娅(6-7月) + 刘新元代管 23家客户 → 合计 ≈ 567.8万（报告值）。

**23家客户来源**：`数据/pricing/_key_customers.json` 中 `salesperson == '刘子研'` 的客户名。
⚠️ 该 JSON 是 **LIST of dict**（不是 dict），每项含 `name`/`salesperson`/`sales` 字段：

```python
import json
kj = json.load(open('数据/pricing/_key_customers.json', encoding='utf-8'))
lzy_custs = set(c.get('name') for c in kj if (c.get('salesperson') or c.get('sales') or '') == '刘子研')
```

## 2025 历史数据（同期对比）

`2024和2025历史数据/2025全年订单.xlsx` 的 **`Sheet1` 是全年完整数据**（其余 `1-5月`/`6月` sheet 是分月重复，勿用）。

- ⚠️ 2025 数据 **无「单据状态」列**，口径 = 标准销售订单 + 非赠品 + 剔除宝锐系
- ⚠️ 2025 的「销售员」列里 **`大客户1`/`大客户2` 是岗位名不是人名**（对应 2026 的刘子研/赵云浩）。映射：`{'刘子研':'大客户1', '赵云浩':'大客户2'}`，其余同名
- 生命科学部是 2026 新设业务线，多数人无 2025 基线（同比显示"—"）

## 坑

- `erp_sales_core.aggregate()` 返回的 `monthly_person` **含 9 月数据**，做 1-8月报告必须再过滤 `月<=8`，否则「合计」比报告偏大（如路要峰 264.0 含 9 月 27.5，1-8月实为 236.6）。
- 报告累计值 = 简单口径（标准+已审核，价税合计/10000）与 ERP 原始数据**精确吻合**；用 erp_sales_core 全口径（加非赠品+宝锐系过滤）可能有 0.1 级差异，以简单口径为准。
- 每份报告用最新 ERP 文件（`销售订单_20260101-20260907.xlsx` 等，按 mtime 取 `find_latest_erp()`），月份路由以 ERP 为准。
