229 lines
8.6 KiB
Lua
229 lines
8.6 KiB
Lua
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 |