父节点
4e0bfb0081
当前提交
268cd7f444
@ -0,0 +1,66 @@
|
|||||||
|
# fix(product-v2): 创建产品基础信息 agencyId 未持久化致 INSERT 失败
|
||||||
|
|
||||||
|
**PR**: [#1823](https://git.1814.love:8443/wx/HL/pulls/1823) **Issue**: [#1822](https://git.1814.love:8443/wx/HL/issues/1822) **合并**: 2026-05-07
|
||||||
|
|
||||||
|
通知对象: 无前端配合(后端 VO 加字段, 前端原本就在传)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 现象
|
||||||
|
|
||||||
|
正式环境 admin.1814.love 创建产品: 填完基础信息点保存 → 弹 `字段【agency_id】未填写,请填写后重试`。前端实际已传 `agencyId="2051922156798779394"`,但被后端丢弃。重现率 100%。所有创建新产品的路径全部失败。
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /admin/product/item/basic
|
||||||
|
Body: {"name":"wx","productType":"CUSTOM","agencyId":"2051922156798779394",...}
|
||||||
|
响应: {"code":400,"message":"字段【agency_id】未填写,请填写后重试","success":false}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 根因
|
||||||
|
|
||||||
|
`ProductBasicSaveReqVO` 没有 `agencyId` 字段:
|
||||||
|
|
||||||
|
1. 前端 body 含 `agencyId="2051922156798779394"`
|
||||||
|
2. Jackson 反序列化丢弃(VO 无字段接收)
|
||||||
|
3. `ProductBasicService.doCreate` line 344 `BeanUtil.toBean(req, ProductDO.class)` → `product.agencyId = null`
|
||||||
|
4. INSERT 违反 `V20260507_001__product_agency_id_not_null.sql` 加的 `agency_id BIGINT NOT NULL`
|
||||||
|
5. MySQL 抛 `Field 'agency_id' doesn't have a default value`
|
||||||
|
6. `GlobalExceptionHandler.FIELD_NO_DEFAULT` 翻译为「字段【agency_id】未填写」
|
||||||
|
|
||||||
|
时间线: V20260506_001 加列 → V20260506_006 软删行回填 → **V20260507_001 NOT NULL = 引爆点**
|
||||||
|
|
||||||
|
## 后端修了什么
|
||||||
|
|
||||||
|
1. `ProductBasicSaveReqVO` 加字段:
|
||||||
|
```java
|
||||||
|
@NotNull(message = "所属旅行社公司不能为空")
|
||||||
|
@ApiModelProperty(value = "所属旅行社公司ID(必填,关联 travel_agency.agency_id)", required = true)
|
||||||
|
private Long agencyId;
|
||||||
|
```
|
||||||
|
2. `ProductBasicService.saveBasic` 加更新兜底,前端漏传时保留原值不破坏已有归属(业务规则: agency 绑定 mchId 不可空)。
|
||||||
|
|
||||||
|
## 前端无需改动
|
||||||
|
|
||||||
|
`POST /admin/product/item/basic` 接口签名/请求体/响应 VO 0 改动。前端原本就在传 `agencyId`,本次只是后端补上接收。
|
||||||
|
|
||||||
|
## 部署依赖
|
||||||
|
|
||||||
|
无 nacos / SQL / 第三方配置变更。直接部署即生效(本 PR 不涉及 V*.sql, 不依赖 Flyway)。
|
||||||
|
|
||||||
|
## 受影响范围
|
||||||
|
|
||||||
|
- 创建 CORE/GROUP/CUSTOM 三类产品(`POST /admin/product/item/basic` productId=null 路径) — 修复后正常落库
|
||||||
|
- 编辑现有产品 — 加兜底防漏传覆盖,无回归
|
||||||
|
- 已有数据 — 不受影响(V20260506_001/006 已回填存量)
|
||||||
|
- gateway 路由 `/admin/product/**` 已存在(`application.yml` line 173-174),未改
|
||||||
|
|
||||||
|
## 验证
|
||||||
|
|
||||||
|
- 单测 23/23 全绿(新增 2 条: 创建带 agencyId 持久化正确 / 更新缺 agencyId 保留原值)
|
||||||
|
- 本地 round-trip 跳过(本地 phpStudy MySQL/RocketMQ 今日重启炸 4 次, timebox 切兜底)
|
||||||
|
- 测试服 round-trip 等部署后实测
|
||||||
|
- 正式部署交运维管理员
|
||||||
|
|
||||||
|
## 已识别但未处理
|
||||||
|
|
||||||
|
`ProductSaveReqVO` 同样缺 agencyId, 被 `ProductBasicService.createProduct(ProductSaveReqVO)` (line 123) 使用, 但主代码 0 调用 = 死代码(只测试在调)。建议下个 PR 单独删除, 避免本 BUG fix PR 范围扩散。
|
||||||
正在加载...
x
在新工单中引用
屏蔽一个用户