controls.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  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 threading import Thread
  27. #from django.core.cache import cache
  28. from django.db import connection
  29. import xlrd
  30. import xlwt
  31. from xlutils.copy import copy
  32. from xltpl.writer import BookWriter
  33. def async(f):
  34. def wrapper(*args, **kwargs):
  35. thr = Thread(target=f, args=args, kwargs=kwargs)
  36. thr.start()
  37. return wrapper
  38. def update_group_rank_day(match_id,match_group,stock_date):
  39. #return
  40. #ccc.cache.delete("*_"+stock_date)
  41. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  42. records = prset.values()
  43. case_id = " case id "
  44. cases = []
  45. where = []
  46. #
  47. delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
  48. del_keys = ccc.cache.keys(delkey)
  49. #ccc.cache.delete(*del_keys)
  50. for index,pr in enumerate(prset):
  51. case = "WHEN %s THEN %s" % (pr.id,index+1)
  52. cases.append(case)
  53. where.append(str(pr.id))
  54. #
  55. record = records[index]
  56. record.update({"group_rank":index+1})
  57. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  58. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  59. ccc.pl.execute()
  60. case = case_id + " ".join(cases)
  61. where = ",".join(where)
  62. sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
  63. cursor = connection.cursor()
  64. cursor.execute(sql)
  65. cursor.close()
  66. def add_model(cls,**kwargs):
  67. """
  68. """
  69. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  70. model = getattr(cm,model_name)
  71. if model_name == "UserInfo":
  72. username = kwargs.get("username")
  73. usercode = kwargs.get("usercode")
  74. if cm.UserInfo.objects.filter(username=username).exists():
  75. raise ce.TipException(u"用户名重复!")
  76. if cm.UserInfo.objects.filter(usercode=usercode).exists():
  77. raise ce.TipException(u"用户代码重复!")
  78. if model_name == "Match":
  79. name = kwargs.get("name")
  80. if cm.Match.objects.filter(name=name).exists():
  81. raise ce.TipException(u"比赛名称重复!")
  82. if model_name == "MatchGoup":
  83. name = kwargs.get("name")
  84. match_id = kwargs.get("match_id")
  85. if cm.MatchGroup.objects.filter(name=name,match_id=match_id).exists():
  86. raise ce.TipException(u"分组名称重复!")
  87. if model_name == "Player":
  88. user_id = kwargs.get("user_id")
  89. match_id = kwargs.get("match_id")
  90. if cm.Player.objects.filter(user_id=user_id,match_id=match_id).exists():
  91. raise ce.TipException(u"重复添加选手!")
  92. user =cm.UserInfo.objects.filter(id=user_id).first()
  93. username = user.username if user else ""
  94. usercode = user.usercode if user else ""
  95. kwargs["username"] = username
  96. kwargs["usercode"] = usercode
  97. if model_name == "PlayerRecord":
  98. match_id = kwargs.get("match_id")
  99. stock_date = kwargs.get("stock_date")
  100. today_stock = json.dumps(kwargs.get("today_stock"))
  101. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  102. player_id = kwargs.get("player_id")
  103. today_fund = float(kwargs.get("today_fund"))
  104. is_markt = int(kwargs.get("is_markt",0))
  105. player = cm.Player.objects.filter(id=player_id).first()
  106. user_id = player.user_id
  107. init_fund = player.fund
  108. user = cm.UserInfo.objects.filter(id=user_id).first()
  109. username = user.username
  110. usercode = user.usercode
  111. match_group = player.match_group
  112. match = cm.Match.objects.filter(id=match_id).first()
  113. if player.match_status < 1:
  114. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  115. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  116. if match.end_time < now_date:
  117. raise ce.TipException(u"该比赛已结束!")
  118. #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  119. yesterday = cm.PlayerRecord.objects.filter(
  120. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  121. if yesterday:
  122. yesterday_fund = yesterday.today_fund
  123. yesterday_stock = yesterday.today_stock
  124. yesterday_stock_img = yesterday.today_stock_img
  125. yesterday_is_markt = yesterday.is_markt
  126. else:
  127. yesterday_fund = init_fund
  128. yesterday_stock = ""
  129. yesterday_stock_img = ""
  130. yesterday_is_markt = 0
  131. obj,flag = cm.PlayerRecord.objects.get_or_create(
  132. player_id=player_id,
  133. match_id=match_id,
  134. stock_date=stock_date)
  135. obj.init_fund = init_fund
  136. obj.yesterday_fund = yesterday_fund
  137. obj.yesterday_stock = yesterday_stock
  138. obj.yesterday_stock_img = yesterday_stock_img
  139. obj.today_fund = today_fund
  140. obj.today_stock = today_stock
  141. obj.today_stock_img = today_stock_img
  142. obj.user_id = user_id
  143. obj.username = username
  144. obj.usercode = usercode
  145. obj.match_group = match_group
  146. obj.is_markt = is_markt
  147. obj.yesterday_is_markt = yesterday_is_markt
  148. #计算今日和昨日盈亏
  149. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  150. total_income = (today_fund - init_fund)/float(init_fund)
  151. obj.today_income = round(today_income,4)
  152. obj.total_income = round(total_income,4)
  153. if not flag:
  154. obj.ctime = datetime.datetime.now()
  155. obj.save()
  156. #更新group_rank
  157. update_group_rank_day(match_id,match_group,obj.stock_date)
  158. return obj.id
  159. obj = model.objects.create(**kwargs)
  160. #
  161. if model_name == "Match":
  162. cm.MatchGroup.objects.create(
  163. match_id = obj.id,
  164. name = obj.name+u"游客组",
  165. is_active = 0,
  166. charge = 0
  167. )
  168. return obj.id
  169. def update_model(cls,**kwargs):
  170. """
  171. """
  172. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  173. model = getattr(cm,model_name)
  174. id = kwargs.pop("id")
  175. if model_name == "UserInfo":
  176. username = kwargs.get("username")
  177. usercode = kwargs.get("usercode")
  178. if cm.UserInfo.objects.exclude(id=id).filter(username=username).exists():
  179. raise ce.TipException(u"用户名重复!")
  180. if cm.UserInfo.objects.exclude(id=id).filter(usercode=usercode).exists():
  181. raise ce.TipException(u"用户代码重复!")
  182. if model_name == "Player":
  183. user_id = kwargs.get("user_id")
  184. match_id = kwargs.get("match_id")
  185. if cm.Player.objects.exclude(id=id).filter(user_id=user_id,match_id=match_id).exists():
  186. raise ce.TipException(u"重复添加选手!")
  187. user =cm.UserInfo.objects.filter(id=user_id).first()
  188. username = user.username if user else ""
  189. usercode = user.usercode if user else ""
  190. kwargs["username"] = username
  191. kwargs["usercode"] = usercode
  192. if model_name == "PlayerRecord":
  193. is_markt = int(kwargs.get("is_markt",0))
  194. kwargs["today_stock"] = json.dumps(kwargs.get("today_stock"))
  195. kwargs["today_stock_img"] = json.dumps(kwargs.get("today_stock_img"))
  196. rst = model.objects.filter(id=id).update(**kwargs)
  197. if model_name == "PlayerRecord":
  198. obj = cm.PlayerRecord.objects.filter(id=id).first()
  199. today_fund = obj.today_fund
  200. yesterday_fund = obj.yesterday_fund
  201. init_fund = obj.init_fund
  202. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  203. total_income = (today_fund - init_fund)/float(init_fund)
  204. obj.today_income = round(today_income,4)
  205. obj.total_income = round(total_income,4)
  206. #
  207. player = cm.Player.objects.filter(id=obj.player_id).first()
  208. if player:
  209. obj.match_group = player.match_group
  210. obj.username = player.username
  211. obj.usercode = player.usercode
  212. obj.save()
  213. #更新player的init_fund
  214. player_id = obj.player_id
  215. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  216. ##更新group_rank
  217. #update_group_rank_day(obj.match_id,obj.match_group,obj.stock_date)
  218. if model_name == "UserInfo":
  219. ccc.del_cache("cdata_get_user_info_(%s,)"%id)
  220. return rst
  221. def delete_model(cls,**kwargs):
  222. """
  223. """
  224. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  225. model = getattr(cm,model_name)
  226. ids = str(kwargs.get("id")).split(",")
  227. rst = model.objects.filter(id__in=ids).delete()
  228. if model_name == "UserInfo":
  229. cm.Player.objects.filter(user_id__in=ids).delete()
  230. cm.PlayerRecord.objects.filter(user_id__in=ids).delete()
  231. if model_name == "Player":
  232. cm.PlayerRecord.objects.filter(player_id__in=ids).delete()
  233. if model_name == "Match":
  234. cm.PlayerRecord.objects.filter(match_id__in=ids).delete()
  235. cm.Player.objects.filter(match_id__in=ids).delete()
  236. cm.MatchGroup.objects.filter(match_id__in=ids).delete()
  237. if model_name == "MatchGroup":
  238. cm.PlayerRecord.objects.filter(match_group__in=ids).delete()
  239. cm.Player.objects.filter(match_group__in=ids).delete()
  240. #更新group_rank
  241. update_group_rank()
  242. return ids
  243. def get_search_list(cls,**kwargs):
  244. """
  245. """
  246. model_name = re.search(r'.*\.(\w+)SearchView',str(cls.__class__)).groups()[0]
  247. model = getattr(cm,model_name)
  248. qset = model.objects.all().order_by("-id")
  249. if model_name == "Player":
  250. data = list(qset.values("id","user_id","username"))
  251. for item in data:
  252. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  253. item["username"] = user.username
  254. item["usercode"] = user.usercode
  255. item["label"] = "%s(%s)" % (item["username"],item["usercode"])
  256. elif model_name == "Stock":
  257. data = list(qset.values("id","name","code"))
  258. for item in data:
  259. item["label"] = "%s(%s)" % (item["name"],item["code"])
  260. elif model_name == "UserInfo":
  261. data = list(qset.values("id","username","usercode"))
  262. for item in data:
  263. item["label"] = "%s(%s)" % (item["username"],item["usercode"])
  264. else:
  265. if kwargs.get("name"):
  266. qset = qset.filter(name__icontains=kwargs.get("name"))
  267. data = list(qset.values("id","name"))
  268. return data
  269. def get_detail_info(cls,**kwargs):
  270. """
  271. """
  272. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  273. model = getattr(cm,model_name)
  274. id = kwargs.get("id")
  275. rst = list(model.objects.filter(id=id).values())
  276. rst = rst[0] if rst else {}
  277. if model_name == "Player":
  278. user = cm.UserInfo.objects.filter(id=rst["user_id"]).first()
  279. match = cm.Match.objects.filter(id=rst["match_id"]).first()
  280. rst["username"] = user.username
  281. rst["usercode"] = user.usercode
  282. rst["match_name"] = match.name if match else ""
  283. rst["match_group"] = int(rst["match_group"])
  284. if model_name == "PlayerRecord":
  285. rst["today_stock"] = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  286. rst["today_stock_img"] = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  287. rst["yesterday_stock"] = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  288. rst["yesterday_stock_img"] = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  289. rst["is_markt"] = bool(rst["is_markt"])
  290. return rst
  291. def get_group_income(match_id,match_group,stock_date=None):
  292. """
  293. """
  294. data = []
  295. if stock_date:
  296. today = stock_date
  297. else:
  298. today = datetime.datetime.now().strftime("%Y-%m-%d")
  299. player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
  300. for player_id in player_ids:
  301. today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today).order_by("-stock_date").first()
  302. if today_record:
  303. data.append(today_record.total_income)
  304. data = list(set(data))
  305. data = sorted(data,key=lambda x:x,reverse=True)
  306. return data
  307. def get_list_info(cls,**kwargs):
  308. """
  309. """
  310. model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
  311. model = getattr(cm,model_name)
  312. qset = model.objects.all()
  313. if kwargs.get("name"):
  314. qset = qset.filter(name__icontains=kwargs.get("name"))
  315. if model_name == "UserInfo":
  316. if kwargs.get("username"):
  317. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  318. if model_name == "Player":
  319. if kwargs.get("username"):
  320. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  321. if kwargs.get("match_id"):
  322. qset = qset.filter(match_id=kwargs.get("match_id"))
  323. if kwargs.get("groupId"):
  324. qset = qset.filter(match_group=kwargs.get("groupId"))
  325. if model_name == "MatchGroup":
  326. if kwargs.get("match_id"):
  327. qset = qset.filter(match_id=kwargs.get("match_id"))
  328. if model_name == "PlayerRecord":
  329. if kwargs.get("match_id"):
  330. qset = qset.filter(match_id=kwargs.get("match_id"))
  331. if kwargs.get("groupId"):
  332. qset = qset.filter(match_group=kwargs.get("groupId"))
  333. if kwargs.get("username"):
  334. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  335. if kwargs.get("stock_date"):
  336. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  337. if kwargs.get("auto_complete"):
  338. if int(kwargs.get("auto_complete"))==1:
  339. qset = qset.filter(auto_complete__gte=kwargs.get("auto_complete"))
  340. else:
  341. qset = qset.filter(auto_complete=kwargs.get("auto_complete"))
  342. if model_name == "SignupOrder":
  343. if kwargs.get("match_id"):
  344. qset = qset.filter(match_id=kwargs.get("match_id"))
  345. if kwargs.get("username"):
  346. qset = qset.filter(user_name__icontains=kwargs.get("username"))
  347. if kwargs.get("signup_type"):
  348. qset = qset.filter(signup_type=kwargs.get("signup_type"))
  349. if kwargs.get("order_status") or kwargs.get("order_status")==0:
  350. qset = qset.filter(order_status=kwargs.get("order_status"))
  351. if model_name == "Article":
  352. if kwargs.get("type"):
  353. qset = qset.filter(type=kwargs.get("type"))
  354. if model_name == "Stock":
  355. if kwargs.get("username"):
  356. qset = qset.filter(name__icontains=kwargs.get("username"))
  357. if model_name == "PlayerRecord":
  358. data = list(qset.order_by("-total_income").values())
  359. else:
  360. data = list(qset.order_by("-id").values())
  361. page = int(kwargs.get("page",1))
  362. page_size = int(kwargs.get("page_size",20))
  363. if page and page_size:
  364. total,data = ccf.get_page_list(data,page,page_size)
  365. if model_name == "Player":
  366. for item in data:
  367. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  368. if user:
  369. match = cm.Match.objects.filter(id=item["match_id"]).first()
  370. item["username"] = user.username
  371. item["usercode"] = user.usercode
  372. item["nickname"] = user.nickname
  373. item["match_name"] = match.name if match else ""
  374. item["match_group"] = int(item["match_group"])
  375. item["match_group_name"] = cm.MatchGroup.objects.filter(id=int(item["match_group"])).first().name
  376. item["openid"] = user.openid
  377. item["player_type"] = user.player_type
  378. item["phone"] = user.phone
  379. #cm.Player.objects.filter(id=item["id"]).update(username=user.username,usercode=user.usercode)
  380. if model_name == "PlayerRecord":
  381. for item in data:
  382. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  383. item["username"] = user.username
  384. item["usercode"] = user.usercode
  385. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  386. today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
  387. today_stock_img = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  388. item["today_stock"] = today_stock
  389. item["today_stock_img"] = today_stock_img
  390. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  391. yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
  392. item["yesterday_stock"] = yesterday_stock
  393. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  394. item["today_income"] = "{}%".format(item["today_income"]*100)
  395. item["total_income"] = "{}%".format(item["total_income"]*100)
  396. item["is_markt"] = bool(item["is_markt"])
  397. if kwargs.get("groupId"):
  398. data = sorted(data,key=lambda x:x["group_rank"])
  399. if model_name == "Match":
  400. for item in data:
  401. groups = ",".join(list(cm.MatchGroup.objects.filter(match_id=item["id"]).values_list("name",flat=True)))
  402. item["join_count"] = cm.Player.objects.filter(match_id=item["id"]).count()
  403. item["out_count"] = cm.Player.objects.filter(match_id=item["id"],match_status=-1).count()
  404. item["groups"] = groups
  405. if model_name == "MatchGroup":
  406. for item in data:
  407. match = cm.Match.objects.filter(id=item["match_id"]).first()
  408. match_name = match.name if match else ""
  409. item["join_count"] = cm.Player.objects.filter(match_group=item["id"]).count()
  410. item["out_count"] = cm.Player.objects.filter(match_group=item["id"],match_status=-1).count()
  411. item["match_name"] = match_name
  412. if model_name == "SignupOrder":
  413. for item in data:
  414. item["match_group_name"] = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
  415. return (total,data)
  416. else:
  417. return len(data),data
  418. return rst
  419. def download_records(request):
  420. """
  421. """
  422. kwargs = request.json
  423. header = [u"排名",u"选手",u"初始资产(万)",u"昨日资产(万)",u"今日资产",u"今日盈亏",u"总盈亏",u"昨日持股",u"今日持股"]
  424. qset = cm.PlayerRecord.objects.all()
  425. if kwargs.get("match_id"):
  426. qset = qset.filter(match_id=kwargs.get("match_id"))
  427. if kwargs.get("groupId"):
  428. qset = qset.filter(match_group=kwargs.get("groupId"))
  429. if kwargs.get("username"):
  430. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  431. if kwargs.get("stock_date"):
  432. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  433. qdata = list(qset.order_by("-total_income").values())
  434. if kwargs.get("groupId"):
  435. qdata = sorted(qdata,key=lambda x:x["group_rank"])
  436. data = []
  437. for item in qdata:
  438. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  439. item["username"] = user.username
  440. item["usercode"] = user.usercode
  441. item["today_income"] = "{}%".format(item["today_income"]*100)
  442. item["total_income"] = "{}%".format(item["total_income"]*100)
  443. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  444. today_stock = list(filter(lambda x:x["name"],today_stock if today_stock else []))
  445. today_stock = ",".join([x["name"]+str(x["fund"]) for x in today_stock]) if today_stock else ""
  446. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  447. yesterday_stock = list(filter(lambda x:x["name"],yesterday_stock if yesterday_stock else []))
  448. yesterday_stock = ",".join([x["name"]+str(x["fund"]) for x in yesterday_stock]) if yesterday_stock else ""
  449. #空仓、开超市、请假判断
  450. if item["auto_complete"] > 0:
  451. today_stock = u"请假"
  452. else:
  453. if item["is_markt"] == 1:
  454. today_stock = u"开超市"
  455. else:
  456. if today_stock == "":
  457. today_stock = u"空仓"
  458. #昨日
  459. if item["yesterday_auto_complete"] > 0:
  460. yesterday_stock = u"请假"
  461. else:
  462. if item["yesterday_is_markt"] == 1:
  463. yesterday_stock = u"开超市"
  464. else:
  465. if yesterday_stock == "":
  466. yesterday_stock = u"空仓"
  467. data.append(
  468. [
  469. item["group_rank"],
  470. item["username"],
  471. item["init_fund"],
  472. item["yesterday_fund"],
  473. item["today_fund"],
  474. item["today_income"],
  475. item["total_income"],
  476. yesterday_stock,
  477. today_stock
  478. ])
  479. xlsfile = os.path.join(settings.BASE_DIR,"demo.xls")
  480. exceltool = ExcelTool(xlsfile)
  481. xlsdata = exceltool.save_data(u"学员报名数据表",header,data)
  482. return xlsdata
  483. def fast_save_player(**kwargs):
  484. """
  485. """
  486. username = kwargs.get("username")
  487. usercode = kwargs.get("usercode")
  488. if cm.UserInfo.objects.filter(username=username).exists():
  489. raise ce.TipException(u"用户名重复!")
  490. if cm.UserInfo.objects.filter(usercode=usercode).exists():
  491. raise ce.TipException(u"用户代码重复!")
  492. user = cm.UserInfo.objects.create(username=username,usercode=usercode)
  493. #新建选手
  494. user_id = user.id
  495. kwargs["user_id"] = user_id
  496. cm.Player.objects.create(**kwargs)
  497. def update_player_latest(record):
  498. """更新选手最后一次数据
  499. """
  500. player_id=record["player_id"]
  501. match_id = record["match_id"]
  502. latest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date").first()
  503. if latest:
  504. key = "PLAYER_LATEST_{}".format(player_id)
  505. ccc.cache.hset(key,"stock_date",latest.stock_date)
  506. ccc.cache.hset(key,"match_id",latest.match_id)
  507. ccc.cache.hset(key,"match_group",latest.match_group)
  508. #更新胜率
  509. qset = cm.PlayerRecord.objects.filter(match_id=latest.match_id,player_id=latest.player_id)
  510. win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  511. win_rate = round(win_rate,3)
  512. ccc.cache.hset(key,"win_rate",win_rate)
  513. badest = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-today_income").first()
  514. if badest:
  515. key = "PLAYER_LATEST_{}".format(player_id)
  516. ccc.cache.hset(key,"badest_income",latest.today_income)
  517. def update_group_rank(stock_date=None,match_id=None,group_id=None):
  518. """
  519. """
  520. #ccc.cache.delete("cdata_*")
  521. if stock_date:
  522. stock_date = stock_date
  523. else:
  524. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  525. #ccc.cache.delete("*_"+stock_date)
  526. #groups = cm.MatchGroup.objects.filter(match_id=match_id)
  527. groups = cm.MatchGroup.objects.filter(id=group_id)
  528. for gp in groups:
  529. match_id = gp.match_id
  530. match_group = gp.id
  531. delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
  532. del_keys = ccc.cache.keys(delkey)
  533. #if del_keys:
  534. # ccc.cache.delete(*del_keys)
  535. prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  536. if prset:
  537. records = prset.values()
  538. case_id = " case id "
  539. cases = []
  540. where = []
  541. for index,pr in enumerate(prset):
  542. case = "WHEN %s THEN %s" % (pr.id,index+1)
  543. cases.append(case)
  544. where.append(str(pr.id))
  545. #
  546. key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
  547. record = records[index]
  548. record.update({"group_rank":index+1})
  549. ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
  550. #更新最后一次数据
  551. #update_player_latest(record)
  552. ccc.pl.execute()
  553. if cases and where:
  554. case = case_id + " ".join(cases)
  555. where = ",".join(where)
  556. sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
  557. cursor = connection.cursor()
  558. cursor.execute(sql)
  559. cursor.close()
  560. def update_comment(**kwargs):
  561. """
  562. """
  563. id = kwargs.get("id")
  564. wanzhu_comment = kwargs.get("wanzhu_comment")
  565. cm.PlayerRecord.objects.filter(id=id).update(wanzhu_comment=wanzhu_comment)
  566. def reset_initfund(**kwargs):
  567. """
  568. """
  569. match_id = kwargs.get("match_id")
  570. cm.Player.objects.filter(match_id=match_id).update(fund=1)
  571. #cm.Player.objects.filter(match_id=match_id,id=3011).update(fund=None)
  572. def get_stock_comments_list(**kwargs):
  573. """
  574. """
  575. qset = cm.Comments.objects.filter(stock_id__isnull=False)
  576. if kwargs.get("name"):
  577. qset = qset.filter(stock_name__icontains=kwargs.get("name"))
  578. data = list(qset.values())
  579. for item in data:
  580. item["stock_name"] = cm.Stock.objects.filter(id=item["stock_id"]).first().name
  581. #分页
  582. page = int(kwargs.get("page",1))
  583. page_size = int(kwargs.get("page_size",20))
  584. if page and page_size:
  585. total,data = ccf.get_page_list(data,page,page_size)
  586. else:
  587. total = len(data)
  588. return total,data
  589. def get_record_comments_list(**kwargs):
  590. """
  591. """
  592. qset = cm.Comments.objects.filter(record_id__isnull=False)
  593. if kwargs.get("user_name"):
  594. qset = qset.filter(user_name__icontains=kwargs.get("name"))
  595. data = list(qset.values())
  596. for item in data:
  597. item["record_info"] = cm.PlayerRecord.objects.filter(id=item["record_id"]).values().first()
  598. #分页
  599. page = int(kwargs.get("page",1))
  600. page_size = int(kwargs.get("page_size",20))
  601. if page and page_size:
  602. total,data = ccf.get_page_list(data,page,page_size)
  603. else:
  604. total = len(data)
  605. return total,data
  606. def get_wanzhu_consult_list(**kwargs):
  607. """
  608. """
  609. qset = cm.WanzhuConsult.objects.filter(user_id__gt=0).order_by("-id")
  610. if kwargs.get("user_name"):
  611. qset = qset.filter(user_name__icontains=kwargs.get("name"))
  612. data = list(qset.values())
  613. for item in data:
  614. reply_list = list(cm.WanzhuConsult.objects.filter(pid=item["id"]).values())
  615. item["reply_list"] = reply_list
  616. #分页
  617. page = int(kwargs.get("page",1))
  618. page_size = int(kwargs.get("page_size",20))
  619. if page and page_size:
  620. total,data = ccf.get_page_list(data,page,page_size)
  621. else:
  622. total = len(data)
  623. return total,data
  624. def reply_wanzhu_consult(**kwargs):
  625. """
  626. """
  627. pid = kwargs.get("pid")
  628. content = kwargs.get("reply_content")
  629. cm.WanzhuConsult.objects.create(
  630. pid = pid,
  631. reply_content = content,
  632. user_id = 0,
  633. player_id = 0
  634. )
  635. cm.WanzhuConsult.objects.filter(id=pid).update(reply_status=1)
  636. def update_player_type(**kwargs):
  637. """
  638. """
  639. player_id = kwargs.get("player_id")
  640. user_id = kwargs.get("user_id")
  641. player_type = kwargs.get("player_type")
  642. phone = kwargs.get("phone")
  643. cm.UserInfo.objects.filter(id=user_id).update(player_type=player_type,phone=phone)