create table if not exists ticket_package ( id bigint not null auto_increment, package_no varchar(64) not null comment '票包编号', package_name varchar(128) not null comment '票包名称', merchant_id bigint default null comment '指定兑换商家ID', cover_url varchar(500) default null comment '封面图', talent_levels varchar(255) default null comment '适用人才卡等级,空表示全部', claim_price decimal(10,2) not null default 0.00 comment '领取价', per_user_limit int not null default 1 comment '单用户周期内限领数量', valid_start date default null comment '有效开始日期', valid_end date default null comment '有效结束日期', app_name varchar(128) default null comment '指定商家APP名称', app_jump_url varchar(500) default null comment '指定商家APP或H5跳转地址', usage_text varchar(500) default null comment '使用说明', status tinyint not null default 1 comment '状态:1启用 0停用', sort_no int not null default 0, created_at datetime not null default current_timestamp, updated_at datetime not null default current_timestamp on update current_timestamp, deleted tinyint not null default 0, primary key (id), unique key uk_ticket_package_no (package_no), key idx_ticket_package_merchant (merchant_id), key idx_ticket_package_status (status) ) engine=InnoDB default charset=utf8mb4 comment='票包配置'; create table if not exists ticket_package_code ( id bigint not null auto_increment, package_id bigint not null comment '票包ID', exchange_code varchar(128) not null comment '兑换码', batch_no varchar(64) default null comment '导入批次号', status varchar(32) not null default 'AVAILABLE' comment 'AVAILABLE可发放 LOCKED锁定 ISSUED已发放 USED已使用 VOID作废', locked_by_talent_id bigint default null comment '锁定持卡人ID', locked_by_card_id bigint default null comment '锁定人才卡ID', locked_at datetime default null comment '锁定时间', issued_claim_id bigint default null comment '发放记录ID', issued_at datetime default null comment '发放时间', used_at datetime default null comment '使用时间', remark varchar(500) default null comment '备注', created_at datetime not null default current_timestamp, updated_at datetime not null default current_timestamp on update current_timestamp, deleted tinyint not null default 0, primary key (id), unique key uk_ticket_package_code (exchange_code), key idx_ticket_package_code_package_status (package_id, status), key idx_ticket_package_code_batch (batch_no) ) engine=InnoDB default charset=utf8mb4 comment='票包兑换码码池'; create table if not exists ticket_package_claim ( id bigint not null auto_increment, claim_no varchar(64) not null comment '领取编号', package_id bigint not null comment '票包ID', code_id bigint not null comment '兑换码ID', merchant_id bigint default null comment '指定兑换商家ID', talent_id bigint not null comment '领取人ID', card_id bigint not null comment '使用人才卡ID', primary_card_id bigint not null comment '主卡ID,用于共享额度统计', card_no varchar(64) not null comment '人才卡号', card_level varchar(64) default null comment '人才卡等级', talent_name varchar(64) default null comment '领取人姓名快照', talent_mobile varchar(32) default null comment '领取人手机号快照', exchange_code varchar(128) not null comment '兑换码', status varchar(32) not null default 'ISSUED' comment 'ISSUED已发放 USED已使用 EXPIRED已过期 CANCELLED已取消', valid_end date default null comment '有效结束日期', idempotency_key varchar(128) not null comment '幂等键', used_at datetime default null comment '使用时间', created_at datetime not null default current_timestamp, updated_at datetime not null default current_timestamp on update current_timestamp, deleted tinyint not null default 0, primary key (id), unique key uk_ticket_package_claim_no (claim_no), unique key uk_ticket_package_claim_idempotency (idempotency_key), unique key uk_ticket_package_claim_code (code_id), key idx_ticket_package_claim_package (package_id), key idx_ticket_package_claim_talent (talent_id), key idx_ticket_package_claim_card_time (card_id, created_at), key idx_ticket_package_claim_primary_card_time (primary_card_id, created_at), key idx_ticket_package_claim_status (status) ) engine=InnoDB default charset=utf8mb4 comment='票包领取记录';