rank_server.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #coding:utf-8
  2. import os
  3. import time
  4. import datetime
  5. import sys
  6. import django,json
  7. from django.db import connection
  8. from django.conf import settings
  9. sys.path.append('/mnt/wzbapi/src')
  10. os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
  11. django.setup()
  12. import common.models as cm
  13. import common.common_control as ccc
  14. import common.common_functions as ccf
  15. def rank_server():
  16. """
  17. """
  18. rcid = ccc.cache.rpop(settings.RANK_LIST)
  19. #rcid = 117904
  20. print rcid,99999999999999999
  21. record = cm.PlayerRecord.objects.filter(id=rcid).first()
  22. if record:
  23. match_id = int(record.match_id)
  24. match_group = int(record.match_group)
  25. stock_date = record.stock_date
  26. print match_id,match_group,stock_date
  27. if "15:00"<datetime.datetime.now().strftime("%H:%M") < "15:30":
  28. update_cache_rank(match_id,match_group,stock_date)
  29. else:
  30. update_cache_rank(match_id,match_group,stock_date)
  31. sync_group_rank(match_id,match_group,stock_date)
  32. #update_hot_seller(record)
  33. #更新胜率榜
  34. update_win_defend_rank(record)
  35. #更新最值
  36. update_player_latest(record)
  37. def update_win_defend_rank(record):
  38. """更新胜率防守榜
  39. """
  40. player_id = record.player_id
  41. match_id = record.match_id
  42. match_group = record.match_group
  43. user_id = record.user_id
  44. user_name = record.username
  45. today_fund = record.today_fund
  46. total_income = record.total_income
  47. zq = record.zq
  48. cw = record.cw
  49. df = record.df
  50. pz = record.pz
  51. player = cm.Player.objects.filter(id=player_id).first()
  52. if player:
  53. #胜率
  54. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
  55. win_rate = qset.filter(today_income__gt=0).count()/float(qset.count()) if qset else 0.0
  56. win_rate = round(win_rate,3)
  57. #最大回撤
  58. badest_income = qset.order_by("today_income").first().today_income
  59. badest_income = round(badest_income,3)
  60. #选手状态
  61. match_status = player.match_status
  62. #请假次数
  63. auto_complete = qset.filter(auto_complete__gt=0).count()
  64. obj,flag = cm.WinDefendRank.objects.get_or_create(
  65. user_id = user_id,
  66. player_id = player_id,
  67. match_id = match_id,
  68. match_group = match_group
  69. )
  70. obj.user_name = user_name
  71. obj.today_fund = today_fund
  72. obj.total_income = total_income
  73. obj.win_rate = win_rate
  74. obj.badest_income = badest_income
  75. obj.match_status = match_status
  76. obj.auto_complete = auto_complete
  77. obj.save()
  78. def update_cache_rank(match_id,match_group,stock_date):
  79. """更新redis排名数据
  80. """
  81. print "update cache rank..."
  82. delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
  83. del_keys = ccc.cache.keys(delkey)
  84. #if del_keys:
  85. # ccc.cache.delete(*del_keys)
  86. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  87. records = prset.values()
  88. case_id = " case id "
  89. cases = []
  90. where = []
  91. for index,pr in enumerate(prset):
  92. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  93. print(key)
  94. record = records[index]
  95. record.update({"group_rank":index+1})
  96. #ccc.cache.delete(key)
  97. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  98. ccc.pl.execute()
  99. def sync_group_rank(match_id,match_group,stock_date):
  100. """更新数据库排名数据
  101. """
  102. print "sync group rank..."
  103. delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
  104. del_keys = ccc.cache.keys(delkey)
  105. #if del_keys:
  106. # ccc.cache.delete(*del_keys)
  107. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  108. records = prset.values()
  109. case_id = " case id "
  110. cases = []
  111. where = []
  112. for index,pr in enumerate(prset):
  113. case = "WHEN %s THEN %s" % (pr.id,index+1)
  114. cases.append(case)
  115. where.append(str(pr.id))
  116. #
  117. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  118. record = records[index]
  119. record.update({"group_rank":index+1})
  120. #ccc.cache.delete(key)
  121. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  122. ccc.pl.execute()
  123. #同步数据库
  124. if cases and where:
  125. case = case_id + " ".join(cases)
  126. where = ",".join(where)
  127. sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
  128. cursor = connection.cursor()
  129. cursor.execute(sql)
  130. cursor.close()
  131. def update_hot_seller(record):
  132. """更新热门清仓
  133. """
  134. stock_date = record.stock_date
  135. stock_date_time = ccf.str_to_datetime(stock_date,"%Y-%m-%d")
  136. yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  137. #昨天所有持股id
  138. all_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True))
  139. all_stock_ids = list(set(all_stock_ids))
  140. for stock_id in all_stock_ids:
  141. print stock_date,stock_id
  142. stock = cm.Stock.objects.filter(id=stock_id).first()
  143. #昨天持股选手
  144. yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=stock_id).values_list("player_id",flat=True))
  145. #今天持股选手
  146. td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=stock_id).values_list("player_id",flat=True))
  147. if yes_players and td_players:
  148. #清仓选手
  149. sell_players = list(set(yes_players)-set(td_players))
  150. if sell_players:
  151. seller_ids = json.dumps(sell_players)
  152. count = len(sell_players)
  153. obj,flag = cm.HotStockSellCount.objects.get_or_create(
  154. stock_id = stock_id,
  155. stock_name = stock.name,
  156. stock_date = stock_date
  157. )
  158. obj.seller_ids = seller_ids
  159. obj.count = count
  160. obj.save()
  161. def update_player_latest(record):
  162. """更新选手最后一次数据
  163. """
  164. player_id=record.player_id
  165. match_id = record.match_id
  166. latest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date").first()
  167. if latest:
  168. key = "PLAYER_LATEST_{}".format(player_id)
  169. ccc.cache.hset(key,"stock_date",latest.stock_date)
  170. ccc.cache.hset(key,"match_id",latest.match_id)
  171. ccc.cache.hset(key,"match_group",latest.match_group)
  172. #更新胜率
  173. qset = cm.PlayerRecord.objects.filter(match_id=latest.match_id,player_id=latest.player_id)
  174. win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  175. win_rate = round(win_rate,3)
  176. ccc.cache.hset(key,"win_rate",win_rate)
  177. badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-today_income").first()
  178. if badest:
  179. key = "PLAYER_LATEST_{}".format(player_id)
  180. ccc.cache.hset(key,"badest_income",latest.today_income)
  181. if __name__ == "__main__":
  182. print "start update group rank..."
  183. while True:
  184. rank_server()
  185. time.sleep(1)