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
|