Files
smart_grid_iot/database/migrations/20261011_icc_line_ledger.sql
wk 41765cdf44 feat: 新增智电改造线路台账功能(ICC拉取同步)
- 数据库:新增迁移脚本20261011_icc_line_ledger.sql(electric_line/line_room/icc_sync_log三表、菜单61、role_menu(1,61)、定时任务icc_line_sync),同步db_seed.sql
- 后端:新增ElectricLine/IccSyncLog实体、查询DTO、线路台账服务与ICC拉取同步服务、/api/electric-lines控制器,接入RBAC(device:list)与定时任务
- 前端:新增智电改造线路台账页面及路由,API封装electricLineApi
- ICC同步采用本系统主动拉取模式,失败仅记日志不抛错,接口统一code/message/data格式兼容APP
2026-10-12 15:57:02 +08:00

116 lines
6.2 KiB
PL/PgSQL
Raw Permalink 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.
-- 智电改造线路台账(设备监控):
-- 1) 幂等建表 electric_line / line_room / icc_sync_log(若 db_init.sql 已建则跳过)
-- 2) 设备监控(id=4)下新增菜单 61「智电改造线路台账」
-- 3) ADMIN 角色绑定新菜单
-- 4) 注册 icc_line_sync 定时任务(默认每 10 分钟)
BEGIN;
-- ------------------------------------------------------------
-- 1) 幂等建表(与 db_init.sql 定义保持一致)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS electric_line (
id BIGSERIAL PRIMARY KEY,
line_code VARCHAR(64) NOT NULL UNIQUE,
equip_id BIGINT NOT NULL REFERENCES customer_equipment(id),
icc_device_code VARCHAR(128),
line_name VARCHAR(128),
customer_id BIGINT NOT NULL REFERENCES customer(id),
building_id BIGINT REFERENCES customer_building(id),
floor_no VARCHAR(16),
location VARCHAR(256),
status SMALLINT NOT NULL DEFAULT 1,
synced_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE electric_line IS '智电改造线路信息表(ICC 同步)';
COMMENT ON COLUMN electric_line.id IS '自增主键';
COMMENT ON COLUMN electric_line.line_code IS '线路编码(唯一)';
COMMENT ON COLUMN electric_line.equip_id IS '客户设备 ID(→ customer_equipment)';
COMMENT ON COLUMN electric_line.icc_device_code IS 'ICC 智电设备编号';
COMMENT ON COLUMN electric_line.line_name IS '线路名称(ICC 同步)';
COMMENT ON COLUMN electric_line.customer_id IS '客户 ID(逻辑隔离键)';
COMMENT ON COLUMN electric_line.building_id IS '所属建筑 ID(→ customer_building)';
COMMENT ON COLUMN electric_line.floor_no IS '所在楼层';
COMMENT ON COLUMN electric_line.location IS '所在位置';
COMMENT ON COLUMN electric_line.status IS '状态:1在线 0离线';
COMMENT ON COLUMN electric_line.synced_at IS 'ICC 同步时间';
COMMENT ON COLUMN electric_line.created_at IS '创建时间';
CREATE INDEX IF NOT EXISTS idx_line_customer ON electric_line (customer_id);
CREATE INDEX IF NOT EXISTS idx_line_equip ON electric_line (equip_id);
CREATE INDEX IF NOT EXISTS idx_line_icc ON electric_line (icc_device_code);
CREATE TABLE IF NOT EXISTS line_room (
id BIGSERIAL PRIMARY KEY,
line_id BIGINT NOT NULL REFERENCES electric_line(id) ON DELETE CASCADE,
room_id BIGINT NOT NULL REFERENCES customer_room(id),
customer_id BIGINT NOT NULL REFERENCES customer(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE line_room IS '线路所属房间关联表';
COMMENT ON COLUMN line_room.id IS '自增主键';
COMMENT ON COLUMN line_room.line_id IS '线路 ID(→ electric_line)';
COMMENT ON COLUMN line_room.room_id IS '房间 ID(→ customer_room)';
COMMENT ON COLUMN line_room.customer_id IS '客户 ID(→ customer)';
COMMENT ON COLUMN line_room.created_at IS '创建时间';
CREATE INDEX IF NOT EXISTS idx_lr_line ON line_room (line_id);
CREATE INDEX IF NOT EXISTS idx_lr_room ON line_room (room_id);
CREATE INDEX IF NOT EXISTS idx_lr_customer ON line_room (customer_id);
CREATE TABLE IF NOT EXISTS icc_sync_log (
id BIGSERIAL PRIMARY KEY,
sync_type VARCHAR(32) NOT NULL,
start_time TIMESTAMPTZ,
end_time TIMESTAMPTZ,
record_count INT,
status SMALLINT NOT NULL DEFAULT 1,
error_message TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE icc_sync_log IS 'ICC 数据同步日志表';
COMMENT ON COLUMN icc_sync_log.id IS '自增主键';
COMMENT ON COLUMN icc_sync_log.sync_type IS '同步类型:客户/设备/用电/报警';
COMMENT ON COLUMN icc_sync_log.start_time IS '开始时间';
COMMENT ON COLUMN icc_sync_log.end_time IS '结束时间';
COMMENT ON COLUMN icc_sync_log.record_count IS '同步记录数';
COMMENT ON COLUMN icc_sync_log.status IS '状态:1成功 0失败';
COMMENT ON COLUMN icc_sync_log.error_message IS '错误信息';
COMMENT ON COLUMN icc_sync_log.created_at IS '创建时间';
CREATE INDEX IF NOT EXISTS idx_icc_sync_type ON icc_sync_log (sync_type);
CREATE INDEX IF NOT EXISTS idx_icc_sync_time ON icc_sync_log (created_at);
-- ------------------------------------------------------------
-- 2) 设备监控(id=4)下新增菜单 61「智电改造线路台账」(sort 2,排在设备管理台账之后)
-- ------------------------------------------------------------
INSERT INTO sys_menu (id, parent_id, menu_name, menu_path, component, icon, sort_order, menu_type, permission, visible) VALUES
(61, 4, '智电改造线路台账', '/device/line', 'device/line/index', 'ApartmentOutlined', 2, 2, 'device:list', 1)
ON CONFLICT (id) DO UPDATE SET
parent_id = EXCLUDED.parent_id,
menu_name = EXCLUDED.menu_name,
menu_path = EXCLUDED.menu_path,
component = EXCLUDED.component,
icon = EXCLUDED.icon,
sort_order = EXCLUDED.sort_order,
menu_type = EXCLUDED.menu_type,
permission = EXCLUDED.permission,
visible = EXCLUDED.visible;
-- ------------------------------------------------------------
-- 3) 角色-菜单绑定:ADMIN(role_id=1) 拥有 61
-- ------------------------------------------------------------
INSERT INTO sys_role_menu (role_id, menu_id) VALUES
(1, 61)
ON CONFLICT (role_id, menu_id) DO NOTHING;
-- ------------------------------------------------------------
-- 4) 定时任务种子:icc_line_sync(默认每 10 分钟,可按 job_key 幂等)
-- ------------------------------------------------------------
INSERT INTO sys_job (job_key, job_name, cron_expression, params, retry_times, retry_interval, status, remark) VALUES
('icc_line_sync', '智电线路同步', '*/10 * * * *', '{}'::jsonb, 1, 300, 1,
'从 ICC 平台拉取智电改造线路并按 line_code 幂等 upsert(默认每 10 分钟)')
ON CONFLICT (job_key) DO NOTHING;
-- 重置序列(覆盖到 61)
SELECT setval('sys_menu_id_seq', GREATEST((SELECT MAX(id) FROM sys_menu), 61), true);
COMMIT;