perf(query): 优化后台手机号精确查询

This commit is contained in:
yml2213
2026-11-02 18:28:12 +08:00
parent 9c379b7e0c
commit 599e22331d
17 changed files with 254 additions and 62 deletions
+23 -20
View File
@@ -178,17 +178,17 @@ func (r *Repository) Create(ctx context.Context, req CreateRequest, adminID uint
BizID: &bid,
Meta: meta,
Detail: map[string]any{
"pickup_no": pickupNo,
"listing_id": listing.ID,
"platform": pickup.Platform,
"third_party_order_no": pickup.ThirdPartyOrderNo,
"shop_name": pickup.ShopName,
"operator": pickup.Operator,
"account_source": pickup.AccountSource,
"source_channel": pickup.SourceChannel,
"order_amount_cent": pickup.OrderAmountCent,
"deposit_amount_cent": pickup.DepositAmountCent,
"profit_cent": pickup.ProfitAmountCent,
"pickup_no": pickupNo,
"listing_id": listing.ID,
"platform": pickup.Platform,
"third_party_order_no": pickup.ThirdPartyOrderNo,
"shop_name": pickup.ShopName,
"operator": pickup.Operator,
"account_source": pickup.AccountSource,
"source_channel": pickup.SourceChannel,
"order_amount_cent": pickup.OrderAmountCent,
"deposit_amount_cent": pickup.DepositAmountCent,
"profit_cent": pickup.ProfitAmountCent,
},
}); err != nil {
return err
@@ -534,9 +534,9 @@ func (r *Repository) UpdateThirdPartyOrderNo(ctx context.Context, pickupID uint6
BizID: &bid,
Meta: meta,
Detail: map[string]any{
"pickup_no": pickup.PickupNo,
"old_third_party_order_no": oldThirdPartyOrderNo,
"new_third_party_order_no": pickup.ThirdPartyOrderNo,
"pickup_no": pickup.PickupNo,
"old_third_party_order_no": oldThirdPartyOrderNo,
"new_third_party_order_no": pickup.ThirdPartyOrderNo,
},
})
})
@@ -854,9 +854,9 @@ func applyAdminPickupFilters(db *gorm.DB, query AdminPickupQuery) *gorm.DB {
}
if kw := strings.TrimSpace(query.Keyword); kw != "" {
upper := strings.ToUpper(kw)
if len(kw) == 11 && kw[0] == '1' && isAllDigits(kw) {
// 11 位手机号:命中 users(phone) 唯一索引
db = db.Where("owner.phone = ?", kw)
if isPhoneKeyword(kw) {
// 先由 users(phone) 唯一索引解析用户,再让 admin_pickups(owner_id) 索引驱动。
db = db.Where("p.owner_id = (SELECT id FROM users WHERE phone = ?)", kw)
} else if strings.HasPrefix(upper, "PK") || strings.HasPrefix(upper, "P") {
// 提号编号:命中 admin_pickups(pickup_no) 唯一索引
db = db.Where("p.pickup_no = ?", kw)
@@ -894,9 +894,8 @@ func (r *Repository) adminPickupCountQuery(ctx context.Context, query AdminPicku
if id, err := strconv.ParseUint(kw, 10, 64); err == nil && id > 0 && kw[0] != '0' && id < 100000000 {
return r.db.WithContext(ctx).Table("admin_pickups AS p")
}
if len(kw) == 11 && kw[0] == '1' && isAllDigits(kw) {
return r.db.WithContext(ctx).Table("admin_pickups AS p").
Joins("JOIN users AS owner ON owner.id = p.owner_id")
if isPhoneKeyword(kw) {
return r.db.WithContext(ctx).Table("admin_pickups AS p")
}
if strings.HasPrefix(upper, "L") || (len(kw) >= 12 && isAllDigits(kw)) {
return r.db.WithContext(ctx).Table("admin_pickups AS p").
@@ -1974,3 +1973,7 @@ func isAllDigits(s string) bool {
}
return true
}
func isPhoneKeyword(s string) bool {
return len(s) == 11 && s[0] == '1' && isAllDigits(s)
}
@@ -829,9 +829,9 @@ func TestApplyAdminPickupFiltersSmartRouting(t *testing.T) {
wantSQLFrag string
}{
{
name: "11位手机号路由至users(phone)",
name: "11位手机号先解析用户再走提号号主索引",
query: AdminPickupQuery{Keyword: "13800138000"},
wantSQLFrag: "owner.phone = ?",
wantSQLFrag: "p.owner_id = (SELECT id FROM users WHERE phone = ?)",
},
{
name: "PK前缀提号编号路由至admin_pickups(pickup_no)",