6.9 KiB
6.9 KiB
中介黑名单列表查询功能说明
接口说明
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: 查询所有中介(个人+机构)
GET /ccdi/intermediary/list
场景2: 只查询个人中介
GET /ccdi/intermediary/list?intermediaryType=1
场景3: 只查询机构中介
GET /ccdi/intermediary/list?intermediaryType=2
场景4: 按姓名查询个人中介
GET /ccdi/intermediary/list?intermediaryType=1&name=张三
场景5: 按证件号查询机构中介
GET /ccdi/intermediary/list?intermediaryType=2&certificateNo=91110000...
场景6: 分页查询所有中介
GET /ccdi/intermediary/list?pageNum=1&pageSize=10
SQL 实现逻辑
分页查询优化
使用 UNION ALL 在数据库层面完成联合查询和分页,提升性能:
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 层实现:
@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"时,只查询机构中介
返回数据格式
个人中介
{
"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
}
机构中介
{
"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: 查询所有中介
curl -X GET "http://localhost:8080/ccdi/intermediary/list" \
-H "Authorization: Bearer $TOKEN"
预期: 返回个人和机构两种类型的数据
测试2: 只查询个人中介
curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=1" \
-H "Authorization: Bearer $TOKEN"
预期: 只返回个人中介数据
测试3: 只查询机构中介
curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=2" \
-H "Authorization: Bearer $TOKEN"
预期: 只返回机构中介数据
测试4: 分页查询个人中介
curl -X GET "http://localhost:8080/ccdi/intermediary/list?intermediaryType=1&pageNum=1&pageSize=10" \
-H "Authorization: Bearer $TOKEN"
预期:
- 返回第1页,最多10条个人中介数据
- total 为个人中介的总数
注意事项
- 类型过滤在数据库层面完成,不是在应用层过滤
- 分页使用 MyBatis Plus 的自动分页,SQL 自动添加 LIMIT/OFFSET
- 机构中介的 ID 为 0,因为主键是字符串类型(社会信用代码)
- 查询时自动过滤
ent_source='INTERMEDIARY',确保只返回中介来源的企业