user_bag.go 2.96 KB
Newer Older
hujiebin's avatar
hujiebin committed
1 2 3 4 5 6 7
package bag_m

import (
	"git.hilo.cn/hilo-common/domain"
	"git.hilo.cn/hilo-common/resource/mysql"
	"gorm.io/gorm/clause"
	"hilo-user/_const/enum/res_e"
hujiebin's avatar
hujiebin committed
8
	"hilo-user/domain/event/user_ev"
hujiebin's avatar
hujiebin committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
	"time"
)

type UserBag struct {
	mysql.Entity
	UserId  mysql.ID
	ResType mysql.Type // 资源类型 1:礼物
	ResId   mysql.ID
	Count   mysql.Num
	EndTime time.Time
}

type UserBagDetail struct {
	mysql.Entity
	UserId    mysql.ID
	BagId     mysql.ID
	ResType   mysql.Type // 资源类型 1:礼物
	ResId     mysql.ID
	Count     mysql.Num
	AddReduce mysql.AddReduce
	BefNum    mysql.Num
	AftNum    mysql.Num
	Remark    mysql.Str
}

// 获取用户有效的背包
// param userId 用户id
// param resType 背包类型 1:礼物
// condition
//	1.获取end_time未到期的
//	2.数量大于0的
func GetUserValidUserBag(model *domain.Model, userId mysql.ID, resType res_e.ResUserBag) ([]*UserBag, error) {
	var res []*UserBag
	if err := model.DB().Model(UserBag{}).
		Where("end_time > ?", time.Now()).
		Where("count > 0").
		Where("res_type = ?", resType).
		Where("user_id = ?", userId).
		Order("id").Find(&res).Error; err != nil {
		return nil, err
	}
	return res, nil
}

// 获取指定背包
func GetUserBag(model *domain.Model, bagId mysql.ID) (*UserBag, error) {
	res := new(UserBag)
	if err := model.DB().Model(UserBag{}).
		Where("id = ?", bagId).First(res).Error; err != nil {
		return nil, err
	}
	return res, nil
}

// 增加用户背包
// param userId 用户id
// param resType 道具类型
// param resId 道具id
// param count 增加数量
// param day 增加天数
// condition:
//	0.事务操作
//  1.背包表
//  2.明细表
// return bagId
func AddUserBag(model *domain.Model, userId mysql.ID, resType mysql.Type, resId mysql.ID, count mysql.Num, day int, reason string) (mysql.ID, error) {
	var bagId mysql.ID
	err := model.Transaction(func(model *domain.Model) error {
		//  1.背包表
		endTime := time.Now().AddDate(0, 0, day)
		userBag := &UserBag{
			UserId:  userId,
			ResType: resType,
			ResId:   resId,
			Count:   count,
			EndTime: endTime,
		}
		if err := model.DB().Clauses(clause.OnConflict{
			Columns:   []clause.Column{{Name: "user_id"}, {Name: "res_type"}, {Name: "res_id"}, {Name: "end_time"}},
			DoUpdates: clause.AssignmentColumns([]string{"count"}),
		}).Create(userBag).Error; err != nil {
			return err
		}
		bagId = userBag.ID // 自增id
		//  2.明细表
		userBagDetail := &UserBagDetail{
			UserId:    userId,
			BagId:     userBag.ID,
			ResType:   resType,
			ResId:     resId,
			Count:     count,
			AddReduce: mysql.ADD,
			BefNum:    0,     // 加背包的统一为0
			AftNum:    count, // 加背包统一为count,因为每次加几乎不可能是一样的
			Remark:    reason,
		}
		if err := model.DB().Create(userBagDetail).Error; err != nil {
			return err
		}
hujiebin's avatar
hujiebin committed
108 109 110 111 112 113 114 115
		return user_ev.PublishUserBagSend(model, &user_ev.UserBagSendEvent{
			UserId:  userId,
			ResType: resType,
			ResId:   resId,
			Count:   count,
			Day:     day,
			Reason:  reason,
		})
hujiebin's avatar
hujiebin committed
116 117 118
	})
	return bagId, err
}