修复仲裁订单线下结算

This commit is contained in:
yml2213
2026-08-20 17:44:52 +08:00
parent 7b274d4ab8
commit 8660d5d4d1
5 changed files with 60 additions and 7 deletions
+6 -5
View File
@@ -32,11 +32,12 @@ const (
handoffStatusAdminClosed = "admin_closed"
handoffStatusAdminAbnormal = "admin_abnormal"
settlementStatusUnsettled = "unsettled"
settlementStatusPending = "pending"
settlementStatusSettled = "settled"
settlementStatusClosed = "closed"
settlementStatusDisputed = "disputed"
settlementStatusUnsettled = "unsettled"
settlementStatusPending = "pending"
settlementStatusSettled = "settled"
settlementStatusClosed = "closed"
settlementStatusDisputed = "disputed"
settlementStatusArbitrated = "arbitrated"
handoffModeOwner = "owner"
handoffModePlatform = "platform"
@@ -66,7 +66,7 @@ func canAdminPlatformCheckoutConfirm(order model.RentalOrder) bool {
func canAdminMarkOfflineSettlement(order model.RentalOrder) bool {
return isPlatformSettlementOrder(order) &&
order.Status == orderStatusCompleted &&
order.SettlementStatus == settlementStatusSettled &&
(order.SettlementStatus == settlementStatusSettled || order.SettlementStatus == settlementStatusArbitrated) &&
effectiveOfflineSettlementStatus(order) == offlineSettlementStatusPending &&
order.OfflineSettlementAmountCent > 0
}
@@ -1580,6 +1580,46 @@ func TestAdminPlatformCheckoutCounterCanBeAcceptedByRenter(t *testing.T) {
}
}
func TestAdminMarkOfflineSettlementAllowsArbitratedPlatformOrder(t *testing.T) {
db := setupOrderTestDB(t)
repo := NewRepository(db)
adminID := uint64(79)
order := model.RentalOrder{
OrderNo: "ORD-OFFLINE-ARBITRATED-001",
ListingID: 1,
AccountID: 1,
OwnerID: 1,
RenterID: 2,
Status: orderStatusCompleted,
SettlementStatus: settlementStatusArbitrated,
HandoffMode: handoffModePlatform,
SettlementMode: settlementModePlatformManaged,
OfflineSettlementStatus: offlineSettlementStatusPending,
OfflineSettlementAmountCent: 8000,
}
if err := db.Create(&order).Error; err != nil {
t.Fatalf("create order failed: %v", err)
}
if !canAdminMarkOfflineSettlement(order) {
t.Fatal("arbitrated platform order should allow offline settlement")
}
if err := repo.AdminMarkOfflineSettlement(t.Context(), adminID, order.ID, OfflineSettlementRequest{Remark: "仲裁后线下转账"}, AuditMeta{}); err != nil {
t.Fatalf("AdminMarkOfflineSettlement() error = %v", err)
}
var saved model.RentalOrder
if err := db.First(&saved, order.ID).Error; err != nil {
t.Fatalf("load order failed: %v", err)
}
if saved.OfflineSettlementStatus != offlineSettlementStatusSettled {
t.Fatalf("offline settlement status = %q, want %q", saved.OfflineSettlementStatus, offlineSettlementStatusSettled)
}
if saved.OfflineSettledBy == nil || *saved.OfflineSettledBy != adminID {
t.Fatalf("offline settled by = %#v, want %d", saved.OfflineSettledBy, adminID)
}
}
func TestPlatformManagedCheckoutIncludesConsumableAndDepositCompensation(t *testing.T) {
db := setupOrderTestDB(t)
repo := NewRepository(db)