| #!/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 queryPlayerItemInfo(argvDict): | 
|     ## 查询玩家物品信息 | 
|      | 
|     startDate = argvDict.get("startDate", "") | 
|     endDate = argvDict.get("endDate", "") | 
|      | 
|     recordType = argvDict.get("recordType") | 
|     if not recordType: | 
|         print _(u"需指定查询选项") | 
|         return | 
|      | 
|     itemIDList = [] | 
|     if argvDict.get("itemIDInfo", "") != "": | 
|         itemIDList = [CommFunc.toInt(itemIDStr) for itemIDStr in argvDict.get("itemIDInfo", "").split(",")] | 
|          | 
|     # 查询中心备份的 | 
|     if CommFunc.isQueryCenterbak(argvDict): | 
|         queryPlayerItemInfo_CenterBak(startDate, endDate, argvDict, recordType, itemIDList) | 
|         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, recordType, itemIDList) | 
|      | 
|     if needQueryCenterbak: | 
|         argvDict["queryAccID"] = queryAccID | 
|         bakDataList = CommFunc.queryBackupCenterDR(cfg, argvDict) | 
|         if bakDataList == None: | 
|             return | 
|         drList = bakDataList + drList | 
|          | 
|     packTypeNameDict = CommFunc.getCfgKeyNameDict("packType", argvDict) | 
|     itemNameDict = CommFunc.getCfgKeyNameDict("item", argvDict) | 
|     useNameDict = CommFunc.getCfgKeyNameDict("item_enent_use", argvDict) | 
|     giveNameDict = CommFunc.getCfgKeyNameDict("item_enent_give", argvDict) | 
|     moneyNameDict = CommFunc.getCfgKeyNameDict("money", argvDict) | 
|   | 
|     drList = sorted(drList, key=lambda dr:dr["time"], reverse=False) # 按time升序排 | 
|     for drDict in drList: | 
|         ItemID = drDict['ItemID'] | 
|         auctionItemStr = "[%s]" % _(u"拍品") if drDict.get('IsBind') else "" | 
|         itemName = itemNameDict.get(str(ItemID), "") | 
|         if itemName: | 
|             itemName = "%s %s(%s)" % (auctionItemStr, itemName, ItemID) | 
|         else: | 
|             itemName = "<font color='red'>%s %s(%s)</font>" % (auctionItemStr, _(u"未知物品"), ItemID) | 
|         drDict['ItemName'] = itemName | 
|          | 
|         eventNameCh = "" | 
|         eventName = drDict['eventName'] | 
|         ItemCount = drDict['ItemCount'] | 
|         if "-" in ItemCount: | 
|             eventNameCh = useNameDict.get(eventName) | 
|         elif "+" in ItemCount: | 
|             eventNameCh = giveNameDict.get(eventName) | 
|         if eventNameCh: | 
|             drDict['eventName'] = "%s %s" % (eventNameCh, CommFunc.encode(eventName)) | 
|              | 
|         if drDict.get("PayPrice", 0) > 0 or drDict.get("CouponMoney", 0) > 0: | 
|             moneyType = drDict.get("MoneyType", 0) | 
|             moneyName = moneyNameDict.get(str(moneyType), str(moneyType)) | 
|             payMoneyInfo = "%s %s:%s" % (_(u"支付"), moneyName, drDict.get("PayPrice", 0)) | 
|             if drDict.get("CouponMoney", 0) > 0: | 
|                 payMoneyInfo = "%s %s:%s" % (payMoneyInfo,  _(u"抵扣"), drDict.get("CouponMoney", 0)) | 
|             drDict['eventName'] = "%s %s" % (drDict['eventName'], payMoneyInfo) | 
|   | 
|         reason_name_son = drDict.get("reason_name_son") | 
|         if reason_name_son: | 
|             itemID = reason_name_son | 
|             itemName = itemNameDict.get(str(itemID), "") | 
|             if itemName: | 
|                 drDict['eventName'] = "%s %s(%s)" % (drDict['eventName'], itemName, itemID) | 
|             else: | 
|                 drDict['eventName'] = "%s %s" % (drDict['eventName'], reason_name_son) | 
|                  | 
|         packType = drDict.get('PackType', "") | 
|         drDict['PackName'] = packTypeNameDict.get(str(packType), packType) | 
|          | 
|     if not playerName and drList: | 
|         drDict = drList[-1] | 
|         playerID = drDict.get("PlayerID", playerID) | 
|         #playerName = CommFunc.encodePych(drDict.get("PlayerName", "")) | 
|          | 
|     printStr = "<center><p>%s</p></center>" % _(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 itemIDList: | 
|         printStr += "%s: %s<br/>" % (_(u"指定物品ID"), itemIDList) | 
|          | 
|     # 表格输出 | 
|     printStr += CommFunc.editTableHtml(drList, ["ItemName", "ItemCount", "AfterCount", "PackName", "eventName", "ItemGUID", "time"], _(u"编号"), | 
|                                        styleInfo={"ItemName":{"align":"right", "title":_(u"物品名")}, | 
|                                                   "ItemCount":{"align":"right", "title":_(u"变化个数")}, | 
|                                                   "AfterCount":{"align":"right", "title":_(u"剩余个数")}, | 
|                                                   "PackName":{"title":_(u"所属背包")}, | 
|                                                   "eventName":{"align":"left"}, | 
|                                                   }) | 
|      | 
|     # 只会返回最后一个print的内容 | 
|     print printStr | 
|     return | 
|   | 
| def queryPlayerItemInfo_CenterBak(startDate, endDate, argvDict, recordType, itemIDList): | 
|     drList = [] | 
|     queryAccID = argvDict.get("queryAccID", "") | 
|      | 
|     if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc,  | 
|                                        parseLineFunc, drList, queryAccID, recordType, itemIDList): | 
|         return | 
|      | 
|     return CommFunc.queryBackupCenterOK(drList) | 
|   | 
| def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): | 
|     ''' 检查流向是否需要处理 | 
|     @param drFileName: 流向文件名  xxx_日期.txt | 
|     @param *parseArgs: 自定义参数 | 
|     @return: isNeed, checkNeedParseRetInfo | 
|     ''' | 
|      | 
|     _, _, recordType, _ = parseArgs | 
|      | 
|     queryUse = recordType in ["All", "Use"] | 
|     queryGive = recordType in ["All", "Give"] | 
|      | 
|     changeType = "" | 
|     if queryGive: | 
|         if drFileName.startswith("GivePlayerItem_"): | 
|             changeType = "+" | 
|              | 
|     if queryUse: | 
|         if drFileName.startswith("DeleteItem_"): | 
|             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, _, itemIDList = parseArgs | 
|      | 
|     if queryAccID not in line: | 
|         # 直接验证账号字符,省去eval消耗 | 
|         return | 
|      | 
|     if itemIDList: | 
|         isIn = False | 
|         for itemID in itemIDList: | 
|             if str(itemID) in line: | 
|                 isIn = True | 
|                 break | 
|         if not isIn: | 
|             return | 
|          | 
|     drDict = eval(line) | 
|     accID = drDict["AccID"] | 
|     if accID != queryAccID: | 
|         return | 
|      | 
|     if itemIDList and drDict["ItemID"] not in itemIDList: | 
|         return | 
|      | 
|     eventName = drName[drName.index("_") + 1:] | 
|     drDict["ItemCount"] = "%s %s" % (changeType, drDict["ItemCount"]) | 
|     drDict["eventName"] = CommFunc.encode(eventName) | 
|     drList.append(drDict) | 
|     return | 
|   | 
| def main(): | 
|     CommFunc.setdefaultencoding() | 
|     argvDict = CommFunc.parse_args() | 
|     mylog.InitMyLog(argvDict.get("eventType", "")) | 
|     CommFunc.gettextInstall(argvDict.get("lang", "")) | 
|     queryPlayerItemInfo(argvDict) | 
|     return | 
|   | 
| if __name__ == "__main__": | 
|     try: | 
|         main() | 
|     except: | 
|         CommFunc.printExceptionError() |