# 人员数据接口
**本文引用的文件**
- [PersonBasicInfoController.java](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java)
- [PersonGroupController.java](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java)
- [IntimacyController.java](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java)
- [ResidentPopulationController.java](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/ResidentPopulationController.java)
- [DataProfileController.java](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java)
- [personApi.ts](file://ai-electron/frontend/src/person/api/personApi.ts)
- [dpApi.ts](file://ai-electron/frontend/src/person/api/dpApi.ts)
- [types/query.ts](file://ai-electron/frontend/src/person/api/types/query.ts)
- [types/dto.ts](file://ai-electron/frontend/src/person/api/types/dto.ts)
## 目录
1. [简介](#简介)
2. [项目结构定位](#项目结构定位)
3. [核心控制器总览](#核心控制器总览)
4. [统一响应与分页格式](#统一响应与分页格式)
5. [接口定义](#接口定义)
6. [实体关联与查询方式](#实体关联与查询方式)
7. [敏感字段与安全处理](#敏感字段与安全处理)
8. [curl 示例:查询某人员及其关系](#curl-示例查询某人员及其关系)
9. [常见问题排查](#常见问题排查)
10. [性能与使用建议](#性能与使用建议)
11. [结论](#结论)
## 简介
本文面向后端人员和画像相关接口的使用者,重点说明以下能力:
- 人员基本信息、人员分组、亲密度配置、常住人口和人口统计。
- 人员数据画像中的通话统计、最常联系人、交易统计、最常交易对象、银行卡信息和趋势统计。
- 每个接口的 HTTP 方法、URL、请求参数、响应字段、分页格式。
- 人员实体与通话、交易、轨迹、治理树等业务数据的关联查询思路。
- 敏感字段的安全处理方式和前端展示建议。
- 常见问题的排查方法,包括人员不存在、分组为空、亲密度数据缺失等。
## 项目结构定位
人员数据接口主要分布在后端 `ai-server` 模块的 `com.zsjz.ai.module.person.controller` 包中,并由前端 `ai-electron/frontend/src/person/api` 调用:
- 后端控制器:
- 人员基本信息:`PersonBasicInfoController`
- 人员分组:`PersonGroupController`
- 亲密度配置:`IntimacyController`
- 常住人口:`ResidentPopulationController`
- 数据画像:`DataProfileController`
- 前端 API:
- `personApi.ts`:封装人员基本信息、分组、亲密度等接口。
- `dpApi.ts`:封装数据画像接口。
- `types/query.ts`、`types/dto.ts`:定义查询条件和响应类型。
```mermaid
graph TB
subgraph "前端"
PersonAPI["personApi.ts"]
DpAPI["dpApi.ts"]
TypesQ["types/query.ts"]
TypesDTO["types/dto.ts"]
end
subgraph "后端控制器"
PbiCtrl["PersonBasicInfoController
/pbi"]
PgCtrl["PersonGroupController
/pg"]
IntCtrl["IntimacyController
/intimacy"]
RpCtrl["ResidentPopulationController
/rp"]
DpCtrl["DataProfileController
/dp"]
end
PersonAPI --> PbiCtrl
PersonAPI --> PgCtrl
PersonAPI --> IntCtrl
DpAPI --> DpCtrl
TypesQ --> DpAPI
TypesDTO --> DpAPI
```
**图表来源**
- [PersonBasicInfoController.java:8-62](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L8-L62)
- [PersonGroupController.java:8-84](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L8-L84)
- [IntimacyController.java:17-39](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java#L17-L39)
- [ResidentPopulationController.java:8-13](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/ResidentPopulationController.java#L8-L13)
- [DataProfileController.java:24-190](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L24-L190)
- [personApi.ts](file://ai-electron/frontend/src/person/api/personApi.ts)
- [dpApi.ts](file://ai-electron/frontend/src/person/api/dpApi.ts)
- [types/query.ts](file://ai-electron/frontend/src/person/api/types/query.ts)
- [types/dto.ts](file://ai-electron/frontend/src/person/api/types/dto.ts)
**章节来源**
- [PersonBasicInfoController.java:8-62](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L8-L62)
- [PersonGroupController.java:8-84](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L8-L84)
- [IntimacyController.java:17-39](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java#L17-L39)
- [ResidentPopulationController.java:8-13](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/ResidentPopulationController.java#L8-L13)
- [DataProfileController.java:24-190](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L24-L190)
- [personApi.ts](file://ai-electron/frontend/src/person/api/personApi.ts)
- [dpApi.ts](file://ai-electron/frontend/src/person/api/dpApi.ts)
- [types/query.ts](file://ai-electron/frontend/src/person/api/types/query.ts)
- [types/dto.ts](file://ai-electron/frontend/src/person/api/types/dto.ts)
## 核心控制器总览
| 控制器 | 基础路径 | 职责 | 关键能力 |
|---|---|---|---|
| 人员基本信息控制器 | `/pbi` | 管理 `PersonBasicInfo` | 创建、删除、更新、查询人员列表、排序 |
| 人员分组控制器 | `/pg` | 管理 `PersonGroup` 及人员分组关系 | 分组增删改查、添加人员、移除人员、设置主成员 |
| 亲密度控制器 | `/intimacy` | 管理亲密度配置 | 获取亲密度列表、批量修改亲密度 |
| 常住人口控制器 | `/rp` | 常住人口相关服务入口 | 当前代码未暴露具体接口方法,需以实际新增方法为准 |
| 数据画像控制器 | `/dp` | 人员画像统计分析 | 通话统计、最常联系 TOP10、通话站点、通话记录汇总、运营商手机号;交易统计、最常交易 TOP10、交易记录汇总、对方名称分页、银行卡信息、月度年度趋势、亲密度汇总 |
**章节来源**
- [PersonBasicInfoController.java:8-62](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L8-L62)
- [PersonGroupController.java:8-84](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L8-L84)
- [IntimacyController.java:17-39](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java#L17-L39)
- [ResidentPopulationController.java:8-13](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/ResidentPopulationController.java#L8-L13)
- [DataProfileController.java:24-190](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L24-L190)
## 统一响应与分页格式
### 统一响应
所有接口统一返回 `Result` 包装结构,成功时携带业务数据,失败时通过状态码和消息描述错误。常见语义如下:
- 成功:业务数据位于响应体的数据字段中。
- 失败:包含错误码、错误消息、是否成功标志。
- 空数据:部分接口可能返回空列表或空对象,而不是抛出异常。
由于本文聚焦接口契约,不直接输出后端 `Result` 类源码,调用方应基于前端类型定义和实际响应体判断业务结果。
### 分页格式
分页接口通常返回 MyBatis-Plus 的 `Page` 结构,典型字段包括:
- `records`:当前页数据列表。
- `total`:总记录数。
- `current`:当前页码。
- `size`:每页数量。
- `pages`:总页数。
分页请求一般由 `Query` 或具体查询 DTO 传入页码、每页数量、过滤条件。
**章节来源**
- [DataProfileController.java:24-190](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L24-L190)
## 接口定义
### 人员基本信息接口
#### 创建人员信息
- **HTTP 方法**:`POST`
- **URL**:`/pbi/create`
- **请求体**:`PersonBasicInfoDTO`
- **响应**:`Result`
- **用途**:新增或覆盖人员基本信息。
**章节来源**
- [PersonBasicInfoController.java:17-26](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L17-L26)
#### 删除人员信息
- **HTTP 方法**:`GET`
- **URL**:`/pbi/delete`
- **请求参数**:`personName`
- **响应**:`Result`
- **用途**:根据姓名删除人员基本信息。
**章节来源**
- [PersonBasicInfoController.java:28-35](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L28-L35)
#### 更新人员信息
- **HTTP 方法**:`POST`
- **URL**: `/pbi/update`
- **请求体**:`PersonBasicInfoDTO`
- **响应**:`Result`
- **用途**:更新已有人员信息。
**章节来源**
- [PersonBasicInfoController.java:37-44](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L37-L44)
#### 查询人员列表
- **HTTP 方法**:`GET`
- **URL**:`/pbi/getPersons`
- **请求参数**:无
- **响应**:`Result>`
- **用途**:返回全部人员基本信息列表。
**章节来源**
- [PersonBasicInfoController.java:46-50](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L46-L50)
#### 人员排序
- **HTTP 方法**:`POST`
- **URL**:`/pbi/personOrder`
- **请求体**:`List`
- **响应**:`Result`
- **用途**:按前端传入顺序保存人员排序。
**章节来源**
- [PersonBasicInfoController.java:52-57](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L52-L57)
### 人员分组接口
#### 获取分组列表
- **HTTP 方法**:`GET`
- **URL**:`/pg/list`
- **请求参数**:无
- **响应**:`Result>`
- **用途**:返回系统内所有分组。
**章节来源**
- [PersonGroupController.java:17-21](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L17-L21)
#### 创建分组
- **HTTP 方法**:`POST`
- **URL**:`/pg/create`
- **请求体**:`PersonGroup`
- **响应**:`Result`
- **用途**:新增分组。
**章节来源**
- [PersonGroupController.java:23-30](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L23-L30)
#### 更新分组
- **HTTP 方法**:`POST`
- **URL**:`/pg/update`
- **请求体**:`PersonGroup`
- **响应**:`Result`
- **用途**:修改分组信息。
**章节来源**
- [PersonGroupController.java:32-39](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L32-L39)
#### 删除分组
- **HTTP 方法**:`POST`
- **URL**:`/pg/delete`
- **请求体**:`DeletePersonGroupDTO`,包含 `id`
- **响应**:`Result`
- **用途**:删除指定分组。
**章节来源**
- [PersonGroupController.java:41-49](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L41-L49)
#### 添加人员到分组
- **HTTP 方法**:`POST`
- **URL**:`/pg/addPerson`
- **请求体**:`AddPersonGroupDTO`
- **响应**:`Result`
- **用途**:将人员加入某个分组。
**章节来源**
- [PersonGroupController.java:51-58](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L51-L58)
#### 从分组移除人员
- **HTTP 方法**:`GET`
- **URL**:`/pg/remPerson`
- **请求参数**:`relId`
- **响应**:`Result`
- **用途**:根据关系 ID 移除分组中的人员。
**章节来源**
- [PersonGroupController.java:60-65](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L60-L65)
#### 设置主成员
- **HTTP 方法**:`GET`
- **URL**:`/pg/changeMain`
- **请求参数**:`relId`、`groupId`
- **响应**:`Result`
- **用途**:调整分组中的人员主成员关系。
**章节来源**
- [PersonGroupController.java:67-71](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L67-L71)
### 亲密度接口
#### 获取亲密度列表
- **HTTP 方法**:`GET`
- **URL**:`/intimacy/list`
- **请求参数**:无
- **响应**:`Result>`
- **用途**:返回亲密度规则或配置项。
**章节来源**
- [IntimacyController.java:25-31](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java#L25-L31)
#### 批量修改亲密度
- **HTTP 方法**:`POST`
- **URL**:`/intimacy/modify`
- **请求体**:`List`
- **响应**:`Result`
- **用途**:批量更新亲密度配置。
**章节来源**
- [IntimacyController.java:33-38](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java#L33-L38)
### 常住人口接口
当前 `ResidentPopulationController` 仅声明基础路径 `/rp` 并注入服务,但未暴露具体接口方法。若后续扩展,新增方法会继承该基础路径。
**章节来源**
- [ResidentPopulationController.java:8-13](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/ResidentPopulationController.java#L8-L13)
### 数据画像接口
#### 通话数据统计
- **HTTP 方法**:`GET`
- **URL**:`/dp/callStat`
- **请求参数**:`personName`
- **响应**:`Result`
- **用途**:根据人员姓名统计号码分布、通话次数、日期范围、主叫被叫占比等。
**章节来源**
- [DataProfileController.java:38-48](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L38-L48)
#### 最常联系 TOP10
- **HTTP 方法**:`POST`
- **URL**:`/dp/callOftenTop10`
- **请求体**:`CallOftenTop10Query`
- **响应**:`Result>`
- **用途**:查询与指定人员通话频率最高的前 10 个联系人或号码。
**章节来源**
- [DataProfileController.java:50-59](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L50-L59)
#### 通话站点统计
- **HTTP 方法**:`POST`
- **URL**:`/dp/callStatStation`
- **请求体**:`CallStatStationQuery`
- **响应**:`Result>`
- **用途**:统计通话基站位置,辅助分析活动轨迹。
**章节来源**
- [DataProfileController.java:61-70](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L61-L70)
#### 通话记录汇总(分页)
- **HTTP 方法**:`POST`
- **URL**:`/dp/getCallRecordSummary`
- **请求体**:`CallRecordSummaryQuery`
- **响应**:`Result>`
- **用途**:分页查询通话记录汇总。
**章节来源**
- [DataProfileController.java:72-79](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L72-L79)
#### 获取运营商手机号信息
- **HTTP 方法**:`POST`
- **URL**:`/dp/getCallOperPhoneInfo`
- **请求体**:`CallOperPhoneInfoQuery`
- **响应**:`Result>`
- **用途**:查询人员手机号码及其运营商信息。
**章节来源**
- [DataProfileController.java:81-88](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L81-L88)
#### 交易数据统计
- **HTTP 方法**:`GET`
- **URL**:`/dp/transStat`
- **请求参数**:`personName`
- **响应**:`Result`
- **用途**:根据人员姓名统计银行分布、卡号数量、交易总额、余额等。
**章节来源**
- [DataProfileController.java:98-107](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L98-L107)
#### 最常交易 TOP10(分页)
- **HTTP 方法**:`POST`
- **URL**:`/dp/transOfPersons`
- **请求体**:`TransOftenTop10Query`
- **响应**:`Result>`
- **用途**:查询与指定人员交易频率最高的前 10 个账户或交易对象。
**章节来源**
- [DataProfileController.java:109-118](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L109-L118)
#### 交易记录汇总(分页)
- **HTTP 方法**:`POST`
- **URL**:`/dp/getTransRecordSummary`
- **请求体**:`TransRecordSummaryQuery`
- **响应**:`Result>`
- **用途**:分页查询交易记录汇总,支持金额、次数、卡号等筛选。
**章节来源**
- [DataProfileController.java:120-128](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L120-L128)
#### 交易对方名称分页
- **HTTP 方法**:`GET`
- **URL**:`/dp/getTransOtherName`
- **请求参数**:`Query`,包含页码、每页数量、人员姓名、对方名称等
- **响应**:`Result>`
- **用途**:分页查询去重后的交易对方名称。
**章节来源**
- [DataProfileController.java:130-137](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L130-L137)
#### 获取银行卡交易详细信息
- **HTTP 方法**:`POST`
- **URL**:`/dp/getTransBankCardInfo`
- **请求体**:`TransBankCardInfoQuery`
- **响应**:`Result>`
- **用途**:查询银行卡收支汇总、净额、余额、开户销户时间等。
**章节来源**
- [DataProfileController.java:139-147](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L139-L147)
#### 按月统计交易金额趋势
- **HTTP 方法**:`POST`
- **URL**:`/dp/transAmountTrendYM`
- **请求体**:`TransTrendQuery`
- **响应**:`Result>`
- **用途**:按月份统计交易金额变化趋势。
**章节来源**
- [DataProfileController.java:149-157](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L149-L157)
#### 按年统计交易金额趋势
- **HTTP 方法**:`POST`
- **URL**:`/dp/transAmountTrendY`
- **请求体**:`TransTrendQuery`
- **响应**:`Result>`
- **用途**:按年度统计交易金额变化趋势。
**章节来源**
- [DataProfileController.java:159-167](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L159-L167)
#### 亲密度汇总
- **HTTP 方法**:`GET`
- **URL**:`/dp/intimacySummary`
- **请求参数**:`personName`
- **响应**:`Result>`
- **用途**:返回某人员的亲密度汇总数据。
**章节来源**
- [DataProfileController.java:173-180](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L173-L180)
## 实体关联与查询方式
人员数据并非孤立存在,而是围绕“人员”这一主体,与通话、交易、轨迹、治理树等数据形成关联:
```mermaid
erDiagram
PERSON {
string person_name PK
string phone
string card_no
string id_card
string group_id
timestamp created_at
timestamp updated_at
}
PERSON_GROUP {
long id PK
string name
string description
}
CALL_RECORD {
long id PK
string caller
string callee
string person_name
timestamp call_time
string base_station
}
TRANSACTION {
long id PK
string person_name
string bank_card
string other_name
decimal amount
string trans_type
timestamp trans_time
}
TRAJECTORY {
long id PK
string person_name
string location
timestamp time
}
GOVERN_TREE {
long id PK
string person_name
string node_label
string relation_type
}
PERSON ||--o{ PERSON_GROUP : "属于"
PERSON ||--o{ CALL_RECORD : "发起或接听"
PERSON ||--o{ TRANSACTION : "参与"
PERSON ||--o{ TRAJECTORY : "出现于"
PERSON ||--o{ GOVERN_TREE : "构成节点"
```
- **人员与分组**:通过 `PersonGroup` 将人员归类,支持主成员标记和关系 ID 管理。
- **人员与通话**:通过 `personName`、`caller`、`callee` 等字段关联通话记录,用于统计最常联系人、通话站点、通话汇总。
- **人员与交易**:通过 `personName`、`bank_card`、`other_name` 关联交易数据,用于交易统计、最常交易对象、银行卡详情、趋势分析。
- **人员与轨迹**:通过 `personName` 关联轨迹数据,结合基站、地点和时间分析活动范围。
- **人员与治理树**:通过 `personName` 和关系类型构建治理树,用于案件分析和关系图谱。
```mermaid
sequenceDiagram
participant Client as "调用方"
participant DataProfile as "DataProfileController"
participant Service as "DataProfileService"
participant CallModel as "通话模型"
participant TransModel as "交易模型"
Client->>DataProfile: GET /dp/callStat?personName=张三
DataProfile->>Service: callInfoStat(personName)
Service->>CallModel: 查询通话统计
CallModel-->>Service: 通话统计结果
Service-->>DataProfile: CallDataProfileStatDTO
DataProfile-->>Client: Result
Client->>DataProfile: POST /dp/transOfPersons
DataProfile->>Service: transOfPersons(query)
Service->>TransModel: 查询交易统计
TransModel-->>Service: 分页交易 TOP10
Service-->>DataProfile: Page
DataProfile-->>Client: Result>
```
**图表来源**
- [DataProfileController.java:38-180](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L38-L180)
**章节来源**
- [DataProfileController.java:38-180](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L38-L180)
## 敏感字段与安全处理
人员数据中包含姓名、电话、身份证号、银行卡号、地址等敏感信息,安全处理建议如下:
1. **后端脱敏策略**
- 对身份证号、银行卡号进行掩码处理,例如保留前几位和后几位。
- 对手机号进行中间位替换。
- 对详细地址进行模糊化或分段显示。
- 避免在日志中输出完整敏感字段。
2. **前端展示策略**
- 使用统一的敏感字段渲染组件,避免直接打印原始值。
- 对需要查看明细的场景增加权限校验和操作留痕。
- 对列表页默认脱敏,详情页按需解密或二次确认。
3. **接口层控制**
- 非必要的接口不应返回完整敏感字段。
- 不同角色返回不同粒度的数据。
- 对外部系统对接时,优先使用标识符而非明文敏感值。
前端敏感字段处理可参考通用工具逻辑,并在人员画像页面中对电话、卡号、身份证等字段做脱敏展示。
**章节来源**
- [types/dto.ts](file://ai-electron/frontend/src/person/api/types/dto.ts)
## curl 示例:查询某人员及其关系
以下为常用 curl 示例,请根据实际服务地址替换 `BASE_URL`,并准备正确的登录态或鉴权头。
#### 查询人员基本信息列表
```bash
curl --location --request GET "BASE_URL/pbi/getPersons"
```
#### 查询某人员通话统计
```bash
curl --location --request GET "BASE_URL/dp/callStat?personName=张三"
```
#### 查询最常联系 TOP10
```bash
curl --location --request POST "BASE_URL/dp/callOftenTop10" \
--header "Content-Type: application/json" \
--data '{"personName":"张三","startTime":"","endTime":"","page":1,"size":10}'
```
#### 查询交易统计
```bash
curl --location --request GET "BASE_URL/dp/transStat?personName=张三"
```
#### 查询最常交易 TOP10
```bash
curl --location --request POST "BASE_URL/dp/transOfPersons" \
--header "Content-Type: application/json" \
--data '{"personName":"张三","startTime":"","endTime":"","page":1,"size":10}'
```
#### 查询交易对方名称分页
```bash
curl --location --request GET "BASE_URL/dp/getTransOtherName?page=1&size=10&personName=张三&otherName="
```
#### 查询亲密度汇总
```bash
curl --location --request GET "BASE_URL/dp/intimacySummary?personName=张三"
```
> 注意:以上请求体中的字段名来源于前端类型定义与服务端查询 DTO 的对应关系。若实际字段存在差异,请以服务端实现和前端类型为准。
**章节来源**
- [personApi.ts](file://ai-electron/frontend/src/person/api/personApi.ts)
- [dpApi.ts](file://ai-electron/frontend/src/person/api/dpApi.ts)
- [types/query.ts](file://ai-electron/frontend/src/person/api/types/query.ts)
- [DataProfileController.java:38-180](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L38-L180)
## 常见问题排查
### 人员不存在
- **现象**:通话统计、交易统计、亲密度汇总返回空数据或空列表。
- **排查步骤**:
1. 先调用 `/pbi/getPersons` 确认该人员是否存在。
2. 检查 `personName` 是否与系统中存储的姓名完全一致。
3. 若存在但画像为空,再分别调用通话、交易、亲密度接口确认数据来源。
4. 检查是否因数据清洗或案件数据源未接入导致缺失。
**章节来源**
- [PersonBasicInfoController.java:46-50](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonBasicInfoController.java#L46-L50)
- [DataProfileController.java:38-180](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L38-L180)
### 分组为空
- **现象**:分组列表为空,或人员无法加入分组。
- **排查步骤**:
1. 调用 `/pg/list` 确认是否存在分组。
2. 若没有分组,先调用 `/pg/create` 创建分组。
3. 调用 `/pg/addPerson` 将人员加入分组,注意请求体是否为 `AddPersonGroupDTO`。
4. 若仍失败,检查 `relId` 是否正确,必要时通过 `/pg/remPerson` 和 `/pg/changeMain` 调整关系。
**章节来源**
- [PersonGroupController.java:17-71](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/PersonGroupController.java#L17-L71)
### 亲密度数据缺失
- **现象**:亲密度列表为空,或 `/dp/intimacySummary` 返回空列表。
- **排查步骤**:
1. 调用 `/intimacy/list` 确认亲密度配置是否存在。
2. 若配置缺失,调用 `/intimacy/modify` 批量写入亲密度规则。
3. 若配置存在但汇总为空,检查该人员是否有通话或交易数据作为亲密度计算依据。
4. 检查前端是否对空数据做了默认处理。
**章节来源**
- [IntimacyController.java:25-38](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/IntimacyController.java#L25-L38)
- [DataProfileController.java:173-180](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L173-L180)
### 数据画像分页为空
- **现象**:最常联系 TOP10、最常交易 TOP10、通话记录汇总、交易记录汇总返回空分页。
- **排查步骤**:
1. 检查请求中的 `personName`、时间范围、交易类型、金额等过滤条件。
2. 逐步缩小条件,先查全量再叠加筛选。
3. 确认分页参数 `page`、`size` 是否合法。
4. 检查底层数据是否已入库,是否存在数据源未同步问题。
**章节来源**
- [DataProfileController.java:50-167](file://ai-server/src/main/java/com/zsjz/ai/module/person/controller/DataProfileController.java#L50-L167)
## 性能与使用建议
- **分页优先**:TOP10 和汇总接口已提供分页,避免一次性拉取大量数据。
- **缓存利用**:部分接口注释中包含缓存键提示,实际缓存行为以后端实现为准,建议对热点人员画像适当缓存。
- **批量操作**:亲密度修改使用批量接口,减少多次网络往返。
- **参数精简**:画像查询尽量只传必要字段,避免宽泛条件导致大数据扫描。
- **脱敏输出**:对包含敏感字段的响应,在前端做统一脱敏展示,降低泄露风险。
[本节为通用建议,不直接分析具体源码]
## 结论
人员数据接口以“人员”为中心,向上提供基本信息、分组管理和亲密度配置,向下支撑通话、交易、轨迹、治理树等多维业务数据的画像分析。调用方应重点关注:
- 接口基础路径和请求体结构。
- 分页接口的 `Page` 响应结构。
- 人员不存在、分组为空、亲密度缺失等常见场景。
- 敏感字段的后端脱敏与前端安全展示。
在实际集成时,建议先验证人员存在性和分组有效性,再调用画像接口,并对分页、缓存、脱敏做系统化设计。
[本节为总结性内容,不直接分析具体源码]