feat(pickup): 增加第三方单号补录功能并优化列表提号备注展示

- 后端支持补录/修改第三方单号接口 PUT /api/v1/admin/pickups/:id/third-party-order-no,记录流转事件与审计日志
- 前端线下提号主列表在第三方单号列后展示提号备注列
- 前端列表操作列及提号详情页增加补录/修改第三方单号操作入口与弹窗
- 通过 scripts/check.sh 全量门禁校验
This commit is contained in:
yml2213
2026-10-09 18:45:12 +08:00
parent 2c943027f0
commit b4d2d1e2f5
9 changed files with 345 additions and 1 deletions
@@ -1019,3 +1019,61 @@ func TestRepositoryHistoricalShopStatsAndMapping(t *testing.T) {
}
}
func TestRepositoryUpdateThirdPartyOrderNo(t *testing.T) {
t.Run("成功补录第三方单号并记录审计", func(t *testing.T) {
repo, db := newPickupTestRepo(t)
pickup := seedPickup(t, db, StatusPickingUp)
item, err := repo.UpdateThirdPartyOrderNo(t.Context(), pickup.ID, UpdateThirdPartyOrderNoRequest{
ThirdPartyOrderNo: "TB-20261009-8888",
}, 99, auditlog.Meta{RequestID: "req-third-party-order-no"})
if err != nil {
t.Fatalf("UpdateThirdPartyOrderNo() error = %v", err)
}
if item.ThirdPartyOrderNo != "TB-20261009-8888" {
t.Fatalf("item.ThirdPartyOrderNo = %q, want TB-20261009-8888", item.ThirdPartyOrderNo)
}
var stored model.AdminPickup
if err := db.First(&stored, pickup.ID).Error; err != nil {
t.Fatalf("查询提号失败: %v", err)
}
if stored.ThirdPartyOrderNo != "TB-20261009-8888" {
t.Fatalf("stored.ThirdPartyOrderNo = %q, want TB-20261009-8888", stored.ThirdPartyOrderNo)
}
// 验证审计日志
var audit model.AuditLog
if err := db.Where("action = ?", "pickup_third_party_order_no_update").First(&audit).Error; err != nil {
t.Fatalf("查询审计日志失败: %v", err)
}
var detail map[string]any
if err := json.Unmarshal(audit.Detail, &detail); err != nil {
t.Fatalf("解析审计日志失败: %v", err)
}
if detail["new_third_party_order_no"] != "TB-20261009-8888" {
t.Fatalf("detail[new_third_party_order_no] = %v, want TB-20261009-8888", detail["new_third_party_order_no"])
}
// 空单号拒绝
_, err = repo.UpdateThirdPartyOrderNo(t.Context(), pickup.ID, UpdateThirdPartyOrderNoRequest{
ThirdPartyOrderNo: " ",
}, 99, auditlog.Meta{})
if !errors.Is(err, ErrInvalidThirdPartyOrderNo) {
t.Fatalf("UpdateThirdPartyOrderNo() with blank error = %v, want ErrInvalidThirdPartyOrderNo", err)
}
})
t.Run("已取消提号单拒绝补录", func(t *testing.T) {
repo, db := newPickupTestRepo(t)
cancelledPickup := seedPickup(t, db, StatusCancelled)
_, err := repo.UpdateThirdPartyOrderNo(t.Context(), cancelledPickup.ID, UpdateThirdPartyOrderNoRequest{
ThirdPartyOrderNo: "TB-CANCELLED-999",
}, 99, auditlog.Meta{})
if !errors.Is(err, ErrPickupCancelled) {
t.Fatalf("UpdateThirdPartyOrderNo() on cancelled error = %v, want ErrPickupCancelled", err)
}
})
}