# KPI Pipeline 比例分摊根因分析（2026-08-03）

## 发现经过

用户提供7月ERP销售订单导出后，对比发现：
- ERP真实7月销售额：¥353.6万（标准销售订单，按销售员汇总）
- kpi_dashboard.json 显示7月：¥251.2万
- 差距：+101.5万（+40%）

进一步追踪发现个人级数据全部虚假：
- 路要峰：KPI 8.3万 vs ERP 47.0万（差5.7倍）
- 黄建华：KPI 12.5万 vs ERP 0.4万（高估31倍）

## 根因链

### 断点①：MCP金额字段为0

飞书项目MCP的「销售订单」工作项类型不返回财务金额。`金额`/`价税合计`/`含税单价` 等字段几乎全为0。这是飞书项目系统的设计限制——项目管理系统不存ERP财务数据。

参考：`references/mcp-sales-amount-limitation.md`（已在skill中）

### 断点②：比例分摊算法

`mcp_kpi_pipeline.py` v3 的实现：

```python
# 第23-26行：从MCP汇总得到错误总额
total_july = 0.0
for d, summary in sales.get('daily_summary', {}).items():
    if d.startswith('2026-07'):
        total_july += summary.get('amount', 0)
# total_july = 2,511,942（真实应为3,536,116）

# 第40-42行：按部门目标比例分摊
dept_ratio = {d: t/total_target for d, t in dept_targets.items()}
actual = total_july * dept_ratio.get(dn, 0)
# 销售拓展部: 2,511,942 * (34M/69.5M) = 1,228,864

# 第58-60行：再按个人目标比例分摊到人
person_ratio = person['target'] / dept_person_total
person_actual = dept_actual * person_ratio
# 路要峰: 1,228,864 * (2M/29.7M) = 82,752
```

每个数字都等于 `MCP错误总额 × (个人目标/总目标)`。完全与真实销售无关。

## 修复

mcp_kpi_pipeline.py v4：直接从ERP Excel读取，按销售员真实汇总。

```python
for row in ws.iter_rows(min_row=2):
    if doc_type == '标准销售订单' and status == '已审核':
        by_sp[sp] += amt  # 真实金额
# 直接写入 kpi_dashboard.json
person['h2_actual_months'][MONTH_IDX] = round(by_sp.get(pname, 0), 2)
```

## 影响范围

| 文件 | 修复前 | 修复后 | 状态 |
|------|--------|--------|------|
| kpi_dashboard.json | 251.2万（分摊虚假） | 352.6万（ERP真实） | ✅ |
| kpi_progress.json | 2.9万（仅冯贤平） | 353.6万（ERP真实） | ✅ |
| mcp_kpi_pipeline.py | v3（分摊） | v4（直读ERP） | ✅ |

## 后续防护

1. `mcp_kpi_pipeline.py` v4 已写入项目，cron自动调用
2. 每月收到ERP导出后自动更新kpi_dashboard.json
3. 如果kpi_dashboard.json中每个人的h2_actual与其目标比例完全一致→触发告警
4. 前端应显示数据来源标签：「🟢ERP真实」vs「🔴MCP估算」
