# 2026-09-23:物联感知设备管理页三处调整 ## 目标 用户要求调整 `../../src/views/subSystem/pipeNetwork/assetInfo/equipmentBase/index.vue`(设备管理页): 1. 表单页把「规格参数」移到「生产日期」之后,输入框宽度同步调整。 2. 表单页地图选点时,自动把解析出的地址回填到「安装位置」。 3. 详情弹窗按表单编辑页的分区方式展示。 ## 结论与改动 文件:`../../src/views/subSystem/pipeNetwork/assetInfo/equipmentBase/index.vue` - 基础信息区:新增「规格参数」`el-col :span="12"`,紧跟在生产日期之后(与生产日期同一行,宽度随半栏自适应);从资产信息区移除原来的 `span=24` 整行版本。 - 资产信息区:保留 资产状态 / 资产价值 / 使用年限 三项(span 12 不变),不再包含规格参数。 - 地图选点回填地址: - 新增 `reverseGeocode(lng, lat)`(基于 `window.BMapGL.Geocoder` 的逆地理编码,BD-09 坐标)与 `extractAddress(result)`(兼容 `address` / `content.address` / `addressComponents` / `address_detail` 多种返回形态,失败返回空串)。 - `handleMapClick(point)` 在写入经纬度(bd09 → wgs84)后调用 `fillLocationByPoint(point.lng, point.lat)`,解析成功即覆盖 `form.equipmentLocation`,失败保留原值。 - 新增 `locationTip` 提示文案(解析中 / 已回填 / 解析失败),绑定在坐标输入下方的 `.coordinate-tip`,并在 `reset()` 与 `openMapPicker()` 中清空。 - 地图选点弹窗底部新增「解析地址」一行,实时显示回填结果。 - 详情弹窗:由单个 `el-descriptions` 拆成 基础信息 / 资产信息 / 部署运维 三段,分别用 `.form-section-title.detail-section-title` 分区标题,字段顺序与表单页一致;新增 `.detail-section-title { margin-top: 18px; }` 样式。 ## 验证 - `read_lints` 对该文件仅返回既有的 38 条警告(未知 element 标签、未解析变量等旧告警),无新增错误。 - 未执行构建/运行时验证:逆地理编码依赖 `index.html` 全局加载的百度地图 WebGL SDK 与网络可达性,需前端实际点选地图确认。 ## 风险与后续 - 逆地理编码在地图 SDK 未加载或解析失败时静默降级,仅通过提示文案告知用户,不会阻断保存。 - 回填会覆盖已手工填写的安装位置;若后续希望「仅在为空时回填」,需调整 `fillLocationByPoint`。 ## 第二轮:列表区布局调整 - 删除「设备台账」卡片副标题“一览管网监测设备台账与运行状态”。 - 查询条件(筛选表单)从设备台账卡片中移出,单独成卡 `.filter-card`,放在 KPI「设备统计」框下方;「新增设备」按钮上移到页头右侧。 - 「设备台账」改为分区标题(复用 `.form-section-title` + 新增 `.section-block-title`),放在设备列表卡片之上,参考「设备统计」页头的摆放方式。 - 同步删除已无用的 `.card-header-row / .card-title / .card-subtitle / .ledger-actions` 样式。 ## 第三轮:设备台账标题样式与位置 - 「设备台账」标题改用与「设备统计」相同的 `.page-title` 字体(20px / 600 / #0a1628),不再使用分区蓝边小标题样式。 - 将「设备台账」标题从设备列表卡片上方移到查询条件输入框上方(`.filter-card` 之前),并用 `.section-block-title` 保留上下间距。列表卡片不再带标题。 ## 案件设备关联调整:case_info 改用 equipment_id ### 目标与结论 - 用户要求 `case_info.device_id` 更名为 `equipment_id`、删除 `device_code`;案件设备关联统一按设备主键查询。 - 后端两份 `CaseInfo` 实体、Mapper、保存 DTO、案件列表/详情及三处自动建案逻辑已同步。新增案件提交 `equipmentId`,设备 ID 必填且必须存在,不再接收旧 `deviceId` 作为关联字段。 - 案件接口的 `deviceCode` 仅作为出参展示字段保留,按 `equipmentId` 从 `equipment_base.equipment_code` 读取,设备编码变更不影响案件关联。 - 已检查 `src/api/pipeNetwork/basic.js` 和 `src/views/subSystem/manholeCover/caseHandling/circulation.vue`:前端只展示 `deviceCode`,没有使用旧 `deviceId` 或新建案件调用,因此本轮不改前端运行代码;保留设备管理页既有修改。 ### 脚本与验证 - 后端新增 `pipe-network-service/sql/migration_case_info_equipment_id.sql`,支持有效 ID 保留、旧编码唯一回填、幂等重跑、异常回滚;不强制历史无关联案件补设备,不对依赖对象使用 CASCADE。 - 管理端与 `zk-api-service` 编译通过;案件 service/controller、工单、清警共 33 项测试通过。 - `pipe-network-service/sql/tests/case_info_equipment_id_migration.test.mjs` 在内存 PGlite 中通过 11 个场景,覆盖重复执行、编码变更、重复编码、新旧 ID 冲突、孤立关联及依赖视图的失败回滚。 - 未连接或修改实际数据库。PGlite 仅作 PostgreSQL 兼容性验证,最终仍需在 KingbaseES 验收;上线前备份并停止案件写入,完整执行脚本后部署管理端和 API 服务,避免旧版本继续访问已删除的列。 ## 四子系统统一报警审核 ### 目标与结果 - 新建 `src/views/subSystem/alarm/index.vue`、`AlarmSummary.vue`、`alarmReviewModel.js` 及 `src/api/alarmReview.js`,按用户原型提供查询、分页、审核弹窗和处置时间线,样式使用系统 Element Plus 卡片/表格/分页。 - 删除被替代的供水两个审核 wrapper、排水 bjsh、燃气 krqildjc、井盖 alarmList,以及独占的旧 API。供水 WaterAlarmPage 保留管理/GIS,移除旧审核实现并导航至 `/monitorAlarm/alarmAudit`。 - 菜单 2118/2142/2097/2024 均复用已有行,path 统一 `alarmAudit`、component 为 `subSystem/alarm/index`,query 按设备根类型和燃气报警编码隔离;后端再校验实际授权菜单。 - 报警等级使用 `alarm_level`,1~4 对应一级~四级(红/橙/蓝/绿);审核结果由后端枚举提供。审核意见两种结果均必填,附件最多 5 个/每个 10MB,未保存退出需确认,失败保留输入。 - 确认报警创建待派单工单,但不改变设备状态或报警处理状态。误报警仅记录审核结论;状态与工单处置独立。 - 后端脚本 `pipe-network-service/sql/migration_alarm_review.sql`:Kingbase `int8` 主键 + 独立 `alarm_log_id_seq` + nextval;不做历史迁移、不增加 source_key。新报警初始化及处理/工单过程通过触发器写 alarm_log,审核意见附件由审核事务记录。 ### 验证 - 前端 `npm run build:prod` 通过,既有 Sass 弃用和包体积提示未扩大处理范围。 - 报警 UI 模型、审核新契约、原有报警 GIS、统一叶子 path 路由唯一性共 14 项 Node 测试通过。 - 后端管理端 clean test 共 55 项通过;SQL 内存 PGlite 7 项通过。未连接真实数据库,未完成 KingbaseES 实机或真实登录 E2E。 - `zk-api-service` 仍被既有缺失 `CollectionAlarmWriter` 类阻塞编译;已核对 HEAD 引用与文件树,未重写无关采集逻辑。部署说明在后端 `docs/alarm-review-2026-09-23.md`。 ### 后续 - 补回采集 API 的缺失类后重新编译;Kingbase 执行脚本并同步部署、重新登录验证 4 个菜单的数据隔离、审核/建单/时间线及实际附件访问。 - 既有同设备未办结工单冲突规则保留,确认审核遇到冲突会整体回滚并提示,不会半成功。 ## 报警审核列表底部文案清理 - 按用户要求删除 `src/views/subSystem/alarm/index.vue` 分页下方说明文案及其专用 `.list-note` 样式,查询、审核和建单逻辑不变。 - 同步更新 `tests/waterAlarmAuditWorkbench.test.mjs`,4 项测试通过,`git diff --check` 通过;本轮仅为文案清理,未重跑完整构建。 ## 报警审核查询区域上下留白 - 按用户反馈调整查询卡片:上下内边距统一为 16px、左右 20px,移除表单及表单项额外外边距;换行间距改由 flex gap 统一控制(行 12px、列 24px)。只影响报警审核页面查询区域。 - 相关前端回归 5 项通过,Vue 模板及 scoped CSS 编译通过,`git diff --check` 通过;未重跑全量构建或真实页面截图验收。 ## 报警处置记录图片缩略图与预览 - 根据运行截图,将处置记录里的图片文件名链接改为 96×72 缩略图;点击使用 Element Plus 图片查看器放大,支持同条记录多图切换,预览层传送到 body 防止被抽屉裁切。 - 新增 `AlarmAttachments.vue`,图片加载中/失败有占位提示;`alarmReviewModel.js` 统一筛选安全图片 URL,支持绝对地址、站内路径、大小写后缀以及查询参数/片段,不为非图片文件渲染链接。 - 用户追加明确不要 PDF:审核表单文案、accept、前端校验和后端上传白名单/文件头校验均只允许 JPG/JPEG/PNG;尺寸及数量限制不变。本条取代前面初版支持 PDF 的描述,不删除历史存储文件。 - 前端图片模型及审核页 11 项测试通过,Vue 脚本/模板/scoped CSS 编译通过;后端上传/审核/controller 共 13 项测试通过(含真实 PDF 头和伪装 PNG 的拒绝用例)。两个仓库 `git diff --check` 通过。未进行真实登录、实际图片网络加载的浏览器验收。 - 本轮 `npm run build:prod` 生产构建通过。 ## 报警空值展示与工单故障描述 - 新增 `hasActualValue` 判断,列表及复用的审核/处置记录摘要在实际值为 null/undefined/空字符串时隐藏整行“实际值;阈值”;数字 0 和字符串 0 保持展示。 - 修正后端审核建单传参:不再将审核意见传作 orderDesc,改由工单服务根据原报警生成故障描述,写入 `work_order.order_desc`。审核意见仍单独写入审核日志,审核事务、设备状态逻辑不变。 - 自动生成的工单描述同样忽略没有实际值时的数值/阈值占位。不改历史工单,不需要结构脚本。 - 前端相关 13 项测试和两个 SFC 的脚本/模板/样式编译通过;后端审核/controller/工单共 27 项测试通过,新增检查实际写入的 WorkOrder.orderDesc,覆盖实际值为 0 和为空。两个仓库 `git diff --check` 通过;未连接真实数据库或执行浏览器 E2E。