# /api/chat 对话测试用例

> 基于 dialog-interpret + needq-calc + wind-hazard-diagnosis 技能 + 全部 57 个 MCP 工具覆盖编写
> 
> 测试方式：`POST /api/chat`，参数 `message`（form-data）
> 
> 工具总数：57 个 MCP 包装函数 + 非 MCP 本地工具（知识库/计算/偏好/审批/搜索/文件/聊天记录/系统）

---

## 一、巷道监测数据解读（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 | "fanmain 是什么设备类型" | 调用 query_device_type_info(device_type="fanmain") → 返回大类小类信息 |
| C19 | "风速传感器有哪些测点参数" | 调用 query_monitor_params → 列出点表监测参数 |
| C20 | "帮我查一下 fanmain_stem_wp_2 的详细信息" | 调用 query_device_info(str_type="fanmain_stem_wp_2") → 设备信息列表 |

### 2.5 巷道关联设备 + 模型设备

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C21 | "15216 辅运起坡段绑了哪些设备" | 调用 query_devices_by_tunnel |
| C22 | "模型 2012326636757958658 下面绑了多少设备" | 调用 query_devices_by_model → 设备数量和清单 |

### 2.6 设备监测风量 / 字典（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C23 | "帮我查一下这个模型的设备监测风量" | 调用 get_sensor_wind(model_id) → 各设备风量数据 |
| C24 | "测风装置风量和模型解算风量对比" | 先 get_sensor_wind 再 get_model_wind → 对比差异 |
| C25 | "系统字典里有没有通风方式的编码" | 调用 get_dict_list_by_dictcode → 字典项列表 |

---

## 三、历史趋势查询

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

---

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

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

---

## 五、规程知识库查询

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

---

## 六、需风量计算（needq-calc 技能 + MCP 模拟）

### 6.1 采煤工作面计算

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

### 6.2 掘进工作面计算

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

### 6.3 硐室计算

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

### 6.4 管控平台数据

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C44 | "通防管控平台上各地点需风量是多少" | 调用 get_needq_all_data → 展示所有用风地点数据 |
| C45 | "管控平台的配风情况帮我看看" | 同上 |
| C46 | "管控平台上的默认模型参数有哪些" | 调用 get_model_param_pub_list → 分页展示 |

### 6.5 MCP 需风量模拟计算（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C47 | "用管控平台的模型帮我算一下这个掘进面的需风量" | 调用 simulate_needq_heading_face → 模拟计算结果 |
| C48 | "这个硐室在管控平台上需风量模拟是多少" | 调用 simulate_needq_room → 模拟计算结果 |
| C49 | "采煤工作面用系统模拟算一下需风量" | 调用 simulate_needq_ret_work_face → 模拟计算结果 |
| C50 | "其他用风地点也帮我模拟算一下" | 调用 simulate_needq_other → 模拟计算结果 |

### 6.6 汇总计算

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

---

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

### 7.1 全量诊断触发

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C61 | "查询当前风速风量数据有没有问题" | 触发 wind-hazard-diagnosis，走 Step1~Step8 全流程 |
| C62 | "帮我做一次测风数据判识" | 同上，触发完整诊断流程 |
| C63 | "风速风量有没有隐患" | 同上，最后询问是否生成 md 报告 |
| C64 | "全矿测风装置数据排查一下" | 获取全量清单，逐台判识，输出总览+逐台明细 |

### 7.2 生成报告

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C65 | "生成测风数据分析报告" | 触发技能 Step9：生成固定格式 md 报告 |
| C66 | "把刚才的诊断结果写成报告" | 同上，复用前一轮已获取的数据 |
| C67 | "不要报告，就告诉我结论" | 技能结束时不写文件，仅输出会话结论 |

### 7.3 重点巷道诊断

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C68 | "15216 工作面的测风数据有没有超限" | 触发技能，定位该工作面关联测风装置 |
| C69 | "北二回风巷风速风量排查隐患" | 同上，按巷道类型判定 |
| C70 | "总回风巷风量够不够" | 关联通风系统总需风量 qra 判定 |

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

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C71 | "测风数据看起来很规律像是模拟的怎么办" | 模拟数据识别 → 标注"模拟数据，不可用于生产判识" |
| C72 | "有台测风装置离线了怎么处理" | 标记"无实时数据/离线"，归入 🔴 高风险 |

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

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C73 | "有没有触犯重大隐患判定标准的" | 系统级/用风点级供风量 < 需风量×75% → 判定重大隐患 |
| C74 | "帮我列出所有高风险点" | 输出 🔴 高风险清单 |

---

## 八、多轮对话

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

---

## 九、边缘/异常场景

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

---

## 十、模型数据查询（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C86 | "这个模型的巷道解算风量是多少" | 调用 get_model_wind(model_id) → 解算风量数据 |
| C87 | "帮我查看管控平台默认模型参数" | 调用 get_model_param_pub_list → 分页模型参数 |
| C88 | "设备监测风量和模型解算风量差多少" | get_sensor_wind + get_model_wind → 对比分析 |

---

## 十一、故障诊断（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C89 | "检查一下这个模型通风网络有没有问题" | 调用 check_model_connect_status → 连通块诊断 |
| C90 | "模型里有没有循环风路" | 调用 check_model_one_dir_cycle → 循环风路检查 |
| C91 | "帮我看一下有没有单风向节点" | 调用 check_model_one_dir_node → 单向节点检查 |
| C92 | "模型角联结构诊断一下" | 调用 check_model_diagonal_structure → 角联诊断（耗时较长） |
| C93 | "模型全面故障诊断，包含角联" | 调用 get_model_fault_diagnosis(include_diagonal=True) → 聚合诊断 |

---

## 十二、避灾路线（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C94 | "如果 4 号巷道发生火灾，6 号巷道的人怎么逃生" | 调用 get_escape_path(fire_tun_id="4", person_tun_id="6") → 逃生路线 |
| C95 | "各出口的避灾路线都帮我算一下，CO 浓度 2000" | 调用 get_escape_path_each_exit → 各出口路线 |

---

## 十三、关键阻力 / 压能（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C96 | "这个模型有哪些回风井" | 调用 get_out_shafts → 回风井巷道ID列表 |
| C97 | "进风井有哪些" | 调用 get_in_shafts → 进风井列表 |
| C98 | "回风井的最大阻力路线是什么" | 先 get_out_shafts 取节点ID → get_max_resistance_path |
| C99 | "三区阻力分布帮我看看" | 调用 get_three_area_distribution → 进风/用风/回风区阻力 |
| C100 | "关键路径控风方案决策数据" | 调用 get_key_path_decision → 决策数据 |
| C101 | "从进风井到回风井的压能图" | 调用 get_path_press_power → 节点压能数据 |

---

## 十四、网络解算（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C102 | "对当前模型做一次网络解算" | 调用 net_cal → 各巷道风量分配（耗时较长） |
| C103 | "模拟反风方案，按这个方案解算" | 调用 net_cal_for_plan → 方案模拟结果 |

---

## 十五、报警 / 日志查询（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C104 | "最近一周有哪些设备报警了" | 调用 get_alarm_log_history → 报警记录 |
| C105 | "上个月设备控制操作记录给我看看" | 调用 get_device_set_log_history → 控制历史 |
| C106 | "最近有哪些人登录过系统" | 调用 get_sys_log_history → 登录历史 |

---

## 十六、场景管理（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C107 | "通风场景有哪些" | 调用 get_manage_system_by_strType → 场景列表 |
| C108 | "帮我打开场景 ID 为 xxx 的数据" | 调用 query_system_by_systemID → 场景数据 |

---

## 十七、煤矿基础数据（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C109 | "合阳县金桥煤矿的瓦斯等级鉴定报告" | 调用 get_gas_identify_vo(mine_name="合阳县金桥") |
| C110 | "这个矿的工作面设计规程是什么" | 调用 get_by_mine_name → 设计规程 |
| C111 | "对 11111004 这个测风装置执行一键测风" | 调用 query_control_testWind → 测风结果 |

---

## 十八、数据库 / 文件（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C112 | "从 vent 库查一下风机运行参数" | 调用 execute_sql_query → SQL 查询结果 |
| C113 | "文件共享中心有哪些测风报表" | 调用 get_file_list_by_type → 文件列表 |
| C114 | "帮我把这个文件的内容取出来" | 调用 get_file_base64_by_id → Base64 文件内容 |

---

## 十九、测风报表（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C115 | "最新的测风报表给我看看" | 调用 get_latest_report → 最新报表数据 |
| C116 | "合阳县金桥煤矿 2026年6月的测风报表" | 调用 get_latest_report(mine_name, date_month) |

---

## 二十、会话管理工具（新增）

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C117 | "当前这个会话的ID是什么" | 调用 get_current_session_id → 返回 session_id |
| C118 | "帮我查一下之前关于瓦斯的那次对话" | search_chat_history → get_session_chat 串联查询 |

---

## 二十一、联网搜索 + 文件读取

| 编号 | 用例 | 预期行为 |
|------|------|----------|
| C119 | "帮我搜一下最新的煤矿安全规程修订" | 调用 web_search → 搜索结果 |
| C120 | "把这个网页内容抓下来分析" | 调用 web_fetch → 网页内容 |
| C121 | "上传的这份测风报表帮我看看内容" | 调用 read_file_content → 解析 PDF/XLSX 内容 |

---

## 运行说明

```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"}'
```
