完成账户库管理功能开发与验收

This commit is contained in:
wjj
2026-04-14 10:16:16 +08:00
parent 9c22e8a3ce
commit 1bb24ab0a2
32 changed files with 4825 additions and 15 deletions

View 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 ;

View File

@@ -0,0 +1,381 @@
-- 账户库管理菜单
-- 挂载到“信息维护”目录下,可重复执行
SET @parent_menu_id = (
SELECT menu_id
FROM sys_menu
WHERE menu_name = '信息维护'
AND parent_id = 0
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
update_by,
update_time,
remark
)
SELECT
'账户库管理',
@parent_menu_id,
11,
'accountInfo',
'ccdiAccountInfo/index',
1,
0,
'C',
'0',
'0',
'ccdi:accountInfo:list',
'documentation',
'admin',
NOW(),
'',
NULL,
'账户库管理菜单'
FROM dual
WHERE @parent_menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @parent_menu_id
AND path = 'accountInfo'
);
SET @menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @parent_menu_id
AND path = 'accountInfo'
LIMIT 1
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
remark
)
SELECT '账户查询', @menu_id, 1, '', '', 1, 0, 'F', '0', '0', 'ccdi:accountInfo:query', '#', 'admin', NOW(), ''
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:query'
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
remark
)
SELECT '账户新增', @menu_id, 2, '', '', 1, 0, 'F', '0', '0', 'ccdi:accountInfo:add', '#', 'admin', NOW(), ''
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:add'
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
remark
)
SELECT '账户修改', @menu_id, 3, '', '', 1, 0, 'F', '0', '0', 'ccdi:accountInfo:edit', '#', 'admin', NOW(), ''
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:edit'
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
remark
)
SELECT '账户删除', @menu_id, 4, '', '', 1, 0, 'F', '0', '0', 'ccdi:accountInfo:remove', '#', 'admin', NOW(), ''
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:remove'
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
remark
)
SELECT '账户导入', @menu_id, 5, '', '', 1, 0, 'F', '0', '0', 'ccdi:accountInfo:import', '#', 'admin', NOW(), ''
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:import'
);
INSERT INTO sys_menu (
menu_name,
parent_id,
order_num,
path,
component,
is_frame,
is_cache,
menu_type,
visible,
status,
perms,
icon,
create_by,
create_time,
remark
)
SELECT '账户导出', @menu_id, 6, '', '', 1, 0, 'F', '0', '0', 'ccdi:accountInfo:export', '#', 'admin', NOW(), ''
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:export'
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_id
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = @menu_id
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1,
(
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:query'
LIMIT 1
)
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:query'
LIMIT 1
)
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1,
(
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:import'
LIMIT 1
)
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:import'
LIMIT 1
)
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1,
(
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:export'
LIMIT 1
)
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:export'
LIMIT 1
)
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1,
(
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:add'
LIMIT 1
)
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:add'
LIMIT 1
)
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1,
(
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:edit'
LIMIT 1
)
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:edit'
LIMIT 1
)
);
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1,
(
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:remove'
LIMIT 1
)
FROM dual
WHERE @menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM sys_role_menu
WHERE role_id = 1
AND menu_id = (
SELECT menu_id
FROM sys_menu
WHERE parent_id = @menu_id
AND perms = 'ccdi:accountInfo:remove'
LIMIT 1
)
);

View File

@@ -0,0 +1,6 @@
UPDATE ccdi_account_info
SET
account_name = '测试员工A行外卡',
bank = '杭州联合银行城东支行',
update_by = 'system'
WHERE account_no = '622202440000010001';

View File

@@ -0,0 +1,274 @@
-- Seed account test data for external scenarios.
-- Covers EMPLOYEE / RELATION / INTERMEDIARY / EXTERNAL owner types.
INSERT INTO ccdi_account_info (
account_no,
account_type,
bank_scope,
account_name,
owner_type,
owner_id,
bank,
bank_code,
currency,
status,
effective_date,
invalid_date,
create_by,
update_by
)
SELECT
'622202440000010001',
'BANK',
'EXTERNAL',
'测试员工A行外卡',
'EMPLOYEE',
'330101199001010001',
'杭州联合银行城东支行',
'HZLH001',
'CNY',
1,
'2026-04-13',
NULL,
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_info WHERE account_no = '622202440000010001'
);
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,
update_by
)
SELECT
'622202440000010001',
1,
12,
28600.00,
'MEDIUM',
8800.00,
12000.00,
16000.00,
22000.00,
'MEDIUM',
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_result WHERE account_no = '622202440000010001'
);
INSERT INTO ccdi_account_info (
account_no,
account_type,
bank_scope,
account_name,
owner_type,
owner_id,
bank,
bank_code,
currency,
status,
effective_date,
invalid_date,
create_by,
update_by
)
SELECT
'ZQ330101199104010101',
'SECURITIES',
'EXTERNAL',
'边界配偶甲',
'RELATION',
'330101199104010101',
'国泰君安杭州营业部',
'GTJAHZ01',
'CNY',
1,
'2026-04-13',
NULL,
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_info WHERE account_no = 'ZQ330101199104010101'
);
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,
update_by
)
SELECT
'ZQ330101199104010101',
0,
6,
152000.00,
'LOW',
68000.00,
72000.00,
98000.00,
116000.00,
'HIGH',
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_result WHERE account_no = 'ZQ330101199104010101'
);
INSERT INTO ccdi_account_info (
account_no,
account_type,
bank_scope,
account_name,
owner_type,
owner_id,
bank,
bank_code,
currency,
status,
effective_date,
invalid_date,
create_by,
update_by
)
SELECT
'13700000035',
'PAYMENT',
'EXTERNAL',
'模型异常中介',
'INTERMEDIARY',
'330101197901010055',
'支付宝',
'ALIPAY',
'CNY',
1,
'2026-04-13',
NULL,
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_info WHERE account_no = '13700000035'
);
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,
update_by
)
SELECT
'13700000035',
0,
18,
46800.00,
'MEDIUM',
9000.00,
13800.00,
18800.00,
21600.00,
'LOW',
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_result WHERE account_no = '13700000035'
);
INSERT INTO ccdi_account_info (
account_no,
account_type,
bank_scope,
account_name,
owner_type,
owner_id,
bank,
bank_code,
currency,
status,
effective_date,
invalid_date,
create_by,
update_by
)
SELECT
'wx-ext-20260413-001',
'OTHER',
'EXTERNAL',
'外部合作机构测试',
'EXTERNAL',
'91330100EXT20260413',
'微信支付',
'WXPAY',
'CNY',
1,
'2026-04-13',
NULL,
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_info WHERE account_no = 'wx-ext-20260413-001'
);
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,
update_by
)
SELECT
'wx-ext-20260413-001',
0,
9,
9800.00,
'LOW',
3200.00,
4100.00,
5600.00,
7000.00,
'LOW',
'system',
'system'
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM ccdi_account_result WHERE account_no = 'wx-ext-20260413-001'
);