Files
soul-yongping/soul-api/internal/handler/db_ckb_person_leads.go
2026-03-18 21:06:16 +08:00

92 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handler
import (
"net/http"
"strconv"
"strings"
"soul-api/internal/database"
"soul-api/internal/model"
"github.com/gin-gonic/gin"
)
// DBCKBPersonLeads GET /api/db/ckb-person-leads
// - 不带 token返回每个 Person 的获客数(基于 ckb_lead_records.target_person_id
// - 带 token返回该 Person 的获客明细(分页)
func DBCKBPersonLeads(c *gin.Context) {
db := database.DB()
token := strings.TrimSpace(c.Query("token"))
// 1) 汇总:每个人物的获客数
if token == "" {
type Row struct {
Token string `json:"token"`
Total int64 `json:"total"`
}
var rows []Row
// persons.token 唯一;左连接保证没获客也能返回 total=0
if err := db.Raw(`
SELECT p.token AS token, COUNT(l.id) AS total
FROM persons p
LEFT JOIN ckb_lead_records l ON l.target_person_id = p.person_id
GROUP BY p.token
`).Scan(&rows).Error; err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "byPerson": rows})
return
}
// 2) 明细:某个人物的获客列表
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
}
var person model.Person
// token 是管理端/小程序统一引用的主键;兜底允许传 personId便于排查/手工调用)
if err := db.Where("token = ? OR person_id = ?", token, token).First(&person).Error; err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "error": "未找到人物"})
return
}
q := db.Model(&model.CkbLeadRecord{}).Where("target_person_id = ?", person.PersonID)
var total int64
q.Count(&total)
var records []model.CkbLeadRecord
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, "error": err.Error()})
return
}
out := make([]gin.H, 0, len(records))
for _, r := range records {
out = append(out, gin.H{
"id": r.ID,
"userId": r.UserID,
"nickname": r.Nickname,
"phone": r.Phone,
"wechatId": r.WechatID,
"name": r.Name,
"source": r.Source,
"createdAt": r.CreatedAt,
})
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"records": out,
"total": total,
"page": page,
"pageSize": pageSize,
"personName": person.Name,
})
}