Преглед изворни кода

供水运行监测无采样设备显示中性空态 (#67)

流量、压力、漏失页保留设备身份,监测数值缺失时显示暂无数据,不计入异常点位,也不将空值标红。
Kazerin пре 3 недеља
родитељ
комит
e90663af73

+ 7 - 0
memory/sessions/2026-09-28.md

@@ -33,3 +33,10 @@
 - 仅调整 `WaterAlarmPage.vue` 的 scoped 布局与图表标题:图标回到弹性布局,筛选标题左侧并排,页头/卡片/图表区沿用统计分析页的蓝白色值与间距;四级报警业务配色不变。新增 `tests/waterAlarmLayout.test.mjs` 作为回归测试。
 - 本地前端服务可访问,但当前应用内会话停在登录页,Chrome 扩展连接不可用,因此真实「首页→报警管理」路线仍需人工视觉复核;未提交登录信息或修改用户会话。
 - 单文件布局与业务测试 11 项通过,生产构建通过;全量 179 项中 176 项通过,余下 3 项为此前已知的旧设备台账/责任人测试失败,无新增失败。
+
+## Gogs #67 / T03 运行监测三页设备类型口径
+
+- 在既有监测 REST 接口与页面 seam 上按设备类型树 `equipment_type.id` 区分三页:流量 11、压力 12/14、漏失 13;不新增测试数据或表结构,保留原页面视觉和 API 形状。
+- 后端默认查询在无采样时仍返回供水设备基础档案,监测值与时间保持空值;有采集时间或数值筛选时仍只保留匹配采样的设备。前端将无监测值显示为“暂无数据”,不计入异常点位统计。
+- 定向测试先红后绿:`MonitoringServiceImplTest` 模拟四台已约定供水设备及排水设备,核对三页归属、无采样空值与筛选行为;`waterSupplyMonitoring.test.mjs` 锁定无数据的前端状态。
+- 后端 `zksy-system` 及依赖全量测试通过;整仓 Maven 在并行新增的 cockpit 测试编译中失败(`CockpitMonitoringPointDetailSnapshotContractTest` 调用旧 `load` 形参),未触碰该文件。前端构建通过,Node 全量 179 项中 176 通过、3 项为既有旧设备页测试失败。真实 KingbaseES 与浏览器登录态验收仍由项目侧复核。

+ 1 - 1
src/utils/waterSupplyModel.js

@@ -34,7 +34,7 @@ export function normalizeMonitoringRecord(record = {}, metric = 'value', monitor
     location: record.equipmentLocation ?? record.location ?? record.address ?? '-',
     value: value == null || value === '' ? null : Number(value),
     unit: record.unit ?? (metric === 'pressure' ? 'MPa' : metric === 'power' ? 'kW' : 'm³/h'),
-    status: record.status ?? record.onlineStatus ?? record.alarmStatus ?? 0,
+    status: value == null || value === '' ? 'no-data' : record.status ?? record.onlineStatus ?? record.alarmStatus ?? 0,
     updateTime: record.updateTime ?? record.monitorTime ?? record.createTime ?? record.time ?? '-'
   }
 }

+ 3 - 2
src/views/subSystem/waterSupply/components/WaterMonitoringPage.vue

@@ -123,7 +123,7 @@
                 <el-table-column prop="location" label="安装位置" min-width="180" show-overflow-tooltip/>
                 <el-table-column :label="`${metricLabel}(${unit})`" min-width="130">
                     <template #default="{ row }">
-            <span :class="{ danger: row.value == null || row.status === 1 || row.status === '1' }">
+            <span :class="{ danger: row.status === 1 || row.status === '1' }">
               {{ row.value ?? '-' }}
             </span>
                     </template>
@@ -273,13 +273,14 @@
         return values.length ? (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) : '-'
     })
     const abnormalCount = computed(() => page.value.records.filter(item =>
-        item.status === 1 || item.status === '1' || item.value == null
+        item.status === 1 || item.status === '1'
     ).length)
     const latestTime = computed(() =>
         page.value.records.map(item => item.updateTime).filter(Boolean).sort().at(-1) || '-'
     )
 
     function statusText(row) {
+        if (row.status === 'no-data') return '暂无数据'
         if (row.status === 1 || row.status === '1') return '异常'
         if (row.status === 0 || row.status === '0') return '正常'
         return row.status ? '在线' : '未知'

+ 16 - 0
tests/waterSupplyMonitoring.test.mjs

@@ -1,4 +1,5 @@
 import assert from 'node:assert/strict'
+import test from 'node:test'
 import {
   buildMonitoringQuery,
   buildTrendQuery,
@@ -56,6 +57,21 @@ const trendPoint = normalizeMonitoringRecord({
 assert.equal(trendPoint.updateTime, '2026-09-01 12:30:00')
 assert.equal(trendPoint.value, 25.5)
 
+test('unmeasured water devices keep their identity and show a neutral monitoring empty state', () => {
+  for (const [metric, sample] of [
+    ['flow', { equipmentId: 'flow-11', equipmentName: '测试流量计', instantFlow: null, monitorTime: null }],
+    ['pressure', { equipmentId: 'pressure-12', equipmentName: '测试压力计', pressureValue: null, monitorTime: null }],
+    ['power', { equipmentId: 'leak-13', equipmentName: '测试漏失监测01', power: null, monitorTime: null }]
+  ]) {
+    const row = normalizeMonitoringRecord(sample, metric)
+    assert.equal(row.id, sample.equipmentId)
+    assert.equal(row.equipmentName, sample.equipmentName)
+    assert.equal(row.value, null)
+    assert.equal(row.status, 'no-data')
+    assert.equal(row.updateTime, '-')
+  }
+})
+
 const exportError = await readMonitoringExportError(
   new Blob(['{"code":500,"msg":"导出数据过多"}'], {type: 'application/json'})
 )