Files
biz-api-cloud-zax/db/20260914_add_mch_auto_verify.sql
T

123 lines
8.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 每日菜谱预约订单过期未核销自动核销。
-- 前置条件: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';