| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /**
- * 契约化 mock 的注册入口(票 05)。
- *
- * 为什么要有这一层而不是让页面直接 import `contractMocks.js`:
- * 「注册」与「样例数据」分开——页面只调用 `ensureCockpitMocks()`,
- * 换样例(走查要演示 401/空/过期)不改页面代码。
- *
- * 场景覆盖(走查与人工演示都用同一套开关,无需改代码重新构建):
- * `window.__COCKPIT_MOCK_SCENARIO__` = `success`(默认)| `empty` | `degraded` | `stale` | `failed` | `unauthorized`
- * 票 09 追加 `point-statuses`:后端六态 + 未关联设备 + 一个前端不认识的状态,全部可上图。
- * 它只影响 `/map-snapshot` 的样例内容,不改默认场景的任何数字(票 07/08 的断言依赖那些数)。
- * 票 10 追加 `point-detail-order`:设备卡片逆状态优先级排列,验「顺序由后端返回顺序决定」。
- * 票 11 追加 `equipment-partial`:设备详情**分区级部分失败**(档案/工单/图片各自 FAILED,
- * 指标/预警/报警照常 SUCCESS),验「任一分区失败不遮盖其它成功分区」。它与 `failed` 不同:
- * `failed` 是端点整体读不到(`data` 为 null),那是"详情没取到"而不是"取到了但有坏块"。
- * 票 12 追加 `work-order-timeline`:四张工单各一条独立时间线(一路推进 / 待验收回退处理中 /
- * 延期中旁路 / 已取消四种形状都齐),验状态时间线与「验收驳回是回退动作而不是独立终态」。
- * 追加 `work-order-timeline-failed`:**只有时间线分区失败**、工单列表照常成功 ——
- * 验「轨迹没取到」与「这张工单没有动作记录」是两句不同的话。
- * 票 45 追加 `device-layer-overlap-degraded`:11 台设备同坐标(K=11 > maxFan=10),
- * 验「本屏显示 10 台 / 其余见清单」降级形态与预警模式的状态过滤。
- * 票 17 追加 `infrastructure-partial`:应急保障的「防护目标」段没取到,其余段照常画 ——
- * 验「一段没取到」与「这一段确实没有对象」是两句不同的话。
- * 票 18 追加 `monitoring-no-devices`:运行监测的在线率**分母为 0**
- * (后端回 `state=EMPTY` + `value="0.0000"`)—— 验「没有可算的设备」不被画成「在线率 0.0%」。
- * 注意这些场景名只被**它自己那族的 builder** 认;别的端点认不出就照 `success` 走
- * (所以 `monitoring-no-devices` 不会把地图或基础设施打空)。
- * `window.__COCKPIT_MOCK_ONLY__` = 只让这一个路径走上面的异常样例,其余保持成功
- * (票 05 验收第 6 条要的正是「只把**受影响分区**标为数据不可用」)
- * `window.__COCKPIT_MOCK_PREFIX__` = 同上,按路径前缀选中一族接口(如 `/equipments/`)
- * `window.__COCKPIT_MOCK_MAP__` = 地图摘要分页的现场覆盖(票 08):
- * `{ pageSize, snapshotAt, expireAfterPage }`
- * —— 例如 `{ pageSize: 2, expireAfterPage: 1 }` 演示「取完第 1 页后快照失效」
- *
- * 注册是幂等的:重复调用只覆盖,不叠加。
- */
- import {
- getMockTransportPaths,
- registerMockTransport,
- resetMockTransportsForTest,
- } from '../services/cockpitApi.js'
- import { registerCockpitMocks } from './contractMocks.js'
- /** 只读全局开关(走查用;生产不会设这些键)。 */
- function readScenario() {
- if (typeof globalThis === 'undefined') return {}
- return {
- scenario: globalThis.__COCKPIT_MOCK_SCENARIO__ || 'success',
- onlyPath: globalThis.__COCKPIT_MOCK_ONLY__ || '',
- prefix: globalThis.__COCKPIT_MOCK_PREFIX__ || '',
- mapSnapshot: globalThis.__COCKPIT_MOCK_MAP__ || {},
- // 票 18:运行监测的现场覆盖(`{ pageSize }`)。后端页大小默认 500,而样例只有 8 条,
- // 压不小就演示不出台账的渐进加载(走查 B 组靠它)。
- monitoring: globalThis.__COCKPIT_MOCK_MONITORING__ || {},
- }
- }
- /** 注册全部契约化 mock(幂等)。返回本次生效的场景,便于走查/排查。 */
- export function ensureCockpitMocks(overrides = {}) {
- const global = readScenario()
- const scenario = overrides.scenario || global.scenario
- const onlyPath = overrides.onlyPath || global.onlyPath
- const prefix = overrides.prefix || global.prefix
- const mapSnapshot = overrides.mapSnapshot || global.mapSnapshot
- const monitoring = overrides.monitoring || global.monitoring
- const result = registerCockpitMocks({
- scenario,
- onlyPath,
- prefix,
- mapSnapshot,
- monitoring,
- handlers: { registerMockTransport, getMockTransportPaths, resetMockTransportsForTest },
- })
- return result
- }
|