36 lines
3.7 KiB
Markdown
36 lines
3.7 KiB
Markdown
# 商城订单取消与收货
|
||
|
||
操作时间:2026-09-07。类型:扩展与状态边界修复。影响:用户商城订单列表、取消、确认收货。
|
||
|
||
## 变更前后
|
||
|
||
此前用户端仅显示支付和退款操作,即使已有取消/确认收货接口也没有对应入口。本次服务端通过 allowed_actions 发布 cancel、confirm_receipt,列表显示直接操作按钮,同时保留操作菜单;用户明确确认后调用接口,成功重新读取订单列表。
|
||
|
||
原确认收货只检查物流状态20,未校验订单业务状态;已取消订单残留物流状态时也可能被确认。现在在事务内锁定本人订单,仅业务状态18且物流状态20允许首次收货;物流30重试不改写时间。取消仅允许状态16,状态22重试返回成功且不再次返还库存。
|
||
|
||
## 文件与方法
|
||
|
||
- `backend/api/internal/logic/client/user/shop.go`:ListShopOrders、CancelShopOrder、ConfirmShopReceipt。已支付发货订单显示待收货,收货后显示已收货;仍保持原订单/物流双状态模型。
|
||
- `apps/user_app/lib/data/repositories/client_repository.dart`:cancelShopOrder、confirmShopReceipt,使用公开订单标识。
|
||
- `apps/user_app/lib/ui/features/orders/order_list.dart`:新增 onAction,显示取消/收货及去支付入口,保留菜单。
|
||
- `apps/user_app/lib/ui/features/orders/orders_page.dart`:复用原提交锁,二次确认、失败保留状态、成功刷新商城列表。
|
||
- `backend/api/internal/logic/client/user/order_actions_test.go`:八项状态/所有权/幂等场景,SQL Mock 验证不发生额外库存写入。
|
||
- `apps/user_app/test/ui/orders_page_test.dart`:增加取消与收货确认/返回/刷新测试,原退款跨标签刷新测试保留。
|
||
|
||
## 契约与兼容
|
||
|
||
继续使用原 POST shop/orders/:identity/cancel 和 POST shop/orders/:identity/confirm-receipt,未新增接口或表字段。allowed_actions 为增量字段值,旧客户端继续可读。客户端不按状态数字自行推断权限,服务端再次校验归属与实时状态。气瓶订单取消未在本轮开放;其分派、支付和履约模型需单独核对,不套用商城逻辑。
|
||
|
||
## 验证记录
|
||
|
||
- Go 全量测试与 vet 通过,八项新边界测试覆盖取消重试、已支付拒绝取消、越权拒绝、已取消拒绝收货、未发货拒绝、首次收货及重试时间保护。
|
||
- Widget 订单专项三项通过,包含原退款功能;Flutter 静态检查及 Web 构建通过。
|
||
- 远程开发环境创建一笔指定示例商品临时订单,列表已返回 pay/cancel;浏览器取消与库存恢复结果在后续条目记录。
|
||
- 浏览器已取消本轮临时订单,刷新后为“已取消”且取消/支付入口消失。公开商品接口确认指定示例商品库存为30,与此前已验证恢复的基线一致;未付款、未发货。
|
||
- 用户端全量55项测试通过;商城订单标签新增四宽度、两种文字缩放共8张截图。初次截图发现全宽取消按钮导致换行,已为订单操作指定紧凑宽度,继续保留48px触控高度。
|
||
- 修正后8项截图检查、Flutter静态检查、最终Web构建通过;[390px截图](视觉验收/A1/20-shop_390_1.0.png)中操作按钮已并排。订单列表159行、订单页338行、后端新专项55行;未新增运行依赖或数据库迁移。
|
||
|
||
## 剩余项
|
||
|
||
图20仍不是严格1:1:配送轨迹、联系配送员、发票、再次购买、订单图片等尚未齐全。确认收货未改动远程已有真实履约订单,只通过隔离 SQL Mock 验证;不得为浏览器演示把未付款测试订单改成已发货。接口新增事务锁仅作用于本次操作的本人订单,不修改支付或退款规则。
|