# 原始表格式月度数据更新连锁反应模式

当用户以**纯表格式**（非Excel文件）提供新的月度总额数据时，必须执行以下连锁更新。此模式与从Excel提取的模式A/B/C/D不同——数据已是最终值，无需去重/聚合/部门分类。

## 触发信号

- 用户发送 `合同月份 | 求和项:价税合计2` 等表格式月度数据
- 用户说"更新202X年月度数据"并直接粘贴数字

## 更新连锁清单

### 1. 主数据源：`数据/diag_monthly.json`
- 比较新旧值，仅更新不一致的月份
- 记录新旧总额差异

### 2. 目标达成：`数据/diag_monthly_targets.json`
- 仅更新 `合计.{月}.actual` 和 `合计.{月}.rate`
- **不更新**部门级（大客户部/销售拓展部）——缺乏部门数据

### 3. 汇总文件：`数据/diag_summary.json`
- 更新 `total_revenue`（三年累计重算）
- 更新 `h1_2026.合计.actual` 和 `h1_2026.合计.rate`
- **不更新** `h1_2026.大客户部/销售拓展部`

### 4. HTML硬编码数字
- `诊断原料作战室.html`：H1 YoY 合计百分比（如 `+39.8%` → `+45.0%`）
- `宝锐统一工作平台.html`：Top60 的 `total` 值
- 用 `patch` 工具精准替换

### 5. 自动化刷新项（无需手动操作）
作战室中以下内容从 `diag_monthly.json` 动态计算，自动刷新：
- 总经理视图 KPI 卡片（三年分年金额）
- 月度营收趋势折线图（三年12月对比）
- 年度营收汇总表

## ⚠️ 无法自动刷新的文件（需明确告知用户）

由于缺少部门级/人员级的新数据，以下文件**不可更新**：

| 文件 | 影响模块 | 缺少的数据 |
|------|----------|-----------|
| `diag_dept_monthly.json` | 作战室部门月度对比图 | 大客户部/拓展部分月实际 |
| `diag_kpis.json` | 作战室个人KPI表 | 个人 y2024/y2025/y2026 |
| `diag_customers.json` | 作战室客户表 | 客户三年分年金额 |
| `diag_salespeople.json` | 作战室区域/销售员表 | 销售员三年分年金额 |

**处理方式**：更新完可刷新项后，明确列出上述文件及其影响，询问用户是否提供部门级数据。

## 部门数据缺口校验

更新月度总额后，始终校验 `diag_dept_monthly.json` 中 大客户部+销售拓展部 是否等于新总额：

```python
# 比较逐月部门合计 vs 总额
for month in range(1, 13):
    dept_sum = ka[month] + ex[month]
    gap = total[month] - dept_sum
    if gap > 0:
        print(f"{month}月: 部门合计={dept_sum} 总额={total[month]} 缺口={gap}")
```

缺口通常代表生命科学/生物医药等非诊断原料业务线，或未归属散单。**不可**简单按比例分摊——这会导致所有相关文件的数据失真。

## 2026-07-04 实战数据

| 文件 | 更新项 | 旧值 | 新值 |
|------|--------|------|------|
| diag_monthly.json | 2025全年 | 39,773,140 | 41,814,036 |
| diag_monthly.json | 2026 H1 | 21,402,245 | 23,003,713 |
| diag_monthly_targets.json | 合计 1-6月 actual | 逐月旧值 | 逐月新值 |
| diag_summary.json | total_revenue | 95,613,927 | 99,297,357 |
| diag_summary.json | H1 合计实际 | 21,402,245 | 23,003,713 |
| diag_summary.json | H1 达成率 | 70.9% | 76.2% |
| 诊断原料作战室.html | H1 YoY 合计 | +39.8% | +45.0% |
| 宝锐统一工作平台.html | Top60 total | 23,392,540 | 23,003,713 |
