hl-api-changelog/changelogs/2026-04/27_fix_admin-supplies_batch-delete-body-shape.md

2.1 KiB

备品(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: ... }:

// 现状(BUG)
export function deleteSpareBatch(suppliesIds) {
  return http.delete('/supplies/items/batch', { data: { suppliesIds } })
}

utils/request.js:582http.delete(url, data, config) 第二参数 data 直接作为请求体 body(项目封装,与 axios 原生 axios.delete(url, { data: payload }) 写法不同)。多包一层后实际 HTTP body 是:

{"data":{"suppliesIds":["..."]}}

后端 BatchDeleteRequest 期望:

{"suppliesIds":["..."]}

Jackson 反序列化把 data 字段当 unknown property 忽略(FAIL_ON_UNKNOWN_PROPERTIES=false),suppliesIds 字段为 null,@NotEmpty 校验失败 → 后端 code:400

前端修复

对照 hl-ui/src/api/hotel.js:56 写法正确:

export function deleteHotelBatch(hotelIds) {
  return http.delete('/hotel/items/batch', { hotelIds })  // 直接传 payload
}

spare.js:69 改为:

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 一处。