-- ======================================== -- FastBee 设备监测报告引擎 SQL 脚本 -- 创建日期: 2026-08-16 -- 说明: -- 1. iot_product 增加监测分类编码列 -- 2. 新增 iot_report_threshold / report_template / report_record 三张表 -- 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_report_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 '控制值', `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 模板表 -- ------------------------------------------------------------ CREATE TABLE `report_template` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `template_code` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT '模板编码,如 DEVICE_CRACK_METER_V1', `template_name` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '模板名称', `monitor_category_code` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '监测分类编码', `version` int(11) NOT NULL DEFAULT 1 COMMENT '版本号', `file_path` varchar(512) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '模板文件路径(classpath 或 MinIO 路径)', `status` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT '状态(0=启用 1=停用)', `del_flag` char(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `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, UNIQUE KEY `uk_template_code_version` (`template_code`, `version`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='报告模板表'; INSERT IGNORE INTO `report_template` (template_code, template_name, monitor_category_code, version, file_path, status, del_flag, create_by, create_time) VALUES ('DEVICE_CRACK_METER_V1', '裂缝计监测分析报告V1', 'CRACK_METER', 1, 'templates/DEVICE_CRACK_METER_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_DEEP_DISPLACEMENT_V1', '深部位移监测分析报告V1', 'DEEP_DISPLACEMENT', 1, 'templates/DEVICE_DEEP_DISPLACEMENT_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_AXIAL_FORCE_V1', '轴力应力监测分析报告V1', 'AXIAL_FORCE', 1, 'templates/DEVICE_AXIAL_FORCE_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_STATIC_LEVEL_V1', '静力水准监测分析报告V1', 'STATIC_LEVEL', 1, 'templates/DEVICE_STATIC_LEVEL_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_VIBRATING_WIRE_V1', '振弦监测分析报告V1', 'VIBRATING_WIRE', 1, 'templates/DEVICE_VIBRATING_WIRE_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_STRAIN_GAUGE_V1', '应变计监测分析报告V1', 'STRAIN_GAUGE', 1, 'templates/DEVICE_STRAIN_GAUGE_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_WATER_LEVEL_V1', '水位计监测分析报告V1', 'WATER_LEVEL', 1, 'templates/DEVICE_WATER_LEVEL_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_RANGING_METER_V1', '测距仪监测分析报告V1', 'RANGING_METER', 1, 'templates/DEVICE_RANGING_METER_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_INCLINOMETER_V1', '倾角计监测分析报告V1', 'INCLINOMETER', 1, 'templates/DEVICE_INCLINOMETER_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_THERMOMETER_V1', '温度计监测分析报告V1', 'THERMOMETER', 1, 'templates/DEVICE_THERMOMETER_V1.docx', '0', '0', 'admin', NOW()), ('DEVICE_RAIN_GAUGE_V1', '雨量计监测分析报告V1', 'RAIN_GAUGE', 1, 'templates/DEVICE_RAIN_GAUGE_V1.docx', '0', '0', 'admin', NOW()); -- ------------------------------------------------------------ -- 2.3 报告生成记录表(保留期 1 个月:expire_time = create_time + 30 天) -- ------------------------------------------------------------ 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 '文件地址', `expire_time` datetime DEFAULT NULL COMMENT '过期时间(= create_time + 30 天)', `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, KEY `idx_expire` (`expire_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');