feat: 增强Kafka消费者配置并完善action_type分类逻辑

- 支持多实例Kafka消费者,增加并发处理能力
- 新增Kafka配置参数:最大飞行中消息数、获取字节数、等待时间等
- 完善action_type分类逻辑,根据dev_type映射为"用户操作"或"设备回路状态"
- 临时支持hex格式udp_raw自动转换为base64存储
- 增加extra字段支持上游扩展数据传递
- 优化数据库初始化脚本查找路径
- 更新PM2配置,修改应用名称和端口
- 清理开发环境日志文件,将dist目录加入.gitignore
- 更新相关文档说明
This commit is contained in:
2026-01-30 20:09:46 +08:00
parent e0c3728b42
commit 0e6c5c3cc3
18 changed files with 459 additions and 57 deletions

44
docs/error.log Normal file
View File

@@ -0,0 +1,44 @@
2026-01-30T16:54:47: Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'node-cron' imported from R:\nodejsROOT\bls\rcu-action\dist\index.js
2026-01-30T16:54:47: at Object.getPackageJSONURL (node:internal/modules/package_json_reader:316:9)
2026-01-30T16:54:47: at packageResolve (node:internal/modules/esm/resolve:768:81)
2026-01-30T16:54:47: at moduleResolve (node:internal/modules/esm/resolve:858:18)
2026-01-30T16:54:47: at defaultResolve (node:internal/modules/esm/resolve:990:11)
2026-01-30T16:54:47: at #cachedDefaultResolve (node:internal/modules/esm/loader:737:20)
2026-01-30T16:54:47: at ModuleLoader.resolve (node:internal/modules/esm/loader:714:38)
2026-01-30T16:54:47: at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:293:38)
2026-01-30T16:54:47: at #link (node:internal/modules/esm/module_job:208:49)
2026-01-30T16:54:47: at process.processTicksAndRejections (node:internal/process/task_queues:103:5) {
2026-01-30T16:54:47: code: 'ERR_MODULE_NOT_FOUND'
2026-01-30T16:54:47: }
2026-01-30T16:56:12: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763372054,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:12: {"level":"error","message":"Service bootstrap failed","timestamp":1769763372055,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:12: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763372929,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:12: {"level":"error","message":"Service bootstrap failed","timestamp":1769763372929,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:13: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763373801,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:13: {"level":"error","message":"Service bootstrap failed","timestamp":1769763373801,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:14: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763374671,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:14: {"level":"error","message":"Service bootstrap failed","timestamp":1769763374671,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:15: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763375539,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:15: {"level":"error","message":"Service bootstrap failed","timestamp":1769763375539,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:16: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763376418,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:16: {"level":"error","message":"Service bootstrap failed","timestamp":1769763376419,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:17: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763377290,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:17: {"level":"error","message":"Service bootstrap failed","timestamp":1769763377291,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:18: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763378161,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:18: {"level":"error","message":"Service bootstrap failed","timestamp":1769763378162,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:19: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763379035,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:19: {"level":"error","message":"Service bootstrap failed","timestamp":1769763379035,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:19: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763379920,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:19: {"level":"error","message":"Service bootstrap failed","timestamp":1769763379921,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:20: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763380801,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:20: {"level":"error","message":"Service bootstrap failed","timestamp":1769763380802,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:21: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763381675,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:21: {"level":"error","message":"Service bootstrap failed","timestamp":1769763381675,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:22: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763382560,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:22: {"level":"error","message":"Service bootstrap failed","timestamp":1769763382561,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:23: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763383432,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:23: {"level":"error","message":"Service bootstrap failed","timestamp":1769763383433,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:24: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763384307,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:24: {"level":"error","message":"Service bootstrap failed","timestamp":1769763384307,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}
2026-01-30T16:56:25: {"level":"error","message":"Error initializing schema and table:","timestamp":1769763385185,"context":{"errno":-4058,"code":"ENOENT","syscall":"open","path":"R:\\nodejsROOT\\bls\\scripts\\init_db.sql"}}
2026-01-30T16:56:25: {"level":"error","message":"Service bootstrap failed","timestamp":1769763385185,"context":{"error":"ENOENT: no such file or directory, open 'R:\\nodejsROOT\\bls\\scripts\\init_db.sql'"}}

View File

@@ -24,7 +24,7 @@ JSON 消息由 **Header 信息** 和 **业务列表数据** 组成。
| **direction** | String | **是** | "上报" 或 "下发" |
| **cmd_word** | String | **是** | 命令字 (如 "0x36", "0x0F") |
| **frame_id** | Number | **是** | 通讯帧号 |
| **udp_raw** | String | **是** | UDP 原始报文 (作为备份/校验) |
| **udp_raw** | String | **是** | UDP 原始报文备份推荐上游直接发送base64字符串当前若上游仍发送十六进制字符串后端会在入库前临时将其转换为base64后续会取消该自动转换机制 |
| **sys_lock_status** | Number | 否 | 系统锁状态 (0:未锁, 1:锁定) |
| **report_count** | Number | 否 | 上报设备数量 (对应 device_list 长度) |
| **fault_count** | Number | 否 | 故障设备数量 (对应 fault_list 长度) |

View File

@@ -30,7 +30,7 @@
| **direction** | VARCHAR(10) | 数据方向 | **必填** (L53) "上报"/"下发" Index |
| **cmd_word** | VARCHAR(10) | 命令字 | **必填** (L54) 如 "0x36", "0x0F" Index |
| **frame_id** | INTEGER | 通讯帧号 | **必填** (L55) 用于串联命令与状态 |
| **udp_raw** | TEXT | UDP消息原文 | **必填** (L56) Hex字符串 |
| **udp_raw** | TEXT | UDP消息原文 | **必填** (L56) base64字符串当前若上游仍发送十六进制字符串则后端会在入库前临时转换为base64后续会取消该自动转换机制 |
| **action_type** | VARCHAR(20) | 记录行为类型 | **必填** (L57) Index |
| **sys_lock_status** | SMALLINT | 系统锁状态 | (L59) 可空 |
| **report_count** | SMALLINT | 本次上报数量 | (L60) 可空 |
@@ -44,16 +44,80 @@
| **type_l** | SMALLINT | 执行方式 | 可空 (0x0F下发) |
| **type_h** | SMALLINT | 执行内容 | 可空 (0x0F下发) |
| **details** | JSONB | 业务详情数据 | 存储不定长设备列表、故障信息等 |
| **extra** | JSONB | 扩展信息 | 存储通讯原文等扩展数据 |
| **extra** | JSONB | 扩展信息 | 存储上游传入的extra扩展字段如未提供则为空对象 |
**主键定义**: `(ts_ms, guid)`
**索引定义**: 备注带index的字段为需要索引的字段用于提高查询效率。
### 3.2 字典定义
**Action Type (记录行为类型)**:
- `"0FACK"`: ACK (应答)
- `"0F下发"`: 下发控制 (0x0F 下发)
- `"36上报"`: 设备回路状态 (0x36 上报)
- 枚举值ACK和下发控制是0x0F的特殊情况用户操作和设备回路状态是0x36的枚举值
- ACKACK是0x0F的上报独有的所以如果0F且Direction为上报就标记为ACK
- 下发控制0x0F的Direction为下发指令记录为下发控制
- 用户操作0x36上报 的开关、温控器等客户操作设备产生的,属于用户操作
- 设备回路状态0x36上报 的灯光、继电器回路等变化等受控设备,属于设备回路状态
- 用户操作和设备回路状态的具体区分表根据本行数据的dev_type来区分注意这张表是根据dev_type来区分的所以dev_type不能改变否则会导致数据错误另外这个表要写入env配置文件以数组形式保存随时可以更改
|dev_type|名称|描述|Action Type|
|---|---|---|---|
|0|Dev_Host_Invalid|无效设备(也可以被认为是场景)|无效|
|1|Dev_Host_HVout|强电继电器(输出状态)|设备回路状态|
|2|Dev_Host_LVinput|弱电输入(输入状态)|用户操作|
|3|Dev_Host_LVoutput|弱电输出(输出状态)|设备回路状态|
|4|Dev_Host_Service|服务信息|设备回路状态|
|5|Dev_NodeCurtain|干节点窗帘|设备回路状态|
|6|DEV_RS485_SWT|开关|用户操作|
|7|DEV_RS485_TEMP|空调|用户操作|
|8|DEV_RS485_INFRARED|红外感应|用户操作|
|9|DEV_RS485_AirDetect|空气质量检测设备|设备回路状态|
|10|DEV_RS485_CARD|插卡取电|用户操作|
|11|DEV_RS485_HEATER|地暖|用户操作|
|12|Dev_RCU_NET|RCU 设备网络 - 没使用||
|13|DEV_RS485_CURTAIN|窗帘|设备回路状态|
|14|DEV_RS485_RELAY|继电器|设备回路状态|
|15|DEV_RS485_IR_SEND|红外发送|设备回路状态|
|16|DEV_RS485_DIMMING|调光驱动|设备回路状态|
|17|DEV_RS485_TRAIC|可控硅调光(可控硅状态)|设备回路状态|
|18|DEV_RS485_STRIP|灯带(灯带状态) --2025-11-24 取消|无效|
|19|DEV_RS485_CoreCtrl|中控|无效|
|20|DEV_RS485_WxLock|微信锁 (福 瑞狗的蓝牙锁 默认 0 地址)|无效|
|21|DEV_RS485_MUSIC|背景音乐(背景音乐状态)|设备回路状态|
|22|DEV_NET_ROOMSTATE|房态下发|无效|
|23|Dev_Host_PWMLight|主机本地 调光|无效|
|24|DEV_RS485_PWM|485PWM 调光( PWM 调光状态)|无效|
|25|DEV_PB_LED|总线调光( PBLED 调光状态) - 没使用 -|无效|
|26|DEV_RCU_POWER|RCU 电源|无效|
|27|DEV_RS485_A9_IO_SWT|A9IO 开关|用户操作|
|28|DEV_RS485_A9_IO_EXP|A9IO 扩展|设备回路状态|
|29|DEV_RS485_A9_IO_POWER|A9IO 电源|设备回路状态|
|30|DEV_RS485_RFGatewayCycle|无线网关轮询(用于轮询控制轮询设备;给无线网关下发配置和询问网关状态)|无效|
|31|DEV_RS485_RFGatewayHost|无线网关主动(用于主动控制主动设备)|无效|
|32|DEV_RS485_RFGatewayDoor|无线门磁|用户操作|
|33|DEV_RS485_AirReveal|空气参数显示设备|设备回路状态|
|34|DEV_RS485_RFGatewayRelayPir|无线继电器红外|设备回路状态|
|35|Dev_Host_TimeCtrl|时间同步|设备回路状态|
|36|Dev_Rs458_MonitorCtrl|监控控制|无效|
|37|Dev_Rs458_RotaryCtrl|旋钮开关控制|用户操作|
|38|Dev_BUS_C5IO|CSIO - 类型|设备回路状态|
|39|Dev_RS485_CardState|插卡状态虚拟设备|设备回路状态|
|40|DEV_RS485_FreshAir|485 新风设备|用户操作|
|41|DEV_RS485_FaceMach|485 人脸机|用户操作|
|42|DEV_Center_Control|中控|无效|
|43|DEV_Domain_Control|域控|无效|
|44|DEV_RS485_LCD|LCD|设备回路状态|
|45|DEV_Virtual_NoCard|无卡断电 --2025-11-24 取消|无效|
|46|DEV_Virtual_Card|无卡取电 2|用户操作|
|47|DEV_Virtual_Time|虚拟时间设备|设备回路状态|
|48|Dev_Rs485_PB20|PLC 总控|设备回路状态|
|49|Dev_Rs485_PB20_LD|PLC 设备 - 恒流调光设备|设备回路状态|
|50|Dev_Rs485_PB20_LS|PLC 设备 - 恒压调光设备|设备回路状态|
|51|Dev_Rs485_PB20_Relay|PLC 设备 - 继电器设备|设备回路状态|
|52|DEV_Virtual_ColorTemp|色温调节功能|设备回路状态|
|53|Dev_485_BLE_Music|蓝牙音频|设备回路状态|
|54|DEV_Carbon_Saved|碳达人|用户操作|
|55|Dev_Scene_Restore|场景还原|用户操作|
|56|Dev_Virtual_GlobalSet|全局设置|设备回路状态|
|57|Dev_Energy_Monitor|能耗检测|设备回路状态|
|241|Dev_BUS_C5IO|CSIO - 类型|设备回路状态|
**Direction (方向)**:
- `"上报"`: Upload
@@ -89,4 +153,3 @@
**Mapping**:
- `details`: `{ "ack_code": "0x00" }`
- `extra`: `{ "raw_hex": "..." }`