# 与客户之间非正常资金往来实施记录

## 本次修改

- 调整 `ABNORMAL_CUSTOMER_TRANSACTION` 模型执行 SQL。
- 调整“涉疑交易明细 -> 名单库命中” SQL。
- 调整涉疑交易明细前端标签展示。
- 补充 SQL 口径测试，不改表结构。

## 模型 SQL 口径

- 位置：`ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
- 主体范围：员工本人、`ccdi_staff_fmy_relation.status = 1` 的有效亲属。
- 金额口径：`GREATEST(IFNULL(amount_dr, 0), IFNULL(amount_cr, 0)) > 1000`。
- 信贷客户命中：对手方账号命中 `ccdi_account_info.owner_type = 'CREDIT_CUSTOMER'`。
- 中介账号命中：对手方账号命中 `ccdi_account_info.owner_type = 'INTERMEDIARY'`。
- 中介企业命中：对手方名称精确命中 `ccdi_enterprise_base_info.enterprise_name`，且企业来源为中介。
- 中介人员精确命中：对手方名称精确命中 `ccdi_biz_intermediary.name`。
- 中介人员模糊命中：对手方名称包含 `ccdi_biz_intermediary.name`，仅限 `bank in ('ALIPAY', 'WECHAT')`。
- 明确不再使用对手方证件号、对手方统一社会信用代码命中。

## 名单库命中口径

- 位置：`ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml`
- 信贷客户账号命中时，`nameListHitType` 返回“信贷客户”。
- 中介账号、人员名称、企业名称命中时，`nameListHitType` 返回“中介”。
- 名单库命中同样要求交易金额大于 1000。
- 涉疑交易明细和 PDF 导出按 `bank_statement_id` 聚合，避免同一流水因“模型规则命中”和“名单库命中”重复展示。

## 前端展示

- 位置：`ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue`
- `ABNORMAL_CUSTOMER_TRANSACTION` 在异常标签中优先展示。
- 如果同一流水名单库类型为“中介”，该标签展示为“疑似与中介往来”。
- 如果同一流水名单库类型为“信贷客户”，该标签展示为“与信贷客户之间非正常资金往来”。
- 如果没有名单库类型，兜底展示为“与客户之间非正常资金往来”。
- 不再把“中介/信贷客户”追加成额外异常标签，避免重复展示。

## 报告展示

- 结果总览 PDF 报告中的涉疑交易明细表同步使用上述标签展示口径。
- 同一条流水只替换 `ABNORMAL_CUSTOMER_TRANSACTION` 的展示文案，不额外追加“中介/信贷客户”标签。

## 影响文件

- `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankTagAnalysisMapper.xml`
- `ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml`
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/vo/CcdiProjectSuspiciousTransactionItemVO.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiBankTagAnalysisMapperXmlTest.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapperSqlTest.java`
- `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue`
- `docs/reports/implementation/2026-05-21-abnormal-customer-transaction-implementation.md`

## 验证情况

- `mvn -pl ccdi-project -am -DskipTests compile` 通过。
- `mvn -pl ccdi-project "-Dtest=CcdiBankTagAnalysisMapperXmlTest,CcdiProjectOverviewMapperSqlTest" test` 通过，21 个测试。
- 测试覆盖的伪造场景口径：
  - 信贷客户账号命中。
  - 中介账号命中。
  - 中介人员名称精确命中。
  - 中介人员名称模糊命中仅限 `ALIPAY/WECHAT`。
  - 名单库命中金额门槛大于 1000。
  - 涉疑交易明细按 `bank_statement_id` 聚合去重。
  - 涉疑交易明细和 PDF 报告按名单库类型细分展示异常标签，且不重复展示。
