-- Ticket03:推式来源(PUSH_INGEST)的落地表,ADR-0065。 -- 甲方机器上的只读取数程序把厂商原始行推给接收端点,行按收到的键值原样落在这里:不改列名、不增删字段、不做换算(JSON 列会规范化格式,但键值不变)。 -- 解释只做一遍并全部落在后端:身份映射、时间换算、幂等键取值、测量列取值都在接收端点里完成, -- 因此这张表既能本地回放开发与回归(不依赖那台机器在线),也是适配器读回统一观测的唯一来源—— -- 适配器只做投影,不含任何厂商列名。 -- 推送记录按事件落库:唯一键让同一条来源行重复推送被幂等忽略,同身份内容不同只报冲突、不覆盖。 CREATE TABLE t_device_ingest_record ( ingest_id BIGINT NOT NULL AUTO_INCREMENT, adapter_code VARCHAR(64) NOT NULL, -- 载荷类别:TOPOLOGY 拓扑上报(通道清单)、SAMPLE 逐点数据行、HEARTBEAT 存活心跳。 payload_kind VARCHAR(16) NOT NULL, devtype INT NOT NULL DEFAULT 0, devid INT NOT NULL DEFAULT 0, subdevid INT NOT NULL DEFAULT 0, chlid INT NOT NULL DEFAULT 0, -- 厂商协议序号(22 所为 Data_Point):水位与"同一绝对秒内多行"都靠它区分。 record_sequence BIGINT NOT NULL DEFAULT 0, -- 来源行身份(22 所为 库/表 + Data_Point);同身份只允许一行,重复推送因此天然幂等。 record_key VARCHAR(191) NOT NULL, -- 厂商来源定位(库/表),供回放与现场排查,不参与判定。 source_ref VARCHAR(191) NULL, device_time_utc DATETIME(3) NULL, device_time_raw VARCHAR(64) NULL, timezone_id VARCHAR(64) NULL, cycle_no INT NULL, step_no INT NULL, relative_time_seconds DECIMAL(20,3) NULL, -- 测量列按厂商给的物理单位原样落库(22 所不做缩放);缺列保持为空,不写零代替缺失。 voltage_v DECIMAL(30,12) NULL, current_a DECIMAL(30,12) NULL, charge_capacity_ah DECIMAL(30,12) NULL, discharge_capacity_ah DECIMAL(30,12) NULL, charge_energy_wh DECIMAL(30,12) NULL, discharge_energy_wh DECIMAL(30,12) NULL, -- 厂商原始行,按收到的键值原样保留:回放与核对解释逻辑都靠它。 payload_json JSON NOT NULL, content_sha256 BINARY(32) NOT NULL, received_at_utc DATETIME(3) NOT NULL, PRIMARY KEY (ingest_id), UNIQUE KEY uk_ingest_record (adapter_code, payload_kind, record_key), -- 逐行接收按 (设备时间, 协议序号) 取严格晚于水位的数据行,索引列次序与它一致。 KEY idx_ingest_channel (adapter_code, payload_kind, devtype, devid, subdevid, chlid, device_time_utc, record_sequence) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='推式来源落地表';