# fix(product): 产品详情接口回显 agencyId + agencyName

**日期**: 2026-05-06 17:45
**通知对象**: @mmg (前端)
**关联 PR**: wx/HL #1722 (已 merge dev + 测试服部署 + round-trip 通过)

---

## 一、用户反馈

产品编辑页「所属公司」字段下拉选中保存后,**重新打开编辑页不回显**,看起来像「保存不上」。

## 二、根因

DB `product` 表 `agency_id` 字段已**正确保存**(SQL 直查 `product_id=2045018534152478721 → agency_id=2051922156798779394 hulai`)。

但 `ProductDetailRespVO` **没有 agencyId / agencyName 字段** → `BeanUtil.toBean(product, vo)` 复制不到 → 前端 GET 拿到 50+ 字段 response 但**无 agencyId** → 前端下拉绑不上。

## 三、修复

| 文件 | 改动 |
|---|---|
| `ProductDetailRespVO` | 加 `agencyId: Long` + `agencyName: String` |
| `ProductQueryService.getProductDetail` | 显式 `setAgencyId(product.getAgencyId())` (BeanUtil 兜底防跨 BaseDO null 覆盖); Feign 调 order-v2 拿 `agencyName` 中文 (失败 log.warn 不阻断) |
| `AgencyFeignClient` (新) | product-v2 → order-v2 `/internal/agency/{id}` |
| `AgencyDTO` (新) | 简版 4 字段 (agencyId/code/agencyName/isPrimary), 不与 order-v2 AgencyInternalDTO 强耦合 |

## 四、API 改动

`GET /admin/product/item/{id}` 响应新增 2 字段:

```json
{
  "code": 200,
  "data": {
    "productId": 2045018534152478721,
    "name": "游牧的森林·南线经典",
    "agencyId": 2051922156798779394,                // ← 新增, 编辑页下拉绑定值
    "agencyName": "内蒙古呼籁国际旅行社有限公司",      // ← 新增, 中文回显 (Feign 拿)
    "productType": "CORE",
    ...
  }
}
```

## 五、前端建议

编辑页打开后, 直接绑定:

```vue
<NSelect
  v-model:value="form.agencyId"     <!-- 后端返 agencyId 自动选中 -->
  :options="agencyOptions"
  :placeholder="form.agencyName || '请选择所属公司'"
/>
```

下拉选项仍调 `GET /admin/travel-agency/enabled` 拿全部启用公司, 编辑页打开时 `form.agencyId` 自动绑定后端返的 id, 下拉自动选中对应项。

## 六、测试服 round-trip 验证 (2026-05-06 17:45)

```bash
TOK=$(curl -sk -X POST "https://api.test.1814.love:9443/admin/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"Admin@123456"}' \
  | python -c "import json,sys; print(json.load(sys.stdin)['data']['token'])")

curl -sk "https://api.test.1814.love:9443/admin/product/item/2045018534152478721" \
  -H "Authorization: Bearer $TOK" | python -c "
import json,sys
d = json.load(sys.stdin)['data']
print(f'agencyId   = {d[\"agencyId\"]}')
print(f'agencyName = {d[\"agencyName\"]}')
"
# agencyId   = 2051922156798779394
# agencyName = 内蒙古呼籁国际旅行社有限公司
```

## 七、关联

agency 模块 PR 清单:
- #1715 / #1717 / #1718 / #1719 / #1720 / #1721 (公司模块完整闭合)
- **#1722 (本 PR — 产品详情回显)**

---

cc @mmg
