|
@@ -35,6 +35,14 @@ const OVERLAP_DEVICE_LAYER_COORDS = [
|
|
|
{ longitude: 110.3991, latitude: 28.4351 },
|
|
{ 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 = [
|
|
const MAP_POINTS = [
|
|
@@ -374,10 +382,11 @@ function mapSnapshotPayload(scenario, path, overrides = {}) {
|
|
|
|
|
|
|
|
// 票 42:受控有效坐标样例 —— 地图侧的点位 `deviceCodes` 必须与详情 `devices[]` **一致**,
|
|
// 票 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) =>
|
|
const points = MAP_POINTS.map((item) =>
|
|
|
item.pointCode === DEVICE_LAYER_POINT
|
|
item.pointCode === DEVICE_LAYER_POINT
|
|
|
- ? { ...item, deviceCodes: DEVICE_LAYER_CODES.slice() }
|
|
|
|
|
|
|
+ ? { ...item, deviceCodes: codes.slice() }
|
|
|
: item,
|
|
: item,
|
|
|
)
|
|
)
|
|
|
return mapSnapshotPage({
|
|
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') {
|
|
if (scenario === 'point-detail-order') {
|
|
|
const devices = [
|
|
const devices = [
|
|
|
{ deviceCode: 'EQ-ORDER-NORMAL', deviceName: '顺序样例-正常设备', deviceTypeName: '压力计', deviceStatus: 'NORMAL', statusLabel: '正常', statusReasons: [], statusTime: '2026-09-02T09:59:30+08:00' },
|
|
{ deviceCode: 'EQ-ORDER-NORMAL', deviceName: '顺序样例-正常设备', deviceTypeName: '压力计', deviceStatus: 'NORMAL', statusLabel: '正常', statusReasons: [], statusTime: '2026-09-02T09:59:30+08:00' },
|