-- ======================================== -- FastBee 设备监测报告引擎 SQL 脚本 -- 创建日期: 2026-08-16 -- 说明: -- 1. iot_product 增加监测分类编码列 -- 2. 新增 iot_things_threshold / report_record 两张表(Word 模板不入库,随代码发布) -- 3. oss_config 插入 MinIO 默认配置(存储决策:未购买云 OSS,统一使用自建 MinIO) -- 4. 历史报表菜单与按钮权限 -- 注意: 存量库执行前请先备份;增量脚本可重复执行(使用 / INSERT IGNORE) -- ======================================== -- ------------------------------------------------------------ -- 1. iot_product 增加监测分类编码列(MySQL 8.0.29 以下不支持 加列,故直接 ALTER) -- ------------------------------------------------------------ ALTER TABLE `iot_product` ADD COLUMN `monitor_category_code` VARCHAR(64) DEFAULT NULL COMMENT '监测分类编码(CRACK_METER/DEEP_DISPLACEMENT/AXIAL_FORCE/STATIC_LEVEL/VIBRATING_WIRE/STRAIN_GAUGE/WATER_LEVEL/RANGING_METER/INCLINOMETER/THERMOMETER/RAIN_GAUGE)' AFTER `category_name`; -- 存量产品按产品名回填监测分类 UPDATE `iot_product` SET `monitor_category_code` = 'CRACK_METER' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%裂缝%' OR `product_name` LIKE '%测缝%'); UPDATE `iot_product` SET `monitor_category_code` = 'DEEP_DISPLACEMENT' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%位移%' OR `product_name` LIKE '%测斜%'); UPDATE `iot_product` SET `monitor_category_code` = 'AXIAL_FORCE' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%轴力%' OR `product_name` LIKE '%应力%' OR `product_name` LIKE '%锚索%' OR `product_name` LIKE '%钢筋计%'); UPDATE `iot_product` SET `monitor_category_code` = 'STATIC_LEVEL' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%水准%'); UPDATE `iot_product` SET `monitor_category_code` = 'VIBRATING_WIRE' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%振弦%'); UPDATE `iot_product` SET `monitor_category_code` = 'STRAIN_GAUGE' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%应变%'); UPDATE `iot_product` SET `monitor_category_code` = 'WATER_LEVEL' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%水位%'); UPDATE `iot_product` SET `monitor_category_code` = 'RANGING_METER' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%测距%' OR `product_name` LIKE '%激光测距%'); UPDATE `iot_product` SET `monitor_category_code` = 'INCLINOMETER' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%倾角%' OR `product_name` LIKE '%倾斜%'); UPDATE `iot_product` SET `monitor_category_code` = 'THERMOMETER' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%温度%'); UPDATE `iot_product` SET `monitor_category_code` = 'RAIN_GAUGE' WHERE (`monitor_category_code` IS NULL OR `monitor_category_code` = '') AND (`product_name` LIKE '%雨量%'); -- ------------------------------------------------------------ -- 2.1 报告阈值表(查询优先级:device_id > product_id > 全局默认 product_id=0) -- ------------------------------------------------------------ CREATE TABLE `iot_things_threshold` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `product_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '产品ID(0=全局默认)', `device_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '设备ID(0=不限定设备)', `monitor_category_code` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '监测分类编码', `metric_identifier` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT '物模型标识符', `warning_value` decimal(20,6) DEFAULT NULL COMMENT '预警值', `alarm_value` decimal(20,6) DEFAULT NULL COMMENT '报警值', `control_value` decimal(20,6) DEFAULT NULL COMMENT '控制值', `warning_rate` DECIMAL(18, 6) DEFAULT NULL COMMENT '变化速率预警值(单位/天)', `alarm_rate` DECIMAL(18, 6) DEFAULT NULL COMMENT '变化速率报警值(单位/天)' , `control_rate` DECIMAL(18, 6) DEFAULT NULL COMMENT '变化速率控制值(单位/天)', `unit` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '单位', `create_by` varchar(64) COLLATE utf8_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) COLLATE utf8_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_threshold_device` (`device_id`, `metric_identifier`) USING BTREE, KEY `idx_threshold_product` (`product_id`, `metric_identifier`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='报告结构化阈值'; -- ------------------------------------------------------------ -- 2.2 Word 模板(不再建 report_template 表) -- 模板作为代码资产放在 fastbee-report/src/main/resources/templates/ -- 下(DEVICE_${CATEGORY}_V2.docx),由 DefaultWordTemplateResolver -- 从 classpath 直接加载,随版本发布,不需要数据库表。 -- ------------------------------------------------------------ -- ------------------------------------------------------------ -- 2.3 报告生成记录表(保留期由 LogCleanTask#cleanLogs(days) 统一管理,按 create_time 倒推清理) -- ------------------------------------------------------------ CREATE TABLE `report_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `report_no` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT '报告编号,如 REPORT-202608160001', `device_id` bigint(20) NOT NULL COMMENT '设备ID', `device_name` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '设备名称', `monitor_category_code` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '监测分类编码', `period` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '周期(DAY/WEEK/HALF_MONTH/MONTH/CUSTOM)', `start_time` datetime DEFAULT NULL COMMENT '统计开始时间', `end_time` datetime DEFAULT NULL COMMENT '统计结束时间', `status` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '状态(CREATING/SUCCESS/FAILED)', `file_name` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '文件名称', `file_url` varchar(512) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '文件地址', `error_message` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '失败原因', `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户ID', `create_by` varchar(64) COLLATE utf8_unicode_ci DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) COLLATE utf8_unicode_ci DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_device_time` (`device_id`, `create_time`) USING BTREE, UNIQUE KEY `uk_report_no` (`report_no`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='报告生成记录'; -- ------------------------------------------------------------ -- 3. oss_config:MinIO 默认配置(未购买云 OSS → 自建 MinIO) -- endpoint:后端连接 MinIO 的 S3 API 地址(若后端与 MinIO 同机可改为 http://127.0.0.1:9000) -- domain:为空时 getUrl() 返回 http:///;可配置 CDN/公网域名生成更友好的 URL -- 注意:端口 9000 需在安全组/防火墙放行;下载统一走后端代理,桶保持私有(access_policy=0) -- ------------------------------------------------------------ UPDATE `oss_config` SET `status` = '1' WHERE `config_key` IN ('aliyun', 'qiniu'); INSERT IGNORE INTO `oss_config` (tenant_id, tenant_name, config_key, access_key, secret_key, bucket_name, prefix, endpoint, domain, is_https, region, access_policy, status, del_flag, create_by, create_time, update_by, update_time, remark) VALUES (1, 'admin', 'minio', 'yack-superme', 'yack-minio20260816', 'fastbee', 'report', 'http://47.121.180.229:9000', '', 'N', '', '0', '0', '0', 'admin', NOW(), 'admin', NOW(), 'MinIO默认存储'); -- ------------------------------------------------------------ -- 4. 历史报表菜单与权限(数据中心 3343 下新增) -- ------------------------------------------------------------ INSERT IGNORE INTO `sys_menu` (menu_id, menu_name, parent_id, order_num, `path`, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) VALUES (3610, '历史报表', 3343, 4, 'reportHistory', 'dataCenter/reportHistory', NULL, 1, 0, 'C', '0', '0', 'iot:report:list', 'documentation', 'admin', NOW(), 'admin', NOW(), '设备监测报告历史报表'), (3611, '报表生成', 3610, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'iot:report:generate', '#', 'admin', NOW(), 'admin', NOW(), '生成并导出分析报告'); INSERT IGNORE INTO `sys_menu_translate` (id, zh_cn, en_us) VALUES (3610, '历史报表', 'Report history'), (3611, '报表生成', 'Generate report');