# 图谱生产数据库手工变更清单

本清单只记录资金流图谱涉及的生产数据库表结构和数据准备事项。该部分由人工在生产库手动执行，不随应用发布自动执行，也不要求测试环境自动更新。

## 1. DDL 脚本

生产建表脚本：

```text
sql/ccdi/graph/01_lx_fund_graph_mysql_ddl.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_manual_edge`

不创建、不依赖 `lx_fund_flow_sum_edge`。资金图谱页面由后端基于 `lx_fund_flow_detail_edge.trx_date` 按当前查询条件实时聚合真实资金边，手工资金流向汇总边单独存入 `lx_fund_flow_manual_edge`。

## 2. 生产执行边界

- 生产库 DDL 由人工手动执行。
- 应用发布包不自动执行 DDL。
- 测试环境不会自动同步这些变更。
- 代码库保留 SQL 文件，只作为生产执行、评审和本地验证依据。
- 后端开发默认目标库中上述 `lx_*` 表已存在。

## 3. ODPS 基座同步

生产建表后，先从 ODPS 同步已验证的资金流图谱基座到 MySQL。

同步来源：

- ODPS 中原图谱 SQL 产出的 `lx_fund_flow_subject_node`
- ODPS 中原图谱 SQL 产出的 `lx_fund_flow_account_node`
- ODPS 中原图谱 SQL 产出的 `lx_fund_flow_own_account_edge`
- ODPS 中原图谱 SQL 产出的 `lx_fund_flow_detail_edge`

同步原则：

- ODPS 基座是已验证数据，作为 MySQL 图谱基座保留。
- 同步时建议使用显式字段列表，不依赖 `select *`。
- MySQL 侧新增字段允许为空。
- `lx_fund_flow_sum_edge` 不作为纪检资金图谱页面必要表，可不从 ODPS 同步。
- `lx_fund_flow_manual_edge` 不从 ODPS 同步，生产建表后初始为空，由纪检平台手工分析功能写入。

## 4. 后续增量

ODPS 基座同步后，后续新增流水在纪检 MySQL 内处理。

增量来源：

- `ccdi_bank_statement`

增量原则：

- 先标准化候选流水。
- 再和既有 `lx_fund_flow_detail_edge` 做一致性判重。
- 已存在一致流水，不同步进图谱。
- 不存在一致流水，才增量插入主体点、账户点、持有边、明细边。
- 不维护汇总表；页面查询时实时聚合。

## 5. 调度建议

一期建议采用每日定时任务，不建议一开始做实时。

推荐方式：

- RuoYi/Quartz 定时任务。
- 每日低峰期执行。
- 保留手动触发能力，用于补跑、排查和修复。

## 6. 前后端依赖

前后端开发依赖上述 MySQL 图谱表的查询结果。

- 前端不直接访问数据库。
- 后端接口读取 `lx_*` 表。
- 页面入口放在项目详情的“专项排查”页签。
- 资金流图谱中真实资金边基于 `lx_fund_flow_detail_edge` 实时聚合。
- 手工资金边来自 `lx_fund_flow_manual_edge`，属于主体级汇总边，只存 `from_object_key`、`to_object_key`，不存冗余 `from_key`、`to_key`；图谱展示时由后端临时拼出 `idno_node/{object_key}`，不提供逐笔流水下钻。
- 查询按全局 `cret_no`、姓名或节点 `object_key`，不按 `project_id` 过滤。

## 7. 性能和索引口径

一期资金图谱默认只查一个中心主体的一层资金边，并设置 `minTotalAmount = 1000`、`limit = 20`，不会默认拉全量毛刺边。

生产索引重点：

- `lx_fund_flow_subject_node`：`PRIMARY KEY(object_key)`、`idx_lx_fund_flow_subject_idnocfno(idnocfno)`、`idx_lx_fund_flow_subject_name(name)`。
- `lx_fund_flow_own_account_edge`：`idx_lx_fund_flow_own_from_key(from_key)`、`idx_lx_fund_flow_own_to_key(to_key)`。
- `lx_fund_flow_detail_edge`：`idx_lx_fund_flow_detail_from_date(from_key, trx_date)`、`idx_lx_fund_flow_detail_to_date(to_key, trx_date)`、`idx_lx_fund_flow_detail_from_to(from_key, to_key)`。
- `lx_fund_flow_manual_edge`：`idx_lx_fund_flow_manual_from(from_object_key)`、`idx_lx_fund_flow_manual_to(to_object_key)`、`idx_lx_fund_flow_manual_pair_direction(from_object_key, to_object_key, direction)`。

如果后续单个主体关联流水达到几十万级，再考虑增加主体级冗余字段或月度汇总表；一期不建 `sum_edge`。
