#!/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 queryPlayerMoneyInfo(argvDict):
|
## 查询玩家货币信息
|
|
startDate = argvDict.get("startDate", "")
|
endDate = argvDict.get("endDate", "")
|
|
moneyType = CommFunc.toInt(argvDict.get("moneyType"))
|
recordType = argvDict.get("recordType")
|
if not moneyType or not recordType:
|
print _(u"需指定查询货币类型及选项")
|
return
|
|
# 查询中心备份的
|
if CommFunc.isQueryCenterbak(argvDict):
|
queryPlayerMoneyInfo_CenterBak(startDate, endDate, argvDict, moneyType, recordType)
|
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, moneyType, recordType)
|
if needQueryCenterbak:
|
argvDict["queryAccID"] = queryAccID
|
bakDataList = CommFunc.queryBackupCenterDR(cfg, argvDict)
|
if bakDataList == None:
|
return
|
drList = bakDataList + drList
|
|
itemNameDict = CommFunc.getCfgKeyNameDict("item", argvDict)
|
useNameDict = CommFunc.getCfgKeyNameDict("money_enent_use", argvDict)
|
giveNameDict = CommFunc.getCfgKeyNameDict("money_enent_give", argvDict)
|
giveItemNameDict = CommFunc.getCfgKeyNameDict("item_enent_give", argvDict)
|
|
needMoney2 = False
|
totalGive, totalUse = 0, 0
|
bossTypeNameDict = {0:_(u"世界Boss"), 1:_(u"Boss之家"), 2:_(u"跨服Boss")}
|
prayTypeNameDict = {13:_(u"金币"), 14:_(u"经验")}
|
drList = sorted(drList, key=lambda dr:(dr["time"], dr['PlayerMoneyCount']), reverse=False) # 按time升序排
|
for drDict in drList:
|
if not needMoney2 and "PlayerMoneyCount2" in drDict:
|
needMoney2 = True
|
MoneyCount = drDict['MoneyCount']
|
eventName = drDict['eventName']
|
reason_name_son = drDict.get("reason_name_son")
|
if reason_name_son:
|
if eventName in ["UseItem", "BuyStoreItem", "TransformItem"]:
|
itemID = reason_name_son
|
itemName = itemNameDict.get(str(itemID), "")
|
if itemName:
|
drDict["reason_name_son"] = "%s(%s)" % (itemName, itemID)
|
|
# 物品转换的,补上物品来源
|
if eventName == "TransformItem" and "GiveItemEvent" in drDict:
|
giveItemEventName = drDict["GiveItemEvent"]
|
giveItemNameCh = giveItemNameDict.get(giveItemEventName, giveItemEventName)
|
drDict["reason_name_son"] = "%s %s:%s" % (drDict["reason_name_son"], _(u"物品来源"), str(giveItemNameCh))
|
|
# 抵扣
|
if drDict.get("CouponMoney", 0) > 0:
|
drDict["reason_name_son"] = "%s %s:%s %s:%s" % (drDict["reason_name_son"], _(u"原价"), drDict.get("ItemPrice", 0), _(u"抵扣"), drDict["CouponMoney"])
|
|
elif eventName == "BuyKillBossCnt":
|
drDict["reason_name_son"] = bossTypeNameDict.get(reason_name_son, reason_name_son)
|
|
elif eventName == "Pray":
|
drDict["reason_name_son"] = prayTypeNameDict.get(reason_name_son, reason_name_son)
|
|
eventNameCh = ""
|
if "-" in MoneyCount:
|
eventNameCh = useNameDict.get(eventName)
|
totalUse += CommFunc.toInt(MoneyCount.replace("-", "").replace(" ", ""))
|
|
elif "+" in MoneyCount:
|
eventNameCh = giveNameDict.get(eventName)
|
totalGive += CommFunc.toInt(MoneyCount.replace("+", "").replace(" ", ""))
|
if eventNameCh:
|
drDict['eventName'] = "%s %s" % (eventNameCh, CommFunc.encode(eventName))
|
|
if not playerName and drList:
|
drDict = drList[-1]
|
playerID = drDict.get("PlayerID", playerID)
|
playerName = CommFunc.encodePych(drDict.get("PlayerName", ""))
|
|
moneyNameDict = CommFunc.getCfgKeyNameDict("money", argvDict)
|
moneyName = moneyNameDict.get(str(moneyType), str(moneyType))
|
printStr = "<center><p>%s%s</p></center>" % (moneyName, _(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 totalGive:
|
printStr += "%s: %s<br/>" % (_(u"累计获得"), totalGive)
|
if totalUse:
|
printStr += "%s: %s<br/>" % (_(u"累计消耗"), totalUse)
|
|
maxShowCount = 5000
|
drCount = len(drList)
|
if drCount > maxShowCount:
|
logging.warn("drList len is %s" % drCount)
|
drList = drList[:maxShowCount]
|
printStr += "<font color='red'><b>%s : %s<b></font><br/>" % (_(u"满足条件总条数过多,请调整查询条件!当前仅展示部分,实际总条数为"), drCount)
|
|
# 表格输出
|
tdList = ["MoneyCount", "PlayerMoneyCount", "eventName", "reason_name_son", "time"]
|
styleInfo = {"MoneyCount":{"align":"right", "title":_(u"变化值")},
|
"PlayerMoneyCount":{"align":"right", "title":_(u"剩余")},
|
"eventName":{"align":"left"},
|
}
|
if needMoney2:
|
tdList = ["MoneyCount", "PlayerMoneyCount", "PlayerMoneyCount2", "eventName", "reason_name_son", "time"]
|
money2TitleDict = {99:"时效"}
|
money2Title = _(u"剩余") + money2TitleDict.get(moneyType, "2")
|
styleInfo.update({
|
"PlayerMoneyCount2":{"align":"right", "title":money2Title},
|
})
|
printStr += CommFunc.editTableHtml(drList, tdList, _(u"编号"), styleInfo=styleInfo)
|
|
# 只会返回最后一个print的内容
|
print printStr
|
return
|
|
def queryPlayerMoneyInfo_CenterBak(startDate, endDate, argvDict, moneyType, recordType):
|
drList = []
|
queryAccID = argvDict.get("queryAccID", "")
|
|
if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc,
|
drList, queryAccID, moneyType, recordType):
|
return
|
|
return CommFunc.queryBackupCenterOK(drList)
|
|
def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv):
|
''' 检查流向是否需要处理
|
@param drFileName: 流向文件名 xxx_日期.txt
|
@param *parseArgs: 自定义参数
|
@return: isNeed, checkNeedParseRetInfo
|
'''
|
|
_, _, moneyType, recordType = parseArgs
|
|
queryUse = recordType in ["All", "Use"]
|
queryGive = recordType in ["All", "Give"]
|
|
changeType = ""
|
|
# 仙玉
|
if moneyType == 1:
|
if queryGive:
|
if drFileName.startswith("GiveGold_"):
|
changeType = "+"
|
if queryUse:
|
if drFileName.startswith("UseGold_"):
|
changeType = "-"
|
|
# 绑玉
|
elif moneyType == 2:
|
if queryGive:
|
if drFileName.startswith("GiveGoldPaper_"):
|
changeType = "+"
|
if queryUse:
|
if drFileName.startswith("UseGoldPaper_"):
|
changeType = "-"
|
|
# 铜钱
|
elif moneyType == 3:
|
if queryGive:
|
if drFileName.startswith("GiveSilver_"):
|
changeType = "+"
|
if queryUse:
|
if drFileName.startswith("UseSilver_"):
|
changeType = "-"
|
|
# 神玉
|
elif moneyType == 4:
|
if queryGive:
|
if drFileName.startswith("GiveSilverPaper_"):
|
changeType = "+"
|
if queryUse:
|
if drFileName.startswith("UseSilverPaper_"):
|
changeType = "-"
|
|
# 代币
|
elif moneyType == 99:
|
if queryGive:
|
if drFileName.startswith("GivePayCoin_"):
|
changeType = "+"
|
if queryUse:
|
if drFileName.startswith("UsePayCoin_"):
|
changeType = "-"
|
|
# 其他
|
else:
|
if queryGive:
|
if drFileName.startswith("GiveCurrency_%s" % moneyType):
|
changeType = "+"
|
if queryUse:
|
if drFileName.startswith("UseCurrency_%s" % moneyType):
|
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, moneyType, _ = parseArgs
|
|
if queryAccID not in line:
|
# 直接验证账号字符,省去eval消耗
|
return
|
drDict = eval(line)
|
accID = drDict["AccID"]
|
if accID != queryAccID:
|
return
|
|
if moneyType != drDict["MoneyType"]:
|
return
|
|
drDict["MoneyCount"] = "%s %s" % (changeType, drDict["MoneyCount"])
|
drList.append(drDict)
|
return
|
|
def main():
|
CommFunc.setdefaultencoding()
|
argvDict = CommFunc.parse_args()
|
mylog.InitMyLog(argvDict.get("eventType", ""))
|
CommFunc.gettextInstall(argvDict.get("lang", ""))
|
queryPlayerMoneyInfo(argvDict)
|
return
|
|
if __name__ == "__main__":
|
try:
|
main()
|
except:
|
CommFunc.printExceptionError()
|