修正后台订单号主实际收入

This commit is contained in:
yml2213
2026-08-30 19:27:11 +08:00
parent 2487a2d83f
commit 0aef80fd11
4 changed files with 92 additions and 4 deletions
+44
View File
@@ -61,11 +61,20 @@ func (r *Repository) ListAdmin(ctx context.Context, query AdminOrderQuery) (*Pag
return nil, err
}
checkouts, err := r.latestAdminCheckouts(ctx, rows)
if err != nil {
return nil, err
}
items := make([]OrderDTO, 0, len(rows))
paymentTimeoutMinutes := pendingPaymentTimeoutMinutes(db)
for _, row := range rows {
dto := row.toAdminDTO()
applyPaymentDeadline(&dto, row.RentalOrder, paymentTimeoutMinutes)
if checkout, ok := checkouts[row.ID]; ok && shouldAttachAdminCheckout(row) {
checkoutDTO := toCheckoutAdminDTO(checkout)
refreshCheckoutSettlementDTO(&checkoutDTO, row.RentalOrder, checkout)
dto.Checkout = &checkoutDTO
}
items = append(items, dto)
}
@@ -77,6 +86,41 @@ func (r *Repository) ListAdmin(ctx context.Context, query AdminOrderQuery) (*Pag
}, nil
}
// latestAdminCheckouts loads one latest checkout per order so the admin order
// list can display finalized income without issuing one query per row.
func (r *Repository) latestAdminCheckouts(ctx context.Context, rows []orderRow) (map[uint64]model.OrderCheckout, error) {
result := make(map[uint64]model.OrderCheckout, len(rows))
if len(rows) == 0 {
return result, nil
}
orderIDs := make([]uint64, 0, len(rows))
for _, row := range rows {
orderIDs = append(orderIDs, row.ID)
}
latest := r.db.WithContext(ctx).
Table("order_checkouts").
Select("MAX(id) AS id").
Where("order_id IN ?", orderIDs).
Group("order_id")
var checkouts []model.OrderCheckout
if err := r.db.WithContext(ctx).
Table("order_checkouts AS oc").
Joins("JOIN (?) AS latest ON latest.id = oc.id", latest).
Find(&checkouts).Error; err != nil {
return nil, err
}
for _, checkout := range checkouts {
result[checkout.OrderID] = checkout
}
return result, nil
}
func shouldAttachAdminCheckout(row orderRow) bool {
return shouldAttachCheckout(row.Status) ||
row.SettlementStatus == settlementStatusSettled ||
row.SettlementStatus == settlementStatusArbitrated
}
func applyAdminOrderFilters(db *gorm.DB, query AdminOrderQuery) *gorm.DB {
if query.Status != "" {
db = db.Where("o.status = ?", query.Status)
@@ -1796,6 +1796,38 @@ func createOpenPlatformCheckout(t *testing.T, db *gorm.DB, order model.RentalOrd
return checkout
}
func TestListAdminUsesFinalizedCheckoutOwnerIncome(t *testing.T) {
db := setupOrderTestDB(t)
repo := NewRepository(db)
adminID := uint64(7002)
_, renter, order := createPlatformManagedCheckoutOrder(t, db, adminID)
order.Status = orderStatusCompleted
order.SettlementStatus = settlementStatusSettled
if err := db.Save(&order).Error; err != nil {
t.Fatalf("save completed order failed: %v", err)
}
checkout := createOpenPlatformCheckout(t, db, order, renter.ID)
checkout.Status = checkoutStatusAccepted
checkout.OwnerIncomeAmountCent = 6000
if err := db.Save(&checkout).Error; err != nil {
t.Fatalf("save finalized checkout failed: %v", err)
}
result, err := repo.ListAdmin(t.Context(), AdminOrderQuery{Page: 1, PageSize: 20})
if err != nil {
t.Fatalf("ListAdmin() error = %v", err)
}
if len(result.Items) != 1 {
t.Fatalf("ListAdmin() returned %d items, want 1", len(result.Items))
}
if result.Items[0].Checkout == nil || result.Items[0].Checkout.OwnerIncomeAmountCent == nil {
t.Fatal("ListAdmin() did not include finalized checkout owner income")
}
if *result.Items[0].Checkout.OwnerIncomeAmountCent != 6000 {
t.Fatalf("owner income = %d, want 6000", *result.Items[0].Checkout.OwnerIncomeAmountCent)
}
}
func TestAdminPlatformCheckoutConfirmRequiresExplicitConfirmationForZeroOwnerIncome(t *testing.T) {
db := setupOrderTestDB(t)
repo := NewRepository(db, Dependencies{