148 lines
3.6 KiB
Go
148 lines
3.6 KiB
Go
package service
|
||
|
||
import (
|
||
"fmt"
|
||
"gorm.io/gorm"
|
||
"hepa-calc-api/api/dao"
|
||
"hepa-calc-api/api/model"
|
||
"hepa-calc-api/extend/rabbitMq"
|
||
"hepa-calc-api/utils"
|
||
"time"
|
||
)
|
||
|
||
type CouponService struct {
|
||
}
|
||
|
||
// GrantUserCoupon 发放优惠卷
|
||
// grantQuantity 发放数量
|
||
func (r *CouponService) GrantUserCoupon(tx *gorm.DB, userId, couponId int64, grantQuantity int) bool {
|
||
// 获取优惠卷数据
|
||
couponDao := dao.CouponDao{}
|
||
coupon, err := couponDao.GetCouponById(couponId)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
|
||
// 判断优惠卷状态
|
||
if coupon.CouponStatus != 1 {
|
||
return true
|
||
}
|
||
|
||
// 判断优惠卷过期时间
|
||
if coupon.ValidType == 1 {
|
||
now := time.Now().Add(10 * 60 * time.Second)
|
||
validEndTime := time.Time(*coupon.ValidEndTime)
|
||
if validEndTime.Before(now) {
|
||
return true
|
||
}
|
||
}
|
||
|
||
// 判断优惠卷数量是否充足
|
||
if coupon.CouponCount <= coupon.CouponTakeCount {
|
||
return false
|
||
}
|
||
|
||
// 检测剩余数量
|
||
remainingQuantity := coupon.CouponCount - coupon.CouponTakeCount
|
||
if remainingQuantity <= grantQuantity {
|
||
return false
|
||
}
|
||
|
||
// 检测用户是否已有该优惠卷
|
||
userCouponDao := dao.UserCouponDao{}
|
||
maps := make(map[string]interface{})
|
||
maps["user_id"] = userId
|
||
maps["coupon_id"] = coupon.CouponId
|
||
userCoupon, _ := userCouponDao.GetUserCoupon(maps)
|
||
if userCoupon != nil {
|
||
return true
|
||
}
|
||
|
||
// 添加用户优惠卷表
|
||
userCoupon = &model.UserCoupon{
|
||
UserId: userId,
|
||
CouponId: couponId,
|
||
UserCouponStatus: 0,
|
||
IsWindows: 0,
|
||
CouponUseDate: nil,
|
||
}
|
||
|
||
if coupon.ValidType == 1 {
|
||
// 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效)
|
||
userCoupon.ValidStartTime = coupon.ValidStartTime
|
||
userCoupon.ValidEndTime = coupon.ValidEndTime
|
||
} else {
|
||
validStartTime := model.LocalTime(time.Now())
|
||
userCoupon.ValidStartTime = &validStartTime
|
||
|
||
validEndTime := model.LocalTime(time.Now().Add(time.Duration(coupon.ValidDays) * 24 * time.Hour))
|
||
userCoupon.ValidEndTime = &validEndTime
|
||
}
|
||
|
||
userCoupon, err = userCouponDao.AddUserCoupon(tx, userCoupon)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
|
||
// 增加优惠卷发放数量
|
||
err = couponDao.Inc(tx, couponId, "coupon_take_count", grantQuantity)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
|
||
// 增加过期队列
|
||
if coupon.ValidType == 1 {
|
||
validEndTime := time.Time(*userCoupon.ValidEndTime)
|
||
|
||
// 计算当天的结束时间
|
||
now := time.Now()
|
||
year, month, day := now.Date()
|
||
location := now.Location()
|
||
endOfDay := time.Date(year, month, day, 23, 59, 59, 0, location)
|
||
if validEndTime.Before(endOfDay) {
|
||
delay := validEndTime.Sub(time.Now())
|
||
if delay < 5*time.Second {
|
||
delay = 5 * time.Second
|
||
}
|
||
|
||
// 添加处理优惠卷过期队列
|
||
data := make(map[string]interface{})
|
||
data["coupon_id"] = fmt.Sprintf("%d", coupon.CouponId)
|
||
|
||
p := rabbitMq.PublishS{
|
||
QueueName: "user.coupon.expired.delay.queue",
|
||
ExchangeName: "amqp.delay.direct",
|
||
RoutingKey: "UserCouponExpired",
|
||
Message: data,
|
||
Delay: delay,
|
||
}
|
||
err := p.PublishWithDelay()
|
||
if err != nil {
|
||
return false
|
||
}
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
// GrantFillUserInfoCoupon 发放用户完善资料优惠卷
|
||
func (r *CouponService) GrantFillUserInfoCoupon(tx *gorm.DB, userId int64) bool {
|
||
// 发放用户完善资料优惠卷
|
||
couponDao := dao.CouponDao{}
|
||
coupons, _ := couponDao.GetFillUserInfoCouponList()
|
||
if len(coupons) == 0 {
|
||
return true
|
||
}
|
||
|
||
// 发放优惠卷
|
||
for _, coupon := range coupons {
|
||
res := r.GrantUserCoupon(tx, userId, coupon.CouponId, 1)
|
||
if res == false {
|
||
utils.LogJsonErr("发放用户完善资料优惠卷失败:", nil)
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|