group.go 2.19 KB
Newer Older
hujiebin's avatar
hujiebin committed
1 2 3 4 5 6 7 8 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
package group_s

import (
	"git.hilo.cn/hilo-common/domain"
	"git.hilo.cn/hilo-common/mycontext"
	"git.hilo.cn/hilo-common/resource/config"
	"hilo-group/_const/enum/group_e"
	"hilo-group/_const/redis_key"
	"hilo-group/domain/model/group_m"
	"strconv"
	"time"
)

type GroupService struct {
	svc *domain.Service
}

func NewGroupService(myContext *mycontext.MyContext) *GroupService {
	svc := domain.CreateService(myContext)
	return &GroupService{svc}
}

// 取本周最高的扶持等级 fixme:删除这个过渡函数
func (s *GroupService) GetWeekMaxSupportLevelMap() (map[string]uint8, error) {
	return s.GetSupportLevelMap(time.Now().AddDate(0, 0, -group_e.SUPPORT_LEVEL_PERIOD_DAY))
}

func (s *GroupService) GetSupportLevelMap(now time.Time) (map[string]uint8, error) {
	model := domain.CreateModel(s.svc.CtxAndDb)

	_, _, period := group_m.GetSupportLevelTime(now)

	levels, err := GetAllSupportLevel(model, period)
	if err != nil {
		return nil, err
	}
	model.Log.Debugf("GetSupportLevelMap, GET %s: %v", period, levels)

	result := make(map[string]uint8, 0)
	if len(levels) > 0 {
		for g, l := range levels {
			le, err := strconv.ParseUint(l, 10, 8)
			if err == nil {
				result[g] = uint8(le)
			}
		}
	} else {
		result, err = group_m.GetAllGroupSupportResult(model.Db, period)
		if err == nil {
			ret, err := SaveAllSupportLevel(model, period, result)
			model.Log.Infof("GetSupportLevelMap SAVE ret = %d, err: %v", ret, err)
		}
	}
	return result, nil
}

func SaveAllSupportLevel(model *domain.Model, date string, levels map[string]uint8) (int64, error) {
	values := make(map[string]interface{}, 0)
	for g, l := range levels {
		if l > 0 {
			values[g] = l
		}
	}
	if len(values) <= 0 {
		return 0, nil
	}
	key := redis_key.GetPrefixSupportLevel(date)
	ret, err := model.Redis.HSet(model, key, values).Result()

	if err == nil {
		// 设置一个TTL保险一些 TODO: 可以优化,保证数据总是有的
		ttl := time.Hour
		if !config.AppIsRelease() {
			ttl = time.Minute
		}
		model.Redis.Expire(model, key, ttl)
	}
	return ret, err
}

func GetAllSupportLevel(model *domain.Model, date string) (map[string]string, error) {
	key := redis_key.GetPrefixSupportLevel(date)
	return model.Redis.HGetAll(model, key).Result()
}