123 lines
8.6 KiB
SQL
123 lines
8.6 KiB
SQL
-- 每日菜谱预约订单过期未核销自动核销。
|
||
-- 前置条件:20260822_add_expired_reserve_refund.sql 与 20260823_add_hard_order_verification_time.sql
|
||
-- 的配置表、订单表部分应已执行(本脚本多处 AFTER 锚点依赖其列)。任务表部分按下方诊断分支执行,
|
||
-- 兼容 20260822 任务表语句在部分环境未成功落库(scene_biz_id 缺失)的情况。
|
||
-- 执行方式:先跑【诊断】确认现状,再按块执行;已执行过的块直接跳过,任务表三个分支只选其一。
|
||
-- 权限复用 wallet_mchManage_setting、hard_hardAfterSale_view、hard_hardAfterSale_adminRefund,无需新增 sys_menu 记录。
|
||
|
||
-- 【诊断一】任务表现有列,决定执行分支三A/三B/三C:
|
||
-- task_type 与 scene_biz_id 都缺 → 三A;只缺 scene_biz_id → 三B;scene_biz_id 已存在 → 三C。
|
||
SELECT COLUMN_NAME, COLUMN_TYPE, IFNULL(GENERATION_EXPRESSION, '') AS generation
|
||
FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = 'pjcloudx_hardware'
|
||
AND TABLE_NAME = 'hard_auto_refund_task'
|
||
AND COLUMN_NAME IN ('task_type', 'trigger_time', 'restore_inventory', 'scene_biz_id')
|
||
ORDER BY ORDINAL_POSITION;
|
||
|
||
-- 【诊断二】任务表现有索引:确认旧唯一键 uk_hard_auto_refund_task_after_sale 与
|
||
-- uk_hard_auto_refund_task_scene_biz、idx_hard_auto_refund_task_scan_type 是否存在;
|
||
-- 分支三A/三B 中 DROP/ADD INDEX 行按此结果增删。
|
||
SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX SEPARATOR ',') AS index_columns
|
||
FROM information_schema.STATISTICS
|
||
WHERE TABLE_SCHEMA = 'pjcloudx_hardware'
|
||
AND TABLE_NAME = 'hard_auto_refund_task'
|
||
GROUP BY INDEX_NAME
|
||
ORDER BY INDEX_NAME;
|
||
|
||
-- 一、Wallet 配置列。诊断发现 auto_verify_enabled 已存在时整块跳过(重复执行会报 Duplicate column)。
|
||
ALTER TABLE `pjcloudx_wallet`.`mch_auto_refund_config`
|
||
ADD COLUMN `auto_verify_enabled` char(1) NOT NULL DEFAULT '0'
|
||
COMMENT '过期未核销自动核销开关,0关闭,1开启' AFTER `expired_reserve_refund_restore_inventory`,
|
||
ADD COLUMN `auto_verify_days` int(11) DEFAULT NULL
|
||
COMMENT '支付后自动核销天数,允许1至365,开关开启时必填' AFTER `auto_verify_enabled`,
|
||
ADD COLUMN `auto_verify_restore_inventory` char(1) NOT NULL DEFAULT '1'
|
||
COMMENT '自动核销是否恢复线上池库存,0不恢复,1恢复' AFTER `auto_verify_days`;
|
||
|
||
-- 二、订单快照与核销方式列。诊断发现 auto_verify_config_id 已存在时整块跳过。
|
||
ALTER TABLE `pjcloudx_hardware`.`hard_order`
|
||
ADD COLUMN `auto_verify_config_id` bigint(20) DEFAULT NULL
|
||
COMMENT '支付成功时命中的自动核销配置ID快照,为空表示不参与自动核销' AFTER `expired_refund_restore_inventory`,
|
||
ADD COLUMN `auto_verify_deadline` datetime DEFAULT NULL
|
||
COMMENT '支付时间加配置天数后的自动核销触发时间' AFTER `auto_verify_config_id`,
|
||
ADD COLUMN `auto_verify_restore_inventory` char(1) DEFAULT NULL
|
||
COMMENT '自动核销退库存快照,0不恢复,1恢复线上池库存' AFTER `auto_verify_deadline`,
|
||
ADD COLUMN `verification_type` char(1) DEFAULT NULL
|
||
COMMENT '核销方式,1人工核销,2自动核销;历史已核销订单为空视为人工' AFTER `verification_time`;
|
||
|
||
-- 三、任务表。先执行下方重复检查,再按诊断一选择 A/B/C 其中一个分支执行。
|
||
|
||
-- 执行分支三A或三B前应确认本查询返回 0 行;发现重复时必须先人工核对任务数据,禁止自动清理。
|
||
SELECT tenant_id, task_type, del_flag,
|
||
CASE WHEN task_type = '20' THEN order_id ELSE after_sale_id END AS scene_biz_id,
|
||
COUNT(*) AS duplicate_count
|
||
FROM pjcloudx_hardware.hard_auto_refund_task
|
||
GROUP BY tenant_id, task_type, del_flag,
|
||
CASE WHEN task_type = '20' THEN order_id ELSE after_sale_id END
|
||
HAVING COUNT(*) > 1;
|
||
|
||
-- 三A:task_type 与 scene_biz_id 都不存在(20260822 任务表两条语句均未生效)。
|
||
-- 两条语句必须按顺序执行;若诊断二显示 uk_hard_auto_refund_task_after_sale 不存在,
|
||
-- 删除第二条中的 DROP INDEX 行;显示 idx_hard_auto_refund_task_scan_type 已存在则删除对应 ADD KEY 行。
|
||
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过期预约退款,30过期未核销自动核销' 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`;
|
||
|
||
ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_task`
|
||
ADD COLUMN `scene_biz_id` bigint(20)
|
||
GENERATED ALWAYS AS (CASE WHEN `task_type` IN ('20', '30') 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`),
|
||
MODIFY COLUMN `status` char(10) NOT NULL
|
||
COMMENT '任务状态,10待执行,20等待重试,30开关关闭暂停,31配置不可用暂停,40重试耗尽,50成功,60订单已终态跳过';
|
||
|
||
-- 三B:task_type 已存在、仅 scene_biz_id 缺失(20260822 第二条任务表语句当时失败回滚,即
|
||
-- "Unknown column 'scene_biz_id'" 报错场景)。索引行同样按诊断二结果增删。
|
||
ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_task`
|
||
MODIFY COLUMN `task_type` char(10) NOT NULL DEFAULT '10'
|
||
COMMENT '任务场景,10用户免审售后,20过期预约退款,30过期未核销自动核销',
|
||
MODIFY COLUMN `status` char(10) NOT NULL
|
||
COMMENT '任务状态,10待执行,20等待重试,30开关关闭暂停,31配置不可用暂停,40重试耗尽,50成功,60订单已终态跳过',
|
||
ADD COLUMN `scene_biz_id` bigint(20)
|
||
GENERATED ALWAYS AS (CASE WHEN `task_type` IN ('20', '30') 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`);
|
||
|
||
-- 三C:scene_biz_id 已存在(20260822 完整生效),仅扩展生成列表达式和注释。
|
||
ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_task`
|
||
MODIFY COLUMN `task_type` char(10) NOT NULL DEFAULT '10'
|
||
COMMENT '任务场景,10用户免审售后,20过期预约退款,30过期未核销自动核销',
|
||
MODIFY COLUMN `status` char(10) NOT NULL
|
||
COMMENT '任务状态,10待执行,20等待重试,30开关关闭暂停,31配置不可用暂停,40重试耗尽,50成功,60订单已终态跳过',
|
||
MODIFY COLUMN `scene_biz_id` bigint(20)
|
||
GENERATED ALWAYS AS (CASE WHEN `task_type` IN ('20', '30') THEN `order_id` ELSE `after_sale_id` END) STORED
|
||
COMMENT '任务场景业务唯一值,系统生成,禁止业务代码写入';
|
||
|
||
-- 四、尝试日志注释更新。幂等,任何状态都可执行。
|
||
ALTER TABLE `pjcloudx_hardware`.`hard_auto_refund_attempt_log`
|
||
MODIFY COLUMN `result_status` char(10) NOT NULL
|
||
COMMENT '尝试结果,10执行中,20成功,30失败,40因开关关闭跳过,50订单已终态跳过',
|
||
MODIFY COLUMN `after_sale_id` bigint(20) DEFAULT NULL
|
||
COMMENT '售后单ID,过期退款和自动核销任务为空';
|
||
|
||
-- 【验收】生成列表达式应包含 '20' 和 '30',且配置表、订单表新列均已存在。
|
||
SELECT COLUMN_NAME, IFNULL(GENERATION_EXPRESSION, '') AS generation
|
||
FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = 'pjcloudx_hardware'
|
||
AND TABLE_NAME = 'hard_auto_refund_task'
|
||
AND COLUMN_NAME = 'scene_biz_id';
|