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
@@ -55,9 +55,13 @@ func TestListAdminInvitationsFiltersPhoneAndInviteCode(t *testing.T) {
query AdminInvitationQuery
want int64
}{
{name: "通用完整手机号精确匹配邀请人", query: AdminInvitationQuery{Phone: "13812345678"}, want: 1},
{name: "通用完整手机号精确匹配被邀请人", query: AdminInvitationQuery{Phone: "13911112222"}, want: 1},
{name: "通用手机号匹配邀请人", query: AdminInvitationQuery{Phone: "1234"}, want: 1},
{name: "通用手机号匹配被邀请人", query: AdminInvitationQuery{Phone: "139111"}, want: 1},
{name: "邀请码模糊匹配", query: AdminInvitationQuery{InviteCode: "beta"}, want: 1},
{name: "邀请人完整手机号精确匹配", query: AdminInvitationQuery{InviterPhone: "13812345678"}, want: 1},
{name: "被邀请人完整手机号精确匹配", query: AdminInvitationQuery{InviteePhone: "13911112222"}, want: 1},
{name: "邀请人手机号模糊匹配", query: AdminInvitationQuery{InviterPhone: "137"}, want: 1},
{name: "被邀请人手机号模糊匹配", query: AdminInvitationQuery{InviteePhone: "1362"}, want: 1},
}
@@ -476,6 +480,8 @@ func TestListAdminRebateLedgersFiltersPartialPhoneAndOrderNo(t *testing.T) {
want int64
}{
{name: "订单号模糊匹配", query: AdminRebateLedgerQuery{OrderNo: "ALPHA"}, want: 1},
{name: "邀请人完整手机号精确匹配", query: AdminRebateLedgerQuery{InviterPhone: "13812345678"}, want: 1},
{name: "被邀请人完整手机号精确匹配", query: AdminRebateLedgerQuery{InviteePhone: "13911112222"}, want: 1},
{name: "邀请人手机号模糊匹配", query: AdminRebateLedgerQuery{InviterPhone: "1381"}, want: 1},
{name: "被邀请人手机号模糊匹配", query: AdminRebateLedgerQuery{InviteePhone: "1362"}, want: 1},
}
@@ -877,14 +877,30 @@ func (r *Repository) ListAdminInvitations(ctx context.Context, query AdminInvita
Joins("LEFT JOIN users invitee ON invitee.id = ui.invitee_id")
if p := strings.TrimSpace(query.Phone); p != "" {
like := "%" + p + "%"
db = db.Where("(inviter.phone LIKE ? OR invitee.phone LIKE ?)", like, like)
if isPhoneKeyword(p) {
db = db.Where(
"(ui.inviter_id = (SELECT id FROM users WHERE phone = ?) OR ui.invitee_id = (SELECT id FROM users WHERE phone = ?))",
p,
p,
)
} else {
like := "%" + p + "%"
db = db.Where("(inviter.phone LIKE ? OR invitee.phone LIKE ?)", like, like)
}
}
if p := strings.TrimSpace(query.InviterPhone); p != "" {
db = db.Where("inviter.phone LIKE ?", "%"+p+"%")
if isPhoneKeyword(p) {
db = db.Where("ui.inviter_id = (SELECT id FROM users WHERE phone = ?)", p)
} else {
db = db.Where("inviter.phone LIKE ?", "%"+p+"%")
}
}
if p := strings.TrimSpace(query.InviteePhone); p != "" {
db = db.Where("invitee.phone LIKE ?", "%"+p+"%")
if isPhoneKeyword(p) {
db = db.Where("ui.invitee_id = (SELECT id FROM users WHERE phone = ?)", p)
} else {
db = db.Where("invitee.phone LIKE ?", "%"+p+"%")
}
}
if code := strings.TrimSpace(query.InviteCode); code != "" {
db = db.Where("ui.invite_code LIKE ?", "%"+code+"%")
@@ -1008,10 +1024,18 @@ func (r *Repository) adminRebateLedgerBase(ctx context.Context, query AdminRebat
db = db.Where("irl.order_no LIKE ?", "%"+o+"%")
}
if p := strings.TrimSpace(query.InviterPhone); p != "" {
db = db.Where("inviter.phone LIKE ?", "%"+p+"%")
if isPhoneKeyword(p) {
db = db.Where("irl.inviter_id = (SELECT id FROM users WHERE phone = ?)", p)
} else {
db = db.Where("inviter.phone LIKE ?", "%"+p+"%")
}
}
if p := strings.TrimSpace(query.InviteePhone); p != "" {
db = db.Where("invitee.phone LIKE ?", "%"+p+"%")
if isPhoneKeyword(p) {
db = db.Where("irl.invitee_id = (SELECT id FROM users WHERE phone = ?)", p)
} else {
db = db.Where("invitee.phone LIKE ?", "%"+p+"%")
}
}
if t := strings.TrimSpace(query.TradeRole); t != "" {
db = db.Where("irl.trade_role = ?", t)
@@ -1050,6 +1074,18 @@ func parseAdminRebateDate(value string) (time.Time, bool) {
return time.Time{}, false
}
func isPhoneKeyword(s string) bool {
if len(s) != 11 || s[0] != '1' {
return false
}
for i := 0; i < len(s); i++ {
if s[i] < '0' || s[i] > '9' {
return false
}
}
return true
}
// ListAdminRebateLedgers 管理后台查询返利流水
func (r *Repository) ListAdminRebateLedgers(ctx context.Context, query AdminRebateLedgerQuery) ([]map[string]any, int64, error) {
if r == nil || r.db == nil {