# 工作台 Tab 数据源与新鲜度检查

> 最后更新：2026-08-07

## Tab → 数据源映射

工作台共 9 个 Tab，按业务线可见。`workbench_data.json` 是通过 `merge_workbench_data.py` 聚合后的统一数据文件。

| Tab | 业务线 | 数据源文件 | 嵌入字段 | 更新频率 | 刷新方式 |
|-----|:---:|---|------|:---:|---|
| 📊 看板 | DA/LS | `kpi_dashboard.json` | `kpiDashboard` | 每日 | MCP(role)→ERP Excel→merge→deploy |
| | | `kpi_progress.json` | `kpiProgress` | 每日 | MCP(role)→merge→deploy |
| | | `h1_monthly.json` | `h1Monthly` | 静态(H1) | 一次性部署 |
| | | `my_kpis.json` | `myKpis` | 静态(年度) | 一次性部署 |
| | | `three_year_monthly.json` | `threeYearMonthly` | 月度 | ERP Excel→手动更新 |
| | | `h2_monthly_targets.json` | `h2Targets` | 静态(年度) | 一次性部署 |
| | | `mcp_complaints.json` | `complaints` | 每日(但常滞后) | MCP→merge→deploy |
| | | `shipment_status.json` | `shipments` | 每日3次 | 顺丰管线 |
| 🔬 课题组 | LS | `ls_groups.json` | — | 按需 | 飞书MCP手动拉取 |
| 📋 客户 | DA | `mcp_customers.json` | `mcpCustomers` | 每日(但常滞后) | MCP→merge→deploy |
| | | `customer_contacts.json` | `customerContacts` | 每日(但常滞后) | MCP→merge→deploy |
| 📝 访前准备 | DA/LS | API实时(`/api/visit-card`) | — | 实时 | Tailscale Funnel |
| 🎯 商机沙盘 | DA | `opportunity_sandbox.json` | `oppSandbox` | 按需(手动) | Excel→脚本导入 |
| 🔴 客诉 | DA | `mcp_complaints.json` | — | 每日(但常滞后) | MCP→merge→deploy |
| 📦 订单管理 | DA/LS | `mcp_orders_input.json` | — | 每日 | MCP→顺丰管线 |
| | | `shipment_status.json` | — | 每日3次 | 顺丰管线 |
| 📅 我的活动 | DA/LS | `my_activities.json` | `myActivities` | 按需 | MCP手动拉取 |
| | | `daily_activities_mcp.json` | — | 每日09:00 | Cron日报管线 |
| ✅ 待办 | DA/LS | `todos.json` | — | 每日09:00 | Cron日报管线 |

## 新鲜度检查方法

```bash
# 批量查看数据文件修改时间
ls -la ~/Desktop/Hermes输出-工作类/数据/*.json | awk '{print $6, $7, $NF}' | sort -r

# 或精确到分钟
python3 -c "
import os, json
from datetime import datetime
data_dir = os.path.expanduser('~/Desktop/Hermes输出-工作类/数据')
files = [(f, os.path.getmtime(os.path.join(data_dir, f))) for f in os.listdir(data_dir) if f.endswith('.json')]
files.sort(key=lambda x: x[1], reverse=True)
now = datetime.now()
for f, ts in files:
    days = (now - datetime.fromtimestamp(ts)).days
    flag = '🔴' if days > 10 else ('🟡' if days > 5 else '✅')
    print(f'{flag} {f:35s} {datetime.fromtimestamp(ts).strftime(\"%Y-%m-%d %H:%M\")} ({days}天前)')
"
```

## 典型过期模式

| 数据文件 | 典型滞后天数 | 根因 | 修复 |
|---------|:---:|---|------|
| `opportunity_sandbox.json` | 15-20天 | 手动导入，依赖Excel更新 | 用户提供新Excel→运行导入脚本 |
| `mcp_complaints.json` | 10-15天 | Chron任务常遗漏 | 手动运行MCP管线 |
| `mcp_customers.json` | 10-15天 | 同上 | 手动运行MCP管线 |
| `my_activities.json` | 7-10天 | 手动拉取 | 运行MCP活动管线 |
| `ls_groups.json` | 7-15天 | 手动拉取 | 运行MCP课题组管线 |
| `kpi_progress.json` | 0-2天 | Chron每日运行但8月数据常为0 | 检查ERP是否有新数据 |

## 刷新优先级

当用户问"哪些数据没更新"时，按以下优先级检查并回复：

1. **先看文件时间**（ls -la 数据/*.json）
2. **交叉验证** workbench_data.json 内嵌的 `_merged_at` 字段
3. **重点关注**：商机沙盘(最易过期) > MCP客户/客诉(Chron易断) > 活动/课题组(按需)
4. **跳过**：KPI(每日自动)、物流(每日3次)、待办(每日)
5. **KPI 8月数据**：即使文件新鲜，也需检查 `kpi_progress.json` 中个人数据是否为0
