HomeServer/Server/AllServer/MultiServer/DataService.lua

329 lines
13 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
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