| #!/usr/bin/python | 
| # -*- coding: utf-8 -*- | 
| # @todo: 玩家货币查询 | 
|   | 
| import CommFunc | 
| import ConfigParser | 
| import DBOperate | 
| import mylog | 
| import logging | 
|   | 
| cfg = ConfigParser.ConfigParser() | 
| cfg.read("../../InterfaceConfig.php") | 
| ServerPath = cfg.get("ServerInfo", "ServerPath") | 
|   | 
| def queryPlayerMoneyInfo(argvDict): | 
|     ## 查询玩家货币信息 | 
|      | 
|     startDate = argvDict.get("startDate", "") | 
|     endDate = argvDict.get("endDate", "") | 
|      | 
|     moneyType = CommFunc.toInt(argvDict.get("moneyType")) | 
|     recordType = argvDict.get("recordType") | 
|     if not moneyType or not recordType: | 
|         print _(u"需指定查询货币类型及选项") | 
|         return | 
|      | 
|     # 查询中心备份的 | 
|     if CommFunc.isQueryCenterbak(argvDict): | 
|         queryPlayerMoneyInfo_CenterBak(startDate, endDate, argvDict, moneyType, recordType) | 
|         return | 
|      | 
|     playerFind = argvDict.get("playerFind", "") | 
|     if not playerFind: | 
|         print _(u"需要指定要查询的玩家") | 
|         return | 
|      | 
|     queryType = argvDict.get("queryType", "") | 
|      | 
|     dboper = DBOperate.DBOper(ServerPath) | 
|     if queryType == "playerName": | 
|         findDBRet = dboper.findPlayerInfoByName([playerFind]) | 
|     else: | 
|         findDBRet = dboper.findPlayerInfoByAccID([playerFind]) | 
|     dboper.close() | 
|     if findDBRet and findDBRet.count(): | 
|         dbPlayer = findDBRet[0] | 
|         playerID = CommFunc.encode(dbPlayer["PlayerID"]) | 
|         queryAccID = CommFunc.encode(dbPlayer["AccID"]) | 
|         playerName = CommFunc.encode(dbPlayer["PlayerName"]) | 
|     elif queryType == "accID": | 
|         queryAccID = playerFind | 
|         playerID = 0 | 
|         playerName = "" | 
|     else: | 
|         print "%s!<br/>%s<br/>" % (_(u"找不到该玩家"), playerFind) | 
|         return | 
|      | 
|     drList = [] | 
|      | 
|     needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc,  | 
|                                                    parseLineFunc, drList, queryAccID, moneyType, recordType) | 
|     if needQueryCenterbak: | 
|         argvDict["queryAccID"] = queryAccID | 
|         bakDataList = CommFunc.queryBackupCenterDR(cfg, argvDict) | 
|         if bakDataList == None: | 
|             return | 
|         drList = bakDataList + drList | 
|          | 
|     itemNameDict = CommFunc.getCfgKeyNameDict("item", argvDict) | 
|     useNameDict = CommFunc.getCfgKeyNameDict("money_enent_use", argvDict) | 
|     giveNameDict = CommFunc.getCfgKeyNameDict("money_enent_give", argvDict) | 
|     giveItemNameDict = CommFunc.getCfgKeyNameDict("item_enent_give", argvDict) | 
|      | 
|     needMoney2 = False | 
|     totalGive, totalUse = 0, 0 | 
|     bossTypeNameDict = {0:_(u"世界Boss"), 1:_(u"Boss之家"), 2:_(u"跨服Boss")} | 
|     prayTypeNameDict = {13:_(u"金币"), 14:_(u"经验")} | 
|     drList = sorted(drList, key=lambda dr:(dr["time"], dr['PlayerMoneyCount']), reverse=False) # 按time升序排 | 
|     for drDict in drList: | 
|         if not needMoney2 and "PlayerMoneyCount2" in drDict: | 
|             needMoney2 = True | 
|         MoneyCount = drDict['MoneyCount'] | 
|         eventName = drDict['eventName'] | 
|         reason_name_son = drDict.get("reason_name_son") | 
|         if reason_name_son: | 
|             if eventName in ["UseItem", "BuyStoreItem", "TransformItem"]: | 
|                 itemID = reason_name_son | 
|                 itemName = itemNameDict.get(str(itemID), "") | 
|                 if itemName: | 
|                     drDict["reason_name_son"] = "%s(%s)" % (itemName, itemID) | 
|                      | 
|                 # 物品转换的,补上物品来源 | 
|                 if eventName == "TransformItem" and "GiveItemEvent" in drDict: | 
|                     giveItemEventName = drDict["GiveItemEvent"] | 
|                     giveItemNameCh = giveItemNameDict.get(giveItemEventName, giveItemEventName) | 
|                     drDict["reason_name_son"] = "%s %s:%s" % (drDict["reason_name_son"], _(u"物品来源"), str(giveItemNameCh)) | 
|                  | 
|                 # 抵扣 | 
|                 if drDict.get("CouponMoney", 0) > 0: | 
|                     drDict["reason_name_son"] = "%s %s:%s %s:%s" % (drDict["reason_name_son"], _(u"原价"), drDict.get("ItemPrice", 0), _(u"抵扣"), drDict["CouponMoney"]) | 
|   | 
|             elif eventName == "BuyKillBossCnt": | 
|                 drDict["reason_name_son"] = bossTypeNameDict.get(reason_name_son, reason_name_son) | 
|                  | 
|             elif eventName == "Pray": | 
|                 drDict["reason_name_son"] = prayTypeNameDict.get(reason_name_son, reason_name_son) | 
|                  | 
|         eventNameCh = "" | 
|         if "-" in MoneyCount: | 
|             eventNameCh = useNameDict.get(eventName) | 
|             totalUse += CommFunc.toInt(MoneyCount.replace("-", "").replace(" ", "")) | 
|              | 
|         elif "+" in MoneyCount: | 
|             eventNameCh = giveNameDict.get(eventName) | 
|             totalGive += CommFunc.toInt(MoneyCount.replace("+", "").replace(" ", "")) | 
|         if eventNameCh: | 
|             drDict['eventName'] = "%s %s" % (eventNameCh, CommFunc.encode(eventName)) | 
|              | 
|     if not playerName and drList: | 
|         drDict = drList[-1] | 
|         playerID = drDict.get("PlayerID", playerID) | 
|         playerName = CommFunc.encodePych(drDict.get("PlayerName", "")) | 
|          | 
|     moneyNameDict = CommFunc.getCfgKeyNameDict("money", argvDict) | 
|     moneyName = moneyNameDict.get(str(moneyType), str(moneyType)) | 
|     printStr = "<center><p>%s%s</p></center>" % (moneyName, _(u"记录")) | 
|     printStr += "%s: %s<br/>" % (_(u"玩家ID"), playerID) | 
|     printStr += "%s: %s<br/>" % (_(u"玩家账号"), queryAccID) | 
|     printStr += "%s: %s<br/>" % (_(u"玩家名称"), playerName) | 
|      | 
|     if startDate: | 
|         printStr += "%s: %s<br/>" % (_(u"开始日期"), startDate) | 
|     if endDate: | 
|         printStr += "%s: %s<br/>" % (_(u"结束日期"), endDate) | 
|   | 
|     if totalGive: | 
|         printStr += "%s: %s<br/>" % (_(u"累计获得"), totalGive) | 
|     if totalUse: | 
|         printStr += "%s: %s<br/>" % (_(u"累计消耗"), totalUse) | 
|      | 
|     maxShowCount = 5000 | 
|     drCount = len(drList) | 
|     if drCount > maxShowCount: | 
|         logging.warn("drList len is %s" % drCount) | 
|         drList = drList[:maxShowCount] | 
|         printStr += "<font color='red'><b>%s : %s<b></font><br/>" % (_(u"满足条件总条数过多,请调整查询条件!当前仅展示部分,实际总条数为"), drCount) | 
|          | 
|     # 表格输出 | 
|     tdList = ["MoneyCount", "PlayerMoneyCount", "eventName", "reason_name_son", "time"] | 
|     styleInfo = {"MoneyCount":{"align":"right", "title":_(u"变化值")}, | 
|                 "PlayerMoneyCount":{"align":"right", "title":_(u"剩余")}, | 
|                 "eventName":{"align":"left"}, | 
|                 } | 
|     if needMoney2: | 
|         tdList = ["MoneyCount", "PlayerMoneyCount", "PlayerMoneyCount2", "eventName", "reason_name_son", "time"] | 
|         money2TitleDict = {99:"时效"} | 
|         money2Title = _(u"剩余") + money2TitleDict.get(moneyType, "2") | 
|         styleInfo.update({ | 
|             "PlayerMoneyCount2":{"align":"right", "title":money2Title}, | 
|         }) | 
|     printStr += CommFunc.editTableHtml(drList, tdList, _(u"编号"), styleInfo=styleInfo) | 
|      | 
|     # 只会返回最后一个print的内容 | 
|     print printStr | 
|     return | 
|   | 
| def queryPlayerMoneyInfo_CenterBak(startDate, endDate, argvDict, moneyType, recordType): | 
|     drList = [] | 
|     queryAccID = argvDict.get("queryAccID", "") | 
|      | 
|     if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc,  | 
|                                        drList, queryAccID, moneyType, recordType): | 
|         return | 
|      | 
|     return CommFunc.queryBackupCenterOK(drList) | 
|   | 
| def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): | 
|     ''' 检查流向是否需要处理 | 
|     @param drFileName: 流向文件名  xxx_日期.txt | 
|     @param *parseArgs: 自定义参数 | 
|     @return: isNeed, checkNeedParseRetInfo | 
|     ''' | 
|      | 
|     _, _, moneyType, recordType = parseArgs | 
|      | 
|     queryUse = recordType in ["All", "Use"] | 
|     queryGive = recordType in ["All", "Give"] | 
|      | 
|     changeType = "" | 
|      | 
|     # 仙玉 | 
|     if moneyType == 1: | 
|         if queryGive: | 
|             if drFileName.startswith("GiveGold_"): | 
|                 changeType = "+" | 
|         if queryUse: | 
|             if drFileName.startswith("UseGold_"): | 
|                 changeType = "-" | 
|                  | 
|     # 绑玉 | 
|     elif moneyType == 2: | 
|         if queryGive: | 
|             if drFileName.startswith("GiveGoldPaper_"): | 
|                 changeType = "+" | 
|         if queryUse: | 
|             if drFileName.startswith("UseGoldPaper_"): | 
|                 changeType = "-" | 
|                  | 
|     # 铜钱 | 
|     elif moneyType == 3: | 
|         if queryGive: | 
|             if drFileName.startswith("GiveSilver_"): | 
|                 changeType = "+" | 
|         if queryUse: | 
|             if drFileName.startswith("UseSilver_"): | 
|                 changeType = "-" | 
|                  | 
|     # 神玉 | 
|     elif moneyType == 4: | 
|         if queryGive: | 
|             if drFileName.startswith("GiveSilverPaper_"): | 
|                 changeType = "+" | 
|         if queryUse: | 
|             if drFileName.startswith("UseSilverPaper_"): | 
|                 changeType = "-" | 
|                  | 
|     # 代币 | 
|     elif moneyType == 99: | 
|         if queryGive: | 
|             if drFileName.startswith("GivePayCoin_"): | 
|                 changeType = "+" | 
|         if queryUse: | 
|             if drFileName.startswith("UsePayCoin_"): | 
|                 changeType = "-" | 
|                  | 
|     # 其他 | 
|     else: | 
|         if queryGive: | 
|             if drFileName.startswith("GiveCurrency_%s" % moneyType): | 
|                 changeType = "+" | 
|         if queryUse: | 
|             if drFileName.startswith("UseCurrency_%s" % moneyType): | 
|                 changeType = "-" | 
|              | 
|     if not changeType: | 
|         return False, None | 
|     return True, changeType | 
|   | 
| def parseLineFunc(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv): | 
|     ''' 解析流向行内容 | 
|     @param drName: 流向名 | 
|     @param dateStr: 对应日期字符串 | 
|     @param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容 | 
|     @param line: 本行内容 | 
|     @param *parseArgs: 自定义参数 | 
|     ''' | 
|      | 
|     changeType = checkNeedParseRetInfo | 
|     drList, queryAccID, moneyType, _ = parseArgs | 
|      | 
|     if queryAccID not in line: | 
|         # 直接验证账号字符,省去eval消耗 | 
|         return | 
|     drDict = eval(line) | 
|     accID = drDict["AccID"] | 
|     if accID != queryAccID: | 
|         return | 
|      | 
|     if moneyType != drDict["MoneyType"]: | 
|         return | 
|      | 
|     drDict["MoneyCount"] = "%s %s" % (changeType, drDict["MoneyCount"]) | 
|     drList.append(drDict) | 
|     return | 
|   | 
| def main(): | 
|     CommFunc.setdefaultencoding() | 
|     argvDict = CommFunc.parse_args() | 
|     mylog.InitMyLog(argvDict.get("eventType", "")) | 
|     CommFunc.gettextInstall(argvDict.get("lang", "")) | 
|     queryPlayerMoneyInfo(argvDict) | 
|     return | 
|   | 
| if __name__ == "__main__": | 
|     try: | 
|         main() | 
|     except: | 
|         CommFunc.printExceptionError() |