feat(pickup): support platform managed offline settlement
This commit is contained in:
@@ -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{},
|
||||
|
||||
Reference in New Issue
Block a user