From 5e968c8716414d79e94f250e8d7dbaeefcb0bc70 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Fri, 27 Mar 2026 17:26:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E9=BD=90=E7=BB=93=E6=9E=9C=E6=80=BB?= =?UTF-8?q?=E8=A7=88=E6=B6=89=E7=96=91=E4=BA=A4=E6=98=93=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...suspicious-transaction-alignment-design.md | 69 ++ ...spicious-transaction-detail-plan-record.md | 53 +- .../components/detail/PreliminaryCheck.vue | 11 +- .../components/detail/RiskDetailSection.vue | 801 +++++++++++++++++- ...-check-suspicious-transaction-load.test.js | 36 + ...spicious-transaction-detail-dialog.test.js | 25 + ...tail-suspicious-transaction-layout.test.js | 36 + 7 files changed, 1001 insertions(+), 30 deletions(-) create mode 100644 docs/design/2026-03-27-results-overview-suspicious-transaction-alignment-design.md create mode 100644 ruoyi-ui/tests/unit/preliminary-check-suspicious-transaction-load.test.js create mode 100644 ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-detail-dialog.test.js create mode 100644 ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-layout.test.js diff --git a/docs/design/2026-03-27-results-overview-suspicious-transaction-alignment-design.md b/docs/design/2026-03-27-results-overview-suspicious-transaction-alignment-design.md new file mode 100644 index 00000000..270467c2 --- /dev/null +++ b/docs/design/2026-03-27-results-overview-suspicious-transaction-alignment-design.md @@ -0,0 +1,69 @@ +# 结果总览涉疑交易明细与流水明细查询对齐设计 + +## 背景 + +- 结果总览页的“风险明细 > 涉疑交易明细”已接通真实接口,但当前列表列结构、详情弹窗内容和分页交互均与“流水明细查询”页面不一致。 +- 用户要求以“流水明细查询”页为基准对齐交互与视觉,仅保留涉疑交易特有的“关联员工”字段,其余定制列移除。 + +## 目标 + +- 列表对齐“流水明细查询”页面的主表结构与样式。 +- 详情弹窗对齐“流水明细查询”页面的字段布局、原始文件区域与命中异常标签区域。 +- 分页固定每页 5 条,筛选切换后回到第一页。 +- 保留“关联员工”列,作为涉疑交易明细相对流水明细查询的唯一额外业务列。 + +## 方案 + +### 列表 + +- `RiskDetailSection.vue` 保留“涉疑交易明细”区块与筛选下拉。 +- 表格列改为: + - 交易时间 + - 本方账户 + - 对方账户 + - 关联员工 + - 摘要 / 交易类型 + - 异常标签 + - 交易金额 + - 详情 +- 保持与 `DetailQuery.vue` 相同的多行单元格结构、金额颜色和异常标签样式。 + +### 分页 + +- 组件内部新增独立分页状态: + - `suspiciousPageNum` + - `suspiciousPageSize` 固定为 `5` + - `suspiciousTotal` +- 初次加载、筛选切换和翻页都通过 `getOverviewSuspiciousTransactions` 重新请求。 +- 分页组件沿用仓库现有 `Pagination`,但限制 `pageSizes` 为 `[5]`,并移除 `sizes` 布局项。 + +### 详情弹窗 + +- 详情弹窗结构对齐 `DetailQuery.vue`: + - 基础字段宫格 + - 原始文件信息 + - 命中异常标签 +- 详情数据继续复用 `getBankStatementDetail(bankStatementId)`,避免新增后端接口。 + +### 异常标签 + +- 结果总览涉疑交易列表接口当前不直接返回 `hitTags`。 +- 前端在列表加载完成后,按当前页流水 `bankStatementId` 逐条调用详情接口补齐 `hitTags`,仅处理当前页 5 条数据,保证逻辑闭环且不扩大后端改造范围。 + +## 影响范围 + +- 前端: + - `ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue` + - `ruoyi-ui/tests/unit/` +- 文档: + - 当前设计文档 + - 本轮实施记录 + +## 验证 + +- 单测验证列表列名、分页配置、详情弹窗字段与异常标签区域。 +- 浏览器联调验证: + - 初始加载为 5 条 + - 筛选切换可翻页 + - 详情弹窗样式与字段对齐 + - 导出仍可用 diff --git a/docs/reports/implementation/2026-03-27-development-risk-suspicious-transaction-detail-plan-record.md b/docs/reports/implementation/2026-03-27-development-risk-suspicious-transaction-detail-plan-record.md index 182a29e3..ff57b513 100644 --- a/docs/reports/implementation/2026-03-27-development-risk-suspicious-transaction-detail-plan-record.md +++ b/docs/reports/implementation/2026-03-27-development-risk-suspicious-transaction-detail-plan-record.md @@ -6,6 +6,16 @@ - `docs/plans/backend/2026-03-27-development-risk-suspicious-transaction-detail-backend-implementation.md` - 新增前端实施计划: - `docs/plans/frontend/2026-03-27-development-risk-suspicious-transaction-detail-frontend-implementation.md` +- 实际落地后端改动: + - 新增 `sql/migration/2026-03-27-ccdi-bank-statement-counterparty-identity-columns.sql` + - 补齐 `ccdi_bank_statement` 对手方证件号、统一社会信用代码入库映射 + - 新增结果总览涉疑交易 DTO / VO / Excel / Controller / Service / Mapper 能力 + - 新增“模型规则命中 + 名单库命中”聚合 SQL,并支持列表与导出 +- 实际落地前端改动: + - `ruoyi-ui/src/api/ccdi/projectOverview.js` 新增涉疑交易列表接口 + - `PreliminaryCheck.vue` 接入结果总览涉疑交易初始加载 + - `preliminaryCheck.mock.js` 新增涉疑交易归一化与 `riskDetails` 数据结构 + - `RiskDetailSection.vue` 改造成涉疑交易表格,接通筛选、导出、流水详情弹窗 ## 计划拆分结果 @@ -28,4 +38,45 @@ ## 说明 - 依据仓库 `AGENTS.md` 约束,本轮未启用 subagent 审核流程 -- 下一步可直接按计划在当前会话使用执行型流程落地 +- 本轮直接在当前 `dev` 分支执行,未创建 git worktree + +## 2026-03-27 二次调整记录 + +- 新增设计文档: + - `docs/design/2026-03-27-results-overview-suspicious-transaction-alignment-design.md` +- 调整目标: + - 将结果总览“涉疑交易明细”的列表样式、详情弹窗和分页交互对齐到“流水明细查询”页面 + - 保留“关联员工”列,其余“可疑人员 / 关联人 / 关系”等涉疑交易专属列移除 + - 分页固定每页 5 条 +- 预计改动: + - 重写 `RiskDetailSection.vue` 的列表列结构、详情弹窗结构与分页状态 + - 补充当前页异常标签加载逻辑 + - 同步更新前端单测断言 + +## 实施结果 + +- 后端已完成: + - 交易对手方身份证、统一社会信用代码已沿 LSFX 响应、实体、MyBatis XML、Mock 服务全链路补齐 + - 结果总览新增 `/ccdi/project/overview/suspicious-transactions` 与 `/ccdi/project/overview/suspicious-transactions/export` + - 涉疑交易明细按 `ALL / NAME_LIST / MODEL_RULE` 支持筛选 + - SQL 以流水为粒度去重,同一流水同时命中两类来源时仅返回一条 +- 前端已完成: + - 结果总览页默认加载涉疑交易明细 + - 风险明细区块已从“涉险交易明细”切换为“涉疑交易明细” + - 表格列已对齐交易时间、可疑人员、关联人、关联员工、关系、摘要/交易类型、交易金额 + - 详情按钮复用现有流水详情接口,导出按钮指向新的结果总览导出接口 + +## 验证记录 + +- 后端验证通过: + - `python3 -m pytest lsfx-mock-server/tests/test_statement_service.py -v` + - `mvn -pl ccdi-project,ccdi-lsfx -am -Dtest=CcdiBankStatementTest,CcdiBankStatementMapperXmlTest,CcdiProjectOverviewServiceStructureTest,CcdiProjectOverviewControllerContractTest,CcdiProjectOverviewControllerTest,CcdiProjectOverviewMapperSqlTest,CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewServiceSuspiciousTransactionTest -Dsurefire.failIfNoSpecifiedTests=false test` +- 前端验证通过: + - `node ruoyi-ui/tests/unit/project-overview-api.test.js` + - `node ruoyi-ui/tests/unit/preliminary-check-model-and-detail.test.js` + - `node ruoyi-ui/tests/unit/preliminary-check-suspicious-transaction-load.test.js` + - `node ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-layout.test.js` + - `node ruoyi-ui/tests/unit/risk-detail-suspicious-transaction-detail-dialog.test.js` + - `cd ruoyi-ui && npm run build:prod` +- 构建说明: + - 前端生产构建成功,但保留仓库原有 bundle 体积告警,不属于本轮新增问题 diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue index 7a50afb7..6b429498 100644 --- a/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue +++ b/ruoyi-ui/src/views/ccdiProject/components/detail/PreliminaryCheck.vue @@ -56,6 +56,7 @@ import { getOverviewDashboard, getOverviewRiskPeople, getOverviewRiskModelCards, + getOverviewSuspiciousTransactions, } from "@/api/ccdi/projectOverview"; import OverviewStats from "./OverviewStats"; import RiskPeopleSection from "./RiskPeopleSection"; @@ -197,20 +198,28 @@ export default { this.selectedModelCodes = []; this.resetProjectAnalysisDialog(); try { - const [dashboardRes, riskPeopleRes, riskModelCardsRes] = await Promise.all([ + const [dashboardRes, riskPeopleRes, riskModelCardsRes, suspiciousRes] = await Promise.all([ getOverviewDashboard(this.projectId), getOverviewRiskPeople(this.projectId), getOverviewRiskModelCards(this.projectId), + getOverviewSuspiciousTransactions({ + projectId: this.projectId, + suspiciousType: "ALL", + pageNum: 1, + pageSize: 5, + }), ]); const dashboardData = (dashboardRes && dashboardRes.data) || {}; const riskPeopleData = (riskPeopleRes && riskPeopleRes.data) || {}; const riskModelCardsData = (riskModelCardsRes && riskModelCardsRes.data) || {}; + const suspiciousData = (suspiciousRes && suspiciousRes.data) || {}; this.realData = createOverviewLoadedData({ projectId: this.projectId, dashboardData, riskPeopleData, riskModelCardsData, + suspiciousData, }); const hasOverviewData = Boolean( diff --git a/ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue b/ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue index 9944bd0d..b620860b 100644 --- a/ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue +++ b/ruoyi-ui/src/views/ccdiProject/components/detail/RiskDetailSection.vue @@ -4,39 +4,131 @@
风险明细
-
展示涉险交易与异常账户关联人员信息
+
展示涉疑交易与异常账户关联人员信息
-
涉险交易明细
-
展示涉险交易的关键字段与风险金额
+
涉疑交易明细
+
展示涉疑交易的关键字段与风险金额
+
+
+ + + {{ currentSuspiciousTypeLabel }} + + + + + {{ item.label }} + + + + + 导出 +
- 导出
- - - - - - - - + + + + + + + + + + + + + + + + + + + - + + +
@@ -62,10 +154,168 @@
+ + +
+
+
+
交易时间
+
{{ formatField(detailData.trxDate) }}
+
+
+
交易金额
+
+ {{ formatSignedAmount(detailData.displayAmount) }} +
+
+
+
交易后余额
+
{{ formatAmount(detailData.amountBalance) }}
+
+ +
+
本方主体
+
{{ formatField(detailData.leAccountName) }}
+
+
+
本方账号
+
{{ formatField(detailData.leAccountNo) }}
+
+
+
本方银行
+
{{ formatField(detailData.bank) }}
+
+ +
+
对方名称
+
{{ formatCounterpartyName(detailData) }}
+
+
+
对方账户
+
{{ formatField(detailData.customerAccountNo) }}
+
+
+
对方银行
+
{{ formatField(detailData.customerBank) }}
+
+ +
+
摘要
+
{{ formatField(detailData.userMemo) }}
+
+
+
交易类型
+
{{ formatField(detailData.cashType) }}
+
+
+
银行摘要
+
{{ formatField(detailData.bankComments) }}
+
+ +
+
原始文件
+
+ +
+
{{ formatOriginalFileName(detailData) }}
+
+ 上传时间:{{ formatOriginalFileUploadTime(detailData) }} +
+
+
+
+
+ +
+
命中异常标签
+
+
+
+ {{ formatField(tag.ruleName) }} + + {{ formatRiskLevel(tag.riskLevel) }} + +
+
{{ formatField(tag.reasonDetail) }}
+
+
+
当前流水未命中异常标签
+
+
+ +