controls.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  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. from utils.wxSubscribeMessage import send_consult_reply_message
  30. import xlrd
  31. import xlwt
  32. from xlutils.copy import copy
  33. from xltpl.writer import BookWriter
  34. @ccc.cache_data()
  35. def get_user_info(uid):
  36. user = cm.UserInfo.objects.filter(id=uid).values().first()
  37. if user:
  38. user["style"] = []
  39. if user["zq"]:
  40. user["style"].append(user["zq"])
  41. if user["cw"]:
  42. user["style"].append(user["cw"])
  43. if user["df"]:
  44. user["style"].append(user["df"])
  45. return user
  46. @ccc.cache_data()
  47. def get_match_info(match_id):
  48. match = cm.Match.objects.filter(id=match_id).values().first()
  49. return match
  50. def async(f):
  51. def wrapper(*args, **kwargs):
  52. thr = Thread(target=f, args=args, kwargs=kwargs)
  53. thr.start()
  54. return wrapper
  55. def add_model(cls,**kwargs):
  56. """
  57. """
  58. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  59. model = getattr(cm,model_name)
  60. if model_name == "UserInfo":
  61. username = kwargs.get("username")
  62. usercode = kwargs.get("usercode")
  63. phone = kwargs.get("phone")
  64. if cm.UserInfo.objects.filter(username=username).exists():
  65. raise ce.TipException(u"用户名重复!")
  66. if cm.UserInfo.objects.filter(usercode=usercode).exists():
  67. raise ce.TipException(u"用户代码重复!")
  68. if cm.UserInfo.objects.filter(phone=phone).exists():
  69. raise ce.TipException(u"手机号重复!")
  70. if model_name == "Match":
  71. name = kwargs.get("name")
  72. if cm.Match.objects.filter(name=name).exists():
  73. raise ce.TipException(u"比赛名称重复!")
  74. if model_name == "MatchGoup":
  75. name = kwargs.get("name")
  76. match_id = kwargs.get("match_id")
  77. if cm.MatchGroup.objects.filter(name=name,match_id=match_id).exists():
  78. raise ce.TipException(u"分组名称重复!")
  79. if model_name == "Player":
  80. user_id = kwargs.get("user_id")
  81. match_id = kwargs.get("match_id")
  82. if cm.Player.objects.filter(user_id=user_id,match_id=match_id).exists():
  83. raise ce.TipException(u"重复添加选手!")
  84. user =cm.UserInfo.objects.filter(id=user_id).first()
  85. username = user.username if user else ""
  86. usercode = user.usercode if user else ""
  87. kwargs["username"] = username
  88. kwargs["usercode"] = usercode
  89. if model_name == "PlayerRecord":
  90. #return None
  91. match_id = kwargs.get("match_id")
  92. stock_date = kwargs.get("stock_date")
  93. today_stock = json.dumps(kwargs.get("today_stock"))
  94. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  95. player_id = kwargs.get("player_id")
  96. today_fund = float(kwargs.get("today_fund"))
  97. is_markt = int(kwargs.get("is_markt",0))
  98. player = cm.Player.objects.filter(id=player_id).first()
  99. user_id = player.user_id
  100. init_fund = player.fund
  101. user = cm.UserInfo.objects.filter(id=user_id).first()
  102. username = user.username
  103. usercode = user.usercode
  104. match_group = player.match_group
  105. match = cm.Match.objects.filter(id=match_id).first()
  106. if player.match_status < 1:
  107. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  108. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  109. if match.end_time < now_date:
  110. raise ce.TipException(u"该比赛已结束!")
  111. #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  112. yesterday = cm.PlayerRecord.get_db_model(match_id).objects.filter(
  113. match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  114. if yesterday:
  115. yesterday_fund = yesterday.today_fund
  116. yesterday_stock = yesterday.today_stock
  117. yesterday_stock_img = yesterday.today_stock_img
  118. yesterday_is_markt = yesterday.is_markt
  119. else:
  120. yesterday_fund = init_fund
  121. yesterday_stock = ""
  122. yesterday_stock_img = ""
  123. yesterday_is_markt = 0
  124. obj,flag = cm.PlayerRecord.get_db_model(match_id).objects.get_or_create(
  125. player_id=player_id,
  126. match_id=match_id,
  127. stock_date=stock_date)
  128. obj.init_fund = init_fund
  129. obj.yesterday_fund = yesterday_fund
  130. obj.yesterday_stock = yesterday_stock
  131. obj.yesterday_stock_img = yesterday_stock_img
  132. obj.today_fund = today_fund
  133. obj.today_stock = today_stock
  134. obj.today_stock_img = today_stock_img
  135. obj.user_id = user_id
  136. obj.username = username
  137. obj.usercode = usercode
  138. obj.match_group = match_group
  139. obj.is_markt = is_markt
  140. obj.yesterday_is_markt = yesterday_is_markt
  141. #计算今日和昨日盈亏
  142. today_income = (today_fund - yesterday_fund)/float(yesterday_fund) if yesterday_fund else 0.0
  143. total_income = (today_fund - init_fund)/float(init_fund) if init_fund else 0.0
  144. obj.today_income = round(today_income,4)
  145. obj.total_income = round(total_income,4)
  146. if not flag:
  147. obj.ctime = datetime.datetime.now()
  148. obj.save()
  149. #更新group_rank
  150. return obj.id
  151. if model_name == "PlayerRecord":
  152. match_id = kwargs.get("match_id")
  153. obj = model.get_db_model(match_id).objects.create(**kwargs)
  154. else:
  155. obj = model.objects.create(**kwargs)
  156. #
  157. if model_name == "Match":
  158. cm.MatchGroup.objects.create(
  159. match_id = obj.id,
  160. name = obj.name+u"游客组",
  161. is_active = 0,
  162. charge = 0
  163. )
  164. return obj.id
  165. def update_model(cls,**kwargs):
  166. """
  167. """
  168. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  169. model = getattr(cm,model_name)
  170. id = kwargs.pop("id")
  171. if model_name == "UserInfo":
  172. username = kwargs.get("username")
  173. usercode = kwargs.get("usercode")
  174. phone = kwargs.get("phone")
  175. if cm.UserInfo.objects.exclude(id=id).filter(username=username).exists():
  176. raise ce.TipException(u"用户名重复!")
  177. if cm.UserInfo.objects.exclude(id=id).filter(usercode=usercode).exists():
  178. raise ce.TipException(u"用户代码重复!")
  179. if phone and cm.UserInfo.objects.exclude(id=id).filter(phone=phone).exists():
  180. raise ce.TipException(u"手机号重复!")
  181. if model_name == "Player":
  182. user_id = kwargs.get("user_id")
  183. match_id = kwargs.get("match_id")
  184. match_group = kwargs.get("match_group")
  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. try:
  191. match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
  192. except Exception as e:
  193. match_group_name = ""
  194. kwargs["match_group_name"] = match_group_name
  195. if model_name == "PlayerRecord":
  196. is_markt = int(kwargs.get("is_markt",0))
  197. kwargs["today_stock"] = json.dumps(kwargs.get("today_stock"))
  198. kwargs["today_stock_img"] = json.dumps(kwargs.get("today_stock_img"))
  199. if model_name == "PlayerRecord":
  200. match_id = kwargs.get("match_id")
  201. rst = model.get_db_model(match_id).objects.filter(id=id).update(**kwargs)
  202. else:
  203. rst = model.objects.filter(id=id).update(**kwargs)
  204. if model_name == "PlayerRecord":
  205. match_id = kwargs.get("match_id")
  206. user_id = kwargs.get("user_id")
  207. obj = cm.PlayerRecord.get_db_model(match_id).objects.filter(id=id).first()
  208. today_fund = obj.today_fund
  209. yesterday_fund = obj.yesterday_fund
  210. init_fund = obj.init_fund
  211. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  212. total_income = (today_fund - init_fund)/float(init_fund)
  213. obj.today_income = round(today_income,4)
  214. obj.total_income = round(total_income,4)
  215. #
  216. player = cm.Player.objects.filter(user_id=user_id,match_id=match_id).first()
  217. if player:
  218. obj.match_group = player.match_group
  219. obj.username = player.username
  220. obj.usercode = player.usercode
  221. obj.save()
  222. #更新player的init_fund
  223. player_id = player.id
  224. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  225. ##更新group_rank
  226. update_group_rank(obj.stock_date,obj.match_group,obj.match_id)
  227. if model_name == "UserInfo":
  228. ccc.del_cache("cdata_get_user_info_(%s,)"%id)
  229. return rst
  230. def delete_model(cls,**kwargs):
  231. """
  232. """
  233. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  234. model = getattr(cm,model_name)
  235. ids = str(kwargs.get("id")).split(",")
  236. if model_name == "WanzhuConsult":
  237. cm.WanzhuConsult.objects.filter(Q(user_id__in=ids)|Q(reply_user_id__in=ids)).delete()
  238. else:
  239. if model_name == "PlayerRecord":
  240. match_id = kwargs.get("match_id")
  241. obj = cm.PlayerRecord.get_db_model(match_id).objects.filter(id__in=ids).first()
  242. ##更新group_rank
  243. update_group_rank(obj.stock_date,obj.match_group,obj.match_id)
  244. rst = model.get_db_model(match_id).objects.filter(id__in=ids).delete()
  245. else:
  246. rst = model.objects.filter(id__in=ids).delete()
  247. if model_name == "UserInfo":
  248. cm.Player.objects.filter(user_id__in=ids).delete()
  249. cm.PlayerRecord.objects.filter(user_id__in=ids).delete()
  250. if model_name == "Player":
  251. cm.PlayerRecord.objects.filter(player_id__in=ids).delete()
  252. if model_name == "Match":
  253. cm.PlayerRecord.objects.filter(match_id__in=ids).delete()
  254. cm.Player.objects.filter(match_id__in=ids).delete()
  255. cm.MatchGroup.objects.filter(match_id__in=ids).delete()
  256. if model_name == "MatchGroup":
  257. cm.PlayerRecord.objects.filter(match_group__in=ids).delete()
  258. cm.Player.objects.filter(match_group__in=ids).delete()
  259. return ids
  260. def get_search_list(cls,**kwargs):
  261. """
  262. """
  263. model_name = re.search(r'.*\.(\w+)SearchView',str(cls.__class__)).groups()[0]
  264. model = getattr(cm,model_name)
  265. qset = model.objects.all().order_by("-id")
  266. if model_name == "Player":
  267. if kwargs.get("usercode"):
  268. qset = qset.filter(usercode__icontains=kwargs.get("usercode"))
  269. data = list(qset.values("id","user_id","username","usercode"))
  270. for item in data:
  271. item["label"] = "%s(%s)" % (item["username"],item["usercode"])
  272. else:
  273. data = []
  274. elif model_name == "Stock":
  275. data = list(qset.values("id","name","code"))
  276. for item in data:
  277. item["label"] = "%s(%s)" % (item["name"],item["code"])
  278. elif model_name == "UserInfo":
  279. data = list(qset.values("id","username","usercode"))
  280. for item in data:
  281. item["label"] = "%s(%s)" % (item["username"],item["usercode"])
  282. else:
  283. if kwargs.get("name"):
  284. qset = qset.filter(name__icontains=kwargs.get("name"))
  285. data = list(qset.values("id","name"))
  286. return data
  287. def get_detail_info(cls,**kwargs):
  288. """
  289. """
  290. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  291. model = getattr(cm,model_name)
  292. id = kwargs.get("id")
  293. if model_name == "PlayerRecord":
  294. match_id = kwargs.get("match_id")
  295. rst = list(model.get_db_model(match_id).objects.filter(id=id).values())
  296. else:
  297. rst = list(model.objects.filter(id=id).values())
  298. rst = rst[0] if rst else {}
  299. if model_name == "Player":
  300. user = get_user_info(rst["user_id"])
  301. match = get_match_info(rst["match_id"])
  302. rst["username"] = user["username"]
  303. rst["usercode"] = user["usercode"]
  304. rst["match_name"] = match["name"] if match else ""
  305. rst["match_group"] = int(rst["match_group"]) if rst["match_group"] else 0
  306. if model_name == "PlayerRecord":
  307. rst["today_stock"] = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  308. rst["today_stock_img"] = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  309. rst["yesterday_stock"] = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  310. rst["yesterday_stock_img"] = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  311. rst["is_markt"] = bool(rst["is_markt"])
  312. return rst
  313. def get_group_income(match_id,match_group,stock_date=None):
  314. """
  315. """
  316. data = []
  317. if stock_date:
  318. today = stock_date
  319. else:
  320. today = datetime.datetime.now().strftime("%Y-%m-%d")
  321. player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
  322. for player_id in player_ids:
  323. 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()
  324. if today_record:
  325. data.append(today_record.total_income)
  326. data = list(set(data))
  327. data = sorted(data,key=lambda x:x,reverse=True)
  328. return data
  329. def get_list_info(cls,**kwargs):
  330. """
  331. """
  332. model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
  333. model = getattr(cm,model_name)
  334. if model_name == "PlayerRecord":
  335. match_id = kwargs.get("match_id",0)
  336. qset = model.get_db_model(match_id).objects.all()
  337. else:
  338. qset = model.objects.all()
  339. if kwargs.get("name"):
  340. qset = qset.filter(name__icontains=kwargs.get("name"))
  341. if model_name == "UserInfo":
  342. if kwargs.get("username"):
  343. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username")))
  344. if model_name == "Player":
  345. if kwargs.get("username"):
  346. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  347. if kwargs.get("match_id"):
  348. qset = qset.filter(match_id=kwargs.get("match_id"))
  349. if kwargs.get("groupId"):
  350. qset = qset.filter(match_group=kwargs.get("groupId"))
  351. if model_name == "MatchGroup":
  352. if kwargs.get("match_id"):
  353. qset = qset.filter(match_id=kwargs.get("match_id"))
  354. if model_name == "PlayerRecord":
  355. if kwargs.get("match_id"):
  356. qset = qset.filter(match_id=kwargs.get("match_id"))
  357. if kwargs.get("groupId"):
  358. qset = qset.filter(match_group=kwargs.get("groupId"))
  359. if kwargs.get("username"):
  360. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  361. if kwargs.get("stock_date"):
  362. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  363. if kwargs.get("auto_complete"):
  364. if int(kwargs.get("auto_complete"))==1:
  365. qset = qset.filter(auto_complete__gte=kwargs.get("auto_complete"))
  366. else:
  367. qset = qset.filter(auto_complete=kwargs.get("auto_complete"))
  368. if model_name == "SignupOrder":
  369. if kwargs.get("match_id"):
  370. qset = qset.filter(match_id=kwargs.get("match_id"))
  371. if kwargs.get("username"):
  372. #qset = qset.filter(Q(user_name__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username"))|Q(transaction_id__icontains=kwargs.get("username")))
  373. qset = qset.filter(Q(user_name__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username")))
  374. if kwargs.get("signup_type"):
  375. qset = qset.filter(signup_type=kwargs.get("signup_type"))
  376. if kwargs.get("order_status") or kwargs.get("order_status")==0:
  377. qset = qset.filter(order_status=kwargs.get("order_status"))
  378. if kwargs.get("pay_status") or kwargs.get("pay_status")==0:
  379. qset = qset.filter(pay_status=kwargs.get("pay_status"))
  380. if model_name == "Article":
  381. if kwargs.get("type"):
  382. qset = qset.filter(type=kwargs.get("type"))
  383. if model_name == "Stock":
  384. if kwargs.get("username"):
  385. qset = qset.filter(name__icontains=kwargs.get("username"))
  386. if model_name == "PlayerRecord":
  387. if kwargs.get("username"):
  388. data = list(qset.order_by("-stock_date").values())
  389. else:
  390. data = list(qset.order_by("-total_income").values())
  391. else:
  392. data = list(qset.order_by("-id").values())
  393. page = int(kwargs.get("page",1))
  394. page_size = int(kwargs.get("page_size",20))
  395. if page and page_size:
  396. total,data = ccf.get_page_list(data,page,page_size)
  397. if model_name == "Player":
  398. for item in data:
  399. user = get_user_info(item["user_id"])
  400. if user:
  401. match = get_match_info(item["match_id"])
  402. item["nickname"] = user["nickname"]
  403. item["match_name"] = match["name"] if match else ""
  404. item["openid"] = user["openid"]
  405. item["player_type"] = user["player_type"]
  406. item["phone"] = user["phone"]
  407. #try:
  408. # item["match_group"] = int(item["match_group"])
  409. # item["match_group_name"] = cm.MatchGroup.objects.filter(id=int(item["match_group"])).first().name
  410. #except:
  411. # pass
  412. #cm.Player.objects.filter(id=item["id"]).update(username=user.username,usercode=user.usercode)
  413. if model_name == "PlayerRecord":
  414. for item in data:
  415. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  416. item["username"] = user.username if user else ""
  417. item["usercode"] = user.usercode if user else ""
  418. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  419. today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
  420. today_stock_img = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  421. item["today_stock"] = today_stock
  422. item["today_stock_img"] = today_stock_img
  423. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  424. yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
  425. item["yesterday_stock"] = yesterday_stock
  426. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  427. if item["today_income"]:
  428. item["today_income"] = "{}%".format(item["today_income"]*100)
  429. if item["total_income"]:
  430. item["total_income"] = "{}%".format(item["total_income"]*100)
  431. item["is_markt"] = bool(item["is_markt"])
  432. #资金出入
  433. if cm.FundInOut.objects.filter(user_id=item["user_id"],stock_date=item["stock_date"]).exists():
  434. item["fund_inout"] = cm.FundInOut.objects.filter(user_id=item["user_id"],stock_date=item["stock_date"]).values().first()
  435. if kwargs.get("groupId"):
  436. data = sorted(data,key=lambda x:x["group_rank"])
  437. if model_name == "Match":
  438. for item in data:
  439. groups = ",".join(list(cm.MatchGroup.objects.filter(match_id=item["id"]).values_list("name",flat=True)))
  440. item["join_count"] = cm.Player.objects.filter(match_id=item["id"]).count()
  441. item["out_count"] = cm.Player.objects.filter(match_id=item["id"],match_status=-1).count()
  442. item["groups"] = groups
  443. if model_name == "MatchGroup":
  444. for item in data:
  445. match = cm.Match.objects.filter(id=item["match_id"]).first()
  446. match_name = match.name if match else ""
  447. item["join_count"] = cm.Player.objects.filter(match_group=item["id"]).count()
  448. item["out_count"] = cm.Player.objects.filter(match_group=item["id"],match_status=-1).count()
  449. item["match_name"] = match_name
  450. if model_name == "SignupOrder":
  451. for item in data:
  452. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  453. try:
  454. item["match_group_name"] = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
  455. except Exception as e:
  456. print(e)
  457. item["match_group_name"] = ""
  458. if user:
  459. item["usercode"] = user.usercode
  460. item["nickname"] = user.nickname
  461. item["openid"] = user.openid
  462. if model_name == "FundInOut":
  463. for item in data:
  464. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  465. item["username"] = user.username
  466. item["usercode"] = user.usercode
  467. if kwargs.get("username"):
  468. print(111111111111111111)
  469. print(data)
  470. print(kwargs.get("username"))
  471. data = filter(lambda x:x["username"] == str(kwargs.get("username")) or kwargs.get("username") ==x["usercode"],data)
  472. print(data,22222222222222)
  473. return (total,data)
  474. else:
  475. return len(data),data
  476. return rst
  477. def download_records(request):
  478. """
  479. """
  480. kwargs = request.json
  481. header = [u"排名",u"选手",u"初始资产(万)",u"昨日资产(万)",u"今日资产",u"今日盈亏",u"总盈亏",u"昨日持股",u"今日持股"]
  482. match_id = kwargs.get("match_id")
  483. qset = cm.PlayerRecord.get_db_model(match_id).objects.all()
  484. if kwargs.get("match_id"):
  485. qset = qset.filter(match_id=kwargs.get("match_id"))
  486. if kwargs.get("groupId"):
  487. qset = qset.filter(match_group=kwargs.get("groupId"))
  488. if kwargs.get("username"):
  489. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  490. if kwargs.get("stock_date"):
  491. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  492. qdata = list(qset.order_by("-total_income").values())
  493. if kwargs.get("groupId"):
  494. qdata = sorted(qdata,key=lambda x:x["group_rank"])
  495. data = []
  496. for item in qdata:
  497. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  498. item["username"] = user.username
  499. item["usercode"] = user.usercode
  500. item["today_income"] = "{}%".format(item["today_income"]*100)
  501. item["total_income"] = "{}%".format(item["total_income"]*100)
  502. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  503. today_stock = list(filter(lambda x:x["name"],today_stock if today_stock else []))
  504. today_stock = ",".join([x["name"]+str(x["fund"]) for x in today_stock]) if today_stock else ""
  505. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  506. yesterday_stock = list(filter(lambda x:x["name"],yesterday_stock if yesterday_stock else []))
  507. yesterday_stock = ",".join([x["name"]+str(x["fund"]) for x in yesterday_stock]) if yesterday_stock else ""
  508. #空仓、开超市、请假判断
  509. if item["auto_complete"] > 0:
  510. today_stock = u"请假"
  511. else:
  512. if item["is_markt"] == 1:
  513. today_stock = u"开超市"
  514. else:
  515. if today_stock == "":
  516. today_stock = u"空仓"
  517. #昨日
  518. if item["yesterday_auto_complete"] > 0:
  519. yesterday_stock = u"请假"
  520. else:
  521. if item["yesterday_is_markt"] == 1:
  522. yesterday_stock = u"开超市"
  523. else:
  524. if yesterday_stock == "":
  525. yesterday_stock = u"空仓"
  526. data.append(
  527. [
  528. item["group_rank"],
  529. item["username"],
  530. item["init_fund"],
  531. item["yesterday_fund"],
  532. item["today_fund"],
  533. item["today_income"],
  534. item["total_income"],
  535. yesterday_stock,
  536. today_stock
  537. ])
  538. xlsfile = os.path.join(settings.BASE_DIR,"demo.xls")
  539. exceltool = ExcelTool(xlsfile)
  540. xlsdata = exceltool.save_data(u"学员报名数据表",header,data)
  541. return xlsdata
  542. def fast_save_player(**kwargs):
  543. """
  544. """
  545. username = kwargs.get("username")
  546. usercode = kwargs.get("usercode")
  547. if cm.UserInfo.objects.filter(username=username).exists():
  548. raise ce.TipException(u"用户名重复!")
  549. if cm.UserInfo.objects.filter(usercode=usercode).exists():
  550. raise ce.TipException(u"用户代码重复!")
  551. user = cm.UserInfo.objects.create(username=username,usercode=usercode)
  552. #新建选手
  553. user_id = user.id
  554. kwargs["user_id"] = user_id
  555. cm.Player.objects.create(**kwargs)
  556. def update_player_latest(record):
  557. """更新选手最后一次数据
  558. """
  559. user_id = record["user_id"]
  560. match_id = record["match_id"]
  561. stock_date = record["stock_date"]
  562. match_group = record["match_group"]
  563. wincnt = record["wincnt"]
  564. total = record["totalcnt"]
  565. key = "PLAYER_LATEST_{}".format(user_id)
  566. if record:
  567. ccc.cache.hset(key,"stock_date",stock_date)
  568. ccc.cache.hset(key,"match_id",match_id)
  569. ccc.cache.hset(key,"match_group",match_group)
  570. #更新胜率
  571. qset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id)
  572. #win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  573. win_rate = wincnt/float(total) if total else 0.0
  574. win_rate = round(win_rate,3)
  575. ccc.cache.hset(key,"win_rate",win_rate)
  576. #badest = cm.PlayerRecord.get_db_model(match_id).objects.filter(user_id=user_id,match_id=match_id).order_by("today_income").first()
  577. #if badest:
  578. # ccc.cache.hset(key,"badest_income",badest.today_income)
  579. def update_group_rank(stock_date=None,match_id=None,group_id=None):
  580. """
  581. """
  582. if stock_date:
  583. stock_date = stock_date
  584. else:
  585. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  586. del_keys = ccc.cache.keys("*_%s_%s_%s" % (match_id,group_id,stock_date))
  587. if del_keys:
  588. ccc.cache.delete(*del_keys)
  589. groups = cm.MatchGroup.objects.filter(id=group_id)
  590. for gp in groups:
  591. match_id = gp.match_id
  592. match_group = gp.id
  593. prset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
  594. if prset:
  595. records = prset.values()
  596. case_id = " case id "
  597. cases = []
  598. where = []
  599. for index,pr in enumerate(records):
  600. case = "WHEN %s THEN %s" % (pr["id"],index+1)
  601. cases.append(case)
  602. where.append(str(pr["id"]))
  603. #
  604. key = "%s_%s_%s_%s" % (pr["user_id"],match_id,match_group,stock_date)
  605. pr.update({"group_rank":index+1})
  606. ccc.pl.set(key,json.dumps(pr,cls=ccc.CusJSONEncoder))
  607. ccc.pl.execute()
  608. winset = cm.PlayerRecord.get_db_model(match_id).objects.filter(
  609. match_id=match_id,match_group=match_group)\
  610. .values("user_id").annotate(wincnt=Count("user_id")).values("user_id","match_id","match_group","wincnt")
  611. totalset = cm.PlayerRecord.get_db_model(match_id).objects.filter(
  612. match_id=match_id,match_group=match_group)\
  613. .values("user_id").annotate(totalcnt=Count("user_id")).values("user_id","totalcnt")
  614. totallist = list(totalset)
  615. for item in winset:
  616. item["stock_date"] = stock_date
  617. user_id = item["user_id"]
  618. total = filter(lambda x:x["user_id"]==user_id,totallist)
  619. if total:
  620. item.update(total[0])
  621. else:
  622. item.update({"totalcnt":0})
  623. if total:
  624. #更新最后一次数据
  625. update_player_latest(item)
  626. if cases and where:
  627. case = case_id + " ".join(cases)
  628. where = ",".join(where)
  629. sql = "update player_record_%s set group_rank = %s ELSE 0 END where id in (%s)" % (match_id,case,where)
  630. cursor = connection.cursor()
  631. cursor.execute(sql)
  632. cursor.close()
  633. ##更新最后一次数据
  634. #update_player_latest(pr)
  635. def update_comment(**kwargs):
  636. """
  637. """
  638. id = kwargs.get("id")
  639. match_id = kwargs.get("match_id")
  640. wanzhu_comment = kwargs.get("wanzhu_comment")
  641. cm.PlayerRecord.get_db_model(match_id).objects.filter(id=id).update(wanzhu_comment=wanzhu_comment)
  642. def reset_initfund(**kwargs):
  643. """
  644. """
  645. match_id = kwargs.get("match_id")
  646. cm.Player.objects.filter(match_id=match_id).update(fund=1)
  647. #cm.Player.objects.filter(match_id=match_id,id=3011).update(fund=None)
  648. def get_stock_comments_list(**kwargs):
  649. """
  650. """
  651. qset = cm.Comments.objects.filter(stock_id__isnull=False).order_by(*["-istop","-id"])
  652. if kwargs.get("name"):
  653. qset = qset.filter(stock_name__icontains=kwargs.get("name"))
  654. data = list(qset.values())
  655. for item in data:
  656. item["stock_name"] = cm.Stock.objects.filter(id=item["stock_id"]).first().name
  657. #分页
  658. page = int(kwargs.get("page",1))
  659. page_size = int(kwargs.get("page_size",20))
  660. if page and page_size:
  661. total,data = ccf.get_page_list(data,page,page_size)
  662. else:
  663. total = len(data)
  664. return total,data
  665. def get_record_comments_list(**kwargs):
  666. """
  667. """
  668. match_id = kwargs.get("match_id")
  669. qset = cm.Comments.objects.filter(record_id__isnull=False).order_by(*["-istop","-id"])
  670. if kwargs.get("user_name"):
  671. qset = qset.filter(user_name__icontains=kwargs.get("name"))
  672. data = list(qset.values())
  673. for item in data:
  674. item["record_info"] = cm.PlayerRecord.get_db_model(match_id).objects.filter(id=item["record_id"]).values().first()
  675. #分页
  676. page = int(kwargs.get("page",1))
  677. page_size = int(kwargs.get("page_size",20))
  678. if page and page_size:
  679. total,data = ccf.get_page_list(data,page,page_size)
  680. else:
  681. total = len(data)
  682. return total,data
  683. def get_wanzhu_consult_list(**kwargs):
  684. """
  685. """
  686. qset = cm.Consult.objects.all().order_by("-ctime")
  687. if kwargs.get("username"):
  688. qset = qset.filter(user_name__icontains=kwargs.get("username"))
  689. if kwargs.get("reply_status"):
  690. qset = qset.filter(reply_status=kwargs.get("reply_status"))
  691. if kwargs.get("content"):
  692. qset = qset.filter(Q(content__icontains=kwargs.get("content"))|Q(reply_content__icontains=kwargs.get("content")))
  693. data = list(qset.values())
  694. for item in data:
  695. user_id = item["user_id"]
  696. userinfo = get_user_info(user_id)
  697. if userinfo:
  698. item["user_code"] = userinfo.get("usercode")
  699. item["phone"] = userinfo.get("phone")
  700. #分页
  701. page = int(kwargs.get("page",1))
  702. page_size = int(kwargs.get("page_size",20))
  703. if page and page_size:
  704. total,data = ccf.get_page_list(data,page,page_size)
  705. else:
  706. total = len(data)
  707. return total,data
  708. def calc_reply(v):
  709. """计算未回复数量
  710. """
  711. user_ids = [str(x["user_id"])[0] for x in v]
  712. user_id_str = "".join(user_ids)
  713. if v[-1]["user_id"]<=0:
  714. return 0
  715. else:
  716. index = user_id_str.rfind("0")
  717. return len(v) - index-1
  718. def reply_wanzhu_consult(**kwargs):
  719. """
  720. """
  721. pid = kwargs.get("pid")
  722. content = kwargs.get("reply_content")
  723. user_id = kwargs.get("user_id")
  724. cm.WanzhuConsult.objects.create(
  725. pid = pid,
  726. reply_content = content,
  727. user_id = 0,
  728. player_id = 0,
  729. reply_user_id = user_id
  730. )
  731. cm.Consult.objects.filter(user_id=user_id).update(reply_status=1,reply_content=content,ctime=datetime.datetime.now())
  732. #发送消息提醒
  733. if cm.UserInfo.objects.filter(id=user_id).exists():
  734. user = cm.UserInfo.objects.filter(id=user_id).first()
  735. openid = user.openid
  736. username = user.username
  737. send_consult_reply_message(openid,username)
  738. def update_player_type(**kwargs):
  739. """
  740. """
  741. player_id = kwargs.get("player_id")
  742. user_id = kwargs.get("user_id")
  743. player_type = kwargs.get("player_type")
  744. phone = kwargs.get("phone")
  745. cm.UserInfo.objects.filter(id=user_id).update(player_type=player_type,phone=phone)
  746. def update_player_role(**kwargs):
  747. """
  748. """
  749. player_id = kwargs.get("player_id")
  750. user_id = kwargs.get("user_id")
  751. role = kwargs.get("role")
  752. cm.Player.objects.filter(id=player_id).update(role=role)
  753. def comments_top(**kwargs):
  754. """
  755. """
  756. _id = kwargs.get("id")
  757. istop = 1-cm.Comments.objects.filter(id=_id).first().istop
  758. cm.Comments.objects.filter(id=_id).update(istop=istop)
  759. def comments_black(**kwargs):
  760. """
  761. """
  762. _id = kwargs.get("id")
  763. comment_status = 1-cm.UserInfo.objects.filter(id=_id).first().comment_status
  764. cm.UserInfo.objects.filter(id=_id).update(comment_status=comment_status)
  765. def relation_old_user(**kwargs):
  766. """
  767. """
  768. old_user_id = kwargs.get("old_user_id")
  769. user_id = kwargs.get("user_id")
  770. print(kwargs,1111111111111)
  771. user = cm.UserInfo.objects.filter(id=user_id).first()
  772. if user:
  773. if user.openid:
  774. cm.UserInfo.objects.filter(id=old_user_id).update(openid=user.openid)
  775. cm.UserInfo.objects.filter(id=user_id).delete()
  776. def get_openid_miss(**kwargs):
  777. """
  778. """
  779. qset = cm.UserInfo.objects.filter(openid__isnull=True)
  780. data = list(qset.values())
  781. return data
  782. def signup_old_user(**kwargs):
  783. """
  784. """
  785. order_id = kwargs.get("id")
  786. signup_type = kwargs.get("signup_type")
  787. match_group = kwargs.get("match_group")
  788. player_type = kwargs.get("player_type")
  789. role_type = kwargs.get("role_type")
  790. order = cm.SignupOrder.objects.filter(id=order_id).first()
  791. if order:
  792. user_id = order.user_id
  793. match_id = order.match_id
  794. signup_name = order.signup_name
  795. user = cm.UserInfo.objects.filter(id=user_id).first()
  796. match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
  797. match = cm.Match.objects.filter(id=match_id).first()
  798. user.player_type = player_type
  799. user.phone = order.phone
  800. user.username = signup_name
  801. user.save()
  802. order.signup_type = signup_type
  803. order.match_group = match_group
  804. order.match_group_name = match_group_name
  805. order.order_status = 1
  806. order.save()
  807. #生产选手信息
  808. player,flag = cm.Player.objects.get_or_create(
  809. user_id = user_id,
  810. match_id = match_id
  811. )
  812. player.match_name = match.name
  813. player.match_group = match_group
  814. player.match_group_name = match_group_name
  815. player.username = signup_name
  816. player.usercode = user.usercode
  817. player.role = role_type
  818. player.match_status = 1
  819. player.save()
  820. def get_consult_detail(**kwargs):
  821. """
  822. """
  823. rst = {}
  824. user_id = kwargs.get("user_id")
  825. qset = cm.WanzhuConsult.objects.filter(Q(user_id=user_id)|Q(reply_user_id=user_id))
  826. rst["consult_list"] = list(qset.filter(user_id__gt=0).order_by("ctime").values())
  827. rst["all_consult_list"] = list(qset.order_by("ctime").values())
  828. rst["user_id"] = user_id
  829. cm.Consult.objects.filter(user_id=user_id).update(view_status=1)
  830. return rst
  831. def delete_consult(**kwargs):
  832. """
  833. """
  834. user_id = kwargs.get("id")
  835. cm.Consult.objects.filter(user_id=user_id).delete()
  836. cm.WanzhuConsult.objects.filter(Q(user_id=user_id)|Q(reply_user_id=user_id)).delete()
  837. def batch_update_player_latest(record):
  838. """更新选手最后一次数据
  839. """
  840. user_id = record["user_id"]
  841. match_id = record["match_id"]
  842. stock_date = record["stock_date"]
  843. match_group = record["match_group"]
  844. #wincnt = record["wincnt"]
  845. #total = record["totalcnt"]
  846. key = "PLAYER_LATEST_{}".format(user_id)
  847. if record and match_group:
  848. ccc.cache.hset(key,"stock_date",stock_date)
  849. ccc.cache.hset(key,"match_id",match_id)
  850. ccc.cache.hset(key,"match_group",match_group)
  851. ##更新胜率
  852. #qset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id)
  853. ##win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  854. #win_rate = wincnt/float(total) if total else 0.0
  855. #win_rate = round(win_rate,3)
  856. #ccc.cache.hset(key,"win_rate",win_rate)