610 lines
24 KiB
Markdown
610 lines
24 KiB
Markdown
# 图谱开发决策记录
|
||
|
||
记录当前已确认的资金流图谱和关系图谱开发口径,作为后续开发、验收和跨对话延续的依据。
|
||
|
||
## 1. 页面嵌入位置
|
||
|
||
- 图谱功能先嵌入项目详情页的“专项排查”页签。
|
||
- 现有前端入口为 `ruoyi-ui/src/views/ccdiProject/components/detail/SpecialCheck.vue`。
|
||
- 页面在项目详情内承载,但资金流图谱本身不按 `project_id` 过滤。
|
||
- 查询入口以全局身份证号 `cret_no` 或员工姓名为准。
|
||
|
||
## 2. 图谱表结构原则
|
||
|
||
- 建表逻辑尽量保持图谱平台已验证过的 SQL 逻辑。
|
||
- 不重新设计统一点表/边表。
|
||
- 表名保留图谱平台 SQL 中的五张结果表:
|
||
- `lx_fund_flow_subject_node`
|
||
- `lx_fund_flow_account_node`
|
||
- `lx_fund_flow_own_account_edge`
|
||
- `lx_fund_flow_detail_edge`
|
||
- `lx_fund_flow_sum_edge`
|
||
- 不在五张图谱表中增加 `project_id` 作为查询过滤口径。
|
||
- 一条流水可能存在于多个项目中,资金流图谱按全局资金关系构建,避免项目维度导致重复建点或重复算边。
|
||
|
||
## 3. 五张表职责
|
||
|
||
| 表名 | 作用 |
|
||
| --- | --- |
|
||
| `lx_fund_flow_subject_node` | 主体点,表示人员、企业、名称代理主体 |
|
||
| `lx_fund_flow_account_node` | 账户点,表示具体账号或名称代理账户 |
|
||
| `lx_fund_flow_own_account_edge` | 主体到账户的持有关系 |
|
||
| `lx_fund_flow_detail_edge` | 账户层逐笔资金交易边 |
|
||
| `lx_fund_flow_sum_edge` | 主体层资金汇总边,前端默认展示 |
|
||
|
||
关键点:
|
||
|
||
- 一个人可能有多个账号,所以必须保留主体点、账户点、持有边三层结构。
|
||
- 前端默认展示主体层汇总边,不默认展示全部账户层明细边,避免节点过多。
|
||
- 点击汇总边后,再查询账户层逐笔流水。
|
||
|
||
## 4. 构建逻辑
|
||
|
||
构建逻辑以 `tupu/资金流图谱代码/lanxi_liushui_no_relation_simplified.sql` 为主。
|
||
|
||
重要口径:
|
||
|
||
- 项目内 SQL 尽量和图谱平台原 SQL 保持一致。
|
||
- 先导入一部分“所有员工流水明细”作为图谱基座。
|
||
- 这部分基座数据视为已验证、绝对正确,不应被后续构建流程随意清空或覆盖。
|
||
- 后续从 `ccdi_bank_statement` 拉取新增流水时,需要先和图谱基座做一致性判断。
|
||
- 如果 `ccdi_bank_statement` 中的流水已经能在图谱基座中匹配到一致流水,则不同步进图谱,避免重复计入。
|
||
- 如果没有匹配到一致流水,则按原图谱 SQL 逻辑增量插入图谱。
|
||
|
||
保留的核心口径:
|
||
|
||
- 本方证件号 `cret_no` 必须存在。
|
||
- 对手方名称必须存在,空值、空串、`0` 过滤。
|
||
- 金额必须有效,支出和收入统一成 `amount` 与 `flag`。
|
||
- 支出 `flag = 1`,收入 `flag = 2`。
|
||
- 明细去重,避免重复流水导致金额和笔数翻倍。
|
||
- 同名归并只作用于主体层,不改变账户节点和账户明细边。
|
||
- 无账号但有名称的对手方,按原 SQL 逻辑生成名称代理账户和名称代理主体。
|
||
|
||
一期先不展开追溯能力。需要为后续追溯预留字段和逻辑口子:
|
||
|
||
- `source_table`
|
||
- `penetrate_level`
|
||
- 后续可扩展 `FIRST`、`LEVEL1` 等来源。
|
||
|
||
## 4.1 基座与增量同步口径
|
||
|
||
图谱表不是“清空重建”的临时结果表,而是承载已验证图谱基座和后续增量的正式结果表。
|
||
|
||
基座数据:
|
||
|
||
- 来源为先导入的所有员工流水明细。
|
||
- 按原图谱平台 SQL 生成五张 `lx_*` 表。
|
||
- 基座数据作为可信结果保留。
|
||
|
||
增量数据:
|
||
|
||
- 来源为后续 `ccdi_bank_statement`。
|
||
- 拉取后先按原 SQL 的流水标准化和去重口径生成候选流水。
|
||
- 候选流水和既有 `lx_fund_flow_detail_edge` 做一致性比对。
|
||
- 已存在一致流水时跳过,不插入图谱。
|
||
- 不存在一致流水时,再增量生成账户点、主体点、持有边、明细边和汇总边。
|
||
|
||
一致性比对建议使用稳定业务特征,而不是 `project_id`:
|
||
|
||
- 本方账号
|
||
- 本方户名
|
||
- 对手方账号
|
||
- 对手方户名
|
||
- 交易日期
|
||
- 金额
|
||
- 收支方向 `flag`
|
||
- 摘要 `user_memo`
|
||
- 银行流水号或交易流水号,如果有
|
||
|
||
增量插入要求:
|
||
|
||
- 点表按 `object_key` 去重插入。
|
||
- 持有边按 `object_key` 去重插入。
|
||
- 明细边先判重,未存在才插入。
|
||
- 汇总边需要按主体对和方向重新聚合或局部 upsert,不能简单追加导致金额翻倍。
|
||
|
||
## 4.2 ODPS 基座同步到 MySQL
|
||
|
||
当前真实部署口径:
|
||
|
||
- 原图谱 SQL 已在 ODPS 中有一份结果。
|
||
- ODPS 结果只涉及行内流水。
|
||
- ODPS 已经产出五张图谱结果表。
|
||
- 可以先将 ODPS 中五张结果表一次性同步到纪检 MySQL。
|
||
- MySQL 同步建表脚本记录在 `sql/ccdi/graph/01_lx_fund_graph_mysql_ddl.sql`。
|
||
- 生产数据库表结构变更由人工单独执行,不跟随测试环境或应用发布自动更新。
|
||
- 项目内保留 SQL 文件,用于本地验证、评审和生产手动执行参考。
|
||
|
||
同步后的 MySQL 五张表继续使用原图谱表名:
|
||
|
||
- `lx_fund_flow_subject_node`
|
||
- `lx_fund_flow_account_node`
|
||
- `lx_fund_flow_own_account_edge`
|
||
- `lx_fund_flow_detail_edge`
|
||
- `lx_fund_flow_sum_edge`
|
||
|
||
同步要求:
|
||
|
||
- ODPS 到 MySQL 首次同步只做基座装载。
|
||
- 基座装载完成后,后续不再通过清空五张表重建处理。
|
||
- ODPS 字段和 MySQL 字段同名的按显式字段列表导入。
|
||
- MySQL 侧新增字段如 `family_relation_type`、`summary_object_key`、`source_table`、`penetrate_level`、`bank_statement_id`、`bank_trx_number` 可为空。
|
||
- `lx_fund_flow_sum_edge.detail_ids` 在 MySQL 中使用 `LONGTEXT` 接收 ODPS ARRAY 同步后的 JSON 或字符串表示,前后端查询不强依赖该字段。
|
||
|
||
## 4.3 MySQL 后续增量方式
|
||
|
||
后续新增数据都在纪检 MySQL 内处理:
|
||
|
||
- 来源表为 `ccdi_bank_statement`。
|
||
- 增量逻辑从 `ccdi_bank_statement` 抽取候选流水。
|
||
- 候选流水按原图谱 SQL 口径标准化、过滤、生成 object_key。
|
||
- 先和既有 `lx_fund_flow_detail_edge` 做一致性判重。
|
||
- 已存在一致流水时不插入图谱。
|
||
- 不存在一致流水时,才增量插入点、账户、持有边、明细边。
|
||
- 汇总边 `lx_fund_flow_sum_edge` 按主体对和方向重新聚合或局部 upsert。
|
||
|
||
调度建议:
|
||
|
||
- 一期建议做每日定时调度,不建议一开始做实时。
|
||
- 推荐使用 RuoYi/Quartz 定时任务,每天凌晨或低峰期执行。
|
||
- 同时保留后台手动触发能力,便于首次补跑、排查和修复。
|
||
- 实时同步不是不能做,但没有必要优先做;实时会增加事务、锁、重复判断和汇总边更新复杂度。
|
||
|
||
推荐执行节奏:
|
||
|
||
1. ODPS 五张结果表一次性同步到 MySQL。
|
||
2. MySQL 跑一次家庭关系补充和 `summary_object_key` 回填。
|
||
3. 每日 Quartz 调度从 `ccdi_bank_statement` 抽取新增候选流水。
|
||
4. 候选流水与 `lx_fund_flow_detail_edge` 判重。
|
||
5. 未命中重复的流水增量入图。
|
||
6. 更新对应主体层汇总边。
|
||
7. 前端始终只基于 MySQL 五张 `lx_*` 图谱表查询展示。
|
||
|
||
## 4.4 数据库变更执行边界
|
||
|
||
数据库表结构改动属于生产库手工变更,不纳入测试环境自动更新。
|
||
|
||
后续开发分工:
|
||
|
||
- SQL 文件由代码库保留,作为生产手工执行依据和本地验证依据。
|
||
- 生产执行由人工确认后单独处理。
|
||
- 后端开发默认这些表在目标库中已经存在。
|
||
- 前端开发不感知数据库变更,只调用后端接口。
|
||
- 测试环境如没有这五张表,需要手动执行 SQL 后再联调。
|
||
- 应用发布包不自动执行这些 DDL。
|
||
|
||
## 5. 家庭关系
|
||
|
||
家庭关系是本次项目内新增能力,参考 `tupu/资金流图谱代码/资金流图谱_家庭关系补充.sql`。
|
||
|
||
处理原则:
|
||
|
||
- 不改变资金方向。
|
||
- 不改变主体归并逻辑。
|
||
- 不改变账户层明细边生成逻辑。
|
||
- 只在资金边上增加家庭关系标注。
|
||
|
||
匹配规则:
|
||
|
||
- 交易任意一侧可映射到员工主体。
|
||
- 员工主体必须有身份证号。
|
||
- 对手方姓名命中 `ccdi_staff_fmy_relation.relation_name`。
|
||
- 同一员工和同一关系人姓名只有一个 `relation_type` 时才标注。
|
||
- 多个关系类型冲突时不打标,避免误判。
|
||
|
||
建议补充字段:
|
||
|
||
- `lx_fund_flow_detail_edge.family_relation_type`
|
||
- `lx_fund_flow_sum_edge.family_relation_type`
|
||
|
||
## 6. 查询逻辑
|
||
|
||
搜索主体:
|
||
|
||
```sql
|
||
select *
|
||
from lx_fund_flow_subject_node
|
||
where idnocfno = #{keyword}
|
||
or name like concat('%', #{keyword}, '%');
|
||
```
|
||
|
||
查询主体层资金图:
|
||
|
||
```sql
|
||
select *
|
||
from lx_fund_flow_sum_edge
|
||
where from_key = concat('idno_node/', #{objectKey})
|
||
or to_key = concat('idno_node/', #{objectKey})
|
||
order by amount desc, total_trans_cnt desc
|
||
limit #{limit};
|
||
```
|
||
|
||
点击汇总边查询逐笔流水:
|
||
|
||
```sql
|
||
select *
|
||
from lx_fund_flow_detail_edge
|
||
where summary_object_key = #{sumObjectKey}
|
||
order by trx_date desc
|
||
limit #{offset}, #{pageSize};
|
||
```
|
||
|
||
说明:
|
||
|
||
- 原图谱平台 `detail_ids` 可以保留。
|
||
- MySQL 分页查询建议增加 `summary_object_key`,用于从汇总边直接查明细边。
|
||
- `summary_object_key` 是查询优化字段,不改变原图谱平台点边模型。
|
||
|
||
## 7. 前后端开发边界
|
||
|
||
后端负责:
|
||
|
||
- 从五张 `lx_*` 图谱结果表读取数据。
|
||
- 按身份证号或姓名定位主体。
|
||
- 返回主体层图谱节点和汇总边。
|
||
- 支持点击资金汇总边分页查询逐笔流水。
|
||
- 透出家庭关系字段。
|
||
- 空表或脏数据时返回空结果,不让前端报错。
|
||
|
||
前端负责:
|
||
|
||
- 在“专项排查”页签中呈现图谱展示区域。
|
||
- 支持身份证号或员工姓名搜索。
|
||
- 支持“资金图谱 / 关系图谱”页签。
|
||
- 一期资金图谱做实,关系图谱可先保留入口。
|
||
- 默认展示主体层资金汇总图。
|
||
- 点击边展示逐笔流水明细。
|
||
- 展示图谱明细边中已写入的家庭关系标签,如配偶、父母、子女。
|
||
|
||
## 8. 基座保护与异常数据处理
|
||
|
||
图谱表承载已验证基座,不按“可随意清空重建”设计。人工可以维护或清理异常数据,但默认应保护已有基座。
|
||
|
||
处理要求:
|
||
|
||
- 后续增量同步不得清空五张 `lx_*` 表。
|
||
- 增量同步前必须先判断候选流水是否已存在于 `lx_fund_flow_detail_edge`。
|
||
- 已存在一致流水时跳过,避免重复金额和重复笔数。
|
||
- 人工清理异常边后,后端查询需要能容忍局部缺失数据。
|
||
- 边表有、点表缺失时,后端过滤无法匹配节点的边,不让前端报错。
|
||
- 明细边为空时,点击汇总边提示暂无逐笔流水。
|
||
- 如果人工确实清理了部分图谱数据,后续增量插入仍需按 `object_key` 和流水一致性规则防重。
|
||
|
||
## 9. UI 风格
|
||
|
||
固定设计口径:
|
||
|
||
- 浅色系统风格。
|
||
- 正式后台质感。
|
||
- 与当前纪检系统色调保持一致,蓝、白、灰为主。
|
||
- 朝图谱平台式交互靠齐。
|
||
- 不做黑色大屏。
|
||
- 不做网感、霓虹、炫光科技风。
|
||
- 图谱画布使用浅灰白背景,边界清楚。
|
||
- 搜索区放在顶部,支持身份证号和姓名。
|
||
- 页签为“资金图谱”和“关系图谱”。
|
||
- 明细使用右侧抽屉或下方面板展示,优先保证字段清楚和分页性能。
|
||
|
||
## 10. 后续开发顺序
|
||
|
||
建议顺序:
|
||
|
||
1. 先落项目内 SQL:DDL、构建 SQL、家庭关系补充 SQL、索引 SQL。
|
||
2. 先支持已导入员工流水明细作为图谱基座。
|
||
3. 增加 `ccdi_bank_statement` 到图谱表的增量同步逻辑。
|
||
4. 增量同步必须先和既有 `lx_fund_flow_detail_edge` 做一致性判重,已存在则不同步。
|
||
5. 后端接口改为读取五张 `lx_*` 图谱表。
|
||
6. 前端在“专项排查”页签接入图谱展示区域。
|
||
7. 完成资金图谱搜索、展示、点击边查明细。
|
||
8. 增加家庭关系标签展示。
|
||
9. 验证基座保护、增量防重、一个人多个账号、家庭关系命中等场景。
|
||
|
||
## 11. 当前代码进度与偏差
|
||
|
||
截至 2026-05-28,项目内已经做过一版一期资金流图谱代码,但这版实现口径与当前最终方案不完全一致,后续需要重构而不是直接当最终版。
|
||
|
||
已完成过的代码:
|
||
|
||
- 后端新增 `CcdiFundGraphController`,接口路径为 `/ccdi/project/fund-graph/graph` 和 `/ccdi/project/fund-graph/edge-detail`。
|
||
- 后端新增 DTO/VO:`CcdiFundGraphQueryDTO`、`CcdiFundGraphEdgeDetailQueryDTO`、`CcdiFundGraphVO`、`CcdiFundGraphNodeVO`、`CcdiFundGraphEdgeVO`、`CcdiFundGraphStatementVO`。
|
||
- 后端新增 Mapper 和 Service:`CcdiFundGraphMapper`、`ICcdiFundGraphService`、`CcdiFundGraphServiceImpl`、`CcdiFundGraphMapper.xml`。
|
||
- 前端新增接口文件 `ruoyi-ui/src/api/ccdi/fundGraph.js`。
|
||
- 前端新增组件 `ProjectAnalysisFundFlowTab.vue`。
|
||
- 前端已在 `ProjectAnalysisDialog.vue` 中接入资金流图谱页签。
|
||
|
||
旧版已验证情况:
|
||
|
||
- `mvn -pl ccdi-project -am compile -DskipTests` 通过。
|
||
- `npm run build:prod` 通过。
|
||
- 真实库只读校验过项目 33 和姓名样例,能查出资金边,点击边能查逐笔流水。
|
||
- 曾修正 MySQL 8 保留词别名 `rows` 和字符集排序规则不一致问题。
|
||
|
||
当前偏差:
|
||
|
||
- 旧版接口是实时从 `ccdi_bank_statement` 聚合资金图谱,不读取五张 `lx_*` 图谱结果表。
|
||
- 旧版查询带项目上下文,当前最终口径是不按 `project_id` 过滤,以全局 `cret_no` 或姓名为入口。
|
||
- 旧版前端接在项目分析弹窗 `ProjectAnalysisDialog`,当前最终入口应放在“专项排查”页签。
|
||
- 旧版没有按图谱平台五表基座和增量同步口径处理。
|
||
- 旧版没有家庭关系标注。
|
||
|
||
后续处理原则:
|
||
|
||
- 可复用旧版的图谱展示、点击边查明细、分页表格等前端交互经验。
|
||
- 可复用旧版 DTO/VO 中适合前端展示的字段,但字段来源需要改为五张 `lx_*` 表。
|
||
- 后端 SQL 必须从实时聚合 `ccdi_bank_statement` 改为读取 `lx_fund_flow_subject_node`、`lx_fund_flow_account_node`、`lx_fund_flow_own_account_edge`、`lx_fund_flow_detail_edge`、`lx_fund_flow_sum_edge`。
|
||
- 前端入口需要从项目分析弹窗迁移或重做到“专项排查”页签。
|
||
- 旧版文件在重构时应谨慎处理,避免影响当前项目分析弹窗已有功能。
|
||
|
||
## 12. 页面查询与汇总表最新决策
|
||
|
||
最新决策:
|
||
|
||
- 纪检平台资金流图谱页面不强依赖 `lx_fund_flow_sum_edge`。
|
||
- 页面查询以 `lx_fund_flow_detail_edge` 为事实表,由后端按当前查询条件实时聚合。
|
||
- 前端不做金额和笔数聚合,只负责渲染后端返回的节点、边和明细。
|
||
- `lx_fund_flow_sum_edge` 如生产侧不需要兼容图谱平台页面,可以不作为纪检页面必需表。
|
||
- 如果 ODPS 已有 `lx_fund_flow_sum_edge`,可以选择不同步到 MySQL,或同步后仅作为参考缓存,不作为纪检页面查询依据。
|
||
|
||
原因:
|
||
|
||
- 用户每次查询通常以一个人为中心,一跳图谱范围可控。
|
||
- 用户需要按 `trx_date` 任意筛选时间范围。
|
||
- 全量 `lx_fund_flow_sum_edge` 不能准确表达任意时间段内的金额和笔数。
|
||
- 每天新增明细后维护汇总表会增加复杂度。
|
||
- 后端从明细边实时聚合能保证筛选结果准确,且比前端聚合更可靠。
|
||
|
||
后端聚合口径:
|
||
|
||
1. 用身份证号、姓名或 `object_key` 定位主体点。
|
||
2. 查询该主体名下账户。
|
||
3. 从 `lx_fund_flow_detail_edge` 查询这些账户相关流水。
|
||
4. 按 `trx_date`、金额、方向、家庭关系等筛选条件过滤。
|
||
5. 后端将账户层明细边聚合为主体层资金边。
|
||
6. 返回前端用于图谱展示。
|
||
|
||
时间筛选字段:
|
||
|
||
- 所有时间筛选基于 `lx_fund_flow_detail_edge.trx_date`。
|
||
- 不用 `lx_fund_flow_sum_edge.first_trx_date` 或 `lastest_trx_date` 判断筛选结果。
|
||
|
||
## 13. 节点穿透最新决策
|
||
|
||
节点穿透以 `lx_fund_flow_subject_node.object_key` 为唯一标识,不按姓名穿透。
|
||
|
||
口径:
|
||
|
||
- 实名主体按原 SQL 逻辑生成 `object_key`,即 `md5(trim(idnocfno))`。
|
||
- 用户点击节点后,可选择“以此节点为中心查询”或“展开此节点”。
|
||
- 默认不自动穿透,避免图谱过长和误展开。
|
||
- 后端按被选节点的 `object_key` 查询其账户和流水。
|
||
- 节点是否可穿透由后端返回 `canExpand` 控制。
|
||
|
||
允许穿透:
|
||
|
||
- 有明确身份证号或证件号的实名主体。
|
||
- 有明确账户归属、能通过 `lx_fund_flow_own_account_edge` 找到账户的主体。
|
||
|
||
默认不穿透:
|
||
|
||
- 只有名称、没有证件号、没有明确账户归属的名称代理主体。
|
||
- 无法通过 `object_key` 准确定位账户集合的节点。
|
||
|
||
交互建议:
|
||
|
||
- 一期做“设为中心查询”,即点击节点后重新以该节点为中心画一跳图。
|
||
- 后续再做“在当前图上追加展开”,避免一期图谱状态管理过复杂。
|
||
|
||
## 14. 最终减法版决策
|
||
|
||
本节覆盖前文早期关于五张表、`lx_fund_flow_sum_edge`、关系图谱页签的旧设想。后续开发以本节为准。
|
||
|
||
本节为 2026-05-28 资金流图谱减法版决策,重点是不依赖 `lx_fund_flow_sum_edge`。关于关系图谱页签,后续已在第 16 节更新为“保留关系图谱能力”,以第 16 节为准。
|
||
|
||
必要表:
|
||
|
||
- `lx_fund_flow_subject_node`
|
||
- `lx_fund_flow_account_node`
|
||
- `lx_fund_flow_own_account_edge`
|
||
- `lx_fund_flow_detail_edge`
|
||
|
||
不依赖:
|
||
|
||
- `lx_fund_flow_sum_edge`
|
||
|
||
页面查询:
|
||
|
||
- 输入身份证号、姓名或点击节点 `object_key`。
|
||
- 后端定位主体点。
|
||
- 后端查询主体持有账户。
|
||
- 后端从 `lx_fund_flow_detail_edge` 按账户、`trx_date`、金额等条件实时聚合资金边。
|
||
- 前端只渲染后端返回的资金节点、资金边和逐笔明细。
|
||
|
||
家庭关系:
|
||
|
||
- 只作为资金流图谱中的标签展示。
|
||
- 家庭关系识别在图谱构建或数据加工阶段完成,并写入 `lx_fund_flow_detail_edge.family_relation_type`;后端查询接口只读取并返回该字段,不实时匹配家庭表。
|
||
- 如果生产构建需要按对手方户名匹配 `ccdi_staff_fmy_relation.relation_name`,应在构建 SQL 中完成,并控制同名误判风险。
|
||
- 有明确 `relation_cert_no` 的家庭关系人按实名主体处理,`object_key = md5(trim(relation_cert_no))`。
|
||
- 用户点击该节点时,可按该节点 `object_key` 设为中心继续查询。
|
||
|
||
测试数据:
|
||
|
||
- 测试 DDL 为 `sql/ccdi/graph/01_lx_fund_graph_mysql_ddl.sql`。
|
||
- 测试数据脚本为 `sql/ccdi/graph/02_lx_fund_graph_seed_test_data.sql`。
|
||
- 测试数据只写四张必要表。
|
||
- 测试数据来源于 dev 库 `ccdi_bank_statement` 和 `ccdi_staff_fmy_relation`。
|
||
- 原始流水表不被修改。
|
||
|
||
## 15. 前后端与页面交互设计
|
||
|
||
默认查询:
|
||
|
||
- 默认查询全部流水,不默认带交易日期过滤。
|
||
- 用户选择交易日期后,后端才按 `lx_fund_flow_detail_edge.trx_date` 过滤。
|
||
- 时间过滤不查汇总表,直接从明细边实时聚合。
|
||
|
||
后端接口建议:
|
||
|
||
```text
|
||
GET /ccdi/project/fund-graph/search
|
||
GET /ccdi/project/fund-graph/graph
|
||
GET /ccdi/project/fund-graph/edge-detail
|
||
POST /ccdi/project/fund-graph/manual-edge
|
||
|
||
GET /ccdi/project/relation-graph/search
|
||
GET /ccdi/project/relation-graph/graph
|
||
GET /ccdi/project/relation-graph/suspected-enterprises
|
||
```
|
||
|
||
接口职责:
|
||
|
||
- `search`:按身份证号或姓名查主体点,返回候选主体列表。
|
||
- `graph`:按主体 `object_key` 查询一跳资金图,默认全部流水,可选日期、金额、方向过滤。
|
||
- `edge-detail`:点击资金边后,分页查询该边下的逐笔流水。
|
||
|
||
`graph` 入参:
|
||
|
||
```text
|
||
objectKey 必填,主体 object_key
|
||
startDate 可选,交易开始日期
|
||
endDate 可选,交易结束日期
|
||
amountMin 可选,最小金额
|
||
amountMax 可选,最大金额
|
||
direction 可选,1支出、2收入
|
||
limit 可选,默认20
|
||
```
|
||
|
||
`graph` 返回:
|
||
|
||
```text
|
||
centerNode 当前中心主体
|
||
nodes 图谱节点
|
||
edges 聚合后的资金边
|
||
summary 当前查询范围的总金额、总笔数、家庭关系边数量
|
||
```
|
||
|
||
节点字段:
|
||
|
||
```text
|
||
objectKey
|
||
nodeKey idno_node/{object_key}
|
||
name
|
||
idNo
|
||
nodeType PERSON / PROXY
|
||
canExpand
|
||
relationType 如果是家庭关系节点,返回配偶/父亲/母亲等
|
||
```
|
||
|
||
边字段:
|
||
|
||
```text
|
||
edgeKey
|
||
fromKey
|
||
toKey
|
||
fromName
|
||
toName
|
||
direction 1支出、2收入
|
||
amount
|
||
transactionCount
|
||
firstTrxDate
|
||
lastTrxDate
|
||
familyRelationType
|
||
```
|
||
|
||
`edge-detail` 入参:
|
||
|
||
```text
|
||
fromObjectKey
|
||
toObjectKey
|
||
direction
|
||
startDate
|
||
endDate
|
||
pageNum
|
||
pageSize
|
||
```
|
||
|
||
页面交互:
|
||
|
||
- 页面位置:项目详情“专项排查”页签。
|
||
- 页面标题:图谱展示。
|
||
- 展示“资金流图谱”和“关系图谱”两个页签。
|
||
- 搜索区只保留必要控件:身份证号/姓名、交易日期、查询、重置。
|
||
- 默认空态提示:请输入身份证号或姓名查询资金流图谱。
|
||
- 查询后画一跳图,中心节点为当前人员。
|
||
- 边上只显示金额和笔数,家庭关系用标签显示。
|
||
- 点击资金边,右侧抽屉展示逐笔流水。
|
||
- 点击节点,提供“设为中心查询”;默认不自动穿透。
|
||
- 只有 `canExpand = true` 的节点展示“设为中心查询”。
|
||
|
||
性能口径:
|
||
|
||
- 前端不聚合金额和笔数。
|
||
- 后端只围绕一个主体的账户集合查明细边。
|
||
- 默认全部流水也只查当前主体相关边,不扫全表。
|
||
- 必须使用 `lx_fund_flow_own_account_edge.from_key`、`lx_fund_flow_detail_edge.from_key/trx_date`、`lx_fund_flow_detail_edge.to_key/trx_date` 索引。
|
||
- 后端 SQL 参数比较需要显式 `COLLATE utf8mb4_general_ci`,避免当前库连接排序规则和表排序规则不一致。
|
||
|
||
当前 dev 测试数据:
|
||
|
||
```text
|
||
测试身份证号:617673198109148314
|
||
测试 object_key:以 `MD5('617673198109148314')` 为准
|
||
主体点:10
|
||
账户点:14
|
||
持有边:14
|
||
明细边:72
|
||
```
|
||
|
||
测试覆盖:
|
||
|
||
- 默认全部流水聚合。
|
||
- 日期范围筛选聚合。
|
||
- 支出方向 `flag = 1`。
|
||
- 收入方向 `flag = 2`。
|
||
- 家庭关系标签:配偶、父亲、母亲。
|
||
- 普通对手方:支付宝、淘宝、美团、财付通、小店、银行转账。
|
||
- 点击家庭关系节点按 `object_key` 设为中心查询。
|
||
|
||
## 16. 2026-05-29 最新验收口径
|
||
|
||
本节为当前最新口径,用于覆盖前文早期变更记录中的冲突描述。
|
||
|
||
当前图谱功能保留两类能力:
|
||
|
||
- 资金流图谱:作为专项排查中的核心图谱能力,读取 `lx_fund_flow_subject_node`、`lx_fund_flow_account_node`、`lx_fund_flow_own_account_edge`、`lx_fund_flow_detail_edge`,并叠加 `lx_fund_flow_manual_edge` 手工资金流向。
|
||
- 关系图谱:保留页面页签和接口能力,读取 `lx_rel_node`、`lx_rel_family_edge`、`lx_rel_stock_edge`、`lx_rel_represent_edge`,支持家庭关系、股东持股、法定代表人关系和疑似同名企业召回。
|
||
|
||
当前页面入口:
|
||
|
||
- 项目详情“专项排查”页签展示完整图谱工作台,包含“资金流图谱”和“关系图谱”两个页签。
|
||
- 项目分析弹窗“资金流向”页签展示简版资金流图谱。
|
||
- 项目分析弹窗“关系图谱”页签展示简版关系图谱。
|
||
|
||
当前接口入口:
|
||
|
||
```text
|
||
GET /ccdi/project/fund-graph/search
|
||
GET /ccdi/project/fund-graph/graph
|
||
GET /ccdi/project/fund-graph/edge-detail
|
||
POST /ccdi/project/fund-graph/manual-edge
|
||
|
||
GET /ccdi/project/relation-graph/search
|
||
GET /ccdi/project/relation-graph/graph
|
||
GET /ccdi/project/relation-graph/suspected-enterprises
|
||
```
|
||
|
||
当前数据库执行口径:
|
||
|
||
- 新环境可参考 `sql/ccdi/graph/01_lx_fund_graph_mysql_ddl.sql` 和 `sql/ccdi/graph/03_lx_relation_graph_mysql_ddl.sql`。
|
||
- 已建资金流图谱表的环境使用 `sql/ccdi/graph/06_lx_fund_graph_existing_table_supplement.sql` 补字段和补索引,不删除、不重建、不清空基座数据。
|
||
- 已建关系图谱表的环境使用 `sql/ccdi/graph/03_lx_relation_graph_mysql_ddl.sql` 中的补充逻辑补字段和补索引。
|
||
- 生产 DDL 和补充 SQL 都由人工确认后手动执行,不随应用发布自动执行。
|
||
|
||
当前验收样例:
|
||
|
||
```text
|
||
资金流图谱测试身份证号:617673198109148314
|
||
关系图谱测试身份证号:330101198001010011
|
||
```
|