-- ============================================
-- 代金券模块建表脚本
-- ============================================

-- 代金券模板表
CREATE TABLE IF NOT EXISTS voucher_template (
    id VARCHAR(32) NOT NULL COMMENT '主键ID',
    name VARCHAR(64) NOT NULL COMMENT '模板名称',
    code VARCHAR(32) NOT NULL COMMENT '模板编码',
    face_value DECIMAL(10,2) NOT NULL COMMENT '面值',
    total_count INT NOT NULL DEFAULT 0 COMMENT '总发行量',
    issued_count INT NOT NULL DEFAULT 0 COMMENT '已发放量',
    valid_days INT NOT NULL DEFAULT 30 COMMENT '有效期天数',
    status VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT '状态: draft/active/inactive',
    remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    creator VARCHAR(32) DEFAULT NULL COMMENT '创建人',
    updater VARCHAR(32) DEFAULT NULL COMMENT '更新人',
    PRIMARY KEY (id),
    UNIQUE KEY idx_template_code (code),
    KEY idx_template_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代金券模板';

-- 代金券规则表
CREATE TABLE IF NOT EXISTS voucher_rule (
    id VARCHAR(32) NOT NULL COMMENT '主键ID',
    template_id VARCHAR(32) NOT NULL COMMENT '模板ID',
    rule_type VARCHAR(32) NOT NULL COMMENT '规则类型',
    rule_config TEXT NOT NULL COMMENT '规则配置(JSON)',
    enabled SMALLINT NOT NULL DEFAULT 1 COMMENT '是否启用',
    sort_order INT NOT NULL DEFAULT 0 COMMENT '执行顺序',
    remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (id),
    KEY idx_rule_template (template_id),
    KEY idx_rule_enabled (enabled)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代金券规则定义';

-- 代金券实例表
CREATE TABLE IF NOT EXISTS voucher_instance (
    id VARCHAR(32) NOT NULL COMMENT '主键ID',
    template_id VARCHAR(32) NOT NULL COMMENT '模板ID',
    customer_id VARCHAR(32) NOT NULL COMMENT '客户ID',
    code VARCHAR(64) NOT NULL COMMENT '唯一券码',
    status VARCHAR(16) NOT NULL DEFAULT 'unused' COMMENT '状态: unused/used/expired',
    face_value DECIMAL(10,2) NOT NULL COMMENT '面值',
    actual_deducted DECIMAL(10,2) DEFAULT NULL COMMENT '实际抵扣金额',
    valid_from DATETIME NOT NULL COMMENT '生效时间',
    valid_to DATETIME NOT NULL COMMENT '过期时间',
    issued_at DATETIME NOT NULL COMMENT '发放时间',
    used_at DATETIME DEFAULT NULL COMMENT '使用时间',
    order_id VARCHAR(64) DEFAULT NULL COMMENT '使用的订单ID',
    source VARCHAR(32) DEFAULT NULL COMMENT '来源',
    remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (id),
    UNIQUE KEY idx_instance_code (code),
    KEY idx_instance_customer (customer_id),
    KEY idx_instance_template (template_id),
    KEY idx_instance_status (status),
    KEY idx_instance_valid_to (valid_to)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代金券实例（一次性使用）';

-- 代金券使用流水表
CREATE TABLE IF NOT EXISTS voucher_usage_log (
    id VARCHAR(32) NOT NULL COMMENT '主键ID',
    instance_id VARCHAR(32) NOT NULL COMMENT '券实例ID',
    customer_id VARCHAR(32) NOT NULL COMMENT '客户ID',
    order_id VARCHAR(64) NOT NULL COMMENT '订单/消费ID',
    face_value DECIMAL(10,2) NOT NULL COMMENT '券面值',
    deducted_amount DECIMAL(10,2) NOT NULL COMMENT '实际抵扣金额',
    used_at DATETIME NOT NULL COMMENT '使用时间',
    used_by VARCHAR(32) DEFAULT NULL COMMENT '操作人',
    product_type VARCHAR(32) DEFAULT NULL COMMENT '产品类型',
    product_name VARCHAR(64) DEFAULT NULL COMMENT '产品名称',
    PRIMARY KEY (id),
    KEY idx_log_instance (instance_id),
    KEY idx_log_customer (customer_id),
    KEY idx_log_order (order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代金券使用流水';

-- 初始化编码数据
INSERT INTO appcodes (id, name, hierarchy_flg) VALUES
('voucher_template_status', '代金券模板状态', '0'),
('voucher_instance_status', '代金券实例状态', '0'),
('voucher_rule_type', '代金券规则类型', '0')
ON DUPLICATE KEY UPDATE name=VALUES(name);

INSERT INTO appcodes_kv (id, parentid, k, v) VALUES
('vts_draft', 'voucher_template_status', 'draft', '草稿'),
('vts_active', 'voucher_template_status', 'active', '启用'),
('vts_inactive', 'voucher_template_status', 'inactive', '停用'),
('vis_unused', 'voucher_instance_status', 'unused', '未使用'),
('vis_used', 'voucher_instance_status', 'used', '已使用'),
('vis_expired', 'voucher_instance_status', 'expired', '已过期'),
('vrt_min', 'voucher_rule_type', 'min_amount', '最低消费'),
('vrt_max', 'voucher_rule_type', 'max_amount', '最高消费'),
('vrt_ptype', 'voucher_rule_type', 'applicable_product_type', '限定产品类型'),
('vrt_prod', 'voucher_rule_type', 'applicable_product', '限定特定产品'),
('vrt_exprod', 'voucher_rule_type', 'exclude_product', '排除特定产品'),
('vrt_usage', 'voucher_rule_type', 'max_usage_count', '最大使用次数'),
('vrt_period', 'voucher_rule_type', 'valid_period', '有效期'),
('vrt_level', 'voucher_rule_type', 'user_level', '用户等级')
ON DUPLICATE KEY UPDATE v=VALUES(v);
