_agent_fire_dust.json 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. [
  2. {
  3. "module": "喷淋监控系统",
  4. "file": "src/views/vent/monitorManager/sprayMonitor/index.vue",
  5. "lines": "68-140",
  6. "title": "多路控制按钮共用同一 paramcode/value",
  7. "severity": "critical",
  8. "type": "wrong_control_payload",
  9. "symptom": "除急停外,补水阀/搅拌阀/组化泵/上料机/喷洒自动等按钮下发完全相同的指令,设备无法按按钮区分控制,存在误控风险",
  10. "root_cause": "operations 全部使用 key='run_auto_sign',且多数 value='0';BasicMonitoring.deviceControl 仅按 key/value 下发",
  11. "repro": "打开喷淋监控→输入密码点击“补水阀启停”与“喷洒自动”→抓包可见 paramcode/value 相同",
  12. "fix_hint": "为每个操作配置独立 paramcode,并按启停状态设置正确 value(参考业务点表)"
  13. },
  14. {
  15. "module": "喷淋监控系统",
  16. "file": "src/components/vent/BasicMonitoring.vue",
  17. "lines": "19,193-201",
  18. "title": "操作列表 :key 冲突 + 空场景崩溃",
  19. "severity": "high",
  20. "type": "vue_key_collision/null_crash",
  21. "symptom": "喷淋多个按钮共用 key 导致 DOM 复用异常;无场景数据时页面直接抛错白屏",
  22. "root_cause": "v-for 使用 item.key 作唯一键但喷淋键重复;getSysDataSource 无空数组守卫直接取 options[0].id",
  23. "repro": "1) 打开喷淋页观察按钮交互状态错乱;2) 后端返回空 records 时进入页面立即报错",
  24. "fix_hint": "key 使用 label 或唯一 id;取首项前判断 records.length"
  25. },
  26. {
  27. "module": "智能注氮系统",
  28. "file": "src/views/vent/monitorManager/compressor/index.vue",
  29. "lines": "93-126",
  30. "title": "空列表崩溃且 modalType 未随系统类型切换",
  31. "severity": "high",
  32. "type": "null_crash/stale_config",
  33. "symptom": "无注氮系统时白屏;依赖 modalType 的矿端组件始终按 nitrogenUnderground 建模",
  34. "root_cause": "options.value[0]['id'] 无空判断;changeModalType 中 modalType 赋值被注释,仅改了 moduleTypeName",
  35. "repro": "空数据进页崩溃;潞宁等使用 modalType 的矿切换空压机/制氮机后模型类型不变",
  36. "fix_hint": "空 records 提前 return;恢复按 strsystype 设置 modalType"
  37. },
  38. {
  39. "module": "智能注氮系统",
  40. "file": "src/views/vent/monitorManager/compressor/components/nitrogenHome_ln.vue",
  41. "lines": "341-349",
  42. "title": "监测数据忽略选中系统ID",
  43. "severity": "high",
  44. "type": "wrong_data_binding",
  45. "symptom": "切换注氮系统后仍展示 msgTxt[0] 数据,监控内容与下拉选择不一致",
  46. "root_cause": "getDataSource(systemID) 入参未用于请求,固定取 res.msgTxt[0].datalist",
  47. "repro": "配置≥2套注氮系统→切换下拉→数据不随 systemId 变化",
  48. "fix_hint": "按 systemID/deviceId 过滤或带参请求对应系统数据"
  49. },
  50. {
  51. "module": "智能注浆系统",
  52. "file": "src/views/vent/monitorManager/groutMonitor/index.vue",
  53. "lines": "110-119,67,86",
  54. "title": "空数据崩溃且 currentDeviceType 永不赋值",
  55. "severity": "high",
  56. "type": "null_crash/dead_state",
  57. "symptom": "无注浆系统时白屏;传给 groutHome 的 device-type 恒为空字符串",
  58. "root_cause": "options.value[0]['id'] 无守卫;deviceChange 只写 deviceType,从未写入 currentDeviceType",
  59. "repro": "空列表进页崩溃;有数据时检查 groutHome props.deviceType 为空",
  60. "fix_hint": "空 records 保护;deviceChange/getSelectRow 同步 currentDeviceType"
  61. },
  62. {
  63. "module": "密闭监测系统",
  64. "file": "src/views/vent/monitorManager/obfurageMonitor/index.vue",
  65. "lines": "89-138",
  66. "title": "空数据崩溃且切换系统不刷新关联设备",
  67. "severity": "high",
  68. "type": "null_crash/stale_state",
  69. "symptom": "无密闭系统/无关联设备时崩溃;切换密闭点后历史页设备 Tab 仍是旧设备",
  70. "root_cause": "直接访问 msgTxt[0]、deviceArr[0];getSelectRow 只改 optionValue,未调用 getDeviceList",
  71. "repro": "空数据进页;有多套密闭→切换后打开历史监测看设备按钮未更新",
  72. "fix_hint": "空数组守卫;getSelectRow 内调用 getDeviceList()"
  73. },
  74. {
  75. "module": "防火门智能管控",
  76. "file": "src/views/vent/home/configurable/firedoor/fireDoorMonitor.vue",
  77. "lines": "76-99",
  78. "title": "场景列表为空仍继续后续逻辑且配置增强未启用",
  79. "severity": "medium",
  80. "type": "incomplete_init",
  81. "symptom": "无防火门场景时下拉为空、模块无有效数据;服务端配置未走 updateEnhancedConfigs",
  82. "root_cause": "records 为空时仍调用 loadFireGateData;updateEnhancedConfigs 被注释",
  83. "repro": "manageFireList 返回空→页面无场景可选且面板无数据",
  84. "fix_hint": "无 records 时提示并 return;恢复 updateEnhancedConfigs(configs)"
  85. },
  86. {
  87. "module": "机电硐室管控",
  88. "file": "src/views/vent/home/configurable/electroChamber.vue",
  89. "lines": "86-99,29-50",
  90. "title": "拉取配置后强制覆盖为本地测试配置且历史无设备ID",
  91. "severity": "high",
  92. "type": "hardcoded_override/missing_param",
  93. "symptom": "线上始终使用 testConfigElectro;切历史 Tab 时 deviceId 常为空导致查询无效",
  94. "root_cause": "fetchConfigs 成功后 configs.value=testConfigElectro;optionValue 仅来自路由 query,无设备选择赋值",
  95. "repro": "非 A02A02 环境打开页面看配置是否被测试数据覆盖;无 query.id 切历史记录",
  96. "fix_hint": "生产去掉测试覆盖;补充硐室/系统选择并写入 optionValue"
  97. },
  98. {
  99. "module": "报表数据映射",
  100. "file": "src/views/vent/reportManager/comment/reportMap.vue",
  101. "lines": "82-119,135-145",
  102. "title": "reactive 表单被整体重赋值 + 部门树空 children 崩溃",
  103. "severity": "high",
  104. "type": "reactivity_break/null_crash",
  105. "symptom": "新增/编辑后表单状态异常;部门节点无 children 时查询部门树直接报错",
  106. "root_cause": "formState= {...} 丢弃 reactive 代理;el.children.forEach 未判空",
  107. "repro": "编辑一条映射再点新增观察表单残留;部门树缺 children 的节点触发加载",
  108. "fix_hint": "用 Object.assign(formState, ...) 或重置字段;forEach 前守卫 children"
  109. },
  110. {
  111. "module": "报表数据映射",
  112. "file": "src/views/vent/reportManager/comment/report-modal.vue",
  113. "lines": "135-151",
  114. "title": "编辑时 JSON.parse(mineCells) 在非字符串时抛错",
  115. "severity": "high",
  116. "type": "type_error",
  117. "symptom": "编辑已有映射弹窗打开失败或控制台 TypeError",
  118. "root_cause": "watch 中无条件 JSON.parse(formStates.mineCells);接口若已反序列化为数组则解析失败;且 Object.assign 不会清除旧 id",
  119. "repro": "打开编辑,当 record.mineCells 为数组或空时复现",
  120. "fix_hint": "typeof===string 再 parse,数组则直接使用;新增时显式清空 id"
  121. },
  122. {
  123. "module": "安全监控分站管理",
  124. "file": "src/views/vent/safetyList/index.vue",
  125. "lines": "234-257,408-417",
  126. "title": "卸载引用未定义 timer + children 空指针 + 分页 total 错误",
  127. "severity": "high",
  128. "type": "reference_error/null_crash",
  129. "symptom": "离开页面报 timer is not defined;devInfoList 为空时列表渲染崩溃;分页总数异常",
  130. "root_cause": "timer 声明被注释但 onUnmounted 仍引用;el.children=el.devInfoList 后直接 forEach;res.total 在数组结果上常为 undefined",
  131. "repro": "进入页再离开;返回含 null devInfoList 的分站;观察 pagination.total",
  132. "fix_hint": "删除或恢复 timer;`(el.devInfoList||[]).forEach`;按接口实际结构取 records/total"
  133. },
  134. {
  135. "module": "158分站监测",
  136. "file": "src/views/vent/safetyList/common/detail.vue",
  137. "lines": "977-1002,1013-1022",
  138. "title": "devInfoList 为空时 forEach 崩溃",
  139. "severity": "high",
  140. "type": "null_crash",
  141. "symptom": "部分分站无子设备时详细信息表加载失败",
  142. "root_cause": "el.children = el.devInfoList 后未判空直接 forEach(getStationList1/getStationListAll)",
  143. "repro": "选择无测点的分站查看详细信息",
  144. "fix_hint": "使用可选链或默认空数组后再遍历"
  145. },
  146. {
  147. "module": "130分站监测",
  148. "file": "src/views/vent/safetyList/common/detail-130.vue",
  149. "lines": "865-892",
  150. "title": "devInfoList 空指针(同 index/detail)",
  151. "severity": "high",
  152. "type": "null_crash",
  153. "symptom": "130 分站无子设备时列表处理抛错",
  154. "root_cause": "el.children.forEach 未处理 null/undefined devInfoList",
  155. "repro": "打开 130 详情页并选中无设备分站",
  156. "fix_hint": "遍历前 `el.children = el.devInfoList || []`"
  157. },
  158. {
  159. "module": "235分站监测",
  160. "file": "src/views/vent/safetyList/common/detail-235.vue",
  161. "lines": "352-369,608-768,888,958-1013",
  162. "title": "235 页面误用 130 协议 API",
  163. "severity": "critical",
  164. "type": "wrong_api",
  165. "symptom": "235 分站参数下发、改名、删除等操作打到 130 接口,控制/配置失败或污染错误协议设备",
  166. "root_cause": "从 detail-130 复制后未替换:set130StationData/update130DevName/remove130Device/remove130Substation;api 中亦无对应 235 写接口",
  167. "repro": "在 235 监测详情编辑并下发任意参数,观察请求 URL 含 130 路径",
  168. "fix_hint": "补齐并改用 235 专用读写/删除 API,移除 130 引用"
  169. },
  170. {
  171. "module": "用户日志管理",
  172. "file": "src/views/monitor/log/index.vue",
  173. "lines": "2,56-84",
  174. "title": "v-modal 拼写错误 + 登录统计破坏 searchInfo 响应式",
  175. "severity": "high",
  176. "type": "typo/reactivity_break",
  177. "symptom": "Tab 无法双向绑定;切到“登录统计”后查询条件失效、列表参数丢失 logType",
  178. "root_cause": "模板写 v-modal 而非 v-model;case '4' 执行 searchInfo={} 丢掉 reactive 代理",
  179. "repro": "打开日志页切换 Tab;切到登录统计后再查询",
  180. "fix_hint": "改为 v-model;用 Object.keys 清空或重置字段,禁止重赋 searchInfo"
  181. },
  182. {
  183. "module": "用户日志管理",
  184. "file": "src/views/monitor/log/index.vue",
  185. "lines": "34,61-66",
  186. "title": "初始 fieldMapToTime 格式与切换后不一致",
  187. "severity": "medium",
  188. "type": "config_mismatch",
  189. "symptom": "首次进入登录日志时时间范围映射可能无效,切 Tab 后才正常",
  190. "root_cause": "paramTime 初始为扁平数组,tabChange 才设为 [[field,[begin,end],fmt]] 结构",
  191. "repro": "首次进入不切 Tab,使用时间筛选对比切 Tab 后行为",
  192. "fix_hint": "初始化即使用与 case '1' 相同的 fieldMapToTime 结构"
  193. },
  194. {
  195. "module": "文件共享中心",
  196. "file": "src/views/vent/performance/fileDetail/index.vue",
  197. "lines": "292-314,367-377,387",
  198. "title": "空树上标崩溃 + 可空文件上传 + nodeParam 丢失响应式",
  199. "severity": "high",
  200. "type": "null_crash/invalid_upload",
  201. "symptom": "无目录时白屏;未选文件仍可点确定上传;树节点切换后表格参数可能异常",
  202. "root_cause": "listArr[0] 无守卫;handleOk 不校验 fileList;nodeParam=node 重赋放弃 reactive",
  203. "repro": "空目录数据进页;打开上传不选文件点确定;切换目录观察列表 parentId",
  204. "fix_hint": "空树提示;上传前校验 fileList.length;Object.assign(nodeParam, node)"
  205. },
  206. {
  207. "module": "文件共享中心",
  208. "file": "src/views/vent/performance/fileDetail/index.vue",
  209. "lines": "243-261",
  210. "title": "setInterval 用 clearTimeout 清理",
  211. "severity": "medium",
  212. "type": "resource_leak",
  213. "symptom": "汇总报表轮询可能无法可靠停止,关闭弹窗后仍请求",
  214. "root_cause": "timer=setInterval 但 handleCancelHz/onUnmounted 使用 clearTimeout",
  215. "repro": "打开汇总报表后关闭弹窗,观察是否仍持续请求 queryVentMonReportJd",
  216. "fix_hint": "统一使用 clearInterval(timer)"
  217. },
  218. {
  219. "module": "视频墙",
  220. "file": "src/views/vent/monitorManager/camera/index.vue",
  221. "lines": "100-128,172-178",
  222. "title": "设备树加载与分页 paramKind 计算脆弱",
  223. "severity": "high",
  224. "type": "null_crash/wrong_param",
  225. "symptom": "itemValue 无 '&' 或 msgTxt 结构异常时树展开/翻页失败或请求错误类型",
  226. "root_cause": "假定 msgTxt[0].datalist 存在;分页用 searchParam.devKind.indexOf('&') 对 nodeData.itemValue 做 substring,缺 '&' 得空串",
  227. "repro": "点击 itemValue 不含 '&' 的分类再翻页;或返回空 datalist 的节点",
  228. "fix_hint": "安全解析 itemValue;访问 datalist 前判空;分页直接用 nodeData.itemValue"
  229. },
  230. {
  231. "module": "需风量分析系统",
  232. "file": "src/components/vent/micro/createSubApp.vue",
  233. "lines": "15-37",
  234. "title": "非 micro-* 路径组件恒为 null",
  235. "severity": "high",
  236. "type": "shell_mount_failure",
  237. "symptom": "菜单若未挂在 micro-need-air/micro-vent-doc 前缀下则壳空白",
  238. "root_cause": "resetComponent 仅识别有限 appType",
  239. "repro": "用非 micro 路径打开需风量/核定",
  240. "fix_hint": "按实际菜单 path 扩展映射"
  241. },
  242. {
  243. "module": "喷雾降尘监控",
  244. "file": "src/router/helper/routeHelper.ts",
  245. "lines": "21-28,98-113,122-146",
  246. "title": "layouts/RouteView 组件文件缺失导致路由无法解析",
  247. "severity": "critical",
  248. "type": "missing_component",
  249. "symptom": "菜单 component 配为 layouts/RouteView 的父级打开空白/路由失败",
  250. "root_cause": "src/layouts 下无 RouteView.vue;LayoutMap 未注册;dynamicImport 只扫 views/components",
  251. "repro": "后端菜单配置 component=layouts/RouteView 后进入喷雾降尘父路由",
  252. "fix_hint": "新增 layouts/RouteView.vue 并加入 LayoutMap;菜单改为已存在布局"
  253. },
  254. {
  255. "module": "喷雾降尘监控",
  256. "file": "src/views/vent/home/configurable/dust.vue",
  257. "lines": "87-93",
  258. "title": "服务端配置被测试数据覆盖且只用 Mock",
  259. "severity": "high",
  260. "type": "hardcoded_override",
  261. "symptom": "粉尘首页始终展示 testConfigDust + BDDustMock,真实监测数据不刷新",
  262. "root_cause": "fetchConfigs('dust') 后强制 configs=testConfigDust,并用 Promise.resolve(BDDustMock) 代替 getHomeData",
  263. "repro": "任意环境打开粉尘可配置首页,对比接口与页面数据源",
  264. "fix_hint": "生产移除测试覆盖,恢复 getHomeData 轮询"
  265. },
  266. {
  267. "module": "喷雾降尘监控",
  268. "file": "src/views/vent/home/configurable/dustControl.vue",
  269. "lines": "53-54",
  270. "title": "错误 pageType 拉取后再覆盖测试配置",
  271. "severity": "high",
  272. "type": "wrong_param/hardcoded_override",
  273. "symptom": "降尘管控页配置与粉尘业务不匹配,最终仍被本地测试配置覆盖",
  274. "root_cause": "fetchConfigs('mine_fire') 后 configs.value=testConfigDustControl",
  275. "repro": "打开 dustControl 页检查 configuration 请求 pageType 与最终 configs",
  276. "fix_hint": "使用正确粉尘 pageType,并按环境决定是否使用测试配置"
  277. },
  278. {
  279. "module": "安全监控分站管理",
  280. "file": "src/views/vent/safetyList/index.vue",
  281. "lines": "144-146,71-76",
  282. "title": "调试风向取值与展示映射不一致",
  283. "severity": "medium",
  284. "type": "value_mismatch",
  285. "symptom": "调试选“反向”写入 '0',列表展示逻辑把反风映射为 '2',显示异常",
  286. "root_cause": "derictList 反向 value='0',而 valueJc 渲染把 '2' 当作反风",
  287. "repro": "调试设备选反向并确认,查看列表风向展示",
  288. "fix_hint": "统一风向枚举(建议 1 正/2 反)并同步调试与展示"
  289. },
  290. {
  291. "module": "报表管理",
  292. "file": "src/views/vent/reportManager/index.vue",
  293. "lines": "89-106",
  294. "title": "三类根节点重复挂载同一套子树",
  295. "severity": "medium",
  296. "type": "wrong_tree_build",
  297. "symptom": "系统/手动/模板三类下出现完全相同的业务分类,筛选易混淆",
  298. "root_cause": "getTreeList 对 listArr 每个根节点都 push 完整 res 树,未按业务类型分流",
  299. "repro": "打开报表管理对比三个根节点的 children",
  300. "fix_hint": "按返回字段或接口分类型填充到对应根节点"
  301. },
  302. {
  303. "module": "智能注浆系统",
  304. "file": "src/views/vent/monitorManager/groutMonitor/index.vue",
  305. "lines": "1-35",
  306. "title": "2D 模型与 groutHome 同时渲染可能叠层",
  307. "severity": "medium",
  308. "type": "ui_logic",
  309. "symptom": "is2DModel 为 true 时流程图与监控壳同时存在,交互/遮罩异常",
  310. "root_cause": "v-if is2DModel 渲染 modelComponent,同时 activeKey==monitor 仍挂载 groutHome",
  311. "repro": "开启全局 is2DModel 进入注浆监控页",
  312. "fix_hint": "2D 时由单一容器负责模型,或让 groutHome 在 2D 模式跳过三维初始化"
  313. },
  314. {
  315. "module": "机电硐室管控",
  316. "file": "src/views/vent/home/configurable/configurable.data.ts",
  317. "lines": "6164,6217",
  318. "title": "electro-champer / electro-chamber pageType 拼写分裂",
  319. "severity": "medium",
  320. "type": "config_typo",
  321. "symptom": "部分配置按错误 pageType 入库后,fetchConfigs('electro-champer') 只能拿到半套模块",
  322. "root_cause": "同一业务存在 champer/chamber 两种 pageType 字面量",
  323. "repro": "在配置表按两种 pageType 各查一次 records 数量",
  324. "fix_hint": "统一为一种拼写并做数据迁移"
  325. },
  326. {
  327. "module": "密闭监测系统",
  328. "file": "src/views/vent/monitorManager/obfurageMonitor/index.vue",
  329. "lines": "107-113",
  330. "title": "forEach 内 data=Object.assign 未回写",
  331. "severity": "medium",
  332. "type": "dead_assignment",
  333. "symptom": "readData 字段未合并进列表项,监测展示缺字段",
  334. "root_cause": "dataSource.forEach 中 `data = Object.assign(data, readData)` 只改局部绑定,未写回数组元素",
  335. "repro": "对比接口 readData 与页面 options 字段是否缺失",
  336. "fix_hint": "改为 Object.assign(data, readData) 不重绑,或显式写回"
  337. }
  338. ]