controls.py 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409
  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. def async(f):
  38. def wrapper(*args, **kwargs):
  39. thr = Thread(target=f, args=args, kwargs=kwargs)
  40. thr.start()
  41. return wrapper
  42. def get_today_date():
  43. return '2021-11-25'
  44. if datetime.datetime.now().strftime("%H:%M") < "15:00":
  45. if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
  46. today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
  47. else:
  48. if datetime.datetime.now().weekday()==0:
  49. today = (datetime.datetime.now()-datetime.timedelta(days=3)).strftime("%Y-%m-%d")
  50. else:
  51. today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  52. else:
  53. if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
  54. today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
  55. else:
  56. today = datetime.datetime.now().strftime("%Y-%m-%d")
  57. return today
  58. #return '2021-11-05'
  59. #@async
  60. def update_group_rank(match_id,match_group,stock_date):
  61. #return
  62. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  63. records = prset.values()
  64. case_id = " case id "
  65. cases = []
  66. where = []
  67. for index,pr in enumerate(prset):
  68. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  69. record = records[index]
  70. record.update({"group_rank":index+1})
  71. ccc.cache.delete(key)
  72. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  73. ccc.pl.execute()
  74. #@ccc.cache_data()
  75. def get_notices():
  76. """
  77. """
  78. notices = list(cm.Article.objects.filter(status=2,type="notice").values())
  79. return notices
  80. def get_index_data(request):
  81. """首页数据
  82. """
  83. player = request.player
  84. if not player:
  85. raise ce.TipException(u"该账号未参加任何赛事!")
  86. player_id = player.id
  87. match_id = player.match_id
  88. match_group = player.match_group
  89. #if datetime.datetime.now().hour < 15:
  90. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  91. #else:
  92. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  93. today = get_today_date()
  94. match_name = get_match_info(match_id).get("name")
  95. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id)
  96. if records_set:
  97. try:
  98. cur_rank = get_today_record(player_id,match_id,match_group,today).get("group_rank","")
  99. records = list(records_set.order_by("-stock_date").values())
  100. except:
  101. cur_rank = 0
  102. records = []
  103. else:
  104. cur_rank = 0
  105. records = []
  106. for item in records:
  107. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  108. today_stock = filter(lambda x:x["name"],today_stock)
  109. item["today_stock"] = today_stock
  110. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  111. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  112. yesterday_stock = filter(lambda x:x["name"],yesterday_stock)
  113. item["yesterday_stock"] = yesterday_stock
  114. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  115. item["today_income"] = "{}%".format(item["today_income"]*100)
  116. item["total_income"] = "{}%".format(item["total_income"]*100)
  117. #通知
  118. notices = get_notices()
  119. ret = {"match_name":match_name,"cur_rank":cur_rank,"records":records,"notices":notices}
  120. return ret
  121. def get_player_match_list(request):
  122. """选手参赛列表数据
  123. """
  124. uid = request.user.id
  125. match_ids = list(cm.Player.objects.filter(user_id=uid).values_list("match_id",flat=True))
  126. matchs = list(cm.Match.objects.filter(id__in=match_ids).values())
  127. return matchs
  128. def get_group_income(match_id,match_group):
  129. """
  130. """
  131. data = []
  132. today = datetime.datetime.now().strftime("%Y-%m-%d")
  133. player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
  134. for player_id in player_ids:
  135. today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today).first()
  136. if today_record:
  137. data.append(today_record.total_income)
  138. data = list(set(data))
  139. data = sorted(data,key=lambda x:x,reverse=True)
  140. return data
  141. def get_player_match_detail(request):
  142. """选手参赛详情数据
  143. """
  144. qdata = request.json
  145. player_id = request.player.id
  146. org_player_id = request.player.id
  147. match_group = request.player.match_group
  148. match_id = qdata.get("id")
  149. record_id = qdata.get("record_id")
  150. if record_id:
  151. records_set = cm.PlayerRecord.objects.filter(id=record_id)
  152. match_id = records_set.first().match_id
  153. match_group = records_set.first().match_group
  154. player_id = records_set.first().player_id
  155. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  156. else:
  157. if qdata.get("player_id"):
  158. player_id = qdata.get("player_id")
  159. match_group = cm.Player.objects.filter(id=player_id).first().match_group
  160. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  161. match = cm.Match.objects.filter(id=match_id).values().first()
  162. groups = list(cm.MatchGroup.objects.filter(match_id=match_id).values_list("name",flat=True))
  163. match["groups"] = groups
  164. if records_set:
  165. records = list(records_set.values())
  166. else:
  167. records = []
  168. today = records_set.first().stock_date
  169. today_record = get_today_record(player_id,int(match_id),int(match_group),today)
  170. for item in records:
  171. item["today_stock"] = json.loads(item["today_stock"]) if item["today_stock"] else []
  172. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  173. item["yesterday_stock"] = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  174. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  175. item["today_income"] = "{}%".format(item["today_income"]*100)
  176. item["total_income"] = "{}%".format(item["total_income"]*100)
  177. if today_record:
  178. today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
  179. today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
  180. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  181. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  182. today_record["match_group_name"] = cm.MatchGroup.objects.filter(id=today_record["match_group"]).first().name
  183. today_record["players_num"] = cm.Player.objects.filter(match_group=today_record["match_group"]).count()
  184. today_record["win_rate"] = calc_win_rate(player_id,today_record["match_id"])
  185. badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("today_income").first()
  186. if badest:
  187. today_record["badest_income"] = "{}%".format(badest.today_income*100)
  188. match["groups"] = [today_record["match_group_name"]] if today_record else []
  189. records = sorted(records,key=lambda x:x["stock_date"],reverse=True)[:5]
  190. if cm.UserFollows.objects.filter(user_id=org_player_id,follow_id=player_id).exists():
  191. is_follow = 1
  192. else:
  193. is_follow = 0
  194. ret = {"match":match,"today_record":today_record,"records":records,"is_follow":is_follow}
  195. return ret
  196. def get_today_record(player_id,match_id,match_group,today):
  197. """
  198. """
  199. key = "%s_%s_%s_%s" % (player_id,match_id,match_group,today)
  200. today_record = ccc.cache.get(key)
  201. today_record = json.loads(today_record) if today_record else {}
  202. try:
  203. if today_record:
  204. user_info = get_user_info(today_record["user_id"])
  205. if user_info:
  206. user_info.pop("id")
  207. today_record.update(user_info)
  208. #仓位
  209. today_stock_total = 0
  210. today_stock = json.loads(today_record["today_stock"])
  211. for ts in today_stock:
  212. if ts["fund"]:
  213. try:
  214. today_stock_total += float(ts["fund"])
  215. except Exception as e:
  216. print e
  217. today_record["cangwei"] = "{}%".format(round(today_stock_total/today_record["today_fund"],4)*100)
  218. today_record["today_stock_total"] = today_stock_total
  219. except Exception as e:
  220. import traceback
  221. traceback.print_exc()
  222. return today_record
  223. @ccc.cache_data()
  224. def get_match_group_players(match_id,match_group):
  225. players = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values())
  226. return players
  227. #@ccc.cache_data()
  228. def get_match_groups(match_id):
  229. """
  230. """
  231. match = cm.Match.objects.filter(id=match_id).values().first()
  232. groups = list(cm.MatchGroup.objects.filter(match_id=match_id,is_active=1).values())
  233. return match,groups
  234. #@ccc.cache_data()
  235. def get_cache_rank_list(player_id,match_id,today):
  236. """
  237. """
  238. match,groups = get_match_groups(match_id)
  239. #if datetime.datetime.now().hour < 15:
  240. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  241. #else:
  242. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  243. for item in groups:
  244. new_players = []
  245. players = get_match_group_players(match_id,item["id"])
  246. for player in players:
  247. user_id = player["user_id"]
  248. user = get_user_info(user_id)
  249. username = user["username"] if user else ""
  250. player_id = player["id"]
  251. match_group = item["id"]
  252. today_record = get_today_record(player_id,match_id,match_group,today)
  253. if today_record:
  254. player.update(today_record)
  255. player["username"] = username
  256. player["org_today_income"] = player["today_income"]
  257. player["total_income"] = "{}%".format(today_record["total_income"]*100)
  258. player["today_income"] = "{}%".format(today_record["today_income"]*100)
  259. player["fund"] = round(player["fund"],4)
  260. player["init_fund"] = round(player["init_fund"],4)
  261. player["today_fund"] = round(player["today_fund"],4)
  262. new_players.append(player)
  263. new_players = sorted(new_players,key=lambda x:x["group_rank"])
  264. win_count = filter(lambda x:x["org_today_income"]>=0.05,new_players)
  265. loss_count = filter(lambda x:x["org_today_income"]<=-0.05,new_players)
  266. #item["players_num"] = cm.Player.objects.filter(match_group=item["id"]).count()
  267. item["players_num"] = len(players)
  268. item["win_count"] = len(win_count)
  269. item["loss_count"] = len(loss_count)
  270. item["players"] = new_players[:3]
  271. return match,groups
  272. def get_rank_list(request):
  273. """排名列表
  274. """
  275. qdata = request.json
  276. player_id = request.player.id
  277. match_id = request.player.match_id
  278. today = qdata.get("stock_date")
  279. match,groups = get_cache_rank_list(player_id,match_id,today)
  280. ret = {"match":match,"groups":groups}
  281. return ret
  282. @ccc.cache_data()
  283. def get_user_info(uid):
  284. user = cm.UserInfo.objects.filter(id=uid).values().first()
  285. if user:
  286. user["style"] = []
  287. if user["zq"]:
  288. user["style"].append(user["zq"])
  289. if user["cw"]:
  290. user["style"].append(user["cw"])
  291. if user["df"]:
  292. user["style"].append(user["df"])
  293. return user
  294. @ccc.cache_data()
  295. def get_match_info(match_id):
  296. match = cm.Match.objects.filter(id=match_id).values().first()
  297. return match
  298. @ccc.cache_data()
  299. def get_group_info(group_id):
  300. group = cm.MatchGroup.objects.filter(id=group_id).values().first()
  301. group["players_num"] = cm.Player.objects.filter(match_group=group["id"]).count()
  302. return group
  303. def get_group_rank_list(request):
  304. """排名列表
  305. """
  306. qdata = request.json
  307. kwargs = qdata
  308. group_id = qdata.get("id")
  309. player_id = request.player.id
  310. match_id = request.player.match_id
  311. today = qdata.get("stock_date")
  312. match = get_match_info(match_id)
  313. group = get_group_info(group_id)
  314. players = get_match_group_players(match_id,group_id)
  315. new_players = []
  316. for player in players:
  317. user_id = player["user_id"]
  318. user = get_user_info(user_id)
  319. username = user["username"] if user else ""
  320. player_id = player["id"]
  321. match_group = group_id
  322. today_record = get_today_record(player_id,match_id,int(match_group),today)
  323. if today_record:
  324. player.update(today_record)
  325. player["username"] = username
  326. player["org_today_income"] = player["today_income"]
  327. player["org_total_income"] = player["total_income"]
  328. player["total_income"] = "{}%".format(player["total_income"]*100)
  329. player["today_income"] = "{}%".format(player["today_income"]*100)
  330. player["fund"] = round(player["fund"],4)
  331. player["init_fund"] = round(player["init_fund"],4)
  332. player["today_fund"] = round(player["today_fund"],4)
  333. new_players.append(player)
  334. if kwargs.get("order_by") == "today_income__asc":
  335. new_players = sorted(new_players,key=lambda x:x["org_today_income"])
  336. elif kwargs.get("order_by") == "today_income__desc" :
  337. new_players = sorted(new_players,key=lambda x:x["org_today_income"],reverse=True)
  338. elif kwargs.get("order_by") == "total_income__asc":
  339. new_players = sorted(new_players,key=lambda x:x["org_total_income"])
  340. elif kwargs.get("order_by") == "total_income__desc":
  341. new_players = sorted(new_players,key=lambda x:x["org_total_income"],reverse=True)
  342. else:
  343. new_players = sorted(new_players,key=lambda x:x["group_rank"])
  344. #分页
  345. page = int(kwargs.get("page",0))
  346. page_size = int(kwargs.get("page_size",20))
  347. page_size = 50
  348. if page and page_size:
  349. total,new_players = ccf.get_page_list(new_players,page,page_size)
  350. else:
  351. total = len(new_players)
  352. #应到、实到、请假人数
  353. total_person = cm.Player.objects.filter(match_group=group_id,match_status=1).count()
  354. actual_person = cm.PlayerRecord.objects.filter(match_group=group_id,stock_date=today).count()
  355. leave_person = total_person - actual_person
  356. win_person = cm.PlayerRecord.objects.filter(match_group=group_id,stock_date=today,total_income__gte=0).count()
  357. loss_person = cm.PlayerRecord.objects.filter(match_group=group_id,stock_date=today,total_income__lt=0).count()
  358. ret = {"group":group,"players":new_players,"total":total,"total_person":total_person,
  359. "actual_person":actual_person,"leave_person":leave_person,"win_person":win_person,"loss_person":loss_person}
  360. return ret
  361. def get_player_match_records(request):
  362. """选手参赛每日持股
  363. """
  364. qdata = request.json
  365. player_id = request.player.id
  366. match_id = qdata.get("id")
  367. q_player_id = qdata.get("player_id")
  368. if q_player_id:
  369. player_id = q_player_id
  370. page = int(qdata.get("page",0))
  371. page_size = int(qdata.get("page_size",20))
  372. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  373. data = list(records_set.values())
  374. for item in data:
  375. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  376. today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
  377. item["today_stock"] = today_stock
  378. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  379. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  380. yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
  381. item["yesterday_stock"] = yesterday_stock
  382. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  383. item["today_income"] = "{}%".format(item["today_income"]*100)
  384. item["total_income"] = "{}%".format(item["total_income"]*100)
  385. if page and page_size:
  386. total,data = ccf.get_page_list(data,page,page_size)
  387. return total,data
  388. else:
  389. return len(data),data
  390. def add_model(cls,**kwargs):
  391. """
  392. """
  393. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  394. model = getattr(cm,model_name)
  395. if model_name == "Match":
  396. name = kwargs.get("name")
  397. if cm.Match.objects.filter(name=name).exists():
  398. raise ce.TipException(u"比赛名称重复!")
  399. if model_name == "MatchGoup":
  400. name = kwargs.get("name")
  401. match_id = kwargs.get("match_id")
  402. if cm.MatchGroup.objects.filter(name=name,match_id=match_id).exists():
  403. raise ce.TipException(u"分组名称重复!")
  404. if model_name == "Player":
  405. user_id = kwargs.get("user_id")
  406. match_id = kwargs.get("match_id")
  407. if cm.Player.objects.filter(user_id=user_id,match_id=match_id).exists():
  408. raise ce.TipException(u"重复添加选手!")
  409. if model_name == "PlayerRecord":
  410. now = datetime.datetime.now()
  411. if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
  412. raise ce.TipException(u"今日不能提交数据!")
  413. match_id = kwargs.get("match_id")
  414. stock_date = kwargs.get("stock_date")
  415. today_stock = json.dumps(kwargs.get("today_stock"))
  416. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  417. player_id = kwargs.get("player_id")
  418. today_fund = float(kwargs.get("today_fund",0))
  419. is_markt = int(kwargs.get("is_markt",0))
  420. player = cm.Player.objects.filter(id=player_id).first()
  421. user_id = player.user_id
  422. init_fund = player.fund
  423. user = cm.UserInfo.objects.filter(id=user_id).first()
  424. username = user.username
  425. usercode = user.usercode
  426. match_group = player.match_group
  427. zq = user.zq
  428. cw = user.cw
  429. df = user.df
  430. badge = player.badge
  431. match = cm.Match.objects.filter(id=match_id).first()
  432. if player.match_status < 1:
  433. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  434. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  435. if match.end_time < now_date:
  436. raise ce.TipException(u"该比赛已结束!")
  437. cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).delete()
  438. #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  439. yesterday = cm.PlayerRecord.objects.filter(
  440. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  441. if yesterday:
  442. yesterday_fund = yesterday.today_fund
  443. yesterday_stock = yesterday.today_stock
  444. yesterday_stock_img = yesterday.today_stock_img
  445. yesterday_is_markt = yesterday.is_markt
  446. else:
  447. yesterday_fund = init_fund
  448. yesterday_stock = ""
  449. yesterday_stock_img = ""
  450. yesterday_is_markt = 0
  451. with transaction.atomic():
  452. #记录持股情况
  453. new_stock_list = []
  454. today_stock_list = json.loads(today_stock)
  455. for ts in today_stock_list:
  456. if ts["name"]:
  457. stock,flag = cm.Stock.objects.get_or_create(
  458. name = ts["name"]
  459. )
  460. stock_id = stock.id
  461. usobj,flag = cm.UserStock.objects.get_or_create(
  462. player_id = player_id,
  463. stock_id = stock_id,
  464. stock_date = stock_date
  465. )
  466. ts["stock_id"] = stock_id
  467. new_stock_list.append(ts)
  468. today_stock = json.dumps(new_stock_list)
  469. obj,flag = cm.PlayerRecord.objects.get_or_create(
  470. player_id=player_id,
  471. match_id=match_id,
  472. stock_date=stock_date)
  473. obj.init_fund = init_fund
  474. obj.yesterday_fund = yesterday_fund
  475. obj.yesterday_stock = yesterday_stock
  476. obj.yesterday_stock_img = yesterday_stock_img
  477. obj.today_fund = today_fund
  478. obj.today_stock = today_stock
  479. obj.today_stock_img = today_stock_img
  480. obj.user_id = user_id
  481. obj.username = username
  482. obj.usercode = usercode
  483. obj.match_group = match_group
  484. obj.is_markt = is_markt
  485. obj.yesterday_is_markt = yesterday_is_markt
  486. obj.zq = zq
  487. obj.cw = cw
  488. obj.df = df
  489. obj.badge = badge
  490. #计算今日和昨日盈亏
  491. if float(today_fund)>9999 or float(today_fund)<=0:
  492. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  493. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  494. total_income = (today_fund - init_fund)/float(init_fund)
  495. if float(today_income)>0.4:
  496. raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系副主编!")
  497. obj.today_income = round(today_income,4)
  498. obj.total_income = round(total_income,4)
  499. if not flag:
  500. obj.ctime = datetime.datetime.now()
  501. obj.save()
  502. #更新股票持股人数
  503. for stock in new_stock_list:
  504. cm.Stock.objects.filter(id=stock["stock_id"]).update(user_num=F("user_num")+1)
  505. #更新group_rank
  506. ccc.cache.lpush(settings.RANK_LIST,obj.id)
  507. return obj.id
  508. obj = model.objects.create(**kwargs)
  509. return obj.id
  510. def update_model(cls,**kwargs):
  511. """
  512. """
  513. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  514. model = getattr(cm,model_name)
  515. id = kwargs.pop("id")
  516. rst = model.objects.filter(id=id).update(**kwargs)
  517. if model_name == "Match":
  518. for item in kwargs.get("groups").split(","):
  519. cm.MatchGroup.objects.get_or_create(match_id=obj.id,name=item)
  520. return rst
  521. def delete_model(cls,**kwargs):
  522. """
  523. """
  524. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  525. model = getattr(cm,model_name)
  526. ids = str(kwargs.get("id")).split(",")
  527. rst = model.objects.filter(id__in=ids).delete()
  528. return ids
  529. def get_search_list(cls,**kwargs):
  530. """
  531. """
  532. model_name = re.search(r'.*\.(\w+)SearchView',str(cls.__class__)).groups()[0]
  533. model = getattr(cm,model_name)
  534. qset = model.objects.all()
  535. if model_name == "Stock":
  536. if kwargs.get("name"):
  537. qset = qset.filter(Q(name__icontains=kwargs.get("name"))|Q(code__icontains=kwargs.get("name")))
  538. else:
  539. if kwargs.get("name"):
  540. qset = qset.filter(name__icontains=kwargs.get("name"))
  541. if model_name == "Player":
  542. data = list(qset.values("id","username"))
  543. if model_name == "Stock":
  544. data = list(qset.values("id","name","code"))
  545. for item in data:
  546. if item["code"]:
  547. item["label"] = "%s(%s)" % (item["name"],item["code"])
  548. else:
  549. item["label"] = "%s" % item["name"]
  550. else:
  551. data = list(qset.values("id","name"))
  552. return data
  553. def get_detail_info(cls,**kwargs):
  554. """
  555. """
  556. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  557. model = getattr(cm,model_name)
  558. id = kwargs.get("id")
  559. rst = list(model.objects.filter(id=id).values())
  560. rst = rst[0] if rst else {}
  561. #if model_name == "PlayerRecord":
  562. # rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
  563. # today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  564. # today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
  565. # rst["today_stock"] = today_stock
  566. # today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  567. # rst["today_stock_img"] = today_stock_img
  568. # yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  569. # yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
  570. # rst["yesterday_stock"] = yesterday_stock
  571. #
  572. # yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  573. # rst["yesterday_stock_img"] = yesterday_stock_img
  574. # rst["today_income"] = "{}%".format(rst["today_income"]*100)
  575. # rst["total_income"] = "{}%".format(rst["total_income"]*100)
  576. if model_name == "Article":
  577. rst["ctime"] = ccf.datetime_to_str(rst["ctime"],"%Y-%m-%d")
  578. return rst
  579. #@ccc.cache_data()
  580. def get_record_info(rcid):
  581. """
  582. """
  583. rst = cm.PlayerRecord.objects.filter(id=rcid).values().first()
  584. if rst:
  585. rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
  586. today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  587. today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
  588. rst["today_stock"] = today_stock
  589. today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  590. rst["today_stock_img"] = today_stock_img
  591. yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  592. yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
  593. rst["yesterday_stock"] = yesterday_stock
  594. yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  595. rst["yesterday_stock_img"] = yesterday_stock_img
  596. rst["today_income"] = "{}%".format(rst["today_income"]*100)
  597. rst["total_income"] = "{}%".format(rst["total_income"]*100)
  598. return rst
  599. def get_list_info(cls,**kwargs):
  600. """
  601. """
  602. model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
  603. model = getattr(cm,model_name)
  604. qset = model.objects.all()
  605. if kwargs.get("name"):
  606. qset = qset.filter(name__icontains=kwargs.get("name"))
  607. if model_name == "UserInfo":
  608. if kwargs.get("username"):
  609. qset = qset.filter(username__icontains=kwargs.get("username"))
  610. if kwargs.get("usercode"):
  611. qset = qset.filter(usercode=kwargs.get("usercode"))
  612. data = list(qset.order_by("-id").values())
  613. page = int(kwargs.get("page",0))
  614. page_size = int(kwargs.get("page_size",20))
  615. if page and page_size:
  616. total,data = ccf.get_page_list(data,page,page_size)
  617. if model_name == "Player":
  618. for item in data:
  619. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  620. match = cm.Match.objects.filter(id=item["match_id"]).first()
  621. item["username"] = user.username
  622. item["usercode"] = user.usercode
  623. item["match_name"] = match.name if match else ""
  624. return (total,data)
  625. else:
  626. return len(data),data
  627. return rst
  628. def add_player_record_single(**kwargs):
  629. """用户单独上传数据
  630. """
  631. now = datetime.datetime.now()
  632. if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
  633. raise ce.TipException(u"今日不能提交数据!")
  634. usercode = kwargs.get("usercode")
  635. match_id = kwargs.get("match_id")
  636. if not cm.Player.objects.filter(usercode=usercode,match_id=match_id).exists():
  637. raise ce.TipException(u"用户代码错误")
  638. stock_date = kwargs.get("stock_date")
  639. today_stock = json.dumps(kwargs.get("today_stock"))
  640. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  641. today_fund = float(kwargs.get("today_fund"))
  642. is_markt = int(kwargs.get("is_markt",0))
  643. player = cm.Player.objects.filter(usercode=usercode,match_id=match_id).first()
  644. player_id = player.id
  645. user_id = player.user_id
  646. init_fund = player.fund
  647. user = cm.UserInfo.objects.filter(id=user_id).first()
  648. username = user.username
  649. usercode = user.usercode
  650. match_group = player.match_group
  651. match = cm.Match.objects.filter(id=match_id).first()
  652. if player.match_status < 1:
  653. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  654. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  655. if match.end_time < now_date:
  656. raise ce.TipException(u"该比赛已结束!")
  657. #yesterday = cm.PlayerRecord.objects.filter(
  658. # match_id=match_id,player_id=player_id).order_by("-id").first()
  659. yesterday = cm.PlayerRecord.objects.filter(
  660. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  661. if yesterday:
  662. yesterday_fund = yesterday.today_fund
  663. yesterday_stock = yesterday.today_stock
  664. yesterday_stock_img = yesterday.today_stock_img
  665. else:
  666. yesterday_fund = init_fund
  667. yesterday_stock = ""
  668. yesterday_stock_img = ""
  669. #记录持股情况
  670. new_stock_list = []
  671. today_stock_list = json.loads(today_stock)
  672. for ts in today_stock_list:
  673. if ts["name"]:
  674. stock,flag = cm.Stock.objects.get_or_create(
  675. name = ts["stock"]
  676. )
  677. stock_id = stock.id
  678. usobj,flag = cm.UserStock.objects.get_or_create(
  679. player_id = player_id,
  680. stock_id = stock_id,
  681. stock_date = stock_date
  682. )
  683. ts["stock_id"] = stock_id
  684. new_stock_list.append(ts)
  685. today_stock = json.dumps(new_stock_list)
  686. obj,flag = cm.PlayerRecord.objects.get_or_create(
  687. player_id=player_id,
  688. match_id=match_id,
  689. stock_date=stock_date)
  690. obj.init_fund = init_fund
  691. obj.yesterday_fund = yesterday_fund
  692. obj.yesterday_stock = yesterday_stock
  693. obj.yesterday_stock_img = yesterday_stock_img
  694. obj.today_fund = today_fund
  695. obj.today_stock = today_stock
  696. obj.today_stock_img = today_stock_img
  697. obj.user_id = user_id
  698. obj.username = username
  699. obj.usercode = usercode
  700. obj.match_group = match_group
  701. obj.is_markt = is_markt
  702. #计算今日和昨日盈亏
  703. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  704. total_income = (today_fund - init_fund)/float(init_fund)
  705. if int(today_fund)>9999 or int(today_fund)<0:
  706. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  707. if int(today_income)>2:
  708. raise ce.TipException(u"数据错误,今日盈利已超过2倍,请仔细核对数据!")
  709. obj.today_income = round(today_income,4)
  710. obj.total_income = round(total_income,4)
  711. if not flag:
  712. obj.ctime = datetime.datetime.now()
  713. obj.save()
  714. #更新股票持股人数
  715. for stock in new_stock_list:
  716. cm.Stock.objects.filter(id=stock["id"]).update(user_num=F("user_num")+1)
  717. #更新group_rank
  718. #update_group_rank(match_id,match_group,obj.stock_date)
  719. ccc.cache.lpush(settings.RANK_LIST,obj.id)
  720. return obj.id
  721. def get_single_match_info(match_id):
  722. """
  723. """
  724. if not match_id:
  725. match = cm.Match.objects.all().order_by("-id").values().first()
  726. else:
  727. match = cm.Match.objects.filter(id=match_id).values().first()
  728. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  729. return now_date,match
  730. def get_cur_record(request):
  731. """
  732. """
  733. player = request.player
  734. player_id = player.id
  735. match_id = player.match_id
  736. match_group = player.match_group
  737. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  738. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).order_by("-stock_date")
  739. data = qset.values().first() if qset else {}
  740. #today_record = get_today_record(player_id,match_id,match_group,today)
  741. if data:
  742. data["today_stock_img"] = json.loads(data["today_stock_img"]) if data["today_stock_img"] else []
  743. data["today_stock"] = json.loads(data["today_stock"]) if data["today_stock"] else []
  744. return data
  745. def follow_player(**kwargs):
  746. """
  747. """
  748. user_id = kwargs.get("player_id")
  749. follow_id = kwargs.get("follow_id")
  750. if kwargs.get("action") == "cancel":
  751. cm.UserFollows.objects.filter(user_id=user_id,follow_id=follow_id).delete()
  752. return True
  753. else:
  754. obj,flag = cm.UserFollows.objects.get_or_create(user_id=user_id,follow_id=follow_id)
  755. return obj.id
  756. def calc_win_rate(player_id,match_id):
  757. """计算胜率
  758. """
  759. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
  760. win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  761. win_rate = round(win_rate,3)
  762. win_rate = "{}%".format(win_rate*100)
  763. return win_rate
  764. def get_user_follows(request):
  765. """获取用户关注的选手列表
  766. """
  767. user_id = request.player.id
  768. print user_id
  769. match_id = request.player.match_id
  770. match_group = request.player.match_group
  771. qdata = request.json
  772. today = get_today_date()
  773. print today
  774. data = []
  775. qset = cm.UserFollows.objects.filter(user_id=user_id)
  776. follow_ids = list(qset.values_list("follow_id",flat=True))
  777. for player_id in follow_ids:
  778. last = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date").first()
  779. if last:
  780. today = last.stock_date
  781. today_record = get_today_record(player_id,match_id,last.match_group,today)
  782. if today_record:
  783. data.append(today_record)
  784. data = sorted(data,key=lambda x:x["group_rank"])
  785. page = int(qdata.get("page",1))
  786. page_size = int(qdata.get("page_size",20))
  787. if page and page_size:
  788. total,data = ccf.get_page_list(data,page,page_size)
  789. for item in data:
  790. item["today_stock"] = json.loads(item["today_stock"])
  791. item["today_stock_img"] = json.loads(item["today_stock_img"])
  792. item["win_rate"] = calc_win_rate(item["player_id"],item["match_id"])
  793. item["today_income"] = "{}%".format(item["today_income"]*100)
  794. item["total_income"] = "{}%".format(item["total_income"]*100)
  795. return total,data
  796. else:
  797. return len(data),data
  798. def get_hot_stock_rank(**kwargs):
  799. """
  800. """
  801. data = {
  802. "hot_buy":[
  803. {"stock_name":u"创业黑马","count":12}
  804. ],
  805. "hot_sell":[
  806. {"stock_name":u"创业黑马","count":12}
  807. ]
  808. }
  809. return data
  810. def get_hot_stock_buy(**kwargs):
  811. """
  812. """
  813. stock_date = kwargs.get("stock_date")
  814. qset = cm.UserStock.objects.filter(stock_date=stock_date)
  815. qset = qset.values("stock_id").annotate(count=Count("stock_id")).order_by("-count")
  816. data = []
  817. for q in qset:
  818. stock_id = q["stock_id"]
  819. count = q["count"]
  820. data.append(
  821. {
  822. "stock_name":cm.Stock.objects.filter(id=stock_id).first().name,
  823. "count":count,
  824. "id":stock_id
  825. }
  826. )
  827. if kwargs.get("name"):
  828. data = filter(lambda x:kwargs.get("name") in x["stock_name"],data)
  829. page = int(kwargs.get("page",1))
  830. page_size = int(kwargs.get("page_size",20))
  831. if page and page_size:
  832. total,data = ccf.get_page_list(data,page,page_size)
  833. return total,data
  834. else:
  835. return len(data),data
  836. return data
  837. def get_hot_follow(**kwargs):
  838. """
  839. """
  840. stock_date = kwargs.get("stock_date")
  841. #qset = cm.UserFollows.objects.filter(stock_date=stock_date)
  842. qset = cm.UserFollows.objects.all()
  843. qset = qset.values("follow_id").annotate(count=Count("follow_id")).order_by("-count")
  844. data = []
  845. for q in qset:
  846. player_id = q["follow_id"]
  847. count = q["count"]
  848. player = cm.Player.objects.filter(id=player_id).first()
  849. today = cm.PlayerRecord.objects.filter(player_id=player_id).order_by("-stock_date").first().stock_date
  850. badest_income = cm.PlayerRecord.objects.filter(player_id=player_id).order_by("-today_income").first().today_income
  851. today_record = get_today_record(player_id,int(player.match_id),int(player.match_group),today)
  852. userinfo = get_user_info(today_record["user_id"])
  853. data.append(
  854. {
  855. "player_name":player.username,
  856. "count":count,
  857. "id":player_id,
  858. "today_fund":today_record["today_fund"],
  859. "total_income":"{}%".format(today_record["total_income"]*100),
  860. "today_income":"{}%".format(today_record["today_income"]*100),
  861. "badest_income":"{}%".format(badest_income*100),
  862. "style":userinfo.get("style"),
  863. "badge":userinfo.get("badge"),
  864. "match_id":player.match_id,
  865. "win_rate":calc_win_rate(player_id,player.match_id)
  866. }
  867. )
  868. if kwargs.get("name"):
  869. data = filter(lambda x:kwargs.get("name") in x["player_name"],data)
  870. page = int(kwargs.get("page",1))
  871. page_size = int(kwargs.get("page_size",20))
  872. if page and page_size:
  873. total,data = ccf.get_page_list(data,page,page_size)
  874. return total,data
  875. else:
  876. return len(data),data
  877. return data
  878. def get_hot_stock_sell(**kwargs):
  879. """
  880. """
  881. stock_date = kwargs.get("stock_date")
  882. stock_date_time = ccf.str_to_datetime(kwargs.get("stock_date"),"%Y-%m-%d")
  883. yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  884. ##昨天所有股票
  885. #yes_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True))
  886. #yes_stock_ids = list(set(yes_stock_ids))
  887. #data = []
  888. #for ysi in yes_stock_ids:
  889. # yes_count = cm.UserStock.objects.filter(stock_date=yesterday,stock_id=ysi).count()
  890. # td_count = cm.UserStock.objects.filter(stock_date=stock_date,stock_id=ysi).count()
  891. # if td_count < yes_count:
  892. # stock_name = cm.Stock.objects.filter(id=ysi).first().name
  893. # data.append({"stock_name":stock_name,"count":yes_count-td_count,"id":ysi})
  894. qset = cm.HotStockSellCount.objects.filter(stock_date=stock_date).order_by("-count")
  895. data = list(qset.values("stock_name","stock_id","count"))
  896. for item in data:
  897. item["id"] = item["stock_id"]
  898. page = int(kwargs.get("page",0))
  899. page_size = int(kwargs.get("page_size",20))
  900. if page and page_size:
  901. total,data = ccf.get_page_list(data,page,page_size)
  902. return total,data
  903. else:
  904. return len(data),data
  905. return data
  906. def get_stock_info(_id):
  907. """
  908. """
  909. data = cm.Stock.objects.filter(id=_id).values().first()
  910. return data
  911. def get_hot_stock_sell_players(**kwargs):
  912. """
  913. """
  914. _id = kwargs.get("id")
  915. stock_date = kwargs.get("stock_date")
  916. stock_date_time = ccf.str_to_datetime(kwargs.get("stock_date"),"%Y-%m-%d")
  917. yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  918. #昨天持股选手
  919. yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=_id).values_list("player_id",flat=True))
  920. td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=_id).values_list("player_id",flat=True))
  921. sell_players = list(set(yes_players)-set(td_players))
  922. data = []
  923. for player_id in sell_players:
  924. player = cm.Player.objects.filter(id=player_id).first()
  925. if player:
  926. match_id = player.match_id
  927. match_group = player.match_group
  928. today_record = get_today_record(player_id,match_id,match_group,stock_date)
  929. if today_record:
  930. today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
  931. today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
  932. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  933. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  934. data.append(today_record)
  935. page = int(kwargs.get("page",0))
  936. page_size = int(kwargs.get("page_size",20))
  937. if page and page_size:
  938. total,data = ccf.get_page_list(data,page,page_size)
  939. return total,data
  940. else:
  941. return len(data),data
  942. return data
  943. def get_win_rate_rank(request):
  944. """
  945. """
  946. player_id = request.player.id
  947. match_id = request.player.match_id
  948. match_group = request.player.match_group
  949. kwargs = request.json
  950. qset = cm.WinDefendRank.objects.filter(match_id=match_id).order_by("-win_rate")
  951. data = list(qset.values())
  952. page = int(kwargs.get("page",1))
  953. page_size = int(kwargs.get("page_size",20))
  954. if page and page_size:
  955. total,data = ccf.get_page_list(data,page,page_size)
  956. else:
  957. total = len(data)
  958. for item in data:
  959. item["win_rate"] = "{}%".format(item["win_rate"]*100)
  960. item["badest_income"] = "{}%".format(item["badest_income"]*100)
  961. item["total_income"] = "{}%".format(item["total_income"]*100)
  962. userinfo = get_user_info(item["user_id"])
  963. item["badge"] = userinfo.get("badge")
  964. item["style"] = userinfo.get("style")
  965. return total,data
  966. def get_defend_rank(request):
  967. """
  968. """
  969. player_id = request.player.id
  970. match_id = request.player.match_id
  971. match_group = request.player.match_group
  972. kwargs = request.json
  973. qset = cm.WinDefendRank.objects.filter(match_id=match_id).order_by("-badest_income")
  974. data = list(qset.values())
  975. page = int(kwargs.get("page",1))
  976. page_size = int(kwargs.get("page_size",20))
  977. if page and page_size:
  978. total,data = ccf.get_page_list(data,page,page_size)
  979. else:
  980. total = len(data)
  981. for item in data:
  982. item["win_rate"] = "{}%".format(item["win_rate"]*100)
  983. item["badest_income"] = "{}%".format(item["badest_income"]*100)
  984. item["total_income"] = "{}%".format(item["total_income"]*100)
  985. item["style"] = []
  986. if item["zq"]:
  987. item["style"].apepnd(item["zq"])
  988. if item["cw"]:
  989. item["style"].apepnd(item["cw"])
  990. if item["df"]:
  991. item["style"].apepnd(item["df"])
  992. item["badge"] = cm.Player.objects.filter(id=item["player_id"]).first().badge
  993. return total,data
  994. def get_champion_articles_list(request):
  995. """
  996. """
  997. kwargs = request.json
  998. qset = cm.Article.objects.filter(status=2,type="champion")
  999. page = int(kwargs.get("page",0))
  1000. page_size = int(kwargs.get("page_size",20))
  1001. if page and page_size:
  1002. total,qset = ccf.get_page_qset(qset,page,page_size)
  1003. else:
  1004. total = qset.count()
  1005. data = list(qset.values())
  1006. for item in data:
  1007. item["ctime"] = ccf.datetime_to_str(item["ctime"],"%Y-%m-%d")
  1008. return total,data
  1009. def get_wanzhu_comment(**kwargs):
  1010. """
  1011. """
  1012. match_id = kwargs.get("match_id")
  1013. group_id = kwargs.get("group_id")
  1014. print match_id
  1015. today = get_today_date()
  1016. players = get_match_group_players(match_id,group_id)
  1017. new_players = []
  1018. for player in players:
  1019. user_id = player["user_id"]
  1020. user = get_user_info(user_id)
  1021. username = user["username"] if user else ""
  1022. player_id = player["id"]
  1023. match_group = group_id
  1024. today_record = get_today_record(player_id,match_id,int(match_group),today)
  1025. if today_record and today_record.get("wanzhu_comment"):
  1026. player.update(today_record)
  1027. player["username"] = username
  1028. player["total_income"] = "{}%".format(player["total_income"]*100)
  1029. player["fund"] = round(player["fund"],4)
  1030. player["init_fund"] = round(player["init_fund"],4)
  1031. player["today_fund"] = round(player["today_fund"],4)
  1032. player["today_stock"] = json.loads(player["today_stock"]) if player["today_stock"] else []
  1033. new_players.append(player)
  1034. new_players = sorted(new_players,key=lambda x:x["group_rank"])
  1035. data = new_players
  1036. page = int(kwargs.get("page",0))
  1037. page_size = int(kwargs.get("page_size",20))
  1038. if page and page_size:
  1039. total,data = ccf.get_page_list(data,page,page_size)
  1040. else:
  1041. total = len(data)
  1042. return total,data
  1043. def get_enum_list(request):
  1044. """
  1045. """
  1046. data = {
  1047. "zq":[
  1048. u"短线博弈",
  1049. u"长线价投",
  1050. u"长短兼备"
  1051. ],
  1052. "cw":[
  1053. u"分仓开超市",
  1054. u"重仓押注",
  1055. u"全仓单钓",
  1056. u"融资加倍"
  1057. ],
  1058. "df":[
  1059. u"低吸",
  1060. u"半路",
  1061. u"首板",
  1062. u"接力",
  1063. u"撬板",
  1064. u"T加0",
  1065. u"隔夜卖",
  1066. u"格局锁仓",
  1067. u"核按钮"
  1068. ],
  1069. "pz":[
  1070. u"N/C字头新股",
  1071. u"次新股",
  1072. u"可转债",
  1073. u"港股",
  1074. u"基金",
  1075. u"逆回购"
  1076. ]
  1077. }
  1078. return data
  1079. def get_player_list(**kwargs):
  1080. """选手列表
  1081. """
  1082. match_id = kwargs.get("match_id")
  1083. today = get_today_date()
  1084. qset = cm.Player.objects.filter(match_id=match_id,match_status=1)
  1085. if kwargs.get("name"):
  1086. qset = qset.filter(username__icontains=kwargs.get("name"))
  1087. data = list(qset.values())
  1088. for item in data:
  1089. match_id = item["match_id"]
  1090. match_group = item["match_group"]
  1091. user_id = item["user_id"]
  1092. player_id = item["id"]
  1093. #user = cm.UserInfo.objects.filter(id=user_id).first()
  1094. today_record = get_today_record(player_id,match_id,match_group,today)
  1095. if today_record:
  1096. today_record.pop("id")
  1097. item.update(today_record)
  1098. user_info = get_user_info(user_id)
  1099. if user_info:
  1100. user_info.pop("id")
  1101. item.update(user_info)
  1102. if kwargs.get("zq"):
  1103. data = filter(lambda x:kwargs.get("zq") == x["zq"],data)
  1104. if kwargs.get("cw"):
  1105. data = filter(lambda x:kwargs.get("cw") == x["cw"],data)
  1106. if kwargs.get("df"):
  1107. data = filter(lambda x:kwargs.get("df") == x["df"],data)
  1108. page = int(kwargs.get("page",0))
  1109. page_size = int(kwargs.get("page_size",20))
  1110. if page and page_size:
  1111. total,data = ccf.get_page_list(data,page,page_size)
  1112. else:
  1113. total = len(data)
  1114. return total,data
  1115. def get_mine_style(request):
  1116. """
  1117. """
  1118. user = request.user
  1119. player = request.player
  1120. data = {
  1121. "zq":user.zq,
  1122. "cw":user.cw,
  1123. "df":user.df,
  1124. "pz":user.pz,
  1125. "join_time":user.join_time,
  1126. "account_img":user.account_img,
  1127. }
  1128. if player:
  1129. data["is_player"] = 1
  1130. data["init_fund"] = player.fund
  1131. else:
  1132. data["is_player"] = 0
  1133. data["init_fund"] = None
  1134. return data
  1135. def update_user_style(**kwargs):
  1136. """
  1137. """
  1138. user_id = kwargs.pop("user_id")
  1139. player_id = kwargs.pop("player_id")
  1140. init_fund = kwargs.pop("init_fund")
  1141. cm.UserInfo.objects.filter(id=user_id).update(**kwargs)
  1142. if player_id and init_fund:
  1143. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  1144. return True
  1145. def get_stock_players(**kwargs):
  1146. """
  1147. """
  1148. stock_id = kwargs.get("stock_id")
  1149. stock_date = kwargs.get("stock_date")
  1150. data = []
  1151. user_stocks = cm.UserStock.objects.filter(stock_id=stock_id,stock_date=stock_date)
  1152. for us in user_stocks:
  1153. player_id = us.player_id
  1154. player = cm.Player.objects.filter(id=player_id).first()
  1155. if player:
  1156. match_id = player.match_id
  1157. match_group = player.match_group
  1158. if stock_date:
  1159. today_record = get_today_record(player_id,match_id,match_group,stock_date)
  1160. else:
  1161. today_record = get_today_record(player_id,match_id,match_group,us.stock_date)
  1162. if today_record:
  1163. today_record["today_stock_img"] = json.loads(today_record["today_stock_img"]) if today_record["today_stock_img"] else []
  1164. today_record["today_stock"] = json.loads(today_record["today_stock"]) if today_record["today_stock"] else []
  1165. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  1166. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  1167. data.append(today_record)
  1168. #分页
  1169. page = int(kwargs.get("page",1))
  1170. page_size = int(kwargs.get("page_size",20))
  1171. if page and page_size:
  1172. total,data = ccf.get_page_list(data,page,page_size)
  1173. else:
  1174. total = len(data)
  1175. return data
  1176. def update_user_fund(**kwargs):
  1177. """
  1178. """
  1179. user_id = kwargs.pop("user_id")
  1180. player_id = kwargs.pop("player_id")
  1181. init_fund = kwargs.pop("init_fund")
  1182. if player_id and init_fund:
  1183. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  1184. return True
  1185. def get_player_match_calendar(**kwargs):
  1186. """
  1187. """
  1188. player_id = kwargs.get("player_id")
  1189. match_id = kwargs.get("match_id")
  1190. month = kwargs.get("month")
  1191. print kwargs
  1192. week,eday = calendar.monthrange(int(month.split("-")[0]),int(month.split("-")[1]))
  1193. sday = "01"
  1194. eday = str(eday).zfill(2)
  1195. sdate = month + "-" + sday
  1196. edate = month + "-" + eday
  1197. print sdate,edate
  1198. qset = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id)\
  1199. .filter(stock_date__gte=sdate,stock_date__lte=edate)
  1200. data = list(qset.values())
  1201. dct = {}
  1202. for item in data:
  1203. item["today_income"] = "{}%".format(item["today_income"]*100)
  1204. dct[item["stock_date"]] = item["today_income"]
  1205. newdata = []
  1206. for i in range(1,int(eday)+1):
  1207. stock_date = month + "-" + str(i).zfill(2)
  1208. newdata.append({
  1209. "stock_date":stock_date,
  1210. "today_income":dct.get(stock_date,""),
  1211. })
  1212. return newdata