| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #coding:utf-8
- import os
- import time
- import datetime
- import sys
- import django,json
- from django.db import connection
- from django.conf import settings
- sys.path.append('/mnt/wzbapi/src')
- os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
- django.setup()
- import common.models as cm
- import common.common_control as ccc
- import common.common_functions as ccf
- def rank_server():
- """
- """
- rcid = ccc.cache.rpop(settings.RANK_LIST)
- #rcid = 117904
- print rcid,99999999999999999
- record = cm.PlayerRecord.objects.filter(id=rcid).first()
- if record:
- match_id = int(record.match_id)
- match_group = int(record.match_group)
- stock_date = record.stock_date
- print match_id,match_group,stock_date
- if "15:00"<datetime.datetime.now().strftime("%H:%M") < "15:30":
- update_cache_rank(match_id,match_group,stock_date)
- else:
- update_cache_rank(match_id,match_group,stock_date)
- sync_group_rank(match_id,match_group,stock_date)
- #update_hot_seller(record)
- #更新胜率榜
- update_win_defend_rank(record)
- #更新最值
- update_player_latest(record)
- def update_win_defend_rank(record):
- """更新胜率防守榜
- """
- player_id = record.player_id
- match_id = record.match_id
- match_group = record.match_group
- user_id = record.user_id
- user_name = record.username
- today_fund = record.today_fund
- total_income = record.total_income
- zq = record.zq
- cw = record.cw
- df = record.df
- pz = record.pz
-
- player = cm.Player.objects.filter(id=player_id).first()
- if player:
- #胜率
- qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
- win_rate = qset.filter(today_income__gt=0).count()/float(qset.count()) if qset else 0.0
- win_rate = round(win_rate,3)
- #最大回撤
- badest_income = qset.order_by("today_income").first().today_income
- badest_income = round(badest_income,3)
- #选手状态
- match_status = player.match_status
- #请假次数
- auto_complete = qset.filter(auto_complete__gt=0).count()
- obj,flag = cm.WinDefendRank.objects.get_or_create(
- user_id = user_id,
- player_id = player_id,
- match_id = match_id,
- match_group = match_group
- )
- obj.user_name = user_name
- obj.today_fund = today_fund
- obj.total_income = total_income
- obj.win_rate = win_rate
- obj.badest_income = badest_income
- obj.match_status = match_status
- obj.auto_complete = auto_complete
- obj.save()
- def update_cache_rank(match_id,match_group,stock_date):
- """更新redis排名数据
- """
- print "update cache rank..."
- delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
- del_keys = ccc.cache.keys(delkey)
- #if del_keys:
- # ccc.cache.delete(*del_keys)
- prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
- records = prset.values()
- case_id = " case id "
- cases = []
- where = []
- for index,pr in enumerate(prset):
- key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
- print(key)
- record = records[index]
- record.update({"group_rank":index+1})
- #ccc.cache.delete(key)
- ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
- ccc.pl.execute()
- def sync_group_rank(match_id,match_group,stock_date):
- """更新数据库排名数据
- """
- print "sync group rank..."
- delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
- del_keys = ccc.cache.keys(delkey)
- #if del_keys:
- # ccc.cache.delete(*del_keys)
- prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
- records = prset.values()
- case_id = " case id "
- cases = []
- where = []
- for index,pr in enumerate(prset):
- case = "WHEN %s THEN %s" % (pr.id,index+1)
- cases.append(case)
- where.append(str(pr.id))
- #
- key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
- record = records[index]
- record.update({"group_rank":index+1})
- #ccc.cache.delete(key)
- ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
- ccc.pl.execute()
- #同步数据库
- if cases and where:
- case = case_id + " ".join(cases)
- where = ",".join(where)
- sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
- cursor = connection.cursor()
- cursor.execute(sql)
- cursor.close()
- def update_hot_seller(record):
- """更新热门清仓
- """
- stock_date = record.stock_date
- stock_date_time = ccf.str_to_datetime(stock_date,"%Y-%m-%d")
- yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
- #昨天所有持股id
- all_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True))
- all_stock_ids = list(set(all_stock_ids))
- for stock_id in all_stock_ids:
- print stock_date,stock_id
- stock = cm.Stock.objects.filter(id=stock_id).first()
- #昨天持股选手
- yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=stock_id).values_list("player_id",flat=True))
- #今天持股选手
- td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=stock_id).values_list("player_id",flat=True))
- if yes_players and td_players:
- #清仓选手
- sell_players = list(set(yes_players)-set(td_players))
- if sell_players:
- seller_ids = json.dumps(sell_players)
- count = len(sell_players)
- obj,flag = cm.HotStockSellCount.objects.get_or_create(
- stock_id = stock_id,
- stock_name = stock.name,
- stock_date = stock_date
- )
- obj.seller_ids = seller_ids
- obj.count = count
- obj.save()
- def update_player_latest(record):
- """更新选手最后一次数据
- """
- player_id=record.player_id
- match_id = record.match_id
- latest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date").first()
- if latest:
- key = "PLAYER_LATEST_{}".format(player_id)
- ccc.cache.hset(key,"stock_date",latest.stock_date)
- ccc.cache.hset(key,"match_id",latest.match_id)
- ccc.cache.hset(key,"match_group",latest.match_group)
- #更新胜率
- qset = cm.PlayerRecord.objects.filter(match_id=latest.match_id,player_id=latest.player_id)
- win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
- win_rate = round(win_rate,3)
- ccc.cache.hset(key,"win_rate",win_rate)
- badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-today_income").first()
- if badest:
- key = "PLAYER_LATEST_{}".format(player_id)
- ccc.cache.hset(key,"badest_income",latest.today_income)
- if __name__ == "__main__":
- print "start update group rank..."
- while True:
- rank_server()
- time.sleep(1)
|