修复平台代管订单流程

This commit is contained in:
yml2213
2026-07-25 19:17:19 +08:00
parent e0cb15f408
commit 4bc25b87d8
35 changed files with 2216 additions and 284 deletions
@@ -169,6 +169,76 @@ func TestRepositoryCancelRestoresCheckoutDisputeStatus(t *testing.T) {
}
}
func TestPlatformManagedArbitrationUsesOfflineSettlement(t *testing.T) {
db := setupDisputeTestDB(t)
repo := NewRepository(db)
adminID := uint64(77)
owner, renter, order := createDisputeOrderFixture(t, db, model.RentalOrder{
Status: "renting",
HandoffStatus: "received",
SettlementStatus: "unsettled",
HandoffMode: "platform",
SettlementMode: "platform_managed",
ManagedAdminID: &adminID,
RentAmountCent: 10000,
OwnerRentAmountCent: 8000,
PlatformFeeCent: 2000,
OfflineSettlementStatus: "none",
OfflineSettlementAmountCent: 0,
})
created, err := repo.Create(t.Context(), renter.ID, order.ID, CreateRequest{
Type: "cannot_login",
Description: "外部上传账号需要客服处理",
})
if err != nil {
t.Fatalf("创建申诉失败: %v", err)
}
var ownerNotificationCount int64
if err := db.Model(&model.Notification{}).Where("user_id = ?", owner.ID).Count(&ownerNotificationCount).Error; err != nil {
t.Fatalf("统计号主通知失败: %v", err)
}
if ownerNotificationCount != 0 {
t.Fatalf("owner notification count = %d, want 0", ownerNotificationCount)
}
var adminNotificationCount int64
if err := db.Model(&model.AdminNotification{}).Where("admin_user_id = ?", adminID).Count(&adminNotificationCount).Error; err != nil {
t.Fatalf("统计客服通知失败: %v", err)
}
if adminNotificationCount == 0 {
t.Fatal("platform managed dispute should notify managed admin")
}
if _, err := repo.Arbitrate(t.Context(), adminID, created.ID, ArbitrateRequest{
Result: "release_deposit",
Remark: "确认租金给卖家,线下结算",
}, AuditMeta{}); err != nil {
t.Fatalf("仲裁失败: %v", err)
}
var saved model.RentalOrder
if err := db.First(&saved, order.ID).Error; err != nil {
t.Fatalf("读取订单失败: %v", err)
}
if saved.OfflineSettlementStatus != "pending" {
t.Fatalf("offline settlement status = %q, want pending", saved.OfflineSettlementStatus)
}
if saved.OfflineSettlementAmountCent != 8000 {
t.Fatalf("offline settlement amount = %d, want 8000", saved.OfflineSettlementAmountCent)
}
if saved.OwnerSettledAt != nil {
t.Fatalf("owner settled at = %#v, want nil before offline settlement", saved.OwnerSettledAt)
}
var ownerLedgerCount int64
if err := db.Model(&model.WalletLedger{}).Where("user_id = ?", owner.ID).Count(&ownerLedgerCount).Error; err != nil {
t.Fatalf("统计钱包流水失败: %v", err)
}
if ownerLedgerCount != 0 {
t.Fatalf("owner wallet ledger count = %d, want 0", ownerLedgerCount)
}
}
func TestBuildArbitrationSettlementSkipsFrozenReleaseWhenNoFrozenBalance(t *testing.T) {
order := model.RentalOrder{
ID: 11,