#!/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 += "<center><p>%s</p></center>" % _(u"寻宝分析")
|
|
if startDate:
|
printStr += "%s: %s<br/>" % (_(u"开始日期"), startDate)
|
if endDate:
|
printStr += "%s: %s<br/>" % (_(u"结束日期"), endDate)
|
|
moneyNameDict = CommFunc.getCfgKeyNameDict("money", argvDict)
|
for TreasureType, accIDDict in drInfoDict.items():
|
printStr += "--- %s: 【%s】<br/>" % (_(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<br/>" \
|
% (_(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 += "<br/>"
|
|
if not drInfoDict:
|
printStr += "%s<br/>" % _(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()
|