controls.py 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214
  1. #coding=utf-8
  2. '''
  3. '''
  4. import os,re,random
  5. import json,time,datetime
  6. import shutil
  7. import tempfile
  8. import zipfile
  9. from docxtpl import DocxTemplate,InlineImage
  10. from docx.shared import Mm
  11. from django.db import transaction
  12. from django.conf import settings
  13. import common.models as cm
  14. import common.error_info as ce
  15. import common.common_functions as ccf
  16. import common.common_control as ccc
  17. import account.password_handle as ph
  18. from utils.exceltool import ExcelTool
  19. from utils.jgpush import send_notification_by_registration_ids
  20. import wzhifuSDK as wxpay
  21. from utils.exceltool import ExcelTool
  22. from utils.qrcodetool import gen_general_qrcode
  23. from django.db.models import Q,Sum,Count,F
  24. from PIL import Image
  25. from PIL import Image,ImageDraw,ImageFont
  26. from django.db import transaction
  27. from threading import Thread
  28. #from django.core.cache import cache
  29. from django.db import connection
  30. import calendar
  31. import xlrd
  32. import xlwt
  33. from xlutils.copy import copy
  34. from xltpl.writer import BookWriter
  35. from django_redis import get_redis_connection
  36. from constants import *
  37. from utils.aliyun_sms import send_verify_code
  38. def async(f):
  39. def wrapper(*args, **kwargs):
  40. thr = Thread(target=f, args=args, kwargs=kwargs)
  41. thr.start()
  42. return wrapper
  43. def get_today_date():
  44. #return '2021-12-31'
  45. if datetime.datetime.now().strftime("%H:%M") < "15:00":
  46. if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
  47. today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
  48. else:
  49. if datetime.datetime.now().weekday()==0:
  50. today = (datetime.datetime.now()-datetime.timedelta(days=3)).strftime("%Y-%m-%d")
  51. else:
  52. today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  53. else:
  54. if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
  55. today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
  56. else:
  57. today = datetime.datetime.now().strftime("%Y-%m-%d")
  58. return today
  59. #return '2021-11-05'
  60. #@async
  61. def update_group_rank(match_id,match_group,stock_date):
  62. #return
  63. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  64. records = prset.values()
  65. case_id = " case id "
  66. cases = []
  67. where = []
  68. for index,pr in enumerate(prset):
  69. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  70. record = records[index]
  71. record.update({"group_rank":index+1})
  72. ccc.cache.delete(key)
  73. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  74. ccc.pl.execute()
  75. #@ccc.cache_data()
  76. def get_notices():
  77. """
  78. """
  79. notices = list(cm.Article.objects.filter(status=2,type="notice").values())
  80. return notices
  81. def get_index_data(request):
  82. """首页数据
  83. """
  84. player = request.player
  85. if not player:
  86. raise ce.TipException(u"该账号未参加任何赛事!")
  87. player_id = player.id
  88. match_id = player.match_id
  89. match_group = player.match_group
  90. #if datetime.datetime.now().hour < 15:
  91. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  92. #else:
  93. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  94. today = get_today_date()
  95. match_name = get_match_info(match_id).get("name")
  96. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id)
  97. if records_set:
  98. try:
  99. cur_rank = get_today_record(player_id,match_id,match_group,today).get("group_rank","")
  100. records = list(records_set.order_by("-stock_date").values())
  101. except:
  102. cur_rank = 0
  103. records = []
  104. else:
  105. cur_rank = 0
  106. records = []
  107. for item in records:
  108. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  109. today_stock = filter(lambda x:x["name"],today_stock)
  110. item["today_stock"] = today_stock
  111. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  112. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  113. yesterday_stock = filter(lambda x:x["name"],yesterday_stock)
  114. item["yesterday_stock"] = yesterday_stock
  115. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  116. item["today_income"] = "{}%".format(item["today_income"]*100)
  117. item["total_income"] = "{}%".format(item["total_income"]*100)
  118. #通知
  119. notices = get_notices()
  120. ret = {"match_name":match_name,"cur_rank":cur_rank,"records":records,"notices":notices}
  121. return ret
  122. def get_player_match_list(request):
  123. """选手参赛列表数据
  124. """
  125. uid = request.user.id
  126. now_str = datetime.datetime.now().strftime("%Y-%m-%d")
  127. cur_match_id = ccc.get_cur_match().id
  128. match_ids = list(cm.Player.objects.filter(user_id=uid).values_list("match_id",flat=True))
  129. matchs = list(cm.Match.objects.filter(id__in=match_ids).values())
  130. for item in matchs:
  131. player = cm.Player.objects.filter(user_id=uid,match_id=item["id"]).first()
  132. item["player_id"] = player.id if player else 0
  133. return matchs
  134. def get_group_income(match_id,match_group):
  135. """
  136. """
  137. data = []
  138. today = datetime.datetime.now().strftime("%Y-%m-%d")
  139. player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
  140. for player_id in player_ids:
  141. today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today).first()
  142. if today_record:
  143. data.append(today_record.total_income)
  144. data = list(set(data))
  145. data = sorted(data,key=lambda x:x,reverse=True)
  146. return data
  147. def get_player_match_detail(request):
  148. """选手参赛详情数据
  149. """
  150. qdata = request.json
  151. player_id = request.player.id
  152. user_id = request.player.user_id
  153. org_player_id = request.player.id
  154. match_group = request.player.match_group
  155. match_id = qdata.get("id")
  156. record_id = qdata.get("record_id")
  157. userinfo = {}
  158. cur_user_id = user_id
  159. cur_player_id = qdata.get("player_id")
  160. if not cur_player_id:
  161. cur_player_id = player_id
  162. ismine = True if int(cur_player_id) == player_id else False
  163. if not match_id:
  164. player = cm.Player.objects.filter(id=cur_player_id).first()
  165. match_id =player.match_id
  166. cur_user_id = player.user_id
  167. if record_id:
  168. records_set = cm.PlayerRecord.objects.filter(id=record_id)
  169. if records_set:
  170. match_id = records_set.first().match_id
  171. match_group = records_set.first().match_group
  172. player_id = records_set.first().player_id
  173. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  174. else:
  175. if qdata.get("player_id"):
  176. player_id = qdata.get("player_id")
  177. match_group = cm.Player.objects.filter(id=player_id).first().match_group
  178. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  179. match = cm.Match.objects.filter(id=match_id).values().first()
  180. groups = list(cm.MatchGroup.objects.filter(match_id=match_id).values_list("name",flat=True))
  181. match["groups"] = groups
  182. if records_set:
  183. records = list(records_set.values())
  184. else:
  185. records = []
  186. for item in records:
  187. item["today_stock"] = json.loads(item["today_stock"]) if item["today_stock"] else []
  188. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  189. item["yesterday_stock"] = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  190. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  191. item["today_income"] = "{}%".format(item["today_income"]*100)
  192. item["total_income"] = "{}%".format(item["total_income"]*100)
  193. today = get_today_date()
  194. today_record = {}
  195. if records_set.first():
  196. today = records_set.first().stock_date
  197. #today_record = get_today_record(player_id,int(match_id),int(match_group),today)
  198. #if not today_record:
  199. # today_record = get_today_record_actual(player_id,match_id,today)
  200. if ismine:
  201. today_record = get_today_record_actual(player_id,match_id,match_group,today)
  202. else:
  203. today_record = get_today_record(player_id,int(match_id),int(match_group),today)
  204. if today_record:
  205. today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
  206. today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
  207. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  208. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  209. today_record["match_group_name"] = cm.MatchGroup.objects.filter(id=today_record["match_group"]).first().name
  210. today_record["players_num"] = cm.Player.objects.filter(match_group=today_record["match_group"]).count()
  211. today_record["win_rate"] = calc_win_rate(player_id,today_record["match_id"])
  212. badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("today_income").first()
  213. if badest:
  214. today_record["badest_income"] = "{}%".format(badest.today_income*100)
  215. today_record["today_stock_total"] = round(today_record["today_stock_total"],4)
  216. userinfo = get_user_info(today_record["user_id"])
  217. today_record["style"] = userinfo.get("style")
  218. if not today_record:
  219. player_info = get_player_info(cur_player_id)
  220. today_record = {}
  221. today_record["stock_date"] = today
  222. today_record.update(player_info)
  223. today_record["player_id"] = player_info["id"]
  224. today_record["avatar"] = get_user_info(player_info["user_id"])["avatar"]
  225. userinfo = get_user_info(today_record["user_id"])
  226. today_record["style"] = userinfo.get("style")
  227. match["groups"] = [today_record["match_group_name"]] if today_record else []
  228. records = sorted(records,key=lambda x:x["stock_date"],reverse=True)
  229. if cm.UserFollows.objects.filter(user_id=org_player_id,follow_id=player_id).exists():
  230. is_follow = 1
  231. else:
  232. is_follow = 0
  233. if today_record and today_record.get("today_fund"):
  234. today_record["today_income_fund"] = round((today_record["today_fund"] - today_record["yesterday_fund"]),2)*10000 if today_record["yesterday_fund"] else 0.00
  235. ret = {
  236. "match":match,
  237. "today_record":today_record,
  238. "userinfo":get_user_info(cur_user_id),
  239. "records":records,
  240. "is_follow":is_follow,
  241. "fans":cm.UserFollows.objects.filter(follow_id=player_id).count(),
  242. "followers":cm.UserFollows.objects.filter(user_id=player_id).count(),
  243. "stock_age":datetime.datetime.now().year - int(userinfo.get("join_time")) if userinfo.get("join_time") else 0,
  244. "stock_follow":list(cm.UserChoice.objects.filter(player_id=cur_player_id).values_list("stock_name",flat=True))
  245. }
  246. return ret
  247. def get_today_record(player_id,match_id,match_group,today):
  248. """
  249. """
  250. key = "%s_%s_%s_%s" % (player_id,match_id,match_group,today)
  251. today_record = ccc.cache.get(key)
  252. today_record = json.loads(today_record) if today_record else {}
  253. try:
  254. if today_record:
  255. user_info = get_user_info(today_record["user_id"])
  256. if user_info:
  257. user_info.pop("id")
  258. today_record.update(user_info)
  259. #仓位
  260. today_stock_total = 0
  261. today_stock = json.loads(today_record["today_stock"])
  262. for ts in today_stock:
  263. if ts["fund"]:
  264. try:
  265. today_stock_total += float(ts["fund"])
  266. except Exception as e:
  267. print e
  268. today_record["cangwei"] = "{}%".format(round(today_stock_total/today_record["today_fund"],4)*100)
  269. today_record["today_stock_total"] = today_stock_total
  270. except Exception as e:
  271. import traceback
  272. traceback.print_exc()
  273. return today_record
  274. def get_today_record_actual(player_id,match_id,match_group,today=None):
  275. """
  276. """
  277. if today:
  278. qset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today)
  279. else:
  280. qset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id).order_by("-stock_date")
  281. today_record = qset.values().first()
  282. print(player_id,match_id,match_group,today,4444444444444444444)
  283. print(today_record,1111111111)
  284. if today_record:
  285. user_info = get_user_info(today_record["user_id"])
  286. if user_info:
  287. user_info.pop("id")
  288. today_record.update(user_info)
  289. #仓位
  290. today_stock_total = 0
  291. today_stock = json.loads(today_record["today_stock"])
  292. for ts in today_stock:
  293. if ts["fund"]:
  294. try:
  295. today_stock_total += float(ts["fund"])
  296. except Exception as e:
  297. print e
  298. today_record["cangwei"] = "{}%".format(round(today_stock_total/today_record["today_fund"],4)*100)
  299. today_record["today_stock_total"] = today_stock_total
  300. return today_record
  301. @ccc.cache_data()
  302. def get_match_group_players(match_id,match_group):
  303. players = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values())
  304. return players
  305. @ccc.cache_data()
  306. def get_match_groups(match_id):
  307. """
  308. """
  309. match = cm.Match.objects.filter(id=match_id).values().first()
  310. groups = list(cm.MatchGroup.objects.filter(match_id=match_id,is_active=1).order_by("order").values())
  311. #groups = list(cm.MatchGroup.objects.filter(match_id=match_id).values())
  312. return match,groups
  313. #@ccc.cache_data()
  314. def get_cache_rank_list(player_id,match_id,today):
  315. """
  316. """
  317. match,groups = get_match_groups(match_id)
  318. #groups = sorted(groups,key=lambda x:x["id"])
  319. #if datetime.datetime.now().hour < 15:
  320. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  321. #else:
  322. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  323. data = []
  324. for item in groups:
  325. new_players = []
  326. players = get_match_group_players(match_id,item["id"])
  327. win_count = 0
  328. loss_count = 0
  329. for player in players:
  330. user_id = player["user_id"]
  331. user = get_user_info(user_id)
  332. username = user["username"] if user else ""
  333. player_id = player["id"]
  334. match_group = item["id"]
  335. today_record = get_today_record(player_id,match_id,match_group,today)
  336. if today_record:
  337. player.update(today_record)
  338. player["username"] = username
  339. player["org_today_income"] = player["today_income"]
  340. player["org_total_income"] = player["total_income"]
  341. player["total_income"] = "{}%".format(today_record["total_income"]*100)
  342. player["today_income"] = "{}%".format(today_record["today_income"]*100)
  343. if player["org_today_income"] >= 0.05:
  344. win_count += 1
  345. if player["org_today_income"] <= -0.05:
  346. loss_count += 1
  347. try:
  348. player["fund"] = round(player["fund"],4) if player["fund"] else 0.0
  349. player["init_fund"] = round(player["init_fund"],4)
  350. player["fund"] = round(player["init_fund"],4)
  351. player["today_fund"] = round(player["today_fund"],4)
  352. new_players.append(player)
  353. except Exception as e:
  354. print player
  355. pass
  356. #win_count = filter(lambda x:x["org_today_income"]>=0.05,new_players)
  357. #loss_count = filter(lambda x:x["org_today_income"]<=-0.05,new_players)
  358. new_players_sort = list(sorted(new_players,key=lambda x:x["org_total_income"],reverse=True))
  359. #new_players_sort = new_players
  360. item["players_num"] = len(players)
  361. #item["win_count"] = len(win_count)
  362. #item["loss_count"] = len(loss_count)
  363. item["win_count"] = win_count
  364. item["loss_count"] = loss_count
  365. item["players"] = new_players_sort[:3]
  366. data.append(item)
  367. return match,data
  368. def get_rank_list(request):
  369. """排名列表
  370. """
  371. qdata = request.json
  372. player_id = request.player.id
  373. match_id = qdata.get("match_id")
  374. today = qdata.get("stock_date")
  375. if not today:
  376. today = get_today_date()
  377. match,groups = get_cache_rank_list(player_id,match_id,today)
  378. ret = {"match":match,"groups":groups}
  379. return ret
  380. @ccc.cache_data()
  381. def get_user_info(uid):
  382. user = cm.UserInfo.objects.filter(id=uid).values().first()
  383. if user:
  384. user["style"] = []
  385. if user["zq"]:
  386. user["style"].append(user["zq"])
  387. if user["cw"]:
  388. user["style"].append(user["cw"])
  389. if user["df"]:
  390. user["style"].append(user["df"])
  391. return user
  392. #@ccc.cache_data()
  393. def get_player_info(player_id):
  394. player = cm.Player.objects.filter(id=player_id).values().first()
  395. return player
  396. @ccc.cache_data()
  397. def get_match_info(match_id):
  398. match = cm.Match.objects.filter(id=match_id).values().first()
  399. return match
  400. @ccc.cache_data()
  401. def get_group_info(group_id):
  402. group = cm.MatchGroup.objects.filter(id=group_id).values().first()
  403. group["players_num"] = cm.Player.objects.filter(match_group=group["id"]).count()
  404. return group
  405. def get_group_rank_list(request):
  406. """排名列表
  407. """
  408. qdata = request.json
  409. kwargs = qdata
  410. group_id = qdata.get("id")
  411. player_id = request.player.id
  412. match_id = request.player.match_id
  413. match_id = qdata.get("match_id")
  414. match_id = cm.MatchGroup.objects.filter(id=group_id).first().match_id
  415. today = qdata.get("stock_date")
  416. if not today:
  417. today = get_today_date()
  418. match = get_match_info(match_id)
  419. group = get_group_info(group_id)
  420. players = get_match_group_players(match_id,group_id)
  421. print(match_id,group_id)
  422. print(len(players))
  423. new_players = []
  424. for player in players:
  425. user_id = player["user_id"]
  426. user = get_user_info(user_id)
  427. username = user["username"] if user else ""
  428. player_id = player["id"]
  429. match_group = group_id
  430. today_record = get_today_record(player_id,match_id,int(match_group),today)
  431. if today_record:
  432. player.update(today_record)
  433. player["username"] = username
  434. player["org_today_income"] = player["today_income"]
  435. player["org_total_income"] = player["total_income"]
  436. player["total_income"] = "{}%".format(player["total_income"]*100)
  437. player["today_income"] = "{}%".format(player["today_income"]*100)
  438. player["fund"] = round(player["fund"],4)
  439. player["init_fund"] = round(player["init_fund"],4)
  440. player["today_fund"] = round(player["today_fund"],4)
  441. new_players.append(player)
  442. if kwargs.get("order_by") == "today_income__asc":
  443. new_players = sorted(new_players,key=lambda x:x["org_today_income"])
  444. elif kwargs.get("order_by") == "today_income__desc" :
  445. new_players = sorted(new_players,key=lambda x:x["org_today_income"],reverse=True)
  446. elif kwargs.get("order_by") == "total_income__asc":
  447. new_players = sorted(new_players,key=lambda x:x["org_total_income"])
  448. elif kwargs.get("order_by") == "total_income__desc":
  449. new_players = sorted(new_players,key=lambda x:x["org_total_income"],reverse=True)
  450. else:
  451. new_players = sorted(new_players,key=lambda x:x["org_total_income"],reverse=True)
  452. #new_players = []
  453. #分页
  454. page = int(kwargs.get("page",0))
  455. page_size = int(kwargs.get("page_size",50))
  456. #page_size = 50
  457. if page and page_size:
  458. total,new_players = ccf.get_page_list(new_players,page,page_size)
  459. else:
  460. total = len(new_players)
  461. #应到、实到、请假人数
  462. total_person = cm.Player.objects.filter(match_group=group_id,match_status=1).count()
  463. actual_person = cm.PlayerRecord.objects.filter(match_group=group_id,stock_date=today).count()
  464. leave_person = total_person - actual_person
  465. win_person = cm.PlayerRecord.objects.filter(match_group=group_id,stock_date=today,total_income__gte=0).count()
  466. loss_person = cm.PlayerRecord.objects.filter(match_group=group_id,stock_date=today,total_income__lt=0).count()
  467. ret = {"group":group,"players":new_players,"total":total,"total_person":total_person,
  468. "actual_person":actual_person,"leave_person":leave_person,"win_person":win_person,"loss_person":loss_person}
  469. return ret
  470. def get_player_match_records(request):
  471. """选手参赛每日持股
  472. """
  473. qdata = request.json
  474. player_id = request.player.id
  475. match_id = qdata.get("id")
  476. q_player_id = qdata.get("player_id")
  477. if q_player_id:
  478. player_id = q_player_id
  479. page = int(qdata.get("page",0))
  480. page_size = int(qdata.get("page_size",20))
  481. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  482. data = list(records_set.values())
  483. for item in data:
  484. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  485. today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
  486. item["today_stock"] = today_stock
  487. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  488. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  489. yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
  490. item["yesterday_stock"] = yesterday_stock
  491. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  492. item["today_income"] = "{}%".format(item["today_income"]*100)
  493. item["total_income"] = "{}%".format(item["total_income"]*100)
  494. item["zans_count"] = item.get("zans",0)
  495. item["comments_count"] = cm.Comments.objects.filter(player_id=item.get("id",0)).count()
  496. if page and page_size:
  497. total,data = ccf.get_page_list(data,page,page_size)
  498. return total,data
  499. else:
  500. return len(data),data
  501. def add_model(cls,**kwargs):
  502. """
  503. """
  504. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  505. model = getattr(cm,model_name)
  506. if model_name == "Match":
  507. name = kwargs.get("name")
  508. if cm.Match.objects.filter(name=name).exists():
  509. raise ce.TipException(u"比赛名称重复!")
  510. if model_name == "MatchGoup":
  511. name = kwargs.get("name")
  512. match_id = kwargs.get("match_id")
  513. if cm.MatchGroup.objects.filter(name=name,match_id=match_id).exists():
  514. raise ce.TipException(u"分组名称重复!")
  515. if model_name == "Player":
  516. user_id = kwargs.get("user_id")
  517. match_id = kwargs.get("match_id")
  518. if cm.Player.objects.filter(user_id=user_id,match_id=match_id).exists():
  519. raise ce.TipException(u"重复添加选手!")
  520. if model_name == "PlayerRecord":
  521. now = datetime.datetime.now()
  522. match_id = kwargs.get("match_id")
  523. if now.weekday() in [5,6] or not now.strftime("%Y-%m-%d") in get_match_validdates(match_id):
  524. raise ce.TipException(u"今日不能提交数据!")
  525. now_time = datetime.datetime.now().strftime("%H:%S")
  526. if now_time<"15:00" or now_time > "23:50":
  527. raise ce.TipException(u"当日数据请在当日15:00以后23:50以前提交数据!")
  528. match_id = kwargs.get("match_id")
  529. stock_date = kwargs.get("stock_date")
  530. #stock_date = "2022-04-26"
  531. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  532. today_stock = json.dumps(kwargs.get("today_stock"))
  533. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  534. player_id = kwargs.get("player_id")
  535. today_fund = float(kwargs.get("today_fund",0))
  536. is_markt = int(kwargs.get("is_markt",0))
  537. experience = kwargs.get("experience")
  538. if not ccc.get_cur_match().id == match_id:
  539. raise ce.TipException(u"非当前赛事参赛选手不能提交作业!")
  540. #计算今日和昨日盈亏
  541. if float(today_fund)>9999 or float(today_fund)<=0:
  542. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  543. player = cm.Player.objects.filter(id=player_id).first()
  544. #if player.fund <= 0:
  545. # raise ce.TipException(u"请先输入您的初始资金后再提交数据!")
  546. user_id = player.user_id
  547. init_fund = player.fund
  548. user = cm.UserInfo.objects.filter(id=user_id).first()
  549. username = user.username
  550. usercode = user.usercode
  551. match_group = player.match_group
  552. zq = user.zq
  553. cw = user.cw
  554. df = user.df
  555. badge = player.badge
  556. match = cm.Match.objects.filter(id=match_id).first()
  557. if player.match_status < 1:
  558. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  559. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  560. if match.end_time < now_date:
  561. raise ce.TipException(u"该比赛已结束或您未参加此次比赛不能提交数据!")
  562. #cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).delete()
  563. #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  564. #yesterday = cm.PlayerRecord.objects.filter(
  565. # match_id=match_id,player_id=player_id).exclude(stock_date=stock_date).order_by("-stock_date").first()
  566. validdates = get_match_validdates(match_id)
  567. today_index = validdates.index(stock_date)
  568. yesterday_index = today_index -1 if today_index >=1 else 0
  569. yesterday_date = validdates[yesterday_index]
  570. yesterday = cm.PlayerRecord.objects.filter(
  571. match_id=match_id,player_id=player_id,stock_date=yesterday_date).exclude(stock_date=stock_date).first()
  572. if yesterday:
  573. yesterday_fund = yesterday.today_fund
  574. yesterday_stock = yesterday.today_stock
  575. yesterday_stock_img = yesterday.today_stock_img
  576. yesterday_is_markt = yesterday.is_markt
  577. else:
  578. #yesterday_fund = init_fund #today_fund
  579. yesterday_fund = today_fund
  580. yesterday_stock = ""
  581. yesterday_stock_img = ""
  582. yesterday_is_markt = 0
  583. if not cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id).exists():
  584. init_fund = today_fund
  585. cm.Player.objects.filter(id=player_id).update(fund=today_fund)
  586. with transaction.atomic():
  587. #记录持股情况
  588. new_stock_list = []
  589. today_stock_list = json.loads(today_stock)
  590. for ts in today_stock_list:
  591. if ts["name"]:
  592. stock,flag = cm.Stock.objects.get_or_create(
  593. name = ts["name"]
  594. )
  595. stock_id = stock.id
  596. usobj,flag = cm.UserStock.objects.get_or_create(
  597. player_id = player_id,
  598. stock_id = stock_id,
  599. stock_name = ts["name"],
  600. stock_date = stock_date
  601. )
  602. ts["stock_id"] = stock_id
  603. new_stock_list.append(ts)
  604. today_stock = json.dumps(new_stock_list)
  605. obj,flag = cm.PlayerRecord.objects.get_or_create(
  606. player_id=player_id,
  607. match_id=match_id,
  608. stock_date=stock_date)
  609. obj.init_fund = init_fund
  610. obj.yesterday_fund = yesterday_fund
  611. obj.yesterday_stock = yesterday_stock
  612. obj.yesterday_stock_img = yesterday_stock_img
  613. obj.today_fund = today_fund
  614. obj.today_stock = today_stock
  615. obj.today_stock_img = today_stock_img
  616. obj.user_id = user_id
  617. obj.username = username
  618. obj.usercode = usercode
  619. obj.match_group = match_group
  620. obj.is_markt = is_markt
  621. obj.yesterday_is_markt = yesterday_is_markt
  622. obj.zq = zq
  623. obj.cw = cw
  624. obj.df = df
  625. obj.badge = badge
  626. obj.experience = experience
  627. #计算今日和昨日盈亏
  628. if float(today_fund)>9999 or float(today_fund)<=0:
  629. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  630. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  631. total_income = (today_fund - init_fund)/float(init_fund)
  632. if float(today_income)>0.4:
  633. raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系顽主!")
  634. if float(total_income)>8:
  635. raise ce.TipException(u"请仔细核对数据或直接联系顽主!")
  636. obj.today_income = round(today_income,4)
  637. obj.total_income = round(total_income,4)
  638. #obj.today_income = 0
  639. #obj.total_income = 0
  640. if not flag:
  641. obj.ctime = datetime.datetime.now()
  642. obj.save()
  643. #更新股票持股人数
  644. for stock in new_stock_list:
  645. cm.Stock.objects.filter(id=stock["stock_id"]).update(user_num=F("user_num")+1)
  646. #更新group_rank
  647. ccc.cache.lpush(settings.RANK_LIST,obj.id)
  648. return obj.id
  649. obj = model.objects.create(**kwargs)
  650. return obj.id
  651. def update_model(cls,**kwargs):
  652. """
  653. """
  654. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  655. model = getattr(cm,model_name)
  656. id = kwargs.pop("id")
  657. rst = model.objects.filter(id=id).update(**kwargs)
  658. if model_name == "Match":
  659. for item in kwargs.get("groups").split(","):
  660. cm.MatchGroup.objects.get_or_create(match_id=obj.id,name=item)
  661. return rst
  662. def delete_model(cls,**kwargs):
  663. """
  664. """
  665. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  666. model = getattr(cm,model_name)
  667. ids = str(kwargs.get("id")).split(",")
  668. rst = model.objects.filter(id__in=ids).delete()
  669. return ids
  670. def get_search_list(cls,**kwargs):
  671. """
  672. """
  673. model_name = re.search(r'.*\.(\w+)SearchView',str(cls.__class__)).groups()[0]
  674. model = getattr(cm,model_name)
  675. qset = model.objects.all()
  676. if model_name == "Stock":
  677. if kwargs.get("name"):
  678. qset = qset.filter(Q(name__icontains=kwargs.get("name"))|Q(code__icontains=kwargs.get("name")))
  679. else:
  680. if kwargs.get("name"):
  681. qset = qset.filter(name__icontains=kwargs.get("name"))
  682. if model_name == "Player":
  683. data = list(qset.values("id","username"))
  684. if model_name == "Stock":
  685. qset = qset.filter(code__isnull=False)
  686. data = list(qset.values("id","name","code"))
  687. for item in data:
  688. if item["code"]:
  689. item["label"] = "%s(%s)" % (item["name"],item["code"])
  690. else:
  691. item["label"] = "%s" % item["name"]
  692. else:
  693. data = list(qset.values("id","name"))
  694. return data
  695. def get_detail_info(cls,**kwargs):
  696. """
  697. """
  698. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  699. model = getattr(cm,model_name)
  700. id = kwargs.get("id")
  701. rst = list(model.objects.filter(id=id).values())
  702. rst = rst[0] if rst else {}
  703. if model_name == "Article":
  704. rst["ctime"] = ccf.datetime_to_str(rst["ctime"],"%Y-%m-%d")
  705. if model_name == "Stock":
  706. rst["choiced"] = cm.UserChoice.objects.filter(player_id=kwargs.get("player_id"),stock_id=rst["id"]).count()
  707. return rst
  708. #@ccc.cache_data()
  709. def get_record_info(rcid):
  710. """
  711. """
  712. rst = cm.PlayerRecord.objects.filter(id=rcid).values().first()
  713. if rst:
  714. rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
  715. today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  716. today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
  717. rst["today_stock"] = today_stock
  718. today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  719. rst["today_stock_img"] = today_stock_img
  720. yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  721. yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
  722. rst["yesterday_stock"] = yesterday_stock
  723. yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  724. rst["yesterday_stock_img"] = yesterday_stock_img
  725. rst["today_income"] = "{}%".format(rst["today_income"]*100)
  726. rst["total_income"] = "{}%".format(rst["total_income"]*100)
  727. return rst
  728. def get_list_info(cls,**kwargs):
  729. """
  730. """
  731. model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
  732. model = getattr(cm,model_name)
  733. qset = model.objects.all()
  734. if kwargs.get("name"):
  735. qset = qset.filter(name__icontains=kwargs.get("name"))
  736. if model_name == "UserInfo":
  737. if kwargs.get("username"):
  738. qset = qset.filter(username__icontains=kwargs.get("username"))
  739. if kwargs.get("usercode"):
  740. qset = qset.filter(usercode=kwargs.get("usercode"))
  741. data = list(qset.order_by("-id").values())
  742. page = int(kwargs.get("page",0))
  743. page_size = int(kwargs.get("page_size",20))
  744. if page and page_size:
  745. total,data = ccf.get_page_list(data,page,page_size)
  746. if model_name == "Player":
  747. for item in data:
  748. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  749. match = cm.Match.objects.filter(id=item["match_id"]).first()
  750. item["username"] = user.username
  751. item["usercode"] = user.usercode
  752. item["match_name"] = match.name if match else ""
  753. return (total,data)
  754. else:
  755. return len(data),data
  756. return rst
  757. def add_player_record_single(**kwargs):
  758. """用户单独上传数据
  759. """
  760. return None
  761. now = datetime.datetime.now()
  762. if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
  763. raise ce.TipException(u"今日不能提交数据!")
  764. now_time = datetime.datetime.now().strftime("%H:%S")
  765. if now_time<"15:00" or now_time > "23:50":
  766. raise ce.TipException(u"当日数据请在当日15:00以后23:50以前提交数据!")
  767. usercode = kwargs.get("usercode")
  768. match_id = kwargs.get("match_id")
  769. if not cm.Player.objects.filter(usercode=usercode,match_id=match_id).exists():
  770. raise ce.TipException(u"用户代码错误")
  771. stock_date = kwargs.get("stock_date")
  772. #stock_date = "2022-04-26"
  773. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  774. today_stock = json.dumps(kwargs.get("today_stock"))
  775. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  776. today_fund = float(kwargs.get("today_fund"))
  777. is_markt = int(kwargs.get("is_markt",0))
  778. if int(today_fund)>9999 or int(today_fund)<0:
  779. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  780. player = cm.Player.objects.filter(usercode=usercode,match_id=match_id).first()
  781. #if player.fund <=0 :
  782. # raise ce.TipException(u"请先输入您的初始资金后再提交数据!")
  783. player_id = player.id
  784. user_id = player.user_id
  785. init_fund = player.fund
  786. user = cm.UserInfo.objects.filter(id=user_id).first()
  787. username = user.username
  788. usercode = user.usercode
  789. match_group = player.match_group
  790. match = cm.Match.objects.filter(id=match_id).first()
  791. if player.match_status < 1:
  792. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  793. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  794. if match.end_time < now_date:
  795. raise ce.TipException(u"该比赛已结束!")
  796. #yesterday = cm.PlayerRecord.objects.filter(
  797. # match_id=match_id,player_id=player_id).order_by("-id").first()
  798. yesterday = cm.PlayerRecord.objects.filter(
  799. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  800. if yesterday:
  801. yesterday_fund = yesterday.today_fund
  802. yesterday_stock = yesterday.today_stock
  803. yesterday_stock_img = yesterday.today_stock_img
  804. else:
  805. #yesterday_fund = init_fund
  806. yesterday_fund = today_fund
  807. init_fund = today_fund
  808. yesterday_stock = ""
  809. yesterday_stock_img = ""
  810. cm.Player.objects.filter(id=player_id).update(fund=today_fund)
  811. #记录持股情况
  812. new_stock_list = []
  813. today_stock_list = json.loads(today_stock)
  814. for ts in today_stock_list:
  815. if ts["name"]:
  816. stock,flag = cm.Stock.objects.get_or_create(
  817. name = ts["stock"]
  818. )
  819. stock_id = stock.id
  820. usobj,flag = cm.UserStock.objects.get_or_create(
  821. player_id = player_id,
  822. stock_id = stock_id,
  823. stock_name = ts["name"],
  824. stock_date = stock_date
  825. )
  826. ts["stock_id"] = stock_id
  827. new_stock_list.append(ts)
  828. today_stock = json.dumps(new_stock_list)
  829. obj,flag = cm.PlayerRecord.objects.get_or_create(
  830. player_id=player_id,
  831. match_id=match_id,
  832. stock_date=stock_date)
  833. obj.init_fund = init_fund
  834. obj.yesterday_fund = yesterday_fund
  835. obj.yesterday_stock = yesterday_stock
  836. obj.yesterday_stock_img = yesterday_stock_img
  837. obj.today_fund = today_fund
  838. obj.today_stock = today_stock
  839. obj.today_stock_img = today_stock_img
  840. obj.user_id = user_id
  841. obj.username = username
  842. obj.usercode = usercode
  843. obj.match_group = match_group
  844. obj.is_markt = is_markt
  845. #计算今日和昨日盈亏
  846. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  847. total_income = (today_fund - init_fund)/float(init_fund)
  848. #if int(today_fund)>9999 or int(today_fund)<0:
  849. # raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  850. if int(today_income)>2:
  851. raise ce.TipException(u"数据错误,今日盈利已超过2倍,请仔细核对数据!")
  852. obj.today_income = round(today_income,4)
  853. obj.total_income = round(total_income,4)
  854. if not flag:
  855. obj.ctime = datetime.datetime.now()
  856. obj.save()
  857. #更新股票持股人数
  858. for stock in new_stock_list:
  859. cm.Stock.objects.filter(id=stock["id"]).update(user_num=F("user_num")+1)
  860. #更新group_rank
  861. #update_group_rank(match_id,match_group,obj.stock_date)
  862. ccc.cache.lpush(settings.RANK_LIST,obj.id)
  863. return obj.id
  864. def get_single_match_info(match_id):
  865. """
  866. """
  867. if not match_id:
  868. match = cm.Match.objects.all().order_by("-id").values().first()
  869. else:
  870. match = cm.Match.objects.filter(id=match_id).values().first()
  871. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  872. return now_date,match
  873. def get_cur_record(request):
  874. """
  875. """
  876. player = request.player
  877. player_id = player.id
  878. match_id = player.match_id
  879. match_group = player.match_group
  880. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  881. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).order_by("-stock_date")
  882. data = qset.values().first() if qset else {}
  883. #today_record = get_today_record(player_id,match_id,match_group,today)
  884. if data:
  885. data["today_stock_img"] = json.loads(data["today_stock_img"]) if data["today_stock_img"] else []
  886. data["today_stock"] = json.loads(data["today_stock"]) if data["today_stock"] else []
  887. return data
  888. def follow_player(**kwargs):
  889. """
  890. """
  891. user_id = kwargs.get("player_id")
  892. follow_id = kwargs.get("follow_id")
  893. if kwargs.get("action") == "cancel":
  894. cm.UserFollows.objects.filter(user_id=user_id,follow_id=follow_id).delete()
  895. return True
  896. else:
  897. obj,flag = cm.UserFollows.objects.get_or_create(user_id=user_id,follow_id=follow_id)
  898. return obj.id
  899. def calc_win_rate(player_id,match_id):
  900. """计算胜率
  901. """
  902. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
  903. win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  904. win_rate = round(win_rate,3)
  905. win_rate = "{}%".format(win_rate*100)
  906. return win_rate
  907. def get_user_follower(request):
  908. """获取用户列表
  909. """
  910. user_id = request.player.id
  911. match_id = request.player.match_id
  912. cur_match_id = match_id
  913. match_group = request.player.match_group
  914. cur_match_group = match_group
  915. qdata = request.json
  916. today = get_today_date()
  917. if qdata.get("player_id"):
  918. user_id = int(qdata.get("player_id"))
  919. data = []
  920. qset = cm.UserFollows.objects.filter(follow_id=user_id)
  921. follow_ids = list(qset.values_list("user_id",flat=True))
  922. _today = today
  923. for player_id in follow_ids:
  924. _match_id = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_id")
  925. _today = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"stock_date")
  926. _match_group = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_group")
  927. today_record = get_today_record(player_id,_match_id,_match_group,_today)
  928. if today_record:
  929. data.append(today_record)
  930. data = sorted(data,key=lambda x:x["stock_date"],reverse=True)
  931. _today = ccc.cache.hget("PLAYER_LATEST_%d"%user_id,"stock_date")
  932. cur_today_record = get_today_record(user_id,match_id,match_group,_today)
  933. if cur_today_record:
  934. data.insert(0,cur_today_record)
  935. page = int(qdata.get("page",1))
  936. page_size = int(qdata.get("page_size",20))
  937. if page and page_size:
  938. total,data = ccf.get_page_list(data,page,page_size)
  939. for item in data:
  940. if item:
  941. today_stock = json.loads(item["today_stock"])
  942. today_stock = filter(lambda x:x["name"] and x["fund"],today_stock)
  943. item["today_stock"] = today_stock
  944. item["today_stock_img"] = json.loads(item["today_stock_img"])
  945. #item["win_rate"] = calc_win_rate(item["player_id"],item["match_id"])
  946. win_rate = ccc.cache.hget("PLAYER_LATEST_%d"%item["player_id"],"win_rate")
  947. if win_rate:
  948. item["win_rate"] = str(float(win_rate)*100)+"%"
  949. else:
  950. item["win_rate"] = "0.0%"
  951. item["today_income"] = "{}%".format(item["today_income"]*100)
  952. item["total_income"] = "{}%".format(item["total_income"]*100)
  953. return total,data
  954. else:
  955. return len(data),data
  956. def get_user_follows(request):
  957. """获取用户关注的选手列表
  958. """
  959. if request.player:
  960. user_id = request.player.id
  961. match_id = request.player.match_id
  962. cur_match_id = match_id
  963. match_group = request.player.match_group
  964. cur_match_group = match_group
  965. qdata = request.json
  966. today = get_today_date()
  967. if qdata.get("player_id"):
  968. user_id = int(qdata.get("player_id"))
  969. data = []
  970. qset = cm.UserFollows.objects.filter(user_id=user_id)
  971. follow_ids = list(qset.values_list("follow_id",flat=True))
  972. _today = today
  973. for player_id in follow_ids:
  974. _match_id = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_id")
  975. _today = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"stock_date")
  976. _match_group = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_group")
  977. today_record = get_today_record(player_id,_match_id,_match_group,_today)
  978. if today_record:
  979. today_record["zan_count"] = today_record.get("zans",0) if today_record.get("zans") else 0
  980. today_record["comments_count"] = cm.Comments.objects.filter(record_id=today_record.get("id",0)).count()
  981. data.append(today_record)
  982. data = sorted(data,key=lambda x:x["stock_date"],reverse=True)
  983. _today = ccc.cache.hget("PLAYER_LATEST_%d"%user_id,"stock_date")
  984. cur_today_record = get_today_record(user_id,match_id,match_group,_today)
  985. if cur_today_record:
  986. data.insert(0,cur_today_record)
  987. page = int(qdata.get("page",1))
  988. page_size = int(qdata.get("page_size",20))
  989. if page and page_size:
  990. total,data = ccf.get_page_list(data,page,page_size)
  991. for item in data:
  992. if item:
  993. today_stock = json.loads(item["today_stock"])
  994. today_stock = filter(lambda x:x["name"] and x["fund"],today_stock)
  995. item["today_stock"] = today_stock
  996. item["today_stock_img"] = json.loads(item["today_stock_img"])
  997. #item["win_rate"] = calc_win_rate(item["player_id"],item["match_id"])
  998. win_rate = ccc.cache.hget("PLAYER_LATEST_%d"%item["player_id"],"win_rate")
  999. if win_rate:
  1000. item["win_rate"] = str(float(win_rate)*100)+"%"
  1001. else:
  1002. item["win_rate"] = "0.0%"
  1003. item["today_income"] = "{}%".format(item["today_income"]*100)
  1004. item["total_income"] = "{}%".format(item["total_income"]*100)
  1005. item["zans_count"] = item.get("zans",0)
  1006. item["comments_count"] = cm.Comments.objects.filter(record_id=item.get("id",0)).count()
  1007. return total,data
  1008. else:
  1009. return len(data),data
  1010. return 0,[]
  1011. def get_hot_stock_rank(**kwargs):
  1012. """
  1013. """
  1014. data = {
  1015. "hot_buy":[
  1016. {"stock_name":u"创业黑马","count":12}
  1017. ],
  1018. "hot_sell":[
  1019. {"stock_name":u"创业黑马","count":12}
  1020. ]
  1021. }
  1022. return data
  1023. #@ccc.cache_data()
  1024. def get_stock_info(stock_id):
  1025. """
  1026. """
  1027. stock = cm.Stock.objects.filter(id=stock_id).values().first()
  1028. return stock
  1029. def get_hot_stock_buy(**kwargs):
  1030. """
  1031. """
  1032. stock_date = kwargs.get("stock_date")
  1033. if not kwargs.get("name"):
  1034. qset = cm.UserStock.objects.filter(stock_date=stock_date)
  1035. else:
  1036. qset = cm.UserStock.objects.filter(stock_name__icontains=kwargs.get("name"))
  1037. qset = qset.values("stock_id","stock_name").annotate(count=Count("stock_id")).order_by("-count")
  1038. data = []
  1039. for q in qset:
  1040. stock_id = q["stock_id"]
  1041. count = q["count"]
  1042. stock_name = q.get("stock_name")
  1043. comments_count = cm.Comments.objects.filter(stock_id=stock_id).count()
  1044. choice_count = cm.UserChoice.objects.filter(stock_id=stock_id).count()
  1045. data.append({"stock_name":stock_name,"id":stock_id,"count":count,"comments_count":comments_count,"choice_count":choice_count})
  1046. page = int(kwargs.get("page",1))
  1047. page_size = int(kwargs.get("page_size",20))
  1048. if page and page_size:
  1049. total,data = ccf.get_page_list(data,page,page_size)
  1050. return total,data
  1051. else:
  1052. return len(data),data
  1053. return data
  1054. def get_hot_follow(**kwargs):
  1055. """
  1056. """
  1057. stock_date = kwargs.get("stock_date")
  1058. cur_match_id = ccc.get_cur_match().id
  1059. player_ids = list(cm.Player.objects.filter(match_id=cur_match_id,match_status=1).values_list("id",flat=True))
  1060. qset = cm.UserFollows.objects.filter(follow_id__in=player_ids)
  1061. qset = qset.values("follow_id").annotate(count=Count("follow_id")).order_by("-count")
  1062. data = []
  1063. for q in qset:
  1064. player_id = q["follow_id"]
  1065. count = q["count"]
  1066. today = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"stock_date")
  1067. match_id = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_id")
  1068. match_group = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_group")
  1069. badest_income = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"badest_income")
  1070. today_record = get_today_record(player_id,match_id,match_group,today)
  1071. if today_record:
  1072. userinfo = get_user_info(today_record["user_id"])
  1073. win_rate = ccc.cache.hget("PLAYER_LATEST_%d"%today_record["player_id"],"win_rate")
  1074. win_rate = str(float(win_rate)*100)+"%"
  1075. if userinfo:
  1076. data.append(
  1077. {
  1078. "player_name":userinfo.get("username"),
  1079. "count":count,
  1080. "id":player_id,
  1081. "today_fund":today_record["today_fund"],
  1082. "total_income":"{}%".format(today_record["total_income"]*100),
  1083. "today_income":"{}%".format(today_record["today_income"]*100),
  1084. "badest_income":"{}%".format(badest_income*100),
  1085. "style":userinfo.get("style"),
  1086. "badge":userinfo.get("badge"),
  1087. "match_id":match_id,
  1088. "win_rate":win_rate
  1089. #"win_rate":calc_win_rate(player_id,match_id)
  1090. }
  1091. )
  1092. if kwargs.get("name"):
  1093. data = filter(lambda x:kwargs.get("name") in x["player_name"],data)
  1094. page = int(kwargs.get("page",1))
  1095. page_size = int(kwargs.get("page_size",20))
  1096. if page and page_size:
  1097. total,data = ccf.get_page_list(data,page,page_size)
  1098. return total,data
  1099. else:
  1100. return len(data),data
  1101. return data
  1102. def get_hot_stock_sell(**kwargs):
  1103. """
  1104. """
  1105. stock_date = kwargs.get("stock_date")
  1106. stock_date_time = ccf.str_to_datetime(kwargs.get("stock_date"),"%Y-%m-%d")
  1107. yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  1108. ##昨天所有股票
  1109. #yes_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True))
  1110. #yes_stock_ids = list(set(yes_stock_ids))
  1111. #data = []
  1112. #for ysi in yes_stock_ids:
  1113. # yes_count = cm.UserStock.objects.filter(stock_date=yesterday,stock_id=ysi).count()
  1114. # td_count = cm.UserStock.objects.filter(stock_date=stock_date,stock_id=ysi).count()
  1115. # if td_count < yes_count:
  1116. # stock_name = cm.Stock.objects.filter(id=ysi).first().name
  1117. # data.append({"stock_name":stock_name,"count":yes_count-td_count,"id":ysi})
  1118. qset = cm.HotStockSellCount.objects.filter(stock_date=stock_date)
  1119. if kwargs.get("name"):
  1120. qset = qset.filter(stock_name__icontains=kwargs.get("name"))
  1121. qset = qset.order_by("-count")
  1122. data = list(qset.values("stock_name","stock_id","count"))
  1123. for item in data:
  1124. item["id"] = item["stock_id"]
  1125. page = int(kwargs.get("page",0))
  1126. page_size = int(kwargs.get("page_size",20))
  1127. if page and page_size:
  1128. total,data = ccf.get_page_list(data,page,page_size)
  1129. return total,data
  1130. else:
  1131. return len(data),data
  1132. return data
  1133. def get_stock_info(_id):
  1134. """
  1135. """
  1136. data = cm.Stock.objects.filter(id=_id).values().first()
  1137. return data
  1138. def get_hot_stock_sell_players(**kwargs):
  1139. """
  1140. """
  1141. _id = kwargs.get("id")
  1142. stock_date = kwargs.get("stock_date")
  1143. stock_date_time = ccf.str_to_datetime(kwargs.get("stock_date"),"%Y-%m-%d")
  1144. yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  1145. #昨天持股选手
  1146. yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=_id).values_list("player_id",flat=True))
  1147. td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=_id).values_list("player_id",flat=True))
  1148. sell_players = list(set(yes_players)-set(td_players))
  1149. data = []
  1150. for player_id in sell_players:
  1151. player = cm.Player.objects.filter(id=player_id).first()
  1152. if player:
  1153. match_id = player.match_id
  1154. match_group = player.match_group
  1155. today_record = get_today_record(player_id,match_id,match_group,stock_date)
  1156. if today_record:
  1157. today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
  1158. today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
  1159. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  1160. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  1161. data.append(today_record)
  1162. data = sorted(data,key=lambda x:x["today_fund"],reverse=True)
  1163. page = int(kwargs.get("page",0))
  1164. page_size = int(kwargs.get("page_size",20))
  1165. if page and page_size:
  1166. total,data = ccf.get_page_list(data,page,page_size)
  1167. return total,data
  1168. else:
  1169. return len(data),data
  1170. return data
  1171. def get_win_rate_rank(request):
  1172. """
  1173. """
  1174. player_id = request.player.id
  1175. match_id = request.player.match_id
  1176. match_group = request.player.match_group
  1177. kwargs = request.json
  1178. match_id = ccc.get_cur_match().id
  1179. qset = cm.WinDefendRank.objects.filter(match_id=match_id,auto_complete__lt=5,match_status=1).order_by("-win_rate")
  1180. data = list(qset.values())
  1181. page = int(kwargs.get("page",1))
  1182. page_size = int(kwargs.get("page_size",20))
  1183. if page and page_size:
  1184. total,data = ccf.get_page_list(data,page,page_size)
  1185. else:
  1186. total = len(data)
  1187. for item in data:
  1188. item["win_rate"] = "{}%".format(item["win_rate"]*100)
  1189. item["badest_income"] = "{}%".format(item["badest_income"]*100)
  1190. item["total_income"] = "{}%".format(item["total_income"]*100)
  1191. userinfo = get_user_info(item["user_id"])
  1192. if userinfo:
  1193. item["badge"] = userinfo.get("badge")
  1194. item["style"] = userinfo.get("style")
  1195. item["username"] = userinfo.get("username")
  1196. return total,data
  1197. def get_defend_rank(request):
  1198. """
  1199. """
  1200. player_id = request.player.id
  1201. match_id = request.player.match_id
  1202. match_group = request.player.match_group
  1203. kwargs = request.json
  1204. qset = cm.WinDefendRank.objects.filter(match_id=match_id,auto_complete__lte=5,match_status=1).order_by("-badest_income")
  1205. data = list(qset.values())
  1206. #data = []
  1207. #for item in datas:
  1208. # player = cm.Player.objects.filter(id=item["player_id"]).first()
  1209. # item["match_status"] = player.match_status if player else -1
  1210. # if item["match_status"] > -1:
  1211. # data.append(item)
  1212. page = int(kwargs.get("page",1))
  1213. page_size = int(kwargs.get("page_size",20))
  1214. if page and page_size:
  1215. total,data = ccf.get_page_list(data,page,page_size)
  1216. else:
  1217. total = len(data)
  1218. for item in data:
  1219. item["win_rate"] = "{}%".format(item["win_rate"]*100)
  1220. item["badest_income"] = "{}%".format(item["badest_income"]*100)
  1221. item["total_income"] = "{}%".format(item["total_income"]*100)
  1222. userinfo = get_user_info(item["user_id"])
  1223. if userinfo:
  1224. item["badge"] = userinfo.get("badge")
  1225. item["style"] = userinfo.get("style")
  1226. item["username"] = userinfo.get("username")
  1227. return total,data
  1228. def get_champion_articles_list(request):
  1229. """
  1230. """
  1231. kwargs = request.json
  1232. qset = cm.Article.objects.filter(status=2,type="champion").order_by("-id")
  1233. page = int(kwargs.get("page",0))
  1234. page_size = int(kwargs.get("page_size",20))
  1235. if page and page_size:
  1236. total,qset = ccf.get_page_qset(qset,page,page_size)
  1237. else:
  1238. total = qset.count()
  1239. data = list(qset.values())
  1240. for item in data:
  1241. item["ctime"] = ccf.datetime_to_str(item["ctime"],"%Y-%m-%d")
  1242. return total,data
  1243. def get_wanzhu_comment(**kwargs):
  1244. """
  1245. """
  1246. match_id = kwargs.get("match_id")
  1247. group_id = kwargs.get("group_id")
  1248. today = get_today_date()
  1249. players = get_match_group_players(match_id,group_id)
  1250. new_players = []
  1251. for player in players:
  1252. user_id = player["user_id"]
  1253. user = get_user_info(user_id)
  1254. username = user["username"] if user else ""
  1255. player_id = player["id"]
  1256. match_group = group_id
  1257. today_record = get_today_record(player_id,match_id,int(match_group),today)
  1258. if today_record and today_record.get("wanzhu_comment"):
  1259. player.update(today_record)
  1260. player["username"] = username
  1261. player["total_income"] = "{}%".format(player["total_income"]*100)
  1262. player["fund"] = round(player["fund"],4)
  1263. player["init_fund"] = round(player["init_fund"],4)
  1264. player["today_fund"] = round(player["today_fund"],4)
  1265. player["today_stock"] = json.loads(player["today_stock"]) if player["today_stock"] else []
  1266. new_players.append(player)
  1267. new_players = sorted(new_players,key=lambda x:x["group_rank"])
  1268. data = new_players
  1269. page = int(kwargs.get("page",0))
  1270. page_size = int(kwargs.get("page_size",20))
  1271. if page and page_size:
  1272. total,data = ccf.get_page_list(data,page,page_size)
  1273. else:
  1274. total = len(data)
  1275. return total,data
  1276. def get_enum_list(request):
  1277. """
  1278. """
  1279. data = {
  1280. "zq":[
  1281. u"短线博弈",
  1282. u"长线价投",
  1283. u"长短兼备"
  1284. ],
  1285. "cw":[
  1286. u"分仓开超市",
  1287. u"重仓押注",
  1288. u"全仓单钓",
  1289. u"融资加倍"
  1290. ],
  1291. "df":[
  1292. u"低吸",
  1293. u"半路",
  1294. u"首板",
  1295. u"接力",
  1296. u"撬板",
  1297. u"T加0",
  1298. u"隔夜卖",
  1299. u"格局锁仓",
  1300. u"核按钮"
  1301. ],
  1302. "pz":[
  1303. u"10厘米",
  1304. u"20厘米",
  1305. u"30厘米",
  1306. u"N/C新股",
  1307. u"次新股",
  1308. u"可转债",
  1309. u"港股",
  1310. u"基金",
  1311. u"逆回购"
  1312. ]
  1313. }
  1314. return data
  1315. def get_player_list(**kwargs):
  1316. """选手列表
  1317. """
  1318. match_id = kwargs.get("match_id")
  1319. today = get_today_date()
  1320. qset = cm.Player.objects.filter(match_id=match_id,match_status=1)
  1321. if kwargs.get("name"):
  1322. qset = qset.filter(username__icontains=kwargs.get("name"))
  1323. data = list(qset.values())
  1324. for item in data:
  1325. match_id = item["match_id"]
  1326. match_group = item["match_group"]
  1327. user_id = item["user_id"]
  1328. player_id = item["id"]
  1329. #user = cm.UserInfo.objects.filter(id=user_id).first()
  1330. today = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"stock_date")
  1331. match_id = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_id")
  1332. match_group = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"match_group")
  1333. today_record = get_today_record(player_id,match_id,match_group,today)
  1334. if today_record:
  1335. today_record.pop("id")
  1336. item.update(today_record)
  1337. user_info = get_user_info(user_id)
  1338. if user_info:
  1339. user_info.pop("id")
  1340. item.update(user_info)
  1341. if item.get("today_income"):
  1342. item["today_income"] = "{}%".format(item["today_income"]*100)
  1343. item["total_income"] = "{}%".format(item["total_income"]*100)
  1344. if kwargs.get("zq"):
  1345. data = filter(lambda x:kwargs.get("zq") == x["zq"],data)
  1346. if kwargs.get("cw"):
  1347. data = filter(lambda x:kwargs.get("cw") == x["cw"],data)
  1348. if kwargs.get("df"):
  1349. data = filter(lambda x:kwargs.get("df") == x["df"],data)
  1350. page = int(kwargs.get("page",0))
  1351. page_size = int(kwargs.get("page_size",20))
  1352. if page and page_size:
  1353. total,data = ccf.get_page_list(data,page,page_size)
  1354. else:
  1355. total = len(data)
  1356. return total,data
  1357. def get_mine_style(request):
  1358. """
  1359. """
  1360. user = request.user
  1361. player = request.player
  1362. data = {
  1363. "zq":user.zq,
  1364. "cw":user.cw,
  1365. "df":user.df,
  1366. "pz":user.pz,
  1367. "join_time":user.join_time,
  1368. "username":user.username,
  1369. "account_img":user.account_img,
  1370. }
  1371. if player:
  1372. data["is_player"] = 1
  1373. data["init_fund"] = player.fund if player.fund else 0
  1374. else:
  1375. data["is_player"] = 0
  1376. data["init_fund"] = None
  1377. return data
  1378. def update_user_style(**kwargs):
  1379. """
  1380. """
  1381. user_id = kwargs.pop("user_id")
  1382. player_id = kwargs.pop("player_id")
  1383. init_fund = kwargs.pop("init_fund")
  1384. cm.UserInfo.objects.filter(id=user_id).update(**kwargs)
  1385. if player_id and init_fund:
  1386. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  1387. if kwargs.get("username"):
  1388. cm.Player.objects.filter(id=player_id).update(username=kwargs.get("username"))
  1389. ccc.cache.delete("cdata_get_user_info_(%sL,)"%user_id)
  1390. return True
  1391. def get_stock_players(**kwargs):
  1392. """
  1393. """
  1394. stock_id = kwargs.get("stock_id")
  1395. stock_date = kwargs.get("stock_date",get_today_date())
  1396. data = []
  1397. user_stocks = cm.UserStock.objects.filter(stock_id=stock_id,stock_date=stock_date)
  1398. #user_stocks = cm.UserStock.objects.filter(stock_id=stock_id)
  1399. #user_stocks = cm.UserStock.objects.all()
  1400. for us in user_stocks:
  1401. player_id = us.player_id
  1402. player = cm.Player.objects.filter(id=player_id).first()
  1403. if player:
  1404. match_id = player.match_id
  1405. match_group = player.match_group
  1406. if stock_date:
  1407. today_record = get_today_record(player_id,match_id,match_group,stock_date)
  1408. else:
  1409. today_record = get_today_record(player_id,match_id,match_group,us.stock_date)
  1410. if today_record:
  1411. today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
  1412. today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
  1413. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  1414. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  1415. data.append(today_record)
  1416. data = sorted(data,key=lambda x:x["today_fund"],reverse=True)
  1417. #分页
  1418. page = int(kwargs.get("page",0))
  1419. page_size = int(kwargs.get("page_size",20))
  1420. if page and page_size:
  1421. total,data = ccf.get_page_list(data,page,page_size)
  1422. else:
  1423. total = len(data)
  1424. return data
  1425. def update_user_fund(**kwargs):
  1426. """
  1427. """
  1428. user_id = kwargs.pop("user_id")
  1429. player_id = kwargs.pop("player_id")
  1430. init_fund = kwargs.pop("init_fund")
  1431. if player_id and init_fund:
  1432. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  1433. return True
  1434. def get_player_match_calendar(**kwargs):
  1435. """
  1436. """
  1437. player_id = kwargs.get("player_id")
  1438. match_id = kwargs.get("match_id")
  1439. month = kwargs.get("month")
  1440. print kwargs
  1441. week,eday = calendar.monthrange(int(month.split("-")[0]),int(month.split("-")[1]))
  1442. sday = "01"
  1443. eday = str(eday).zfill(2)
  1444. sdate = month + "-" + sday
  1445. edate = month + "-" + eday
  1446. print sdate,edate
  1447. qset = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id)\
  1448. .filter(stock_date__gte=sdate,stock_date__lte=edate)
  1449. data = list(qset.values())
  1450. dct = {}
  1451. for item in data:
  1452. item["today_income"] = "{}%".format(item["today_income"]*100)
  1453. dct[item["stock_date"]] = item["today_income"]
  1454. newdata = []
  1455. for i in range(1,int(eday)+1):
  1456. stock_date = month + "-" + str(i).zfill(2)
  1457. newdata.append({
  1458. "stock_date":stock_date,
  1459. "today_income":dct.get(stock_date,""),
  1460. })
  1461. return newdata
  1462. def get_all_match(request):
  1463. """
  1464. """
  1465. now = datetime.datetime.now().strftime("%Y-%m-%d")
  1466. qset = cm.Match.objects.filter(start_time__lte=now).order_by("id")
  1467. data = list(qset.values())
  1468. return data
  1469. def get_default_date(**kwargs):
  1470. """
  1471. """
  1472. match_id = kwargs.get("match_id")
  1473. record = cm.PlayerRecord.objects.filter(match_id=match_id).order_by("-stock_date").first()
  1474. if record:
  1475. return record.stock_date
  1476. else:
  1477. return get_today_date()
  1478. @ccc.cache_data()
  1479. def get_stock_search(**kwargs):
  1480. """
  1481. """
  1482. qset = cm.Stock.objects.all()
  1483. data = list(qset.values("id","name","code"))
  1484. for item in data:
  1485. if item["code"]:
  1486. item["label"] = "%s(%s)" % (item["name"],item["code"])
  1487. else:
  1488. item["label"] = "%s" % item["name"]
  1489. return data
  1490. def get_mine_latest(request):
  1491. """
  1492. """
  1493. try:
  1494. player_id = request.player.id
  1495. match_id = request.player.match_id
  1496. match_group = request.player.match_group
  1497. today = get_today_date()
  1498. _today = ccc.cache.hget("PLAYER_LATEST_%d"%player_id,"stock_date")
  1499. if _today:
  1500. today = _today
  1501. rst = get_today_record_actual(player_id,match_id,match_group)
  1502. if rst:
  1503. rst["today_income_fund"] = round((rst["today_fund"] - rst["yesterday_fund"]),2)*10000 if rst["yesterday_fund"] else 0.00
  1504. rst["today_income"] = "{}%".format(rst["today_income"]*100)
  1505. rst["total_income"] = "{}%".format(rst["total_income"]*100)
  1506. rst["zan_count"] = rst.get("zans",0)
  1507. rst["comments_count"] = cm.Comments.objects.filter(record_id=rst.get("id",0)).count()
  1508. return rst
  1509. except Exception as e:
  1510. print(e)
  1511. return {"player_id":player_id,"match_id":match_id}
  1512. def get_match_validdates(match_id):
  1513. """
  1514. """
  1515. #qdata = request.json
  1516. #match_id = qdata.get("match_id")
  1517. match = cm.Match.objects.filter(id=match_id).first()
  1518. if match:
  1519. validdates = json.loads(match.valid_dates) if match.valid_dates else []
  1520. validdates.sort()
  1521. return validdates
  1522. return []
  1523. def send_phcode(request):
  1524. """
  1525. """
  1526. qdata = request.json
  1527. phone = qdata.get("phone")
  1528. import random
  1529. code = "%s%s%s%s" % (random.randint(0,9),random.randint(0,9),random.randint(0,9),random.randint(0,9))
  1530. send_verify_code(phone,code)
  1531. ccc.cache.set(phone,code,120)
  1532. pass
  1533. def get_signup_info(request):
  1534. """
  1535. """
  1536. qdata = request.json
  1537. user_id = request.user.id
  1538. try:
  1539. match_id = ccc.get_signup_match().id
  1540. match = cm.Match.objects.filter(id=match_id).values().first()
  1541. #
  1542. match_groups = list(cm.MatchGroup.objects.filter(match_id=match_id,is_active=1).values())
  1543. match["groups"] = match_groups
  1544. #报名状态
  1545. now = datetime.datetime.now().strftime("%Y-%m-%d")
  1546. signup_start_time = match["signup_start_time"]
  1547. signup_end_time = match["signup_end_time"]
  1548. if signup_start_time <= now and signup_end_time >= now:
  1549. match["signup_status"] = 1
  1550. else:
  1551. match["signup_status"] = 0
  1552. if cm.Player.objects.filter(match_id=match_id,user_id=user_id).exists():
  1553. match["signup_done"] = 1
  1554. else:
  1555. match["signup_done"] = 0
  1556. return match
  1557. except Exception as e:
  1558. print(e)
  1559. return {}
  1560. def do_wx_pay(request):
  1561. """
  1562. """
  1563. user = request.user
  1564. user_id = request.user.id
  1565. user_name = request.user.username
  1566. openid = request.user.openid
  1567. qdata = request.json
  1568. match_id = qdata.get("match_id")
  1569. match_name = qdata.get("match_name")
  1570. signup_type = qdata.get("signup_type")
  1571. total_fee = str(qdata.get("total_fee"))
  1572. phone = qdata.get("phone")
  1573. phcode = qdata.get("phcode")
  1574. match_group = qdata.get("match_group")
  1575. orgcode = ccc.cache.get(phone)
  1576. if not phcode == orgcode and False:
  1577. raise ce.TipException(u"验证码不正确!")
  1578. if int(signup_type) == 1:
  1579. if not match_group:
  1580. match_group = cm.MatchGroup.objects.filter(match_id=match_id,charge=0).first().id
  1581. out_trade_no = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + str(int(time.time()*1000))
  1582. phone_user = cm.UserInfo.objects.filter(phone=phone).first()
  1583. phone_user_player_type = phone_user.player_type if phone_user else 0
  1584. #游客和普通选手付费报名
  1585. if user.player_type in [0,1] and phone_user_player_type in [0,1]:
  1586. #生成订单
  1587. order = cm.SignupOrder.objects.create(
  1588. user_id = user_id,
  1589. user_name = user_name,
  1590. match_id = match_id,
  1591. match_name = match_name,
  1592. signup_type = signup_type,
  1593. total_fee = total_fee,
  1594. out_trade_no = out_trade_no,
  1595. phone = phone,
  1596. match_group = match_group
  1597. )
  1598. #支付
  1599. total_fee = str(int(float(order.total_fee)*100))
  1600. prepayinfo = wxpay.get_wx_unifiedorder(out_trade_no,total_fee,openid)
  1601. prepayinfo["key"] = wxpay.WxPayConf_pub.KEY
  1602. return prepayinfo
  1603. #种子选手和开户选手免费报名
  1604. else:
  1605. #生成订单
  1606. order = cm.SignupOrder.objects.create(
  1607. user_id = user_id,
  1608. user_name = user_name,
  1609. match_id = match_id,
  1610. match_name = match_name,
  1611. signup_type = signup_type,
  1612. total_fee = total_fee,
  1613. out_trade_no = out_trade_no,
  1614. phone = phone,
  1615. match_group = match_group
  1616. )
  1617. if phone_user:
  1618. if user.id != phone_user.id:
  1619. user.phone = phone
  1620. user.player_type = phone_user_player_type
  1621. user.save()
  1622. #生成选手信息
  1623. cur_match = cm.Match.objects.filter(id=match_id).first()
  1624. visit_group = cm.MatchGroup.objects.filter(id=match_group).first()
  1625. player,flag = cm.Player.objects.get_or_create(
  1626. user_id = user.id,
  1627. match_id = cur_match.id,
  1628. match_name = cur_match.name,
  1629. match_group = visit_group.id,
  1630. match_group_name = visit_group.name
  1631. )
  1632. player.username = request.user.nickname
  1633. player.usercode = request.user.usercode
  1634. player.role = 2
  1635. player.match_status = 1
  1636. player.save()
  1637. #
  1638. order.player_id = player.id
  1639. order.save()
  1640. if phone_user:
  1641. cm.UserInfo.objects.filter(id=phone_user.id).delete()
  1642. cm.Player.objects.filter(user_id=phone_user.id).delete()
  1643. return {"free":1}
  1644. def do_wxpay_notify(request):
  1645. qdata = request.json
  1646. flag,res = wxpay.check_notify_valid(request.body)
  1647. if flag:
  1648. out_trade_no = res.get("out_trade_no")
  1649. transaction_id = res.get("transaction_id")
  1650. pay_time = res.get("time_end")
  1651. try:
  1652. sorder = cm.SignupOrder.objects.filter(out_trade_no=out_trade_no).first()
  1653. if sorder and not sorder.transaction_id:
  1654. now = datetime.datetime.now()
  1655. cm.SignupOrder.objects.filter(out_trade_no=out_trade_no).update(order_status=1,pay_status=1,pay_time=now,transaction_id=transaction_id)
  1656. #生成选手信息
  1657. user = cm.UserInfo.objects.filter(id=sorder.user_id).first()
  1658. visit_group = cm.MatchGroup.objects.filter(id=sorder.match_group).first()
  1659. player,flag = cm.Player.objects.get_or_create(
  1660. user_id = sorder.user_id,
  1661. match_id = sorder.match_id,
  1662. match_name = sorder.match_name,
  1663. match_group = visit_group.id,
  1664. match_group_name = visit_group.name
  1665. )
  1666. player.username = user.nickname
  1667. player.usercode = user.usercode
  1668. if sorder.signup_type == 2:
  1669. player.role = 2
  1670. else:
  1671. player.role = 1
  1672. player.save()
  1673. #
  1674. sorder.player_id = player.id
  1675. sorder.save()
  1676. if sorder.signup_type == 2:
  1677. player_id = sorder.player_id
  1678. user_id = sorder.user_id
  1679. match_group = sorder.match_group
  1680. match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
  1681. cm.Player.objects.filter(id=player_id).update(role=2,match_group=match_group,match_group_name=match_group_name,match_status=1)
  1682. cm.UserInfo.objects.filter(id=user_id).update(role=2)
  1683. if sorder.signup_type == 1:
  1684. player_id = sorder.player_id
  1685. user_id = sorder.user_id
  1686. cm.Player.objects.filter(id=player_id).update(role=1,match_status=1)
  1687. cm.UserInfo.objects.filter(id=user_id).update(role=1)
  1688. return True
  1689. except Exception as e:
  1690. import traceback
  1691. traceback.print_exc()
  1692. print(e,111111111111)
  1693. return False
  1694. def get_user_comments(request):
  1695. """
  1696. """
  1697. player_id = request.player.id
  1698. kwargs = request.json
  1699. stock_id = kwargs.get("stock_id")
  1700. record_id = kwargs.get("record_id")
  1701. if record_id:
  1702. qset = cm.Comments.objects.filter(record_id=record_id,pid__isnull=True)
  1703. else:
  1704. qset = cm.Comments.objects.filter(stock_id=stock_id,pid__isnull=True)
  1705. data = list(qset.values())
  1706. for item in data:
  1707. if record_id:
  1708. subcomments = cm.Comments.objects.filter(record_id=record_id,pid=item["id"])
  1709. else:
  1710. subcomments = cm.Comments.objects.filter(stock_id=stock_id,pid=item["id"])
  1711. item["children"] = list(subcomments.values())
  1712. #分页
  1713. page = int(kwargs.get("page",1))
  1714. page_size = int(kwargs.get("page_size",20))
  1715. if page and page_size:
  1716. total,data = ccf.get_page_list(data,page,page_size)
  1717. else:
  1718. total = len(data)
  1719. return total,data
  1720. def get_user_choices(request):
  1721. """
  1722. """
  1723. player_id = request.player.id
  1724. kwargs = request.json
  1725. stock_id = kwargs.get("stock_id")
  1726. qset = cm.UserChoice.objects.filter(player_id=player_id)
  1727. data = list(qset.values())
  1728. for item in data:
  1729. stock_id = item["stock_id"]
  1730. item["count"] = cm.UserChoice.objects.filter(player_id=player_id,stock_id=stock_id).count()
  1731. comments_count = cm.Comments.objects.filter(stock_id=stock_id).count()
  1732. choice_count = cm.UserChoice.objects.filter(stock_id=stock_id).count()
  1733. item["comments_count"] = comments_count
  1734. item["choice_count"] = choice_count
  1735. player_id = item["player_id"]
  1736. match_id = cm.Player.objects.filter(id=player_id).first().match_id
  1737. item["match_id"] = match_id
  1738. #分页
  1739. page = int(kwargs.get("page",1))
  1740. page_size = int(kwargs.get("page_size",20))
  1741. if page and page_size:
  1742. total,data = ccf.get_page_list(data,page,page_size)
  1743. else:
  1744. total = len(data)
  1745. return total,data
  1746. def get_user_consult_list(request):
  1747. """
  1748. """
  1749. player_id = request.user.id if request.user else 0
  1750. if not player_id:
  1751. return 0,[]
  1752. kwargs = request.json
  1753. record_id = kwargs.get("record_id")
  1754. qset = cm.WanzhuConsult.objects.filter(user_id=player_id)
  1755. data = list(qset.values())
  1756. for item in data:
  1757. if cm.WanzhuConsult.objects.filter(pid=item["id"]):
  1758. data.extend(cm.WanzhuConsult.objects.filter(pid=item["id"]).values())
  1759. data = sorted(data,key=lambda x:x["id"])
  1760. #分页
  1761. page = int(kwargs.get("page",1))
  1762. page_size = int(kwargs.get("page_size",20))
  1763. if page and page_size:
  1764. total,data = ccf.get_page_list(data,page,page_size)
  1765. else:
  1766. total = len(data)
  1767. return total,data
  1768. def get_user_zans(request):
  1769. """
  1770. """
  1771. player_id = request.player.id
  1772. qdata = request.json
  1773. record_id = qdata.get("record_id")
  1774. zans = cm.PlayerRecord.objects.filter(id=record_id).first().zans
  1775. return zans
  1776. def get_user_comments_count(request):
  1777. """
  1778. """
  1779. player_id = request.player.id
  1780. qdata = request.json
  1781. record_id = qdata.get("record_id")
  1782. count = cm.Comments.objects.filter(record_id=record_id).count()
  1783. return count
  1784. def add_wanzhu_consult(request):
  1785. """咨询顽主
  1786. """
  1787. user_id = request.user.id
  1788. user_name = request.user.username
  1789. user_avatar = request.user.avatar
  1790. qdata = request.json
  1791. content = qdata.get("cotent")
  1792. pid = qdata.get("pid")
  1793. obj = cm.WanzhuConsult.objects.create(
  1794. user_id = user_id,
  1795. user_name = user_name,
  1796. user_avatar = user_avatar,
  1797. content = content,
  1798. pid = pid
  1799. )
  1800. def add_comments(request):
  1801. """
  1802. """
  1803. user_id = request.user.id
  1804. user_name = request.user.username
  1805. player_id = request.player.id
  1806. user_avatar = request.user.avatar
  1807. qdata = request.json
  1808. content = qdata.get("cotent")
  1809. record_id = qdata.get("record_id")
  1810. stock_id = qdata.get("stock_id")
  1811. pid = qdata.get("pid")
  1812. ip = ccf.get_ip(request)
  1813. location = ccf.get_city_from_ip(ip)
  1814. obj = cm.Comments.objects.create(
  1815. user_id = user_id,
  1816. user_name = user_name,
  1817. user_avatar = user_avatar,
  1818. player_id = player_id,
  1819. content = content,
  1820. record_id = record_id,
  1821. pid = pid,
  1822. location = location,
  1823. stock_id = stock_id
  1824. )
  1825. cm.PlayerRecord.objects.filter(id=record_id).update(comments_count=F("comments_count")+1)
  1826. def add_choice(request):
  1827. """
  1828. """
  1829. user_id = request.user.id
  1830. user_name = request.user.username
  1831. player_id = request.player.id
  1832. user_avatar = request.user.avatar
  1833. qdata = request.json
  1834. stock_id = qdata.get("stock_id")
  1835. stock_name = cm.Stock.objects.filter(id=stock_id).first().name
  1836. obj = cm.UserChoice.objects.create(
  1837. user_id = user_id,
  1838. user_name = user_name,
  1839. user_avatar = user_avatar,
  1840. player_id = player_id,
  1841. stock_id = stock_id,
  1842. stock_name = stock_name
  1843. )
  1844. def add_zan(request):
  1845. """
  1846. """
  1847. qdata = request.json
  1848. record_id = qdata.get("record_id")
  1849. cm.PlayerRecord.objects.filter(id=record_id).update(zans=F("zans")+1)
  1850. zans = cm.PlayerRecord.objects.filter(id=record_id).first().zans
  1851. return zans
  1852. def get_experience_list(request):
  1853. """
  1854. """
  1855. kwargs = request.json
  1856. today = get_today_date()
  1857. match_id = ccc.get_cur_match().id
  1858. qset = cm.PlayerRecord.objects.filter(match_id=match_id,experience__isnull=False,stock_date=today).order_by("-total_income")[:100]
  1859. data = list(qset.values("id","user_id","username","today_fund","today_income","total_income","experience","match_id","player_id","today_stock_img","zans","comments_count"))
  1860. for item in data:
  1861. record_id = item["id"]
  1862. user_id = item["user_id"]
  1863. #user = cm.UserInfo.objects.filter(id=user_id).first()
  1864. #if user:
  1865. # item["user_avatar"] = user.avatar
  1866. # #item["comments_count"] = cm.Comments.objects.filter(record_id=record_id).count()
  1867. try:
  1868. item["user_avatar"] = get_user_info(user_id)["avatar"]
  1869. except:
  1870. item["user_avatar"] = ""
  1871. #item["comments_count"] = 0
  1872. item["zans_count"] = item["zans"]
  1873. item["today_stock_img"] = json.loads(item["today_stock_img"])
  1874. #item["win_rate"] = calc_win_rate(item["player_id"],item["match_id"])
  1875. win_rate = ccc.cache.hget("PLAYER_LATEST_%d"%item["player_id"],"win_rate")
  1876. if win_rate:
  1877. item["win_rate"] = str(float(win_rate)*100)+"%"
  1878. else:
  1879. item["win_rate"] = "0.0%"
  1880. item["today_income"] = "{}%".format(item["today_income"]*100)
  1881. item["total_income"] = "{}%".format(item["total_income"]*100)
  1882. #分页
  1883. page = int(kwargs.get("page",1))
  1884. page_size = int(kwargs.get("page_size",20))
  1885. if page and page_size:
  1886. total,data = ccf.get_page_list(data,page,page_size)
  1887. else:
  1888. total = len(data)
  1889. return total,data
  1890. def delete_choice(request):
  1891. """
  1892. """
  1893. user_id = request.user.id
  1894. user_name = request.user.username
  1895. player_id = request.player.id
  1896. user_avatar = request.user.avatar
  1897. qdata = request.json
  1898. stock_id = qdata.get("stock_id")
  1899. cm.UserChoice.objects.filter(stock_id=stock_id,player_id=player_id).delete()
  1900. def delete_comments(request):
  1901. """
  1902. """
  1903. qdata = request.json
  1904. id = qdata.get("id")
  1905. cm.Comments.objects.filter(id=id).delete()