优化后台列表搜索

This commit is contained in:
yml2213
2026-06-21 13:17:10 +08:00
parent a0145e6b18
commit 23dbe9af22
11 changed files with 166 additions and 21 deletions
+61 -5
View File
@@ -2,6 +2,8 @@ package dispute
import (
"context"
"strconv"
"strings"
"hfb_sys/backend/internal/model"
@@ -39,14 +41,27 @@ func (r *Repository) FindForUser(ctx context.Context, userID uint64, id uint64)
return &dto, nil
}
func (r *Repository) ListAdmin(ctx context.Context, page, pageSize int) (*PaginatedResult, error) {
func (r *Repository) ListAdmin(ctx context.Context, query AdminListQuery) (*PaginatedResult, error) {
var total int64
if err := r.db.WithContext(ctx).Model(&model.Dispute{}).Count(&total).Error; err != nil {
countDB := applyAdminListFilters(r.adminFilterQuery(ctx), query)
if err := countDB.Count(&total).Error; err != nil {
return nil, err
}
page := query.Page
pageSize := query.PageSize
if page < 1 {
page = 1
}
if pageSize < 1 {
pageSize = 20
}
offset := (page - 1) * pageSize
var rows []disputeRow
err := r.baseQuery(ctx).Order("d.id DESC").Offset(offset).Limit(pageSize).Scan(&rows).Error
err := applyAdminListFilters(r.baseQuery(ctx), query).
Order("d.id DESC").
Offset(offset).
Limit(pageSize).
Scan(&rows).Error
if err != nil {
return nil, err
}
@@ -54,13 +69,54 @@ func (r *Repository) ListAdmin(ctx context.Context, page, pageSize int) (*Pagina
}
func (r *Repository) baseQuery(ctx context.Context) *gorm.DB {
return r.db.WithContext(ctx).Table("disputes AS d").
return r.adminFilterQuery(ctx).
Select(`d.*, o.order_no, o.status AS order_status, o.handoff_status, o.settlement_status,
o.owner_id, o.renter_id, owner.phone AS owner_phone, renter.phone AS renter_phone,
l.listing_no, a.title`).
l.listing_no, a.title`)
}
func (r *Repository) adminFilterQuery(ctx context.Context) *gorm.DB {
return r.db.WithContext(ctx).Table("disputes AS d").
Joins("JOIN rental_orders AS o ON o.id = d.order_id").
Joins("JOIN rental_listings AS l ON l.id = o.listing_id").
Joins("JOIN game_accounts AS a ON a.id = o.account_id").
Joins("JOIN users AS owner ON owner.id = o.owner_id").
Joins("JOIN users AS renter ON renter.id = o.renter_id")
}
func applyAdminListFilters(db *gorm.DB, query AdminListQuery) *gorm.DB {
if query.Status != "" {
db = db.Where("d.status = ?", query.Status)
}
if query.Type != "" {
db = db.Where("d.type = ?", query.Type)
}
if keyword := strings.TrimSpace(query.Keyword); keyword != "" {
like := "%" + keyword + "%"
if id, err := strconv.ParseUint(keyword, 10, 64); err == nil {
db = db.Where(
`(o.order_no LIKE ? OR l.listing_no LIKE ? OR a.title LIKE ? OR owner.phone LIKE ? OR renter.phone LIKE ? OR d.id = ? OR d.order_id = ? OR o.listing_id = ? OR o.owner_id = ? OR o.renter_id = ?)`,
like,
like,
like,
like,
like,
id,
id,
id,
id,
id,
)
} else {
db = db.Where(
`(o.order_no LIKE ? OR l.listing_no LIKE ? OR a.title LIKE ? OR owner.phone LIKE ? OR renter.phone LIKE ?)`,
like,
like,
like,
like,
like,
)
}
}
return db
}