package handlers import ( "awesomeProject/internal/common" "awesomeProject/internal/models" "net/http" "strconv" "github.com/gin-gonic/gin" ) // UserScoreHandler 用户端积分处理器 type UserScoreHandler struct{} // GetMyScoreRecords 获取我的积分记录列表 func (h *UserScoreHandler) GetMyScoreRecords(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) // 分页参数 page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) if page < 1 { page = 1 } if pageSize < 1 || pageSize > 50 { pageSize = 20 } // 搜索参数 changeType := c.Query("change_type") // all, positive, negative db := common.GetDB() var records []models.ScoreRecord var total int64 // 构建查询条件 - 只查询当前用户的积分记录 query := db.Model(&models.ScoreRecord{}).Where("user_id = ?", user.ID) // 添加积分变化类型筛选 if changeType == "positive" { query = query.Where("change_number > 0") } else if changeType == "negative" { query = query.Where("change_number < 0") } // 获取总数 query.Count(&total) // 分页查询 offset := (page - 1) * pageSize err := query.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&records).Error if err != nil { c.JSON(http.StatusOK, common.Error(500, "查询积分记录失败")) return } // 计算统计信息 var totalIncome int // 总收入积分 var totalExpense int // 总支出积分 var currentPoints int // 当前积分 currentPoints = user.CurrentPoints // 统计总收入和总支出 db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0", user.ID). Select("COALESCE(SUM(change_number), 0)").Scan(&totalIncome) db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number < 0", user.ID). Select("COALESCE(SUM(ABS(change_number)), 0)").Scan(&totalExpense) // 构建返回数据 result := map[string]interface{}{ "list": records, "total": total, "page": page, "page_size": pageSize, "current_points": currentPoints, "total_income": totalIncome, "total_expense": totalExpense, } c.JSON(http.StatusOK, common.Success(result)) } // GetMyScoreStats 获取我的积分统计信息 func (h *UserScoreHandler) GetMyScoreStats(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) db := common.GetDB() // 当前积分 currentPoints := user.CurrentPoints // 总收入积分 var totalIncome int db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0", user.ID). Select("COALESCE(SUM(change_number), 0)").Scan(&totalIncome) // 总支出积分 var totalExpense int db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number < 0", user.ID). Select("COALESCE(SUM(ABS(change_number)), 0)").Scan(&totalExpense) // 今日获得积分 var todayIncome int db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0 AND DATE(created_at) = CURDATE()", user.ID). Select("COALESCE(SUM(change_number), 0)").Scan(&todayIncome) // 本月获得积分 var monthIncome int db.Model(&models.ScoreRecord{}).Where("user_id = ? AND change_number > 0 AND YEAR(created_at) = YEAR(NOW()) AND MONTH(created_at) = MONTH(NOW())", user.ID). Select("COALESCE(SUM(change_number), 0)").Scan(&monthIncome) // 最近的积分记录(5条) var recentRecords []models.ScoreRecord db.Model(&models.ScoreRecord{}).Where("user_id = ?", user.ID). Order("created_at DESC").Limit(5).Find(&recentRecords) // 构建返回数据 result := map[string]interface{}{ "current_points": currentPoints, "total_income": totalIncome, "total_expense": totalExpense, "today_income": todayIncome, "month_income": monthIncome, "recent_records": recentRecords, } c.JSON(http.StatusOK, common.Success(result)) }