feat: 添加回路名称字段并实现元数据缓存查询

在 RCU 事件处理中新增回路名称(loop_name)字段,用于标识具体设备回路。
- 在 rcu_action_events 表中添加 loop_name 字段
- 新增项目元数据缓存模块,每日从 temporary_project 表刷新房间与回路信息
- 处理消息时,根据 device_id、dev_addr 等字段查询缓存获取回路名称
- 若缓存未命中,则根据设备类型规则生成兜底名称
- 更新环境变量、文档及测试用例以适配新功能
This commit is contained in:
2026-02-02 19:43:49 +08:00
parent 0e6c5c3cc3
commit 4e0f5213db
12 changed files with 660 additions and 117 deletions

View File

@@ -75,4 +75,20 @@ ACK (待补充)
5. 队列结构
队列分区数6
Topicblwlog4Nodejs-rcu-action-topic
Topicblwlog4Nodejs-rcu-action-topic
6. 入库前特殊操作
- 定期从temporary_project表中读取数据并保存到`内存`以全局变量的形式每天凌晨1点从数据库更新一次。
- 每条数据写库之前需要根据项目ID从内存中读取项目信息。
- 我需要在现有数据表`rcu_action_events`里,添加一个字段:`loop_name`,用于存储回路名称。
- 查询`loop_name`的方法是:
- 根据要插入的数据中的`device_id``rooms`表中找出对应的房间 -> 得到 `room_type_id`
- 根据 `room_type_id``loop_address``loops` 表中查找对应的 `loop_name`
- `loop_address` 的生成规则:将数据的 `dev_type``dev_addr``dev_loop` 分别转换为 3 位字符串(不足前方补 0然后拼接。
- 例如:`dev_type=1, dev_addr=23, dev_loop=12` -> `001` + `023` + `012` -> `001023012`
- **兜底逻辑**:如果根据上述规则在 `loops` 缓存中未找到对应的 `loop_name`,则使用 `dev_type` 对应的设备名称(配置在 `ACTION_TYPE_DEV_TYPE_RULES` 中)默认名称。
- 格式:`[dev_type名称+'-'+dev_addr+'-'+dev_loop]`
- 例如:`dev_type=35` (名称: TimeCtrl), `addr=14`, `loop=21` -> `[35TimeCtrl-14-21]`
- 最后将找到的或生成的 `loop_name` 写入 `rcu_action_events` 表。
- 注意,所有查库操作都要通过内存缓存来实现。

231
docs/temporary_project.sql Normal file
View File

@@ -0,0 +1,231 @@
/*
Navicat Premium Dump SQL
Source Server : FnOS 109
Source Server Type : PostgreSQL
Source Server Version : 150004 (150004)
Source Host : 10.8.8.109:5433
Source Catalog : log_platform
Source Schema : temporary_project
Target Server Type : PostgreSQL
Target Server Version : 150004 (150004)
File Encoding : 65001
Date: 02/02/2026 14:28:41
*/
-- ----------------------------
-- Table structure for hotels
-- ----------------------------
DROP TABLE IF EXISTS "temporary_project"."hotels";
CREATE TABLE "temporary_project"."hotels" (
"guid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"hotel_id" int4 NOT NULL,
"hotel_name" varchar(255) COLLATE "pg_catalog"."default",
"id" int4
)
;
-- ----------------------------
-- Table structure for loops_default
-- ----------------------------
DROP TABLE IF EXISTS "temporary_project"."loops_default";
CREATE TABLE "temporary_project"."loops_default" (
"guid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"id" int4 NOT NULL,
"loop_name" varchar(255) COLLATE "pg_catalog"."default",
"room_type_id" int4 NOT NULL,
"loop_address" varchar(255) COLLATE "pg_catalog"."default",
"loop_type" varchar(50) COLLATE "pg_catalog"."default"
)
;
-- ----------------------------
-- Table structure for room_type
-- ----------------------------
DROP TABLE IF EXISTS "temporary_project"."room_type";
CREATE TABLE "temporary_project"."room_type" (
"guid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"id" int4 NOT NULL,
"room_type_name" varchar(255) COLLATE "pg_catalog"."default",
"hotel_id" int4
)
;
-- ----------------------------
-- Table structure for rooms_default
-- ----------------------------
DROP TABLE IF EXISTS "temporary_project"."rooms_default";
CREATE TABLE "temporary_project"."rooms_default" (
"guid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"hotel_id" int4 NOT NULL,
"room_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"room_type_id" int4,
"device_id" varchar(50) COLLATE "pg_catalog"."default",
"mac" varchar(50) COLLATE "pg_catalog"."default",
"id" int4
)
;
-- ----------------------------
-- Table structure for loops
-- ----------------------------
DROP TABLE IF EXISTS "temporary_project"."loops";
CREATE TABLE "temporary_project"."loops" (
"guid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"id" int4 NOT NULL,
"loop_name" varchar(255) COLLATE "pg_catalog"."default",
"room_type_id" int4 NOT NULL,
"loop_address" varchar(255) COLLATE "pg_catalog"."default",
"loop_type" varchar(50) COLLATE "pg_catalog"."default"
)
PARTITION BY (
)
;
-- ----------------------------
-- Table structure for rooms
-- ----------------------------
DROP TABLE IF EXISTS "temporary_project"."rooms";
CREATE TABLE "temporary_project"."rooms" (
"guid" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,
"hotel_id" int4 NOT NULL,
"room_id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"room_type_id" int4,
"device_id" varchar(50) COLLATE "pg_catalog"."default",
"mac" varchar(50) COLLATE "pg_catalog"."default",
"id" int4
)
PARTITION BY LIST (
"hotel_id" "pg_catalog"."int4_ops"
)
;
ALTER TABLE "temporary_project"."rooms" ATTACH PARTITION "temporary_project"."rooms_default" DEFAULT;
-- ----------------------------
-- Indexes structure for table hotels
-- ----------------------------
CREATE INDEX "idx_hotels_hotel_id" ON "temporary_project"."hotels" USING btree (
"hotel_id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_hotels_hotel_name" ON "temporary_project"."hotels" USING btree (
"hotel_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_hotels_id" ON "temporary_project"."hotels" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table hotels
-- ----------------------------
ALTER TABLE "temporary_project"."hotels" ADD CONSTRAINT "hotels_pkey" PRIMARY KEY ("hotel_id", "guid");
-- ----------------------------
-- Indexes structure for table loops_default
-- ----------------------------
CREATE INDEX "loops_default_id_idx" ON "temporary_project"."loops_default" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "loops_default_loop_address_idx" ON "temporary_project"."loops_default" USING btree (
"loop_address" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "loops_default_loop_name_idx" ON "temporary_project"."loops_default" USING btree (
"loop_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "loops_default_loop_type_idx" ON "temporary_project"."loops_default" USING btree (
"loop_type" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "loops_default_room_type_id_idx" ON "temporary_project"."loops_default" USING btree (
"room_type_id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table loops_default
-- ----------------------------
ALTER TABLE "temporary_project"."loops_default" ADD CONSTRAINT "loops_default_pkey" PRIMARY KEY ("guid", "id", "room_type_id");
-- ----------------------------
-- Indexes structure for table room_type
-- ----------------------------
CREATE INDEX "idx_room_type_hotel_id" ON "temporary_project"."room_type" USING btree (
"hotel_id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_room_type_id" ON "temporary_project"."room_type" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_room_type_name" ON "temporary_project"."room_type" USING btree (
"room_type_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table room_type
-- ----------------------------
ALTER TABLE "temporary_project"."room_type" ADD CONSTRAINT "room_type_pkey" PRIMARY KEY ("guid", "id");
-- ----------------------------
-- Indexes structure for table rooms_default
-- ----------------------------
CREATE INDEX "rooms_default_device_id_idx" ON "temporary_project"."rooms_default" USING btree (
"device_id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "rooms_default_hotel_id_idx" ON "temporary_project"."rooms_default" USING btree (
"hotel_id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "rooms_default_id_idx" ON "temporary_project"."rooms_default" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "rooms_default_mac_idx" ON "temporary_project"."rooms_default" USING btree (
"mac" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table rooms_default
-- ----------------------------
ALTER TABLE "temporary_project"."rooms_default" ADD CONSTRAINT "rooms_default_pkey" PRIMARY KEY ("guid", "hotel_id", "room_id");
-- ----------------------------
-- Indexes structure for table loops
-- ----------------------------
CREATE INDEX "idx_loops_address" ON "temporary_project"."loops" USING btree (
"loop_address" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_loops_id" ON "temporary_project"."loops" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_loops_name" ON "temporary_project"."loops" USING btree (
"loop_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_loops_room_type_id" ON "temporary_project"."loops" USING btree (
"room_type_id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_loops_type" ON "temporary_project"."loops" USING btree (
"loop_type" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table loops
-- ----------------------------
ALTER TABLE "temporary_project"."loops" ADD CONSTRAINT "loops_pkey" PRIMARY KEY ("guid", "id", "room_type_id");
-- ----------------------------
-- Indexes structure for table rooms
-- ----------------------------
CREATE INDEX "idx_rooms_device_id" ON "temporary_project"."rooms" USING btree (
"device_id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_rooms_hotel_id" ON "temporary_project"."rooms" USING btree (
"hotel_id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_rooms_id" ON "temporary_project"."rooms" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
CREATE INDEX "idx_rooms_mac" ON "temporary_project"."rooms" USING btree (
"mac" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table rooms
-- ----------------------------
ALTER TABLE "temporary_project"."rooms" ADD CONSTRAINT "rooms_pkey" PRIMARY KEY ("guid", "hotel_id", "room_id");