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