Files
ai_dianshang/server/internal/handler/coupon.go

186 lines
4.3 KiB
Go
Raw Normal View History

2025-11-17 14:11:46 +08:00
package handler
import (
"dianshang/internal/service"
"dianshang/pkg/response"
"dianshang/pkg/utils"
"github.com/gin-gonic/gin"
)
// CouponHandler 优惠券处理器
type CouponHandler struct {
couponService *service.CouponService
}
// NewCouponHandler 创建优惠券处理器
func NewCouponHandler(couponService *service.CouponService) *CouponHandler {
return &CouponHandler{
couponService: couponService,
}
}
// GetAvailableCoupons 获取可用优惠券列表
func (h *CouponHandler) GetAvailableCoupons(c *gin.Context) {
// 尝试获取用户ID如果有用户登录则返回包含已领取状态的数据
userIDValue, exists := c.Get("user_id")
var userID uint = 0
if exists {
userID = userIDValue.(uint)
}
coupons, err := h.couponService.GetAvailableCouponsWithUserStatus(userID)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, coupons)
}
// GetUserCoupons 获取用户优惠券
func (h *CouponHandler) GetUserCoupons(c *gin.Context) {
userIDValue, exists := c.Get("user_id")
if !exists {
response.Unauthorized(c)
return
}
userID := userIDValue.(uint)
status := utils.StringToInt(c.DefaultQuery("status", "1")) // 1未使用2已使用3已过期
coupons, err := h.couponService.GetUserCoupons(userID, status)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, coupons)
}
// ReceiveCoupon 领取优惠券
func (h *CouponHandler) ReceiveCoupon(c *gin.Context) {
userIDValue, exists := c.Get("user_id")
if !exists {
response.Unauthorized(c)
return
}
userID := userIDValue.(uint)
couponID := utils.StringToUint(c.Param("id"))
if couponID == 0 {
response.BadRequest(c, "无效的优惠券ID")
return
}
err := h.couponService.ReceiveCoupon(userID, couponID)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, nil)
}
// UseCoupon 使用优惠券
func (h *CouponHandler) UseCoupon(c *gin.Context) {
userIDValue, exists := c.Get("user_id")
if !exists {
response.Unauthorized(c)
return
}
userID := userIDValue.(uint)
userCouponID := utils.StringToUint(c.Param("id"))
if userCouponID == 0 {
response.BadRequest(c, "无效的优惠券ID")
return
}
var req struct {
OrderID uint `json:"order_id" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误")
return
}
err := h.couponService.UseCoupon(userID, userCouponID, req.OrderID)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, nil)
}
// GetAvailableCouponsForOrder 获取订单可用优惠券
func (h *CouponHandler) GetAvailableCouponsForOrder(c *gin.Context) {
userIDValue, exists := c.Get("user_id")
if !exists {
response.Unauthorized(c)
return
}
userID := userIDValue.(uint)
orderAmountStr := c.Query("order_amount")
if orderAmountStr == "" {
response.BadRequest(c, "订单金额不能为空")
return
}
orderAmount := utils.StringToFloat64(orderAmountStr)
if orderAmount <= 0 {
response.BadRequest(c, "订单金额必须大于0")
return
}
coupons, err := h.couponService.GetAvailableCouponsForOrder(userID, orderAmount)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, coupons)
}
// ValidateCoupon 验证优惠券
func (h *CouponHandler) ValidateCoupon(c *gin.Context) {
userIDValue, exists := c.Get("user_id")
if !exists {
response.Unauthorized(c)
return
}
userID := userIDValue.(uint)
userCouponID := utils.StringToUint(c.Param("id"))
if userCouponID == 0 {
response.BadRequest(c, "无效的优惠券ID")
return
}
orderAmountStr := c.Query("order_amount")
if orderAmountStr == "" {
response.BadRequest(c, "订单金额不能为空")
return
}
orderAmount := utils.StringToFloat64(orderAmountStr)
if orderAmount <= 0 {
response.BadRequest(c, "订单金额必须大于0")
return
}
userCoupon, discountAmount, err := h.couponService.ValidateCoupon(userID, userCouponID, orderAmount)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
result := map[string]interface{}{
"user_coupon": userCoupon,
"discount_amount": discountAmount,
"can_use": true,
}
response.Success(c, result)
}