fix(my-requests): 修正 withdraw_endpoint 路径前缀导致撤回 404

现象
----
在「我的申请单」页面点撤回,前端控制台报:
  POST /api/api/v1/outbound/request/351/withdraw 404

根因
----
aggregate 端点在每条记录上回传 withdraw_endpoint,但拼接时多写了 /api:

  返回的:     /api/v1/outbound/request/351/withdraw
  axios baseURL: /api
  实际请求:   /api + /api/v1/... = /api/api/v1/...   → 404

后端路由本身是对的(/api/v1/outbound/request/<id>/withdraw 已正确注册),
问题纯在前端拼接。其它 API 封装的正确写法是只传 baseURL 之后的部分
(如 url: '/v1/outbound/my-requests'),本处是唯一破坏该约定的地方。

修复
----
返回 /v1/... 而非 /api/v1/...,并加注释说明约定。
借库项同时从 close 改为 withdraw(配合上一提交的申请人端点)。

验证方式
--------
按**前端真实的拼接方式**验证('/api' + endpoint),而非直接调后端路由:
  [outbound] /v1/outbound/request/381/withdraw            → 200
  [borrow  ] /v1/transactions/borrow/request/44/withdraw  → 200
  [scrap   ] /v1/scrap/request/5/withdraw                 → 200

教训:上一轮用 test_client 直接调后端路由验证,绕过了 axios 的 baseURL
拼接,所以后端测试全绿、前端一跑就 404。验证「前端能否调通」必须模拟
前端的请求方式。
This commit is contained in:
yueli
2026-09-10 15:47:02 +08:00
parent 077fd2f2cf
commit 29fc00a818

View File

@ -171,14 +171,18 @@ def _withdraw_path(type_key, req_id):
"""
撤回端点路径。撤回是**写操作**,保留在各模块自己的端点里
(三者释放逻辑不同),此处只提供路径供前端分发,不在此执行。
★ 路径不带 /api 前缀:前端 axios 实例的 baseURL 是 '/api'
传完整路径会拼成 /api/api/v1/... 导致 404。
这里返回的是 baseURL 之后的部分(与其它 API 封装的写法一致)。
"""
if req_id is None:
return ''
if type_key == 'outbound':
return f"/api/v1/outbound/request/{req_id}/withdraw"
return f"/v1/outbound/request/{req_id}/withdraw"
if type_key == 'borrow':
# 借库暂用 close 端点(语义为撤回/作废)
return f"/api/v1/transactions/borrow/request/{req_id}/close"
# 申请人路径:仅校验单据归属,普通员工无需 op_borrow_approval 权限
return f"/v1/transactions/borrow/request/{req_id}/withdraw"
if type_key == 'scrap':
return f"/api/v1/scrap/request/{req_id}/withdraw"
return f"/v1/scrap/request/{req_id}/withdraw"
return ''