Files
java-template/client-deployment/system-event-alert-schema.sql
2025-08-14 08:11:03 +08:00

130 lines
7.8 KiB
SQL

-- 企业级系统事件告警方案数据库表结构
-- 创建时间: 2024年
USE `lj-06`;
-- 1. 微信告警配置表(租户维度)
CREATE TABLE IF NOT EXISTS `t_wechat_alarm_config` (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
`tenant_id` BIGINT NOT NULL COMMENT '租户ID',
`type` VARCHAR(20) NOT NULL COMMENT '微信类型: enterprise(企业微信)/official(公众号)',
`corp_id` VARCHAR(100) DEFAULT NULL COMMENT '企业微信企业ID',
`agent_id` VARCHAR(50) DEFAULT NULL COMMENT '企业微信应用AgentID',
`secret` VARCHAR(100) DEFAULT NULL COMMENT '企业微信应用Secret',
`appid` VARCHAR(100) DEFAULT NULL COMMENT '微信公众号AppID',
`appsecret` VARCHAR(100) DEFAULT NULL COMMENT '微信公众号AppSecret',
`template_id` VARCHAR(100) DEFAULT NULL COMMENT '微信模板消息ID',
`enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用告警',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX `idx_tenant_type` (`tenant_id`, `type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信告警配置表(支持企业微信和公众号)';
-- 2. 系统事件规则表
CREATE TABLE IF NOT EXISTS `t_system_event_rule` (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
`event_type` VARCHAR(100) NOT NULL COMMENT '完整事件类型(如com.tdtech.ohos.health.action.SOS_EVENT)',
`rule_type` VARCHAR(50) NOT NULL COMMENT '规则类型(简化,如SOS_EVENT)',
`severity_level` VARCHAR(20) NOT NULL DEFAULT 'medium' COMMENT '告警级别:critical/high/medium/low',
`alert_message` VARCHAR(500) NOT NULL COMMENT '告警消息模板',
`is_emergency` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否紧急事件(触发微信推送)',
`notification_type` VARCHAR(20) NOT NULL DEFAULT 'message' COMMENT '通知类型:wechat/message/both',
`retry_count` INT NOT NULL DEFAULT 3 COMMENT '失败重试次数',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用规则',
`tenant_id` BIGINT NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY `uk_rule_tenant` (`rule_type`, `tenant_id`),
INDEX `idx_event_type` (`event_type`),
INDEX `idx_is_emergency` (`is_emergency`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统事件规则配置表';
-- 3. 事件告警队列表
CREATE TABLE IF NOT EXISTS `t_event_alarm_queue` (
`id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
`event_type` VARCHAR(100) NOT NULL COMMENT '事件类型',
`device_sn` VARCHAR(50) NOT NULL COMMENT '设备序列号',
`event_value` VARCHAR(500) DEFAULT NULL COMMENT '事件值',
`event_data` JSON DEFAULT NULL COMMENT '完整事件数据(JSON格式)',
`processing_status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '处理状态:pending/processing/completed/failed',
`retry_count` INT NOT NULL DEFAULT 0 COMMENT '已重试次数',
`error_message` TEXT DEFAULT NULL COMMENT '错误信息',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`process_time` DATETIME DEFAULT NULL COMMENT '开始处理时间',
`complete_time` DATETIME DEFAULT NULL COMMENT '完成时间',
INDEX `idx_status_time` (`processing_status`, `create_time`),
INDEX `idx_device_time` (`device_sn`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='事件告警处理队列';
-- 4. 扩展t_alert_info表(如果字段不存在)
ALTER TABLE `t_alert_info`
ADD COLUMN IF NOT EXISTS `user_id` BIGINT DEFAULT NULL COMMENT '用户ID' AFTER `health_id`,
ADD COLUMN IF NOT EXISTS `org_id` BIGINT DEFAULT NULL COMMENT '组织ID' AFTER `user_id`,
ADD COLUMN IF NOT EXISTS `tenant_id` BIGINT DEFAULT 1 COMMENT '租户ID' AFTER `org_id`;
-- 5. 扩展t_alert_action_log表
ALTER TABLE `t_alert_action_log`
ADD COLUMN IF NOT EXISTS `notification_type` VARCHAR(20) DEFAULT NULL COMMENT '通知类型:wechat/message/both' AFTER `result`,
ADD COLUMN IF NOT EXISTS `retry_attempt` INT DEFAULT 0 COMMENT '重试次数' AFTER `notification_type`;
-- 6. 初始化默认系统事件规则数据
INSERT IGNORE INTO `t_system_event_rule` (`event_type`, `rule_type`, `severity_level`, `alert_message`, `is_emergency`, `notification_type`, `tenant_id`) VALUES
-- 紧急事件(微信实时告警)
('com.tdtech.ohos.health.action.SOS_EVENT', 'SOS_EVENT', 'critical', 'SOS紧急求助信号', 1, 'both', 1),
('com.tdtech.ohos.health.action.FALLDOWN_EVENT', 'FALLDOWN_EVENT', 'critical', '检测到跌倒事件', 1, 'both', 1),
('com.tdtech.ohos.action.ONE_KEY_ALARM', 'ONE_KEY_ALARM', 'critical', '一键报警触发', 1, 'both', 1),
-- 严重事件(平台消息推送)
('com.tdtech.ohos.action.WEAR_STATUS_CHANGED', 'WEAR_STATUS_CHANGED', 'high', '设备佩戴状态变化', 0, 'message', 1),
('com.tdtech.ohos.health.action.STRESS_HIGH_ALERT', 'STRESS_HIGH_ALERT', 'high', '压力水平过高告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.SPO2_LOW_ALERT', 'SPO2_LOW_ALERT', 'high', '血氧浓度过低告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.HEARTRATE_HIGH_ALERT', 'HEARTRATE_HIGH_ALERT', 'high', '心率过高告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.HEARTRATE_LOW_ALERT', 'HEARTRATE_LOW_ALERT', 'high', '心率过低告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.TEMPERATURE_HIGH_ALERT', 'TEMPERATURE_HIGH_ALERT', 'high', '体温过高告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.TEMPERATURE_LOW_ALERT', 'TEMPERATURE_LOW_ALERT', 'high', '体温过低告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.PRESSURE_HIGH_ALERT', 'PRESSURE_HIGH_ALERT', 'high', '血压过高告警', 0, 'message', 1),
('com.tdtech.ohos.health.action.PRESSURE_LOW_ALERT', 'PRESSURE_LOW_ALERT', 'high', '血压过低告警', 0, 'message', 1),
-- 系统事件(消息通知)
('com.tdtech.ohos.action.CALL_STATE', 'CALL_STATE', 'medium', '通话状态变化', 0, 'message', 1),
('com.tdtech.ohos.action.BOOT_COMPLETED', 'BOOT_COMPLETED', 'medium', '设备启动完成', 0, 'message', 1),
('com.tdtech.ohos.action.UI_SETTINGS_CHANGED', 'UI_SETTINGS_CHANGED', 'low', 'UI设置变更', 0, 'message', 1),
('com.tdtech.ohos.action.FUN_DOUBLE_CLICK', 'FUN_DOUBLE_CLICK', 'low', '功能键双击', 0, 'message', 1);
-- 7. 初始化默认微信告警配置(租户ID=1)
INSERT IGNORE INTO `t_wechat_alarm_config` (`tenant_id`, `type`, `enabled`) VALUES
(1, 'enterprise', 1),
(1, 'official', 1);
-- 8. 创建视图:事件告警统计
CREATE OR REPLACE VIEW `v_event_alarm_stats` AS
SELECT
DATE(create_time) as stat_date,
processing_status,
COUNT(*) as event_count,
COUNT(DISTINCT device_sn) as device_count
FROM t_event_alarm_queue
GROUP BY DATE(create_time), processing_status;
-- 9. 创建视图:告警规则使用统计
CREATE OR REPLACE VIEW `v_alert_rule_usage` AS
SELECT
r.rule_type,
r.severity_level,
r.is_emergency,
COUNT(a.id) as alert_count,
COUNT(DISTINCT a.device_sn) as device_count,
AVG(CASE WHEN a.alert_status = 'responded' THEN 1 ELSE 0 END) as response_rate
FROM t_system_event_rule r
LEFT JOIN t_alert_info a ON FIND_IN_SET(r.rule_type, a.alert_type) > 0
WHERE r.is_active = 1
GROUP BY r.id, r.rule_type, r.severity_level, r.is_emergency;
-- 添加索引优化
CREATE INDEX IF NOT EXISTS `idx_alert_info_health_user` ON `t_alert_info` (`health_id`, `user_id`);
CREATE INDEX IF NOT EXISTS `idx_alert_info_tenant_status` ON `t_alert_info` (`tenant_id`, `alert_status`);
CREATE INDEX IF NOT EXISTS `idx_device_message_health` ON `t_device_message` (`device_sn`, `create_time`);
-- 完成提示
SELECT '企业级系统事件告警方案数据库表结构创建完成!' as message;