-- ICC 模拟量数据同步:重建 electricity_data 表结构(按 ICC AnalogInfoVO) -- 1) 旧表无数据(0 行),直接 DROP 重建;2) 删除 equip_id/electricity、icc_device_code 更名 imei; -- 3) 新增 analog_type/analog_value;4) line_id 外键 → electric_line;5) 唯一键 (line_code,analog_type,collect_time); -- 6) 按月分区 2026_10~2027_03;7) 索引/注释;8) sys_job 种子 icc_analog_sync(默认每 1 分钟) BEGIN; -- ------------------------------------------------------------ -- 1) 重建 electricity_data -- ------------------------------------------------------------ DROP TABLE IF EXISTS electricity_data CASCADE; CREATE TABLE electricity_data ( id BIGSERIAL, line_id BIGINT NOT NULL REFERENCES electric_line(id), line_code VARCHAR(64) NOT NULL, imei VARCHAR(64), line_name VARCHAR(128), customer_id BIGINT NOT NULL, analog_type VARCHAR(64), analog_name VARCHAR(128), analog_unit VARCHAR(32), analog_value NUMERIC(14,4), collect_time TIMESTAMPTZ NOT NULL, PRIMARY KEY (id, collect_time), CONSTRAINT uk_ed_line_type_time UNIQUE (line_code, analog_type, collect_time) ) PARTITION BY RANGE (collect_time); COMMENT ON TABLE electricity_data IS '线路用电信息表(ICC 模拟量同步,按月分区时序数据)'; COMMENT ON COLUMN electricity_data.id IS '自增(复合主键含 collect_time)'; COMMENT ON COLUMN electricity_data.line_id IS '线路 ID(→ electric_line)'; COMMENT ON COLUMN electricity_data.line_code IS '线路编码(ICC deviceCode,冗余 + 幂等键)'; COMMENT ON COLUMN electricity_data.imei IS '设备唯一标识码(ICC uniqueCode)'; COMMENT ON COLUMN electricity_data.line_name IS '线路名称(冗余,加速展示)'; COMMENT ON COLUMN electricity_data.customer_id IS '客户 ID(逻辑隔离键)'; COMMENT ON COLUMN electricity_data.analog_type IS '模拟量类型(ICC analogType)'; COMMENT ON COLUMN electricity_data.analog_name IS '模拟量名称(ICC analogName,如:剩余电流)'; COMMENT ON COLUMN electricity_data.analog_unit IS '模拟量单位(ICC analogUnit,如:mA)'; COMMENT ON COLUMN electricity_data.analog_value IS '模拟量值(ICC analogValue)'; COMMENT ON COLUMN electricity_data.collect_time IS '采集时间(同步时间,分区键)'; -- ------------------------------------------------------------ -- 2) 初始分区(2026 年 10 月 ~ 2027 年 3 月) -- ------------------------------------------------------------ CREATE TABLE electricity_data_2026_10 PARTITION OF electricity_data FOR VALUES FROM ('2026-10-01') TO ('2026-11-01'); CREATE TABLE electricity_data_2026_11 PARTITION OF electricity_data FOR VALUES FROM ('2026-11-01') TO ('2026-12-01'); CREATE TABLE electricity_data_2026_12 PARTITION OF electricity_data FOR VALUES FROM ('2026-12-01') TO ('2027-01-01'); CREATE TABLE electricity_data_2027_01 PARTITION OF electricity_data FOR VALUES FROM ('2027-01-01') TO ('2027-02-01'); CREATE TABLE electricity_data_2027_02 PARTITION OF electricity_data FOR VALUES FROM ('2027-02-01') TO ('2027-03-01'); CREATE TABLE electricity_data_2027_03 PARTITION OF electricity_data FOR VALUES FROM ('2027-03-01') TO ('2027-04-01'); -- ------------------------------------------------------------ -- 3) 分区索引(在父表创建,自动继承到各分区) -- ------------------------------------------------------------ CREATE INDEX idx_ed_customer ON electricity_data (customer_id); CREATE INDEX idx_ed_line ON electricity_data (line_id); CREATE INDEX idx_ed_time ON electricity_data (collect_time); CREATE INDEX idx_ed_customer_time ON electricity_data (customer_id, collect_time); -- ------------------------------------------------------------ -- 4) sys_job 种子:icc_analog_sync(默认每 5 分钟,按 job_key 幂等更新 cron) -- ------------------------------------------------------------ INSERT INTO sys_job (job_key, job_name, cron_expression, params, retry_times, retry_interval, status, remark) VALUES ('icc_analog_sync', '模拟量数据同步', '*/5 * * * *', '{}'::jsonb, 1, 300, 1, '从 ICC 平台拉取探测器最新模拟量,以同步时间作采集时间写入 electricity_data(默认每 5 分钟)') ON CONFLICT (job_key) DO UPDATE SET cron_expression = EXCLUDED.cron_expression, job_name = EXCLUDED.job_name, remark = EXCLUDED.remark; COMMIT;