fix(product): 产品详情回显 agencyId + agencyName (PR #1722)
通知 mmg 前端: - ProductDetailRespVO 加 agencyId + agencyName - 新加 AgencyFeignClient (product-v2 → order-v2) - 编辑页打开 form.agencyId 自动绑定回显, 下拉自动选中 测试服 round-trip 通过 (2026-05-06 17:45). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
这个提交包含在:
父节点
0b54b57334
当前提交
a747412fc3
@ -0,0 +1,87 @@
|
|||||||
|
# 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
|
||||||
正在加载...
x
在新工单中引用
屏蔽一个用户