perf(query): 优化后台手机号精确查询
This commit is contained in:
@@ -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)",
|
||||
|
||||
Reference in New Issue
Block a user