# 主题列表(产品线)按主题类型筛选

**日期**: 2026-04-27
**PR**: #1457 (Closes #1456)
**影响端**: 管理端 admin

## 背景

管理后台「前端配置 → 主题列表」(项目术语「主题」=「产品线」, 接口 `/admin/product/line/list`) 筛选「主题类型 = 小蒙马」点搜索, 28 条返回不变, 后端忽略 `productType` 参数。

## 根因

后端双重缺失：
1. `ProductLinePageReqVO` 未声明 `productType` 字段, Spring 自动绑定丢弃 query
2. `ProductLineMapper` 的 `selectPage` + `selectPageWithCount` 也没消费 `productType` 字段做 WHERE 过滤

## 接口变化

`GET /admin/product/line/list` query 参数**新增 1 个可选参数**:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `productType` | String | 否 | 产品类型过滤 (字典 `product_type`: `CORE`=核心 / `GROUP`=小蒙马 / `CUSTOM`=定制) |

不传时行为与原来一致（返回所有产品线）。

## 前端改动

筛选下拉「主题类型」选「小蒙马」时，发出 `?productType=GROUP`，本 PR 后端补齐过滤后**前端无需改动**自动生效。

## 验证 (测试服)

修复前 curl 实证:
```
?productType=GROUP   total=28 (BUG, 期望 3)
?productType=CORE    total=28 (BUG, 期望 5)
DB 实际分布: CORE=5 / GROUP=3 / CUSTOM=8 / NULL=12
```

修复后期望: `productType=GROUP` 返 3 条, `=CORE` 返 5 条, `=CUSTOM` 返 8 条。

## 数据权限边界

`productType` 过滤放在 `applyDataScopeFilter` **之前**, 复合 SQL 形如 `productType=? AND (datascope-OR-block)`, 超管 short-circuit, 普通管理员选 GROUP 在 datascope 收紧后仍命中 — 数据权限边界完整保留。

## C 端

`/internal` 同名筛选 `selectMpPage` 早已支持 productType 过滤, admin 漏掉, 修复后两端能力一致。
