Files
2025-11-17 14:11:46 +08:00

186 lines
4.3 KiB
Go
Raw Permalink 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 (
"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)
}