feat(analog): 新增ICC模拟量数据同步 - 重建electricity_data表(迁移20261024_icc_analog_data.sql:删除equip_id与electricity占位列、icc_device_code更名imei、新增analog_type/analog_name/analog_unit/analog_value、collect_time以同步时间填充、按月分区2026_10~2027_03、唯一键(line_code,analog_type,collect_time));同步服务IccAnalogSyncService复用OAuth2鉴权,按已同步线路line_code分批(≤50)拉取最新模拟量(POST /analog/subsystem/page,pageSize=500短页停止)幂等upsert并写icc_sync_log(sync_type=electricity_data);新增POST /api/electricity-data/sync手动同步(RBAC device:list);注册icc_analog_sync每5分钟定时任务与sys_job种子;同步db_init/db_seed与设计文档;无前端改动
This commit is contained in:
1 parent
160ad85051
commit
c92fc7f298
15 files changed
+701
-27
No files matched your search
+33
-26
@@ -1278,43 +1278,50 @@ CREATE INDEX idx_wid_worker ON worker_income_detail (worker_id);
|
||||
-- 十一、用电采集数据(1 张表,按月 RANGE 分区)
|
||||
-- ============================================================
|
||||
|
||||
-- 37. 线路用电信息表(按月分区,时序数据)
|
||||
-- 37. 线路用电信息表(按月分区,时序数据,ICC 模拟量同步)
|
||||
DROP TABLE IF EXISTS electricity_data CASCADE;
|
||||
CREATE TABLE electricity_data (
|
||||
id BIGSERIAL,
|
||||
line_id BIGINT NOT NULL,
|
||||
line_code VARCHAR(64) NOT NULL,
|
||||
equip_id BIGINT,
|
||||
icc_device_code VARCHAR(128),
|
||||
line_name VARCHAR(128),
|
||||
customer_id BIGINT NOT NULL,
|
||||
electricity NUMERIC(14,4),
|
||||
collect_time TIMESTAMPTZ NOT NULL,
|
||||
PRIMARY KEY (id, collect_time)
|
||||
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 '线路用电信息表(按月分区,时序数据)';
|
||||
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 '线路编码(冗余,加速查询)';
|
||||
COMMENT ON COLUMN electricity_data.equip_id IS '客户设备 ID';
|
||||
COMMENT ON COLUMN electricity_data.icc_device_code IS 'ICC 设备编号';
|
||||
COMMENT ON COLUMN electricity_data.line_name IS '线路名称';
|
||||
COMMENT ON COLUMN electricity_data.customer_id IS '客户 ID(逻辑隔离键)';
|
||||
COMMENT ON COLUMN electricity_data.electricity IS '用电量';
|
||||
COMMENT ON COLUMN electricity_data.collect_time IS '采集时间(分区键)';
|
||||
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 '采集时间(同步时间,分区键)';
|
||||
|
||||
-- 初始分区(2026 年 8~12 月)
|
||||
CREATE TABLE electricity_data_2026_08 PARTITION OF electricity_data
|
||||
FOR VALUES FROM ('2026-08-01') TO ('2026-09-01');
|
||||
CREATE TABLE electricity_data_2026_09 PARTITION OF electricity_data
|
||||
FOR VALUES FROM ('2026-09-01') TO ('2026-10-01');
|
||||
-- 初始分区(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');
|
||||
|
||||
-- 分区索引(在父表创建,自动继承到各分区)
|
||||
CREATE INDEX idx_ed_customer ON electricity_data (customer_id);
|
||||
|
||||
@@ -529,6 +529,15 @@ INSERT INTO sys_job (job_key, job_name, cron_expression, params, retry_times, re
|
||||
'从 ICC 平台拉取消防物联设备并按 icc_imei 幂等 upsert(默认每 10 分钟)')
|
||||
ON CONFLICT (job_key) DO NOTHING;
|
||||
|
||||
-- 模拟量数据同步任务种子(sys_job,按 job_key 幂等;默认每 5 分钟)
|
||||
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;
|
||||
|
||||
-- ============================================================
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
-- 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;
|
||||
Reference in new issue
Block a user