# 新增销售员全系统一致性检查

当有新销售员入职时，须逐项确认以下系统数据一致。

## 检查清单

| # | 系统 | 文件 | 检查项 | 验证命令 |
|---|------|------|--------|---------|
| 1 | 人员清单 | `数据/pricing/_personnel.json` | name/dept/region/price_level/status | `grep "name" _personnel.json` |
| 2 | 作战室 KPI | `数据/diag_kpis.json` | annual_target/diag_revenue/region | 搜 name 字段 |
| 3 | 作战室 salespeople | `数据/diag_salespeople.json` | region/dept/amount/customers | 搜 name 字段 |
| 4 | 统一工作平台 | `工具/宝锐统一工作平台.html` | PERSONNEL 数组中 region | `grep "姓名"` |
| 5 | 销售工作台 | `工具/销售工作台.html` | 区域映射 + SALES_UNIT_IS_YUAN | `grep "姓名"` |
| 6 | 客户价格表映射 | `数据/pricing/_dept_sp_custs.json` | dept 下应有该销售员客户列表 | Python 遍历 |
| 7 | KPI 仪表盘 | `数据/kpi_dashboard.json` | target/h2_months | 搜 name 字段 |
| 8 | 个人 KPI | `数据/my_kpis.json` | annual_target/monthly | 搜 name 字段 |
| 9 | 客户数据 | `数据/diag_customers.json` | salespeople 字段含该销售员 | 搜 salespeople 数组 |

## 关键 Pitfall

1. **区域不一致**：`_personnel.json` 可能正确，但 HTML 硬编码的 PERSONNEL 数组可能过期。每次新员工入职必须同步更新 HTML。
2. **KPI 目标为 0**：`diag_kpis.json` 的 `annual_target` 可能未设置，需从 `kpi_dashboard.json` 确认后手动写入。
3. **过滤逻辑验证**：统一工作平台用 `sales.filter(s => s.salesperson===PERSON)`，须确认底层数据的 `salesperson` 字段值与 PERSONNEL 中的 `name` 一致。

## 一致性验证脚本

```python
import json
DATA = '数据/'

# 读取各数据源
with open(f'{DATA}/pricing/_personnel.json') as f:
    personnel = [p for p in json.load(f)['personnel'] if p['status']=='在职']
with open(f'{DATA}/diag_kpis.json') as f: kpis = json.load(f)
with open(f'{DATA}/diag_salespeople.json') as f: sp = json.load(f)

# 交叉检查
for p in personnel:
    name = p['name']
    k = [x for x in kpis if x['name']==name]
    s = [x for x in sp if x['name']==name]
    kpi_region = k[0]['region'] if k else 'MISSING'
    sp_region = s[0]['region'] if s else 'MISSING'
    if p['region'] != kpi_region or p['region'] != sp_region:
        print(f'❌ {name}: personnel={p["region"]} kpi={kpi_region} sp={sp_region}')
    if k and k[0].get('annual_target', 0) == 0:
        print(f'⚠️ {name}: annual_target=0')
```
