You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.3 KiB
99 lines
2.3 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"errors" |
|
"go-common/app/job/live/gift/internal/model" |
|
"go-common/library/log" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
// AddGift AddGift |
|
func (s *Service) AddGift(ctx context.Context, m *model.AddFreeGift) (bagId int64, err error) { |
|
uid := m.UID |
|
giftID := m.GiftID |
|
giftNum := m.GiftNum |
|
expireAt := m.ExpireAt |
|
source := m.Source |
|
if uid == 0 || giftID == 0 || giftNum == 0 { |
|
log.Error("add gift params error,uid:%d,giftID:%d,giftNum:%d", uid, giftID, giftNum) |
|
err = errors.New("params error") |
|
return |
|
} |
|
bagID, err := s.GetBagID(ctx, uid, giftID, expireAt) |
|
if err != nil { |
|
return |
|
} |
|
var ( |
|
affectNum int64 |
|
isUpdate = false |
|
eg, _ = errgroup.WithContext(ctx) |
|
) |
|
if bagID != 0 { |
|
isUpdate = true |
|
affectNum, _ = s.dao.UpdateBagNum(ctx, uid, bagID, giftNum) |
|
} else { |
|
affectNum, _ = s.dao.AddBag(ctx, uid, giftID, giftNum, expireAt) |
|
bagID = affectNum |
|
eg.Go( |
|
func() error { |
|
s.dao.SetBagIDCache(ctx, uid, giftID, expireAt, bagID, 14400) |
|
return nil |
|
}) |
|
|
|
} |
|
newNum := giftNum |
|
if affectNum > 0 { |
|
eg.Go( |
|
func() error { |
|
s.dao.ClearBagListCache(ctx, uid) |
|
return nil |
|
}) |
|
if isUpdate { |
|
res, _ := s.dao.GetBagByID(ctx, uid, bagID) |
|
newNum = res.GiftNum |
|
//上报lancer TODO |
|
s.bagLogInfoc(uid, bagID, giftID, giftNum, newNum, source) |
|
} |
|
} |
|
// 更新免费礼物数量缓存 |
|
eg.Go( |
|
func() error { |
|
s.UpdateFreeGiftCache(ctx, uid, giftID, expireAt, newNum) |
|
return nil |
|
}) |
|
eg.Wait() |
|
return |
|
} |
|
|
|
// GetBagID GetBagID |
|
func (s *Service) GetBagID(ctx context.Context, uid, giftID, expireAt int64) (id int64, err error) { |
|
id, err = s.dao.GetBagIDCache(ctx, uid, giftID, expireAt) |
|
if err != nil { |
|
return |
|
} |
|
if id == 0 { |
|
//queryDB |
|
var r *model.BagInfo |
|
r, err = s.dao.GetBag(ctx, uid, giftID, expireAt) |
|
if err != nil { |
|
return |
|
} |
|
id = r.ID |
|
} |
|
|
|
// 缓存或数据库本身有,再更新缓存 |
|
if id != 0 { |
|
s.dao.SetBagIDCache(ctx, uid, giftID, expireAt, id, 14400) |
|
} |
|
return |
|
} |
|
|
|
// UpdateFreeGiftCache UpdateFreeGiftCache |
|
func (s *Service) UpdateFreeGiftCache(ctx context.Context, uid, giftID, expireAt, num int64) { |
|
//giftInfo := s.GetGiftInfoByID(ctx, giftID) |
|
//if giftInfo.Id == 0 || giftInfo.Type != 3 { |
|
// return |
|
//} |
|
//s.dao.SetBagNumCache(ctx, uid, giftID, expireAt, num, 14400) |
|
}
|
|
|