77 lines
4.5 KiB
PL/PgSQL
77 lines
4.5 KiB
PL/PgSQL
-- 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;
|