-- 每日菜谱预约订单过期自动退款扩展。 -- 只增加新快照和任务字段,不回填历史订单;执行前应确认目标字段/索引不存在。 ALTER TABLE `pjcloudx_wallet`.`mch_auto_refund_config` ADD COLUMN `expired_reserve_refund_enabled` char(1) NOT NULL DEFAULT '0' COMMENT '过期预约自动退款开关,0关闭,1开启' AFTER `pay_time_limit_hours`, ADD COLUMN `expired_reserve_refund_delay_hours` int(11) NOT NULL DEFAULT 2 COMMENT '餐段结束后的过期退款延迟小时数,允许1至168' AFTER `expired_reserve_refund_enabled`, ADD COLUMN `expired_reserve_refund_restore_inventory` char(1) NOT NULL DEFAULT '1' COMMENT '过期预约退款是否恢复库存,0不恢复,1恢复' AFTER `expired_reserve_refund_delay_hours`; ALTER TABLE `pjcloudx_hardware`.`hard_order` ADD COLUMN `expired_refund_config_id` bigint(20) DEFAULT NULL COMMENT '过期预约退款配置ID快照,仅新支付成功订单写入' AFTER `auto_refund_deadline`, ADD COLUMN `expired_refund_usage_end_time` datetime DEFAULT NULL COMMENT '支付成功时快照的实际餐段结束时间,无法解析时为空' AFTER `expired_refund_config_id`, ADD COLUMN `expired_refund_deadline` datetime DEFAULT NULL COMMENT '实际餐段结束时间加延迟后的过期退款触发时间' AFTER `expired_refund_usage_end_time`, ADD COLUMN `expired_refund_restore_inventory` char(1) DEFAULT NULL COMMENT '过期退款退库存快照,0不恢复,1恢复' AFTER `expired_refund_deadline`, ADD KEY `idx_hard_order_expired_refund_scan` (`tenant_id`, `expired_refund_deadline`, `order_status`, `del_flag`); ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_task` MODIFY COLUMN `after_sale_id` bigint(20) DEFAULT NULL COMMENT '售后单ID,过期预约任务首次执行前为空', MODIFY COLUMN `rule_type` varchar(32) DEFAULT NULL COMMENT '普通售后任务规则快照,过期预约任务为空', MODIFY COLUMN `eligibility_deadline` datetime DEFAULT NULL COMMENT '普通售后免审资格截止时间,过期预约任务为空', ADD COLUMN `task_type` char(10) NOT NULL DEFAULT '10' COMMENT '任务场景,10用户免审售后,20过期预约退款' AFTER `after_sale_id`, ADD COLUMN `trigger_time` datetime DEFAULT NULL COMMENT '过期预约任务按订单快照触发时间,旧售后任务为空' AFTER `eligibility_deadline`, ADD COLUMN `restore_inventory` char(1) DEFAULT NULL COMMENT '任务退库存快照,0不恢复,1恢复' AFTER `trigger_time`; -- MySQL 5.7 不支持函数索引,使用可索引的存储生成列承载场景业务主键: -- 普通售后取 after_sale_id,允许同一订单存在多个售后任务;过期预约取 order_id,保证一单一任务。 ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_task` ADD COLUMN `scene_biz_id` bigint(20) GENERATED ALWAYS AS (CASE WHEN `task_type` = '20' THEN `order_id` ELSE `after_sale_id` END) STORED COMMENT '任务场景业务唯一值,系统生成,禁止业务代码写入' AFTER `restore_inventory`, DROP INDEX `uk_hard_auto_refund_task_after_sale`, ADD UNIQUE KEY `uk_hard_auto_refund_task_scene_biz` (`tenant_id`, `task_type`, `scene_biz_id`, `del_flag`), ADD KEY `idx_hard_auto_refund_task_scan_type` (`tenant_id`, `task_type`, `status`, `next_retry_time`, `del_flag`); ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_attempt_log` MODIFY COLUMN `after_sale_id` bigint(20) DEFAULT NULL COMMENT '售后单ID,过期任务创建售后前为空', MODIFY COLUMN `refund_code` varchar(128) NOT NULL COMMENT '稳定钱包退款业务号,过期任务按订单生成';