# CMA验证数据需求规范（双实体验证矩阵）

> 建立：2026-08-19 | 提出：任总（两套数据验证决策 + "每次需要什么样的数据"）
> 核心原则：酣客=验收场（真实客户数据，最后碰），博海=试验田（随便折腾，先试错）
> 验证策略："先博海试验，再酣客验收"

## 一、双实体角色分工

| 实体 | 角色 | 用途 | 数据量 |
|:----|:----|:----|:------|
| 陕西博海（id=2） | **试验田** | 新功能试错/MCP测试/破坏性测试/快速迭代 | 16 KPI / 316 数据点 |
| 陕西酣客（id=1） | **验收场** | 客户验收/真实场景/交付演示 | 70 KPI / 1269 数据点 |
| 测试企业（id=3等） | 自动化测试 | CI跑用例（不人工碰） | 空 |

```
铁律：新功能先在博海跑通，再碰酣客数据
     破坏性操作（删除/清空/批量改）只在博海或测试实体做
```

## 二、各验证场景所需数据（核心矩阵）

### 场景1：功能开发验证（新功能/改代码）
| 数据需求 | 博海（试验田） | 说明 |
|:--------|:------------|:----|
| KPI定义 | ≥5个（覆盖4维度：财务/客户/流程/学习） | 测维度筛选 |
| KPI数据点 | ≥50个（≥3个周期，含红黄绿各态） | 测红黄绿判定 |
| 预警 | ≥3条（红/黄各至少1条） | 测预警列表 |
| 预算 | ≥3个 | 测预算对比 |
| 行动计划 | ≥2个（含1个逾期） | 测逾期逻辑 |
| 组织 | ≥5个节点 | 测部门归属 |

### 场景2：MCP封装验证（本次重点）
| 数据需求 | 博海 | 说明 |
|:--------|:----|:----|
| KPI（含历史） | ≥5个KPI × ≥3周期 | 测cma_kpi_history |
| 预警 | ≥2条 | 测cma_query_alerts |
| 预算 | ≥2个 | 测cma_budget_plans |
| 概览数据 | 完整（KPI+预警+预算都有） | 测cma_overview |
| **空值KPI** | ≥1个（无数据） | 测容错（AI问空数据不能崩） |
| **异常KPI** | ≥1个（目标为0/负值） | 测边界 |

### 场景3：客户验收/演示（酣客数据）
| 数据需求 | 酣客 | 说明 |
|:--------|:----|:----|
| 全量KPI | 70个（保持现状） | 真实场景 |
| 关键KPI数据 | 财务核心（营收/净利/成本率）必须有最近3期 | 老板最关注 |
| 预警 | 真实预警（有红黄） | 展示预警价值 |
| 战略地图 | ≥1张 | 展示战略层 |
| 报表 | ≥1份BI报表 | 展示汇报能力 |
| **演示剧本** | 3个核心场景（看KPI/查预警/看趋势） | 演示有故事线 |

### 场景4：回归验证（改完不破坏）
| 数据需求 | 两套都跑 | 说明 |
|:--------|:--------|:----|
| 博海 | 16 KPI / 316 数据点 | 快跑（功能不坏） |
| 酣客 | 70 KPI / 1269 数据点 | 全跑（数据不坏） |
| 关键对比 | 修复前后数据一致性 | 确认无副作用 |

### 场景5：破坏性/边界测试
| 数据需求 | 只准博海/测试实体 | 说明 |
|:--------|:--------------|:----|
| 清空KPI值 | 博海子集（备份后） | 测空态UI |
| 大量数据导入 | 造1000+行 | 测性能 |
| 异常格式 | 特殊字符/超长字段 | 测容错 |
| 权限越界 | 用测试账号 | 测权限 |

## 三、数据准备清单（最小可用数据集）

### 博海试验田（最小16个KPI覆盖全场景）
```
4维度各≥1个：
  财务：F_REVENUE（营收）/ F_NET_PROFIT（净利）/ F_COST_RATIO（费用率，反向）
  客户：C_SATISFACTION（满意度）/ C_REBATE_RATE（渠补率，反向）
  流程：P_DELIVERY（交付及时率）
  学习：L_TRAINING（培训完成率）
    ↓
状态覆盖：
  绿色≥2（达标）、黄色≥1（预警）、红色≥1（危险）、灰色≥1（无数据）
    ↓
周期覆盖：
  最近3期（2026-06/07/08）每期都有值
    ↓
边界覆盖：
  1个KPI目标=0（测除零）、1个KPI无数据（测空态）
```

### 酣客验收场（保持真实，不造假）
```
❌ 禁止：为测试给酣客造假数据
✅ 做法：用真实数据，缺的周期标注"待补充"
    ↓
验证时用"真实数据 + 演示剧本"：
  ① 看我的KPI（营收/净利红黄绿）
  ② 查预警（哪些指标危险）
  ③ 看趋势（最近3期变化）
```

## 四、验证执行检查清单（每次验证前过一遍）

```
[ ] 1. 确认验证类型（功能/MCP/验收/回归/破坏）
[ ] 2. 选数据源：功能/MCP/破坏→博海；验收→酣客；回归→两套
[ ] 3. 数据准备：对照上面的"最小可用数据集"检查是否齐全
[ ] 4. 空值/异常KPI是否在（测容错）
[ ] 5. 备份：改动前备份目标实体数据（mysqldump）
[ ] 6. 执行验证 + 记录结果
[ ] 7. 验证后检查：consistency-check 无新错误
```

## 五、验证数据速查表（一句话版）

| 验证类型 | 用哪套 | 最少需要 |
|:--------|:------|:--------|
| 新功能 | 博海 | 5 KPI × 3期 + 红黄绿各1 |
| MCP封装 | 博海 | 5 KPI×3期 + 空值KPI + 异常KPI |
| 客户验收 | 酣客 | 70 KPI + 3期 + 演示剧本 |
| 回归 | 两套 | 全量对比 |
| 破坏性 | 博海/测试 | 备份后随意 |

## 六、数据录入归属规范（实体自动判断）

> 2026-08-19 任总提问"输入数据时明确博海还是酣客？系统能否自动判断"——已确认系统现状与增强方案

### 系统现状（账套模式已存在）
```
① 登录必须选企业（entity_id）：
   auth.py："账套模式：请选择登录企业"
   → 用户登录时选酣客 or 博海
    ↓
② token绑定实体（安全）：
   token.entity_id = 唯一可信来源
   用户只能访问被授权的企业（user_entities表）
    ↓
③ Bot通道（X-Entity-Id header/query）：
   白名单Bot可指定实体，但token存在时忽略query（防越权）
    ↓
④ 兜底默认：1（酣客）
```

### 结论：输入时无需每次明确
```
人工录入（网页）：
  登录时已选 → 数据自动归到所选企业（token绑定）
  → 不需要每次输入时再明确
    ↓
Bot/API导入：
  可以指定X-Entity-Id → 需要明确（API调用时传）
    ↓
唯一边界：一个Excel混了两家公司数据 → 需增强
```

### 自动判断三级方案（待实现，0.5天）
```
① 登录实体（token.entity_id）→ 默认归属
② Excel内容检测：表头/首列是否含"酣客/博海"字样
   → 有：覆盖归属（跨公司导入场景）
   → 无：用登录实体
③ 文件名检测：文件名含"酣客/博海"→ 辅助判断
    ↓
④ 冲突时（登录=博海 但 内容=酣客）：
   → 弹确认："检测到酣客数据，确认归属？"
   → 人工点一下（不自动改，防误）
```

### 实现位置
```
后端：data.py import_excel_smart 加 _detect_entity()（~30行）
前端：import弹窗加实体确认（~20行）
状态：待排期（记入待办，非紧急）
```

## 七、关联
- kpi-account-governance-rule.md（科目≠KPI规范）
- 双实体验证决策（2026-08-19 任总）
- 铁律七（验证不信任自述）
- MCP封装（cma-mcp-strategy.md：先博海试，后酣客验）
