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