本文引用的文件
本文面向治理、搜索、时序、特殊日期和数据建模等跨模块业务接口,整理后端控制器与服务层职责,明确各接口的 HTTP 方法、URL、请求参数、响应结构、分页约定和错误行为。文档还解释:
本项目的后端以 Spring Boot 为主,相关控制器位于 module 下的不同业务包中:
| 模块 | 主要职责 | 对应控制器 |
|---|---|---|
| govern | 数据治理任务调度、治理树查询、治理配置读写 | GovernController、GovernTreeController |
| otg | 搜索、时间序列、特殊日期等业务能力 | SearchController、TimeSeriesController、SpecialDateController |
| dm | 数据建模、文件预览、清洗、外部表与治理配置同步 | DmController |
graph TB
Client["前端或外部调用方"] --> GovernCtrl["GovernController<br/>治理任务与 SSE"]
Client --> GovernTreeCtrl["GovernTreeController<br/>治理树与关联分页"]
Client --> SearchCtrl["SearchController<br/>全文检索"]
Client --> TimeSeriesCtrl["TimeSeriesController<br/>时间序列"]
Client --> SpecialDateCtrl["SpecialDateController<br/>特殊日期"]
Client --> DmCtrl["DmController<br/>数据建模与清洗"]
GovernCtrl --> GovernSvc["GovernService"]
GovernTreeCtrl --> GovernTreeSvc["GovernTreeService"]
SearchCtrl --> SearchSvc["SearchQueryService"]
TimeSeriesCtrl --> TimeSeriesSvc["TimeSeriesService"]
SpecialDateCtrl --> SpecialDateSvc["SpecialDateService"]
DmCtrl --> DmSvc["DmService"]
图示来源
章节来源
GovernController 暴露三类能力:
GET /govern/sse;GET /govern/sse/put;GET /govern/calcTask。治理任务由异步线程执行,通过 SSE 推送进度。任务执行前会校验案件上下文,并通过进程内集合防止同一案件重复触发。
章节来源
GovernTreeController 提供治理树结构查询及多类关联数据的分页查询,包括:
所有分页接口返回统一包装结构,包含 list 和 total 两类键值,用于前端表格分页渲染。
章节来源
SearchController 仅暴露一个列表接口,实际检索逻辑在 SearchQueryService 中完成,底层使用 Elasticsearch 进行全文检索,并按时间降序返回最多 500 条结果。
章节来源
TimeSeriesController 提供时间序列列表、详情和跳转查询。时间序列数据通常用于按时间维度展示交易、通话等行为变化。
章节来源
SpecialDateController 管理特殊日期记录,支持公历与农历,并可生成前后间隔区间,用于时间轴上的标记。
章节来源
DmController 是数据建模与清洗入口,覆盖文件预处理、Web 上传、原始数据预览、清洗任务、批次清理、文件列表、删除、提取数据计算以及治理配置读写。
章节来源
sequenceDiagram
participant FE as "前端"
participant Ctrl as "GovernController"
participant Svc as "GovernService"
participant SSE as "SseService"
participant DB as "数据源"
FE->>Ctrl: GET /govern/calcTask
Ctrl->>Ctrl: 校验案件上下文
Ctrl->>Svc: tryStartGovern(caseId)
alt 已有同案件任务
Svc-->>Ctrl: 失败
Ctrl-->>FE: 业务异常
else 允许启动
Svc-->>Ctrl: 成功
Ctrl->>Svc: calcTask(taskProcess, caseId, userId)
Note over Svc,DB: 异步执行治理流水线
Svc->>SSE: 推送进度消息
Svc->>DB: 写入治理树与中间表
SSE-->>FE: 实时进度
end
图示来源
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /govern/calcTask |
| 路径参数 | 无 |
| 查询参数 | taskProcess,可选,整数,表示任务进度基准 |
| 请求体 | 无 |
| 成功响应 | Result<Void> |
| 失败响应 | 抛出业务异常,常见原因包括未打开案件、同案件任务已在运行 |
典型调用示例:
GET /govern/calcTask?taskProcess=66
注意事项:
章节来源
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /gt/tree |
| 请求参数 | 无 |
| 响应字段 | Result<List<GovernTree>>,包含层级节点 |
作用:
id、父节点 pid、类型、中文表名和数据量等信息;典型调用示例:
GET /gt/tree
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/treeTablePage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head、detail |
GovernTreeQuery 支持通用分页字段、排序字段、表名、节点 id,以及自定义条件 SQL。
典型调用示例:
POST /gt/treeTablePage
{
"page": 1,
"limit": 20,
"tableName": "trans_record_all",
"orderKey": "createTime",
"hasAsc": true
}
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/getTreeTransPersonPage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head |
过滤条件包括人员名称、卡号、金额、借贷类型、摘要等。若选择“未知对象”,系统会从已知人员卡号集合中排除,再查交易记录。
典型调用示例:
POST /gt/getTreeTransPersonPage
{
"personName": "张三",
"money": 1000,
"moneySymbol": 1,
"debitCreditFlag": "借"
}
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/getTreeTransBankPage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/getTreeCallPersonPage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/getTreeCallOperPage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/getTreeCallPersonUseOpenInfoPage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /gt/getTreeCallOperUseOpenInfoPage |
| 请求体 | GovernTreeQuery |
| 响应字段 | Result<Map<String,Object>>,包含 pages、head |
章节来源
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /search/list |
| 查询参数 | keyword,可选 |
| 响应字段 | Result<List<SearchDTO>> |
SearchDTO 字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
id |
字符串 | 行标识 |
sheetId |
字符串 | 工作表标识 |
fileId |
字符串 | 文件标识 |
dateTime |
时间戳 | 文档时间 |
content |
字符串 | 内容片段,可能包含高亮标签 |
tableName |
字符串 | 所属表 |
fileName |
字符串 | 文件名 |
sheetName |
字符串 | 工作表名 |
典型调用示例:
GET /search/list?keyword=转账
行为约定:
<em class="search-highlight"> 高亮片段。章节来源
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /otg/timeSeries/list |
| 请求体 | TimeSeriesQuery |
| 响应字段 | Result<List<TimeSeries>> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /otg/timeSeries/detailTimeSeries |
| 请求体 | TimeSeriesQuery |
| 响应字段 | Result<Map<String,Object>>,包含 head 和 dt |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /otg/timeSeries/jump |
| 请求体 | TimeSeriesQuery |
| 响应字段 | Result<List<TimeSeries>> |
TimeSeriesQuery 关键字段:
| 字段 | 类型 | 含义 |
|---|---|---|
hasLocal |
字符串 | 是否包含本地数据,Y 或 N |
tableNameEn |
字符串 | 中文表名 |
types |
数组 | 时序类型 |
id |
长整型 | 源数据 id |
rowId |
长整型 | 当前时间轴位置 |
rowIdSymbol |
枚举 | 滚动方向 |
startDate |
日期 | 起始日期 |
endDate |
日期 | 结束日期 |
典型调用示例:
POST /otg/timeSeries/list
{
"id": 1001,
"types": ["CALL_RECORD", "TRANS_RECORD"],
"startDate": "2026-01-01",
"endDate": "2026-10-28"
}
章节来源
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /sdc/list |
| 响应字段 | Result<List<SpecialDateRecord>> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /sdc/create |
| 请求体 | SpecialDateRecord |
| 响应字段 | Result<Void> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /sdc/update |
| 请求体 | SpecialDateRecord |
| 响应字段 | Result<Void> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /sdc/delete |
| 查询参数 | id,长整型 |
| 响应字段 | Result<Void> |
SpecialDateRecord 关键字段:
| 字段 | 类型 | 含义 |
|---|---|---|
id |
长整型 | 记录 id |
name |
字符串 | 名称 |
flag |
整数 | 内置或用户添加 |
type |
整数 | 0 公历,1 农历 |
gap |
整数 | 前后间隔天数 |
spDate |
字符串 | 临时日期 |
典型调用示例:
POST /sdc/create
{
"name": "春节",
"type": 1,
"gap": 1,
"spDate": "01-01"
}
章节来源
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/preFile |
| 请求体 | PrepareProcessFileDTO |
| 响应字段 | Result<List<FileInfo>> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/preFileUpload |
| 内容类型 | multipart/form-data |
| 表单字段 | file |
| 查询参数 | batchId、reClean |
| 响应字段 | Result<FileInfo> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/rawPreview |
| 请求体 | RawPreviewQuery |
| 响应字段 | Result<RawPreviewDTO> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/doClean |
| 请求体 | DoCleanDTO |
| 响应字段 | Result<Void> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /dm/cancelClean |
| 查询参数 | batchId |
| 响应字段 | Result<Void> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /dm/clearUploadBatch |
| 查询参数 | batchId |
| 响应字段 | Result<Void> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/getFiles |
| 请求体 | FileInfoQuery |
| 响应字段 | Result<List<FileInfo>> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/deletedFiles |
| 请求体 | DeletedFilesDTO |
| 响应字段 | Result<Void> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /dm/calcData |
| 查询参数 | batchId |
| 响应字段 | Result<CalcDataDTO> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | GET |
| URL | /dm/getGovernConfList |
| 响应字段 | Result<List<GovernConf>> |
| 项目 | 说明 |
|---|---|
| HTTP 方法 | POST |
| URL | /dm/saveGovernCon |
| 请求体 | List<GovernConf> |
| 响应字段 | Result<Void> |
典型调用示例:
POST /dm/preFileUpload
Content-Type: multipart/form-data
file: <Excel 或 CSV 文件>
batchId: 1700000000000000001
reClean: 1
POST /dm/rawPreview
{
"sheetId": "sheet_1",
"headerRowIndex": 0,
"headers": [],
"limit": 2000
}
章节来源
classDiagram
class GovernController {
+sse()
+ssePut()
+start(taskProcess)
}
class GovernTreeController {
+getTree()
+treeTablePage(dto)
+getTreeTransPersonPage(dto)
+getTreeTransBankPage(dto)
+getTreeCallPersonPage(dto)
+getTreeCallOperPage(dto)
+getTreeCallPersonUseOpenInfoPage(dto)
+getTreeCallOperUseOpenInfoPage(dto)
}
class GovernService {
+calcTask(taskProcess, caseId, userId)
+tryStartGovern(caseId)
+calcTreeTemplateDataCnt()
}
class GovernTreeService {
+getTree()
+getTreeTablePage(dto)
+getTreeTransPersonPage(dto)
}
class GovernConfService {
+saveGovernConfBatch(list)
+getCallTableName()
+getTransTableName()
+useOpenInfo()
+useDuplicate()
}
class SearchController {
+search(query)
}
class SearchQueryService {
+search(keyword)
}
class TimeSeriesController {
+getTimeSeries(query)
+detailTimeSeries(query)
+jumpTimeSeries(query)
}
class TimeSeriesService {
+getTimeSeries(query)
+detailTimeSeries(query)
+jumpTimeSeries(query)
}
class SpecialDateController {
+list()
+create(sdr)
+update(sdr)
+delete(id)
}
class SpecialDateService {
+create(sdr)
+update(sdr)
+delete(id)
+listRecord()
}
class DmController {
+preProcessFile(dto)
+preFileUpload(file,batchId,reClean)
+rawPreview(query)
+doClean(dto)
+cancelClean(batchId)
+clearUploadBatch(batchId)
+getFiles(query)
+deletedFiles(dto)
+calcData(batchId)
+getGovernConfList()
+saveOrUpdate(list)
}
class DmService {
+preProcessFile(dto)
+preProcessUploadedFile(file,batchId,reClean)
+rawPreview(query)
+doClean(dto)
+calcData(batchId)
}
GovernController --> GovernService : "调用"
GovernTreeController --> GovernTreeService : "调用"
GovernService --> GovernConfService : "读取表名与开关"
GovernTreeService --> GovernConfService : "读取表名与开关"
SearchController --> SearchQueryService : "调用"
TimeSeriesController --> TimeSeriesService : "调用"
SpecialDateController --> SpecialDateService : "调用"
DmController --> DmService : "调用"
DmController --> GovernConfService : "读取配置"
图示来源
治理任务使用虚拟线程执行器,每个任务一条虚拟线程,避免旧线程池被大案件占满。同一案件通过进程内集合互斥,防止双击或多标签页并发导致共享表被互相清空。
文件预处理限制最大并发度,并使用信号量控制并发解析数量,单个任务设置超时,整体处理也受超时保护。
全文检索最多返回 500 条结果,默认按时间降序排列。
时间序列跳转默认使用大于方向,未显式传滚动方向时会采用默认符号。
[本节为通用性能说明,不直接分析具体代码行]
现象:
排查要点:
dataCount 不为零;相关实现线索:
章节来源
现象:
/search/list 返回空列表;排查要点:
keyword;章节来源
现象:
排查要点:
TimeSeriesQuery 中的 id、types、时间范围;detailTimeSeries 中传入的 tableName 是否在系统表映射中存在;章节来源
现象:
排查要点:
id;gap 为空时不生成区间,type 为空时按公历处理。章节来源
现象:
排查要点:
application/json,POST 对象入参必须加请求体注解;batchId、文件信息和清洗配置;章节来源
治理与其他业务接口围绕“数据建模 → 治理计算 → 可视分析”这条主线展开:
调用这些接口时,应重点关注: