#!/usr/bin/python
# -*- coding: utf-8 -*-
# @todo: 寻宝分析
import CommFunc
import ConfigParser
import operator
import mylog
import logging
cfg = ConfigParser.ConfigParser()
cfg.read("../../InterfaceConfig.php")
ServerPath = cfg.get("ServerInfo", "ServerPath")
class ValueObj():
def __init__(self):
return
def queryBuyStoreItem(argvDict):
startDate = argvDict.get("startDate", "")
endDate = argvDict.get("endDate", "")
moneyTypeList = [1, 2] # 寻宝可能消耗的货币类型
# 查询中心备份的
if CommFunc.isQueryCenterbak(argvDict):
queryPlayerItemInfo_CenterBak(startDate, endDate, argvDict, moneyTypeList)
return
drList = []
needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc,
parseLineFunc, drList, moneyTypeList)
if needQueryCenterbak:
bakDataList = CommFunc.queryBackupCenterDR(cfg, argvDict)
if bakDataList == None:
return
# 合并数据
drList = bakDataList + drList
drInfoDict = {} # 组合展示数据 {TreasureType:{AccID:ValueObj, ...}, ...}
treasureInfoDict = {}
for drDict in drList:
AccID = drDict["AccID"]
PlayerName = drDict["PlayerName"]
MoneyType = drDict["MoneyType"]
MoneyCount = drDict["MoneyCount"]
TreasureType = drDict["TreasureType"]
TreasureIndex = drDict["TreasureIndex"]
TreasureCount = 1 if TreasureIndex == 0 else 10
# 汇总
if TreasureType not in treasureInfoDict:
treasureInfoDict[TreasureType] = [MoneyType, 0, 0]
totalCount = treasureInfoDict[TreasureType][1] + TreasureCount
totalMoneyCount = treasureInfoDict[TreasureType][2] + MoneyCount
treasureInfoDict[TreasureType] = [MoneyType, totalCount, totalMoneyCount]
# 按账号
if TreasureType not in drInfoDict:
drInfoDict[TreasureType] = {}
accIDDict = drInfoDict[TreasureType]
if AccID not in accIDDict:
accIDDict[AccID] = ValueObj()
vObj = accIDDict[AccID]
setattr(vObj, "AccID", AccID)
setattr(vObj, "PlayerName", PlayerName)
#setattr(vObj, "MoneyType", MoneyType)
setattr(vObj, "MoneyCount", getattr(vObj, "MoneyCount", 0) + MoneyCount)
#setattr(vObj, "TreasureType", TreasureType)
setattr(vObj, "TreasureCount", getattr(vObj, "TreasureCount", 0) + TreasureCount)
#drList = sorted(drList, key=lambda dr:dr["time"], reverse=False) # 按time升序排
spaceStr = " ";
printStr = ""
#printStr += "
%s
" % _(u"寻宝分析")
if startDate:
printStr += "%s: %s
" % (_(u"开始日期"), startDate)
if endDate:
printStr += "%s: %s
" % (_(u"结束日期"), endDate)
moneyNameDict = CommFunc.getCfgKeyNameDict("money", argvDict)
for TreasureType, accIDDict in drInfoDict.items():
printStr += "--- %s: 【%s】
" % (_(u"寻宝类型"), TreasureType)
sortList = accIDDict.values()
sortList.sort(key=operator.attrgetter("TreasureCount"), reverse=True) # 按寻宝总次数倒序排
# 表格输出
MoneyType, totalCount, totalMoneyCount = treasureInfoDict[TreasureType]
moneyName = moneyNameDict.get(str(MoneyType), str(MoneyType))
singleMoneyCount = int(totalMoneyCount / float(totalCount)) if totalCount > 0 else 0
printStr += "%s: %s%s %s: %s%s %s: %s%s %s: %s
" \
% (_(u"货币类型"), moneyName, spaceStr * 2,
_(u"总寻宝次数"), totalCount, spaceStr * 2,
_(u"总货币消耗"), totalMoneyCount, spaceStr * 2,
_(u"单次消耗"), singleMoneyCount)
printStr += CommFunc.editTableHtml(sortList, ["AccID", "PlayerName", "MoneyCount", "TreasureCount"], _(u"编号"),
styleInfo={"AccID":{"align":"left"},
"MoneyCount":{"title":_(u"货币总数")},
"TreasureCount":{"title":_(u"总寻宝次数")},
}, printCount=False)
printStr += "
"
if not drInfoDict:
printStr += "%s
" % _(u"无记录")
# 只会返回最后一个print的内容
print printStr
return
def queryPlayerItemInfo_CenterBak(startDate, endDate, argvDict, moneyTypeList):
drList = []
if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc,
parseLineFunc, drList, moneyTypeList):
return
return CommFunc.queryBackupCenterOK(drList)
def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv):
''' 检查流向是否需要处理
@param drFileName: 流向文件名 xxx_日期.txt
@param *parseArgs: 自定义参数
@return: isNeed, checkNeedParseRetInfo
'''
moneyTypeList = parseArgs[1]
for moneyType in moneyTypeList:
if moneyType == 1 and drFileName.startswith("UseGold_"):
return True, None
elif moneyType == 2 and drFileName.startswith("UseGoldPaper_"):
return True, None
elif moneyType == 3 and drFileName.startswith("UseSilver_"):
return True, None
elif drFileName.startswith("UseCurrency_%s_" % moneyType):
return True, None
return False, None
def parseLineFunc(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv):
''' 解析流向行内容
@param drName: 流向名
@param dateStr: 对应日期字符串
@param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容
@param line: 本行内容
@param *parseArgs: 自定义参数
'''
if "Treasure" not in line or "TreasureType" not in line:
return
drList, _ = parseArgs
drDict = eval(line)
if drDict["eventName"] != "Treasure":
return
drList.append(drDict)
return
def main():
CommFunc.setdefaultencoding()
argvDict = CommFunc.parse_args()
mylog.InitMyLog(argvDict.get("eventType", ""))
CommFunc.gettextInstall(argvDict.get("lang", ""))
queryBuyStoreItem(argvDict)
return
if __name__ == "__main__":
try:
main()
except:
CommFunc.printExceptionError()