controls.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  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
  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 xlrd
  31. import xlwt
  32. from xlutils.copy import copy
  33. from xltpl.writer import BookWriter
  34. from django_redis import get_redis_connection
  35. from constants import *
  36. def async(f):
  37. def wrapper(*args, **kwargs):
  38. thr = Thread(target=f, args=args, kwargs=kwargs)
  39. thr.start()
  40. return wrapper
  41. def get_today_date():
  42. if datetime.datetime.now().strftime("%H:%M") < "15:00":
  43. if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
  44. today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
  45. else:
  46. if datetime.datetime.now().weekday()==0:
  47. today = (datetime.datetime.now()-datetime.timedelta(days=3)).strftime("%Y-%m-%d")
  48. else:
  49. today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  50. else:
  51. if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
  52. today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
  53. else:
  54. today = datetime.datetime.now().strftime("%Y-%m-%d")
  55. return today
  56. #return '2021-11-05'
  57. #@async
  58. def update_group_rank(match_id,match_group,stock_date):
  59. #return
  60. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  61. records = prset.values()
  62. case_id = " case id "
  63. cases = []
  64. where = []
  65. for index,pr in enumerate(prset):
  66. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  67. record = records[index]
  68. record.update({"group_rank":index+1})
  69. ccc.cache.delete(key)
  70. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  71. ccc.pl.execute()
  72. #@ccc.cache_data()
  73. def get_notices():
  74. """
  75. """
  76. notices = list(cm.Article.objects.filter(status=2).values())
  77. return notices
  78. def get_index_data(request):
  79. """首页数据
  80. """
  81. player = request.player
  82. if not player:
  83. raise ce.TipException(u"该账号未参加任何赛事!")
  84. player_id = player.id
  85. match_id = player.match_id
  86. match_group = player.match_group
  87. #if datetime.datetime.now().hour < 15:
  88. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  89. #else:
  90. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  91. today = get_today_date()
  92. match_name = get_match_info(match_id).get("name")
  93. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id)
  94. if records_set:
  95. try:
  96. cur_rank = get_today_record(player_id,match_id,match_group,today).get("group_rank","")
  97. records = list(records_set.order_by("-stock_date").values())
  98. except:
  99. cur_rank = 0
  100. records = []
  101. else:
  102. cur_rank = 0
  103. records = []
  104. for item in records:
  105. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  106. today_stock = filter(lambda x:x["name"],today_stock)
  107. item["today_stock"] = today_stock
  108. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  109. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  110. yesterday_stock = filter(lambda x:x["name"],yesterday_stock)
  111. item["yesterday_stock"] = yesterday_stock
  112. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  113. item["today_income"] = "{}%".format(item["today_income"]*100)
  114. item["total_income"] = "{}%".format(item["total_income"]*100)
  115. #通知
  116. notices = get_notices()
  117. ret = {"match_name":match_name,"cur_rank":cur_rank,"records":records,"notices":notices}
  118. return ret
  119. def get_player_match_list(request):
  120. """选手参赛列表数据
  121. """
  122. uid = request.user.id
  123. match_ids = list(cm.Player.objects.filter(user_id=uid).values_list("match_id",flat=True))
  124. matchs = list(cm.Match.objects.filter(id__in=match_ids).values())
  125. return matchs
  126. def get_group_income(match_id,match_group):
  127. """
  128. """
  129. data = []
  130. today = datetime.datetime.now().strftime("%Y-%m-%d")
  131. player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
  132. for player_id in player_ids:
  133. today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today).first()
  134. if today_record:
  135. data.append(today_record.total_income)
  136. data = list(set(data))
  137. data = sorted(data,key=lambda x:x,reverse=True)
  138. return data
  139. def get_player_match_detail(request):
  140. """选手参赛详情数据
  141. """
  142. qdata = request.json
  143. player_id = request.player.id
  144. match_group = request.player.match_group
  145. match_id = qdata.get("id")
  146. record_id = qdata.get("record_id")
  147. if record_id:
  148. records_set = cm.PlayerRecord.objects.filter(id=record_id)
  149. match_id = records_set.first().match_id
  150. match_group = records_set.first().match_group
  151. player_id = records_set.first().player_id
  152. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  153. else:
  154. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  155. match = cm.Match.objects.filter(id=match_id).values().first()
  156. groups = list(cm.MatchGroup.objects.filter(match_id=match_id).values_list("name",flat=True))
  157. match["groups"] = groups
  158. if records_set:
  159. #today_record = records_set.values().first()
  160. records = list(records_set.values())
  161. else:
  162. #today_record = {}
  163. records = []
  164. today = get_today_date()
  165. today_record = get_today_record(player_id,int(match_id),int(match_group),today)
  166. for item in records:
  167. item["today_stock"] = json.loads(item["today_stock"]) if item["today_stock"] else []
  168. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  169. item["yesterday_stock"] = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  170. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  171. item["today_income"] = "{}%".format(item["today_income"]*100)
  172. item["total_income"] = "{}%".format(item["total_income"]*100)
  173. if today_record:
  174. today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
  175. today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
  176. today_record["match_group_name"] = cm.MatchGroup.objects.filter(id=today_record["match_group"]).first().name
  177. match["groups"] = [today_record["match_group_name"]] if today_record else []
  178. records = sorted(records,key=lambda x:x["stock_date"],reverse=True)
  179. ret = {"match":match,"today_record":today_record,"records":records}
  180. return ret
  181. #@ccc.cache_data()
  182. #def get_today_record(player_id,match_id,match_group,today):
  183. # records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id,match_group=match_group,stock_date=today)
  184. # if records_set:
  185. # today_record = records_set.values().first()
  186. # else:
  187. # today_record = {}
  188. # return today_record
  189. def get_today_record(player_id,match_id,match_group,today):
  190. """
  191. """
  192. key = "%s_%s_%s_%s" % (player_id,match_id,match_group,today)
  193. today_record = ccc.cache.get(key)
  194. today_record = json.loads(today_record) if today_record else {}
  195. return today_record
  196. @ccc.cache_data()
  197. def get_match_group_players(match_id,match_group):
  198. players = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values())
  199. return players
  200. #@ccc.cache_data()
  201. def get_match_groups(match_id):
  202. """
  203. """
  204. match = cm.Match.objects.filter(id=match_id).values().first()
  205. groups = list(cm.MatchGroup.objects.filter(match_id=match_id,is_active=1).values())
  206. return match,groups
  207. #@ccc.cache_data()
  208. def get_cache_rank_list(player_id,match_id):
  209. """
  210. """
  211. match,groups = get_match_groups(match_id)
  212. #if datetime.datetime.now().hour < 15:
  213. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  214. #else:
  215. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  216. today = get_today_date()
  217. for item in groups:
  218. new_players = []
  219. players = get_match_group_players(match_id,item["id"])
  220. for player in players:
  221. user_id = player["user_id"]
  222. user = get_user_info(user_id)
  223. username = user["username"] if user else ""
  224. player_id = player["id"]
  225. match_group = item["id"]
  226. today_record = get_today_record(player_id,match_id,match_group,today)
  227. if today_record:
  228. player.update(today_record)
  229. player["username"] = username
  230. player["total_income"] = "{}%".format(today_record["total_income"]*100)
  231. player["fund"] = round(player["fund"],4)
  232. player["init_fund"] = round(player["init_fund"],4)
  233. player["today_fund"] = round(player["today_fund"],4)
  234. new_players.append(player)
  235. new_players = sorted(new_players,key=lambda x:x["group_rank"])
  236. item["players"] = new_players[:3]
  237. return match,groups
  238. def get_rank_list(request):
  239. """排名列表
  240. """
  241. qdata = request.json
  242. player_id = request.player.id
  243. match_id = request.player.match_id
  244. match,groups = get_cache_rank_list(player_id,match_id)
  245. ret = {"match":match,"groups":groups}
  246. return ret
  247. @ccc.cache_data()
  248. def get_user_info(uid):
  249. user = cm.UserInfo.objects.filter(id=uid).values().first()
  250. return user
  251. @ccc.cache_data()
  252. def get_match_info(match_id):
  253. match = cm.Match.objects.filter(id=match_id).values().first()
  254. return match
  255. @ccc.cache_data()
  256. def get_group_info(group_id):
  257. group = cm.MatchGroup.objects.filter(id=group_id).values().first()
  258. return group
  259. def get_group_rank_list(request):
  260. """排名列表
  261. """
  262. qdata = request.json
  263. kwargs = qdata
  264. group_id = qdata.get("id")
  265. player_id = request.player.id
  266. match_id = request.player.match_id
  267. match = get_match_info(match_id)
  268. group = get_group_info(group_id)
  269. #if datetime.datetime.now().hour < 15:
  270. # today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  271. #else:
  272. # today = datetime.datetime.now().strftime("%Y-%m-%d")
  273. today = get_today_date()
  274. #players = list(cm.Player.objects.filter(match_id=match_id,match_group=group_id).values())
  275. players = get_match_group_players(match_id,group_id)
  276. new_players = []
  277. for player in players:
  278. user_id = player["user_id"]
  279. user = get_user_info(user_id)
  280. username = user["username"] if user else ""
  281. player_id = player["id"]
  282. match_group = group_id
  283. today_record = get_today_record(player_id,match_id,int(match_group),today)
  284. if today_record:
  285. player.update(today_record)
  286. player["username"] = username
  287. player["total_income"] = "{}%".format(player["total_income"]*100)
  288. player["fund"] = round(player["fund"],4)
  289. player["init_fund"] = round(player["init_fund"],4)
  290. player["today_fund"] = round(player["today_fund"],4)
  291. new_players.append(player)
  292. new_players = sorted(new_players,key=lambda x:x["group_rank"])
  293. #分页
  294. page = int(kwargs.get("page",0))
  295. page_size = int(kwargs.get("page_size",20))
  296. page_size = 50
  297. if page and page_size:
  298. total,new_players = ccf.get_page_list(new_players,page,page_size)
  299. else:
  300. total = len(new_players)
  301. ret = {"group":group,"players":new_players,"total":total}
  302. return ret
  303. def get_player_match_records(request):
  304. """选手参赛每日持股
  305. """
  306. qdata = request.json
  307. player_id = request.player.id
  308. match_id = qdata.get("id")
  309. q_player_id = qdata.get("player_id")
  310. if q_player_id:
  311. player_id = q_player_id
  312. page = int(qdata.get("page",0))
  313. page_size = int(qdata.get("page_size",20))
  314. records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
  315. data = list(records_set.values())
  316. for item in data:
  317. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  318. today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
  319. item["today_stock"] = today_stock
  320. item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  321. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  322. yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
  323. item["yesterday_stock"] = yesterday_stock
  324. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  325. item["today_income"] = "{}%".format(item["today_income"]*100)
  326. item["total_income"] = "{}%".format(item["total_income"]*100)
  327. if page and page_size:
  328. total,data = ccf.get_page_list(data,page,page_size)
  329. return total,data
  330. else:
  331. return len(data),data
  332. def add_model(cls,**kwargs):
  333. """
  334. """
  335. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  336. model = getattr(cm,model_name)
  337. if model_name == "Match":
  338. name = kwargs.get("name")
  339. if cm.Match.objects.filter(name=name).exists():
  340. raise ce.TipException(u"比赛名称重复!")
  341. if model_name == "MatchGoup":
  342. name = kwargs.get("name")
  343. match_id = kwargs.get("match_id")
  344. if cm.MatchGroup.objects.filter(name=name,match_id=match_id).exists():
  345. raise ce.TipException(u"分组名称重复!")
  346. if model_name == "Player":
  347. user_id = kwargs.get("user_id")
  348. match_id = kwargs.get("match_id")
  349. if cm.Player.objects.filter(user_id=user_id,match_id=match_id).exists():
  350. raise ce.TipException(u"重复添加选手!")
  351. if model_name == "PlayerRecord":
  352. now = datetime.datetime.now()
  353. if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
  354. raise ce.TipException(u"今日不能提交数据!")
  355. match_id = kwargs.get("match_id")
  356. stock_date = kwargs.get("stock_date")
  357. today_stock = json.dumps(kwargs.get("today_stock"))
  358. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  359. player_id = kwargs.get("player_id")
  360. today_fund = float(kwargs.get("today_fund",0))
  361. is_markt = int(kwargs.get("is_markt",0))
  362. player = cm.Player.objects.filter(id=player_id).first()
  363. user_id = player.user_id
  364. init_fund = player.fund
  365. user = cm.UserInfo.objects.filter(id=user_id).first()
  366. username = user.username
  367. usercode = user.usercode
  368. match_group = player.match_group
  369. match = cm.Match.objects.filter(id=match_id).first()
  370. if player.match_status < 1:
  371. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  372. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  373. if match.end_time < now_date:
  374. raise ce.TipException(u"该比赛已结束!")
  375. cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).delete()
  376. #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  377. yesterday = cm.PlayerRecord.objects.filter(
  378. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  379. if yesterday:
  380. yesterday_fund = yesterday.today_fund
  381. yesterday_stock = yesterday.today_stock
  382. yesterday_stock_img = yesterday.today_stock_img
  383. yesterday_is_markt = yesterday.is_markt
  384. else:
  385. yesterday_fund = init_fund
  386. yesterday_stock = ""
  387. yesterday_stock_img = ""
  388. yesterday_is_markt = 0
  389. with transaction.atomic():
  390. obj,flag = cm.PlayerRecord.objects.get_or_create(
  391. player_id=player_id,
  392. match_id=match_id,
  393. stock_date=stock_date)
  394. obj.init_fund = init_fund
  395. obj.yesterday_fund = yesterday_fund
  396. obj.yesterday_stock = yesterday_stock
  397. obj.yesterday_stock_img = yesterday_stock_img
  398. obj.today_fund = today_fund
  399. obj.today_stock = today_stock
  400. obj.today_stock_img = today_stock_img
  401. obj.user_id = user_id
  402. obj.username = username
  403. obj.usercode = usercode
  404. obj.match_group = match_group
  405. obj.is_markt = is_markt
  406. obj.yesterday_is_markt = yesterday_is_markt
  407. #计算今日和昨日盈亏
  408. if float(today_fund)>9999 or float(today_fund)<=0:
  409. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  410. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  411. total_income = (today_fund - init_fund)/float(init_fund)
  412. if float(today_income)>0.4:
  413. raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系副主编!")
  414. obj.today_income = round(today_income,4)
  415. obj.total_income = round(total_income,4)
  416. if not flag:
  417. obj.ctime = datetime.datetime.now()
  418. obj.save()
  419. #更新group_rank
  420. #update_group_rank(match_id,match_group,obj.stock_date)
  421. ccc.cache.lpush(settings.RANK_LIST,obj.id)
  422. return obj.id
  423. obj = model.objects.create(**kwargs)
  424. return obj.id
  425. def update_model(cls,**kwargs):
  426. """
  427. """
  428. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  429. model = getattr(cm,model_name)
  430. id = kwargs.pop("id")
  431. rst = model.objects.filter(id=id).update(**kwargs)
  432. if model_name == "Match":
  433. for item in kwargs.get("groups").split(","):
  434. cm.MatchGroup.objects.get_or_create(match_id=obj.id,name=item)
  435. return rst
  436. def delete_model(cls,**kwargs):
  437. """
  438. """
  439. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  440. model = getattr(cm,model_name)
  441. ids = str(kwargs.get("id")).split(",")
  442. rst = model.objects.filter(id__in=ids).delete()
  443. return ids
  444. def get_search_list(cls,**kwargs):
  445. """
  446. """
  447. model_name = re.search(r'.*\.(\w+)SearchView',str(cls.__class__)).groups()[0]
  448. model = getattr(cm,model_name)
  449. qset = model.objects.all()
  450. if kwargs.get("name"):
  451. qset = qset.filter(name__icontains=kwargs.get("name"))
  452. if model_name == "Player":
  453. data = list(qset.values("id","username"))
  454. if model_name == "Stock":
  455. data = list(qset.values("id","name","code"))
  456. for item in data:
  457. item["label"] = "%s(%s)" % (item["name"],item["code"])
  458. else:
  459. data = list(qset.values("id","name"))
  460. return data
  461. def get_detail_info(cls,**kwargs):
  462. """
  463. """
  464. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  465. model = getattr(cm,model_name)
  466. id = kwargs.get("id")
  467. rst = list(model.objects.filter(id=id).values())
  468. rst = rst[0] if rst else {}
  469. #if model_name == "PlayerRecord":
  470. # rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
  471. # today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  472. # today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
  473. # rst["today_stock"] = today_stock
  474. # today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  475. # rst["today_stock_img"] = today_stock_img
  476. # yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  477. # yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
  478. # rst["yesterday_stock"] = yesterday_stock
  479. #
  480. # yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  481. # rst["yesterday_stock_img"] = yesterday_stock_img
  482. # rst["today_income"] = "{}%".format(rst["today_income"]*100)
  483. # rst["total_income"] = "{}%".format(rst["total_income"]*100)
  484. return rst
  485. #@ccc.cache_data()
  486. def get_record_info(rcid):
  487. """
  488. """
  489. rst = cm.PlayerRecord.objects.filter(id=rcid).values().first()
  490. if rst:
  491. rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
  492. today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  493. today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
  494. rst["today_stock"] = today_stock
  495. today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  496. rst["today_stock_img"] = today_stock_img
  497. yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  498. yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
  499. rst["yesterday_stock"] = yesterday_stock
  500. yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  501. rst["yesterday_stock_img"] = yesterday_stock_img
  502. rst["today_income"] = "{}%".format(rst["today_income"]*100)
  503. rst["total_income"] = "{}%".format(rst["total_income"]*100)
  504. return rst
  505. def get_list_info(cls,**kwargs):
  506. """
  507. """
  508. model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
  509. model = getattr(cm,model_name)
  510. qset = model.objects.all()
  511. if kwargs.get("name"):
  512. qset = qset.filter(name__icontains=kwargs.get("name"))
  513. if model_name == "UserInfo":
  514. if kwargs.get("username"):
  515. qset = qset.filter(username__icontains=kwargs.get("username"))
  516. if kwargs.get("usercode"):
  517. qset = qset.filter(usercode=kwargs.get("usercode"))
  518. data = list(qset.order_by("-id").values())
  519. page = int(kwargs.get("page",0))
  520. page_size = int(kwargs.get("page_size",20))
  521. if page and page_size:
  522. total,data = ccf.get_page_list(data,page,page_size)
  523. if model_name == "Player":
  524. for item in data:
  525. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  526. match = cm.Match.objects.filter(id=item["match_id"]).first()
  527. item["username"] = user.username
  528. item["usercode"] = user.usercode
  529. item["match_name"] = match.name if match else ""
  530. return (total,data)
  531. else:
  532. return len(data),data
  533. return rst
  534. def add_player_record_single(**kwargs):
  535. """用户单独上传数据
  536. """
  537. now = datetime.datetime.now()
  538. if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
  539. raise ce.TipException(u"今日不能提交数据!")
  540. usercode = kwargs.get("usercode")
  541. match_id = kwargs.get("match_id")
  542. if not cm.Player.objects.filter(usercode=usercode,match_id=match_id).exists():
  543. raise ce.TipException(u"用户代码错误")
  544. stock_date = kwargs.get("stock_date")
  545. today_stock = json.dumps(kwargs.get("today_stock"))
  546. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  547. today_fund = float(kwargs.get("today_fund"))
  548. is_markt = int(kwargs.get("is_markt",0))
  549. player = cm.Player.objects.filter(usercode=usercode,match_id=match_id).first()
  550. player_id = player.id
  551. user_id = player.user_id
  552. init_fund = player.fund
  553. user = cm.UserInfo.objects.filter(id=user_id).first()
  554. username = user.username
  555. usercode = user.usercode
  556. match_group = player.match_group
  557. match = cm.Match.objects.filter(id=match_id).first()
  558. if player.match_status < 1:
  559. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  560. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  561. if match.end_time < now_date:
  562. raise ce.TipException(u"该比赛已结束!")
  563. #yesterday = cm.PlayerRecord.objects.filter(
  564. # match_id=match_id,player_id=player_id).order_by("-id").first()
  565. yesterday = cm.PlayerRecord.objects.filter(
  566. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  567. if yesterday:
  568. yesterday_fund = yesterday.today_fund
  569. yesterday_stock = yesterday.today_stock
  570. yesterday_stock_img = yesterday.today_stock_img
  571. else:
  572. yesterday_fund = init_fund
  573. yesterday_stock = ""
  574. yesterday_stock_img = ""
  575. obj,flag = cm.PlayerRecord.objects.get_or_create(
  576. player_id=player_id,
  577. match_id=match_id,
  578. stock_date=stock_date)
  579. obj.init_fund = init_fund
  580. obj.yesterday_fund = yesterday_fund
  581. obj.yesterday_stock = yesterday_stock
  582. obj.yesterday_stock_img = yesterday_stock_img
  583. obj.today_fund = today_fund
  584. obj.today_stock = today_stock
  585. obj.today_stock_img = today_stock_img
  586. obj.user_id = user_id
  587. obj.username = username
  588. obj.usercode = usercode
  589. obj.match_group = match_group
  590. obj.is_markt = is_markt
  591. #计算今日和昨日盈亏
  592. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  593. total_income = (today_fund - init_fund)/float(init_fund)
  594. if int(today_fund)>9999 or int(today_fund)<0:
  595. raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")
  596. if int(today_income)>2:
  597. raise ce.TipException(u"数据错误,今日盈利已超过2倍,请仔细核对数据!")
  598. obj.today_income = round(today_income,4)
  599. obj.total_income = round(total_income,4)
  600. if not flag:
  601. obj.ctime = datetime.datetime.now()
  602. obj.save()
  603. #更新group_rank
  604. #update_group_rank(match_id,match_group,obj.stock_date)
  605. ccc.cache.lpush(settings.RANK_LIST,obj.id)
  606. return obj.id
  607. def get_single_match_info(match_id):
  608. """
  609. """
  610. if not match_id:
  611. match = cm.Match.objects.all().order_by("-id").values().first()
  612. else:
  613. match = cm.Match.objects.filter(id=match_id).values().first()
  614. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  615. return now_date,match
  616. def get_cur_record(request):
  617. """
  618. """
  619. player = request.player
  620. player_id = player.id
  621. match_id = player.match_id
  622. match_group = player.match_group
  623. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  624. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).order_by("-stock_date")
  625. data = qset.values().first() if qset else {}
  626. #today_record = get_today_record(player_id,match_id,match_group,today)
  627. if data:
  628. data["today_stock_img"] = json.loads(data["today_stock_img"]) if data["today_stock_img"] else []
  629. data["today_stock"] = json.loads(data["today_stock"]) if data["today_stock"] else []
  630. return data