交易模块 trans.md 23 KB

交易模块 trans

本文引用的文件

  • transApi.ts
  • query.ts
  • dto.ts
  • TransRecordModal.vue
  • TransRecordController.java
  • TransRecordService.java
  • TransRecord.java
  • TransRecordAll.java
  • TransFinancialKey.java
  • TransCashKey.java
  • TransFixedDepositKey.java
  • case_table_1.sql
  • 交易共同.sql
  • 全部交易关系.sql
  • 相互交易.sql

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与大数据查询优化
  8. 事务、一致性与审计建议
  9. 敏感字段脱敏与合规输出
  10. 典型查询示例
  11. 故障排查
  12. 结论

简介

交易模块 trans 围绕调查场景中的资金流展开,覆盖资金流水、固定存款、现金、大额、频率、敏感、金融等子场景。其核心目标是:

  • 统一接入和清洗不同来源的交易数据,形成可关联人员、账户、通话、轨迹的可分析实体;
  • 通过关键字、阈值和规则识别可疑交易模式,如大额、频繁、快速流转、固定周期、敏感对手;
  • 提供按账户/人员的资金流水查询、共同交易分析、相互转账检测、高频交易统计、资金流向图与追溯能力。

该模块同时包含前端页面入口、API 类型定义、后端控制器与服务层、实体模型以及用于复杂分析的测试 SQL。

项目结构

交易模块在前端以 ai-electron/frontend/src/trans 为根,主要包含:

  • API 客户端:封装资金流水、大额、连续、快转、银行卡代持、敏感、金融、固定存款等接口;
  • 类型定义:统一的查询条件 DTO 和响应 DTO;
  • 视图组件:各调查场景的列表、筛选、弹窗、资金流向图等页面;
  • 通用组件:如交易记录查询弹窗,支持多场景复用与追溯跳转。

后端以 ai-server 中 module.trans 为主,包含控制器、服务、Mapper、实体与查询对象;表结构定义集中在 sql/case_table_1.sql,复杂关系分析脚本集中在 sql/testSql。

graph TB
    subgraph "前端"
        FE_API["transApi.ts<br/>交易API客户端"]
        FE_TYPES["types/query.ts<br/>types/dto.ts<br/>查询与响应类型"]
        FE_MODAL["TransRecordModal.vue<br/>交易记录弹窗"]
        FE_VIEWS["views/*<br/>资金流水/大额/频率/敏感/金融/固定存款等页面"]
    end

    subgraph "后端"
        BE_CTRL["controller/*<br/>TransRecordController 等"]
        BE_SVC["service/*<br/>TransRecordService 等"]
        BE_ENT["common/model/trans/entity/*<br/>TransRecord/TransRecordAll 等"]
        BE_MQ["mapper/*<br/>各类 Mapper"]
    end

    subgraph "数据"
        DB_TRANS["trans_record<br/>trans_record_all"]
        DB_KEYS["cash_key<br/>trans_financial_key<br/>fixed_deposit_key"]
        DB_TEST["testSql/*.sql<br/>交易共同/全部交易关系/相互交易"]
    end

    FE_API --> BE_CTRL
    FE_TYPES --> FE_API
    FE_MODAL --> FE_API
    FE_VIEWS --> FE_API

    BE_CTRL --> BE_SVC
    BE_SVC --> BE_MQ
    BE_SVC --> DB_TRANS
    BE_SVC --> DB_KEYS
    DB_TEST --> DB_TRANS

图表来源

  • transApi.ts:1-200
  • query.ts:1-186
  • TransRecordController.java:1-24
  • TransRecordService.java:1-155
  • TransRecord.java:1-280
  • TransRecordAll.java:1-280
  • case_table_1.sql:200-260
  • 交易共同.sql:1-200

章节来源

  • transApi.ts:1-200
  • query.ts:1-186
  • TransRecordController.java:1-24
  • TransRecordService.java:1-155
  • case_table_1.sql:200-260

核心组件

  • 交易记录实体
    • TransRecord 映射 trans_record,表示标准交易记录;
    • TransRecordAll 映射 trans_record_all,表示聚合或扩展交易记录;
    • 关键字段包括:银行名称、本方姓名、证件号、账号、卡号、对方信息、交易类型、借贷标志、币种、金额、余额、时间、流水号、摘要、网点、终端、地点、商户、IP/MAC、渠道、备注、扩展信息等。
  • 关键字配置
    • cash_key:现金关键字;
    • trans_financial_key:金融理财关键字,带标签;
    • fixed_deposit_key:固定存款关键字。
  • 查询与分页
    • 前端通过 TransRecordQuery 构造查询条件,后端由 TransRecordService.getTransRecord 返回分页结果;
    • 支持按人员、卡号、对方名称/卡号、借贷标志、日期范围、金额区间与比较符、摘要、网点、备注、来源(现金)等过滤。

章节来源

  • TransRecord.java:1-280
  • TransRecordAll.java:1-280
  • TransCashKey.java:1-26
  • TransFinancialKey.java:1-32
  • TransFixedDepositKey.java:1-22
  • query.ts:120-186
  • TransRecordService.java:30-155

架构总览

交易模块采用前后端分离架构:

  • 前端页面调用 transApi.ts 暴露的统一方法;
  • 后端 Controller 接收请求并委派给 Service;
  • Service 根据配置选择 trans_record 或 trans_record_all 表进行查询;
  • 关键字表参与业务判断,例如“现金”来源使用 cash_key 对扩展字段做模糊匹配;
  • 复杂关系分析(共同交易、全部交易关系、相互交易)通过测试 SQL 直接操作临时表与清洗关系表。

    sequenceDiagram
    participant UI as "前端页面"
    participant API as "transApi.ts"
    participant CTRL as "TransRecordController"
    participant SVC as "TransRecordService"
    participant MAP as "Mapper"
    participant DB as "trans_record / trans_record_all"
    
    UI->>API: "getTransRecord(query)"
    API->>CTRL: "POST /trans/getTransRecord"
    CTRL->>SVC: "getTransRecord(query)"
    SVC->>MAP: "page(..., wrapper)"
    MAP->>DB: "执行分页查询"
    DB-->>MAP: "返回分页数据"
    MAP-->>SVC: "返回结果"
    SVC-->>CTRL: "Page<TransRecord>"
    CTRL-->>API: "Result.success(page)"
    API-->>UI: "渲染表格与筛选"
    

图表来源

  • transApi.ts:1-200
  • TransRecordController.java:1-24
  • TransRecordService.java:30-155

章节来源

  • transApi.ts:1-200
  • TransRecordController.java:1-24
  • TransRecordService.java:30-155

详细组件分析

交易记录查询流程

TransRecordService.getTransRecord 是交易记录查询的核心逻辑:

  • 动态表路由:通过配置决定查 trans_record 还是 trans_record_all;
  • 基础过滤:ID、文件编号、工作表编号、人员姓名、借贷标志、起止日期、卡号、摘要、网点、备注、金额上下界;
  • 金额比较符:支持小于等于、大于等于、大于、小于、等于;
  • 特殊值处理:对方名称/卡号为“未知”时转换为空值过滤;
  • 现金来源:当 source=1 时,加载 cash_key 并对 ext1 做多个 LIKE 条件组合;
  • 排序:支持传入排序字段与升降序;
  • 返回分页对象,并在走 trans_record_all 路径时使用 MapStruct 转换。

    flowchart TD
    Start(["进入 getTransRecord"]) --> Route["读取配置决定目标表"]
    Route --> BuildWrapper["构建查询包装器"]
    BuildWrapper --> BaseFilters["应用基础过滤条件"]
    BaseFilters --> AmountSymbol{"金额比较符"}
    AmountSymbol -->|小于等于| LE["LE 条件"]
    AmountSymbol -->|大于等于| GE["GE 条件"]
    AmountSymbol -->|大于| GT["GT 条件"]
    AmountSymbol -->|小于| LT["LT 条件"]
    AmountSymbol -->|等于| EQ["EQ 条件"]
    LE --> SpecialOther["处理对方名称/卡号特殊值"]
    GE --> SpecialOther
    GT --> SpecialOther
    LT --> SpecialOther
    EQ --> SpecialOther
    SpecialOther --> CashSource{"source 是否为现金"}
    CashSource -->|是| LoadKeys["加载 cash_key 并拼接 LIKE 条件"]
    CashSource -->|否| SortOrder["应用排序"]
    LoadKeys --> SortOrder
    SortOrder --> PageExec["执行分页查询"]
    PageExec --> Return(["返回分页结果"])
    

图表来源

  • TransRecordService.java:30-155

章节来源

  • TransRecordService.java:30-155

关键字管理与业务规则

  • 现金关键字 cash_key:用于标记与现金相关的交易特征,结合 ext1 字段实现灵活文本匹配;
  • 金融理财关键字 trans_financial_key:包含关键字与标签,可用于金融类交易筛选与归类;
  • 固定存款关键字 fixed_deposit_key:用于固定存取类交易识别。

这些关键字表不存储交易流水本身,而是作为业务规则表参与查询与分析。

章节来源

  • TransCashKey.java:1-26
  • TransFinancialKey.java:1-32
  • TransFixedDepositKey.java:1-22
  • case_table_1.sql:200-260

前端交易记录弹窗

TransRecordModal.vue 提供可复用的交易记录查询弹窗,具备:

  • 筛选字段:本方姓名、本方卡号、对方名称、对方卡号、借贷标志、起止日期、金额;
  • 分页控制:页码、每页数量、总数;
  • 追溯能力:支持向前/向后追溯方向,触发事件供上层资金流向分析调用;
  • 详情弹窗:可选是否展示交易记录详情;
  • 与 transApi.ts 的 getTransRecord 对接。

章节来源

  • TransRecordModal.vue:1-200
  • transApi.ts:1-200

资金流向与关系分析

前端 transApi.ts 提供资金流向分页、关系图、追溯、首次资金快转等方法,配合 MoneyFlowGraphQuery、TransFundFlowQuery 等查询类型,实现:

  • 资金流向左侧列表分页;
  • 资金流向节点关系图;
  • 向上游/下游追溯;
  • 首次资金快转统计。

SQL 测试脚本则展示了基于清洗关系表的复杂关系推导,例如:

  • 共同交易:从清洗对象与关系表中推导共同涉及的账户/身份;
  • 全部交易关系:在既有对象基础上扩展卡片关系、对手方关系;
  • 相互交易:双向筛选同一对手方的交易对。

    graph TB
    A["clean_table_dx<br/>清洗对象"] --> B["temp_clean_dx<br/>临时清洗对象"]
    C["clean_table_gx<br/>清洗关系"] --> D["temp_clean_gx<br/>临时清洗关系"]
    E["temp_dx_main<br/>主对象集合"] --> F["temp_dx<br/>交易对象集"]
    G["temp_yh<br/>交易对汇总"] --> H["temp_tel<br/>通话关系汇总"]
    F --> G
    D --> G
    B --> F
    C --> D
    

图表来源

  • 交易共同.sql:1-200
  • 全部交易关系.sql:1-200
  • 相互交易.sql:1-200

章节来源

  • transApi.ts:1-200
  • query.ts:1-186
  • 交易共同.sql:1-200
  • 全部交易关系.sql:1-200
  • 相互交易.sql:1-200

依赖关系分析

  • 前端依赖
    • transApi.ts 依赖 axios 封装与全局设置;
    • 所有查询类型集中在 types/query.ts,响应类型集中在 types/dto.ts;
    • 视图组件依赖通用弹窗与时间轴跳转能力。
  • 后端依赖

    • Controller 依赖 Service;
    • Service 依赖 Mapper 与配置服务(获取目标交易表名);
    • Entity 通过 MyBatis Plus 注解映射数据库表;
    • 关键字表独立维护,供 Service 在业务规则中使用。

      classDiagram
      class TransRecordController {
      +getTransRecord(query) Result
      }
      class TransRecordService {
      +getTransRecord(query) Page
      }
      class TransRecordMapper
      class TransRecordAllMapper
      class TransRecord
      class TransRecordAll
      class TransCashKey
      class TransFinancialKey
      class TransFixedDepositKey
      
      TransRecordController --> TransRecordService : "调用"
      TransRecordService --> TransRecordMapper : "可能使用"
      TransRecordService --> TransRecordAllMapper : "可能使用"
      TransRecordService --> TransCashKey : "读取关键字"
      TransRecord --> TransRecordAll : "结构相似"
      TransCashKey --> TransRecordService : "规则输入"
      TransFinancialKey --> TransRecordService : "规则输入"
      TransFixedDepositKey --> TransRecordService : "规则输入"
      

图表来源

  • TransRecordController.java:1-24
  • TransRecordService.java:1-155
  • TransRecord.java:1-280
  • TransRecordAll.java:1-280
  • TransCashKey.java:1-26
  • TransFinancialKey.java:1-32
  • TransFixedDepositKey.java:1-22

章节来源

  • TransRecordController.java:1-24
  • TransRecordService.java:1-155

性能与大数据查询优化

针对交易数据量大的情况,建议:

  • 优先使用精确字段过滤:人员卡号、对方卡号、日期范围、借贷标志;
  • 避免过度使用模糊匹配:摘要、网点、备注、扩展字段的 LIKE 会显著降低索引命中率;
  • 合理使用分页:限制单页大小,避免一次性拉取大量明细;
  • 金额比较符与上下界组合:先缩小金额区间再进一步筛选;
  • 关键字规则尽量前置:将高频关键字缓存,减少重复加载;
  • 对于资金流向图和追溯,应分层级查询并限制层级深度与时间窗口;
  • 在数据库层面,建议在以下字段建立索引:
    • personCardNo、otherCardNo、transDateTime、transDate、debitCreditFlag;
    • 复合索引可按常见查询组合设计,如 (personCardNo, transDate)、(otherCardNo, transAmount)。

[本节为通用优化建议,不直接分析具体文件]

事务一致性与审计建议

  • 事务一致性
    • 批量导入交易数据时应使用事务保证完整性;
    • 更新关键字规则时,确保与查询逻辑同步,避免规则不一致;
    • 资金流向追溯涉及多层级查询,建议分步骤落盘中间结果,失败可回滚或重试。
  • 审计日志
    • 记录关键查询参数(人员、卡号、时间范围、金额阈值);
    • 记录导出与追溯操作的执行人、时间、案件编号;
    • 对敏感字段访问进行审计,防止越权查看。

[本节为通用治理建议,不直接分析具体文件]

敏感字段脱敏与合规输出

  • 敏感字段
    • 证件号、账号、卡号、IP、MAC、地址、电话等属于敏感个人信息;
    • 前端弹窗已引入脱敏工具,可在展示时对证件号等进行脱敏。
  • 脱敏策略
    • 对外展示:隐藏部分字符,保留首尾必要标识;
    • 内部审计:可通过权限控制决定是否显示明文;
    • 导出文件:默认脱敏,并提供管理员解密通道。
  • 合规建议
    • 最小化字段输出,仅返回业务所需字段;
    • 对资金流向图节点,默认隐藏完整卡号,仅提供聚合统计;
    • 日志中不得明文记录敏感字段。

章节来源

  • TransRecordModal.vue:1-200

典型查询示例

按账户/人员查资金流水

  • 前端查询条件
    • 本方卡号、本方姓名、借贷标志、起止日期、金额区间;
  • 后端实现
    • TransRecordService.getTransRecord 根据条件构建查询包装器并分页;
  • 输出
    • 分页的交易记录列表,含金额、时间、对方信息、摘要、网点等。

章节来源

  • query.ts:120-186
  • TransRecordService.java:30-155

大额交易筛选

  • 前端查询条件
    • TransBigQuery:总金额、交易次数、对方名称/卡号、金额比较符、次数比较符;
  • 后端能力
    • statFirstTransBig、statSecondTransBig、statThirdTransBig;
  • 业务意义
    • 第一层按对手方汇总;第二层按日期聚合;第三层按日期分组展示明细。

章节来源

  • transApi.ts:1-200
  • query.ts:60-119

共同交易分析

  • SQL 思路
    • 从清洗对象表与清洗关系表提取共同涉及的账户/身份;
    • 通过临时表聚合与筛选,得到共同交易对手集合;
  • 适用场景
    • 多人共用账户、团伙资金归集、共同收款/付款。

章节来源

  • 交易共同.sql:1-200

相互转账检测

  • SQL 思路
    • 从清洗关系中筛选双向转账对;
    • 分别筛选 obj1→obj2 与 obj2→obj1 的交易,再进行交集合并;
  • 适用场景
    • 资金回流、洗钱闭环、对敲交易。

章节来源

  • 相互交易.sql:1-200

高频交易统计

  • 前端查询条件
    • TransFrequencyQuery:交易次数、对方名称/卡号、次数比较符;
  • 后端能力
    • 提供频率相关接口(由控制器与服务支撑);
  • 业务意义
    • 识别短时间内频繁转账、拆分转账、循环转账等可疑行为。

章节来源

  • query.ts:119-186
  • transApi.ts:1-200

故障排查

  • 查询结果为空
    • 检查人员卡号/对方卡号是否正确;
    • 确认日期范围与金额条件是否过严;
    • 若使用“未知对手/未知卡号”,确认数据库中对应字段是否为空。
  • 现金来源筛选无效
    • 检查 cash_key 是否配置了关键字;
    • 确认 ext1 字段是否包含预期文本;
    • 注意 LIKE 匹配的性能影响。
  • 分页异常
    • 检查前端分页参数是否合理;
    • 检查后端排序字段是否在实体中存在。
  • 资金流向图数据缺失
    • 检查追溯层级、时间间隔、金额阈值;
    • 检查是否存在上游/下游断点。

章节来源

  • TransRecordService.java:30-155
  • TransRecordModal.vue:1-200

结论

交易模块 trans 以交易记录为核心,结合关键字规则与多维度查询条件,支撑资金流水、大额、频率、敏感、金融、固定存款等调查场景。其后端通过动态表路由与灵活的查询包装器实现可扩展的数据访问,前端通过统一 API 与类型定义提供一致的交互体验。复杂关系分析借助测试 SQL 与临时表完成,适合在大数据量下通过索引、分页、分层查询与脱敏策略保障性能与合规。未来可在审计日志、权限控制、规则版本管理等方面进一步增强,以提升系统可运维性与安全性。