# 修复 /mp/common/merchant-qualifications 不按 visible 字段过滤

**类型**: BUG 修复(后端单点)
**前端处理者**: mmg(无前端动作, 后端透明修复)
**日期**: 2026-05-06
**关联**: 工单 #1758 / PR #1760

---

## 现象

管理端「编辑旅行社」弹窗里把「是否在小程序展示」开关关闭(visible=0)后, 小程序 `GET /mp/common/merchant-qualifications` 仍返回该公司, 与开关语义不符。

## 根因

`TravelAgencyMapper.selectNonPrimaryEnabled()`(PR #1751 引入)只过滤 `status=ENABLED + 非主体`, 漏过 `visible=1`。

PR #1756 (Closes #1749) 后加 `agency.visible` 字段时未回头给本 mp 接口加过滤。

## 修复

`TravelAgencyMapper.selectNonPrimaryEnabled()` 加 `.eq(visible, 1)` 一行。

新增 `TravelAgencyMapperTest` 防回归: 用 `MockitoExtension + TableInfoHelper.initTableInfo` 模板, 断言 wrapper SQL 含 status/visible/is_primary 三个条件 + visible 用 `=` 比较 + paramNameValuePairs 值集合含 ENABLED/1/0。

## 影响 / 不影响

| 接口 | 是否受影响 |
|------|-----------|
| `/mp/common/merchant-qualifications` | ✅ 修复(只返 visible=1 的非主体公司) |
| `/mp/agency/primary` | ❌ 主体单独路径, 不在此修复范围 |
| admin 列表/详情、Feign `internal/agency/{id}` 等 | ❌ 不受影响 |

## 缓存

`MpCommonController.merchantQualifications` 已声明 `@MpCache(deps={"table:travel_agency", "table:travel_agency_qualification"})`, admin update 走 `afterCommitAuditAndCacheBust` invalidate `table:travel_agency`, 配置已正确。

## 前端无需改动

接口 URL/响应结构无变化, 仅过滤行为变严, 之前隐藏的公司本来就不应出现在小程序合作商家页, 修复后符合预期。
