fix(order-v2): 财务 Tab 优惠/附加费 DTO 字段对齐契约 (#1100/#1101)

- DiscountRequest: name→discountName, amount→discountAmount
- SurchargeRequest: name→surchargeName, amount→surchargeAmount
- 清除死字段 discountType/remark
- 金额新增 @DecimalMin(0.01) 正数校验
这个提交包含在:
yaosutu 2026-04-21 16:20:37 +08:00
父节点 f4f767863d
当前提交 053a5bdd64

查看文件

@ -0,0 +1,108 @@
# 管理端优惠/附加费接口字段修复 — 2026-04-21
> **服务** hl-order-service-v2端口 8094· **类型** fix · **关联** Issue #1100 / PR #1101
> **场景**:管理端订单详情 · 财务 Tab · 添加/修改 优惠项 / 费用增加项
---
## 一、问题现象
在管理端订单详情财务 Tab 的「添加优惠项」/「添加费用增加项」窗口中填入名称和金额后提交,接口返回:
```
name: 优惠名称不能为空; amount: 优惠金额不能为空
```
## 二、根因
后端请求 DTO 的字段名与早期发布的接口契约不一致:
| 接口 | 契约字段(前端用) | 之前后端 DTO |
| --- | --- | --- |
| `POST/PUT /admin/order/{orderId}/discount` | `discountName` / `discountAmount` | `name` / `amount` ❌ |
| `POST/PUT /admin/order/{orderId}/surcharge` | `surchargeName` / `surchargeAmount` | `name` / `amount` ❌ |
前端按契约发请求 → 字段对不上 → `@NotBlank` / `@NotNull` 同时命中空值,一并报错。
## 三、修复内容
### 1. 字段名对齐契约
**`DiscountRequest`**
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `discountName` | `String` | ✅ | 优惠名称 |
| `discountAmount` | `BigDecimal` | ✅ `>= 0.01` | 优惠金额必须大于0 |
**`SurchargeRequest`**
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `surchargeName` | `String` | ✅ | 费用名称 |
| `surchargeAmount` | `BigDecimal` | ✅ `>= 0.01` | 费用金额必须大于0 |
### 2. 移除死字段
前端无需再传的字段,传了也会被忽略:
- `DiscountRequest.discountType` — Service 强制写入 `MANUAL`,前端传值被丢弃
- `DiscountRequest.remark` — Entity/DB 均无此列
- `SurchargeRequest.remark` — Entity/DB 均无此列
### 3. 新增金额正数校验
| 校验 | 提示 |
| --- | --- |
| `discountAmount < 0.01` | `优惠金额必须大于0` |
| `surchargeAmount < 0.01` | `费用金额必须大于0` |
防止负数优惠 = 变相加钱;负数附加费 = 变相减钱。
---
## 四、正确请求示例
```json
POST /admin/order/700001/discount
{
"discountName": "老客户优惠",
"discountAmount": 100.00
}
```
```json
POST /admin/order/700001/surcharge
{
"surchargeName": "升级房型补差价",
"surchargeAmount": 200.00
}
```
响应结构(`OrderDiscountVO` / `OrderSurchargeVO`)未变。
---
## 五、错误码
HTTP 始终返回 200,错误码在 `Result.code` 中。
| code | 触发 | 说明 |
| --- | --- | --- |
| 200 | 正常 | 成功 |
| 400 | 字段缺失 | `优惠名称不能为空` / `优惠金额不能为空` / `费用名称不能为空` / `费用金额不能为空` |
| 400 | 金额非正 | `优惠金额必须大于0` / `费用金额必须大于0` |
---
## 六、前端影响
**无需改动**。前端本来就在按 `discountName`/`discountAmount``surchargeName`/`surchargeAmount` 发请求,本次修复让后端与契约一致,提交即可成功。
---
## 七、关联
- Issue: [wx/HL#1100](https://git.1814.love:8443/wx/HL/issues/1100)
- PR: [wx/HL#1101](https://git.1814.love:8443/wx/HL/pulls/1101)(已合并到 dev
- 原始契约:`2026-03-20_order_surcharge.md`