| | |
| | | import type { ReceptionStatus, TestRecord, TestStatus } from '@/stores/tests' |
| | | import { getAuthToken, request, type ApiResponse } from './request' |
| | | import { formatBusinessTime } from '@/utils/businessTime' |
| | | |
| | | export type TestStatusCode = 'WAITING' | 'RUNNING' | 'PAUSED' | 'COMPLETED' |
| | | export type ReceptionStatusCode = 'NOT_STARTED' | 'RECEIVING' | 'PAUSED' | 'ENDED' |
| | |
| | | export interface TestConfigurationDetail extends TestConfigurationPayload { |
| | | testId: number |
| | | creatorId: number |
| | | createTime?: string | null |
| | | updateTime?: string | null |
| | | createTime?: number | null |
| | | updateTime?: number | null |
| | | creatorName: string | null |
| | | principalName: string | null |
| | | testTypeName: string | null |
| | | testStatus: TestStatusCode |
| | | receptionStatus: ReceptionStatusCode |
| | | startedAtUtc?: string | null |
| | | endedAtUtc?: string | null |
| | | startedAtUtc?: number | null |
| | | endedAtUtc?: number | null |
| | | /** 历史兼容字段;新接口不返回测试字段快照,字段从 batteries[].fields 读取。 */ |
| | | fieldSnapshots?: Array<{ |
| | | snapshotId: number |
| | |
| | | testStatus: TestStatusCode | null |
| | | receptionStatus: ReceptionStatusCode | null |
| | | batteryNo: string | null |
| | | createTime: string | null |
| | | startedAtUtc: string | null |
| | | endedAtUtc: string | null |
| | | createTime: number | null |
| | | startedAtUtc: number | null |
| | | endedAtUtc: number | null |
| | | runtimeAttach?: boolean | null |
| | | remark: string | null |
| | | batteryCount: number | null |
| | |
| | | const receptionStatus = item.receptionStatus ? receptionStatusMap[item.receptionStatus] : '未知' |
| | | return { |
| | | id: item.testId, name: item.testName || '-', type: item.testTypeName || '-', batteryNo: item.batteryNo || '-', batteryGroup: '-', |
| | | batteryCount: Number(item.batteryCount) || 0, createdAt: item.createTime || '-', startedAt: item.startedAtUtc || '-', |
| | | endedAt: item.endedAtUtc || '-', purpose: item.testPurpose || '-', owner: item.principalName || '-', |
| | | batteryCount: Number(item.batteryCount) || 0, createdAt: formatBusinessTime(item.createTime), startedAt: formatBusinessTime(item.startedAtUtc), |
| | | endedAt: formatBusinessTime(item.endedAtUtc), purpose: item.testPurpose || '-', owner: item.principalName || '-', |
| | | remark: item.remark || '-', status, receptionStatus, editable: item.receptionStatus === 'NOT_STARTED', |
| | | } |
| | | } |
| | |
| | | latestSnapshot: { |
| | | source?: string |
| | | unit?: string |
| | | observedAt?: string |
| | | observedAt?: number |
| | | sampleIntervalMs?: number |
| | | measurements?: Array<Record<string, unknown>> |
| | | units?: string[] |
| | |
| | | testId: number |
| | | testStatus: TestStatusCode |
| | | receptionStatus: ReceptionStatusCode |
| | | updatedAt: string |
| | | updatedAt: number |
| | | sources: LiveSource[] |
| | | exceptions: Array<Record<string, unknown>> |
| | | testPlan?: BtsTestSnapshot | null |
| | |
| | | stepType?: string |
| | | sequenceId: number |
| | | cabinetSequenceId?: number | null |
| | | recordedAt: string |
| | | absoluteTime: string |
| | | deviceTime?: string |
| | | serverReceivedAt?: string |
| | | recordedAt?: number | null |
| | | absoluteTime?: number | null |
| | | deviceTime?: number | null |
| | | collectorDeviceTime?: number | null |
| | | captureSlot?: number | null |
| | | serverReceivedAt?: number | null |
| | | voltage: number | string | null |
| | | current: number | string | null |
| | | capacity: number | string | null |
| | |
| | | positivePotential?: number | string | null |
| | | negativePotential?: number | string | null |
| | | extensionMeasurementsJson?: string | Record<string, unknown> | null |
| | | sourceIdentity?: string |
| | | sourceRecordId?: string |
| | | deviceId: number |
| | | channelId: number |
| | | adapterId?: number |
| | |
| | | headers: token ? { Authorization: `Bearer ${token}`, Accept: 'text/event-stream' } : { Accept: 'text/event-stream' }, |
| | | signal: controller.signal, |
| | | }) |
| | | if (!response.ok || !response.body) throw new Error(response.status === 401 ? '实时流权限不足' : `实时流连接失败(${response.status})`) |
| | | if (!response.ok || !response.body) throw new Error([401, 403].includes(response.status) ? '实时流权限不足' : `实时流连接失败(${response.status})`) |
| | | if (!response.headers.get('content-type')?.includes('text/event-stream')) throw new Error('实时流响应格式错误') |
| | | const reader = response.body.getReader() |
| | | const decoder = new TextDecoder() |
| | | let buffer = '' |