329 lines
13 KiB
Lua
329 lines
13 KiB
Lua
local skynet = require "skynet"
|
|
local oo = require "Class"
|
|
local gameCmd = require "GameCmd"
|
|
local json =require "json"
|
|
local log = require "Log"
|
|
local sqlUrl = require "SqlUrl"
|
|
local errorInfo = require "ErrorInfo"
|
|
local dataType = require "DataType"
|
|
local serverId = tonumber(skynet.getenv "serverId")
|
|
local redisKeyUrl = require "RedisKeyUrl"
|
|
local serverManage = require "ServerManage"
|
|
local DataService = oo.class()
|
|
|
|
DataService.BagOpType_Add = 1 --增加
|
|
DataService.BagOpType_Remove = 2 --减少
|
|
|
|
--初始化
|
|
function DataService:Init()
|
|
|
|
end
|
|
|
|
--查询道具流水
|
|
function DataService:QueryGoodsRecord( c2sData , s2cData )
|
|
--验证登陆接口参数
|
|
if not c2sData.account or not c2sData.startTime or not c2sData.endTime or
|
|
"" == c2sData.account or 0 == c2sData.startTime or 0 == c2sData.endTime then
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|
return s2cData
|
|
end
|
|
|
|
local account = c2sData.account
|
|
local startTime = c2sData.startTime
|
|
local endTime = c2sData.endTime
|
|
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|
if not userDBInfo then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
|
|
local dbIndex = userDBInfo.DBIndex
|
|
local userId = userDBInfo.UserID
|
|
|
|
local data = {}
|
|
data.goodsInfo = {} --物品信息
|
|
|
|
local startDate = skynet.server.common:GetStrDate( startTime )
|
|
startDate = string.gsub(startDate,"-","_") --将日期的"-"替换为"_"
|
|
local tableName = string.format( "data_record_%s" , startDate ) --组装表名
|
|
|
|
local sql = string.format( sqlUrl.queryGoodsRecord , tableName , userId , startTime , endTime )
|
|
local queryData = skynet.server.db:QueryPlayer( dbIndex , sql )
|
|
|
|
--组装消息返回数据
|
|
for k, v in pairs( queryData ) do
|
|
local jsonData = json:decode( v.Data )
|
|
local bagOpType = self.BagOpType_Add
|
|
if 101 == v.Type then
|
|
bagOpType = self.BagOpType_Remove
|
|
end
|
|
|
|
local goodsInfo = { type = jsonData.p1 , id = jsonData.p2 , count = jsonData.p3 , bagOpType = bagOpType , recordTime = jsonData.recordTime }
|
|
table.insert( data.goodsInfo , goodsInfo )
|
|
end
|
|
s2cData.data = data
|
|
end
|
|
|
|
--查询道具位置
|
|
function DataService:QueryGoodsLocation( c2sData , s2cData )
|
|
|
|
if not c2sData.account or not c2sData.goodsType or "" == c2sData.account or dataType.GoodsType_Furniture ~= c2sData.goodsType or 0 == c2sData.goodsId then
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|
return s2cData
|
|
end
|
|
|
|
local account = c2sData.account
|
|
local goodsType = c2sData.goodsType
|
|
local goodsId = c2sData.goodsId
|
|
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|
if not userDBInfo then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
|
|
local dbIndex = userDBInfo.DBIndex
|
|
local userId = userDBInfo.UserID
|
|
|
|
local data = {}
|
|
data.bag = {}
|
|
data.house = {}
|
|
|
|
local sql = string.format( sqlUrl.queryGoodsLocation , userId )
|
|
local queryData = skynet.server.db:QueryPlayer( dbIndex , sql )
|
|
if not queryData and not queryData[1] then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
queryData = queryData[1]
|
|
|
|
local bag = json:decode( queryData.Bag )
|
|
local house = json:decode( queryData.House )
|
|
|
|
--统计背包数据
|
|
local goodsCount = 0
|
|
for k, v in pairs( bag ) do
|
|
if v.type == goodsType and v.id == goodsId then
|
|
data.bag.goodsInfo = { type = v.type , id = v.id , count = v.count }
|
|
break
|
|
end
|
|
end
|
|
|
|
--遍历房屋
|
|
for k1, v1 in pairs( house ) do
|
|
--遍历当前房屋下的方案
|
|
for k2, v2 in pairs( v1.scheme ) do
|
|
local scheme = {}
|
|
scheme.id = v1.id
|
|
scheme.schemeName = v2.name
|
|
scheme.goodsData = {}
|
|
|
|
local isExistData = false
|
|
--遍历当前方案下的物品数据
|
|
for k3, v3 in pairs( v2.furniture ) do
|
|
if v3.type == goodsType and v3.id == goodsId then
|
|
table.insert( scheme.goodsData , { type = goodsType , id = v3.id , xPos = v3.nowPos.x , yPos = v3.nowPos.y } )
|
|
isExistData = true
|
|
end
|
|
end
|
|
|
|
if isExistData then
|
|
table.insert( data.house , scheme )
|
|
end
|
|
end
|
|
end
|
|
|
|
s2cData.data = data
|
|
end
|
|
|
|
--查询玩家信息
|
|
function DataService:QueryUserInfo( c2sData , s2cData )
|
|
if not c2sData.account then
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|
return s2cData
|
|
end
|
|
|
|
local account = c2sData.account
|
|
local isSuc ,userData = self:GetUserDBData( account)
|
|
if not isSuc then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
|
|
local data = {}
|
|
local basicInfo = json:decode( userData.BasicInfo )
|
|
local gameData = json:decode( userData.GameData )
|
|
local redisKey = redisKeyUrl.RouteBlackList
|
|
|
|
data.lastOfflineTime = basicInfo.lastGameTime --最后离线时间
|
|
data.characterName = gameData.nickName --昵称
|
|
data.black = (false == skynet.server.redis:sismember( redisKey , account )) and 0 or 1 --是否为黑名单
|
|
data.level = gameData.level --等级
|
|
data.money = gameData.storePack.rechargeAmount -- 累充金额
|
|
data.flag = 0 --是否内部玩家 0否1是(暂时没有)
|
|
data.loginIp = basicInfo.lastLoginIP --登录IP
|
|
data.vipLevel = 0 --vip等级 暂无
|
|
data.characterId = gameData.partner.id --玩家ID
|
|
data.forbidTalk = 0 --是否禁言 0否1是 暂无
|
|
s2cData.data = data
|
|
end
|
|
|
|
--查询装修周赛奖励
|
|
function DataService:QueryDecoWeek( c2sData , s2cData )
|
|
if not c2sData.account or not c2sData.themeId then
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|
return s2cData
|
|
end
|
|
|
|
local account = c2sData.account
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|
if not userDBInfo then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
local data = {}
|
|
local myParentId = userDBInfo.PartnerId
|
|
local redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , c2sData.themeId )
|
|
if skynet.server.redis:exists( redisKey) then
|
|
local isDesign = skynet.server.redis:zrank( redisKey , myParentId )
|
|
if isDesign then
|
|
--玩家有设计
|
|
local rewardStatus = skynet.server.personal:GetCurDetail( myParentId , "decoWeekRewardStatus" )
|
|
data.rewardStatus = rewardStatus
|
|
else
|
|
s2cData.code = errorInfo.ErrorCode.NoSubmitDecoWeekDesign
|
|
return s2cData
|
|
end
|
|
else
|
|
s2cData.code = errorInfo.ErrorCode.NoSubmitDecoWeekDesign
|
|
return s2cData
|
|
end
|
|
|
|
s2cData.data = data
|
|
end
|
|
|
|
--查询装修周赛奖励
|
|
function DataService:QueryDecoWeekReward( c2sData , s2cData )
|
|
if not c2sData.account then
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|
return s2cData
|
|
end
|
|
|
|
local account = c2sData.account
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|
if not userDBInfo then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
|
|
local partnerId = userDBInfo.PartnerId
|
|
local mulDetail = skynet.server.personal:GetMulDetail( partnerId , "decoWeekLastThemeId" , "decoWeekIsLastSubmitDesign" , "decoWeekRankRange" , "decoWeekRewardId" , "decoWeekRewardStatus" )
|
|
local lastThemeId = mulDetail[1] or 0
|
|
local isLastSubmitDesign = mulDetail[2] or false
|
|
local rankRange = mulDetail[3] or 0
|
|
local rewardId = mulDetail[4] or 0
|
|
local rewardStatus = mulDetail[5] or dataType.DecoWeekRewardStatus_No
|
|
|
|
local data = {}
|
|
data.lastThemeId = lastThemeId --上一期主题ID
|
|
data.isLastSubmitDesign = isLastSubmitDesign --上一期是否提交过设计
|
|
data.rankRange = rankRange --上一期排名范围
|
|
data.rewardId = rewardId --上一期奖励ID
|
|
data.rewardStatus = rewardStatus --上一期奖励状态
|
|
s2cData.data = data
|
|
end
|
|
|
|
--发放装修周赛奖励
|
|
function DataService:SendDecoWeekReward( c2sData , s2cData )
|
|
if not c2sData.account then
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|
return s2cData
|
|
end
|
|
|
|
local account = c2sData.account
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|
if not userDBInfo then
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|
return s2cData
|
|
end
|
|
|
|
local partnerId = userDBInfo.PartnerId
|
|
local mulDetail = skynet.server.personal:GetMulDetail( partnerId , "decoWeekLastThemeId" ,"decoWeekIsLastSubmitDesign" , "decoWeekRankRange" , "decoWeekRewardId" , "decoWeekRewardStatus" )
|
|
local lastThemeId = mulDetail[1] or 0
|
|
local isLastSubmitDesign = mulDetail[2] or false
|
|
local rankRange = mulDetail[3] or 0
|
|
local rewardId = mulDetail[4] or 0
|
|
local rewardStatus = mulDetail[5] or dataType.DecoWeekRewardStatus_No
|
|
|
|
--上一期未提交装修周设计稿
|
|
if not isLastSubmitDesign then
|
|
s2cData.code = errorInfo.ErrorCode.NoSubmitDecoWeekDesign
|
|
return s2cData
|
|
end
|
|
|
|
if dataType.DecoWeekRewardStatus_AddOfflineMsg == rewardStatus then --存在装修周离线消息,就等玩家自己登陆,再发送邮件
|
|
local isExistDecoMsg = false --是否存在装修周离线消息
|
|
local redisKey = string.format( redisKeyUrl.GameServerPersonalOfflineMsgList , partnerId )
|
|
local allOfflineMsg = skynet.server.redis:lrange( redisKey , 0 , -1)
|
|
|
|
for k, jsonData in pairs( allOfflineMsg ) do
|
|
local msgData = json:decode( jsonData )
|
|
if dataType.OfflineMsgType_ActivityDecoRankId == msgData.type then
|
|
isExistDecoMsg = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if isExistDecoMsg then
|
|
s2cData.code = errorInfo.ErrorCode.ExistDecoWeekOfflineMsg
|
|
return s2cData
|
|
end
|
|
|
|
elseif dataType.DecoWeekRewardStatus_SendMail == rewardStatus then --上一期已经发送过邮件
|
|
|
|
s2cData.code = errorInfo.ErrorCode.AlreadySendMail
|
|
return s2cData
|
|
end
|
|
|
|
if 0 ~= rewardId then
|
|
--发送邮件
|
|
local award = skynet.server.playerLand:GetRewardInfoNoPlayer( rewardId )
|
|
local mailText = string.format("感谢您参与本次的设计师周赛,您的排名位于此次参赛设计师的前%d" , math.floor( rankRange * 100)) .."%" .. ",奖励已随邮件发放,期待您的下次参与哦!" --由于有个百分号,只能采取拼接方式
|
|
skynet.server.mail:SendAsyncMailForAccount( account , skynet.server.mail.MailType_Award , "装修周赛奖励" , mailText , award )
|
|
skynet.server.personal:SetDetail( partnerId , "decoWeekRewardStatus" , dataType.DecoWeekRewardStatus_SendMail )
|
|
end
|
|
|
|
local data = {}
|
|
s2cData.data = data
|
|
end
|
|
|
|
--获取用户DB数据
|
|
function DataService:GetUserDBData( account )
|
|
local userDBInfo = skynet.server.redisCenter:GetRedisDBInfo( account )
|
|
if not userDBInfo then
|
|
log.info("数据中心 获取用户DB数据失败1" , account )
|
|
return false,{}
|
|
end
|
|
|
|
local dbIndex = userDBInfo.DBIndex
|
|
local userId = userDBInfo.UserID
|
|
|
|
local data = {}
|
|
data.bag = {}
|
|
data.house = {}
|
|
|
|
local sql = string.format( sqlUrl.queryUserInfo , userId )
|
|
local queryData = skynet.server.db:QueryPlayer( dbIndex , sql )
|
|
if not queryData and not queryData[1] then
|
|
log.info("数据中心 获取用户DB数据失败2" , account , dbIndex , userId )
|
|
return false,{}
|
|
end
|
|
queryData = queryData[1]
|
|
return true, queryData
|
|
end
|
|
|
|
|
|
skynet.server.dataService = DataService
|
|
return DataService
|