# KPI 税合计 + 看板筛选器修复 (2026-08-01)

## KPI 数据源全局修复（#85）

### 数据现状
- `shipment_status.json`：2,056条订单，May-Jul 2026
- July：698订单，**530条(75%) `taxTotal=0`**，税合计仅175.8万
- `kpi_progress.json`：July total=**364.7万**（正确值）
- `kpi_dashboard.json`：H1 total=**2,164万**，全年目标6,950万

### 根本原因
MCP `field_51d592`（价税合计）的 `double_value` 0 值被 Python `or ''` 吞掉（pitfall #40），导致大量订单 `taxTotal=0`。

### 五个修复点

| 函数 | 之前 | 之后 | 值变化 |
|------|------|------|------|
| `renderDashboard` fullYearTax | `orders.reduce()` | `dash.total_h1 + prog.total` | 530→2528万 |
| `getShipmentOrders` fullYearTax | `shipments.full_year_tax \|\| 0` | `dash.total_h1 + prog.total` | 0→2528万 |
| `renderOrders` 本月 | `ps.taxTotal` | KPI覆盖=`prog.total` | 175.8→364.7万 |
| `renderOrders` 本季 | `ps.taxTotal` | `prog.total` | 175.8→364.7万 |
| `renderOrders` 本年 | `ps.taxTotal` | `dash.total_h1 + prog.total` | 530→2528万 |

## 看板筛选器 KPI 数据源（#86）

### 核心发现
`dash.depts[].target`（部门目标）≠ `dash.people[].target` 之和（个人加总）

```
大客户部: 部门2650万 ≠ 赵云浩1350+张立娅900=2250万 (差400万)
销售拓展部: 部门3400万 ≠ 个人加总2970万 (差430万)
生命科学部: 部门900万 ≠ 个人加总260万 (差640万)
```

根因：部门目标是岗位配额（大客户销售1=1350万、大客户销售2=1300万），个人数据是当前在岗人的承接份额。
岗位建在业务上非人上 → 人离职换人配额不变。

### 修复
```javascript
// 只选部门 → 用 dash.depts 部门级数据
if (dashboardDeptFilter.length > 0 && dashboardSalesFilter.length === 0) {
  (dash.depts || []).forEach(function(dp) {
    if (dashboardDeptFilter.indexOf(dp.dept) >= 0) {
      filteredAnnual += dp.target || 0;
      filteredYtd += dp.h1_total || 0;
    }
  });
} else if (filteredSalesSet) {
  // 选了人 → 用 dash.people 个人数据
  (dash.people || []).forEach(function(p) { ... });
}
```

## 看板筛选器权限模型（#84）

| 角色 | 筛选器 | 部门范围 | 默认 |
|------|:--:|------|------|
| admin/gm | ✅ | 全部 | 全公司 |
| 刘欣(manager) | ✅ | 销售拓展部 | 销售拓展部 |
| 吴云(manager) | ✅ | 生命科学部 | 浙江区域 |
| 韩远怀(manager) | ✅ | 生命科学部 | 广东区域 |
| sales | ❌ | — | 仅自己 |

Manager 默认锁定：首次加载自动应用管辖范围筛选，区域经理额外按 `_personnel.json.region` 匹配。

## 登录页下拉→文本输入（#87）
- CloudBase user_roles 同用户多文档导致下拉重复
- 改为邮箱/姓名文本输入，doLogin 先 email 后 name 查

## init() 自调用（#88）
- 大文件底部 init() 须用 readyState 检测
- `document.readyState === 'loading'` → DOMContentLoaded → 否则直接 init()

## 筛选器被表格遮挡（#27c）
- `.ms-drop` z-index 100→200，`.order-filter-bar` 加 position:relative+z-index:50

## CDN 缓存延迟
CloudBase CDN 有 5-10 分钟 TTL。部署后验证：
```bash
tcb hosting download 工具/app.html /tmp/verify.html -e bier-sales-d0gatbvlx288724e9
grep -c "期望特征" /tmp/verify.html
```

## app.html 合并遗漏清单
合并 index.html 渲染函数到 app.html 时遗漏的全局变量：
- `TABS` — 侧边栏定义
- `esc` / `fmtW` / `fmtMoney` / `colorByRate` / `colorByDays`
- `adaptMcpFields` / `extractLabel`
- `FEISHU_URL` / `FEISHU_CUSTOMER_URL` / `CATS` / `TODO_APIS` / `USER_DEPTS` etc.
