-- 套票(冻结/可用、分期释放)相关表 -- 说明:项目使用了 MyBatis-Plus 的 tenant 拦截;表内显式保留 tenant_id 字段并建议建立联合唯一索引。 -- 1) 套票模板(按商品配置) CREATE TABLE IF NOT EXISTS shop_ticket_template ( id INT AUTO_INCREMENT PRIMARY KEY, goods_id INT NOT NULL, name VARCHAR(100) NOT NULL, enabled TINYINT(1) NOT NULL DEFAULT 1, unit_name VARCHAR(20) NOT NULL DEFAULT '桶', -- 起售/起送 min_buy_qty INT NOT NULL DEFAULT 1, start_send_qty INT NOT NULL DEFAULT 1, -- 买赠:买1送4 => gift_multiplier=4 gift_multiplier INT NOT NULL DEFAULT 0, -- 是否把购买量也计入套票总量(默认仅计入赠送量) include_buy_qty TINYINT(1) NOT NULL DEFAULT 0, -- 释放规则:二选一 -- A) 每期释放数量(默认每月释放10) monthly_release_qty INT NOT NULL DEFAULT 10, -- B) 总共释放多少期(若配置>0,则按期数平均分摊) release_periods INT NULL, -- 首期释放时机:0=支付成功当刻;1=下个月同日 first_release_mode INT NOT NULL DEFAULT 0, comments VARCHAR(255) NULL, sort_number INT NOT NULL DEFAULT 0, user_id INT NULL, deleted INT NOT NULL DEFAULT 0, tenant_id INT NOT NULL, create_time DATETIME NULL, update_time DATETIME NULL, UNIQUE KEY uk_ticket_template_tenant_goods (tenant_id, goods_id), KEY idx_ticket_template_tenant (tenant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 2) 用户套票账户(一次购买通常生成一条) CREATE TABLE IF NOT EXISTS shop_user_ticket ( id BIGINT AUTO_INCREMENT PRIMARY KEY, template_id INT NOT NULL, goods_id INT NOT NULL, user_id INT NOT NULL, order_id INT NULL, order_no VARCHAR(64) NULL, order_goods_id INT NULL, total_qty INT NOT NULL DEFAULT 0, available_qty INT NOT NULL DEFAULT 0, frozen_qty INT NOT NULL DEFAULT 0, used_qty INT NOT NULL DEFAULT 0, released_qty INT NOT NULL DEFAULT 0, status INT NOT NULL DEFAULT 0, deleted INT NOT NULL DEFAULT 0, tenant_id INT NOT NULL, create_time DATETIME NULL, update_time DATETIME NULL, KEY idx_user_ticket_user (tenant_id, user_id), KEY idx_user_ticket_order (tenant_id, order_no), UNIQUE KEY uk_user_ticket_order_goods (tenant_id, template_id, order_no, order_goods_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 3) 释放计划/释放记录(每期一条,幂等执行) CREATE TABLE IF NOT EXISTS shop_user_ticket_release ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_ticket_id BIGINT NOT NULL, user_id INT NOT NULL, period_no INT NOT NULL, release_qty INT NOT NULL, release_time DATETIME NOT NULL, status INT NOT NULL DEFAULT 0, -- 0待释放 1已释放 2作废 released_time DATETIME NULL, tenant_id INT NOT NULL, create_time DATETIME NULL, update_time DATETIME NULL, UNIQUE KEY uk_ticket_release_period (tenant_id, user_ticket_id, period_no), KEY idx_ticket_release_due (status, release_time), KEY idx_ticket_release_user (tenant_id, user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 4) 套票变更流水(发放/释放/消费/回滚等) CREATE TABLE IF NOT EXISTS shop_user_ticket_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_ticket_id BIGINT NOT NULL, user_id INT NOT NULL, change_type INT NOT NULL, -- 10发放 20释放 30消费 40回滚/退款 change_available INT NOT NULL DEFAULT 0, change_frozen INT NOT NULL DEFAULT 0, change_used INT NOT NULL DEFAULT 0, available_after INT NOT NULL DEFAULT 0, frozen_after INT NOT NULL DEFAULT 0, used_after INT NOT NULL DEFAULT 0, order_id INT NULL, order_no VARCHAR(64) NULL, remark VARCHAR(255) NULL, tenant_id INT NOT NULL, create_time DATETIME NULL, update_time DATETIME NULL, KEY idx_ticket_log_user (tenant_id, user_id), KEY idx_ticket_log_ticket (tenant_id, user_ticket_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;