完成账户库管理功能开发与验收
This commit is contained in:
145
sql/migration/2026-04-10-split-ccdi-account-info.sql
Normal file
145
sql/migration/2026-04-10-split-ccdi-account-info.sql
Normal file
@@ -0,0 +1,145 @@
|
||||
-- 拆分账户信息表:账户基础信息保留在 ccdi_account_info,动态交易画像迁移到 ccdi_account_result。
|
||||
-- 执行说明:涉及中文内容时请使用 bin/mysql_utf8_exec.sh 执行,确保会话字符集为 utf8mb4。
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `ccdi_account_result` (
|
||||
`result_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键,唯一标识',
|
||||
`account_no` VARCHAR(240) NOT NULL COMMENT '账户号码(加密存储)',
|
||||
`is_self_account` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否本人实控账户:0-否 1-是',
|
||||
`monthly_avg_trans_count` INT DEFAULT 0 COMMENT '近6个月平均交易笔数',
|
||||
`monthly_avg_trans_amount` DECIMAL(18,2) DEFAULT 0.00 COMMENT '近6个月平均交易金额',
|
||||
`trans_freq_type` VARCHAR(20) DEFAULT 'MEDIUM' COMMENT 'LOW:低频, MEDIUM:中频, HIGH:高频',
|
||||
`dr_max_single_amount` DECIMAL(18,2) COMMENT '借方单笔交易最高额',
|
||||
`cr_max_single_amount` DECIMAL(18,2) COMMENT '贷方单笔交易最高额',
|
||||
`dr_max_daily_amount` DECIMAL(18,2) COMMENT '借方日累计交易最高额',
|
||||
`cr_max_daily_amount` DECIMAL(18,2) COMMENT '贷方日累计交易最高额',
|
||||
`trans_risk_level` VARCHAR(10) DEFAULT 'LOW' COMMENT '交易风险等级',
|
||||
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者',
|
||||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`result_id`),
|
||||
UNIQUE KEY `uk_ccdi_account_result_account_no` (`account_no`),
|
||||
KEY `idx_ccdi_account_result_risk_level` (`trans_risk_level`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账户结果表';
|
||||
|
||||
DELIMITER //
|
||||
|
||||
DROP PROCEDURE IF EXISTS `migrate_ccdi_account_info_split`//
|
||||
CREATE PROCEDURE `migrate_ccdi_account_info_split`()
|
||||
BEGIN
|
||||
DECLARE dynamic_column_count INT DEFAULT 0;
|
||||
|
||||
SELECT COUNT(*)
|
||||
INTO dynamic_column_count
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'ccdi_account_info'
|
||||
AND COLUMN_NAME IN (
|
||||
'is_self_account',
|
||||
'monthly_avg_trans_count',
|
||||
'monthly_avg_trans_amount',
|
||||
'trans_freq_type',
|
||||
'dr_max_single_amount',
|
||||
'cr_max_single_amount',
|
||||
'dr_max_daily_amount',
|
||||
'cr_max_daily_amount',
|
||||
'trans_risk_level'
|
||||
);
|
||||
|
||||
IF dynamic_column_count = 9 THEN
|
||||
INSERT INTO `ccdi_account_result` (
|
||||
`account_no`,
|
||||
`is_self_account`,
|
||||
`monthly_avg_trans_count`,
|
||||
`monthly_avg_trans_amount`,
|
||||
`trans_freq_type`,
|
||||
`dr_max_single_amount`,
|
||||
`cr_max_single_amount`,
|
||||
`dr_max_daily_amount`,
|
||||
`cr_max_daily_amount`,
|
||||
`trans_risk_level`,
|
||||
`create_by`,
|
||||
`create_time`,
|
||||
`update_by`,
|
||||
`update_time`
|
||||
)
|
||||
SELECT
|
||||
`account_no`,
|
||||
COALESCE(`is_self_account`, 1),
|
||||
COALESCE(CAST(`monthly_avg_trans_count` AS SIGNED), 0),
|
||||
COALESCE(`monthly_avg_trans_amount`, 0.00),
|
||||
COALESCE(`trans_freq_type`, 'MEDIUM'),
|
||||
`dr_max_single_amount`,
|
||||
`cr_max_single_amount`,
|
||||
`dr_max_daily_amount`,
|
||||
`cr_max_daily_amount`,
|
||||
COALESCE(`trans_risk_level`, 'LOW'),
|
||||
`create_by`,
|
||||
COALESCE(`create_time`, CURRENT_TIMESTAMP),
|
||||
`update_by`,
|
||||
COALESCE(`update_time`, CURRENT_TIMESTAMP)
|
||||
FROM `ccdi_account_info`
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`is_self_account` = VALUES(`is_self_account`),
|
||||
`monthly_avg_trans_count` = VALUES(`monthly_avg_trans_count`),
|
||||
`monthly_avg_trans_amount` = VALUES(`monthly_avg_trans_amount`),
|
||||
`trans_freq_type` = VALUES(`trans_freq_type`),
|
||||
`dr_max_single_amount` = VALUES(`dr_max_single_amount`),
|
||||
`cr_max_single_amount` = VALUES(`cr_max_single_amount`),
|
||||
`dr_max_daily_amount` = VALUES(`dr_max_daily_amount`),
|
||||
`cr_max_daily_amount` = VALUES(`cr_max_daily_amount`),
|
||||
`trans_risk_level` = VALUES(`trans_risk_level`),
|
||||
`update_by` = VALUES(`update_by`),
|
||||
`update_time` = VALUES(`update_time`);
|
||||
|
||||
ALTER TABLE `ccdi_account_info`
|
||||
DROP COLUMN `is_self_account`,
|
||||
DROP COLUMN `monthly_avg_trans_count`,
|
||||
DROP COLUMN `monthly_avg_trans_amount`,
|
||||
DROP COLUMN `trans_freq_type`,
|
||||
DROP COLUMN `dr_max_single_amount`,
|
||||
DROP COLUMN `cr_max_single_amount`,
|
||||
DROP COLUMN `dr_max_daily_amount`,
|
||||
DROP COLUMN `cr_max_daily_amount`,
|
||||
DROP COLUMN `trans_risk_level`;
|
||||
ELSEIF dynamic_column_count <> 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = 'ccdi_account_info dynamic columns are partially migrated; please check schema before running this migration.';
|
||||
END IF;
|
||||
END//
|
||||
|
||||
CALL `migrate_ccdi_account_info_split`()//
|
||||
DROP PROCEDURE IF EXISTS `migrate_ccdi_account_info_split`//
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER //
|
||||
|
||||
DROP PROCEDURE IF EXISTS `add_ccdi_account_info_bank_scope`//
|
||||
CREATE PROCEDURE `add_ccdi_account_info_bank_scope`()
|
||||
BEGIN
|
||||
DECLARE column_count INT DEFAULT 0;
|
||||
|
||||
SELECT COUNT(*)
|
||||
INTO column_count
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'ccdi_account_info'
|
||||
AND COLUMN_NAME = 'bank_scope';
|
||||
|
||||
IF column_count = 0 THEN
|
||||
ALTER TABLE `ccdi_account_info`
|
||||
ADD COLUMN `bank_scope` VARCHAR(20) NOT NULL DEFAULT 'INTERNAL' COMMENT '账户范围:INTERNAL-行内,EXTERNAL-行外'
|
||||
AFTER `account_type`;
|
||||
END IF;
|
||||
|
||||
UPDATE `ccdi_account_info`
|
||||
SET `bank_scope` = 'INTERNAL'
|
||||
WHERE `bank_scope` IS NULL
|
||||
OR `bank_scope` = '';
|
||||
END//
|
||||
|
||||
CALL `add_ccdi_account_info_bank_scope`()//
|
||||
DROP PROCEDURE IF EXISTS `add_ccdi_account_info_bank_scope`//
|
||||
|
||||
DELIMITER ;
|
||||
Reference in New Issue
Block a user