# 三文件交叉验证仪表盘更新模式

当用户提供三个数据文件（活动导出+销售订单+人员清单）要求更新销售仪表盘时。

## 文件

| 文件 | 典型名称 | 核心字段 |
|------|---------|---------|
| 活动导出 | `活动导出-销售管理-2026年X月*.xlsx` | 客户/活动描述/创建者/创建时间 |
| 销售订单 | `销售订单_2026年X月*.xlsx` | 合同日期/客户/销售员/价税合计/单据类型/是否赠品 |
| 人员清单 | `统一工作台运行及授权.xlsx` Sheet人员清单 | 销售员/区域/部门/角色/是否在职 |

## 流程

### 1. pandas 汇总
```python
# 销售订单：排除合计行、赠品(价税合计=0)、测试单
df_valid = df[(df['价税合计']>0) & ~df['单据编号'].str.contains('合计',na=False)]
# 核心指标：总销售额、订单数(去重)、客户数(去重)
# 销售员业绩：groupby('销售员').agg({价税合计:'sum', 单据编号:'nunique', 客户:'nunique'})
# 产品大类分布
```

### 2. 人员-部门映射
从人员清单建立 `{销售员: {部门, 区域, 在职状态}}` 映射，用于：
- 应收账款按部门归属
- 销售员业绩按部门汇总
- 统计在职人数

### 3. 交叉验证
将新数据与已有 JSON 对比：
```python
# vs kpi_progress.json: total金额匹配
# vs kpi_dashboard.json: 部门/个人数据一致性
# vs my_kpis.json: 个人月度数据同步
```

### 4. 更新目标
- HTML 仪表盘：统计卡片、面板标题、数据标签
- 底层 JSON：kpi_progress.json / kpi_dashboard.json / my_kpis.json / _personnel.json

## 关键陷阱

- **目标文件确认**：必须确认用户要的是 `销售工作台.html`（888行）还是 `宝锐销售工作台_生产版-ima.html`
- **不在人员清单中的销售员**（如刘斌）：先确认归属再更新，不要直接标记"未归属"
- **合计行过滤**：`单据编号`含"合计"的行必须删除
- **赠品/测试排除**：价税合计=0的不计入销售额统计
- **总监个人单**：刘新元的个人试剂单（无部门归属）需单独处理
