66 行
2.1 KiB
Markdown
66 行
2.1 KiB
Markdown
# 备品(supplies)批量删除前端 body 结构修复
|
|
|
|
**日期**: 2026-04-27
|
|
**PR**: 后端 0 改动 (本条仅前端修复指引)
|
|
**影响端**: 管理端 admin (`hl-ui/src/api/spare.js`)
|
|
|
|
## 背景
|
|
|
|
反馈人 蒋雨莲(橙子): admin 后台「物资管理 → 备品管理」列表,勾选 ≥1 条点「批量删除」无效,后端返回 `code:400 "suppliesIds: 备品ID列表不能为空"`。
|
|
|
|
## 根因
|
|
|
|
`hl-ui/src/api/spare.js:69` 调用 `http.delete` 时多包了一层 `{ data: ... }`:
|
|
|
|
```js
|
|
// 现状(BUG)
|
|
export function deleteSpareBatch(suppliesIds) {
|
|
return http.delete('/supplies/items/batch', { data: { suppliesIds } })
|
|
}
|
|
```
|
|
|
|
`utils/request.js:582` 的 `http.delete(url, data, config)` 第二参数 `data` **直接作为请求体 body**(项目封装,与 axios 原生 `axios.delete(url, { data: payload })` 写法不同)。多包一层后实际 HTTP body 是:
|
|
|
|
```json
|
|
{"data":{"suppliesIds":["..."]}}
|
|
```
|
|
|
|
后端 `BatchDeleteRequest` 期望:
|
|
|
|
```json
|
|
{"suppliesIds":["..."]}
|
|
```
|
|
|
|
Jackson 反序列化把 `data` 字段当 unknown property 忽略(`FAIL_ON_UNKNOWN_PROPERTIES=false`),`suppliesIds` 字段为 null,`@NotEmpty` 校验失败 → 后端 `code:400`。
|
|
|
|
## 前端修复
|
|
|
|
对照 `hl-ui/src/api/hotel.js:56` 写法正确:
|
|
|
|
```js
|
|
export function deleteHotelBatch(hotelIds) {
|
|
return http.delete('/hotel/items/batch', { hotelIds }) // 直接传 payload
|
|
}
|
|
```
|
|
|
|
把 `spare.js:69` 改为:
|
|
|
|
```js
|
|
export function deleteSpareBatch(suppliesIds) {
|
|
return http.delete('/supplies/items/batch', { suppliesIds })
|
|
}
|
|
```
|
|
|
|
## 后端验证
|
|
|
|
后端代码经核查 100% 无 BUG, 0 改动。已用真实 admin token curl 测试服 `/admin/supplies/items/batch` 双向验证:
|
|
|
|
| body | 响应 |
|
|
| --- | --- |
|
|
| `{"data":{"suppliesIds":["x"]}}` (前端字面值) | `code:400 "suppliesIds: 备品ID列表不能为空"` |
|
|
| `{"suppliesIds":["x"]}` (DTO 期望) | `code:200 "成功"` |
|
|
|
|
## 同类风险扫描建议
|
|
|
|
全仓 grep `http\.delete\([^)]*\{\s*data:` 一次性扫出还有哪些前端模块踩同一坑。已确认 `hotel.js` `extraService.js` 等其他批删 API 写法正确, 当前已知仅 `spare.js` 一处。
|