Quellcode durchsuchen

票45测试数据:新增K>10降级场景device-layer-overlap-degraded

Kazerin vor 1 Woche
Ursprung
Commit
dd1973d313

+ 1 - 1
.scratch/cockpit-shell-panel-layout/verify/t43-device-correspondence.mjs

@@ -260,7 +260,7 @@ const device = (code, pointCode = 'MP-1') => ({ code, pointCode, longitude: 110.
 
     // ⑫ 图层重建后刷新反应(否则翻页选中态丢失)。
     check('F12-refresh-after-layer-rebuild',
-        /painted\.value = syncAssociatedDevices\(drawn(?:, \{ maxFan: options\.maxFan \})?\)[\s\S]{0,240}syncDeviceReactions\(\)/.test(store),
+        /painted\.value = syncAssociatedDevices\(drawn(?:, \{ maxFan: options\.maxFan(?:\s*,\s*overlapGroups: groups)? \})?\)[\s\S]{0,240}syncDeviceReactions\(\)/.test(store),
         '图层整份重建后刷新一次反应(避免"翻页选中态没了")')
 
     // ⑬ 外壳写层级字段并同步对照值。

+ 58 - 2
src/modules/cockpit/mocks/contractMocks.js

@@ -35,6 +35,14 @@ const OVERLAP_DEVICE_LAYER_COORDS = [
     { longitude: 110.3991, latitude: 28.4351 },
 ]
 
+/**
+ * 票 45:**K>10 降级样例** —— 11 台设备同坐标(超过 `map.overlap.maxFan` 默认 10),
+ * 状态混合(3 ALARM / 3 WARNING / 5 NORMAL),验证「本屏显示 10 台 / 其余见清单」降级形态。
+ * 地图快照 `deviceCodes` 与详情 `devices[]` 必须一致(否则会误判「与当前快照不一致」)。
+ */
+const OVERLAP_DEGRADED_CODES = Array.from({ length: 11 }, (_, index) => `EQ-DG-${String(index + 1).padStart(3, '0')}`)
+const OVERLAP_DEGRADED_COORDS = Array.from({ length: 11 }, () => ({ longitude: 110.3989, latitude: 28.4349 }))
+
 // ---------------------------------------------------------------- 地图摘要
 
 const MAP_POINTS = [
@@ -374,10 +382,11 @@ function mapSnapshotPayload(scenario, path, overrides = {}) {
 
     // 票 42:受控有效坐标样例 —— 地图侧的点位 `deviceCodes` 必须与详情 `devices[]` **一致**,
     // 否则第二台设备会被判「与当前快照不一致」而禁止上图(那是另一条要验的语义,不该混在这个基线里)。
-    if (scenario === 'device-layer' || scenario === 'device-layer-overlap') {
+    if (scenario === 'device-layer' || scenario === 'device-layer-overlap' || scenario === 'device-layer-overlap-degraded') {
+        const codes = scenario === 'device-layer-overlap-degraded' ? OVERLAP_DEGRADED_CODES : DEVICE_LAYER_CODES
         const points = MAP_POINTS.map((item) =>
             item.pointCode === DEVICE_LAYER_POINT
-                ? { ...item, deviceCodes: DEVICE_LAYER_CODES.slice() }
+                ? { ...item, deviceCodes: codes.slice() }
                 : item,
         )
         return mapSnapshotPage({
@@ -467,6 +476,53 @@ function pointDetailPayload(scenario) {
         })
     }
 
+    /**
+     * 票 45:**K>10 降级样例** —— 11 台设备同坐标、状态混合(3 ALARM / 3 WARNING / 5 NORMAL)。
+     * 设备编码与地图快照 `deviceCodes` 完全一致,全部坐标准入有效 ⇒ K=11 > maxFan(10) ⇒ 降级形态
+     * 「K 台设备(本屏显示 10 台 / 其余见清单)」。聚合符号显示最高优先级状态(ALARM)。
+     */
+    if (scenario === 'device-layer-overlap-degraded') {
+        const statuses = ['ALARM', 'ALARM', 'ALARM', 'WARNING', 'WARNING', 'WARNING', 'NORMAL', 'NORMAL', 'NORMAL', 'NORMAL', 'NORMAL']
+        const devices = OVERLAP_DEGRADED_CODES.map((code, index) => {
+            const deviceStatus = statuses[index]
+            return {
+                deviceCode: code,
+                deviceName: `重叠降级设备-${index + 1}`,
+                deviceTypeName: ['压力计', '流量计', '液位计'][index % 3],
+                deviceStatus,
+                statusLabel: { ALARM: '报警', WARNING: '预警', WORK_ORDER: '工单处置', NORMAL: '正常', OFFLINE: '离线', EMPTY: '无设备' }[deviceStatus],
+                statusReasons: deviceStatus === 'ALARM' ? ['压力超高'] : deviceStatus === 'WARNING' ? ['液位偏高'] : [],
+                statusTime: '2026-09-02T09:59:00+08:00',
+                ...deviceCoordFields(OVERLAP_DEGRADED_COORDS, index),
+            }
+        })
+        return {
+            requestId: 'mock-point-detail',
+            apiVersion: 'v1',
+            readOnly: true,
+            monitoringPointCode: DEVICE_LAYER_POINT,
+            monitoringPointName: '城南测试监测点',
+            pointStatus: 'ALARM',
+            statusLabel: '报警',
+            statusReasons: [{ status: 'ALARM', deviceCode: OVERLAP_DEGRADED_CODES[0], reason: '压力超高' }],
+            deviceStatistics: {
+                totalDeviceCount: devices.length,
+                alarmDeviceCount: 3,
+                warningDeviceCount: 3,
+                workOrderDeviceCount: 0,
+                normalDeviceCount: 5,
+                offlineDeviceCount: 0,
+            },
+            devices,
+            coordinateValidation: { state: 'VALID', reason: null, renderable: true, crs: 'WGS84' },
+            statusDictionary: ['ALARM', 'WARNING', 'WORK_ORDER', 'NORMAL', 'OFFLINE', 'EMPTY'].map((item, index) => ({
+                status: item,
+                label: { ALARM: '报警', WARNING: '预警', WORK_ORDER: '工单处置', NORMAL: '正常', OFFLINE: '离线', EMPTY: '无设备' }[item],
+                priority: index + 1,
+            })),
+        }
+    }
+
     if (scenario === 'point-detail-order') {
         const devices = [
             { deviceCode: 'EQ-ORDER-NORMAL', deviceName: '顺序样例-正常设备', deviceTypeName: '压力计', deviceStatus: 'NORMAL', statusLabel: '正常', statusReasons: [], statusTime: '2026-09-02T09:59:30+08:00' },

+ 2 - 0
src/modules/cockpit/mocks/index.js

@@ -17,6 +17,8 @@
  *       延期中旁路 / 已取消四种形状都齐),验状态时间线与「验收驳回是回退动作而不是独立终态」。
  *       追加 `work-order-timeline-failed`:**只有时间线分区失败**、工单列表照常成功 ——
  *       验「轨迹没取到」与「这张工单没有动作记录」是两句不同的话。
+ *       票 45 追加 `device-layer-overlap-degraded`:11 台设备同坐标(K=11 > maxFan=10),
+ *       验「本屏显示 10 台 / 其余见清单」降级形态与预警模式的状态过滤。
  *       票 17 追加 `infrastructure-partial`:应急保障的「防护目标」段没取到,其余段照常画 ——
  *       验「一段没取到」与「这一段确实没有对象」是两句不同的话。
  *       票 18 追加 `monitoring-no-devices`:运行监测的在线率**分母为 0**