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"})