From 6d90bb4e58ea58b956df3f6c58da736b35ab1b0f Mon Sep 17 00:00:00 2001 From: wjj <2069666735@qq.com> Date: Thu, 16 Jul 2026 15:26:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A0=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E6=B6=89=E7=96=91=E4=BA=A4=E6=98=93=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...iProjectSuspiciousTransactionQueryDTO.java | 3 + .../mapper/CcdiProjectOverviewMapper.java | 8 +++ .../impl/CcdiProjectOverviewServiceImpl.java | 48 +++++++++++++- .../project/CcdiProjectOverviewMapper.xml | 56 ++++++++++------ .../CcdiProjectOverviewMapperSqlTest.java | 7 ++ ...rviewServiceSuspiciousTransactionTest.java | 65 +++++++++++++++++++ ...al-short-circuit-backend-implementation.md | 25 +++++++ ...s-external-short-circuit-implementation.md | 40 ++++++++++++ 8 files changed, 232 insertions(+), 20 deletions(-) create mode 100644 docs/plans/backend/2026-07-16-suspicious-transactions-external-short-circuit-backend-implementation.md create mode 100644 docs/reports/implementation/2026-07-16-suspicious-transactions-external-short-circuit-implementation.md diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectSuspiciousTransactionQueryDTO.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectSuspiciousTransactionQueryDTO.java index 2babf192..d2d1a3f3 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectSuspiciousTransactionQueryDTO.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/dto/CcdiProjectSuspiciousTransactionQueryDTO.java @@ -22,4 +22,7 @@ public class CcdiProjectSuspiciousTransactionQueryDTO { /** 每页数量 */ private Integer pageSize; + + /** 是否包含外部人员预警分支 */ + private Boolean includeExternalPerson; } diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java index 8b3be2c5..844f0554 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiProjectOverviewMapper.java @@ -163,6 +163,14 @@ public interface CcdiProjectOverviewMapper { */ CcdiProjectExternalRiskSummaryVO selectExternalRiskSummaryByProjectId(@Param("projectId") Long projectId); + /** + * 判断项目是否存在外部人员主体 + * + * @param projectId 项目ID + * @return 存在时返回1,否则返回空 + */ + Integer selectExternalPersonSubjectExistsByProjectId(@Param("projectId") Long projectId); + /** * 查询外部人员预警模型卡片 * diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java index 78ef7f28..0d73c78a 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectOverviewServiceImpl.java @@ -86,6 +86,12 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi private static final String ACTION_LABEL = "查看详情"; + private static final String SUSPICIOUS_TYPE_ALL = "ALL"; + + private static final String SUSPICIOUS_TYPE_MODEL_RULE = "MODEL_RULE"; + + private static final String SUSPICIOUS_TYPE_EXTERNAL_PERSON = "EXTERNAL_PERSON"; + private static final String EXCLUSION_TYPE_STATEMENT = "STATEMENT"; private static final String EXCLUSION_TYPE_OBJECT = "OBJECT"; @@ -369,6 +375,11 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi ) { ensureProjectExists(queryDTO.getProjectId()); normalizeSuspiciousTransactionQuery(queryDTO); + prepareSuspiciousTransactionExternalBranch(queryDTO); + + if (isExternalPersonOnlyWithoutSubject(queryDTO)) { + return emptySuspiciousTransactionPage(); + } Page page = new Page<>( defaultPageNum(queryDTO.getPageNum()), @@ -389,6 +400,11 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi ) { ensureProjectExists(queryDTO.getProjectId()); normalizeSuspiciousTransactionQuery(queryDTO); + prepareSuspiciousTransactionExternalBranch(queryDTO); + + if (isExternalPersonOnlyWithoutSubject(queryDTO)) { + return List.of(); + } return defaultList(overviewMapper.selectReportSuspiciousTransactionList(queryDTO)).stream() .map(this::buildSuspiciousTransactionExcelRow) @@ -719,12 +735,42 @@ public class CcdiProjectOverviewServiceImpl implements ICcdiProjectOverviewServi queryDTO.setModelCode(null); } if (queryDTO.getSuspiciousType() == null || queryDTO.getSuspiciousType().isBlank()) { - queryDTO.setSuspiciousType("ALL"); + queryDTO.setSuspiciousType(SUSPICIOUS_TYPE_ALL); return; } queryDTO.setSuspiciousType(queryDTO.getSuspiciousType().trim().toUpperCase()); } + private void prepareSuspiciousTransactionExternalBranch(CcdiProjectSuspiciousTransactionQueryDTO queryDTO) { + if (!shouldCheckExternalPersonBranch(queryDTO.getSuspiciousType())) { + queryDTO.setIncludeExternalPerson(false); + return; + } + queryDTO.setIncludeExternalPerson(hasExternalPersonSubject(queryDTO.getProjectId())); + } + + private boolean shouldCheckExternalPersonBranch(String suspiciousType) { + return SUSPICIOUS_TYPE_ALL.equals(suspiciousType) + || SUSPICIOUS_TYPE_MODEL_RULE.equals(suspiciousType) + || SUSPICIOUS_TYPE_EXTERNAL_PERSON.equals(suspiciousType); + } + + private boolean hasExternalPersonSubject(Long projectId) { + return overviewMapper.selectExternalPersonSubjectExistsByProjectId(projectId) != null; + } + + private boolean isExternalPersonOnlyWithoutSubject(CcdiProjectSuspiciousTransactionQueryDTO queryDTO) { + return SUSPICIOUS_TYPE_EXTERNAL_PERSON.equals(queryDTO.getSuspiciousType()) + && !Boolean.TRUE.equals(queryDTO.getIncludeExternalPerson()); + } + + private CcdiProjectSuspiciousTransactionPageVO emptySuspiciousTransactionPage() { + CcdiProjectSuspiciousTransactionPageVO result = new CcdiProjectSuspiciousTransactionPageVO(); + result.setRows(List.of()); + result.setTotal(0L); + return result; + } + private CcdiProjectOverviewStatVO buildStat(String key, String label, Integer value) { CcdiProjectOverviewStatVO stat = new CcdiProjectOverviewStatVO(); stat.setKey(key); diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml index 155a7680..26f6940e 100644 --- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiProjectOverviewMapper.xml @@ -811,6 +811,22 @@ and risk.cert_no = subject.cert_no + +