| #!/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<br/>" % startDate | 
|     if endDate: | 
|         printStr += _(u"结束日期") + ": %s<br/>" % 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() |