feat(pickup): 增加第三方单号补录功能并优化列表提号备注展示
- 后端支持补录/修改第三方单号接口 PUT /api/v1/admin/pickups/:id/third-party-order-no,记录流转事件与审计日志 - 前端线下提号主列表在第三方单号列后展示提号备注列 - 前端列表操作列及提号详情页增加补录/修改第三方单号操作入口与弹窗 - 通过 scripts/check.sh 全量门禁校验
This commit is contained in:
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user