# 销售工作台认证系统：`state.user` 双格式兼容

## 问题

销售工作台存在两套认证系统，`state.user` 可能是两种格式：

| 格式 | 来源 | 示例值 |
|------|------|--------|
| **旧格式（字符串）** | `localStorage` 旧数据、`AUTH` 硬编码 | `'zhaoyunhao'`, `'gm'` |
| **新格式（对象）** | CloudBase 登录 API (`/api/login`) | `{name:'宋学伟', role:'sales', dept:'诊断原料销售拓展部', email:'songxuewei@biori.com', tabs:{}}` |

当用新格式登录后，所有将 `state.user` 当作字符串 key 去查 `USER_DEPTS[state.user]` 或 `AUTH[state.user]` 的代码**静默失败**（返回 undefined），导致订单管理/客户过滤全部失效，用户看到全公司数据。

## 修复：统一辅助函数

```javascript
// 放在 USER_DEPTS 定义之后

function getUserName() {
  if (!state.user) return '';
  if (typeof state.user === 'object') return state.user.name || '';
  return state.user;
}

function getUserRole() {
  if (!state.user) return '';
  if (typeof state.user === 'object') return state.user.role || 'sales';
  return state.user;
}

function isAdminUser() {
  var r = getUserRole();
  return r === 'admin' || r === 'gm' || r === 'director';
}
```

## 受影响的代码点（全部修复为用辅助函数）

| 位置 | 旧代码 | 新代码 |
|------|--------|--------|
| `getFilteredCustomers()` | `AUTH[state.user].name` | `getUserName()` |
| `getShipmentOrders()` | `USER_DEPTS[state.user]` (对象作 key) | `isAdminUser() ? 全部 : creatorEmail 匹配` |
| `renderTodos()` 关闭 feed | `state.user === 'gm' \|\| state.user === 'director'` | `isAdminUser()` |
| `syncToDirector()` | `AUTH[state.user].label` | `getUserName()` |
| `exportTodos()` | `AUTH[state.user].label` | `getUserName()` |

## 订单管理权限隔离：用 `creatorEmail` 精确匹配

最可靠的权限隔离方式是用 `creatorEmail`（拼音邮箱）而非部门名或中文名：

```javascript
// 在 getShipmentOrders() 中
if (!isAdminUser() && state.user && state.user.email) {
  var userEmail = state.user.email;
  orders = orders.filter(function(o) { return o.creatorEmail === userEmail; });
  fullYearTax = orders.reduce(function(s, o) { return s + (o.taxTotal || o.amount || 0); }, 0);
}
```

**比部门映射好在哪？**
- `creatorEmail` 是精确一对一，不依赖部门名称一致性
- 不受人员调岗影响
- 数据源 `shipment_status.json` 中 100% 订单都有 `creatorEmail`

## USER_DEPTS 用中文名作 key

```javascript
var USER_DEPTS = {
  '赵云浩': ['诊断原料大客户销售部'],
  '张立娅': ['诊断原料大客户销售部'],
  '宋学伟': ['诊断原料销售拓展部'],
};
```

注意 key 是中文名（与 `getUserName()` 返回值一致），不是登录邮箱前缀。

## 新增用户检查清单

添加新销售人员（如宋学伟）到工作台时，逐项检查：

1. `_personnel.json` — name/dept/role/region/price_level/status（数据/pricing/_personnel.json）
2. `DEFAULT_USERS` — 后端 `销售工作台服务.py` 第 217 行，email → {name, role, dept}
3. `PERSONNEL` 数组 — `宝锐统一工作平台.html` 第 92 行，{name, dept, role, region}
4. `USER_DEPTS` — `销售工作台.html` 第 1710 行（如需要部门级过滤）
5. `diag_kpis.json` — 作战室 KPI，annual_target 须正确（非 0）
6. `kpi_dashboard.json` — 工作台 KPI，target 须正确
7. 区域一致性：所有文件中 region 统一（不要一个写江苏一个写华东）
8. 飞书登录：`songxuewei@biori.com` + `biori2026`，后端 API 验证通过
