cat DBConnector.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# haoren @ 2017-08-21 21:33:05
import mysql.connector
from logger import logging
class DBConnector: #定义一个类
"数据库抽象类"
def __init__(self, dbHost, dbPort, dbUser, dbPass, dbName): #定义函数
self._dbHost = dbHost
self._dbPort = dbPort
self._dbUser = dbUser
self._dbPass = dbPass
self._dbName = dbName
def connect(self): #定义方法
try:
self._dbConn = mysql.connector.connect(host=self._dbHost, port=self._dbPort, user=self._dbUser, passwd=self._dbPass, db=self._dbName)
self._dbCursor = self._dbConn.cursor()
except Exception,e:
logging.info("connect failed(%s) : %s %s=%s %s", e, self._dbHost, self._dbUser, self._dbPass, self._dbName)
return False
else:
logging.info("connect successed : %s %s=%s %s", self._dbHost, self._dbUser, self._dbPass, self._dbName)
return True
def execSqlStep(self, sql): #定义方法
try:
count = self._dbCursor.execute(sql)
results = self._dbCursor.fetchall()
except:
#self.close()
return False
else:
return results
def execSql(self, sql): #定义方法
results = self.execSqlStep(sql)
if results==False:
if self.connect()==False:
return False
else:
results = self.execSqlStep(sql) #调用前面定义的方法
return results
def close(self): #定义方法
try:
self._dbCursor.close()
self._dbConn.close()
except:
return False
else:
return True
cat DBPool.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# haoren @ 2017-08-21 21:33:05
import copy
from DBConnector import DBConnector
def MakeResultNone2Zero(data): #定义函数
if type(data)==tuple:
data = list(data) #将元祖转为列表
r = 0
for row in data:
if not (type(row)==list or type(row)==tuple):
if row==None or type(row)=="NoneType":
data[r] = 0
continue
if type(row)==tuple:
data[r] = list(row)
row = list(row)
c = 0
for col in row:
if col==None or type(col)=="NoneType":
data[r][c] = 0
row[c] = 0
c += 1
if type(row)==list:
data[r] = tuple(row)
r += 1
if type(data)==list:
data = tuple(data)
class DBPool: #定义一个类
"数据库抽象类"
_dbCfg = {}
_dbMap = {}
def __init__(self, dbCfg): #定义一个方法
DBPool._dbCfg = copy.deepcopy(dbCfg)
def connect(self): #定义一个方法
if len(DBPool._dbCfg)<=0:
return False
self.close()
for key in DBPool._dbCfg:
cfg = DBPool._dbCfg[key]
handler = DBConnector(cfg["dbHost"], cfg["dbPort"], cfg["dbUser"], cfg["dbPass"], cfg["dbName"])
if handler.connect():
DBPool._dbMap[key] = handler
print "connect successed(%s)" % key
else:
print "connect failed(%s)" % key
return True
def execSql(self, dbKey, sql): #定义一个方法
if not DBPool._dbMap.has_key(dbKey):
print "invalid dbKey(%s) | sql(%s)" % (dbKey, sql)
#return False
return ""
handler = DBPool._dbMap[dbKey]
results = handler.execSql(sql)
if results==False:
#del DBPool._dbCfg[dbKey]
#del DBPool._dbMap[dbKey]
print "execSql failed(%s)" % (sql)
return ""
#MakeResultNone2Zero(results)
return results
def close(self): #定义方法
for key in DBPool._dbMap:
handler = DBPool._dbMap[key]
if handler.close():
print "close successed(%s)" % key
else:
print "close failed(%s)" % key
DBPool._dbMap.clear()
return True
cat logger.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# haoren @ 2017-08-22 21:55:42
import logging
logging.basicConfig(level=logging.INFO,
filename='./AutoSettle.log',
filemode='w',
format='%(asctime)s - %(filename)s:%(lineno)s[%(funcName)s] - %(levelname)s: %(message)s')
cat LoadData.py
#!/usr/bin/env python
# -*- coding: gbk -*-
# haoren @ 2017-08-22 15:51:24
#from sys import argv
from logger import logging
from DBPool import DBPool
import time
import datetime
cfgmap = { #定义大字典,字典进行嵌套
"IMDB" : {
"dbHost" : "172.17.112.3",
"dbPort" : 3306,
"dbUser" : "haoren",
"dbPass" : "skjsdhfklsadhf",
"dbName" : "RIMDB"
},
"GMDB" : {
"dbHost" : "172.17.112.2",
"dbPort" : 3306,
"dbUser" : "haoren",
"dbPass" : "skjsdhfklsadhf",
"dbName" : "PGMDB"
},
"JIESUANDB" : {
"dbHost" : "172.17.112.1",
"dbPort" : 3306,
"dbUser" : "haoren",
"dbPass" : "skjsdhfklsadhf",
"dbName" : "JIESUANDB"
}
}
#公司化结算平台列表
def MakeChannelCorpList(dbKey, startTime, endTime): #定义函数
sql = "select CHANNELID from CORPSETTLELOG where TIME>=%d and TIME<%d group by CHANNELID;" % (startTime, endTime)
return db.execSql(dbKey, sql)
#公司化设置平台列表
def MakeChannelSettleList(dbKey, startTime, endTime): #定义函数
sql = "select CHANNELID from SPECIALCHANNEL group by CHANNELID;"
return db.execSql(dbKey, sql)
#平台外部ID列表
def MakeChannelOutIDList(dbKey, startTime, endTime): #定义函数
sql = "select OLDID,NEWID from CHANNELIDCHANGELOG;"
return db.execSql(dbKey, sql)
#表演者外部ID列表
def MakeSingerOutIDList(dbKey, startTime, endTime): #定义函数
sql = "select INNERID,OUTERID from IMIDCHANGELOG;"
return db.execSql(dbKey, sql)
#公司化老板设置平台列表
def MakeChannelOwnerList(dbKey, startTime, endTime): #定义函数
sql = "select OWNERID,CHANNELID from SPECIALCHANNEL group by CHANNELID;"
return db.execSql(dbKey, sql)
#表演者结算列表
def MakeSingerCorpList(dbKey, startTime, endTime, channelID): #定义函数
sql = "select USERID from CORPSETTLELOG where TIME>=%d and TIME<%d AND CHANNELID=%d AND USERID<>0 group by USERID;" % (startTime, endTime, channelID)
return db.execSql(dbKey, sql)
#表演者收入列表
def MakeSingerIncomList(dbKey, channelID): #定义函数
sql = "select SINGERID from %s where CHANNELID=%d group by SINGERID;" % (coinTable, channelID)
return db.execSql(dbKey, sql)
#表演者签约列表
def MakeSingerSignList(dbKey, startTime, endTime, channelID): #定义函数
sql = "select PERFORMERID from VCHANNELPERFORMER where CHANNELID=%d group by PERFORMERID;" % (channelID)
return db.execSql(dbKey, sql)
#表演者收入详细信息
#结算平台收入
singerCorpIncomIdx = 9
channelCorpIncomIdx = 3
#非结算平台收入
singerNoCorpIncomIdx = 10
#表演者消费
singerConsumeIdx = 12
#表演者守护
singerGuardIncomIdx = 13
#平台守护
channelGuardIncomIdx = 4
#表演者的结算人民币
singerCorpSettleIdx = 8
#表演者结算差值
singerSubIdx = 17
#表演者上次结余
singerYestodayCurIdx = 14
#表演者外部ID
singerOutIDIdx = 7
#平台收入数据表
coinTable = ""
goldTable = ""
def GetListOneCol(t, i): #定义函数
if len(t)<=0:
return False
for row in t:
if len(row)<=i:
return False
listTemp.append(row[i])
return listTemp
def printResult(t): #定义函数
print type(t)
for row in t:
if not (type(row)==list or type(row)==tuple):
print row
else:
print "meet a table"
printResult(row)
def MakeNone2Default(value, defaultValue=0): #定义函数
if value==None or type(value)=="NoneType":
return defaultValue
else:
return value
def MakeStrLastMonth(srcStr): #定义函数
firstStr = srcStr[0:-6]
monthStr = srcStr[-6:]
timeSettle = time.strptime(monthStr, '%Y%m')
lastMonth = timeSettle.tm_mon - 1
lastYear = timeSettle.tm_year
if lastMonth==0:
lastMonth = 12
lastYear -= 1
retTime = datetime.datetime(month=lastMonth, year=lastYear, day=timeSettle.tm_mday)
timeStr = retTime.strftime("%Y%m")
retStr = firstStr + timeStr
return retStr
def MakeSingerInfo(startTime, endTime, singerID, channelID, sign): #定义函数
#结算平台
if channelOutIDDict.has_key(channelID):
channelOutID = channelOutIDDict[channelID]
else:
channelOutID = channelID
if singerOutIDDict.has_key(singerID):
singerOutID = singerOutIDDict[singerID]
else:
singerOutID = singerID
#表演者昵称
tableNickName = "CHARBASE%d" % (singerID%10)
sql="select CHANNELNICKNAME from %s where ID=%s LIMIT 1;" % (tableNickName, singerID)
singerNickNameTemp = db.execSql("IMDB", sql)
if len(singerNickNameTemp)>0:
singerNickName = MakeNone2Default(singerNickNameTemp[0][0], "")
try:
singerNickName = singerNickName.encode('unicode-escape').decode('string_escape')
singerNickName = singerNickName.decode('gbk')
except Exception as e:
logging.info("singer(%s) nick name", singerID)
else:
singerNickName = ""
#结算平台收入
sql1="select sum(SINGERRECVGOLD)/100,sum(CHANNELRECVGOLD)/100 from %s where SINGERID=%s AND CHANNELID=%s;" % (coinTable, singerID, channelID)
listTemp = list(db.execSql("JIESUANDB", sql1))
if len(listTemp)>0:
singerCorpIncom = MakeNone2Default(listTemp[0][0])
channelCorpIncom = MakeNone2Default(listTemp[0][1])
else:
singerCorpIncom = 0
channelCorpIncom = 0
#非结算平台收入
sql2="select sum(SINGERRECVGOLD)/100 from %s where SINGERID=%s AND CHANNELID<>%s;" % (coinTable, singerID, channelID)
singerNoCorpIncomTemp = db.execSql("JIESUANDB", sql2)
if len(singerNoCorpIncomTemp)>0:
singerNoCorpIncom = MakeNone2Default(singerNoCorpIncomTemp[0][0])
else:
singerNoCorpIncom = 0
#非结算平台
sql6="select CHANNELID from %s where SINGERID=%s AND CHANNELID<>%s GROUP BY CHANNELID;" % (coinTable, singerID, channelID)
singerNoCorpChannelTemp = db.execSql("JIESUANDB", sql6)
if len(singerNoCorpChannelTemp)>0:
singerNoCorpChannel = MakeNone2Default(singerNoCorpChannelTemp[0][0])
else:
singerNoCorpChannel = 0
#表演者消费
sql3="select sum(CONSUMEGOLD)/100 from %s where PRESENTERID=%s;" % (goldTable, singerID)
singerConsumeTemp = db.execSql("JIESUANDB", sql3)
if len(singerConsumeTemp)>0:
singerConsume = MakeNone2Default(singerConsumeTemp[0][0])
else:
singerConsume = 0
#平台内的平台守护收入和表演者守护收入
sql4="select sum(SINGERRECVGOLD)/100,sum(CHANNELRECVGOLD)/100 from %s where SINGERID=%s AND CHANNELID=%s AND TYPE=2;" % (coinTable, singerID, channelID)
listTemp = list(db.execSql("JIESUANDB", sql4))
if len(listTemp)>0:
singerGuardIncom = MakeNone2Default(listTemp[0][0])
channelGuardIncom = MakeNone2Default(listTemp[0][1])
else:
singerGuardIncom = 0
channelGuardIncom = 0
#表演者的结算人民币
sql5="select sum(GOLD)/100 from CORPSETTLELOG where TIME>=%s AND TIME<%s AND USERID=%s AND CHANNELID=%s;" % (startTime, endTime, singerID, channelID)
singerCorpSettleTemp = db.execSql("IMDB", sql5)
if len(singerCorpSettleTemp)>0:
singerCorpSettle = MakeNone2Default(singerCorpSettleTemp[0][0])
else:
singerCorpSettle = 0
#表演者昨天结余人民币
singerYestodayCur = 0
singerYestodayTime = ""
monthStr = coinTable
for num in range(0, 3):
if num==0:
sql7="select (CURRENTSINGERGOLD-SINGERRECVGOLD)/100,OPTIME from %s where SINGERID=%s ORDER BY OPTIME,'INDEX' LIMIT 1;" % (monthStr, singerID)
elif singerCorpSettle<=0:
break
else:
sql7="select (CURRENTSINGERGOLD-SINGERRECVGOLD)/100,OPTIME from %s where SINGERID=%s ORDER BY OPTIME DESC,'INDEX' DESC LIMIT 1;" % (monthStr, singerID)
listTemp = db.execSql("JIESUANDB", sql7)
if len(listTemp)>0:
singerYestodayCur = MakeNone2Default(listTemp[0][0])
singerYestodayTime = MakeNone2Default(listTemp[0][1])
break
monthStr = MakeStrLastMonth(monthStr)
#表演者今天结余人民币
sql8="select (CURRENTSINGERGOLD)/100,OPTIME from %s where SINGERID=%s ORDER BY OPTIME DESC, 'INDEX' DESC LIMIT 1;" % (coinTable, singerID)
listTemp = db.execSql("JIESUANDB", sql8)
if len(listTemp)>0:
singerTodayCur = MakeNone2Default(listTemp[0][0])
singerTodayTime = MakeNone2Default(listTemp[0][1])
else:
singerTodayCur = 0
singerTodayTime = ""
#表演者消费不为0,结余取当天最小和最大值
if singerConsume>0:
#当天消费第一笔结余
sql9="select (CURRENTPRESENTERGOLD+CONSUMEGOLD)/100,OPTIME from %s where PRESENTERID=%s ORDER BY OPTIME,'INDEX' LIMIT 1;" % (goldTable, singerID)
listTemp = db.execSql("JIESUANDB", sql9)
if len(listTemp)>0:
singerGoldYestodayCur = MakeNone2Default(listTemp[0][0])
singerGoldYestodayTime = MakeNone2Default(listTemp[0][1])
else:
singerGoldYestodayCur = 0
singerGoldYestodayTime = ""
#当天消费最后一笔结余
sql10="select (CURRENTPRESENTERGOLD)/100,OPTIME from %s where PRESENTERID=%s ORDER BY OPTIME DESC,'INDEX' DESC LIMIT 1;" % (goldTable, singerID)
listTemp = db.execSql("JIESUANDB", sql10)
if len(listTemp)>0:
singerGoldTodayCur = MakeNone2Default(listTemp[0][0])
singerGoldTodayTime = MakeNone2Default(listTemp[0][1])
else:
singerGoldTodayCur = 0
singerGoldTodayTime = ""
#都有值,取时间最小的
if singerYestodayTime and singerTodayTime:
#昨天结余人民币消费时间小泽取齐值
if singerYestodayTime>singerGoldYestodayTime:
singerYestodayCur = singerGoldYestodayCur
#今日结余,人民币消费时间大取齐值
if singerTodayTime<=singerGoldTodayTime:
singerTodayCur = singerGoldTodayCur
else:
singerYestodayCur = singerGoldYestodayCur
singerTodayCur = singerGoldTodayCur
#表演者实际结算数据
if singerTodayCur and singerYestodayCur:
singerCurSub = singerTodayCur - singerYestodayCur
else:
singerCurSub=0
#表演者数据核算
if sign:
singerSub = singerCorpSettle - (singerCorpIncom+singerNoCorpIncom-singerConsume)
else:
singerSub = 0
if sign:
signInfo="签约表演者"
else:
signInfo="非签约表演者"
singerCorpSettleRMB = singerCorpSettle / 200
infoTemp = [signInfo, channelID, channelOutID, channelCorpIncom, channelGuardIncom, singerNickName, singerID, singerOutID, singerCorpSettle, singerCorpIncom, singerNoCorpIncom, singerNoCorpChannel, singerConsume, singerGuardIncom, singerYestodayCur, singerTodayCur, singerCurSub, singerSub, singerCorpSettleRMB]
return infoTemp
def ListDifference(listA, listB): #定义函数
listTempA = []
listTempB = []
for row in listA:
listTempA.append(row[0])
for row in listB:
listTempB.append(row[0])
tupleA = tuple(listTempA)
tupleB = tuple(listTempB) #将列表转换为元组
tRet = set(tupleA).difference(set(tupleB)) #元祖比较 ,set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
return list(tRet)
#python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.
#sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。
def MakeNameStr(srcStr, defaultStr=""): #定义函数
if srcStr=="":
return defaultStr
try:
strTemp = srcStr.encode('unicode-escape').decode('string_escape')
destStr = strTemp.decode('gbk')
except Exception as e:
destStr = defaultStr
return destStr
def MakeSingerWithdrawRecoed(startTime, endTime, singerID, channelID): #定义函数
time1 = 0
time2 = startTime
timeTemp = time.localtime(time2)
lastMonth = timeTemp.tm_mon - 1
lastYear = timeTemp.tm_year
if lastMonth==0:
lastMonth = 12
lastYear -= 1
retTime = datetime.datetime(month=lastMonth, year=lastYear, day=timeTemp.tm_mday)
time1 = time.mktime(retTime.timetuple())
sql = "select USERID,CASH,BANKCARD,NAME,IDENTITYCARD,PHONE,PROVINCE,CITY,REGION,BANKBRANCH,SERIALNUM,TIME from SINGERWITHDRAWRECORD where TIME>=%s and TIME<%s and USERID=%s and WITHDRAWTYPE=0 and TRANFERSTATE<>1;" % (time1, time2, singerID)
singerWithdrawRecord = []
singerWithdrawRecordTemp = db.execSql("IMDB", sql)
channelSingerWithdrawRecordTemp = []
if len(singerWithdrawRecordTemp)>0:
r = 0
for rowTemp in singerWithdrawRecordTemp:
row = list(rowTemp)
strTemp = MakeNone2Default(row[3], "")
row[3] = MakeNameStr(strTemp)
strTemp = MakeNone2Default(row[6], "")
row[6] = MakeNameStr(strTemp)
strTemp = MakeNone2Default(row[7], "")
row[7] = MakeNameStr(strTemp)
strTemp = MakeNone2Default(row[8], "")
row[8] = MakeNameStr(strTemp)
strTemp = MakeNone2Default(row[9], "")
row[9] = MakeNameStr(strTemp)
singerWithdrawRecord.append(row)
r += 1
print "have a record singer(%s)" % singerID
if channelSingerWithdrawRecordDict.has_key(channelID):
channelSingerWithdrawRecordTemp = channelSingerWithdrawRecordDict[channelID]
channelSingerWithdrawRecordTemp += singerWithdrawRecord
channelSingerWithdrawRecordDict[channelID] = channelSingerWithdrawRecordTemp
else:
colName = ["用户ID", "金额", "银行卡号", "用户名", "身份证号", "手机号", "省份", "城市", "区县", "银行", "序列号", "时间"]
channelSingerWithdrawRecordTemp.append(colName)
channelSingerWithdrawRecordTemp += singerWithdrawRecord
channelSingerWithdrawRecordDict[channelID] = channelSingerWithdrawRecordTemp
#产生并合并表演者名单
def MergerSingerList(startTime, endTime, channelID): #定义函数
singerCorpList = MakeSingerCorpList("IMDB", startTime, endTime, channelID)
singerIncomList = MakeSingerIncomList("JIESUANDB", channelID)
#print type(singerCorpList), type(singerIncomList)
#singerNoSignList = tuple( singerIncomList.difference(singerCorpList) )
singerNoSignList = ListDifference(singerIncomList, singerCorpList) #调用函数
channelInfoTemp = []
colName = ["类别", "平台内部ID", "平台外部ID", "平台收入", "平台守护收入", "表演者昵称", "表演者内部ID", "表演者外部ID", "表演者结算", "表演者在结算平台收入", "表演者在非结算平台收入", "非结算平台", "表演者消费", "表演者守护收入", "上次结余", "本次结余", "结余差额", "表演者结算差值", "表演者结算金额"]
channelInfoTemp.append(colName)
sumChannelCorpIncom = 0
sumSingerCorpIncom = 0
sumSingerCorpSettle = 0
sumSingerSub = 0
#守护
sumSingerGuardIncom = 0
sumChannelGuardIncom = 0
#表演者消费
sumSingerConsume = 0
#所有表演者非结算平台收入
sumSingerNoCorpIncom = 0
#表演者上次结余
sumSingerYestodayCur = 0
for singerID in singerCorpList:
print "sign singer(%s) in channel(%s)" % (singerID[0], channelID)
infoTemp = MakeSingerInfo(startTime, endTime, singerID[0], channelID, True)
channelInfoTemp.append(infoTemp)
sumChannelCorpIncom += infoTemp[channelCorpIncomIdx]
sumSingerCorpIncom += infoTemp[singerCorpIncomIdx]
sumSingerCorpSettle += infoTemp[singerCorpSettleIdx]
sumSingerSub += infoTemp[singerSubIdx]
sumSingerGuardIncom += infoTemp[singerGuardIncomIdx]
sumChannelGuardIncom += infoTemp[channelGuardIncomIdx]
sumSingerConsume += infoTemp[singerConsumeIdx]
sumSingerNoCorpIncom += infoTemp[singerNoCorpIncomIdx]
sumSingerYestodayCur += infoTemp[singerYestodayCurIdx]
MakeSingerWithdrawRecoed(startTime, endTime, singerID[0], channelID)
channelInfoTemp.append([])
channelNoSignSingerInfoTemp = []
for singerID in singerNoSignList:
print "not sign singer(%s) in channel(%s)" % (singerID, channelID)
infoTemp = MakeSingerInfo(startTime, endTime, singerID, channelID, False)
channelInfoTemp.append(infoTemp)
channelNoSignSingerInfoTemp.append(infoTemp)
sumChannelCorpIncom += infoTemp[channelCorpIncomIdx]
sumSingerCorpIncom += infoTemp[singerCorpIncomIdx]
sumSingerGuardIncom += infoTemp[singerGuardIncomIdx]
sumChannelGuardIncom += infoTemp[channelGuardIncomIdx]
MakeSingerWithdrawRecoed(startTime, endTime, singerID, channelID)
channelNoSignSingerInfoDict[channelID] = channelNoSignSingerInfoTemp
channelInfoTemp.append([])
if sumChannelCorpIncom<=0:
singerChannelRadio = 0
guardSingerChannelRadio = 0
else:
singerChannelRadio = sumSingerCorpIncom / sumChannelCorpIncom
guardSingerChannelRadio = (sumSingerCorpIncom+sumChannelGuardIncom) / (sumChannelCorpIncom)
sumName = ["总计", "平台收入总计", "签约表演者结算总计", "所有表演者此平台收入总计", "表演者平台收入比值", "补偿守护比值", "签约表演者结算差值总计", "表演者守护收入总计", "表演者消费总计", "表演者其他平台收入", "表演者上次结余"]
channelInfoTemp.append(sumName)
sumValue = ["", sumChannelCorpIncom, sumSingerCorpSettle, sumSingerCorpIncom, singerChannelRadio, guardSingerChannelRadio, sumSingerSub, sumSingerGuardIncom, sumSingerConsume, sumSingerNoCorpIncom, sumSingerYestodayCur]
channelInfoTemp.append(sumValue)
#平台的结算人民币
sql5="select sum(GOLD)/100 from CORPSETTLELOG where TIME>=%s and TIME<%s AND CHANNELID=%s AND USERID=0;" % (startTime, endTime, channelID)
channelCorpSettleTemp = db.execSql("IMDB", sql5)
if len(channelCorpSettleTemp)>0:
channelCorpSettle = channelCorpSettleTemp[0][0]
else:
channelCorpSettle = 0
#平台昨天结余人民币
sql7="select (CURRENTCHANNELGOLD-CHANNELRECVGOLD)/100 from %s where CHANNELID=%s ORDER BY OPTIME LIMIT 1;" % (coinTable, channelID)
channelYestodayCurTemp = db.execSql("JIESUANDB", sql7)
if len(channelYestodayCurTemp)>0:
channelYestodayCur = channelYestodayCurTemp[0][0]
else:
channelYestodayCur = 0
#平台今天结余人民币
sql8="select (CURRENTCHANNELGOLD)/100 from %s where CHANNELID=%s ORDER BY OPTIME DESC LIMIT 1;" % (coinTable, channelID)
channelTodayCurTemp = db.execSql("JIESUANDB", sql8)
if len(channelTodayCurTemp)>0:
channelTodayCur = channelTodayCurTemp[0][0]
else:
channelTodayCur = 0
#表演者实际结算数据
if channelTodayCur and channelYestodayCur:
channelCurSub = float(channelTodayCur) - float(channelYestodayCur)
else:
channelCurSub = 0
#平台结算差值
channelSub = channelCorpSettle - sumChannelCorpIncom
subName = ["平台核算", "平台结算人民币", "平台上次结余", "平台本次结余", "平台结余差额", "平台结算差值"]
channelInfoTemp.append(subName)
subValue = ["", channelCorpSettle, channelYestodayCur, channelTodayCur, channelCurSub, channelSub]
channelInfoTemp.append(subValue)
channelInfoDict[channelID] = channelInfoTemp
#每平台
def EveryChannel(startTime, endTime):
channelCorpList = MakeChannelCorpList("IMDB", startTime, endTime)
#no use channelsettlelist
#平台列表
#printResult(channelCorpList)
for channelID in channelCorpList:
MergerSingerList(startTime, endTime, channelID[0])
logging.info("channelID:%d is Deal", channelID[0])
channelOutIDDict = {}
singerOutIDDict = {}
channelOwnerDict = {}
channelInfoDict = {}
channelNoSignSingerInfoDict = {}
channelSingerWithdrawRecordDict = {}
def MakeList2Dict(t, d):
if type(t)==list or type(t)==tuple:
for row in t:
d[row[0]] = row[1]
def MakeChannelOwnerDict(t, d):
if type(t)==list or type(t)==tuple:
for row in t:
if d.has_key(row[0]):
value = d[row[0]]
else:
value = []
value.append(row[1])
d[row[0]] = value
def LoadData(timeSettle):
"""
if len(argv)>1:
timeSettle = time.strptime(argv[1], '%Y%m%d')
else:
print "Please enter the date."
exit()
"""
global db
global coinTable, goldTable
global channelOutIDDict, singerOutIDDict, channelOwnerDict, channelInfoDict
db = DBPool(cfgmap)
logging.info(" === load data start === ")
timeStr = time.strftime("%Y%m", timeSettle)
coinTable = "JIESUANTONGJI_ZONG_" + timeStr
goldTable = "JIESUANTONGJIGOLD_ZONG_" + timeStr
timeStamp = time.mktime(timeSettle)
timeStamp -= 28800
startTime = timeStamp
endTime = timeStamp + 86400
logging.info(" === connect DB start === ")
if not db.connect():
exit()
logging.info(" === connect DB complete === ")
channelOutIDList = MakeChannelOutIDList("IMDB", startTime, endTime)
MakeList2Dict(channelOutIDList, channelOutIDDict)
singerOutIDList = MakeSingerOutIDList("IMDB", startTime, endTime)
MakeList2Dict(singerOutIDList, singerOutIDDict)
channelOwnerList = MakeChannelOwnerList("IMDB", startTime, endTime)
MakeChannelOwnerDict(channelOwnerList, channelOwnerDict)
EveryChannel(startTime, endTime)
db.close()
logging.info(" === load data complete === ")
print "channel info (len:%s) | channel outid (len:%s) | owner (len:%s)" % (len(channelInfoDict), len(channelOutIDDict), len(channelOwnerDict))
return channelInfoDict
#db = DBPool(cfgmap)
#LoadData()
cat MakeExcel.py
#!/usr/bin/env python
# -*- coding: gbk -*-
# haoren @ 2017-08-24 07:07:37
from sys import argv
from logger import logging
import os
import time
import xlwt
import LoadData
import sys
#reload(sys)
#sys.setdefaultencoding('utf-8')
channelOwnerName = {
"69999" : "92公司",
"515" : "92公司",
"49338" : "98公司",
"51820" : "91公司",
"54577" : "91公司",
"55794" : "99公司-CC"'
"5685" : "92公司-秋寻",
"6040" : "91公司",
"6067" : "90公司",
"6395" : "997公司",
"63915" : "955公司",
"65935" : "92公司",
"75475" : "917公司",
"76141" : "91公司",
"78420" : "90公司",
"81538" : "99公司",
"8172" : "99公司",
"88909" : "95公司",
"87856" : "90公司",
"874" : "99公司",
"91486" : "60公司",
"91618" : "600公司",
"9108" : "99公司"
}
def WriteExcelDataOneSheet(excelHandler, name, data):
sheet = excelHandler.add_sheet(name, True)
tallStyle = xlwt.easyxf("font: height 250;")
cMax = 0
r = 0
for row in data:
#设置行高
sheet.row(r).set_style(tallStyle)
c = 0
for col in row:
try:
sheet.write(r, c, row[c])
except:
print r, c, row[c]
c += 1
r += 1
cMax = max(cMax, c)
#设置列宽
for cIdx in range(0, cMax):
sheet.col(cIdx).width = 4000
return True
def Data2Number(data):
r = 0
for row in data:
c = 0
for col in row:
try:
number = float(row[c])
data[r][c] = number
except ValueError:
data[r][c] = row[c]
c += 1
r += 1
return data
def MakeExcel():
if len(argv)>1:
timeSettle = time.strptime(argv[1], '%Y%m%d')
else:
print "Please enter the date."
exit()
runStartTime = time.time()
LoadData.LoadData(timeSettle)
print "====== make excel start ======"
curDir = os.getcwd() + "/month/gongsi/"
channelInfoDict = LoadData.channelInfoDict
channelOutIDDict = LoadData.channelOutIDDict
ownerDict = LoadData.channelOwnerDict
singerWithdrawRecordDict = LoadData.channelSingerWithdrawRecordDict
print "channel info (len:%s) | channel outid (len:%s) | owner (len:%s) | singer withdraw (len:%s)" % (len(channelInfoDict), len(channelOutIDDict), len(ownerDict), len(singerWithdrawRecordDict))
for owner in ownerDict:
ownerChannelIDList = ownerDict[owner]
#表演者结算
singerSum = 0
#平台结算
channelSum = 0
#表演者消费
sumSingerConsume = 0
#表演者守护
sumSingerGuardIncom = 0
#表演者非结算平台收入
sumSingerNoCorpIncom = 0
#表演者上次结余
sumSingerYestodayCur = 0
#表演者结算差值
sumSingerSub = 0
#平台上次结余
sumChannelYestodayCur = 0
channelList = []
NoSignSingerList = []
channelSingerWithdrawRecordList = []
channelList.append(["平台内部ID", "平台外部ID", "表演者结算人民币", "平台结算人民币"])
excelHandler = xlwt.Workbook(encoding="gbk")
for channelID in ownerChannelIDList:
print "channel(%s) in owner(%s)" % (channelID, owner)
if channelOutIDDict.has_key(channelID):
outID = channelOutIDDict[channelID]
else:
outID = channelID
if not channelInfoDict.has_key(channelID):
WriteExcelDataOneSheet(excelHandler, str(outID)+"平台明细", [[]])
continue
channelData = channelInfoDict[channelID]
Data2Number(channelData)
WriteExcelDataOneSheet(excelHandler, str(outID)+"平台明细", channelData)
#获取平台结算人民币和表演者结算人民币
singerGold = channelData[-3][2]
channelGold = channelData[-1][1]
singerSum += singerGold
channelSum += channelGold
#获取表演者消费
singerConsume = channelData[-3][8]
sumSingerConsume += singerConsume
#获取表演者守护
singerGuardIncom = channelData[-3][7]
sumSingerGuardIncom += singerGuardIncom
#获取表演者非结算平台收入
singerNoCorpIncom = channelData[-3][9]
sumSingerNoCorpIncom += singerNoCorpIncom
#获取表演者上次结余
singerYestodayCur = channelData[-3][10]
sumSingerYestodayCur += singerYestodayCur
#获取表演者结算差值
singerSub = channelData[-3][6]
sumSingerSub += singerSub
#获取平台上次结余
channelYestodayCur = channelData[-1][2]
sumChannelYestodayCur += channelYestodayCur
#加入相应的结算列表
channelList.append([channelID, outID, singerGold, channelGold])
for NoSignSingerInfo in LoadData.channelNoSignSingerInfoDict[channelID]:
NoSignSingerList.append(NoSignSingerInfo)
if singerWithdrawRecordDict.has_key(channelID):
channelSingerWithdrawRecordList += singerWithdrawRecordDict[channelID]
channelList.append(["人民币合计", "", singerSum, channelSum])
channelList.append(["劳务费合计(RMB)", "", singerSum/200, channelSum/200])
WriteExcelDataOneSheet(excelHandler, "平台结算汇总", channelList)
Data2Number(NoSignSingerList)
ownerGold = []
ownerGold.append(["公司化主播结算", singerSum/200])
ownerGold.append(["公司化平台结算", channelSum/200])
bonus = singerSum/0.4*0.05
ownerGold.append(["公司化平台补贴", bonus/200])
ownerGold.append(["公司化平台激励", 0])
ownerGold.append(["合计", (singerSum+channelSum+bonus)/200])
ownerGold.append([])
sumNoSignSingerIncom = 0
sumNoSignSingerGuardIncom = 0
ownerGold.append(["平台非签约表演者", "主播ID", "主播收入", "表演者守护"])
for NoSignSingerInfo in NoSignSingerList:
sumNoSignSingerIncom += NoSignSingerInfo[9]
sumNoSignSingerGuardIncom += NoSignSingerInfo[13]
ownerGold.append([NoSignSingerInfo[2], NoSignSingerInfo[7], NoSignSingerInfo[9], NoSignSingerInfo[13]])
ownerGold.append(["合计人民币", "", sumNoSignSingerIncom, sumNoSignSingerGuardIncom])
ownerGold.append(["合计RMB", "", sumNoSignSingerIncom/200, sumNoSignSingerGuardIncom/200])
ownerGold.append([])
ownerGold.append(["表演者消费", sumSingerConsume/200])
ownerGold.append(["守护反推1:4", (sumSingerGuardIncom/200)/0.3*0.1])
ownerGold.append(["表演者非结算平台收入", sumSingerNoCorpIncom/200])
ownerGold.append(["表演者上次结余", sumSingerYestodayCur/200])
ownerGold.append(["表演者结算差值", sumSingerSub/200])
ownerGold.append(["平台上次结余", sumChannelYestodayCur/200])
ownerGold.append(["未结算表演者收入", sumNoSignSingerIncom/200])
ownerGold.append(["未结算表演者守护", sumNoSignSingerGuardIncom/200])
ownerGold.append([])
formula = ( channelSum/200 - sumChannelYestodayCur/200 )/0.1*0.4 + sumSingerNoCorpIncom/200
singer = singerSum/200 + sumSingerConsume/200 + (sumSingerGuardIncom/200)/0.3*0.1 - sumSingerYestodayCur/200 + sumNoSignSingerIncom/200 + sumNoSignSingerGuardIncom/200
deviation = float(formula - singer)
ownerGold.append(["公式", formula])
ownerGold.append(["主播", singer])
ownerGold.append(["差值", deviation])
ownerGold.append([])
ownerGold += channelSingerWithdrawRecordList
WriteExcelDataOneSheet(excelHandler, "汇总", ownerGold)
if channelOwnerName.has_key(str(owner)):
ownerName = channelOwnerName[str(owner)] + "_" + str(owner)
else:
ownerName = str(owner)
fileName = curDir + ownerName + "_" + str(timeSettle.tm_mon) + "月" + ".xls"
print fileName
excelHandler.save(fileName)
print "====== make excel complete ======"
runEndTime = time.time()
print runEndTime-runStartTime
MakeExcel()
阅读(1420) | 评论(0) | 转发(0) |