修正后台订单号主实际收入
This commit is contained in:
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user