放开涉疑交易流水级模型命中

This commit is contained in:
wjj
2026-06-01 16:44:51 +08:00
parent 4c2ea9d8e6
commit aef6c43181
3 changed files with 43 additions and 6 deletions

View File

@@ -531,10 +531,6 @@
from ccdi_bank_statement_tag_result tr
where tr.project_id = #{query.projectId}
and tr.bank_statement_id is not null
and (
tr.rule_name like '%可疑%'
or tr.rule_code = 'ABNORMAL_CUSTOMER_TRANSACTION'
)
</sql>
<sql id="suspiciousTransactionNameHitSql">
@@ -717,7 +713,7 @@
</sql>
<select id="selectSuspiciousTransactionPage" resultMap="SuspiciousTransactionItemResultMap">
<!-- rule_name like '%可疑%' -->
<!-- ccdi_bank_statement_tag_result -->
<!-- ccdi_biz_intermediary -->
<!-- ccdi_enterprise_base_info -->
<!-- group by merged.bankStatementId -->

View File

@@ -90,11 +90,17 @@ class CcdiProjectOverviewMapperSqlTest {
void shouldExposeSuspiciousTransactionAggregationQuery() throws Exception {
String xml = Files.readString(Path.of("src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml"));
String suspiciousSql = extractSelect(xml, "selectSuspiciousTransactionPage");
String modelHitSql = extractSqlFragment(xml, "suspiciousTransactionModelHitSql");
String aggregatedSql = extractSqlFragment(xml, "suspiciousTransactionAggregatedSql");
assertTrue(suspiciousSql.contains("rule_name like '%可疑%'"), suspiciousSql);
assertTrue(modelHitSql.contains("from ccdi_bank_statement_tag_result tr"), modelHitSql);
assertTrue(modelHitSql.contains("tr.bank_statement_id is not null"), modelHitSql);
assertFalse(modelHitSql.contains("rule_name like '%可疑%'"), modelHitSql);
assertFalse(modelHitSql.contains("ABNORMAL_CUSTOMER_TRANSACTION"), modelHitSql);
assertTrue(suspiciousSql.contains("ccdi_biz_intermediary"), suspiciousSql);
assertTrue(suspiciousSql.contains("ccdi_enterprise_base_info"), suspiciousSql);
assertTrue(suspiciousSql.contains("group by merged.bankStatementId"), suspiciousSql);
assertTrue(aggregatedSql.contains("lpad(merged.matchPriority, 2, '0')"), aggregatedSql);
assertTrue(suspiciousSql.contains("hasModelRuleHit"), suspiciousSql);
assertTrue(suspiciousSql.contains("hasNameListHit"), suspiciousSql);
assertTrue(suspiciousSql.contains("final_result.nameListHitType"), suspiciousSql);

View File

@@ -0,0 +1,35 @@
# 涉疑交易明细模型命中范围调整实施记录
## 背景
风险明细模块的「涉疑交易」列表此前在模型规则命中部分限制为 `rule_name like '%可疑%'`,并额外包含 `ABNORMAL_CUSTOMER_TRANSACTION`。该口径会导致大额单笔、短时间多笔存现等已有流水级命中模型无法进入涉疑交易明细。
本次确认的业务口径为:涉疑交易明细应放开展示所有流水级模型命中;名单库命中只在同一笔流水同时命中时优先展示匹配对象和标签,不作为模型命中的过滤条件。
## 修改内容
- 调整 `CcdiProjectOverviewMapper.xml``suspiciousTransactionModelHitSql`
- 保留 `tr.project_id = #{query.projectId}`
- 保留 `tr.bank_statement_id is not null`,仅展示可落到具体流水的命中。
- 删除 `rule_name like '%可疑%'``tr.rule_code = 'ABNORMAL_CUSTOMER_TRANSACTION'` 限制。
- 保持名单库命中逻辑不变:
- 信贷客户账号命中优先级为 1。
- 中介账号、姓名、企业名称命中按原 `matchPriority` 聚合。
- 同一笔流水既有模型命中又有名单命中时,`suspiciousPersonName``nameListHitType` 仍优先取名单命中结果。
- 更新 SQL 单测,明确校验模型命中范围已放开,并校验名单命中优先级聚合逻辑仍存在。
## 影响范围
- 影响页面:项目详情风险明细模块的「涉疑交易」列表及导出。
- 影响数据范围:所有 `ccdi_bank_statement_tag_result.bank_statement_id is not null` 的流水级规则命中均可进入涉疑交易明细。
- 不影响对象级命中:`bank_statement_id is null` 的员工/家庭/资产等对象级结果仍不会进入该流水明细列表。
- 不影响名单库命中阈值和匹配规则。
## 验证
- 已执行 `mvn -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest test`,结果通过:`Tests run: 7, Failures: 0, Errors: 0, Skipped: 0`
- 验证点:
- `suspiciousTransactionModelHitSql` 不再包含 `rule_name like '%可疑%'`
- `suspiciousTransactionModelHitSql` 不再包含 `ABNORMAL_CUSTOMER_TRANSACTION` 单规则特例。
- `suspiciousTransactionModelHitSql` 保留 `tr.bank_statement_id is not null`
- 聚合 SQL 保留基于 `matchPriority` 的名单命中优先展示逻辑。