123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- package model
- import (
- "active/constant"
- "encoding/json"
- "fmt"
- "log"
- "math"
- "sync/atomic"
- "time"
- "git.jiaxianghudong.com/go/logs"
- "git.jiaxianghudong.com/webs/pkg/rds"
- )
- var rebateExpireAt int32
- //RebateData 投资返利存储
- type RebateData struct {
- Levels map[int]*LevelData `json:"levels"` //档次
- }
- //LevelData 等级数据
- type LevelData struct {
- Tm time.Time `json:"paytime"` //支付时间 时间戳
- Status int `json:"status"` //领取状态 位运算1+2+4
- }
- //RebatePropData 投资奖励
- type RebatePropData struct {
- Investment []RebatePropInfos `json:"investment_rebate"`
- }
- //RebatePropInfos 奖励具体信息
- type RebatePropInfos struct {
- Amount int64 `json:"investment_amount"`
- LoginDay1 []RebatePropDetails `json:"login_day1"`
- LoginDay2 []RebatePropDetails `json:"login_day2"`
- LoginDay3 []RebatePropDetails `json:"login_day3"`
- }
- //RebatePropDetails 奖励具体详细信息
- type RebatePropDetails struct {
- Prop int32 `json:"props_id"`
- Num int64 `json:"num"`
- }
- //GetRebateData 获取累充用户存储数据
- func GetRebateData(UserID string, tm string) *RebateData {
- data := rds.Redis.HGet(fmt.Sprintf(constant.REBATEDATA, tm), UserID).Val()
- rd := new(RebateData)
- if data != "" {
- err := json.Unmarshal([]byte(data), &rd)
- if err != nil {
- logs.Errorf("redpacket[%s] GetRebateData json err:%v", UserID, err)
- return rd
- }
- }
- return rd
- }
- //SetRebateData 设置用户存储
- func (t *RebateData) SetRebateData(UserID, tm, endtm string) bool {
- da, _ := json.Marshal(t)
- rds.Redis.HSet(fmt.Sprintf(constant.REBATEDATA, tm), UserID, string(da))
- if atomic.CompareAndSwapInt32(&rebateExpireAt, 0, 1) {
- end, _ := time.Parse("2006-01-02 15:04:05", endtm)
- expireAt := end.Add(constant.REBATEDATATIMEOUT)
- log.Printf("---更新投资返利数据过期时间: expireAt:%v", expireAt)
- rds.Redis.ExpireAt(fmt.Sprintf(constant.REBATEDATA, tm), expireAt)
- }
- return true
- }
- //GetPropByLevel 获取奖励
- func GetPropByLevel(info string, typ, level int) map[int32]int64 {
- r, err := parseRebate(info)
- if err != nil {
- return nil
- }
- if len(r.Investment) < typ {
- return nil
- }
- rd := []RebatePropDetails{}
- switch level {
- case 1:
- rd = r.Investment[typ-1].LoginDay1
- case 2:
- rd = r.Investment[typ-1].LoginDay2
- case 3:
- rd = r.Investment[typ-1].LoginDay3
- }
- data := make(map[int32]int64, 0)
- for _, v := range rd {
- data[v.Prop] = v.Num
- }
- return data
- }
- //ConsumePropByType 消耗道具
- func ConsumePropByType(info string, typ int) map[int32]int64 {
- r, err := parseRebate(info)
- if err != nil {
- return nil
- }
- if len(r.Investment) < typ {
- return nil
- }
- data := make(map[int32]int64, 0)
- amout := r.Investment[typ-1].Amount
- if amout < 0 {
- amout = -amout
- }
- data[17] = -amout
- return data
- }
- func parseRebate(info string) (RebatePropData, error) {
- var r RebatePropData
- if err := json.Unmarshal([]byte(info), &r); err != nil {
- logs.Errorf("parseRebate json data:%s err:%v", info, err)
- return r, err
- }
- return r, nil
- }
- //CheckSubDay 计算两个时间点的相差天数
- func CheckSubDay(tm time.Time) int {
- dt1 := time.Date(tm.Year(), tm.Month(), tm.Day(), 0, 0, 0, 0, time.Local)
- dt2 := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local)
- return int(math.Ceil(dt2.Sub(dt1).Hours() / 24))
- }
|