补充异常账户模型规则骨架

This commit is contained in:
wkc
2026-03-31 16:28:37 +08:00
parent f4a72a6110
commit 988c2d3572
6 changed files with 123 additions and 0 deletions

View File

@@ -292,6 +292,22 @@ public interface CcdiBankTagAnalysisMapper {
*/
List<BankTagObjectHitVO> selectSalaryUnusedObjects(@Param("projectId") Long projectId);
/**
* 突然销户
*
* @param projectId 项目ID
* @return 对象命中结果
*/
List<BankTagObjectHitVO> selectSuddenAccountClosureObjects(@Param("projectId") Long projectId);
/**
* 休眠账户大额启用
*
* @param projectId 项目ID
* @return 对象命中结果
*/
List<BankTagObjectHitVO> selectDormantAccountLargeActivationObjects(@Param("projectId") Long projectId);
/**
* 大额炒股
*

View File

@@ -288,6 +288,8 @@ public class CcdiBankTagServiceImpl implements ICcdiBankTagService {
case "WITHDRAW_AMT" -> analysisMapper.selectWithdrawAmtObjects(projectId);
case "SALARY_QUICK_TRANSFER" -> analysisMapper.selectSalaryQuickTransferObjects(projectId);
case "SALARY_UNUSED" -> analysisMapper.selectSalaryUnusedObjects(projectId);
case "SUDDEN_ACCOUNT_CLOSURE" -> analysisMapper.selectSuddenAccountClosureObjects(projectId);
case "DORMANT_ACCOUNT_LARGE_ACTIVATION" -> analysisMapper.selectDormantAccountLargeActivationObjects(projectId);
case "PROXY_ACCOUNT_OPERATION" -> analysisMapper.selectProxyAccountOperationObjects(projectId);
default -> List.of();
};

View File

@@ -406,6 +406,38 @@ class CcdiBankTagServiceImplTest {
verify(analysisMapper).selectSalaryUnusedObjects(40L);
}
@Test
void rebuildProject_shouldDispatchSuddenAccountClosureObjectRule() {
ReflectionTestUtils.setField(service, "tagRuleExecutor", (Executor) Runnable::run);
CcdiBankTagRule rule = buildRule("ABNORMAL_ACCOUNT", "异常账户",
"SUDDEN_ACCOUNT_CLOSURE", "突然销户", "OBJECT");
when(ruleMapper.selectEnabledRules("ABNORMAL_ACCOUNT")).thenReturn(List.of(rule));
when(configResolver.resolve(40L, rule)).thenReturn(buildConfig(40L, rule));
when(analysisMapper.selectSuddenAccountClosureObjects(40L)).thenReturn(List.of());
service.rebuildProject(40L, "ABNORMAL_ACCOUNT", "admin", TriggerType.MANUAL);
verify(analysisMapper).selectSuddenAccountClosureObjects(40L);
}
@Test
void rebuildProject_shouldDispatchDormantAccountLargeActivationObjectRule() {
ReflectionTestUtils.setField(service, "tagRuleExecutor", (Executor) Runnable::run);
CcdiBankTagRule rule = buildRule("ABNORMAL_ACCOUNT", "异常账户",
"DORMANT_ACCOUNT_LARGE_ACTIVATION", "休眠账户大额启用", "OBJECT");
when(ruleMapper.selectEnabledRules("ABNORMAL_ACCOUNT")).thenReturn(List.of(rule));
when(configResolver.resolve(40L, rule)).thenReturn(buildConfig(40L, rule));
when(analysisMapper.selectDormantAccountLargeActivationObjects(40L)).thenReturn(List.of());
service.rebuildProject(40L, "ABNORMAL_ACCOUNT", "admin", TriggerType.MANUAL);
verify(analysisMapper).selectDormantAccountLargeActivationObjects(40L);
}
private CcdiBankTagRule buildRule(String modelCode, String modelName, String ruleCode, String ruleName, String resultType) {
CcdiBankTagRule rule = new CcdiBankTagRule();
rule.setModelCode(modelCode);

View File

@@ -0,0 +1,30 @@
package com.ruoyi.ccdi.project.sql;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertTrue;
class CcdiAbnormalAccountRuleSqlMetadataTest {
@Test
void abnormalAccountMetadataSql_shouldContainModelAndRuleDefinitions() 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);
assertAll(
() -> assertTrue(sql.contains("ABNORMAL_ACCOUNT")),
() -> assertTrue(sql.contains("SUDDEN_ACCOUNT_CLOSURE")),
() -> assertTrue(sql.contains("DORMANT_ACCOUNT_LARGE_ACTIVATION")),
() -> assertTrue(sql.contains("'OBJECT'"))
);
}
}