feat(pickup): support platform managed offline settlement

This commit is contained in:
yml2213
2026-08-09 20:20:39 +08:00
parent 14bc91b007
commit 8fb7d3bac0
12 changed files with 499 additions and 128 deletions
@@ -299,6 +299,87 @@ func TestRepositoryCreateSnapshotsExternalAccountSource(t *testing.T) {
}
}
func TestRepositoryCompleteInternalPickupCreditsWallet(t *testing.T) {
repo, db := newPickupTestRepo(t)
listing := seedAvailableListing(t, db, "LST-COMPLETE-INTERNAL", "站内结算账号", false)
pickup, err := repo.Create(t.Context(), CreateRequest{ListingID: listing.ID}, 99, auditlog.Meta{})
if err != nil {
t.Fatalf("Create() error = %v", err)
}
completed, err := repo.Complete(t.Context(), pickup.ID, CompleteRequest{SettleAmountCent: 12000}, 99, auditlog.Meta{})
if err != nil {
t.Fatalf("Complete() error = %v", err)
}
if completed.Status != StatusCompleted || completed.SettlementMode != SettlementModeOwnerWallet {
t.Fatalf("站内提号完成状态 = %q/%q", completed.Status, completed.SettlementMode)
}
if completed.OfflineSettlementStatus != OfflineSettlementStatusNone {
t.Fatalf("站内提号线下结算状态 = %q, want none", completed.OfflineSettlementStatus)
}
var ledger model.WalletLedger
if err := db.Where("biz_type = ? AND biz_no = ?", "admin_pickup_settle", pickup.PickupNo).First(&ledger).Error; err != nil {
t.Fatalf("站内提号应生成钱包流水: %v", err)
}
assertInt64(t, "站内提号钱包入账", ledger.AmountCent, 12000)
}
func TestRepositoryCompletePlatformManagedPickupUsesOfflineSettlement(t *testing.T) {
repo, db := newPickupTestRepo(t)
listing := seedAvailableListing(t, db, "LST-COMPLETE-EXTERNAL", "代管结算账号", true)
if err := db.Create(&model.ListingUpload{
UploaderName: "外部号主",
SourceChannel: "闲鱼",
ListingID: &listing.ID,
Status: "listing_created",
}).Error; err != nil {
t.Fatalf("创建外部上传记录失败: %v", err)
}
pickup, err := repo.Create(t.Context(), CreateRequest{ListingID: listing.ID}, 99, auditlog.Meta{})
if err != nil {
t.Fatalf("Create() error = %v", err)
}
if pickup.SettlementMode != SettlementModePlatformManaged {
t.Fatalf("平台代管提号结算模式 = %q", pickup.SettlementMode)
}
completed, err := repo.Complete(t.Context(), pickup.ID, CompleteRequest{SettleAmountCent: 13500}, 99, auditlog.Meta{})
if err != nil {
t.Fatalf("Complete() error = %v", err)
}
if completed.OfflineSettlementStatus != OfflineSettlementStatusPending {
t.Fatalf("平台代管提号线下结算状态 = %q, want pending", completed.OfflineSettlementStatus)
}
if completed.OfflineSettledAt != nil || completed.OfflineSettledBy != nil {
t.Fatalf("待线下结算不应记录确认信息: %+v", completed)
}
var ledgerCount int64
if err := db.Model(&model.WalletLedger{}).
Where("biz_type = ? AND biz_no = ?", "admin_pickup_settle", pickup.PickupNo).
Count(&ledgerCount).Error; err != nil {
t.Fatalf("统计钱包流水失败: %v", err)
}
if ledgerCount != 0 {
t.Fatalf("平台代管提号不应生成钱包流水, got %d", ledgerCount)
}
settled, err := repo.MarkOfflineSettlement(t.Context(), pickup.ID, OfflineSettlementRequest{Remark: "已转账"}, 100, auditlog.Meta{})
if err != nil {
t.Fatalf("MarkOfflineSettlement() error = %v", err)
}
if settled.OfflineSettlementStatus != OfflineSettlementStatusSettled || settled.OfflineSettledAt == nil || settled.OfflineSettledBy == nil || *settled.OfflineSettledBy != 100 {
t.Fatalf("平台代管线下结算确认结果 = %+v", settled)
}
if settled.OfflineSettlementRemark != "已转账" {
t.Fatalf("线下结算备注 = %q", settled.OfflineSettlementRemark)
}
var audit model.AuditLog
if err := db.Where("action = ? AND biz_id = ?", "pickup_offline_settlement", pickup.ID).First(&audit).Error; err != nil {
t.Fatalf("确认线下结算应写审计日志: %v", err)
}
}
func assertInt64(t *testing.T, name string, got, want int64) {
t.Helper()
if got != want {
@@ -328,6 +409,8 @@ func newPickupTestRepo(t *testing.T) (*Repository, *gorm.DB) {
&model.RentalListing{},
&model.ListingUpload{},
&model.AdminPickup{},
&model.WalletAccount{},
&model.WalletLedger{},
&model.AuditLog{},
&model.Notification{},
&model.ListingStatusEvent{},