controls.py 88 KB

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