-- 库存预警机制强化 V1.0.1
-- 新增库存预警规则表、预警记录表

-- ----------------------------
-- 1. 库存预警规则表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `stock_warning_rules` (
    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `rule_name` VARCHAR(100) NOT NULL COMMENT '规则名称',
    `rule_type` VARCHAR(20) NOT NULL COMMENT '规则类型：low_stock(低库存预警)、high_stock(高库存预警)、out_of_stock(缺货预警)',
    `sku_code` VARCHAR(50) DEFAULT NULL COMMENT 'SKU编码（为空表示适用于所有SKU）',
    `sku_name` VARCHAR(100) DEFAULT NULL COMMENT 'SKU名称（冗余字段）',
    `warehouse_id` BIGINT DEFAULT NULL COMMENT '仓库ID（为空表示适用于所有仓库）',
    `warehouse_name` VARCHAR(100) DEFAULT NULL COMMENT '仓库名称（冗余字段）',
    `safety_stock_min` INT DEFAULT NULL COMMENT '安全库存下限',
    `safety_stock_max` INT DEFAULT NULL COMMENT '安全库存上限',
    `warning_threshold` INT DEFAULT NULL COMMENT '预警阈值',
    `max_stock_threshold` INT DEFAULT NULL COMMENT '最高库存上限',
    `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用：0-禁用，1-启用',
    `notification_methods` VARCHAR(100) DEFAULT 'system' COMMENT '通知方式：system(系统通知)、email(邮件)、dingtalk(钉钉)，多个用逗号分隔',
    `notification_emails` VARCHAR(500) DEFAULT NULL COMMENT '通知邮箱（多个用逗号分隔）',
    `dingtalk_webhook` VARCHAR(500) DEFAULT NULL COMMENT '钉钉Webhook URL',
    `dingtalk_secret` VARCHAR(100) DEFAULT NULL COMMENT '钉钉Secret（加签密钥）',
    `repeat_interval_minutes` INT NOT NULL DEFAULT 0 COMMENT '重复预警间隔（分钟），0表示不重复',
    `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
    `version` INT NOT NULL DEFAULT 0 COMMENT '版本号',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `created_by` BIGINT DEFAULT NULL COMMENT '创建人ID',
    `created_by_name` VARCHAR(50) DEFAULT NULL COMMENT '创建人名称',
    PRIMARY KEY (`id`),
    KEY `idx_rule_type` (`rule_type`),
    KEY `idx_enabled` (`enabled`),
    KEY `idx_warehouse_id` (`warehouse_id`),
    KEY `idx_sku_code` (`sku_code`),
    KEY `idx_rule_type_enabled` (`rule_type`, `enabled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存预警规则表';

-- ----------------------------
-- 2. 库存预警记录表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `stock_warning_records` (
    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `rule_id` BIGINT DEFAULT NULL COMMENT '预警规则ID',
    `rule_name` VARCHAR(100) DEFAULT NULL COMMENT '规则名称',
    `rule_type` VARCHAR(20) DEFAULT NULL COMMENT '规则类型',
    `sku_code` VARCHAR(50) NOT NULL COMMENT 'SKU编码',
    `sku_name` VARCHAR(100) DEFAULT NULL COMMENT 'SKU名称',
    `warehouse_id` BIGINT NOT NULL COMMENT '仓库ID',
    `warehouse_name` VARCHAR(100) DEFAULT NULL COMMENT '仓库名称',
    `current_quantity` INT NOT NULL DEFAULT 0 COMMENT '当前库存数量',
    `available_quantity` INT NOT NULL DEFAULT 0 COMMENT '可用库存数量',
    `warning_threshold` INT DEFAULT NULL COMMENT '预警阈值',
    `deficit` INT DEFAULT NULL COMMENT '预警时的库存与阈值差值',
    `level` VARCHAR(20) DEFAULT 'warning' COMMENT '预警等级：info(通知)、warning(警告)、critical(紧急)',
    `message` VARCHAR(500) DEFAULT NULL COMMENT '预警消息内容',
    `status` VARCHAR(20) DEFAULT 'pending' COMMENT '预警状态：pending(待处理)、notified(已通知)、acknowledged(已确认)、resolved(已解决)、ignored(已忽略)',
    `notification_method` VARCHAR(100) DEFAULT NULL COMMENT '通知方式',
    `notification_success` TINYINT(1) DEFAULT NULL COMMENT '通知是否成功',
    `notification_error` VARCHAR(500) DEFAULT NULL COMMENT '通知失败原因',
    `acknowledged_at` DATETIME DEFAULT NULL COMMENT '确认时间',
    `acknowledged_by` BIGINT DEFAULT NULL COMMENT '确认人ID',
    `acknowledged_by_name` VARCHAR(50) DEFAULT NULL COMMENT '确认人名称',
    `resolved_at` DATETIME DEFAULT NULL COMMENT '解决时间',
    `resolved_by` BIGINT DEFAULT NULL COMMENT '解决人ID',
    `resolved_remark` VARCHAR(500) DEFAULT NULL COMMENT '解决备注',
    `version` INT NOT NULL DEFAULT 0 COMMENT '版本号（用于乐观锁）',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    KEY `idx_rule_id` (`rule_id`),
    KEY `idx_rule_type` (`rule_type`),
    KEY `idx_sku_code` (`sku_code`),
    KEY `idx_warehouse_id` (`warehouse_id`),
    KEY `idx_status` (`status`),
    KEY `idx_level` (`level`),
    KEY `idx_created_at` (`created_at`),
    KEY `idx_rule_type_status` (`rule_type`, `status`),
    KEY `idx_sku_warehouse_status` (`sku_code`, `warehouse_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='库存预警记录表';

-- ----------------------------
-- 3. 初始化默认预警规则
-- ----------------------------
-- 低库存预警规则（适用于所有商品）
INSERT INTO `stock_warning_rules` (`rule_name`, `rule_type`, `sku_code`, `warehouse_id`, `warning_threshold`, `enabled`, `notification_methods`, `repeat_interval_minutes`, `remark`, `created_by_name`)
VALUES 
    ('全局低库存预警', 'low_stock', NULL, NULL, 10, 1, 'system', 60, '适用于所有商品的低库存预警规则，库存低于10时触发', 'system');

-- 缺货预警规则（适用于所有商品）
INSERT INTO `stock_warning_rules` (`rule_name`, `rule_type`, `sku_code`, `warehouse_id`, `warning_threshold`, `enabled`, `notification_methods`, `repeat_interval_minutes`, `remark`, `created_by_name`)
VALUES 
    ('全局缺货预警', 'out_of_stock', NULL, NULL, 0, 1, 'system,dingtalk', 30, '适用于所有商品的缺货预警规则，库存为0时触发', 'system');
