From 0bfcb97b8e267d5c469de85a0fa4164dab92e78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=A1=E8=8B=A5?= Date: Sun, 8 Mar 2026 17:10:16 +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/ckb.go | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/soul-api/internal/handler/ckb.go b/soul-api/internal/handler/ckb.go index d99d4f9d..2ee089e6 100644 --- a/soul-api/internal/handler/ckb.go +++ b/soul-api/internal/handler/ckb.go @@ -511,6 +511,84 @@ func CKBPlanStats(c *gin.Context) { }) } +// DBCKBLeadList GET /api/db/ckb-leads 管理端-CKB线索明细 +func DBCKBLeadList(c *gin.Context) { + db := database.DB() + mode := strings.TrimSpace(c.DefaultQuery("mode", "submitted")) // submitted|contact + matchType := strings.TrimSpace(c.Query("matchType")) + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20")) + if page < 1 { + page = 1 + } + if pageSize < 1 || pageSize > 100 { + pageSize = 20 + } + + q := db.Model(&model.MatchRecord{}).Where("id LIKE 'mr_ckb_%'") + if matchType != "" { + q = q.Where("match_type = ?", matchType) + } + if mode == "contact" { + q = q.Where("((phone IS NOT NULL AND phone != '') OR (wechat_id IS NOT NULL AND wechat_id != ''))") + } + + var total int64 + q.Count(&total) + + var records []model.MatchRecord + if err := q.Order("created_at DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&records).Error; err != nil { + c.JSON(http.StatusOK, gin.H{"success": false, "message": err.Error()}) + return + } + + userIDs := make(map[string]bool) + for _, r := range records { + if r.UserID != "" { + userIDs[r.UserID] = true + } + } + ids := make([]string, 0, len(userIDs)) + for id := range userIDs { + ids = append(ids, id) + } + var users []model.User + if len(ids) > 0 { + db.Where("id IN ?", ids).Find(&users) + } + userMap := make(map[string]*model.User) + for i := range users { + userMap[users[i].ID] = &users[i] + } + safeNickname := func(u *model.User) string { + if u == nil || u.Nickname == nil { + return "" + } + return *u.Nickname + } + + out := make([]gin.H, 0, len(records)) + for _, r := range records { + out = append(out, gin.H{ + "id": r.ID, + "userId": r.UserID, + "userNickname": safeNickname(userMap[r.UserID]), + "matchType": r.MatchType, + "phone": func() string { if r.Phone == nil { return "" }; return *r.Phone }(), + "wechatId": func() string { if r.WechatID == nil { return "" }; return *r.WechatID }(), + "createdAt": r.CreatedAt, + }) + } + + c.JSON(http.StatusOK, gin.H{ + "success": true, + "records": out, + "total": total, + "page": page, + "pageSize": pageSize, + }) +} + func minInt(a, b int) int { if a < b { return a