#!/usr/bin/python # -*- coding: utf-8 -*- # @todo: 服务器LTV分析, 仅针对单 serverID 统计,不管合服后 import CommFunc import ConfigParser import CTGOKSort import mylog import logging cfg = ConfigParser.ConfigParser() cfg.read("../../InterfaceConfig.php") ServerPath = cfg.get("ServerInfo", "ServerPath") # 需要处理的流向名及顺序列表 DRNameList = ["FirstLogin", "CTGOK"] def queryServerLTVInfo(argvDict): logging.info("queryServerLTVInfo %s" % str(argvDict)) if "serverID" not in argvDict: print "not serverID" return argvDict["OnlyServerID"] = argvDict["serverID"] # 只查本服 LVTVPayOrderType = int(CommFunc.getSPConfig(argvDict, "Config", "LVTVPayOrderType", "1")) startDate = argvDict.get("startDate", "") endDate = argvDict.get("endDate", "") eventType = argvDict.get("eventType", "") ltvDayList = eval(argvDict.get("ltvDayList", "[1, 2, 3, 4, 5, 6, 7]")) # LTV 天(当日) ltvTotalDayList = eval(argvDict.get("ltvTotalDayList", "[7, 14, 15, 21, 30, 45, 60, 75, 90]")) # LTV 天(汇总) maxDay = max(max(ltvDayList), max(ltvTotalDayList)) createRoleEndDate = argvDict.get("createRoleEndDate", "") if not createRoleEndDate: createRoleEndDate = endDate if endDate else startDate argvDict["createRoleEndDate"] = createRoleEndDate # 创角结束天 endDateTime = CommFunc.getDiffDaysDate(maxDay - 1, CommFunc.strToDatetime(createRoleEndDate)) endDate = str(endDateTime)[:10] argvDict["endDate"] = endDate logging.info(" upd endDate=%s" % endDate) logging.info(" upd createRoleEndDate=%s" % createRoleEndDate) createDateAccIDInfo = {} # {"首登日期":["账号", ...], ...} ctgDateAccIDInfo = {} # {"充值日期":{"账号":orderValue, ...}, ...} # 查询中心备份的 if CommFunc.isQueryCenterbak(argvDict): queryCenterBak(startDate, endDate, LVTVPayOrderType, argvDict) return needQueryCenterbak = CommFunc.loopMainServerDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, createDateAccIDInfo, ctgDateAccIDInfo, LVTVPayOrderType, argvDict, drNameList=DRNameList) logging.info("needQueryCenterbak %s" % needQueryCenterbak) if needQueryCenterbak: bakDataInfo = CommFunc.queryBackupCenterDR(cfg, argvDict) logging.info("queryBackupCenterDR OK") if bakDataInfo == None: return createDateAccIDInfoBak, ctgDateAccIDInfoBak = bakDataInfo # 合并数据 for bakDate, firstLoginAccIDList in createDateAccIDInfoBak.items(): if bakDate not in createDateAccIDInfo: createDateAccIDInfo[bakDate] = firstLoginAccIDList else: createDateAccIDInfo[bakDate] = list(set(firstLoginAccIDList + createDateAccIDInfo[bakDate])) for bakDate, accIDCtgInfoBak in ctgDateAccIDInfoBak.items(): if bakDate not in ctgDateAccIDInfo: ctgDateAccIDInfo[bakDate] = accIDCtgInfoBak else: accIDCtgInfo = ctgDateAccIDInfo[bakDate] for accID, orderValue in accIDCtgInfoBak.items(): accIDCtgInfo[accID] = accIDCtgInfo.get(accID, 0) + orderValue logging.info("query all data OK") dateStrList = createDateAccIDInfo.keys() dateStrList.sort() ltvDrList = [] ltvStyleInfo = {} ltvTDList = ["DateStr", "FirstLoginCount"] for ltvDay in ltvDayList: ltvTDList.append(ltvDay) ltvStyleInfo[ltvDay] = {"align":"left", "title":_(u"第%s日LTV") % ltvDay} for ltvTotalDay in ltvTotalDayList: key = "%sTotal" % ltvTotalDay ltvTDList.append(key) ltvStyleInfo[key] = {"align":"left", "title":_(u"%s日总LTV") % ltvTotalDay} # 最后总LTV LTVTotalDayTDKey = "LTVTotalDay" MaxDayCoinTotalKey = "MaxDayCoinTotal" ltvTDList.extend([LTVTotalDayTDKey, MaxDayCoinTotalKey]) ltvStyleInfo[LTVTotalDayTDKey] = {"align":"left", "title":_(u"时段总LTV(天 )")} ltvStyleInfo[MaxDayCoinTotalKey] = {"align":"left", "title":_(u"时段总充值")} coinRate = CommFunc.getPayOrderCoinRate(LVTVPayOrderType) if LVTVPayOrderType in CTGOKSort.PayByMoneyOrderTypeList: coinRate = 1.0 firstLoginAccIDCountTotal, allAccIDCoinTotal = 0, 0 curDateTime = CommFunc.getCurrentTime() for dateStr in dateStrList: dateObj = CommFunc.strToDatetime(dateStr) maxDateObj = CommFunc.getDiffDaysDate(maxDay - 1, CommFunc.strToDatetime(dateStr)) # 该创角日期最大需要统计到的充值日期 if curDateTime < maxDateObj: passDays = (curDateTime - dateObj).days + 1 else: passDays = (maxDateObj - dateObj).days + 1 firstLoginAccIDList = createDateAccIDInfo[dateStr] firstLoginCount = len(firstLoginAccIDList) firstLoginAccIDCountTotal += firstLoginCount # ltv ltvDrInfo = {"DateStr":dateStr, "FirstLoginCount":firstLoginCount} dayCtgInfo = {} # 转化为天汇总 for ltvDate, accIDCtgInfo in ctgDateAccIDInfo.items(): ltvDateObj = CommFunc.strToDatetime(ltvDate) if not ltvDateObj: continue ltvDay = (ltvDateObj - dateObj).days + 1 # 0即第一天,所以 + 1 if ltvDay > maxDay: # 超过该创角天最大需要统计的ltv天,不处理 continue ctgCoin = 0 for accID, orderValue in accIDCtgInfo.items(): if accID in firstLoginAccIDList: ctgCoin += orderValue if ctgCoin > 0: dayCtgInfo[ltvDay] = ctgCoin # ltv - 当日 for ltvDay in ltvDayList: if ltvDay not in dayCtgInfo: continue ctgCoin = dayCtgInfo[ltvDay] ltv = (ctgCoin / float(firstLoginCount) / coinRate) if firstLoginCount > 0 else 0 ltvDrInfo[ltvDay] = CommFunc.roundInt(ltv, 2) # ltv - 汇总 for ltvTotalDay in ltvTotalDayList: if ltvTotalDay > passDays: # 未到的汇总天不显示 continue ctgCoinTotal = 0 for ltvDay in range(1, ltvTotalDay + 1): ctgCoinTotal += dayCtgInfo.get(ltvDay, 0) if not ctgCoinTotal: continue ltvTotal = (ctgCoinTotal / float(firstLoginCount) / coinRate) if firstLoginCount > 0 else 0 key = "%sTotal" % ltvTotalDay ltvDrInfo[key] = CommFunc.roundInt(ltvTotal, 2) maxDayCoinTotal = sum(dayCtgInfo.values()) allAccIDCoinTotal += maxDayCoinTotal if maxDayCoinTotal > 0: maxDayLTVTotal = (maxDayCoinTotal / float(firstLoginCount) / coinRate) if firstLoginCount > 0 else 0 ltvDrInfo[LTVTotalDayTDKey] = "%s (%s%s)" % (CommFunc.roundInt(maxDayLTVTotal, 2), passDays, _(u"天")) ltvDrInfo[MaxDayCoinTotalKey] = CommFunc.roundInt(maxDayCoinTotal / coinRate, 2) if firstLoginCount: ltvDrList.append(ltvDrInfo) orderTypeName = CommFunc.getPayOrderTypeName(LVTVPayOrderType) printStr = "
%s