2026-09-24-early.md 19 KB

2026-09-24 前期会话归档

原始会话按时间保留,后续条目覆盖前面的过期约定;当前事实以 ../long-term.md 为准。后续会话见 ../sessions/2026-09-24.md。

报警审核意见选填与取消关闭确认

目标与结论

  • 用户要求关闭报警审核弹窗不再提示“放弃本次审核”,审核意见改为非必填。
  • src/views/subSystem/alarm/index.vue 删除丢弃确认及无用 dirty 状态,取消、关闭按钮、Esc 和路由切换不再触发未保存确认;上传或提交中仍保护退出。审核结果必选,意见选填、最多 500 字,输入框提示同步调整。
  • 后端 AlarmReviewRequest 移除意见的 @NotBlank,保留 @Size(max=500);AlarmReviewService 允许 null、空字符串及纯空白意见,统一以空字符串记录日志,继续限制长度。
  • 不修改确认报警建单、故障描述生成、日志事务、设备状态或附件逻辑。不需要数据库脚本。
  • 同步前端 tests/waterAlarmAuditWorkbench.test.mjs、后端审核 service/controller 测试及后端交付说明 docs/alarm-review-2026-09-23.md;本条覆盖上一日意见必填和退出需确认的历史交互约定。

验证结果

  • 前端模型与审核页相关 Node 测试 14 项通过;报警审核 SFC 的脚本、模板及 scoped SCSS 编译通过。
  • 后端 Maven 审核 service/controller、工单 service 测试共 42 项通过(17 + 8 + 17),覆盖两种审核结果的空意见、不传意见、null、空白、长度边界及无意见确认建单。
  • 两个仓库 git diff --check 通过。未执行全量前端生产构建、真实登录浏览器 E2E 或真实数据库操作。

风险与后续

  • 前后端需同步部署,后端重新构建启动后才会取消接口必填限制;上线后检查取消、关闭、Esc 和空意见提交。
  • 保留既有 .feisuan/ 未跟踪目录,本轮未提交或推送代码。

创建工单取消设备级互斥,报警转工单改为同类查重

目标与结论

  • 用户要求移除“该设备已有处理中的工单,需结案或取消后才能创建新工单”,仅报警审核转工单时限制同设备 + 同报警类型的未完成工单。实际表字段是 alarm_data.warning_code。
  • 后端 WorkOrderServiceImpl 删除设备级查重及手动/隐患建单中的调用;报警建单通过 alarm_data.order_id 关联 work_order,只比较设备主键 work_order.device_id 和报警 warning_code,状态采用 WorkOrderStatusEnum.activeCodes()(0/1/2/3/4/6)。不同编码、其他设备、已结案/已取消、无报警关联的手动或隐患工单不占同类名额。
  • 增加 EquipmentBaseMapper.lockById,在建单事务中对设备行执行 FOR UPDATE,锁后刷新读取报警关联并查重;WorkOrderMapper.existsActiveAlarmOrder 不使用部门过滤或报警处理状态过滤。锁与查重查询禁用缓存并刷新 MyBatis 会话缓存,防止等待锁后读取旧结果。
  • 同一报警重复调用仍复用已有工单;报警编码缺失时明确报错,不按显示名称替代。确认报警建单、审核事务和日志保持原逻辑,不修改设备状态。无需结构脚本,不迁移或处理既有重复工单。
  • 后端修改工单 service/interface、设备/工单 mapper 和对应测试,更新交付说明及领域语境;前端仅清理排水批量报修的一条过期注释并同步语境/记忆,未变更运行逻辑。

验证结果

  • Maven 管理端关联测试 64 项通过:工单 service 26、新增 mapper 契约 2、审核 service 17、审核 controller 8、清警 8、供水范围/未办结口径 3。
  • 覆盖手动/隐患建单不查设备冲突、同设备同编码查重、锁与查重/建单顺序、锁后幂等重读、档案删除、报警编码缺失、未办结枚举和字段关联 SQL 契约;保留工单故障描述和设备状态相关回归。
  • 前端报警模型及审核页相关 Node 测试 14 项通过;两个仓库 git diff --check 通过。
  • 未连接真实 KingbaseES,未执行真实双连接并发/浏览器 E2E;行锁通过代码顺序和 MyBatis SQL 契约验证,实机并发仍需部署后验收。

后续

  • 重新构建并启动后端后生效。数据库无需新增字段、索引或迁移脚本;既有重复工单不自动合并或取消。
  • 保留上一轮未提交改动和 .feisuan/,本轮未提交或推送。

报警提醒、清单、排水研判与 GIS 重构

目标与结论

  • 用户要求将排水报警提醒/清单/研判/当前 GIS、供水报警管理整合到统一报警模块。后续明确 GIS 文件为 alarmGIS.vue、菜单 path 为 drainageAlarmGIS,不需要周边环境页签,已同步代码、后端授权组件白名单和菜单 SQL。
  • 新增 src/api/alarm.js 与 alarm/remind.vue、list.vue、drainage/analysis.vue、drainage/alarmGIS.vue,共享详情/图表/查询范围及数据模型。清单使用框架 pagination、后端分页排序,首列预警单号;按设备/单号/等级/监测状态/审核结果/日期查询。
  • 提醒每 30 秒刷新,悬停/聚焦/手动/详情打开期间停止滚动且缓冲更新。研判展示真实曲线、事件当天、日均和月均以及独立最新采样;缺值不补零,异常采样间隔与缺失整日/月断线,状态报警无数值曲线时明确提示。
  • GIS 复用系统 GisMapCanvas:设备聚合、等级颜色、定位、聚合展开、底图重试、无坐标列表。详情三个页签为设备信息、报警记录、监测曲线;设备历史记录单独按设备编码后端分页,包括已恢复记录。
  • 修正菜单导航读取实际 Pinia 属性 sidebarRouters,按 rootTypeId 查获授权入口,供水/排水相同 alarmList 不串系统。后端独立校验运营菜单和审核菜单;GIS/研判只接受排水根。
  • 删除 4 个旧排水 Vue、供水旧管理入口和 bjgl 包装;WaterAlarmPage 仅保留供水 GIS,去掉管理分支及独占 JS/CSS;删除旧 API 包装。后端删除相应供水统计/导出接口及 DTO、排水旧处理审批方法,保留其他页面仍使用的共享查询。删掉的受版本管理源码可从 Git 历史恢复,未删除业务数据库表。
  • migration_alarm_operations.sql 按 menu_id 精确更新 2139/2140/2141/2143/2117,不改父级和角色关联;2117 同时保留供水首页/GIS 所用查询权限。新 alarm_no 数据库日期+序列生成,唯一不可改,不回填历史;报警触发/自动恢复事务日志、工单创建日志使用预警单号。自动恢复由采集事务标记区分,人工处理不误标为自动。

验证

  • 前端相关 Node 测试 22 项通过;生产构建通过,保留已有 Sass/包体积提示。
  • 后端管理端相关测试 72 项通过,zk-api-service 编译通过。原 CollectionAlarmWriter 缺失阻塞已解除。
  • SQL PGlite 兼容性测试 6 项通过,覆盖日期唯一单号、不可变、不回填、触发/恢复日志、来源区分、重复执行/回滚、精确菜单及实际 MyBatis 查询/原始样本均值。
  • 两仓 diff 检查通过。没有连接实际 KingbaseES、执行真实登录浏览器或底图联调;没有提交、推送、部署。

后续

  • 交付说明:E:/work/pipe-ner-server/docs/alarm-operations-2026-09-24.md。依赖上一轮审核脚本;首次部署按审核脚本、运营脚本顺序执行,本轮脚本须最后执行,避免旧脚本覆盖生命周期函数。
  • 部署管理端、采集 API、前端,重新登录刷新菜单;需 KingbaseES 实机及实际数据验收。采集周期未固定,页面不虚构数据覆盖率;无数据源的状态类报警只展示事件与时间线。
  • 保留此前修改和 .feisuan/;此次清理无数据表删除或历史数据迁移。

alarm_no 改为报警单号、BJ 前缀

  • 用户明确将 alarm_no 的名称从“预警单号”改为“报警单号”,生成前缀从 YJ 改为 BJ。同步清单/审核/提醒/GIS/详情/研判文案、研判单号搜索识别、后端实体注解、工单创建日志文案、SQL 触发器和列注释,以及测试与交付说明。
  • 字段仍是 alarm_data.alarm_no,新号格式 BJYYYYMMDD 加至少 8 位全局序列;沿用序列、不重置、不迁移已有号码。数据库脚本位置仍为 E:/work/pipe-ner-server/pipe-network-service/sql/migration_alarm_operations.sql,本轮未连接或执行实际数据库。
  • 前端相关 Node 测试 16 项、SQL 兼容性测试 6 项、后端工单 service 测试 26 项通过;字段/单号命名改动未新增依赖。部署按最新脚本更新生成函数并重新部署前后端。
  • 长期记忆和领域文档已更新,本条取代此前记录的 YJ/预警单号命名。未提交、推送或修改其他设备编码中的 YJ 业务分类。

报警单号改由程序生成

  • 用户要求 alarm_data.alarm_no 由程序生成,取消数据库自动赋号。管理端 AlarmDataServiceImpl.saveAlarmData(新增、测试报警、两个演练入口)与采集端 CollectionAlarmWriter 在 INSERT 前生成 BJ + 北京日期 YYYYMMDD + MyBatis-Plus 雪花 ID,覆盖请求带入号码。复用已有报警、等级变化和恢复不改号。
  • 两端 AlarmData 将 alarm_no 插入策略从 NEVER 改为 NOT_NULL,更新策略仍为 NEVER。数据库保留唯一索引;不依赖序列、字段默认值或生成触发器,不回填历史。
  • 更新原 migration_alarm_operations.sql,兼容清理旧 trg_alarm_number、assign_alarm_number()、默认值、alarm_no_seq,保留报警日志触发器。已有号码和日志不重写。
  • 工作区出现其他改动:报警工单关联改为 work_order_id、报警时间改为 create_time,全部保留;修正旧 Mapper 测试的关联字段断言以验证最新真实 SQL。
  • 验证:程序赋号专项 7 项通过(管理端 3、采集端 4,含 2000 条并发唯一、先赋号再入库、复用不改号、失败回滚、插入/更新策略);工单 26 项和运营 Mapper 1 项通过;SQL PGlite 6 项通过,含已部署旧触发器环境的清理及重复执行。两仓 diff 检查通过。
  • 同步后端交付说明、两端 CONTEXT 和长期记忆;取代前文“数据库按序列生成”的约定。未执行真实数据库、提交或部署。上线需执行最新版脚本并部署管理端与采集 API,已有历史号码保持原值。

报警审核日志收敛、昵称与倒序历史

目标与结论

  • 用户要求确认报警不再单独记录关联工单/工单操作,而在确认日志内显示“已转工单(实际工单号)”;人工日志使用用户昵称;历史倒序并参考 dispose.vue 样式;两后端日志类型枚举合一。
  • 后端审核在成功创建工单并读取真实 order_no 后,仅插入一条确认日志,描述含选填意见及工单号,缺失工单号或日志写入失败则异常回滚;保留 work_order_log 和不修改设备状态的约定。删除工单写入报警日志的 mapper 方法及调用。
  • 审核与人工处理通过 SysUserMapper 取 sys_user.nick_name,同时存用户 ID;历史查询关联用户昵称,按 oper_time DESC NULLS LAST, log_id DESC 排序。自动动作仍使用系统名称。旧类型历史行保留显示“历史操作”,不删除或迁移历史数据。
  • 新增根模块 alarm-contract,唯一的 AlarmLogOperTypeEnum 保留 0 报警触发、1 确认报警、2 误报警、3 报警处理;删除 zksy-system / zk-api-service 重复枚举及工单相关类型,两端 Maven 引用该模块。
  • 新增前端 alarm/AlarmHistory.vue、alarmHistoryModel.js,审核页和详情页共用。按日期、时间及同一时间日志 ID 倒序分组,显示时间、加粗昵称、动作、描述及 50px 图片缩略图;保留点击大图预览,不使用不安全 HTML。
  • 增量脚本 E:/work/pipe-ner-server/pipe-network-service/sql/migration_alarm_review_log.sql 清理旧日志触发器/自定义函数,使用 NOT VALID 限制新日志类型为 0~3、保留历史旧类型行;同步完整建表脚本及交付说明。
  • 同步长期记忆及语境中的过期单号约定:最新格式已是程序生成 BJyyyyMMddHHmmss + 4 位随机数(北京时间),不是雪花 ID;新增/解除日志均由 Java 事务主动写入,不依赖自定义函数/触发器。本条覆盖前述旧约定。

验证结果

  • 后端根目录执行管理端与采集端 Maven clean test,本轮选定 11 个测试类共 97 项通过、零失败/错误/跳过;清理旧 class 后重新编译,验证共享枚举依赖不依赖残留产物。
  • PGlite SQL 兼容测试 18 项通过,覆盖真实历史 SQL 昵称关联及倒序、历史旧类型保留、禁止新写入旧类型、增量脚本可重跑,以及无触发器新增/恢复日志与回滚。
  • 前端相关 Node 测试 18 项通过,生产构建通过,输出到临时目录;未覆盖既有 dist-verify/。两仓 git diff --check 通过。

风险与后续

  • 未连接/执行真实 KingbaseES,未进行真实登录浏览器验收;SQL 兼容测试不是 KingbaseES 实机验收。未提交、推送或部署。
  • 停止相关写入后执行增量脚本,同步部署管理端、zk-api-service、前端;从后端根目录使用 -pl zk-api-service,pipe-network-service/zksy-admin -am 构建以包含共享模块,单独构建前先安装该模块及父 POM。
  • 保留工作区原有修改和 .feisuan/,删除的重复枚举/无用方法可由版本管理恢复,业务日志数据未删除。

报警日志枚举改为两端各自定义

  • 用户明确不要新增 alarm-contract 模块,允许 zksy-system 与 zk-api-service 各创建一份相同的 AlarmLogOperTypeEnum。本条取代上一节共享模块的实现和安装要求。
  • 管理端恢复 com.zksy.base.alarm.enums.AlarmLogOperTypeEnum,采集端新增 com.zksy.api.enums.AlarmLogOperTypeEnum;两份除包名外完全一致,仍只保留 0 触发、1 确认、2 误报、3 处理。同步服务与测试 import。
  • 删除新增共享模块源码/POM,移除根 POM 模块声明及两个工程的依赖;最终检查 E:/work/pipe-ner-server/alarm-contract 目录不存在,无运行时代码引用。被移除枚举内容保存在两个本地枚举文件,不丢失业务逻辑或数据。
  • 新增采集端枚举契约测试,管理端同步校验全部类型名称及编码。根目录联合 clean test 共 12 类、98 项通过,零失败/错误/跳过;两份源码一致性及两仓 diff 检查通过。
  • 已更新后端交付说明、领域语境、前端长期记忆及索引。前端运行时代码和 SQL 未变,无新增数据库脚本;未提交、推送或部署。

报警处置历史日期显示今天、昨天

  • 用户要求处置全流程的时间参考工单历史,以今天、昨天等形式显示。读取 dispose.vue 的 dayLabel 后,在报警历史沿用“今天 · 月日”样式并增加昨天、跨年及无效日期处理,未改工单页面。
  • alarmHistoryModel.js 新增 historyDayLabel,按本地日历日期判定今天/昨天,避免直接取 UTC 日期导致凌晨误判。当天/昨天保留具体月日,同年其他记录显示月日,跨年记录显示年月日;空值/无效日期显示“时间未记录”。
  • AlarmHistory.vue 日期分组标题调用该函数,悬停显示原始完整日期。审核页和详情页同步生效;每条记录时分秒、时间倒序、昵称、图片展示均保持不变。
  • tests/alarmHistory.test.mjs 增加今天/昨天、跨月、跨年、闰日、无效值及模板接入测试;Asia/Shanghai 时区下相关 Node 回归共 21 项通过,组件脚本/模板/样式编译及 diff 检查通过。
  • 仅前端变更,无数据库脚本;未执行全量生产构建或真实登录浏览器验收,未提交、推送或部署。已同步长期记忆及索引。

今天、昨天标题不再附加日期

  • 用户要求今天/昨天不显示后面的日期。alarmHistoryModel.js 改为仅返回“今天”“昨天”,更早日期、悬停完整日期及每条记录的时分秒不变,审核页与详情页同步生效。
  • 更新 tests/alarmHistory.test.mjs 断言以及长期记忆、索引;相关 Node 测试 21 项通过,diff 检查通过。无后端/SQL 修改,未部署或进行浏览器验收。

报警提醒、清单查询、GIS 曲线与研判候选调整

  • 用户四点要求均已落实:提醒仅未处理且移除报警清单操作;清单时间条件改“报警时间”、设备提示改“请输入设备编码/名称”、移除审核结果筛选;GIS 监测曲线和研判下拉仅实际值非空事件。
  • 后端 AlarmOperationsService.reminders 强制使用 AlarmRecordStatusEnum.UNHANDLED,不能通过请求改查已处理事件。AlarmQuery.actualValueOnly 默认 false,Mapper 在 WHERE 中加 actual_value IS NOT NULL 后再由框架分页,研判使用 true;普通清单/地图查询不受此筛选影响。analysis 对实际值为空的报警直接返回 unsupported 和空采样,不查监测表。
  • 前端 remind.vue 请求显式状态 0,删除清单导航按钮及无用变量;list.vue 修改查询文字及筛选状态,但保留审核结果表格列。alarmOperationsModel.js 新增共享候选筛选函数,保留 0、负数,排除 null/undefined/空串并按 ID 去重。
  • alarmGIS.vue 只过滤曲线候选/曲线按钮,不过滤点位和历史记录;默认选择首个有值事件,切换设备或历史页后校验当前选择,无候选时显示空状态且不加载图表。analysis.vue 使用后端过滤且校验深链接详情,不能将无实际值事件补入下拉。AlarmDetail.vue 对无值事件隐藏进入研判按钮。
  • 验证:管理端 service/mapper/controller/数据范围相关 Maven 测试 22 项通过;前端 Node 26 项通过;PGlite 实际 SQL 7 项通过,覆盖未处理、空值/零值、过滤先于分页及总数和设备类型范围;前端生产构建通过,输出到临时目录,未覆盖现有构建目录。两仓 diff 检查通过。
  • 同步交付说明、前后端语境、长期记忆和索引。无需数据库结构 SQL;前后端重新部署后生效,未执行实际数据库、浏览器登录验收、提交或推送。保留工作区其他改动。

报警详情三项状态样式减轻

  • 用户参考截图要求监测状态、审核结果、处置状态的标签和值不要太粗。AlarmDetail.vue 改为三列横排的标签和值,使用语义化 dt/dd,标签 13px、状态标签 12px、字重均 400;状态使用小号浅色、无边框标记,窄屏自动换行。
  • 删除 alarmOperations.scss 中旧状态灰底卡片样式,组件采用 scoped 样式避免影响其他页面;工单关联/责任人/期限表格和历史布局不变。监测与审核颜色映射只影响展示,处置颜色复用现有工单字典,不新增状态含义或修改接口。
  • 相关 Node 测试 28 项、前端生产构建及 diff 检查通过。构建输出到临时目录,未覆盖现有发布目录;未进行真实登录浏览器视觉验收、提交、推送或部署。无后端/数据库修改,同步长期记忆和索引。