-- ============================================= -- 蓝牙网关测点采集(产品-设备-测点链路) -- yack-mini 上报 topic: /{productId}/{sn}/{measurePointId}/measure/post -- 协议: 产品 protocol_code = MEASURE-MODBUS(Modbus 直解析) -- 版本: 2.0 2026-09-27 测点数据表改为「一帧一行」,解析结果整体存 JSON 数组 -- ============================================= -- 测点表(measure_point_id 为测点唯一识别号,前端手动输入) CREATE TABLE `iot_measure_point` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键', `measure_point_id` VARCHAR(64) NOT NULL COMMENT '唯一采集ID(测点唯一识别号,前端输入,正则^[A-Za-z0-9_-]{1,64}$)', `product_id` BIGINT DEFAULT NULL COMMENT '产品id', `serial_number` VARCHAR(64) DEFAULT NULL COMMENT '采集设备编号', `point_name` VARCHAR(64) DEFAULT NULL COMMENT '测点名称', `last_data_time` DATETIME(3) DEFAULT NULL COMMENT '最后采集时间(落库时维护,列表活跃度展示)', `data_count` BIGINT NOT NULL DEFAULT 0 COMMENT '累计帧数(一次上报=一帧,落库时累加)', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), UNIQUE KEY `uk_measure_point_id` (`measure_point_id`), KEY `idx_serial_number` (`serial_number`), KEY `idx_last_data_time` (`last_data_time`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '蓝牙网关采集测点表'; -- ============================================= -- 测点数据表:一帧一行 -- -- 一次上报(MQTT 一条消息)解析出的全部指标,合并为零散在 data_json 里的有序数组: -- [{"identifier":"Ang_x","modelName":"X轴角度","value":"1042.5417"}, ...] -- -- 为何一帧一行而不是「一行一 identifier」: -- ModbusProtocol 在寄存器循环内逐条 DateUtils.getNowDate(),同帧各行的 ts 会跨毫秒 -- (实测 34 帧中有 6 帧如此),按 ts 归组会拆帧。整帧整体落一行则帧身份天然存在, -- 不需要额外的批次号字段,也不需要「先取帧再拉明细」的两步查询。 -- -- modelName 为落库快照,取自 iot_things_model.model_name(中文原文): -- 物模型改名后历史帧仍保留采集当时的名称,列表列头也直接由数据自身提供。 -- ============================================= CREATE TABLE `iot_measure_point_data` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键(帧标识)', `measure_point_id` VARCHAR(64) NOT NULL COMMENT '测点唯一识别号', `product_id` BIGINT DEFAULT NULL COMMENT '产品id', `serial_number` VARCHAR(64) DEFAULT NULL COMMENT '采集设备编号', `ts` DATETIME(3) NOT NULL COMMENT '帧时间(一次上报取定,帧内指标统一)', `data_json` JSON NOT NULL COMMENT '帧解析结果 [{identifier,modelName,value}],顺序即解析顺序', PRIMARY KEY (`id`), -- 主查询路径:按测点+时间范围过滤并倒序;最左前缀覆盖单列 measure_point_id(故不建单列索引) KEY `idx_point_ts` (`measure_point_id`, `ts`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '蓝牙网关测点数据表(一帧一行,解析结果存JSON)'; -- ============================================= -- 菜单:数据中心 → 测点数据(yack-web 展示入口) -- 父菜单 3343 = 数据中心;菜单ID 段 3620-3629 未被占用 -- 注意:菜单为裸 INSERT,重复执行会主键冲突,仅需执行一次 -- ============================================= INSERT INTO `sys_menu` VALUES(3620, '测点数据', 3343, 5, 'measurePoint', 'dataCenter/measurePoint', NULL, 1, 0, 'C', '0', '0', 'dataCenter:history:list', 'monitor', 'admin', NOW(), '', NULL, '蓝牙网关测点上报数据查询'); INSERT INTO `sys_menu` VALUES(3621, '测点数据查询', 3620, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'dataCenter:history:list', '#', 'admin', NOW(), '', NULL, '');