136 lines
7.4 KiB
SQL
136 lines
7.4 KiB
SQL
-- 充值/扣款申请「预约执行时间」功能:预约到点的申请由定时任务统一执行(扫描模式,10 分钟一轮)。
|
|
-- 幂等迁移脚本:可反复执行。每个字段/索引先查 information_schema,已存在则跳过(执行 SELECT 1 占位),
|
|
-- 不存在才执行 DDL;部分应用过的库重跑不会报 Duplicate column / Duplicate key。
|
|
-- 配套定时任务注册与菜单权限见 db/20260924_钱包预约执行定时任务.txt。
|
|
|
|
-- 【可选诊断】充值申请表当前是否已含预约执行相关列。
|
|
SELECT COLUMN_NAME
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet'
|
|
AND TABLE_NAME = 'wallet_recharge_apply'
|
|
AND COLUMN_NAME IN ('reserve_flag', 'reserve_time', 'exec_status', 'exec_time', 'exec_count',
|
|
'next_exec_time', 'last_error', 'claim_time')
|
|
ORDER BY ORDINAL_POSITION;
|
|
|
|
-- 一、wallet_recharge_apply 预约执行列(各自独立判断)。
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `reserve_flag` char(1) NOT NULL DEFAULT ''0'' COMMENT ''预约执行开关,0关闭,1开启'' AFTER `is_authorization`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'reserve_flag');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `reserve_time` datetime DEFAULT NULL COMMENT ''预约执行时间,reserve_flag=1 时必填'' AFTER `reserve_flag`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'reserve_time');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `exec_status` char(2) DEFAULT NULL COMMENT ''预约执行状态,10待执行,20执行成功,25执行中,30待重试,40重试耗尽;reserve_flag=0 时为空'' AFTER `reserve_time`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'exec_status');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `exec_time` datetime DEFAULT NULL COMMENT ''预约执行实际完成时间'' AFTER `exec_status`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'exec_time');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `exec_count` int(11) NOT NULL DEFAULT 0 COMMENT ''预约执行已尝试次数'' AFTER `exec_time`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'exec_count');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `next_exec_time` datetime DEFAULT NULL COMMENT ''下次该执行或重试时间,审批通过时初始化为 reserve_time'' AFTER `exec_count`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'next_exec_time');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `last_error` varchar(512) DEFAULT NULL COMMENT ''预约执行最近一次失败原因'' AFTER `next_exec_time`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'last_error');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD COLUMN `claim_time` datetime DEFAULT NULL COMMENT ''执行抢占时间,用于执行中卡死恢复'' AFTER `last_error`',
|
|
'SELECT 1')
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME = 'claim_time');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 二、扫描索引:缺失才创建。供跨租户扫描「待执行/待重试且到期」的申请。
|
|
SET @ddl = (SELECT IF(COUNT(*) = 0,
|
|
'ALTER TABLE `pjcloudx_wallet`.`wallet_recharge_apply` ADD KEY `idx_wra_reserve_scan` (`exec_status`, `next_exec_time`)',
|
|
'SELECT 1')
|
|
FROM information_schema.STATISTICS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet' AND TABLE_NAME = 'wallet_recharge_apply' AND INDEX_NAME = 'idx_wra_reserve_scan');
|
|
PREPARE stmt FROM @ddl;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 三、预约执行对账差异表:只存差异记录,正常数据不产生行。
|
|
CREATE TABLE IF NOT EXISTS `pjcloudx_wallet`.`wallet_recharge_exec_check`
|
|
(
|
|
id bigint NOT NULL COMMENT '主键ID',
|
|
apply_id bigint NOT NULL COMMENT '充值/扣款申请ID',
|
|
import_id bigint NOT NULL DEFAULT 0 COMMENT '充值导入明细ID,0表示申请单级差异',
|
|
user_id bigint DEFAULT NULL COMMENT '涉及用户ID',
|
|
diff_type char(2) NOT NULL COMMENT '差异类型,1明细缺流水,2流水重复,3金额不符,4无钱包被跳过,5执行卡死,6重试耗尽',
|
|
expected_price int DEFAULT NULL COMMENT '预期金额,单位分',
|
|
actual_price int DEFAULT NULL COMMENT '实际流水金额,单位分',
|
|
check_time datetime NOT NULL COMMENT '检查时间',
|
|
status char(2) NOT NULL DEFAULT '10' COMMENT '处理状态,10待处理,20人工已处理,30已自动恢复',
|
|
handle_by varchar(64) DEFAULT NULL COMMENT '处理人',
|
|
handle_time datetime DEFAULT NULL COMMENT '处理时间',
|
|
handle_remark varchar(512) DEFAULT NULL COMMENT '处理备注',
|
|
create_by varchar(64) DEFAULT NULL COMMENT '创建人',
|
|
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
|
update_by varchar(64) DEFAULT NULL COMMENT '修改人',
|
|
update_time datetime DEFAULT NULL COMMENT '修改时间',
|
|
del_flag char(1) DEFAULT '0' COMMENT '删除标记',
|
|
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uk_wrec_diff (apply_id, import_id, diff_type, del_flag),
|
|
KEY idx_wrec_status_check (status, check_time)
|
|
) ENGINE = InnoDB
|
|
DEFAULT CHARSET = utf8mb4
|
|
COLLATE = utf8mb4_general_ci COMMENT = '充值扣款预约执行对账差异表';
|
|
|
|
-- 【验收】八列、扫描索引、差异表均应存在。
|
|
SELECT TABLE_NAME, COLUMN_NAME
|
|
FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = 'pjcloudx_wallet'
|
|
AND ((TABLE_NAME = 'wallet_recharge_apply' AND COLUMN_NAME IN ('reserve_flag', 'reserve_time', 'exec_status',
|
|
'exec_time', 'exec_count', 'next_exec_time', 'last_error', 'claim_time'))
|
|
OR (TABLE_NAME = 'wallet_recharge_exec_check' AND COLUMN_NAME = 'diff_type'));
|
|
|
|
SET @ddl = NULL;
|