Files
ccdi/doc/中介黑名单列表查询功能说明.md
2026-02-04 18:36:20 +08:00

6.9 KiB
Raw Blame History

中介黑名单列表查询功能说明

接口说明

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 为个人中介的总数

注意事项

  1. 类型过滤在数据库层面完成,不是在应用层过滤
  2. 分页使用 MyBatis Plus 的自动分页SQL 自动添加 LIMIT/OFFSET
  3. 机构中介的 ID 为 0,因为主键是字符串类型(社会信用代码)
  4. 查询时自动过滤 ent_source='INTERMEDIARY',确保只返回中介来源的企业