补充异常账户模型建表和规则元数据
This commit is contained in:
@@ -27,4 +27,21 @@ class CcdiAbnormalAccountRuleSqlMetadataTest {
|
|||||||
() -> assertTrue(sql.contains("'OBJECT'"))
|
() -> assertTrue(sql.contains("'OBJECT'"))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void abnormalAccountMetadataSql_shouldContainAccountInfoTableDefinition() throws IOException {
|
||||||
|
Path path = Path.of("..", "sql", "migration",
|
||||||
|
"2026-03-31-create-ccdi-account-info-and-abnormal-account-rules.sql");
|
||||||
|
|
||||||
|
assertTrue(Files.exists(path), "异常账户模型迁移脚本应存在");
|
||||||
|
|
||||||
|
String sql = Files.readString(path, StandardCharsets.UTF_8).toLowerCase();
|
||||||
|
assertAll(
|
||||||
|
() -> assertTrue(sql.contains("create table if not exists `ccdi_account_info`")),
|
||||||
|
() -> assertTrue(sql.contains("`account_no`")),
|
||||||
|
() -> assertTrue(sql.contains("`owner_type`")),
|
||||||
|
() -> assertTrue(sql.contains("`effective_date`")),
|
||||||
|
() -> assertTrue(sql.contains("`invalid_date`"))
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,23 @@ class CcdiBankTagRuleSqlMetadataTest {
|
|||||||
assertPhase2Metadata(migrationSql);
|
assertPhase2Metadata(migrationSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void abnormalAccountMetadataSql_shouldContainBusinessCaliberAndRuleRemark() throws IOException {
|
||||||
|
String migrationSql = readProjectFile("sql", "migration",
|
||||||
|
"2026-03-31-create-ccdi-account-info-and-abnormal-account-rules.sql");
|
||||||
|
|
||||||
|
assertAll(
|
||||||
|
() -> assertTrue(migrationSql.contains("员工本人账户已销户,且销户日前30天内仍存在交易记录。"),
|
||||||
|
"SUDDEN_ACCOUNT_CLOSURE 应使用设计文档中的业务口径"),
|
||||||
|
() -> assertTrue(migrationSql.contains("员工本人账户开户后长期未使用,首次启用后出现大额资金流动。"),
|
||||||
|
"DORMANT_ACCOUNT_LARGE_ACTIVATION 应使用设计文档中的业务口径"),
|
||||||
|
() -> assertTrue(migrationSql.contains("真实规则:识别员工本人账户销户前30天内仍有交易的员工对象"),
|
||||||
|
"SUDDEN_ACCOUNT_CLOSURE 应同步真实规则说明"),
|
||||||
|
() -> assertTrue(migrationSql.contains("真实规则:识别长期休眠后首次启用即出现大额资金流动的员工对象"),
|
||||||
|
"DORMANT_ACCOUNT_LARGE_ACTIVATION 应同步真实规则说明")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private void assertPhase1Metadata(String sqlContent) {
|
private void assertPhase1Metadata(String sqlContent) {
|
||||||
assertAll(
|
assertAll(
|
||||||
() -> assertTrue(sqlContent.contains("'FOREX_BUY_AMT'")
|
() -> assertTrue(sqlContent.contains("'FOREX_BUY_AMT'")
|
||||||
|
|||||||
@@ -1,5 +1,36 @@
|
|||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `ccdi_account_info` (
|
||||||
|
`account_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||||
|
`account_no` VARCHAR(240) NOT NULL COMMENT '账号',
|
||||||
|
`account_type` VARCHAR(64) DEFAULT NULL COMMENT '账户类型',
|
||||||
|
`account_name` VARCHAR(128) DEFAULT NULL COMMENT '账户名称',
|
||||||
|
`owner_type` VARCHAR(32) NOT NULL COMMENT '归属人类型',
|
||||||
|
`owner_id` VARCHAR(64) NOT NULL COMMENT '归属人标识',
|
||||||
|
`bank` VARCHAR(128) DEFAULT NULL COMMENT '开户行',
|
||||||
|
`bank_code` VARCHAR(64) DEFAULT NULL COMMENT '开户行编码',
|
||||||
|
`currency` VARCHAR(32) DEFAULT NULL COMMENT '币种',
|
||||||
|
`is_self_account` TINYINT DEFAULT 1 COMMENT '是否本人账户',
|
||||||
|
`monthly_avg_trans_count` DECIMAL(18, 2) DEFAULT NULL COMMENT '月均交易笔数',
|
||||||
|
`monthly_avg_trans_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '月均交易金额',
|
||||||
|
`trans_freq_type` VARCHAR(32) DEFAULT NULL COMMENT '交易频率类型',
|
||||||
|
`dr_max_single_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单笔支出金额',
|
||||||
|
`cr_max_single_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单笔收入金额',
|
||||||
|
`dr_max_daily_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单日支出金额',
|
||||||
|
`cr_max_daily_amount` DECIMAL(18, 2) DEFAULT NULL COMMENT '最大单日收入金额',
|
||||||
|
`trans_risk_level` VARCHAR(32) DEFAULT NULL COMMENT '交易风险等级',
|
||||||
|
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '账户状态:1正常,2已销户',
|
||||||
|
`effective_date` DATE DEFAULT NULL COMMENT '开户日期',
|
||||||
|
`invalid_date` DATE DEFAULT NULL COMMENT '销户日期',
|
||||||
|
`create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者',
|
||||||
|
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`update_by` VARCHAR(64) DEFAULT NULL COMMENT '更新者',
|
||||||
|
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
PRIMARY KEY (`account_id`),
|
||||||
|
KEY `idx_ccdi_account_info_owner` (`owner_type`, `owner_id`),
|
||||||
|
KEY `idx_ccdi_account_info_account_no` (`account_no`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工账户信息表';
|
||||||
|
|
||||||
INSERT INTO ccdi_bank_tag_rule (
|
INSERT INTO ccdi_bank_tag_rule (
|
||||||
model_code,
|
model_code,
|
||||||
model_name,
|
model_name,
|
||||||
@@ -16,10 +47,10 @@ INSERT INTO ccdi_bank_tag_rule (
|
|||||||
) VALUES
|
) VALUES
|
||||||
('ABNORMAL_ACCOUNT', '异常账户', 'SUDDEN_ACCOUNT_CLOSURE', '突然销户', NULL, 'OBJECT', 'HIGH',
|
('ABNORMAL_ACCOUNT', '异常账户', 'SUDDEN_ACCOUNT_CLOSURE', '突然销户', NULL, 'OBJECT', 'HIGH',
|
||||||
'员工本人账户已销户,且销户日前30天内仍存在交易记录。', 1, 10, 'system',
|
'员工本人账户已销户,且销户日前30天内仍存在交易记录。', 1, 10, 'system',
|
||||||
'异常账户模型规则骨架,后续补充建表与完整业务口径'),
|
'真实规则:识别员工本人账户销户前30天内仍有交易的员工对象'),
|
||||||
('ABNORMAL_ACCOUNT', '异常账户', 'DORMANT_ACCOUNT_LARGE_ACTIVATION', '休眠账户大额启用', NULL, 'OBJECT', 'HIGH',
|
('ABNORMAL_ACCOUNT', '异常账户', 'DORMANT_ACCOUNT_LARGE_ACTIVATION', '休眠账户大额启用', NULL, 'OBJECT', 'HIGH',
|
||||||
'员工本人账户开户后长期未使用,首次启用后出现大额资金流动。', 1, 20, 'system',
|
'员工本人账户开户后长期未使用,首次启用后出现大额资金流动。', 1, 20, 'system',
|
||||||
'异常账户模型规则骨架,后续补充建表与完整业务口径')
|
'真实规则:识别长期休眠后首次启用即出现大额资金流动的员工对象')
|
||||||
ON DUPLICATE KEY UPDATE
|
ON DUPLICATE KEY UPDATE
|
||||||
model_code = VALUES(model_code),
|
model_code = VALUES(model_code),
|
||||||
model_name = VALUES(model_name),
|
model_name = VALUES(model_name),
|
||||||
|
|||||||
Reference in New Issue
Block a user