alter table ticket_package add column total_quantity int not null default 0 comment '票包配置数量' after package_name; create table if not exists ticket_package_merchant ( id bigint not null auto_increment, package_id bigint not null comment '票包ID', merchant_id bigint not null comment '适用商家ID', sort_no int not null default 0 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_merchant (package_id, merchant_id), key idx_ticket_package_merchant_package (package_id), key idx_ticket_package_merchant_merchant (merchant_id) ) engine=InnoDB default charset=utf8mb4 comment='票包适用商家'; create table if not exists ticket_package_level_rule ( id bigint not null auto_increment, package_id bigint not null comment '票包ID', talent_level varchar(64) not null comment '人才卡等级', enabled tinyint not null default 1 comment '是否启用', claimable_count int not null default 1 comment '当前等级可领数量', reset_cycle varchar(32) not null default '每天' 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_level_rule (package_id, talent_level), key idx_ticket_package_level_rule_package (package_id) ) engine=InnoDB default charset=utf8mb4 comment='票包人才等级领取规则'; update ticket_package p set p.total_quantity = ( select count(*) from ticket_package_code c where c.package_id = p.id and c.deleted = 0 ) where p.total_quantity = 0; insert into ticket_package_merchant(package_id, merchant_id, sort_no) select p.id, p.merchant_id, 0 from ticket_package p where p.deleted = 0 and p.merchant_id is not null and not exists ( select 1 from ticket_package_merchant pm where pm.package_id = p.id and pm.merchant_id = p.merchant_id ); insert into ticket_package_level_rule(package_id, talent_level, enabled, claimable_count, reset_cycle) select p.id, levels.talent_level, case when coalesce(p.talent_levels, '') = '' then 1 when instr(p.talent_levels, levels.talent_level) > 0 then 1 else 0 end, greatest(coalesce(p.per_user_limit, r.claimable_count, 1), 1), coalesce(nullif(r.reset_cycle, ''), '每天') from ticket_package p join ( select '卓越人才卡' as talent_level union all select '杰出人才卡' union all select '菁英人才卡' ) levels left join movie_ticket_rule r on r.talent_level = levels.talent_level where p.deleted = 0 and not exists ( select 1 from ticket_package_level_rule pr where pr.package_id = p.id and pr.talent_level = levels.talent_level );