# /api/chat 对话测试用例

> 基于 dialog-interpret + needq-calc + wind-hazard-diagnosis 技能 + 已注册工具覆盖编写
> 
> 测试方式：`POST /api/chat`，参数 `message`（form-data）

---

## 一、巷道监测数据解读（dialog-interpret 核心）

### 1.1 默认指标解读（风速 + 风量）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C01 | "15216 辅运起坡段当前情况怎么样" | 触发 dialog-interpret，自动解读风速+风量，调用 query_tun_data_by_id → 输出对比报告 |
| C02 | "帮我看看北二盘区回风巷" | 同上，未指定指标时默认解读风速+风量 |
| C03 | "三水平主运大巷现在数据如何" | 如果 query_tunnel_list 匹配到多条，列出候选让用户继续提问 |

### 1.2 指定指标解读

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C04 | "15216 工作面瓦斯浓度怎么样" | 查询指定巷道瓦斯数据，对比规程阈值 |
| C05 | "北二回风巷 CO 是否超限" | 查询 CO 浓度，判断是否 ≥0.0024% |
| C06 | "15216 辅运起坡段温度多少" | 查询温度，按采掘面 26/30℃ 规则判断 |
| C07 | "主运大巷氧气含量正常吗" | 查询 O₂，判断是否 ≥20% |

### 1.3 风量合规判断

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C08 | "二水平辅运大巷风量满足计划吗" | 查询实际风量 vs 计划风量，计算缺口比例 |
| C09 | "15216 工作面风速是否超限" | 查询风速，对比规程允许范围 |

---

## 二、设备查询（新增工具）

### 2.1 设备类型字典

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C10 | "系统里有哪些设备类型" | 调用 get_device_kind_dict → 列出大类小类 |
| C11 | "传感器类型都有哪些" | 同上 |
| C12 | "modelsensor_speed 是什么设备" | 调用 get_device_kind_dict → 翻译编码为中文 |

### 2.2 按类型查设备列表

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C13 | "列出所有风速传感器" | 先 get_device_kind_dict 取编码 → get_device_list_by_kind → 输出设备清单 |
| C14 | "有哪些甲烷传感器" | 同上 |
| C15 | "温度传感器有哪些" | 同上 |

### 2.3 单设备实时数据

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C16 | "设备 FAN-001 当前读数多少" | 调用 query_device_realtime_data(device_id="FAN-001") |
| C17 | "传感器 11111004 现在什么状态" | 同上，返回在线状态、读数、报警 |

### 2.4 巷道关联设备

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C18 | "15216 辅运起坡段绑了哪些设备" | 调用 query_devices_by_tunnel |
| C19 | "北二回风巷有哪些传感器" | 同上 |

---

## 三、历史趋势查询

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C20 | "15216 工作面近7天风速变化趋势" | 调用 list_ventanaly_monitor_data_days → 输出趋势图描述（均值/最值/趋势方向） |
| C21 | "北二回风巷上个月温度怎么样" | 换算时间范围，调用历史数据工具 |
| C22 | "三水平主运大巷最近24小时风量有波动吗" | 同上 |

---

## 四、巷道/模型列表查询

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C23 | "帮我查一下模型下面有哪些巷道" | 调用 query_tunnels_by_model |
| C24 | "搜一下名字带'辅运'的巷道" | 调用 query_tunnel_list 模糊匹配 |
| C25 | "15216 这个模型下有多少条巷道" | 调用 query_tunnels_by_model |

---

## 五、规程知识库查询

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C26 | "煤矿安全规程对回风巷风速有什么要求" | 调用 query_knowledge_base → 返回条款原文 |
| C27 | "采煤工作面瓦斯报警浓度是多少" | 同上 |
| C28 | "AQ1056 风量计算方法是什么" | 同上 |

---

## 六、需风量计算（needq-calc 技能）

### 6.1 采煤工作面计算

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C29 | "计算一下 15216 工作面的需风量" | 触发 needq-calc，逐步引导填写参数（采高、控顶距、瓦斯涌出量等） |
| C30 | "采煤面按瓦斯量算需风量，绝对涌出量 3.2，不均衡系数 1.5" | 调用 calc_face_by_gas |
| C31 | "采煤面按人数算需风量，最多 40 人" | 调用 calc_face_by_workers |
| C32 | "采煤面按风速验算，断面 18 平米" | 调用 calc_face_by_wind_speed |

### 6.2 掘进工作面计算

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C33 | "掘进面需风量怎么算" | 触发 needq-calc，引导参数 |
| C34 | "掘进面炸药量 8kg，帮我算需风量" | 调用 calc_tunnel_by_explosives |
| C35 | "掘进面 15 个人同时作业，需风量多少" | 调用 calc_tunnel_by_workers |

### 6.3 硐室计算

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C36 | "机电硐室需风量，设备功率 200kW" | 调用 calc_chamber_by_equipment |
| C37 | "硐室按风速验算，断面 12 平米" | 调用 calc_chamber_by_wind_speed |

### 6.4 管控平台数据

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C38 | "通防管控平台上各地点需风量是多少" | 调用 get_needq_all_data → 展示所有用风地点数据 |
| C39 | "管控平台的配风情况帮我看看" | 同上 |

### 6.5 汇总计算

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C40 | "帮我把刚才算的各地点汇总一下总需风量" | 调用 calc_total_air_volume |
| C41 | "这个工作面的有效断面帮我算一下" | 调用 calc_effective_area |

---

## 七、风速风量隐患判识（wind-hazard-diagnosis 技能）

### 7.1 全量诊断触发

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C51 | "查询当前风速风量数据有没有问题" | 触发 wind-hazard-diagnosis，走 Step1~Step8 全流程：获取测风装置清单 → 逐台查实时数据 → 巷道类型判定 → 风速超限判定 → 需风量关联 → 重大隐患比对 → 输出分级结论 |
| C52 | "帮我做一次测风数据判识" | 同上，触发完整诊断流程 |
| C53 | "风速风量有没有隐患" | 同上，最后询问是否生成 md 报告 |
| C54 | "全矿测风装置数据排查一下" | 获取全量清单，逐台判识，输出总览+逐台明细 |

### 7.2 生成报告

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C55 | "生成测风数据分析报告" | 触发技能 Step9：生成固定格式 `测风装置实时数据分析报告_YYYY-MM-DD.md`，严格按 0~八 章节输出 |
| C56 | "把刚才的诊断结果写成报告" | 同上，复用前一轮已获取的数据生成报告 |
| C57 | "不要报告，就告诉我结论" | 技能结束时不写文件，仅输出会话结论 |

### 7.3 重点巷道诊断

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C58 | "15216 工作面的测风数据有没有超限" | 触发技能，定位到该工作面关联的测风装置，逐项判识风速/风量/报警 |
| C59 | "北二回风巷风速风量排查隐患" | 同上，按巷道类型（采区回风巷→0.25~6 m/s）判定 |
| C60 | "总回风巷风量够不够" | 关联通风系统总需风量 qra，判定是否满足系统级需风量 |

### 7.4 模拟/离线数据场景

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C61 | "测风数据看起来很规律像是模拟的怎么办" | 技能 Step2 模拟数据识别：检查风量≠风速×断面×60、多台数据雷同 → 标注"模拟数据，不可用于生产判识" |
| C62 | "有台测风装置离线了怎么处理" | 标记为"无实时数据/离线"，在报告中归入 🔴 高风险 |

### 7.5 隐患分级与红线判定

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C63 | "有没有触犯重大隐患判定标准的" | 技能 Step7：系统级/用风点级供风量 < 需风量×75% → 判定是否构成重大事故隐患 |
| C64 | "帮我列出所有高风险点" | 输出 🔴 高风险（离线/超速/活跃报警/风量严重不足）清单 |

---

## 八、多轮对话

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C65 | 第1轮："15216 辅运起坡段风速怎么样" → 第2轮："那风量呢" | 第2轮应记住上下文（同一巷道），无需重复巷道名 |
| C66 | 第1轮："帮我算采煤面需风量" → 第2轮："刚才算的是按瓦斯算的吗" | 记住前一轮计算上下文 |
| C67 | 第1轮："列出所有风速传感器" → 第2轮："第3个的实时数据" | 记住设备列表上下文，取第3个设备ID查询 |
| C68 | 第1轮："全矿风速风量排查" → 第2轮："生成报告" | 第2轮复用前一轮已获取的诊断数据，生成 md 报告 |

---

## 九、边缘/异常场景

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C69 | "全矿瓦斯浓度最高的三个点在哪儿" | 触发 skill 6.3 节：告知暂不支持跨巷道聚合排序，引导用户指定巷道 |
| C70 | "某某不存在的巷道风速怎么样" | query_tunnel_list 无结果，告知用户未找到，建议检查名称 |
| C71 | "今天天气怎么样" | 不进通风技能，作为通用对话回复或引导回通风话题 |
| C72 | 空消息 "" | 返回 422 参数校验错误 |
| C73 | "帮我解读"（无巷道名） | 反问用户需要解读哪条巷道 |
| C74 | "计算需风量"（无参数） | needq-calc 技能引导用户逐步提供计算参数 |
| C75 | "测风数据有没有隐患"（tf_mcp 不可用） | 技能 Step 依赖检查：明确告知"缺少 tf_mcp 或云知识库，无法完整执行" |

---

## 十、意图路由测试（合并后统一走通风对话助手） 

---

## 运行说明

```bash
# 单条测试
curl -X POST http://localhost:8070/api/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "15216 辅运起坡段风速怎么样"}'

# 多轮（带上轮 session_id）
curl -X POST http://localhost:8070/api/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "那风量呢", "session_id": "上轮返回的session_id"}'
```
