logic.go 9.01 KB
package logic

import (
	"HttpServer/redishandler"
	"common/logger"
	"common/redis"
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"
	"time"
)

func HandlerQuerdrawinfo(w http.ResponseWriter, data string, uuid int) {
	SetHeader(w)
	var resp QuerdrawinfoResp
	resp.Code = 0
	var rdata CommReq
	err := json.Unmarshal([]byte(data), &rdata)
	for {

		if err != nil {
			logger.Info("json decode HandlerQuerdrawinfo data failed:%v,for:%v", err, data)
			resp.Message = "json解析错误"
			resp.Code = 1
			break
		}
		//需要加上渠道才是唯一的玩家id,不同渠道视为不同数据
		uniqueuuid := strconv.Itoa(uuid) + rdata.Channel
		uinfo, err := GetUserInfo(uniqueuuid)
		if err != nil || uinfo == nil {
			logger.Error("redis failed err=%v", err)
			resp.Message = "服务器错误"
			resp.Code = 1
			break
		}

		//返回
		resp.Data.Cashdata = append(resp.Data.Cashdata, uinfo.WithDraw.Cashdata...)
		resp.Data.SpecialCashdata = append(resp.Data.SpecialCashdata, uinfo.WithDraw.SpecialCashdata...)

		resp.Code = 0
		break
	}

	//回包
	respstr, _ := json.Marshal(&resp)
	fmt.Fprint(w, string(respstr))

}

func HandlerGetcash(w http.ResponseWriter, data string, uuid int) {
	SetHeader(w)
	var resp GetcashResp
	resp.Code = 0
	var rdata GetcashReq
	err := json.Unmarshal([]byte(data), &rdata)
	for {
		if err != nil {
			logger.Info("json decode HandlerDrawguangold data failed:%v,for:%v", err, data)
			resp.Message = "json解析错误"
			resp.Code = 1
			break
		}


		//需要加上渠道才是唯一的玩家id,不同渠道视为不同数据
		uniqueuuid := strconv.Itoa(uuid) + rdata.Channel
		uinfo, err := GetUserInfo(uniqueuuid)
		if err != nil || uinfo == nil {
			logger.Error("redis failed err=%v", err)
			resp.Message = "服务器错误"
			resp.Code = 1
			break
		}

		drawnum := int(rdata.Money * 100)
		//需要判断一下金币是否足够
		if drawnum*100 > uinfo.RealGold {
			logger.Error("gold nor enough failed err=%v", err)
			resp.Message = "提现金币不足"
			resp.Code = 2
			break
		}

		//需要处理一下提现级别

		index := 0
		var info *WithDrawDesc
		if rdata.Ctype == 1 {
			index, info = uinfo.GetWithDrawData(rdata.Money)
		} else {
			index, info = uinfo.GetSpecialWithDrawData(rdata.Money)
		}

		if index == -1 || info == nil {
			logger.Error("AddWithDrawList failed err=%v", err)
			resp.Message = "网络错误"
			resp.Code = 1
			break
		}

		if uinfo.Lv < info.Limitlv {
			logger.Error("AddWithDrawList failed err=%v", err)
			resp.Message = "完成日常任务可以提升人物等级哦~"
			resp.Code = 3
			break
		}

		if info.Isnew == 0 {
			logger.Error("AddWithDrawList failed err=%v", err)
			resp.Message = "新人专享只能提取一次"
			resp.Code = 4
			break
		}

		if info.Preisfind == 0 {
			logger.Error("HandlerGetcash Preisfind err=%v", err)
			resp.Message = "请先完成前一档提现"
			resp.Code = 5
			break
		}

		//普通提现需要判断前置条件
		if rdata.Ctype == 1 {
			//判断一下前置条件的下一档
			if index == len(uinfo.WithDraw.Cashdata)-1 {
				//最后一档了不用处理
			} else {
				if index < len(uinfo.WithDraw.Cashdata)-1 {
					uinfo.WithDraw.Cashdata[index+1].Preisfind = 1
				}
			}
		}

		//如果是2.2.7版本开启提现次数限制
		if rdata.Ver == "2.2.7" && uinfo.GetCashCnt > 0 {
			logger.Error("HandlerGetcash GetCashCnt err=%v", err)
			resp.Message = "当天已经提现过了,请明天再来"
			resp.Code = 6
			break
		}

		if uinfo.SumLoginDay < info.Day {
			logger.Error("HandlerGetcash GetCashCnt err=%v", err)
			resp.Message = "累计登陆天数不足"
			resp.Code = 7
			break
		}

		//2.2.5版本开启自动审核
		checkcoin := 2
		if rdata.Ver == "2.2.5" || rdata.Ver == "2.2.6" || rdata.Ver == "2.2.7" {
			logger.Info("HandlerGetcash autocheckcoin")
			if drawnum <= 150 {
				//1.5挡位以下不需要审核
				checkcoin = 1 //临时关闭u
			}
		}

		gold, err := GetCashFromSDK(uuid, drawnum, rdata.Gameid, rdata.Channel, rdata.Openid, rdata.Nickname, rdata.Headurl, rdata.Ver, checkcoin)
		if err != nil {
			logger.Error("GetCashFromSDK failed err=%v", err)
			resp.Message = "从后台提现失败了"
			resp.Code = 8
			break
		}


		uinfo.GetCashCnt++
		//如果是前六挡
		if info.Cid <= 6 && rdata.Ctype == 1 {
			uinfo.WithDraw.Cashdata[index].Isnew = 0
		}
		if rdata.Ctype == 2 {
			uinfo.WithDraw.SpecialCashdata[index].Isnew = 0
		}

		uinfo.RealGold = gold
		//uinfo.RealGold -= drawnum * 100

		resp.Data.Walletgold = uinfo.RealGold
		SaveUserInfo(uinfo, uniqueuuid)

		resp.Code = 0
		break
	}

	//回包
	respstr, _ := json.Marshal(&resp)
	fmt.Fprint(w, string(respstr))

}

func HandlerGetcashrecord(w http.ResponseWriter, data string, uuid int) {
	SetHeader(w)
	var resp GetcashrecordResp
	resp.Code = 0
	var rdata GetcashrecordReq
	err := json.Unmarshal([]byte(data), &rdata)
	for {
		if err != nil {
			logger.Info("json decode HandlerGetcashrecord data failed:%v,for:%v", err, data)
			resp.Message = "json解析错误"
			resp.Code = 1
			break
		}

		list, err := GetCashList(uuid, rdata.Gameid, rdata.Channel, 0, 100)
		if err != nil {
			logger.Error("HandlerGetcashrecord failed err=%v", err)
			resp.Message = "服务器错误"
			resp.Code = 2
			break
		}
		if list != nil {
			resp.Data.Withdata = append(resp.Data.Withdata, *list...)
		}

		resp.Code = 0
		break
	}

	//回包
	respstr, _ := json.Marshal(&resp)
	fmt.Fprint(w, string(respstr))

}

func HandlerLogin(w http.ResponseWriter, data string, uuid int) {
	SetHeader(w)

	var resp UserLoginResp
	resp.Code = 0
	var rdata UserLoginReq
	err := json.Unmarshal([]byte(data), &rdata)
	for {
		if err != nil {
			logger.Info("json decode HandlerLogin data failed:%v,for:%v", err, data)
			resp.Message = "json解析错误"
			resp.Code = 1
			break
		}

		//需要加上渠道才是唯一的玩家id,不同渠道视为不同数据
		uniqueuuid := strconv.Itoa(uuid) + rdata.Channel
		//此处需要做一下数据兼容 先判断uuid+channel的key是否存在
		//先判断一下是否是新用户
		isexist, err := redishandler.GetRedisClient().HExists(redis.USER_DATA_KEY, uniqueuuid)
		if err != nil {
			logger.Error("redis failed err=%v", err)
			resp.Message = "服务器错误"
			resp.Code = 1
			break
		}

		if !isexist {
			//不存在

				//不存在老的数据 之间走新号流程
				err = InitUserInfo(&rdata, &resp, uuid, uniqueuuid)


		} else {
			//已经迁移过的数据之间返回
			//已经登陆过了 需要获取玩家数据
			err = GetUserData(uuid, uniqueuuid, &rdata, &resp)
		}

		if err != nil {
			logger.Error("redis failed err=%v", err)
			resp.Message = "服务器错误"
			resp.Code = 1
			break
		}

		resp.Code = 0
		break
	}

	//回包
	respstr, _ := json.Marshal(&resp)
	fmt.Fprint(w, string(respstr))

	logger.Info("###HandlerLogin###rdata:%v", string(respstr))
}

func (u *UserData) HandlePassDay(uuid int, channel string) {
	isdiffday := false
	nowtime := time.Now()
	lasttime := time.Unix(int64(u.LastLoginTime), 0)
	nowdaynum := time.Now().Day()
	lastdaynum := time.Unix(int64(u.LastLoginTime), 0).Day()
	nowtimestamp := time.Date(nowtime.Year(), nowtime.Month(), nowtime.Day(), 0, 0, 0, 0, nowtime.Location())
	lasttimestamp := time.Date(lasttime.Year(), lasttime.Month(), lasttime.Day(), 0, 0, 0, 0, lasttime.Location())

	logger.Info("HandlePassDay lasttime=%v,lasttimestamp=%v", lasttime, lasttimestamp)
	if nowdaynum == lastdaynum {
		//同一天
		if int64(u.LastLoginTime)-time.Now().Unix() > 86400 {
			//已经过了很多天了
			//u.LastLoginTime = int(time.Now().Unix())
			u.ContinueLoginDay = 1
			isdiffday = true
		} else {
			//t同一天 不做处理
		}
	} else {
		//不是同一天了
		isdiffday = true
		if nowtimestamp.Unix() != lasttimestamp.Unix()+86400 {
			//超过一天了
			u.ContinueLoginDay = 1
		} else {
			u.ContinueLoginDay++
		}
		logger.Info("HandlePassDay now=%v,last=%v", nowtimestamp.Unix(), lasttimestamp.Unix())
	}

	if isdiffday {
		//跨天了
		u.SumLoginDay++
		u.WatchAddsTime = WATCH_ADD_DAY_LIMIT
		//todo 重置任务相关的数据
		u.GetFromGuanCnt = 0
		u.GetCashCnt = 0





		//签到数据处理
		u.IsSignToday = 0
		if u.SignSum >= 7 {
			//进入新的一轮
			u.SignSum = 0
			u.SignRound++
		}
	}

	u.LastLoginTime = int(nowtime.Unix())
	uniqueid := strconv.Itoa(uuid) + channel
	SaveUserInfo(u, uniqueid)
}

func GetUserData(uuid int, uniqueuid string, req *UserLoginReq, resp *UserLoginResp) error {
	data, err := GetUserInfo(uniqueuid)
	if err != nil || data == nil {
		resp.Code = 1
		resp.Message = "ERROR_SRV_ERROR"
		return err
	}

	//此处要处理一下跨天逻辑
	data.HandlePassDay(uuid, req.Channel)

	//需要处理下提现表信息 等待提现表
	err = data.ReInitWithDraw(uniqueuid)
	if err != nil {
		logger.Error("GetUserData ReInitWithDraw err=%v", err)
	}

	//此处处理一下从sdk拉取钱包金币数量
	gold, err := GetCoinFromSdk(uuid, req.Gameid, req.Channel)
	if err == nil {
		data.RealGold = gold
	} else {
		logger.Error("GetCoinFromSdk err=%v", err)
	}



	SaveUserInfo(data, uniqueuid)

	resp.Data.Walletgold = data.RealGold
	//resp.Data.Leftredbagcnt = data.WatchAddsTime

	return nil
}