Files
smart_grid_iot/database/migrations/20261024_icc_analog_data.sql
T

77 lines
4.5 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 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;