# 通话数据接口
**本文引用的文件**
- [CallRecordController.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallRecordController.java)
- [CallNightController.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallNightController.java)
- [CallContinuousController.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallContinuousController.java)
- [CallSensitiveController.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallSensitiveController.java)
- [CallRecordService.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallRecordService.java)
- [CallNightService.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallNightService.java)
- [CallContinuousService.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallContinuousService.java)
- [CallSensitiveService.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallSensitiveService.java)
- [CallRecordMapper.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallRecordMapper.java)
- [CallNightMapper.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallNightMapper.java)
- [CallContinuousMapper.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallContinuousMapper.java)
- [CallSensitiveMapper.java](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallSensitiveMapper.java)
- [CallRecordQuery.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallRecordQuery.java)
- [CallNightQuery.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallNightQuery.java)
- [CallContinuousQuery.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallContinuousQuery.java)
- [CallSensitiveQuery.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallSensitiveQuery.java)
- [CallRecord.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/entity/CallRecord.java)
- [CallNightDTO.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/dto/CallNightDTO.java)
- [CallContinuousDTO.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/dto/CallContinuousDTO.java)
- [CallSensitiveDTO.java](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/dto/CallSensitiveDTO.java)
## 目录
1. [文档目标与适用范围](#文档目标与适用范围)
2. [接口总览](#接口总览)
3. [调用模型与通用规则](#调用模型与通用规则)
4. [通话记录查询接口](#通话记录查询接口)
5. [夜间通话统计接口](#夜间通话统计接口)
6. [连续通话统计接口](#连续通话统计接口)
7. [敏感通话统计接口](#敏感通话统计接口)
8. [调查场景中的用途](#调查场景中的用途)
9. [与人员、轨迹、治理树的关联关系](#与人员轨迹治理树的关联关系)
10. [典型查询示例](#典型查询示例)
11. [分页、排序与性能说明](#分页排序与性能说明)
12. [常见问题排查](#常见问题排查)
13. [架构图](#架构图)
## 文档目标与适用范围
本文面向后端接口使用者、前端对接人员和调查分析人员,说明以下四类通话数据接口的请求参数、响应字段、分页方式及在调查工作中的使用方式:
- 通话记录查询
- 夜间通话统计
- 连续通话统计
- 敏感通话统计
这些接口统一通过控制器暴露 HTTP 端点,服务层负责动态表名、默认查询条件和业务预处理,数据访问层通过 MyBatis Mapper 执行数据库查询。
## 接口总览
| 模块 | 控制器 | 基础路径 | 主要接口 | 返回类型 |
|---|---|---|---|---|
| 通话记录 | `CallRecordController` | `/cr` | `POST /cr/getCallRecord` | 分页通话记录 |
| 夜间通话 | `CallNightController` | `/call/night` | `POST /call/night/statFirstCallNight` | 分页夜间汇总 |
| 夜间通话 | `CallNightController` | `/call/night` | `POST /call/night/statSecondCallNight` | 夜间明细汇总 |
| 连续通话 | `CallContinuousController` | `/call/continuous` | `POST /call/continuous/statFirstCallContinuous` | 分页连续汇总 |
| 连续通话 | `CallContinuousController` | `/call/continuous` | `POST /call/continuous/statSecondCallContinuous` | 分页详细连续汇总 |
| 敏感通话 | `CallSensitiveController` | `/call/sensitive` | `POST /call/sensitive/statFirstCallSensitive` | 分页敏感汇总 |
| 敏感通话 | `CallSensitiveController` | `/call/sensitive` | `POST /call/sensitive/statSecondCallSensitive` | 分页敏感明细 |
所有接口均使用 POST 方法,请求体为 JSON,统一由后端封装为 `Result` 对象返回。
**章节来源**
- [CallRecordController.java:1-38](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallRecordController.java#L1-L38)
- [CallNightController.java:1-53](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallNightController.java#L1-L53)
- [CallContinuousController.java:1-51](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallContinuousController.java#L1-L51)
- [CallSensitiveController.java:1-52](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallSensitiveController.java#L1-L52)
## 调用模型与通用规则
### 统一返回结构
后端控制器将业务结果包装为 `Result`,其中包含成功标志、数据和错误信息。调用方应优先判断整体是否成功,再读取具体数据字段。
### 统一查询基类
查询参数类继承通用 `Query` 基类,因此通常支持以下通用分页字段:
- `page`:页码
- `limit`:每页条数
实际分页实现依赖各 Controller 和服务层构造的 MyBatis-Plus `Page` 对象。
### 动态表名
所有通话相关查询都会通过 `GovernConfService.getCallTableName()` 设置动态表名。这意味着:
- 表名不是固定写死在接口中;
- 实际数据可能来自不同案件或不同数据源;
- 如果配置缺失或表名无效,可能出现空结果或数据库异常。
### 默认人员范围
夜间通话、连续通话和敏感通话的服务层会在未提供人员姓名列表时,自动填充系统已知人员姓名集合。这样可以在不指定具体人员的情况下进行全局扫描。
```mermaid
flowchart TD
Client["调用方"] --> Controller["通话数据控制器"]
Controller --> Service["通话数据服务层"]
Service --> Config["治理配置服务
获取通话表名"]
Service --> Person["人员基本信息服务
获取人员姓名列表"]
Service --> Mapper["MyBatis Mapper"]
Mapper --> Database["通话数据表"]
```
**图示来源**
- [CallRecordService.java:1-39](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallRecordService.java#L1-L39)
- [CallNightService.java:1-61](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallNightService.java#L1-L61)
- [CallContinuousService.java:1-58](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallContinuousService.java#L1-L58)
- [CallSensitiveService.java:1-58](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallSensitiveService.java#L1-L58)
**章节来源**
- [CallRecordService.java:24-38](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallRecordService.java#L24-L38)
- [CallNightService.java:33-60](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallNightService.java#L33-L60)
- [CallContinuousService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallContinuousService.java#L33-L57)
- [CallSensitiveService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallSensitiveService.java#L33-L57)
## 通话记录查询接口
### 接口定义
- HTTP 方法:`POST`
- URL:`/cr/getCallRecord`
- 请求体:`CallRecordQuery`
- 返回:分页的 `CallRecord`
### 请求参数
| 字段 | 类型 | 必填 | 含义 |
|---|---|---:|---|
| `id` | `Long` | 否 | 单条通话记录主键 |
| `ids` | `List` | 否 | 多条通话记录主键列表 |
| `fileId` | `Long` | 否 | 关联文件标识 |
| `sheetId` | `Long` | 否 | 关联工作表标识 |
| `personPhones` | `List` | 否 | 本方号码列表 |
| `operatorId` | `String` | 否 | 运营商 |
| `personPhoneArea` | `String` | 否 | 本方号码归属地 |
| `personCertNo` | `String` | 否 | 本方证件号码 |
| `personRegionId` | `String` | 否 | 本方基站大区号 |
| `personCellId` | `String` | 否 | 本方基站小区号 |
| `duration` | `Integer` | 否 | 通话时长 |
| `callDirection` | `String` | 否 | 主被叫标识 |
| `callType` | `String` | 否 | 通话类型 |
| `otherName` | `String` | 否 | 对方户名 |
| `otherPhones` | `List` | 否 | 对方号码列表 |
| `otherPhone` | `String` | 否 | 单个对方号码 |
| `startTime` | `String` | 否 | 开始时间 |
| `endTime` | `String` | 否 | 结束时间 |
| `symbol` | `String` | 否 | 比较符号,默认值为“ge” |
| `page` | `Long` | 否 | 页码 |
| `limit` | `Long` | 否 | 每页大小 |
### 特殊处理逻辑
- 比较符号为空时,默认使用“ge”。
- 如果对方号码列表中包含“未知号码”,会清空列表并改为按单个“未知号码”过滤。
- 表名由治理配置服务动态注入。
### 响应字段
| 字段 | 类型 | 含义 |
|---|---|---|
| `personName` | `String` | 本方姓名 |
| `personPhone` | `String` | 本方号码 |
| `operatorId` | `String` | 运营商 |
| `personPhoneArea` | `String` | 本方号码归属地 |
| `personCertNo` | `String` | 本方证件号码 |
| `personRegionId` | `String` | 本方基站大区号 |
| `personCellId` | `String` | 本方基站小区号 |
| `personStationName` | `String` | 本方基站名称 |
| `personStationLongitude` | `String` | 本方基站经度 |
| `personStationLatitude` | `String` | 本方基站纬度 |
| `callDateTime` | `LocalDateTime` | 通话日期时间 |
| `callDate` | `LocalDate` | 通话日期 |
| `callTime` | `LocalTime` | 通话时间 |
| `duration` | `Integer` | 通话时长 |
| `callDirection` | `String` | 主被叫标识 |
| `callType` | `String` | 通话类型 |
| `otherName` | `String` | 对方户名 |
| `otherPhone` | `String` | 对方号码 |
| `otherPhoneArea` | `String` | 对方号码归属地 |
| `otherCertNo` | `String` | 对方证件号码 |
| `remark` | `String` | 备注 |
| `personLibId` | `String` | 关联人卡库 |
| `callLocal` | `String` | 本地通话标识 |
**章节来源**
- [CallRecordController.java:22-37](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallRecordController.java#L22-L37)
- [CallRecordService.java:24-38](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallRecordService.java#L24-L38)
- [CallRecordQuery.java:10-92](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallRecordQuery.java#L10-L92)
- [CallRecord.java:28-198](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/entity/CallRecord.java#L28-L198)
## 夜间通话统计接口
### 第一层:按时间段汇总
- HTTP 方法:`POST`
- URL:`/call/night/statFirstCallNight`
- 请求体:`CallNightQuery`
- 返回:分页的 `CallNightDTO`
该接口用于按时间段汇总夜间通话次数,适合先做宏观分析,例如查看某人在哪些夜间时段频繁通话。
#### 请求参数
| 字段 | 类型 | 必填 | 含义 |
|---|---|---:|---|
| `nightStart` | `Integer` | 否 | 夜间起始小时 |
| `nightEnd` | `Integer` | 否 | 夜间结束小时 |
| `monthVal` | `Integer` | 否 | 月份阈值 |
| `otherName` | `String` | 否 | 对方姓名 |
| `otherPhone` | `String` | 否 | 对方号码 |
| `personNames` | `List` | 否 | 人员姓名列表;为空时自动填充全部人员 |
| `page` | `Long` | 否 | 页码 |
| `limit` | `Long` | 否 | 每页大小 |
#### 响应字段
| 字段 | 类型 | 含义 |
|---|---|---|
| `time` | `String` | 时间段标识,如“22:00-23:00” |
| `otherName` | `String` | 对方姓名 |
| `personName` | `String` | 本方姓名 |
| `otherPhone` | `String` | 对方号码集合 |
| `callCount` | `Integer` | 通话总次数 |
| `totalMonthCount` | `Integer` | 跨越的月份总数 |
| `startHour` | `String` | 起始小时 |
| `endHour` | `String` | 结束小时 |
| `ids` | `String` | 关联标识集合 |
### 第二层:夜间通话详情
- HTTP 方法:`POST`
- URL:`/call/night/statSecondCallNight`
- 请求体:`CallNightQuery`
- 返回:`List`
该接口不再分页,返回更详细的夜间通话统计信息,适合在第一层筛选后进一步展开。
**章节来源**
- [CallNightController.java:26-52](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallNightController.java#L26-L52)
- [CallNightService.java:33-60](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallNightService.java#L33-L60)
- [CallNightQuery.java:8-16](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallNightQuery.java#L8-L16)
- [CallNightDTO.java:10-56](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/dto/CallNightDTO.java#L10-L56)
## 连续通话统计接口
### 第一层:按本人号码与对方姓名汇总
- HTTP 方法:`POST`
- URL:`/call/continuous/statFirstCallContinuous`
- 请求体:`CallContinuousQuery`
- 返回:分页的 `CallContinuousDTO`
该接口用于识别长期持续联系的对象,适合发现稳定联系人。
#### 请求参数
| 字段 | 类型 | 必填 | 含义 |
|---|---|---:|---|
| `monthVal` | `Integer` | 否 | 连续月份阈值 |
| `otherName` | `String` | 否 | 对方姓名 |
| `otherPhone` | `String` | 否 | 对方号码 |
| `personNames` | `List` | 否 | 人员姓名列表;为空时自动填充全部人员 |
| `page` | `Long` | 否 | 页码 |
| `limit` | `Long` | 否 | 每页大小 |
#### 响应字段
| 字段 | 类型 | 含义 |
|---|---|---|
| `personName` | `String` | 本方姓名 |
| `personPhone` | `String` | 本方手机号 |
| `otherPhone` | `String` | 合并后的对方手机号 |
| `otherPhones` | `String` | 对方号码集合 |
| `otherName` | `String` | 对方姓名 |
| `pairContMonthCount` | `Integer` | 持续月份 |
| `pairTotalCalls` | `Integer` | 通话总次数 |
| `continuousStartMonth` | `String` | 连续通话开始月份 |
| `continuousEndMonth` | `String` | 连续通话结束月份 |
### 第二层:按本人号码、对方姓名与对方号码细化
- HTTP 方法:`POST`
- URL:`/call/continuous/statSecondCallContinuous`
- 请求体:`CallContinuousQuery`
- 返回:分页的 `CallContinuousDTO`
该层级进一步区分具体对方号码,适合从“稳定联系人”下钻到具体号码组合。
**章节来源**
- [CallContinuousController.java:25-50](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallContinuousController.java#L25-L50)
- [CallContinuousService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallContinuousService.java#L33-L57)
- [CallContinuousQuery.java:8-24](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallContinuousQuery.java#L8-L24)
- [CallContinuousDTO.java:4-36](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/dto/CallContinuousDTO.java#L4-L36)
## 敏感通话统计接口
### 第一层:按对方姓名与对方号码汇总
- HTTP 方法:`POST`
- URL:`/call/sensitive/statFirstCallSensitive`
- 请求体:`CallSensitiveQuery`
- 返回:分页的 `CallSensitiveDTO`
该接口用于发现高风险或重点关注的通话对象。
#### 请求参数
| 字段 | 类型 | 必填 | 含义 |
|---|---|---:|---|
| `otherPhone` | `String` | 否 | 对方号码 |
| `otherName` | `String` | 否 | 对方姓名 |
| `personNames` | `List` | 否 | 人员姓名列表;为空时自动填充全部人员 |
| `page` | `Long` | 否 | 页码 |
| `limit` | `Long` | 否 | 每页大小 |
#### 响应字段
| 字段 | 类型 | 含义 |
|---|---|---|
| `personName` | `String` | 本方姓名 |
| `otherName` | `String` | 对方姓名 |
| `otherPhone` | `String` | 对方号码 |
| `callCount` | `Integer` | 通话次数 |
### 第二层:敏感通话明细
- HTTP 方法:`POST`
- URL:`/call/sensitive/statSecondCallSensitive`
- 请求体:`CallSensitiveQuery`
- 返回:分页的 `CallRecord`
该接口直接返回敏感通话的具体记录,便于结合时间、地点、主被叫方向等字段进行核查。
**章节来源**
- [CallSensitiveController.java:25-51](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallSensitiveController.java#L25-L51)
- [CallSensitiveService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallSensitiveService.java#L33-L57)
- [CallSensitiveQuery.java:8-22](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/query/CallSensitiveQuery.java#L8-L22)
- [CallSensitiveDTO.java:8-29](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/dto/CallSensitiveDTO.java#L8-L29)
- [CallRecord.java:28-198](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/entity/CallRecord.java#L28-L198)
## 调查场景中的用途
### 通话记录查询
适用于原始数据核对、证据调取、线索交叉验证。可基于号码、时间范围、主被叫方向、通话类型、基站信息等条件检索。
典型用途:
- 根据案件时间范围拉取目标号码的完整通话清单。
- 根据对方号码反查与本方号码的通话情况。
- 结合基站信息辅助定位通话发生区域。
### 夜间通话
适用于分析作息异常、隐蔽联络、非工作时间活动。
典型用途:
- 查找在深夜或凌晨频繁通话的人员。
- 按时间段观察夜间通话趋势。
- 锁定夜间高频联系人。
### 连续通话
适用于发现长期稳定联系关系。
典型用途:
- 找出跨月持续通话的对象。
- 分析联系持续时间跨度。
- 从稳定联系人进一步定位具体号码组合。
### 敏感通话
适用于风险预警和重点对象筛查。
典型用途:
- 快速发现高风险联系人。
- 对敏感联系人进行通话频次统计。
- 下钻查看具体敏感通话明细。
## 与人员、轨迹、治理树的关联关系
### 与人员
- 通话记录包含本方姓名、本方号码、本方证件号码、对方姓名、对方号码等信息。
- 夜间通话、连续通话、敏感通话在查询时可传入人员姓名列表;若为空,服务层会从人员基本信息服务中获取全部人员。
- 敏感通话和连续通话的第一层结果都带有本方姓名和对方姓名,便于与人员档案关联。
### 与轨迹
- 通话记录包含本方基站大区号、小区号、基站名称、经度、纬度等字段。
- 这些字段可与基站轨迹、位置轨迹联合分析,辅助还原通话发生时的大致位置。
- 夜间通话和连续通话虽然以汇总为主,但其底层仍来源于通话记录,可通过明细接口或原始通话记录接口联动轨迹数据。
### 与治理树
- 通话数据表名通过治理配置服务动态获取,说明通话数据属于治理体系下的数据资源。
- 治理树或治理配置决定当前查询使用哪张通话数据表,从而把通话数据纳入案件、数据源或组织维度的治理边界。
```mermaid
graph TB
CallRecord["通话记录"] --> Person["人员档案"]
CallRecord --> Track["轨迹数据"]
CallRecord --> Governance["治理配置
治理树与数据表映射"]
NightCall["夜间通话"] --> CallRecord
ContinuousCall["连续通话"] --> CallRecord
SensitiveCall["敏感通话"] --> CallRecord
```
**图示来源**
- [CallRecord.java:28-198](file://ai-server/src/main/java/com/zsjz/ai/common/model/call/entity/CallRecord.java#L28-L198)
- [CallNightService.java:33-60](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallNightService.java#L33-L60)
- [CallContinuousService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallContinuousService.java#L33-L57)
- [CallSensitiveService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallSensitiveService.java#L33-L57)
## 典型查询示例
### 示例一:查询某人某段时间内的通话记录
- 接口:`POST /cr/getCallRecord`
- 建议参数:
- `personPhones`:目标本方号码
- `startTime`:开始时间
- `endTime`:结束时间
- `page`:1
- `limit`:100
适用场景:案件时间范围内拉取目标号码通话清单。
### 示例二:查询夜间通话汇总
- 接口:`POST /call/night/statFirstCallNight`
- 建议参数:
- `nightStart`:22
- `nightEnd`:6
- `personNames`:目标人员姓名列表
- `page`:1
- `limit`:50
适用场景:分析目标人员在夜间的时间段分布。
### 示例三:查看连续通话的长期联系人
- 接口:`POST /call/continuous/statFirstCallContinuous`
- 建议参数:
- `monthVal`:大于等于期望的连续月数
- `personNames`:目标人员姓名列表
适用场景:识别稳定联系人。
### 示例四:查看敏感通话明细
- 接口:`POST /call/sensitive/statSecondCallSensitive`
- 建议参数:
- `otherPhone`:可疑对方号码
- `personNames`:目标人员姓名列表
- `page`:1
- `limit`:200
适用场景:对敏感联系人进行逐条核查。
## 分页、排序与性能说明
### 分页
- 通话记录、夜间通话、连续通话、敏感通话的分页接口均通过 MyBatis-Plus `Page` 传递页码和每页大小。
- 第一层汇总接口通常返回分页结果,适合列表展示。
- 夜间通话第二层详情接口返回普通列表,不分页。
- 敏感通话第二层明细接口返回分页通话记录,适合大数据量明细浏览。
### 排序
- 当前控制器和服务层没有显式设置默认排序字段。
- 最终排序行为取决于对应 Mapper 的 SQL 实现。
- 如需稳定排序,建议在调用前确认后端 SQL 是否已按时间、通话次数或其他关键字段排序。
### 性能特征
- 通话记录 Mapper 提供流式查询能力,适合大数据量导出或遍历。
- 其他分析接口多为聚合查询,受数据量和分组维度影响较大。
- 建议:
- 尽量缩小时间范围。
- 先使用第一层汇总接口筛选,再进入第二层明细。
- 控制每页大小,避免单次返回过多数据。
**章节来源**
- [CallRecordMapper.java:33-91](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallRecordMapper.java#L33-L91)
- [CallNightController.java:35-52](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallNightController.java#L35-L52)
- [CallContinuousController.java:33-50](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallContinuousController.java#L33-L50)
- [CallSensitiveController.java:33-51](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallSensitiveController.java#L33-L51)
## 常见问题排查
### 问题一:返回结果为空
可能原因:
- 时间范围过大但数据表中无匹配记录。
- 号码为空或未正确传入。
- 动态表名未配置或指向错误表。
- 人员姓名列表为空且系统中无可用人员名单。
排查建议:
1. 检查 `personPhones`、`otherPhone`、`otherName` 是否为空。
2. 缩小时间范围,先确认是否有任意通话记录。
3. 检查治理配置中通话表名是否正确。
4. 对夜间、连续、敏感接口,确认是否传入了有效人员姓名。
### 问题二:时间范围过大导致查询缓慢
可能原因:
- 全表扫描或大范围聚合。
- 多字段分组统计。
排查建议:
1. 先按年或月缩小时间范围。
2. 先用汇总接口,再进入明细接口。
3. 增加号码或人员限制,减少分组维度。
### 问题三:对方号码显示为“未知号码”
可能原因:
- 数据清洗或来源侧未解析出对方号码。
- 查询时对方号码列表包含“未知号码”,会被转换为单个“未知号码”过滤。
排查建议:
1. 使用通话记录接口查看原始 `otherPhone` 字段。
2. 检查上游数据清洗结果。
3. 明确是否需要保留“未知号码”这一分类。
### 问题四:夜间通话或连续通话人员范围太大
可能原因:
- 未传入 `personNames`,服务层自动填充全部人员。
排查建议:
1. 明确传入目标人员姓名列表。
2. 结合案件范围限定人员,避免全量扫描。
### 问题五:敏感通话结果与实际不符
可能原因:
- “敏感”的定义由后端逻辑决定,不一定只依赖号码或姓名。
- 第一层是汇总,第二层才是明细。
排查建议:
1. 使用第二层接口查看具体通话明细。
2. 结合时间、主被叫方向、通话类型、基站信息进行人工复核。
## 架构图
```mermaid
classDiagram
class CallRecordController {
+getCallRecord(query) Result
}
class CallNightController {
+statFirstCallNight(query) Result
+statSecondCallNight(query) Result
}
class CallContinuousController {
+statFirstCallContinuous(query) Result
+statSecondCallContinuous(query) Result
}
class CallSensitiveController {
+statFirstCallSensitive(query) Result
+statSecondCallSensitive(query) Result
}
class CallRecordService {
+getCallRecord(query) Page
}
class CallNightService {
+statFirstCallNight(query) Page
+statSecondCallNight(query) List
}
class CallContinuousService {
+statFirstCallContinuous(query) Page
+statSecondCallContinuous(query) Page
}
class CallSensitiveService {
+statFirstCallSensitive(query) Page
+statSecondCallSensitive(query) Page
}
class CallRecordMapper {
+selectCallRecordPage(page, query) Page
}
class CallNightMapper {
+statFirstCallNight(page, query) Page
+statSecondCallNight(query) List
}
class CallContinuousMapper {
+statFirstCallContinuous(page, query) Page
+statSecondCallContinuous(page, query) Page
}
class CallSensitiveMapper {
+statFirstCallSensitive(page, query) Page
+statSecondCallSensitive(page, query) Page
}
CallRecordController --> CallRecordService : "调用"
CallNightController --> CallNightService : "调用"
CallContinuousController --> CallContinuousService : "调用"
CallSensitiveController --> CallSensitiveService : "调用"
CallRecordService --> CallRecordMapper : "查询"
CallNightService --> CallNightMapper : "查询"
CallContinuousService --> CallContinuousMapper : "查询"
CallSensitiveService --> CallSensitiveMapper : "查询"
```
**图示来源**
- [CallRecordController.java:22-37](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallRecordController.java#L22-L37)
- [CallNightController.java:26-52](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallNightController.java#L26-L52)
- [CallContinuousController.java:25-50](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallContinuousController.java#L25-L50)
- [CallSensitiveController.java:25-51](file://ai-server/src/main/java/com/zsjz/ai/module/call/controller/CallSensitiveController.java#L25-L51)
- [CallRecordService.java:24-38](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallRecordService.java#L24-L38)
- [CallNightService.java:33-60](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallNightService.java#L33-L60)
- [CallContinuousService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallContinuousService.java#L33-L57)
- [CallSensitiveService.java:33-57](file://ai-server/src/main/java/com/zsjz/ai/module/call/service/CallSensitiveService.java#L33-L57)
- [CallRecordMapper.java:33-91](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallRecordMapper.java#L33-L91)
- [CallNightMapper.java:23-40](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallNightMapper.java#L23-L40)
- [CallContinuousMapper.java:23-39](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallContinuousMapper.java#L23-L39)
- [CallSensitiveMapper.java:23-40](file://ai-server/src/main/java/com/zsjz/ai/module/call/mapper/CallSensitiveMapper.java#L23-L40)