---
date: 2026-05-07
type: frontend-bug
module: refund-reason-api
priority: high
notify: ["@mmg"]
status: pending
source: 测试用例汇总.xlsx (2026-05-07) + /@bug 实测
related_cases: [YY-001]
gitea_issue_closed: 1790
---

# 退款原因新增失败 — 前端 4 个 API 路径错 + body 当 querystring

## 原始现象

测试用例 YY-001：新增退款原因不通过（保存失败）。

## /@bug 实测结论（admin 真 token round-trip）

后端 `POST /admin/refund-reason/create` 实测：

```
Body: {"reasonName":"测试取消原因","reasonType":"CUSTOMER","sortOrder":1}
HTTP: 200
Response: {"code":200, "data":{"reasonId":2052278650115342338, ...}}
```

**后端完全正常，DB 也已落库。问题在前端 API 调用方式。**

## 根因（hl-ui/src/api/order.js）

4 个退款原因相关 API 都犯同样 2 个错：

| 行号 | 函数 | 错误 1 | 错误 2 |
|------|------|--------|--------|
| 393 | `createRefundReason()` | 路径缺 `/admin/` 前缀 | `http.post(url, null, { params: data })` 把 body 当 querystring |
| 404 | `updateRefundReason()` | 同上 | 同上 |
| 416 | `deleteRefundReason()` | 同上 | 同上 |
| 424 | `listRefundReason()` | 同上 | (GET 可能影响小) |

### 错误后果

1. **缺 `/admin/` 前缀** → 网关 9443 拿到 `/refund-reason/create` 没匹配路由 → 404
2. **`http.post(url, null, { params })`** → axios 把 `{reasonName: '...'}` 拼到 query string `?reasonName=...`，body 是 null。后端 `@Valid @RequestBody RefundReasonSaveReqVO` 拿到 null → 400 必填字段为空

### 正确写法

```js
// 错 ❌
export function createRefundReason(data) {
  return http.post('/refund-reason/create', null, { params: data })
}

// 对 ✅
export function createRefundReason(data) {
  return http.post('/admin/refund-reason/create', data)
  //              ^^^^^^^               ^^^^
  //              加 /admin/             body 直接传，不用 params
}
```

## 同源 anti-pattern

跟 memory `experience/backend-dev/frontend-http-delete-double-wrap-data-trap.md` 反向：
- 之前：前端正确给 body，但 wrapper 误把第二参数当 config → 后端拿到空 body
- 这次：前端把数据当 query → 后端 @RequestBody 收到 null

**建议**：mmg 用全局搜 `http.post(.*null.*params` 或 `http.post(.*\{.*params:` 模式扫一下，这是高风险写法，可能 hl-ui 还有其他历史遗留。

## 影响

- 退款原因 admin 配置无法新增/编辑/删除（YY-001 直接症状）
- 列表查询走 GET 可能不受影响，但路径缺前缀也会 404

## 验收（前端）

- [ ] `api/order.js` 4 个退款原因 API 全部加 `/admin/` 前缀 + 把 data 直接传 body
- [ ] 测试服 round-trip：admin 端能新增/修改/删除/列表退款原因
- [ ] 全局 grep `http.post.*null.*params` 模式，发现的同类问题一起修

## 关联工单

Gitea #1790 已关闭并留 closing comment（项目规则前端 BUG 不建工单）。
完整分析报告：`docs/tasks/20260507_bug_order_analysis.md`
