#!/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()