#!/usr/bin/python # -*- coding: utf-8 -*- # @todo: CTGReport 充值分析报告 import CommFunc import ConfigParser import operator import logging import mylog #==================== 配置 ==================== cfg = ConfigParser.ConfigParser() cfg.read("../../InterfaceConfig.php") ServerPath = cfg.get("ServerInfo", "ServerPath") # 需要处理的流向名及顺序列表 DRNameList = ["CTGOK"] #==================== 配置 ==================== class ValueObj(): def __init__(self): return def getCTGReportInfo(argvDict): startDate = argvDict.get("startDate", "") endDate = argvDict.get("endDate", "") CTGReportOrderTypeList = eval(CommFunc.getSPConfig(argvDict, "Config", "CTGReportOrderType", "[1]")) reportInfo = {} # 查询中心备份的 if CommFunc.isQueryCenterbak(argvDict): queryCenterBak(startDate, endDate, argvDict, CTGReportOrderTypeList) return needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, reportInfo, CTGReportOrderTypeList, drNameList=DRNameList) if needQueryCenterbak: reportInfoBak = CommFunc.queryBackupCenterDR(cfg, argvDict) if reportInfoBak == None: return for orderInfo, bakData in reportInfoBak.items(): orderInfo = str(orderInfo) if orderInfo not in reportInfo: vObj = ValueObj() setattr(vObj, "payOrderType", bakData.get("payOrderType", 1)) setattr(vObj, "orderInfo", orderInfo) setattr(vObj, "orderCoin", bakData.get("orderCoin", 0)) setattr(vObj, "payCount", bakData.get("payCount", 0)) reportInfo[orderInfo] = vObj else: vObj = reportInfo[orderInfo] setattr(vObj, "payCount", getattr(vObj, "payCount", 0) + bakData.get("payCount", 0)) # 排序 sortList = reportInfo.values() for vObj in sortList: payOrderType = getattr(vObj, "payOrderType", 1) setattr(vObj, "payOrderType", CommFunc.getPayOrderTypeName(payOrderType)) setattr(vObj, "orderCoin", CommFunc.coinToY(getattr(vObj, "orderCoin", 0), CommFunc.getPayOrderCoinRate(payOrderType))) sortList.sort(key=operator.attrgetter("payCount"), reverse=True) printStr = "" if startDate: printStr += _(u"开始日期") + ": %s
" % startDate if endDate: printStr += _(u"结束日期") + ": %s
" % endDate # 表格输出 printStr += CommFunc.editTableHtml(sortList, ["orderInfo", "payCount", "payOrderType", "orderCoin"], _(u"排名"), styleInfo={"orderInfo":{"align":"left", "title":_(u"商品编号")}, "payCount":{"align":"left", "title":_(u"购买次数")}, "payOrderType":{"align":"left", "title":_(u"货币类型")}, "orderCoin":{"align":"right", "title":_(u"价格")}, }) # 只会返回最后一个print的内容 print printStr return def queryCenterBak(startDate, endDate, argvDict, CTGReportOrderTypeList): ## 查询中心服务器备份充值信息 reportInfoBak = {} if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, reportInfoBak, CTGReportOrderTypeList, drNameList=DRNameList): return return CommFunc.queryBackupCenterOK(reportInfoBak) def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): ''' 检查流向是否需要处理 @param drFileName: 流向文件名 xxx_日期.txt @param *parseArgs: 自定义参数 @return: isNeed, checkNeedParseRetInfo ''' #因为指定了 drNameList , 所以默认返回True return True, None def parseLineFunc(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv): ''' 解析流向行内容 @param drName: 流向名 @param dateStr: 对应日期字符串 @param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容 @param line: 本行内容 @param *parseArgs: 自定义参数 ''' reportInfo, CTGReportOrderTypeList = parseArgs drDict = eval(line) payOrderType = drDict.get("payOrderType", 1) if payOrderType not in CTGReportOrderTypeList: return orderInfo = drDict["orderInfo"] orderCoin = drDict["orderCoin"] if orderInfo not in reportInfo: reportInfo[orderInfo] = ValueObj() vObj = reportInfo[orderInfo] setattr(vObj, "payOrderType", payOrderType) setattr(vObj, "orderInfo", orderInfo) setattr(vObj, "orderCoin", orderCoin) setattr(vObj, "payCount", getattr(vObj, "payCount", 0) + 1) return ##================================================================================================= def main(): CommFunc.setdefaultencoding() argvDict = CommFunc.parse_args() mylog.InitMyLog(argvDict.get("eventType", "")) CommFunc.gettextInstall(argvDict.get("lang", "")) getCTGReportInfo(argvDict) return if __name__ == "__main__": try: main() except: CommFunc.printExceptionError()