package com.battery.device.api; import java.math.BigDecimal; import java.time.Instant; import java.util.List; import com.battery.device.api.model.ChannelIdentity; import com.battery.device.api.model.Measurement; /** 供业务持久化使用的厂商无关测试数据观测扩展。 */ public interface TestDataObservationAdapter extends DeviceObservationAdapter { /** 返回指定检测柜通道最近一次实时观测;没有成功观测时返回空值。 */ CabinetRealtime latestCabinet(ChannelIdentity channel); /** 返回采集器独立实时快照;不得通过历史下载补采。 */ CollectorRealtime latestCollector(String collectorCode); /** 返回设备直接提供的工步统计,不从实时采样推导。 */ List stepRecords(ChannelIdentity channel); /** 返回设备直接提供的循环统计,不补齐设备未返回的记录。 */ List cycleRecords(ChannelIdentity channel); /** 返回适配器定义的实时持久化槽位间隔。 */ long persistenceIntervalMillis(ChannelIdentity channel); /** 返回设备计划方案;设备未提供时保持为空,不推导计划。 */ default TestPlan testPlan(ChannelIdentity channel) { return null; } record TestPlan(int currentCycleNo, int currentStepNo, int plannedCycleCount, List rows) { } record PlanRow(String rowType, int stepNo, Integer cyclePosition, String stepName, double durationSeconds, Double voltageV, String executionStatus, Integer cycleCount, Long recordCount) { } /** 柜端成功观测;相对时长使用设备提供的秒数,缺失不按采样时间推算。 */ record CabinetRealtime(long sequenceId, Instant deviceTime, double currentA, double voltageV, double capacityAh, double energyWh, int cycleNo, int stepNo, String stepName, String stepType, Instant serverReceivedAt, String deviceTimeRaw, String timezoneId, Long relativeTimeSeconds) { } record CollectorRealtime(String collectorCode, boolean online, int sampleIntervalMs, List measurements, String timezoneId) { public CollectorRealtime { measurements = measurements == null ? List.of() : List.copyOf(measurements); } } record CollectorMeasurement(String channelCode, long sequenceId, Instant deviceTime, String deviceTimeRaw, Instant serverReceivedAt, String metricCode, BigDecimal value, String unit) { } record StepRecord(String sourceRecordId, int cycleNo, int stepNo, String stepName, String stepType, Instant startedAt, Instant endedAt, double endVoltageV, double capacityAh, double energyWh, String deviceTimeRaw, String timezoneId, Instant serverReceivedAt, java.util.Map measurements) { } record CycleRecord(String sourceRecordId, int cycleNo, Instant startedAt, Instant endedAt, double chargeCapacityAh, double dischargeCapacityAh, double chargeEnergyWh, double dischargeEnergyWh, double efficiency, String deviceTimeRaw, String timezoneId, Instant serverReceivedAt) { } }