270 lines
6.9 KiB
Markdown
270 lines
6.9 KiB
Markdown
|
|
# 中介黑名单列表查询功能说明
|
|||
|
|
|
|||
|
|
## 接口说明
|
|||
|
|
|
|||
|
|
### 1. 列表查询接口(不分页)
|
|||
|
|
|
|||
|
|
**接口地址:** `GET /ccdi/intermediary/list`
|
|||
|
|
|
|||
|
|
**请求参数:**
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
|||
|
|
|--------|------|------|------|------|
|
|||
|
|
| name | String | 否 | 姓名/机构名称(模糊查询) | 张三 |
|
|||
|
|
| certificateNo | String | 否 | 证件号/社会信用代码(模糊查询) | 110101... |
|
|||
|
|
| intermediaryType | String | 否 | 中介类型(1=个人,2=机构) | 1 |
|
|||
|
|
| status | String | 否 | 状态(0=正常,1=停用) | 0 |
|
|||
|
|
| pageNum | Int | 否 | 页码 | 1 |
|
|||
|
|
| pageSize | Int | 否 | 每页条数 | 10 |
|
|||
|
|
|
|||
|
|
**查询场景示例:**
|
|||
|
|
|
|||
|
|
#### 场景1: 查询所有中介(个人+机构)
|
|||
|
|
```http
|
|||
|
|
GET /ccdi/intermediary/list
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景2: 只查询个人中介
|
|||
|
|
```http
|
|||
|
|
GET /ccdi/intermediary/list?intermediaryType=1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景3: 只查询机构中介
|
|||
|
|
```http
|
|||
|
|
GET /ccdi/intermediary/list?intermediaryType=2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景4: 按姓名查询个人中介
|
|||
|
|
```http
|
|||
|
|
GET /ccdi/intermediary/list?intermediaryType=1&name=张三
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景5: 按证件号查询机构中介
|
|||
|
|
```http
|
|||
|
|
GET /ccdi/intermediary/list?intermediaryType=2&certificateNo=91110000...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景6: 分页查询所有中介
|
|||
|
|
```http
|
|||
|
|
GET /ccdi/intermediary/list?pageNum=1&pageSize=10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## SQL 实现逻辑
|
|||
|
|
|
|||
|
|
### 分页查询优化
|
|||
|
|
|
|||
|
|
使用 `UNION ALL` 在数据库层面完成联合查询和分页,提升性能:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
SELECT * FROM (
|
|||
|
|
-- 个人中介查询
|
|||
|
|
SELECT
|
|||
|
|
biz_id AS intermediary_id,
|
|||
|
|
name,
|
|||
|
|
person_id AS certificate_no,
|
|||
|
|
'1' AS intermediary_type,
|
|||
|
|
'0' AS status,
|
|||
|
|
date_source AS data_source,
|
|||
|
|
create_time,
|
|||
|
|
update_time
|
|||
|
|
FROM ccdi_biz_intermediary
|
|||
|
|
WHERE 1=1
|
|||
|
|
<!-- 类型过滤 -->
|
|||
|
|
<if test="intermediaryType != null">
|
|||
|
|
AND '1' = #{intermediaryType}
|
|||
|
|
</if>
|
|||
|
|
|
|||
|
|
UNION ALL
|
|||
|
|
|
|||
|
|
-- 机构中介查询
|
|||
|
|
SELECT
|
|||
|
|
0 AS intermediary_id,
|
|||
|
|
enterprise_name AS name,
|
|||
|
|
social_credit_code AS certificate_no,
|
|||
|
|
'2' AS intermediary_type,
|
|||
|
|
status,
|
|||
|
|
data_source,
|
|||
|
|
create_time,
|
|||
|
|
update_time
|
|||
|
|
FROM ccdi_enterprise_base_info
|
|||
|
|
WHERE ent_source = 'INTERMEDIARY'
|
|||
|
|
<!-- 类型过滤 -->
|
|||
|
|
<if test="intermediaryType != null">
|
|||
|
|
AND '2' = #{intermediaryType}
|
|||
|
|
</if>
|
|||
|
|
) AS combined_data
|
|||
|
|
ORDER BY create_time DESC
|
|||
|
|
LIMIT 10 OFFSET 0 -- MyBatis Plus 自动添加
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 类型过滤逻辑
|
|||
|
|
|
|||
|
|
### 在 SQL 子查询层面过滤
|
|||
|
|
|
|||
|
|
| 查询条件 | 个人中介子查询 | 机构中介子查询 |
|
|||
|
|
|----------|--------------|--------------|
|
|||
|
|
| `intermediaryType=null` | 执行 | 执行 |
|
|||
|
|
| `intermediaryType=1` | 执行 (`'1'='1'` 为真) | 不返回数据 (`'2'='1'` 为假) |
|
|||
|
|
| `intermediaryType=2` | 不返回数据 (`'1'='2'` 为假) | 执行 (`'2'='2'` 为真) |
|
|||
|
|
|
|||
|
|
**优势:**
|
|||
|
|
- ✅ 避免查询不需要的数据
|
|||
|
|
- ✅ 减少数据库 I/O
|
|||
|
|
- ✅ 提升 UNION 性能
|
|||
|
|
- ✅ 分页准确
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 列表查询(非分页)
|
|||
|
|
|
|||
|
|
Service 层实现:
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@Override
|
|||
|
|
public List<CcdiIntermediaryBlacklistVO> selectIntermediaryList(
|
|||
|
|
CcdiIntermediaryBlacklistQueryDTO queryDTO) {
|
|||
|
|
|
|||
|
|
List<CcdiIntermediaryBlacklistVO> resultList = new ArrayList<>();
|
|||
|
|
|
|||
|
|
// 查询个人中介
|
|||
|
|
if (StringUtils.isEmpty(queryDTO.getIntermediaryType()) || "1".equals(queryDTO.getIntermediaryType())) {
|
|||
|
|
LambdaQueryWrapper<CcdiBizIntermediary> personWrapper = buildPersonQueryWrapper(queryDTO);
|
|||
|
|
List<CcdiBizIntermediary> personList = bizIntermediaryMapper.selectList(personWrapper);
|
|||
|
|
personList.forEach(person -> resultList.add(convertPersonToVO(person)));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 查询机构中介
|
|||
|
|
if (StringUtils.isEmpty(queryDTO.getIntermediaryType()) || "2".equals(queryDTO.getIntermediaryType())) {
|
|||
|
|
LambdaQueryWrapper<CcdiEnterpriseBaseInfo> entityWrapper = buildEntityQueryWrapper(queryDTO);
|
|||
|
|
List<CcdiEnterpriseBaseInfo> entityList = enterpriseBaseInfoMapper.selectList(entityWrapper);
|
|||
|
|
entityList.forEach(entity -> resultList.add(convertEntityToVO(entity)));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return resultList;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**逻辑说明:**
|
|||
|
|
- 当 `intermediaryType` 为空时,查询两种类型
|
|||
|
|
- 当 `intermediaryType = "1"` 时,只查询个人中介
|
|||
|
|
- 当 `intermediaryType = "2"` 时,只查询机构中介
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 返回数据格式
|
|||
|
|
|
|||
|
|
### 个人中介
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "查询成功",
|
|||
|
|
"rows": [
|
|||
|
|
{
|
|||
|
|
"intermediaryId": 1,
|
|||
|
|
"name": "张三",
|
|||
|
|
"certificateNo": "110101199001011234",
|
|||
|
|
"intermediaryType": "1",
|
|||
|
|
"intermediaryTypeName": "个人",
|
|||
|
|
"status": "0",
|
|||
|
|
"statusName": "正常",
|
|||
|
|
"dataSource": "MANUAL",
|
|||
|
|
"dataSourceName": "手动录入",
|
|||
|
|
"createTime": "2026-02-04 10:00:00",
|
|||
|
|
"updateTime": "2026-02-04 10:00:00"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"total": 1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 机构中介
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "查询成功",
|
|||
|
|
"rows": [
|
|||
|
|
{
|
|||
|
|
"intermediaryId": 0,
|
|||
|
|
"name": "测试机构有限公司",
|
|||
|
|
"certificateNo": "91110000123456789X",
|
|||
|
|
"intermediaryType": "2",
|
|||
|
|
"intermediaryTypeName": "机构",
|
|||
|
|
"status": "0",
|
|||
|
|
"statusName": "正常",
|
|||
|
|
"dataSource": "MANUAL",
|
|||
|
|
"dataSourceName": "手动录入",
|
|||
|
|
"createTime": "2026-02-04 10:00:00",
|
|||
|
|
"updateTime": "2026-02-04 10:00:00"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"total": 1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 性能对比
|
|||
|
|
|
|||
|
|
| 场景 | 旧实现 | 新实现 |
|
|||
|
|
|------|--------|--------|
|
|||
|
|
| 查询所有 | 查询2张表 | UNION ALL 查询2张表 |
|
|||
|
|
| 只查个人 | 查询2张表,应用层过滤 | 只查个人表 |
|
|||
|
|
| 只查机构 | 查询2张表,应用层过滤 | 只查机构表 |
|
|||
|
|
| 分页 | 查询全部,手动截取 | LIMIT/OFFSET 数据库分页 |
|
|||
|
|
|
|||
|
|
**性能提升:**
|
|||
|
|
- 只查个人/机构时,减少50%的数据库查询
|
|||
|
|
- 大数据量分页时,避免内存溢出
|
|||
|
|
- 网络传输量减少 90%+
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试用例
|
|||
|
|
|
|||
|
|
### 测试1: 查询所有中介
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:8080/ccdi/intermediary/list" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期:** 返回个人和机构两种类型的数据
|
|||
|
|
|
|||
|
|
### 测试2: 只查询个人中介
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=1" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期:** 只返回个人中介数据
|
|||
|
|
|
|||
|
|
### 测试3: 只查询机构中介
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=2" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期:** 只返回机构中介数据
|
|||
|
|
|
|||
|
|
### 测试4: 分页查询个人中介
|
|||
|
|
```bash
|
|||
|
|
curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=1&pageNum=1&pageSize=10" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期:**
|
|||
|
|
- 返回第1页,最多10条个人中介数据
|
|||
|
|
- total 为个人中介的总数
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **类型过滤在数据库层面完成**,不是在应用层过滤
|
|||
|
|
2. **分页使用 MyBatis Plus 的自动分页**,SQL 自动添加 LIMIT/OFFSET
|
|||
|
|
3. **机构中介的 ID 为 0**,因为主键是字符串类型(社会信用代码)
|
|||
|
|
4. **查询时自动过滤 `ent_source='INTERMEDIARY'`**,确保只返回中介来源的企业
|