From 387a9fc5fa648702cca388121a9472eaf3db4978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=A1=E8=8B=A5?= Date: Sun, 8 Mar 2026 10:27:09 +0800 Subject: [PATCH] =?UTF-8?q?sync:=20soul-api=20=E6=8E=A5=E5=8F=A3=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20|=20=E5=8E=9F=E5=9B=A0:=20=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soul-api/internal/handler/match.go | 60 +++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/soul-api/internal/handler/match.go b/soul-api/internal/handler/match.go index 9b788671..6763ec81 100644 --- a/soul-api/internal/handler/match.go +++ b/soul-api/internal/handler/match.go @@ -181,13 +181,63 @@ func MatchUsers(c *gin.Context) { return } } - // 找伙伴(partner):仅从超级个体池匹配(is_vip=1 且 vip_expire_date>NOW);其他类型:已绑定微信或手机号的用户 + // 读取 poolSettings 配置决定匹配范围 + var cfg model.SystemConfig + poolSource := "vip" + requirePhone := true + requireNickname := false + requireAvatar := false + requireBusiness := false + if err := db.Where("config_key = ?", "match_config").First(&cfg).Error; err == nil { + var cfgMap map[string]interface{} + if json.Unmarshal(cfg.ConfigValue, &cfgMap) == nil { + if ps, ok := cfgMap["poolSettings"].(map[string]interface{}); ok { + if v, ok := ps["poolSource"].(string); ok { + poolSource = v + } + if v, ok := ps["requirePhone"].(bool); ok { + requirePhone = v + } + if v, ok := ps["requireNickname"].(bool); ok { + requireNickname = v + } + if v, ok := ps["requireAvatar"].(bool); ok { + requireAvatar = v + } + if v, ok := ps["requireBusiness"].(bool); ok { + requireBusiness = v + } + } + } + } + var users []model.User - q := db.Where("id != ?", body.UserID). - Where("((wechat_id IS NOT NULL AND wechat_id != '') OR (phone IS NOT NULL AND phone != ''))") - if body.MatchType == "partner" { - // 超级个体:VIP 会员池 + q := db.Where("id != ?", body.UserID) + // 按池子来源筛选 + switch poolSource { + case "vip": q = q.Where("is_vip = 1 AND vip_expire_date > NOW()") + case "complete": + q = q.Where("((phone IS NOT NULL AND phone != '') AND (nickname IS NOT NULL AND nickname != ''))") + default: + q = q.Where("((wechat_id IS NOT NULL AND wechat_id != '') OR (phone IS NOT NULL AND phone != ''))") + } + // partner 类型强制 VIP + if body.MatchType == "partner" && poolSource != "vip" { + q = q.Where("is_vip = 1 AND vip_expire_date > NOW()") + } + // 按完善程度筛选 + if requirePhone { + q = q.Where("phone IS NOT NULL AND phone != ''") + } + if requireNickname { + q = q.Where("nickname IS NOT NULL AND nickname != ''") + } + if requireAvatar { + q = q.Where("avatar IS NOT NULL AND avatar != ''") + } + if requireBusiness { + q = q.Where("(help_offer IS NOT NULL AND help_offer != '') OR (help_need IS NOT NULL AND help_need != '')") } if err := q.Order("created_at DESC").Limit(20).Find(&users).Error; err != nil || len(users) == 0 { c.JSON(http.StatusOK, gin.H{"success": false, "message": "暂无匹配用户", "data": nil, "code": "NO_USERS"})