修复仲裁订单线下结算

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
@@ -53,7 +53,7 @@ func normalRefundBizTypes() []string {
// settledSettlementStatuses 是视为"已完成结算"的结算状态集合。 // settledSettlementStatuses 是视为"已完成结算"的结算状态集合。
// 预计收入只统计尚未结算的订单,这些状态需从预计口径中排除。 // 预计收入只统计尚未结算的订单,这些状态需从预计口径中排除。
func settledSettlementStatuses() []string { func settledSettlementStatuses() []string {
return []string{"settled", "closed"} return []string{"settled", "closed", "arbitrated"}
} }
// nonBillableOrderStatuses 是不产生平台收入的订单状态集合(待支付、已取消、已关闭)。 // nonBillableOrderStatuses 是不产生平台收入的订单状态集合(待支付、已取消、已关闭)。
@@ -45,3 +45,15 @@ func TestRefundBizTypesIncludeMohongRefund(t *testing.T) {
t.Fatal("refundBizTypes missing mohong_refund") t.Fatal("refundBizTypes missing mohong_refund")
} }
} }
func TestSettledSettlementStatusesIncludeArbitrated(t *testing.T) {
values := map[string]bool{}
for _, item := range settledSettlementStatuses() {
values[item] = true
}
for _, want := range []string{"settled", "closed", "arbitrated"} {
if !values[want] {
t.Fatalf("settledSettlementStatuses missing %s", want)
}
}
}
@@ -37,6 +37,7 @@ const (
settlementStatusSettled = "settled" settlementStatusSettled = "settled"
settlementStatusClosed = "closed" settlementStatusClosed = "closed"
settlementStatusDisputed = "disputed" settlementStatusDisputed = "disputed"
settlementStatusArbitrated = "arbitrated"
handoffModeOwner = "owner" handoffModeOwner = "owner"
handoffModePlatform = "platform" handoffModePlatform = "platform"
@@ -66,7 +66,7 @@ func canAdminPlatformCheckoutConfirm(order model.RentalOrder) bool {
func canAdminMarkOfflineSettlement(order model.RentalOrder) bool { func canAdminMarkOfflineSettlement(order model.RentalOrder) bool {
return isPlatformSettlementOrder(order) && return isPlatformSettlementOrder(order) &&
order.Status == orderStatusCompleted && order.Status == orderStatusCompleted &&
order.SettlementStatus == settlementStatusSettled && (order.SettlementStatus == settlementStatusSettled || order.SettlementStatus == settlementStatusArbitrated) &&
effectiveOfflineSettlementStatus(order) == offlineSettlementStatusPending && effectiveOfflineSettlementStatus(order) == offlineSettlementStatusPending &&
order.OfflineSettlementAmountCent > 0 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) { func TestPlatformManagedCheckoutIncludesConsumableAndDepositCompensation(t *testing.T) {
db := setupOrderTestDB(t) db := setupOrderTestDB(t)
repo := NewRepository(db) repo := NewRepository(db)