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