[ { "id-suggestion": "MON-WINDRECT-EXPORT-IMPORT-API", "module": "测风装置管控", "file path with line ranges": "src/views/vent/monitorManager/windrectMonitor/windrect.api.ts:59; src/views/vent/monitorManager/windrectMonitor/index.vue:769-771", "title": "测风导出函数实际请求导入接口", "severity": "致命", "type": "export calling wrong import API", "symptom": "一键测风结果导出不会调用 /safety/testwindDetail/exportXls,而是 POST /sys/user/importExcel,导出失败或误触发用户导入接口", "root_cause": "exportXls 实现写成 defHttp.post({ url: Api.importExcel }),而 index.vue 的 exportExcel 直接调用该函数(未使用正确的 getExportUrl)", "repro": "打开测风装置管控 → 触发 exportExcel(id) / 结果导出 → 抓包可见请求 importExcel", "fix_hint": "将 exportXls 的 url 改为 Api.exportXls,或改为使用 getExportUrl 走正确导出下载链路" }, { "id-suggestion": "MON-MAINFAN-CHANGE-SMOKE1-SHARED-PARAM", "module": "主风机管控", "file path with line ranges": "src/views/vent/monitorManager/mainFanMonitor/index.vue:1609-1662", "title": "倒机正转/反转共用同一 paramcode", "severity": "致命", "type": "control buttons sharing same paramcode", "symptom": "changeSmoke1 场景下正启动与反启动都下发 CtrlFan1ToFan2 / CtrlFan2ToFan1,无法区分正反转倒机指令", "root_cause": "同文件 changeSmoke 分支正确使用 CtrlFan1ToFan2Forward/Reverse 与 CtrlFan2ToFan1Forward/Reverse,但 changeSmoke1 分支正反转都调用无方向后缀的同一点位", "repro": "风机处于正转/反转运行态触发一键倒机(modalType=changeSmoke1)→ 对比下发 paramcode", "fix_hint": "与 changeSmoke 分支对齐,正转用 *Forward、反转用 *Reverse" }, { "id-suggestion": "MON-WINDOW-REAR-GATE-LABEL-MISMATCH", "module": "风窗管控", "file path with line ranges": "src/views/vent/monitorManager/windowMonitor/index.vue:37-41", "title": "后门控制按钮文案错写成前门", "severity": "严重", "type": "control buttons sharing same paramcode / mislabeled control", "symptom": "界面显示“打开前门/关闭前门”,实际下发 rearGateOpen_S/rearGateClose_S,操作员会误控后门", "root_cause": "按钮展示文案复制前门未改,第二参数标题已是后门,UI 文本与指令不一致", "repro": "具备 window:gateControl 且 ndoorcount==2 → 看后两颗按钮文案与 setControl 参数", "fix_hint": "将后两颗按钮文案改为“打开后门/关闭后门”" }, { "id-suggestion": "MON-WINDOW-AREA-ANGLE-SHARED-PARAM", "module": "风窗管控", "file path with line ranges": "src/views/vent/monitorManager/windowMonitor/index.vue:11-14,623-651", "title": "窗面积与窗角度控制共用 paramcode 1/2", "severity": "严重", "type": "control buttons sharing same paramcode", "symptom": "窗1/窗2 面积设定与角度设定最终都下发 paramcode='1'/'2',后端无法区分面积/角度", "root_cause": "twoAreaControl 与 twoAngleControl 都 setControl('1'|'2'),handleOK else 分支直接 data.paramcode=handlerState", "repro": "同时开启 window:twoAreaControl 与 window:twoAngleControl → 分别设定面积/角度 → 抓包对比 paramcode", "fix_hint": "角度使用独立点位(如 frontSetAngle1),或在 value/附加字段中区分控制类型" }, { "id-suggestion": "MON-WINDOW-SHOWANGLEAREA-USES-SETANGLE", "module": "风窗管控", "file path with line ranges": "src/views/vent/monitorManager/windowMonitor/index.vue:31-33,504-520", "title": "设定风窗面积误走角度弹窗流程", "severity": "严重", "type": "control buttons sharing same paramcode", "symptom": "权限 window:showAngleArea 的“设定风窗面积”调用 setAngle(1),弹窗标题按角度生成,但点位仍 frontSetValue", "root_cause": "面积按钮错误绑定 setAngle 而非 setArea", "repro": "开启 window:showAngleArea → 点击“设定风窗面积” → 观察 modalTitle 与下发参数", "fix_hint": "改为 setArea(1),或单独实现面积设定入口" }, { "id-suggestion": "MON-FANLOCAL-DUP-DIAMETER-BTN", "module": "局部风机管控", "file path with line ranges": "src/views/vent/monitorManager/fanLocalMonitor/index.vue:782-791", "title": "风筒直径控制按钮重复且同 key", "severity": "严重", "type": "control buttons sharing same paramcode", "symptom": "控制区出现两个相同“风筒直径”按钮,key 均为 diameter,行为完全重复", "root_cause": "leftBtnArr 中 diameter 配置项被复制粘贴两次", "repro": "开启 fanLocal:diameter → 顶部控制按钮可见重复项", "fix_hint": "删除重复配置;若本意为主/备直径,需不同 key 与 paramcode" }, { "id-suggestion": "MON-NETWORK-DHLOCAL-WRONG-FIELD", "module": "通风系统监测/通风网络解算", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/network/index.vue:403-405", "title": "局部阻力字段误读自然风压", "severity": "严重", "type": "wrong field mapping / logic bug", "symptom": "巷道表“局部阻力”与“自然风压”显示相同值,局部阻力失真", "root_cause": "dHLocal 赋值使用 item['dHNature'],与 dHNature 同源", "repro": "打开网络解算结果表 → 对比局部阻力与自然风压列", "fix_hint": "改为读取 item['dHLocal'](或后端真实局部阻力字段)" }, { "id-suggestion": "MON-EMERGENCY-DHLOCAL-WRONG-FIELD", "module": "灾变应急控制", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/emergency/index.vue:273-275", "title": "应急解算局部阻力同样误绑 dHNature", "severity": "严重", "type": "wrong field mapping / logic bug", "symptom": "灾变应急巷道阻力表局部阻力错误", "root_cause": "与 network 相同的复制错误:dHLocal: item['dHNature']", "repro": "进入灾变应急页加载解算结果 → 查看巷道阻力列", "fix_hint": "改为 item['dHLocal']" }, { "id-suggestion": "MON-EMERGENCY-SHARED-DETAIL-CODES", "module": "灾变应急控制", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/emergency/index.vue:196-226", "title": "工作面详情多项共用同一数据 code", "severity": "严重", "type": "wrong field mapping / logic bug", "symptom": "工作面编号/采区/煤层都显示 dTotalArea;长度/走向/采高都显示 totallength", "root_cause": "analysisDetailDataList 多项复用相同 code,未映射独立字段", "repro": "打开灾变应急分析详情区 → 观察多行数值是否雷同", "fix_hint": "为每项配置正确业务字段 code,并在 pageData 中补齐对应值" }, { "id-suggestion": "MON-NETWORK-READDATA-NULL-DEREF", "module": "通风系统监测/通风网络解算", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/network/index.vue:447-454", "title": "传感器列表未判空直接读 readData", "severity": "严重", "type": "null deref on mount/update", "symptom": "monitors 中某条缺少 readData 时 analyzePageResult 抛错,页面解算结果渲染中断", "root_cause": "直接访问 item['readData']['va']/['m3'],无空保护", "repro": "构造 monitors 项 readData=null 的解算推送 → 打开网络页", "fix_hint": "先取 const rd=item.readData||{} 再读字段" }, { "id-suggestion": "MON-EMERGENCY-READDATA-NULL-DEREF", "module": "灾变应急控制", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/emergency/index.vue:314-321", "title": "应急页传感器 readData 空指针", "severity": "严重", "type": "null deref on mount/update", "symptom": "同网络页,缺 readData 时应急页崩溃", "root_cause": "item['readData']['va'] 无空判断", "repro": "推送缺 readData 的 monitors → 打开应急页", "fix_hint": "对 readData 做空对象兜底" }, { "id-suggestion": "MON-FIBER-HARDCODE-WARN", "module": "光纤测温监测", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/device/modal/fiber.modal.vue:49,169-188,232-257", "title": "光纤详情风险等级与预警历史写死假数据", "severity": "严重", "type": "mock hardcode replacing real API", "symptom": "风险等级恒为“低风险”,预警历史永远是测点6/318℃等假记录,不随真实报警变化", "root_cause": "模板写死低风险;warningConfig.data 硬编码数组,watch 未用真实告警填充", "repro": "打开光纤测温弹窗 → 对比真实告警与滚动板内容", "fix_hint": "绑定设备真实风险字段与告警历史接口/数据" }, { "id-suggestion": "MON-FIBER-READDATA-NULL-DEREF", "module": "光纤测温监测", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/device/modal/fiber.modal.vue:239-243", "title": "光纤弹窗 Object.keys(readData) 空指针", "severity": "严重", "type": "null deref on mount/update", "symptom": "设备无 readData 时打开弹窗直接 TypeError", "root_cause": "未判断 item.readData 即 Object.keys(item.readData)", "repro": "选中 readData 为空的光纤设备打开详情", "fix_hint": "if (!item.readData) return; 后再解析分段温度" }, { "id-suggestion": "MON-DUST-HARDCODE-WARN", "module": "防尘系统监测", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/device/modal/dust.modal.vue:216-238", "title": "粉尘弹窗测点状态/预警历史硬编码", "severity": "严重", "type": "mock hardcode replacing real API", "symptom": "测点状态 customRender 永远返回“正常”;预警滚动板为固定假数据", "root_cause": "columns.state 写死正常;warningConfig.data 硬编码", "repro": "打开粉尘监测详情弹窗观察状态与预警列表", "fix_hint": "状态取真实字段;预警列表接真实告警数据" }, { "id-suggestion": "MON-FIREMON-TEMP-UNIT-WRONG", "module": "防灭火系统监测", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/device/modal/firemon.modal.vue:63-65", "title": "智慧球温度值单位误标为 %", "severity": "一般", "type": "logic/display bug", "symptom": "温度值旁显示 % 而非 ℃,监控读数语义错误", "root_cause": "模板单位复制错误", "repro": "打开 firemon 详情查看温度项单位", "fix_hint": "将单位改为 ℃" }, { "id-suggestion": "MON-ATOMIZING-LOCATION-UNIT-WRONG", "module": "喷雾降尘/防尘系统监测", "file path with line ranges": "src/views/vent/monitorManager/deviceMonitor/components/device/modal/atomizing.modal.vue:33-42", "title": "主机位置字段错误附加 ℃ 单位", "severity": "一般", "type": "logic/display bug", "symptom": "位置类字段后显示温度单位,信息误导", "root_cause": "holderLocation 展示模板误加 ℃", "repro": "打开喷雾监测详情查看“主机位置”", "fix_hint": "去掉 ℃,位置字段无需单位" }, { "id-suggestion": "MON-BETKY-MOCK-AND-POLL-BUG", "module": "工作面来压预警", "file path with line ranges": "src/views/vent/monitorManager/betKy/index.vue:110-146,253-263", "title": "矿压监测轮询逻辑错误且特定矿用假数据", "severity": "严重", "type": "mock hardcode + setInterval/setTimeout poll without proper clear", "symptom": "A02A02 矿强制使用 ceshi.json;轮询前把 timer 置 null 未 clearTimeout,chartData 每次 push 不清理导致曲线数据膨胀错乱;卸载用 clearInterval 清 setTimeout", "root_cause": "getDataSource 用本地 json 替换真实 list;timer 管理与 chartData 累积错误", "repro": "进入 betKy 页(尤其 A02A02)观察请求与图表随时间变化", "fix_hint": "去掉矿别假数据分支;轮询用 clearTimeout;每次刷新重置 chartData" }, { "id-suggestion": "MON-BETKY-READDATA-NULL", "module": "工作面来压预警", "file path with line ranges": "src/views/vent/monitorManager/betKy/index.vue:127-131", "title": "矿压轮询 Object.values(readData) 空指针", "severity": "严重", "type": "null deref on mount", "symptom": "设备缺 readData 时页面轮询崩溃,后续刷新停止", "root_cause": "未判空直接 Object.values(readData)", "repro": "返回含 readData=null 的 Minepressure 列表", "fix_hint": "if (!readData) continue; 后再处理" }, { "id-suggestion": "MON-AIRDOOR-TIPMODAL-TIMER-LEAK", "module": "风门集中同控", "file path with line ranges": "src/views/vent/monitorManager/airDoor/components/tipModal.vue:28-54", "title": "倒计时弹窗 setTimeout 递归不清理", "severity": "严重", "type": "setInterval/setTimeout poll without clear on unmount", "symptom": "提示弹窗显示后每秒递归创建定时器;关闭/卸载后仍继续;timeout<=0 时先 timer=undefined 再 clearTimeout(undefined) 无效,且仍调用 getMonitor()", "root_cause": "无 onUnmounted/Visible=false 时 clear;递归无退出;clear 顺序错误", "repro": "触发 visibleTs30=true → 关闭弹窗或离开页面 → 观察仍有定时回调", "fix_hint": "保存 timerId;Visible 变 false 与 onUnmounted 时 clearTimeout;倒计时结束停止递归" }, { "id-suggestion": "MON-AIRDOOR-MSGTXT-NULL-DEREF", "module": "风门集中同控", "file path with line ranges": "src/views/vent/monitorManager/airDoor/index.vue:44-51", "title": "风门同控菜单拉取未判空 msgTxt[0]", "severity": "严重", "type": "null deref on mount", "symptom": "接口返回空/异常结构时 getMenuList 抛错,左侧菜单无法加载", "root_cause": "直接访问 res.msgTxt[0].datalist.length", "repro": "mock /monitor/device 返回无 msgTxt 或空数组 → 打开风门集中同控", "fix_hint": "使用可选链与默认 []:res?.msgTxt?.[0]?.datalist || []" }, { "id-suggestion": "MON-WORKFACE-WARNINFO-KEY-BUG", "module": "综采面智能管控", "file path with line ranges": "src/views/vent/monitorManager/workFaceMonitor/components/workFaceHome.vue:262-276", "title": "综合预警判断键错误且可能空指针", "severity": "严重", "type": "null deref / wrong field mapping", "symptom": "用 warnInfo.warnInfo 判断却读取 synthesizeS;键不匹配时综合预警不更新,或 synthesizeS 缺失时崩溃;surface_history/sysInfo 亦缺保护", "root_cause": "条件写成 res['warnInfo']['warnInfo'];并对 surface_history[0]、sysInfo.readData 无空保护", "repro": "返回缺 synthesizeS 或 surface_history 为空的综采面数据", "fix_hint": "条件改为 synthesizeS;对各嵌套字段做空判断" }, { "id-suggestion": "MON-TUNFACE-WARN-NULL-DEREF", "module": "掘进面智能管控", "file path with line ranges": "src/views/vent/monitorManager/tunFaceMonitor/components/tunFaceHome.vue:254,262-271", "title": "掘进面首页无条件解包 warnInfo/readData", "severity": "严重", "type": "null deref on mount", "symptom": "缺 dustS/fireS/gasS/synthesizeS/ventS、缺 surface_history、或缺 location.readData 时页面直接崩溃", "root_cause": "无守卫直接访问 res['warnInfo'][x]['devices']、res['surface_history'][0]、data['readData']['flen']", "repro": "接口缺任一 warn 分组或 location.readData → 打开掘进面主页", "fix_hint": "逐层可选链;缺省赋空数组/空对象" }, { "id-suggestion": "MON-BELTTUN-WARN-NULL-DEREF", "module": "皮带巷管控系统", "file path with line ranges": "src/views/vent/monitorManager/beltTunMonitor/components/beltTunHome.vue:260-268", "title": "皮带巷首页 warnInfo/sysInfo 无空保护", "severity": "严重", "type": "null deref on mount", "symptom": "sysInfo 或某类 warn 分组缺失时页面加载失败", "root_cause": "直接 Object.assign(res['sysInfo'], res['sysInfo']['readData']) 与 warnInfo.*.devices", "repro": "返回不完整 beltTun 监测包 → 打开皮带巷主页", "fix_hint": "增加空判断与默认值" }, { "id-suggestion": "MON-WORKFACE-LOCATION-FLEN-NULL", "module": "综采面智能管控", "file path with line ranges": "src/views/vent/monitorManager/workFaceMonitor/components/workFaceHome.vue:251-254", "title": "定位列表读取 readData.flen 空指针", "severity": "严重", "type": "null deref on mount/update", "symptom": "location 设备无 readData 时过滤阶段抛错,后续监控数据不完整", "root_cause": "locationData.push 中直接 data['readData']['flen']", "repro": "location.datalist 含 readData=null 的项", "fix_hint": "使用 data?.readData?.flen ?? '-'" }, { "id-suggestion": "MON-MAINFAN-AREA-SIM-INTERVAL-LEAK", "module": "主风机管控", "file path with line ranges": "src/views/vent/monitorManager/mainFanMonitor/hooks/useAreaSetSimulation.ts:37-109; useMainFanSimulation.ts:25-72", "title": "天窗/闸板面积模拟 setInterval 卸载未清理", "severity": "一般", "type": "setInterval/setTimeout poll without clear on unmount", "symptom": "开启 fanSwitchoverSimulation 后设定面积过程中离开页面,interval 仍改 selectData,可能写已销毁状态", "root_cause": "useAreaSetSimulation 仅在过程结束 clear;无 onUnmounted 遍历 activeProcesses 清理(对比 useFanSwitchoverSimulation 有 stopTick)", "repro": "开启模拟 → 设定天窗面积 → 过渡未完成即路由离开", "fix_hint": "在 composable 增加 dispose/onUnmounted,清理 Map 内全部 interval" } ]