local skynet = require "skynet" local oo = require "Class" local log = require "Log" local redisKeyUrl = require "RedisKeyUrl" local sqlUrl = require "SqlUrl" local json =require "json" local errorInfo = require "ErrorInfo" local dataType = require "DataType" local RedeemManage = oo.class() RedeemManage.Type_Test = 1 --春节兑换码 RedeemManage.Status_NoBonus = 1 --未发货 RedeemManage.Status_StartBonus = 2 --开始发货 RedeemManage.Status_AlreadyBonus = 3 --已发货 RedeemManage.Status_OutDate = 4 --兑换码过期 RedeemManage.OpType_Add = 1 --新建 RedeemManage.OpType_Modify = 2 --修改 RedeemManage.OpType_Delete = 3 --删除 function RedeemManage:Init() self.redeemList = {} --兑换码列表 self:LoadDB() end function RedeemManage:OnNewDay() --跨天 end --每5秒调一次 function RedeemManage:On5SecTimer() self:Refresh() end --从DB中载入数据 function RedeemManage:LoadDB() --加载兑换码列表 local sql = string.format(sqlUrl.selectInfoFromRedeemList , self.Status_StartBonus ) local queryData = skynet.server.db:Query( "game" , sql ) for k, v in pairs(queryData) do self:NewRedeemListRecord( v.Code , v.Status , v.BonusPlayerCount , json:decode(v.Data)) log.info(string.format("加载兑换码信息 兑换码Code %s " , v.Code )) end end --保存数据到DB function RedeemManage:SaveDB() local sql = nil local queryData = nil --保存兑换码列表 for k, v in pairs(self.redeemList) do sql = string.format(sqlUrl.updateDataToRedeemList , json:encode(v.data) , v.redeemCode ) queryData = skynet.server.db:Query( "game" , sql ) if 1 ~= queryData.affected_rows then log.info("修改兑换码数据失败,不存在该Code" , v.redeemCode ) else log.info("成功保存兑换码列表" , v.redeemCode ) end end end --查询兑换码 function RedeemManage:QueryRedeemList( c2sData , s2cData ) end --新增兑换码 function RedeemManage:Add( c2sData , s2cData ) --获取兑换码ID local redeemCode = skynet.server.common:RandRedeemCode() local sql = string.format(sqlUrl.insertInfoToRedeemList , redeemCode , self.Status_NoBonus , json:encode(c2sData.data)) local queryData = skynet.server.db:Query( "game" , sql ) if 1 ~= queryData.affected_rows then log.info("新增兑换码列表失败" , redeemCode ) s2cData.code = errorInfo.ErrorCode.NewRedeemFailed return false end self:NewRedeemListRecord( redeemCode , self.Status_NoBonus , 0 , c2sData.data ) s2cData.redeemCode = redeemCode log.info(string.format("新增兑换码信息 兑换码Code %s " , redeemCode )) return true end --修改兑换码 function RedeemManage:Modify( c2sData , s2cData ) local redeemCode = c2sData.redeemCode local data = json:encode(c2sData.data) local sql = string.format(sqlUrl.updateDataToRedeemList , data , redeemCode ) local queryData = skynet.server.db:Query( "game" , sql ) if 1 ~= queryData.affected_rows then log.info("修改兑换码数据失败,不存在该Code" , redeemCode ) s2cData.code = errorInfo.ErrorCode.NoRedeemID return false end self.redeemList[ redeemCode ].data = json:decode(data) s2cData.redeemCode = redeemCode log.info(string.format("成功修改兑换码信息 Code %s" , redeemCode )) end --删除兑换码 function RedeemManage:Delete( c2sData , s2cData ) local redeemCode = c2sData.redeemCode local sql = string.format(sqlUrl.deleteInfoFromMailList , redeemCode ) local queryData = skynet.server.db:Query( "game" , sql ) if 1 ~= queryData.affected_rows then log.info("删除兑换码数据失败,不存在该Code" , redeemCode ) s2cData.code = errorInfo.ErrorCode.NoRedeemID return false end if self.redeemList[ redeemCode ] then self.redeemList[ redeemCode ].data = nil self.redeemList[ redeemCode ] = nil end s2cData.redeemCode = redeemCode log.info(string.format("成功删除兑换码信息 Code %s" , redeemCode )) end --刷新 function RedeemManage:Refresh() local sql = nil local c2sData = {} local startTime,endTime = nil ,nil for k, v in pairs(self.redeemList) do --将2023-01-01 00:00:00 转化为时间戳 startTime = skynet.server.common:GetTime( v.data.startTime ) endTime = skynet.server.common:GetTime( v.data.endTime ) if self.Status_NoBonus == v.status and skynet.GetTime() >= startTime and skynet.GetTime() <= endTime then --兑换码列表中有兑换码可以生效,并将列表中的数据推向各游戏服 self:UpdateStatus( v.redeemCode , self.Status_StartBonus , 0 ) elseif self.Status_AlreadyBonus == v.status then --兑换码列表中有兑换码已经过期,并通知所有游戏服删除该兑换码 elseif skynet.GetTime() >= endTime then --兑换码列表中有兑换码已经发放完,并通知所有游戏服删除该兑换码 self:UpdateStatus( v.redeemCode , self.Status_OutDate , v.bonusPlayerCount ) end end --对于已经发放结束和过期的兑换码删除 for k, v in pairs(self.redeemList) do if self.Status_AlreadyBonus == v.status or self.Status_OutDate == v.status then self.redeemList[ k ].data= nil self.redeemList[ k ]= nil end end end --新增邮件记录 function RedeemManage:NewRedeemListRecord( redeemCode , status , bonusPlayerCount, record ) if not self.redeemList[ redeemCode ] then self.redeemList[ redeemCode ] = {} end self.redeemList[ redeemCode ].redeemCode = redeemCode self.redeemList[ redeemCode ].status = status self.redeemList[ redeemCode ].bonusPlayerCount = bonusPlayerCount self.redeemList[ redeemCode ].data = record end --获得奖励 function RedeemManage:GetBonus( c2sData , s2cData ) local redeemCode = c2sData.redeemCode local userId = c2sData.userId local appVersion = c2sData.appVersion local channel = c2sData.channel --参数检查 if not redeemCode or not userId or not appVersion or not channel then s2cData.code = errorInfo.ErrorCode.ErrRequestParam return end if not self.redeemList[ redeemCode ] then s2cData.code = errorInfo.ErrorCode.NoRedeemID end local redeemData = self.redeemList[ redeemCode ] if self.Status_StartBonus == redeemData.status then --玩家的APP版本是否符合 --[[if appVersion < redeemData.data.appVersion then s2cData.code = errorInfo.ErrorCode.VersionTooLow return end]] --玩家的渠道是否符合 if channel ~= redeemData.data.channel and "all" ~= redeemData.data.channel then s2cData.code = errorInfo.ErrorCode.ErrorChannel return end if redeemData.bonusPlayerCount <= redeemData.data.redeemCount then --只有发奖状态并且小于领取人数才能去领取 self.redeemList[ redeemCode ].bonusPlayerCount = self.redeemList[ redeemCode ].bonusPlayerCount + 1 s2cData.redeemCode = redeemCode s2cData.bonus = redeemData.data.bonus local lastPlayerCount = self.redeemList[ redeemCode ].bonusPlayerCount if lastPlayerCount == redeemData.data.redeemCount then self:UpdateStatus(redeemCode , self.Status_AlreadyBonus , lastPlayerCount) end else s2cData.code = errorInfo.ErrorCode.EnoughPlayer end else s2cData.code = errorInfo.ErrorCode.NoStartBonus end end --更新状态 function RedeemManage:UpdateStatus( redeemCode , status , bonusPlayerCount ) --更新状态到DB local sql = string.format(sqlUrl.updateStatusToRedeemList , status , bonusPlayerCount , redeemCode ) local queryData = skynet.server.db:Query( "game" , sql ) if 1 ~= queryData.affected_rows then log.info(string.format("兑换 Code %s 更新状态 %d 失败" , redeemCode , status )) return false else self.redeemList[ redeemCode ].status = status log.info(string.format("兑换 Code %s 更新状态 %d 成功" , redeemCode , status )) return true end end skynet.server.redeemManage = RedeemManage return RedeemManage