# KPI 看板卡片 · 三层递进布局

## 布局

看板 Tab 顶部 KPI 卡片采用 **当月 → 当季 → 当年** 三层递进（替代旧的 年度目标/本月vs上月/半年度进度）：

```
📅 8月 当月进展    📊 Q3 当季进展(7-9月)   🎯 年度目标 6950万
实际 115.7万        Q3实际 469.3万         累计 2631万
目标 717.9万 16.1%  Q3目标 2027万 23.2%     环形图 37.9%
环比7月 -67.3%      Q3剩余 1557.7万         年化 3946万
```

## 数据来源

| 字段 | 来源 | 代码 |
|------|------|------|
| 月实际 | `three_year_monthly.json` → `t2026['8']`，fallback `prog.total` | `h2Actuals[h2Idx]` |
| 月目标 | `kpi_dashboard.json` → dept级 `h2_months` 汇总 | `h2TargetsArr[h2Idx]` |
| Q3实际 | 同上 7+8+9月 `h2Actuals` | `h2Actuals[0]+[1]+[2]` |
| Q3目标 | 同上 `h2TargetsArr[0]+[1]+[2]` | — |
| 年度累计 | `kpi_dashboard.json` → `total_h1_h2` | **不是 total_h1！** |
| H1月度 | `h1_monthly.json` → `depts.<部门>.targets` | — |
| H2月度 | `kpi_dashboard.json` → `depts[].h2_months` | 3个部门汇总 |

## 代码位置

- **CloudBase版**: `工具/index.html` → `getKPI()` L993, `renderDashboard()` L1250
- **飞书版**: `工具/app.html` → `getKPI()` L595, `renderDashboard()` L700

## Pitfalls

### P1: ytd 取 total_h1 导致年度累计低估
- **症状**: 卡片显示"累计达成 2164万"，缺少 H2 数据（应为 2631万）
- **根因**: `var ytd = dash.total_h1 || 0;` 只取了上半年
- **修复**: 改为 `var ytd = dash.total_h1_h2 || dash.total_h1 || 0;`
- **影响**: `index.html` L993 + `app.html` L595 —— **两个文件都要改！**
- **部署**: `tcb hosting deploy 工具/index.html /workbench/index.html -e bier-sales-...`

### P2: index.html vs app.html 双文件惯性
- `index.html` = CloudBase `/workbench/index.html` 源文件
- `app.html` = 飞书内嵌工作台（本地 HTTP `127.0.0.1:8765`）
- 任何逻辑修改必须两个文件同步！改了一个忘了另一个导致飞书/CloudBase数据不一致

## 部署命令

```bash
# KPI 看板 HTML
tcb hosting deploy 工具/index.html /workbench/index.html -e bier-sales-d0gatbvlx288724e9

# 数据文件
bash ~/.hermes/scripts/cb_sync_data.sh
```
