#!/usr/bin/python # -*- coding: utf-8 -*- # @todo: 商城物品购买分析 import CommFunc import ConfigParser import mylog import logging cfg = ConfigParser.ConfigParser() cfg.read("../../InterfaceConfig.php") ServerPath = cfg.get("ServerInfo", "ServerPath") Def_NeedKeyList = ["MoneyCount", "ShopType", "ShopItemIndex", "ClientBuyCount", "TotalItemList", "time"] def queryBuyStoreItem(argvDict): startDate = argvDict.get("startDate", "") endDate = argvDict.get("endDate", "") moneyType = CommFunc.toInt(argvDict.get("moneyType"), 1) # 货币类型 shopTypeList = [CommFunc.toInt(shopTypeStr) for shopTypeStr in argvDict.get("shopTypeInfo", "").split(",")] timeGroupType = CommFunc.toInt(argvDict.get("timeGroupType"), 1) # 查询中心备份的 if CommFunc.isQueryCenterbak(argvDict): queryPlayerItemInfo_CenterBak(startDate, endDate, argvDict, moneyType, shopTypeList) return drList = [] needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, drList, moneyType, shopTypeList) if needQueryCenterbak: bakDataList = CommFunc.queryBackupCenterDR(cfg, argvDict) if bakDataList == None: return # 合并数据 drList = bakDataList + drList drInfoDict = {} # 组合展示数据 {shopType:{dateKey:{shopItemIndex:[singleItemList, totalClientBuyCount], ...}, ...}, ...} for drDict in drList: shopType = drDict["ShopType"] shopItemIndex = drDict["ShopItemIndex"] clientBuyCount = drDict["ClientBuyCount"] totalItemList = drDict["TotalItemList"] moneyCount = drDict["MoneyCount"] buyTimeStr = drDict["time"] singleItemList = [] if clientBuyCount > 1: for itemID, itemCount, isBind in totalItemList: singleItemList.append([itemID, itemCount / clientBuyCount, isBind]) else: singleItemList = totalItemList dateYMD = buyTimeStr[:10] dateHour = buyTimeStr[11:13] # 按日期 if timeGroupType == 1: dateKey = dateYMD # 按限时抢购时段 elif timeGroupType == 2: hourKey = dateHour dateHourInt = int(dateHour) for hourA, hourB in [[12, 14], [16, 18], [20, 22]]: # 时段列表 if hourA <= dateHourInt <= hourB: hourKey = "%s~%s" % (hourA, hourB) break dateKey = "%s %s" % (dateYMD, hourKey) # 不分组 else: dateKey = "All" # 为保持结构一致,也做为key,只是key是空字符串 if shopType not in drInfoDict: drInfoDict[shopType] = {} shopTypeInfoDict = drInfoDict[shopType] if dateKey not in shopTypeInfoDict: shopTypeInfoDict[dateKey] = {} itemInfoDict = shopTypeInfoDict[dateKey] if shopItemIndex not in itemInfoDict: itemInfoDict[shopItemIndex] = [singleItemList, 0, 0] clientBuyCountTotal, moneyCountTotal = itemInfoDict[shopItemIndex][1:] clientBuyCountTotal += clientBuyCount moneyCountTotal += moneyCount itemInfoDict[shopItemIndex] = [singleItemList, clientBuyCountTotal, moneyCountTotal] itemNameDict = CommFunc.getCfgKeyNameDict("item", argvDict) #drList = sorted(drList, key=lambda dr:dr["time"], reverse=False) # 按time升序排 printStr = "

%s

" % _(u"商城购买记录") if startDate: printStr += "%s: %s
" % (_(u"开始日期"), startDate) if endDate: printStr += "%s: %s
" % (_(u"结束日期"), endDate) for shopType, ymdDict in drInfoDict.items(): printStr += "--- %s: 【%s】
" % (_(u"商店类型"), shopType) dateKeyList = ymdDict.keys() dateKeyList.sort() for dateKey in dateKeyList: itemInfoDict = ymdDict[dateKey] tableDRList = [] for shopItemIndex, itemInfo in itemInfoDict.items(): singleItemList, clientBuyCountTotal, moneyCountTotal = itemInfo itemNameInfo = "" for itemID, itemCount, isBind in singleItemList: itemName = itemNameDict.get(str(itemID), "") if itemName: itemName = "%s(%s)" % (itemName, itemID) else: itemName = "%s(%s)" % (_(u"未知物品"), itemID) itemNameInfo += "%s*%s%s" % (itemName, itemCount, "  ") tableDRList.append({"dateKey":dateKey, "shopType":shopType, "shopItemIndex":shopItemIndex, "clientBuyCountTotal":clientBuyCountTotal, "moneyCountTotal":moneyCountTotal, "itemNameInfo":itemNameInfo}) # 表格输出 printStr += CommFunc.editTableHtml(tableDRList, ["dateKey", "shopType", "shopItemIndex", "clientBuyCountTotal", "moneyCountTotal", "itemNameInfo"], "", styleInfo={"dateKey":{"title":_(u"日期时间")}, "shopType":{"title":_(u"商城类型")}, "shopItemIndex":{"title":_(u"商品ID标识")}, "clientBuyCountTotal":{"title":_(u"总购买次数")}, "moneyCountTotal":{"title":_(u"货币总数")}, "itemNameInfo":{"align":"left", "title":_(u"物品信息")}, }, printCount=False) printStr += "
" # 只会返回最后一个print的内容 print printStr return def queryPlayerItemInfo_CenterBak(startDate, endDate, argvDict, moneyType, shopTypeList): drList = [] if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, drList, moneyType, shopTypeList): return return CommFunc.queryBackupCenterOK(drList) def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): ''' 检查流向是否需要处理 @param drFileName: 流向文件名 xxx_日期.txt @param *parseArgs: 自定义参数 @return: isNeed, checkNeedParseRetInfo ''' moneyType = parseArgs[1] 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 "BuyStoreItem" not in line or "ShopType" not in line: return drList, moneyType, shopTypeList = parseArgs drDict = eval(line) if drDict["MoneyType"] != moneyType: return shopType = drDict["ShopType"] if shopType not in shopTypeList: return drList.append({key:drDict[key] for key in Def_NeedKeyList}) 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()