60 lines
4.0 KiB
SQL
60 lines
4.0 KiB
SQL
-- =============================================
|
||
-- 蓝牙网关测点采集(产品-设备-测点链路)
|
||
-- 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, '');
|