medal.go 1.95 KB
package res_m

import (
	"git.hilo.cn/hilo-common/resource/mysql"
	"github.com/bluele/gcache"
	"gorm.io/gorm"
	"hilo-user/_const/enum/res_e"
	"time"
)

type ResMedal struct {
	mysql.Entity
	Name     string
	PicUrl   string
	SvgaUrl  string
	Sort     mysql.Num
	NoPicUrl *string
	//类型 (0:代表自身就是一种类型 > 0, 一种相关联的类型)
	Type  res_e.ResMedalType
	Scope res_e.ResMedalScope
	//限制 (-1, 没有限制)
	Threshold mysql.Num
	I         mysql.Num
}

// 查勋章中的等级关系
func GetUserMedalLevelMap(db *gorm.DB) (map[uint64]uint8, map[uint8][]uint64, error) {
	rows := make([]ResMedal, 0)
	if err := db.Model(&ResMedal{}).Order("threshold ASC").Find(&rows).Error; err != nil {
		return nil, nil, err
	}
	medalTypes := make(map[uint64]uint8, 0)
	result := make(map[uint8][]uint64, 0)
	for _, i := range rows {
		medalTypes[i.ID] = i.Type

		if i.Type != 0 {
			if _, ok := result[i.Type]; !ok {
				result[i.Type] = make([]uint64, 0)
			}
			result[i.Type] = append(result[i.Type], i.ID)
		}
	}
	return medalTypes, result, nil
}

var medalCache = gcache.New(1000).LRU().Build()
var medalMapCache = gcache.New(1).LRU().Build()

const medalKey = "MEDAL"

// pprof看到内存分配很多
// 加上15min lru
func MedalGetAll(db *gorm.DB) ([]ResMedal, error) {
	if data, err := medalCache.Get(medalKey); err == nil {
		return data.([]ResMedal), nil
	}
	rows := make([]ResMedal, 0)
	err := db.Find(&rows).Error
	if err != nil {
		return nil, err
	}
	_ = medalCache.SetWithExpire(medalKey, rows, time.Minute*15)
	return rows, nil
}

func MedalGetAllMap(db *gorm.DB) (map[uint32]ResMedal, error) {
	if data, err := medalMapCache.Get(medalKey); err == nil {
		return data.(map[uint32]ResMedal), nil
	}
	rows, err := MedalGetAll(db)
	if err != nil {
		return nil, err
	}
	result := make(map[uint32]ResMedal, 0)
	for _, i := range rows {
		result[uint32(i.ID)] = i
	}
	_ = medalMapCache.SetWithExpire(medalKey, result, time.Minute*15)
	return result, nil
}