controls.py 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466
  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,requests
  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. from utils.aliyunpush import aliyunpush
  31. from tools.article_spider import startSpider
  32. from utils.plottool import plot_records,get_zipfile
  33. import xlrd
  34. import xlwt
  35. from xlutils.copy import copy
  36. from xltpl.writer import BookWriter
  37. from weixin.wzhifuSDK_V3 import refund_order
  38. @ccc.cache_data()
  39. def get_user_info(uid):
  40. user = cm.UserInfo.objects.filter(id=uid).values().first()
  41. if user:
  42. user["style"] = []
  43. if user["zq"]:
  44. user["style"].append(user["zq"])
  45. if user["cw"]:
  46. user["style"].append(user["cw"])
  47. if user["df"]:
  48. user["style"].append(user["df"])
  49. return user
  50. @ccc.cache_data()
  51. def get_match_info(match_id):
  52. match = cm.Match.objects.filter(id=match_id).values().first()
  53. return match
  54. def async(f):
  55. def wrapper(*args, **kwargs):
  56. thr = Thread(target=f, args=args, kwargs=kwargs)
  57. thr.start()
  58. return wrapper
  59. def get_match_validdates(match_id):
  60. """
  61. """
  62. #qdata = request.json
  63. #match_id = qdata.get("match_id")
  64. match = cm.Match.objects.filter(id=match_id).first()
  65. if match:
  66. validdates = json.loads(match.valid_dates) if match.valid_dates else []
  67. validdates.sort()
  68. return validdates
  69. return []
  70. def add_model(cls,**kwargs):
  71. """
  72. """
  73. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  74. model = getattr(cm,model_name)
  75. if model_name == "UserInfo":
  76. username = kwargs.get("username")
  77. usercode = kwargs.get("usercode")
  78. phone = kwargs.get("phone")
  79. if cm.UserInfo.objects.filter(username=username).exists():
  80. raise ce.TipException(u"用户名重复!")
  81. if cm.UserInfo.objects.filter(usercode=usercode).exists():
  82. raise ce.TipException(u"用户代码重复!")
  83. if cm.UserInfo.objects.filter(phone=phone).exists():
  84. raise ce.TipException(u"手机号重复!")
  85. if model_name == "Match":
  86. name = kwargs.get("name")
  87. if cm.Match.objects.filter(name=name).exists():
  88. raise ce.TipException(u"比赛名称重复!")
  89. if model_name == "MatchGoup":
  90. name = kwargs.get("name")
  91. match_id = kwargs.get("match_id")
  92. if cm.MatchGroup.objects.filter(name=name,match_id=match_id).exists():
  93. raise ce.TipException(u"分组名称重复!")
  94. if model_name == "Player":
  95. user_id = kwargs.get("user_id")
  96. match_id = kwargs.get("match_id")
  97. if cm.Player.objects.filter(user_id=user_id,match_id=match_id).exists():
  98. raise ce.TipException(u"重复添加选手!")
  99. user =cm.UserInfo.objects.filter(id=user_id).first()
  100. username = user.username if user else ""
  101. usercode = user.usercode if user else ""
  102. kwargs["username"] = username
  103. kwargs["usercode"] = usercode
  104. if model_name == "PlayerRecord":
  105. #return None
  106. match_id = kwargs.get("match_id")
  107. stock_date = kwargs.get("stock_date")
  108. today_stock = json.dumps(kwargs.get("today_stock"))
  109. today_stock_img = json.dumps(kwargs.get("today_stock_img"))
  110. player_id = kwargs.get("player_id")
  111. today_fund = float(kwargs.get("today_fund"))
  112. is_markt = int(kwargs.get("is_markt",0))
  113. player = cm.Player.objects.filter(id=player_id).first()
  114. user_id = player.user_id
  115. init_fund = player.fund
  116. user = cm.UserInfo.objects.filter(id=user_id).first()
  117. username = user.username
  118. usercode = user.usercode
  119. match_group = player.match_group
  120. match = cm.Match.objects.filter(id=match_id).first()
  121. if player.match_status < 1:
  122. raise ce.TipException(u"该账号已暂停/退出比赛,如有疑问请联系管理员获取详情信息!")
  123. now_date = datetime.datetime.now().strftime("%Y-%m-%d")
  124. if match.end_time < now_date:
  125. raise ce.TipException(u"该比赛已结束!")
  126. #yesterday_date = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  127. #yesterday = cm.PlayerRecord.get_db_model(match_id).objects.filter(
  128. # match_id=match_id,player_id=player_id).order_by("-stock_date").first()
  129. validdates = get_match_validdates(match_id)
  130. today_index = validdates.index(stock_date)
  131. yesterday_index = today_index -1 if today_index >=1 else 0
  132. yesterday_date = validdates[yesterday_index]
  133. yesterday = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,player_id=player_id,
  134. stock_date=yesterday_date).exclude(stock_date=stock_date).first()
  135. if yesterday:
  136. yesterday_fund = yesterday.today_fund
  137. yesterday_stock = yesterday.today_stock
  138. yesterday_stock_img = yesterday.today_stock_img
  139. yesterday_is_markt = yesterday.is_markt
  140. else:
  141. yesterday_fund = today_fund
  142. yesterday_stock = ""
  143. yesterday_stock_img = ""
  144. yesterday_is_markt = 0
  145. if kwargs.get("id"):
  146. if cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id).count()==1:
  147. init_fund = today_fund
  148. cm.Player.objects.filter(user_id=user_id,match_id=match_id).update(fund=today_fund)
  149. else:
  150. if not cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id).exists():
  151. init_fund = today_fund
  152. cm.Player.objects.filter(user_id=user_id,match_id=match_id).update(fund=today_fund)
  153. obj,flag = cm.PlayerRecord.get_db_model(match_id).objects.get_or_create(
  154. player_id=player_id,
  155. match_id=match_id,
  156. stock_date=stock_date)
  157. obj.init_fund = init_fund
  158. obj.yesterday_fund = yesterday_fund
  159. obj.yesterday_stock = yesterday_stock
  160. obj.yesterday_stock_img = yesterday_stock_img
  161. obj.today_fund = today_fund
  162. obj.today_stock = today_stock
  163. obj.today_stock_img = today_stock_img
  164. obj.user_id = user_id
  165. obj.username = username
  166. obj.usercode = usercode
  167. obj.match_group = match_group
  168. obj.is_markt = is_markt
  169. obj.yesterday_is_markt = yesterday_is_markt
  170. #计算今日和昨日盈亏
  171. today_income = (today_fund - yesterday_fund)/float(yesterday_fund) if yesterday_fund else 0.0
  172. total_income = (today_fund - init_fund)/float(init_fund) if init_fund else 0.0
  173. obj.today_income = round(today_income,4)
  174. obj.total_income = round(total_income,4)
  175. if not flag:
  176. obj.ctime = datetime.datetime.now()
  177. obj.save()
  178. #更新group_rank
  179. return obj.id
  180. if model_name == "PlayerRecord":
  181. match_id = kwargs.get("match_id")
  182. obj = model.get_db_model(match_id).objects.create(**kwargs)
  183. else:
  184. obj = model.objects.create(**kwargs)
  185. #
  186. if model_name == "Match":
  187. cm.MatchGroup.objects.create(
  188. match_id = obj.id,
  189. name = obj.name+u"游客组",
  190. is_active = 0,
  191. charge = 0
  192. )
  193. return obj.id
  194. def update_model(cls,**kwargs):
  195. """
  196. """
  197. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  198. model = getattr(cm,model_name)
  199. id = kwargs.pop("id")
  200. if model_name == "UserInfo":
  201. username = kwargs.get("username")
  202. usercode = kwargs.get("usercode")
  203. phone = kwargs.get("phone")
  204. if cm.UserInfo.objects.exclude(id=id).filter(username=username).exists():
  205. raise ce.TipException(u"用户名重复!")
  206. if cm.UserInfo.objects.exclude(id=id).filter(usercode=usercode).exists():
  207. raise ce.TipException(u"用户代码重复!")
  208. if phone and cm.UserInfo.objects.exclude(id=id).filter(phone=phone).exists():
  209. raise ce.TipException(u"手机号重复!")
  210. if model_name == "Player":
  211. user_id = kwargs.get("user_id")
  212. match_id = kwargs.get("match_id")
  213. match_group = kwargs.get("match_group")
  214. if cm.Player.objects.exclude(id=id).filter(user_id=user_id,match_id=match_id).exists():
  215. raise ce.TipException(u"重复添加选手!")
  216. user =cm.UserInfo.objects.filter(id=user_id).first()
  217. username = user.username if user else ""
  218. usercode = user.usercode if user else ""
  219. try:
  220. match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
  221. except Exception as e:
  222. match_group_name = ""
  223. kwargs["match_group_name"] = match_group_name
  224. if model_name == "PlayerRecord":
  225. is_markt = int(kwargs.get("is_markt",0))
  226. kwargs["today_stock"] = json.dumps(kwargs.get("today_stock"))
  227. kwargs["today_stock_img"] = json.dumps(kwargs.get("today_stock_img"))
  228. if model_name == "PlayerRecord":
  229. match_id = kwargs.get("match_id")
  230. rst = model.get_db_model(match_id).objects.filter(id=id).update(**kwargs)
  231. else:
  232. rst = model.objects.filter(id=id).update(**kwargs)
  233. if model_name == "PlayerRecord":
  234. match_id = kwargs.get("match_id")
  235. user_id = kwargs.get("user_id")
  236. obj = cm.PlayerRecord.get_db_model(match_id).objects.filter(id=id).first()
  237. today_fund = obj.today_fund
  238. yesterday_fund = obj.yesterday_fund
  239. init_fund = obj.init_fund
  240. today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
  241. total_income = (today_fund - init_fund)/float(init_fund)
  242. obj.today_income = round(today_income,4)
  243. obj.total_income = round(total_income,4)
  244. #
  245. player = cm.Player.objects.filter(user_id=user_id,match_id=match_id).first()
  246. if player:
  247. obj.match_group = player.match_group
  248. obj.username = player.username
  249. obj.usercode = player.usercode
  250. #记录持股情况
  251. stock_date = obj.stock_date
  252. today_stock = obj.today_stock
  253. new_stock_list = []
  254. today_stock_list = json.loads(today_stock)
  255. month = "%s%s" % (stock_date.split("-")[0],stock_date.split("-")[1])
  256. for ts in today_stock_list:
  257. if ts["name"]:
  258. try:
  259. stock,flag = cm.Stock.objects.get_or_create(
  260. name = ts["name"]
  261. )
  262. stock_id = stock.id
  263. usobj,flag = cm.UserStock.get_db_model(month).objects.get_or_create(
  264. user_id = user_id,
  265. stock_id = stock_id,
  266. stock_name = ts["name"],
  267. player_id = player.id,
  268. stock_date = stock_date
  269. )
  270. if ts.get("fund"):
  271. usobj.fund = ts["fund"]
  272. usobj.save()
  273. ts["stock_id"] = stock_id
  274. new_stock_list.append(ts)
  275. except Exception as e:
  276. print(e)
  277. today_stock = json.dumps(new_stock_list)
  278. obj.today_stock = today_stock
  279. obj.save()
  280. #更新player的init_fund
  281. player_id = player.id
  282. cm.Player.objects.filter(id=player_id).update(fund=init_fund)
  283. ##更新group_rank
  284. update_group_rank(obj.stock_date,obj.match_group,obj.match_id)
  285. if model_name == "UserInfo":
  286. ccc.del_cache("cdata_get_user_info_(%s,)"%id)
  287. if model_name == "Stock":
  288. ccc.del_cache("cdata_get_stock_cache_(%sL,)"%id)
  289. return rst
  290. def delete_model(cls,**kwargs):
  291. """
  292. """
  293. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  294. model = getattr(cm,model_name)
  295. ids = str(kwargs.get("id")).split(",")
  296. if model_name == "WanzhuConsult":
  297. cm.WanzhuConsult.objects.filter(Q(user_id__in=ids)|Q(reply_user_id__in=ids)).delete()
  298. else:
  299. if model_name == "PlayerRecord":
  300. match_id = kwargs.get("match_id")
  301. obj = cm.PlayerRecord.get_db_model(match_id).objects.filter(id__in=ids).first()
  302. ##更新group_rank
  303. update_group_rank(obj.stock_date,obj.match_group,obj.match_id)
  304. rst = model.get_db_model(match_id).objects.filter(id__in=ids).delete()
  305. else:
  306. rst = model.objects.filter(id__in=ids).delete()
  307. if model_name == "UserInfo":
  308. cm.Player.objects.filter(user_id__in=ids).delete()
  309. cm.PlayerRecord.objects.filter(user_id__in=ids).delete()
  310. if model_name == "Player":
  311. cm.PlayerRecord.objects.filter(player_id__in=ids).delete()
  312. if model_name == "Match":
  313. cm.PlayerRecord.objects.filter(match_id__in=ids).delete()
  314. cm.Player.objects.filter(match_id__in=ids).delete()
  315. cm.MatchGroup.objects.filter(match_id__in=ids).delete()
  316. if model_name == "MatchGroup":
  317. cm.PlayerRecord.objects.filter(match_group__in=ids).delete()
  318. cm.Player.objects.filter(match_group__in=ids).delete()
  319. if model_name == "BaikeCategory":
  320. cm.BaikeDetail.objects.filter(category_id__in=ids).delete()
  321. return ids
  322. def get_search_list(cls,**kwargs):
  323. """
  324. """
  325. model_name = re.search(r'.*\.(\w+)SearchView',str(cls.__class__)).groups()[0]
  326. model = getattr(cm,model_name)
  327. qset = model.objects.all().order_by("-id")
  328. if model_name == "Player":
  329. if kwargs.get("usercode"):
  330. qset = qset.filter(Q(usercode__icontains=kwargs.get("usercode"))|Q(username__icontains=kwargs.get("usercode"))|Q(phone__icontains=kwargs.get("usercode")))
  331. data = list(qset.values("id","user_id","username","usercode"))
  332. for item in data:
  333. item["label"] = "%s(%s)" % (item["username"],item["usercode"])
  334. else:
  335. data = []
  336. elif model_name == "Stock":
  337. if kwargs.get("name"):
  338. qset = qset.filter(Q(name__icontains=kwargs.get("name"))|Q(code__icontains=kwargs.get("name")))
  339. data = list(qset.values("id","name","code"))
  340. for item in data:
  341. item["label"] = "%s(%s)" % (item["name"],item["code"])
  342. else:
  343. data = []
  344. elif model_name == "UserInfo":
  345. if kwargs.get("name"):
  346. qset = qset.filter(username__icontains=kwargs.get("name"))
  347. data = list(qset.values("id","username","usercode","avatar"))
  348. for item in data:
  349. item["label"] = "%s(%s)" % (item["username"],item["usercode"])
  350. else:
  351. data = []
  352. elif model_name == "MatchGroup":
  353. if kwargs.get("match_id"):
  354. qset = qset.filter(match_id__icontains=kwargs.get("match_id"))
  355. if kwargs.get("is_active"):
  356. qset = qset.filter(is_active__icontains=kwargs.get("is_active"))
  357. data = list(qset.values("id","name"))
  358. else:
  359. if kwargs.get("name"):
  360. qset = qset.filter(name__icontains=kwargs.get("name"))
  361. data = list(qset.values("id","name"))
  362. return data
  363. def get_detail_info(cls,**kwargs):
  364. """
  365. """
  366. model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
  367. model = getattr(cm,model_name)
  368. id = kwargs.get("id")
  369. if model_name == "PlayerRecord":
  370. match_id = kwargs.get("match_id")
  371. rst = list(model.get_db_model(match_id).objects.filter(id=id).values())
  372. else:
  373. rst = list(model.objects.filter(id=id).values())
  374. rst = rst[0] if rst else {}
  375. if model_name == "Player":
  376. user = get_user_info(rst["user_id"])
  377. match = get_match_info(rst["match_id"])
  378. rst["username"] = user["username"]
  379. rst["usercode"] = user["usercode"]
  380. rst["match_name"] = match["name"] if match else ""
  381. rst["match_group"] = int(rst["match_group"]) if rst["match_group"] else 0
  382. if model_name == "PlayerRecord":
  383. rst["today_stock"] = json.loads(rst["today_stock"]) if rst["today_stock"] else []
  384. rst["today_stock_img"] = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
  385. rst["yesterday_stock"] = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
  386. rst["yesterday_stock_img"] = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
  387. rst["is_markt"] = bool(rst["is_markt"])
  388. return rst
  389. def get_group_income(match_id,match_group,stock_date=None):
  390. """
  391. """
  392. data = []
  393. if stock_date:
  394. today = stock_date
  395. else:
  396. today = datetime.datetime.now().strftime("%Y-%m-%d")
  397. player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
  398. for player_id in player_ids:
  399. 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()
  400. if today_record:
  401. data.append(today_record.total_income)
  402. data = list(set(data))
  403. data = sorted(data,key=lambda x:x,reverse=True)
  404. return data
  405. def get_list_info(cls,**kwargs):
  406. """
  407. """
  408. model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
  409. model = getattr(cm,model_name)
  410. if model_name == "PlayerRecord":
  411. match_id = kwargs.get("match_id",0)
  412. qset = model.get_db_model(match_id).objects.all()
  413. else:
  414. qset = model.objects.all()
  415. if kwargs.get("name"):
  416. qset = qset.filter(name__icontains=kwargs.get("name"))
  417. if model_name == "UserInfo":
  418. if kwargs.get("username"):
  419. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username")))
  420. if model_name == "Player":
  421. if kwargs.get("username"):
  422. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  423. if kwargs.get("match_id"):
  424. qset = qset.filter(match_id=kwargs.get("match_id"))
  425. if kwargs.get("groupId"):
  426. qset = qset.filter(match_group=kwargs.get("groupId"))
  427. if model_name == "MatchGroup":
  428. if kwargs.get("match_id"):
  429. qset = qset.filter(match_id=kwargs.get("match_id"))
  430. if model_name == "PlayerRecord":
  431. if kwargs.get("match_id"):
  432. qset = qset.filter(match_id=kwargs.get("match_id"))
  433. if kwargs.get("groupId"):
  434. qset = qset.filter(match_group=kwargs.get("groupId"))
  435. if kwargs.get("username"):
  436. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  437. if kwargs.get("stock_date"):
  438. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  439. if kwargs.get("auto_complete"):
  440. if int(kwargs.get("auto_complete"))==1:
  441. qset = qset.filter(auto_complete__gte=kwargs.get("auto_complete"))
  442. else:
  443. qset = qset.filter(auto_complete=kwargs.get("auto_complete"))
  444. if model_name == "SignupOrder":
  445. if kwargs.get("match_id"):
  446. qset = qset.filter(match_id=kwargs.get("match_id"))
  447. if kwargs.get("username"):
  448. qset = qset.filter(Q(user_name__icontains=kwargs.get("username"))|Q(phone__icontains=kwargs.get("username")))
  449. if kwargs.get("signup_type"):
  450. qset = qset.filter(signup_type=kwargs.get("signup_type"))
  451. if kwargs.get("order_status") or kwargs.get("order_status")==0:
  452. qset = qset.filter(order_status=kwargs.get("order_status"))
  453. if kwargs.get("pay_status") or kwargs.get("pay_status")==0:
  454. qset = qset.filter(pay_status=kwargs.get("pay_status"))
  455. if model_name == "Article":
  456. if kwargs.get("type"):
  457. qset = qset.filter(type=kwargs.get("type"))
  458. if kwargs.get("category"):
  459. qset = qset.filter(category=kwargs.get("category"))
  460. if kwargs.get("isbanner"):
  461. qset = qset.filter(isbanner=kwargs.get("isbanner"))
  462. if kwargs.get("ishot"):
  463. qset = qset.filter(ishot=kwargs.get("ishot"))
  464. if model_name == "Stock":
  465. if kwargs.get("username"):
  466. qset = qset.filter(name__icontains=kwargs.get("username"))
  467. if model_name == "BaikeDetail":
  468. if kwargs.get("name"):
  469. qset = qset.filter(name__icontains=kwargs.get("name"))
  470. if kwargs.get("status"):
  471. qset = qset.filter(status=kwargs.get("status"))
  472. if kwargs.get("category_id"):
  473. qset = qset.filter(category_id=kwargs.get("category_id"))
  474. if model_name == "PlayerRecord":
  475. if kwargs.get("username"):
  476. data = list(qset.order_by("-stock_date").values())
  477. else:
  478. data = list(qset.order_by("-total_income").values())
  479. elif model_name == "Player":
  480. data = list(qset.order_by("-fund").values())
  481. else:
  482. data = list(qset.order_by("-id").values())
  483. page = int(kwargs.get("page",1))
  484. page_size = int(kwargs.get("page_size",20))
  485. if page and page_size:
  486. total,data = ccf.get_page_list(data,page,page_size)
  487. if model_name == "Player":
  488. for item in data:
  489. user = get_user_info(item["user_id"])
  490. if user:
  491. match = get_match_info(item["match_id"])
  492. item["nickname"] = user["nickname"]
  493. item["match_name"] = match["name"] if match else ""
  494. item["openid"] = user["openid"]
  495. item["player_type"] = user["player_type"]
  496. item["phone"] = user.get('phone', '')
  497. if model_name == "PlayerRecord":
  498. for item in data:
  499. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  500. item["username"] = user.username if user else ""
  501. item["usercode"] = user.usercode if user else ""
  502. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  503. today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
  504. today_stock_img = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  505. item["today_stock"] = today_stock
  506. ilist = []
  507. for img in today_stock_img:
  508. nlist = img.split('?')
  509. if len(nlist) > 0:
  510. ilist.append(nlist[0])
  511. item["today_stock_img"] = ilist
  512. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  513. yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
  514. item["yesterday_stock"] = yesterday_stock
  515. item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
  516. if item["today_income"]:
  517. item["today_income"] = "{}%".format(item["today_income"]*100)
  518. if item["total_income"]:
  519. item["total_income"] = "{}%".format(item["total_income"]*100)
  520. item["is_markt"] = bool(item["is_markt"])
  521. #资金出入
  522. if cm.FundInOut.objects.filter(user_id=item["user_id"],stock_date=item["stock_date"]).exists():
  523. item["fund_inout"] = cm.FundInOut.objects.filter(user_id=item["user_id"],stock_date=item["stock_date"]).values().first()
  524. if kwargs.get("groupId"):
  525. data = sorted(data,key=lambda x:x["group_rank"])
  526. if model_name == "Match":
  527. for item in data:
  528. groups = ",".join(list(cm.MatchGroup.objects.filter(match_id=item["id"]).values_list("name",flat=True)))
  529. item["join_count"] = cm.Player.objects.filter(match_id=item["id"]).count()
  530. item["out_count"] = cm.Player.objects.filter(match_id=item["id"],match_status=-1).count()
  531. item["groups"] = groups
  532. if model_name == "MatchGroup":
  533. for item in data:
  534. match = cm.Match.objects.filter(id=item["match_id"]).first()
  535. match_name = match.name if match else ""
  536. item["join_count"] = cm.Player.objects.filter(match_group=item["id"]).count()
  537. item["out_count"] = cm.Player.objects.filter(match_group=item["id"],match_status=-1).count()
  538. item["match_name"] = match_name
  539. if model_name == "SignupOrder":
  540. for item in data:
  541. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  542. try:
  543. item["match_group_name"] = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
  544. except Exception as e:
  545. print(e)
  546. item["match_group_name"] = ""
  547. if user:
  548. item["usercode"] = user.usercode
  549. item["nickname"] = user.nickname
  550. item["openid"] = user.openid
  551. if model_name == "FundInOut":
  552. for item in data:
  553. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  554. item["username"] = user.username
  555. item["usercode"] = user.usercode
  556. if kwargs.get("username"):
  557. data = filter(lambda x:x["username"] == str(kwargs.get("username")) or kwargs.get("username") ==x["usercode"],data)
  558. return (total,data)
  559. else:
  560. return len(data),data
  561. return rst
  562. def download_records(request):
  563. """
  564. """
  565. kwargs = request.json
  566. header = [u"NO.",u"选手",u"初始资产",u"今日资产",u"今日盈亏",u"总盈亏",u"昨日持股\n(万元)",u"今日持股\n(万元)"]
  567. match_id = kwargs.get("match_id")
  568. qset = cm.PlayerRecord.get_db_model(match_id).objects.all()
  569. if kwargs.get("match_id"):
  570. qset = qset.filter(match_id=kwargs.get("match_id"))
  571. if kwargs.get("groupId"):
  572. qset = qset.filter(match_group=kwargs.get("groupId"))
  573. if kwargs.get("username"):
  574. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  575. if kwargs.get("stock_date"):
  576. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  577. qdata = list(qset.order_by("-total_income").values())
  578. if kwargs.get("groupId"):
  579. qdata = sorted(qdata,key=lambda x:x["group_rank"])
  580. data = []
  581. for item in qdata:
  582. try:
  583. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  584. item["username"] = user.username
  585. item["usercode"] = user.usercode
  586. item["today_income"] = "{}%".format(item["today_income"]*100)
  587. item["total_income"] = "{}%".format(item["total_income"]*100)
  588. try:
  589. match_group_name = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
  590. except:
  591. match_group_name = ""
  592. item["match_group_name"] = match_group_name
  593. item["today_stock_imgs"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  594. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  595. today_stock = list(filter(lambda x:x["name"],today_stock if today_stock else []))
  596. today_stock = ",".join([x["name"]+str(x["fund"]) for x in today_stock]) if today_stock else ""
  597. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  598. yesterday_stock = list(filter(lambda x:x["name"],yesterday_stock if yesterday_stock else []))
  599. yesterday_stock = ",".join([x["name"]+str(x["fund"]) for x in yesterday_stock]) if yesterday_stock else ""
  600. #空仓、开超市、请假判断
  601. if item["auto_complete"] > 0:
  602. today_stock = u"请假"
  603. else:
  604. if item["is_markt"] == 1:
  605. today_stock = u"开超市"
  606. else:
  607. if today_stock == "":
  608. today_stock = u"空仓"
  609. #昨日
  610. if item["yesterday_auto_complete"] > 0:
  611. yesterday_stock = u"请假"
  612. else:
  613. if item["yesterday_is_markt"] == 1:
  614. yesterday_stock = u"开超市"
  615. else:
  616. if yesterday_stock == "":
  617. yesterday_stock = u"空仓"
  618. data.append(
  619. [
  620. item["group_rank"],
  621. item["username"],
  622. item["init_fund"],
  623. item["today_fund"],
  624. item["today_income"],
  625. item["total_income"],
  626. yesterday_stock,
  627. today_stock,
  628. ''
  629. ])
  630. except Exception as e:
  631. print(e)
  632. xlsfile = os.path.join(settings.BASE_DIR,"demo.xls")
  633. exceltool = ExcelTool(xlsfile)
  634. groupName = kwargs.get("groupName")
  635. if not groupName:
  636. groupName = u"全部数据"
  637. xlsdata = exceltool.save_data(groupName,header,data)
  638. return xlsdata
  639. def download_records_image(request):
  640. """
  641. return: filename: str; binary data of the image: bytes.
  642. """
  643. kwargs = request.json
  644. match_id = kwargs.get("match_id")
  645. if not match_id:
  646. return None
  647. qset = cm.PlayerRecord.get_db_model(match_id).objects.all()
  648. match = cm.Match.objects.filter(id=match_id).values('name', 'start_time', 'end_time').first()
  649. if match is None:
  650. return None
  651. match_name = match['name'][:7]
  652. match_start_day_str = datetime.datetime.strptime(match['start_time'], '%Y-%m-%d').strftime('%-m.%-d')
  653. match_stop_day_str = datetime.datetime.strptime(match['end_time'], '%Y-%m-%d').strftime('%-m.%-d')
  654. if kwargs.get("match_id"):
  655. qset = qset.filter(match_id=kwargs.get("match_id"))
  656. if kwargs.get("groupId"):
  657. qset = qset.filter(match_group=kwargs.get("groupId"))
  658. match_group = cm.MatchGroup.objects.filter(id=kwargs.get('groupId')).values('name').first()
  659. if match_group is None:
  660. match_group_name = ''
  661. else:
  662. match_group_name = match_group['name']
  663. else:
  664. match_group_name = ''
  665. if kwargs.get("username"):
  666. qset = qset.filter(Q(username__icontains=kwargs.get("username"))|Q(usercode__icontains=kwargs.get("username")))
  667. if kwargs.get("stock_date"):
  668. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  669. # this formatting method only works on linux
  670. stock_day_str = datetime.datetime.strptime(kwargs.get("stock_date"), '%Y-%m-%d').strftime('%-m.%-d')
  671. if match_group_name:
  672. title = u'{}-{}{}({}-{})'.format(match_name, match_group_name, stock_day_str, match_start_day_str, match_stop_day_str)
  673. else:
  674. title = u'{}-{}'.format(match_name, stock_day_str)
  675. else:
  676. if match_group_name:
  677. title = u'{}-{}'.format(match_name, match_group_name)
  678. else:
  679. title = match_name
  680. qdata = list(qset.order_by("-total_income").values())
  681. if kwargs.get("groupId"):
  682. qdata = sorted(qdata,key=lambda x:x["group_rank"])
  683. data = []
  684. for item in qdata:
  685. try:
  686. user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
  687. item["username"] = user.username
  688. item["usercode"] = user.usercode
  689. item["today_income"] = "{}%".format(item["today_income"]*100)
  690. item["total_income"] = "{}%".format(item["total_income"]*100)
  691. try:
  692. match_group_name = cm.MatchGroup.objects.filter(id=item["match_group"]).first().name
  693. except:
  694. match_group_name = ""
  695. item["match_group_name"] = match_group_name
  696. item["today_stock_imgs"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  697. today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
  698. today_stock = list(filter(lambda x:x["name"],today_stock if today_stock else []))
  699. today_stock = ",".join([x["name"]+str(x["fund"]) for x in today_stock if x['fund'] != '0.0']) if today_stock else ""
  700. yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
  701. yesterday_stock = list(filter(lambda x:x["name"],yesterday_stock if yesterday_stock else []))
  702. yesterday_stock = ",".join([x["name"]+str(x["fund"]) for x in yesterday_stock if x['fund'] != '0.0']) if yesterday_stock else ""
  703. #空仓、开超市、请假判断
  704. if item["auto_complete"] > 0:
  705. today_stock = u"请假"
  706. else:
  707. if item["is_markt"] == 1:
  708. today_stock = u"开超市"
  709. else:
  710. if today_stock == "":
  711. today_stock = u"空仓"
  712. #昨日
  713. if item["yesterday_auto_complete"] > 0:
  714. yesterday_stock = u"请假"
  715. else:
  716. if item["yesterday_is_markt"] == 1:
  717. yesterday_stock = u"开超市"
  718. else:
  719. if yesterday_stock == "":
  720. yesterday_stock = u"空仓"
  721. data.append([item["group_rank"],
  722. item["username"],
  723. item["init_fund"],
  724. item["today_fund"],
  725. item["today_income"],
  726. item["total_income"],
  727. yesterday_stock,
  728. today_stock])
  729. except Exception as e:
  730. print(e)
  731. col_headers = [u"NO.", u"选手", u"初始", u"今日",
  732. u"今日成绩", u"总成绩", u"昨日", u"今日"]
  733. ret = plot_records(data, col_headers, title, 'player_records')
  734. return ret
  735. def fast_save_player(**kwargs):
  736. """
  737. """
  738. username = kwargs.get("username")
  739. usercode = kwargs.get("usercode")
  740. if cm.UserInfo.objects.filter(username=username).exists():
  741. raise ce.TipException(u"用户名重复!")
  742. if cm.UserInfo.objects.filter(usercode=usercode).exists():
  743. raise ce.TipException(u"用户代码重复!")
  744. user = cm.UserInfo.objects.create(username=username,usercode=usercode)
  745. #新建选手
  746. user_id = user.id
  747. kwargs["user_id"] = user_id
  748. cm.Player.objects.create(**kwargs)
  749. def update_player_latest(record):
  750. """更新选手最后一次数据
  751. """
  752. user_id = record["user_id"]
  753. match_id = record["match_id"]
  754. stock_date = record["stock_date"]
  755. match_group = record["match_group"]
  756. wincnt = record["wincnt"]
  757. total = record["totalcnt"]
  758. key = "PLAYER_LATEST_{}".format(user_id)
  759. if record:
  760. ccc.cache.hset(key,"stock_date",stock_date)
  761. ccc.cache.hset(key,"match_id",match_id)
  762. ccc.cache.hset(key,"match_group",match_group)
  763. #更新胜率
  764. qset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id)
  765. #win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  766. win_rate = wincnt/float(total) if total else 0.0
  767. win_rate = round(win_rate,3)
  768. ccc.cache.hset(key,"win_rate",win_rate)
  769. #badest = cm.PlayerRecord.get_db_model(match_id).objects.filter(user_id=user_id,match_id=match_id).order_by("today_income").first()
  770. #if badest:
  771. # ccc.cache.hset(key,"badest_income",badest.today_income)
  772. def update_group_rank(stock_date=None,match_id=None,group_id=None):
  773. """
  774. """
  775. if stock_date:
  776. stock_date = stock_date
  777. else:
  778. stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
  779. del_keys = ccc.cache.keys("*_%s_%s_%s" % (match_id,group_id,stock_date))
  780. if del_keys:
  781. ccc.cache.delete(*del_keys)
  782. groups = cm.MatchGroup.objects.filter(id=group_id)
  783. for gp in groups:
  784. match_id = gp.match_id
  785. match_group = gp.id
  786. 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")
  787. if prset:
  788. records = prset.values()
  789. case_id = " case id "
  790. cases = []
  791. where = []
  792. for index,pr in enumerate(records):
  793. case = "WHEN %s THEN %s" % (pr["id"],index+1)
  794. cases.append(case)
  795. where.append(str(pr["id"]))
  796. #
  797. key = "%s_%s_%s_%s" % (pr["user_id"],match_id,match_group,stock_date)
  798. pr.update({"group_rank":index+1})
  799. ccc.pl.set(key,json.dumps(pr,cls=ccc.CusJSONEncoder))
  800. ccc.pl.execute()
  801. winset = cm.PlayerRecord.get_db_model(match_id).objects.filter(
  802. match_id=match_id,match_group=match_group,today_income__gte=0)\
  803. .values("user_id").annotate(wincnt=Count("user_id")).values("user_id","match_id","match_group","wincnt")
  804. totalset = cm.PlayerRecord.get_db_model(match_id).objects.filter(
  805. match_id=match_id,match_group=match_group)\
  806. .values("user_id").annotate(totalcnt=Count("user_id")).values("user_id","totalcnt")
  807. totallist = list(totalset)
  808. for item in winset:
  809. item["stock_date"] = stock_date
  810. user_id = item["user_id"]
  811. total = filter(lambda x:x["user_id"]==user_id,totallist)
  812. if total:
  813. item.update(total[0])
  814. else:
  815. item.update({"totalcnt":0})
  816. if total:
  817. #更新最后一次数据
  818. update_player_latest(item)
  819. if cases and where:
  820. case = case_id + " ".join(cases)
  821. where = ",".join(where)
  822. sql = "update player_record_%s set group_rank = %s ELSE 0 END where id in (%s)" % (match_id,case,where)
  823. cursor = connection.cursor()
  824. cursor.execute(sql)
  825. cursor.close()
  826. ##更新最后一次数据
  827. #update_player_latest(pr)
  828. def update_comment(**kwargs):
  829. """
  830. """
  831. id = kwargs.get("id")
  832. match_id = kwargs.get("match_id")
  833. wanzhu_comment = kwargs.get("wanzhu_comment")
  834. cm.PlayerRecord.get_db_model(match_id).objects.filter(id=id).update(wanzhu_comment=wanzhu_comment)
  835. def reset_initfund(**kwargs):
  836. """
  837. """
  838. match_id = kwargs.get("match_id")
  839. cm.Player.objects.filter(match_id=match_id).update(fund=1)
  840. #cm.Player.objects.filter(match_id=match_id,id=3011).update(fund=None)
  841. def get_stock_comments_list(**kwargs):
  842. """
  843. """
  844. qset = cm.Comments.objects.filter(stock_id__isnull=False).order_by(*["-istop","-id"])
  845. if kwargs.get("name"):
  846. qset = qset.filter(stock_name__icontains=kwargs.get("name"))
  847. data = list(qset.values())
  848. for item in data:
  849. item["stock_name"] = cm.Stock.objects.filter(id=item["stock_id"]).first().name
  850. #分页
  851. page = int(kwargs.get("page",1))
  852. page_size = int(kwargs.get("page_size",20))
  853. if page and page_size:
  854. total,data = ccf.get_page_list(data,page,page_size)
  855. else:
  856. total = len(data)
  857. return total,data
  858. def get_record_comments_list(**kwargs):
  859. """
  860. """
  861. match_id = kwargs.get("match_id")
  862. qset = cm.Comments.objects.filter(record_id__isnull=False).order_by(*["-istop","-id"])
  863. if kwargs.get("user_name"):
  864. qset = qset.filter(user_name__icontains=kwargs.get("name"))
  865. data = list(qset.values())
  866. for item in data:
  867. item["record_info"] = cm.PlayerRecord.get_db_model(match_id).objects.filter(id=item["record_id"]).values().first()
  868. #分页
  869. page = int(kwargs.get("page",1))
  870. page_size = int(kwargs.get("page_size",20))
  871. if page and page_size:
  872. total,data = ccf.get_page_list(data,page,page_size)
  873. else:
  874. total = len(data)
  875. return total,data
  876. def get_wanzhu_consult_list(**kwargs):
  877. """
  878. """
  879. qset = cm.Consult.objects.all().order_by("-ctime")
  880. if kwargs.get("username"):
  881. qset = qset.filter(user_name__icontains=kwargs.get("username"))
  882. if kwargs.get("reply_status"):
  883. qset = qset.filter(reply_status=kwargs.get("reply_status"))
  884. if kwargs.get("content"):
  885. qset = qset.filter(Q(content__icontains=kwargs.get("content"))|Q(reply_content__icontains=kwargs.get("content")))
  886. data = list(qset.values())
  887. for item in data:
  888. user_id = item["user_id"]
  889. userinfo = get_user_info(user_id)
  890. item["user_code"] = userinfo.get("usercode")
  891. item["phone"] = userinfo.get("phone")
  892. #分页
  893. page = int(kwargs.get("page",1))
  894. page_size = int(kwargs.get("page_size",20))
  895. if page and page_size:
  896. total,data = ccf.get_page_list(data,page,page_size)
  897. else:
  898. total = len(data)
  899. return total,data
  900. def calc_reply(v):
  901. """计算未回复数量
  902. """
  903. user_ids = [str(x["user_id"])[0] for x in v]
  904. user_id_str = "".join(user_ids)
  905. if v[-1]["user_id"]<=0:
  906. return 0
  907. else:
  908. index = user_id_str.rfind("0")
  909. return len(v) - index-1
  910. def reply_wanzhu_consult(**kwargs):
  911. """
  912. """
  913. pid = kwargs.get("pid")
  914. content = kwargs.get("reply_content")
  915. user_id = kwargs.get("user_id")
  916. action = kwargs.get("action")
  917. if action == "send":
  918. user = cm.UserInfo.objects.filter(id=user_id).first()
  919. user_name = user.username
  920. user_avatar = user.avatar
  921. obj,flag = cm.Consult.objects.get_or_create(
  922. user_id = user_id,
  923. )
  924. obj.user_name = user_name
  925. obj.user_avatar = user_avatar
  926. #obj.reply_content = content
  927. obj.view_status = 1
  928. obj.reply_status = 0
  929. obj.ctime = datetime.datetime.now()
  930. obj.save()
  931. wanzhu_obj = cm.WanzhuConsult.objects.create(
  932. user_id = user_id,
  933. user_name = user_name,
  934. user_avatar = user_avatar
  935. )
  936. wanzhu_obj_1 = cm.WanzhuConsult.objects.create(
  937. reply_content = content,
  938. user_id = 0,
  939. player_id = 0,
  940. reply_user_id = user_id,
  941. pid = wanzhu_obj.id
  942. )
  943. cm.Consult.objects.filter(user_id=user_id).update(reply_status=1,reply_content=content,ctime=datetime.datetime.now())
  944. else:
  945. cm.WanzhuConsult.objects.create(
  946. pid = pid,
  947. reply_content = content,
  948. user_id = 0,
  949. player_id = 0,
  950. reply_user_id = user_id
  951. )
  952. cm.Consult.objects.filter(user_id=user_id).update(reply_status=1,reply_content=content,ctime=datetime.datetime.now())
  953. #发送消息提醒
  954. if cm.UserInfo.objects.filter(id=user_id).exists():
  955. user = cm.UserInfo.objects.filter(id=user_id).first()
  956. openid = user.openid
  957. username = user.username
  958. try:
  959. send_consult_reply_message(openid,username)
  960. except Exception as e:
  961. print(e)
  962. #发送app推送消息
  963. title = u"顽主杯"
  964. body = u"你收到一条顽主的消息"
  965. params = {"type":"message","id":str(user_id)}
  966. aliyunpush.push_notice_by_userid(user_id,title,body,params,"ios")
  967. aliyunpush.push_notice_by_userid(user_id,title,body,params,"android")
  968. def update_player_type(**kwargs):
  969. """
  970. """
  971. player_id = kwargs.get("player_id")
  972. user_id = kwargs.get("user_id")
  973. player_type = kwargs.get("player_type")
  974. phone = kwargs.get("phone")
  975. cm.UserInfo.objects.filter(id=user_id).update(player_type=player_type,phone=phone)
  976. ccc.del_cache("cdata_get_user_info_(%sL,)"%user_id)
  977. def update_player_role(**kwargs):
  978. """
  979. """
  980. player_id = kwargs.get("player_id")
  981. user_id = kwargs.get("user_id")
  982. role = kwargs.get("role")
  983. cm.Player.objects.filter(id=player_id).update(role=role)
  984. def comments_top(**kwargs):
  985. """
  986. """
  987. _id = kwargs.get("id")
  988. istop = 1-cm.Comments.objects.filter(id=_id).first().istop
  989. cm.Comments.objects.filter(id=_id).update(istop=istop)
  990. def comments_black(**kwargs):
  991. """
  992. """
  993. _id = kwargs.get("id")
  994. comment_status = 1-cm.UserInfo.objects.filter(id=_id).first().comment_status
  995. cm.UserInfo.objects.filter(id=_id).update(comment_status=comment_status)
  996. def relation_old_user(**kwargs):
  997. """
  998. """
  999. old_user_id = kwargs.get("old_user_id")
  1000. user_id = kwargs.get("user_id")
  1001. print(kwargs,1111111111111)
  1002. user = cm.UserInfo.objects.filter(id=user_id).first()
  1003. if user:
  1004. if user.openid:
  1005. cm.UserInfo.objects.filter(id=old_user_id).update(openid=user.openid)
  1006. cm.UserInfo.objects.filter(id=user_id).delete()
  1007. def get_openid_miss(**kwargs):
  1008. """
  1009. """
  1010. qset = cm.UserInfo.objects.filter(openid__isnull=True)
  1011. data = list(qset.values())
  1012. return data
  1013. def signup_old_user(**kwargs):
  1014. """
  1015. """
  1016. order_id = kwargs.get("id")
  1017. signup_type = kwargs.get("signup_type")
  1018. match_group = kwargs.get("match_group")
  1019. player_type = kwargs.get("player_type")
  1020. role_type = kwargs.get("role_type")
  1021. order = cm.SignupOrder.objects.filter(id=order_id).first()
  1022. if order:
  1023. user_id = order.user_id
  1024. match_id = order.match_id
  1025. signup_name = order.signup_name
  1026. user = cm.UserInfo.objects.filter(id=user_id).first()
  1027. match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
  1028. match = cm.Match.objects.filter(id=match_id).first()
  1029. user.player_type = player_type
  1030. user.phone = order.phone
  1031. user.username = signup_name
  1032. user.save()
  1033. order.signup_type = signup_type
  1034. order.match_group = match_group
  1035. order.match_group_name = match_group_name
  1036. order.order_status = 1
  1037. order.save()
  1038. #生产选手信息
  1039. player,flag = cm.Player.objects.get_or_create(
  1040. user_id = user_id,
  1041. match_id = match_id
  1042. )
  1043. player.match_name = match.name
  1044. player.match_group = match_group
  1045. player.match_group_name = match_group_name
  1046. player.username = signup_name
  1047. player.usercode = user.usercode
  1048. player.role = role_type
  1049. player.match_status = 1
  1050. player.save()
  1051. def get_consult_detail(**kwargs):
  1052. """
  1053. """
  1054. rst = {}
  1055. user_id = kwargs.get("user_id")
  1056. qset = cm.WanzhuConsult.objects.filter(Q(user_id=user_id)|Q(reply_user_id=user_id))
  1057. rst["consult_list"] = list(qset.filter(user_id__gt=0).order_by("ctime").values())
  1058. rst["all_consult_list"] = list(qset.order_by("ctime").values())
  1059. rst["user_id"] = user_id
  1060. cm.Consult.objects.filter(user_id=user_id).update(view_status=1)
  1061. return rst
  1062. def delete_consult(**kwargs):
  1063. """
  1064. """
  1065. user_id = kwargs.get("id")
  1066. cm.Consult.objects.filter(user_id=user_id).delete()
  1067. cm.WanzhuConsult.objects.filter(Q(user_id=user_id)|Q(reply_user_id=user_id)).delete()
  1068. def batch_update_player_latest(record):
  1069. """更新选手最后一次数据
  1070. """
  1071. user_id = record["user_id"]
  1072. match_id = record["match_id"]
  1073. stock_date = record["stock_date"]
  1074. match_group = record["match_group"]
  1075. #wincnt = record["wincnt"]
  1076. #total = record["totalcnt"]
  1077. key = "PLAYER_LATEST_{}".format(user_id)
  1078. if record and match_group:
  1079. ccc.cache.hset(key,"stock_date",stock_date)
  1080. ccc.cache.hset(key,"match_id",match_id)
  1081. ccc.cache.hset(key,"match_group",match_group)
  1082. ##更新胜率
  1083. #qset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,user_id=user_id)
  1084. ##win_rate = qset.filter(today_income__gte=0).count()/float(qset.count()) if qset else 0.0
  1085. #win_rate = wincnt/float(total) if total else 0.0
  1086. #win_rate = round(win_rate,3)
  1087. #ccc.cache.hset(key,"win_rate",win_rate)
  1088. def get_sub_category(pid):
  1089. """
  1090. """
  1091. qset = cm.BaikeCategory.objects.filter(parent_id=pid)
  1092. qdata = list(qset.values())
  1093. if qdata:
  1094. for subitem in qdata:
  1095. subitem["type"] = "ent"
  1096. subitem["label"] = subitem["name"]
  1097. subitem["children"] = get_sub_category(subitem["id"])
  1098. return qdata
  1099. def get_baike_category_tree(**kwargs):
  1100. parents = list(cm.BaikeCategory.objects.filter(parent_id__isnull=True).values())
  1101. for item in parents:
  1102. item["label"] = item["name"]
  1103. item["children"] = get_sub_category(item["id"])
  1104. return parents
  1105. def get_baike_list_by_category(**kwargs):
  1106. category_id = kwargs.get("category_id")
  1107. qset = cm.BaikeDetail.objects.filter(category_id=category_id)
  1108. data = list(qset.values("id","name"))
  1109. return data
  1110. def push_article(**kwargs):
  1111. _id = kwargs.get("id")
  1112. article = cm.Article.objects.filter(id=_id).first()
  1113. #发送app推送消息
  1114. title = u"顽主杯"
  1115. body = article.name
  1116. user_id = "ALL"
  1117. params = {"type":"article","id":_id}
  1118. aliyunpush.push_notice_by_userid(user_id,title,body,params,"ios")
  1119. aliyunpush.push_notice_by_userid(user_id,title,body,params,"android")
  1120. def spider_article(**kwargs):
  1121. data = startSpider(kwargs.get("url"))
  1122. return data
  1123. def import_article(**kwargs):
  1124. """
  1125. """
  1126. obj = cm.Article.objects.create(**kwargs)
  1127. def refund_out_trade_order(**kwargs):
  1128. """
  1129. """
  1130. _id = kwargs.get("id")
  1131. signup_order = cm.SignupOrder.objects.filter(id=_id).first()
  1132. if signup_order:
  1133. out_trade_no = signup_order.out_trade_no
  1134. transaction_id = signup_order.transaction_id
  1135. total_fee = signup_order.total_fee
  1136. amount = str(int(total_fee*100))
  1137. print(amount)
  1138. result = refund_order(transaction_id,out_trade_no,out_trade_no,amount)
  1139. if result.get("result_code") == "SUCCESS":
  1140. signup_order.order_status = -1
  1141. signup_order.save()
  1142. return "success"
  1143. else:
  1144. raise ce.TipException(result.get("err_code_des"))
  1145. else:
  1146. raise ce.TipException(u"该订单不存在退款失败!")
  1147. # 计算出入资金
  1148. def caculate_inout(**kwargs):
  1149. """
  1150. """
  1151. fundin = kwargs.get("in_fund")
  1152. fundout = kwargs.get("out_fund")
  1153. init_fund = kwargs.get("init_fund")
  1154. today_fund = kwargs.get("today_fund")
  1155. yesterday_fund = kwargs.get("yesterday_fund")
  1156. fundin = float(fundin) if fundin else 0.0
  1157. fundout = float(fundout) if fundout else 0.0
  1158. init_fund = float(init_fund) if init_fund else 0.0
  1159. today_fund = float(today_fund) if today_fund else 0.0
  1160. yesterday_fund = float(yesterday_fund) if yesterday_fund else 0.0
  1161. #入资金
  1162. if fundin > fundout:
  1163. fundin = fundin - fundout
  1164. today_income = round((today_fund-(yesterday_fund+fundin))/(float(yesterday_fund) + fundin),4)
  1165. yesterday_fund = yesterday_fund + fundin
  1166. total_income = round((today_fund-init_fund-fundin)/(init_fund+fundin),4)
  1167. init_fund = init_fund + fundin
  1168. #出资金
  1169. else:
  1170. fundout = fundout - fundin
  1171. today_income = round((today_fund-(yesterday_fund-fundout))/float(yesterday_fund),4)
  1172. yesterday_fund = round(today_fund/(1+today_income),4)
  1173. total_income = round((today_fund+fundout-init_fund)/init_fund,4)
  1174. init_fund = round(today_fund/(1+total_income),4)
  1175. today_income = "{}%".format(today_income*100)
  1176. total_income = "{}%".format(total_income*100)
  1177. yesterday_fund = round(yesterday_fund,4)
  1178. init_fund = round(init_fund,4)
  1179. return {"yesterday_fund":yesterday_fund,
  1180. "today_income":today_income,
  1181. "total_income":total_income,
  1182. "init_fund":init_fund}
  1183. def baike_detail_top(**kwargs):
  1184. """
  1185. """
  1186. _id = kwargs.get("id")
  1187. action = kwargs.get("action")
  1188. if action == "top":
  1189. cm.BaikeDetail.objects.filter(id=_id).update(istop=1)
  1190. else:
  1191. cm.BaikeDetail.objects.filter(id=_id).update(istop=0)
  1192. def download_top3_imgs(request):
  1193. """
  1194. """
  1195. kwargs = request.json
  1196. match_id = kwargs.get("match_id",0)
  1197. qset = cm.PlayerRecord.get_db_model(match_id).objects.all()
  1198. if kwargs.get("match_id"):
  1199. qset = qset.filter(match_id=kwargs.get("match_id"))
  1200. #if kwargs.get("groupId"):
  1201. # qset = qset.filter(match_group=kwargs.get("groupId"))
  1202. if kwargs.get("stock_date"):
  1203. qset = qset.filter(stock_date=kwargs.get("stock_date"))
  1204. group_ids = list(cm.MatchGroup.objects.filter(match_id=match_id).values_list("id",flat=True))
  1205. imgData = []
  1206. for group_id in group_ids:
  1207. data = list(qset.filter(match_group=group_id).order_by("group_rank").values())
  1208. for item in data[:3]:
  1209. today_stock_img = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
  1210. ilist = []
  1211. for img in today_stock_img:
  1212. nlist = img.split('?')
  1213. if len(nlist) > 0:
  1214. ilist.append(nlist[0])
  1215. match_group = item["match_group"]
  1216. match_group_name = cm.MatchGroup.objects.filter(id=match_group).first().name
  1217. group_rank = item["group_rank"]
  1218. username = item["username"]
  1219. imgName = u"%s-%s-%s" % (match_group_name,group_rank,username)
  1220. imgData.append({"imgName":imgName,"imgList":ilist})
  1221. #下载截图
  1222. zip_files = []
  1223. for imgInfo in imgData:
  1224. imgName = imgInfo["imgName"]
  1225. imgList = imgInfo["imgList"]
  1226. for i,url in enumerate(imgList):
  1227. tmpFile = "/tmp/%s-%s%s" % (imgName,i+1,os.path.splitext(url)[-1])
  1228. res = requests.get(url+'?x-oss-process=image/resize,w_800,m_lfit')
  1229. if res.status_code == 200:
  1230. with open(tmpFile,"wb+") as f:
  1231. f.write(res.content)
  1232. zip_files.append(tmpFile)
  1233. #生成zip文件
  1234. tmpzip = get_zipfile(zip_files)
  1235. return tmpzip
  1236. #return imgData
  1237. def update_stock_usernum(**kwargs):
  1238. """
  1239. """
  1240. stock_date = kwargs.get("stock_date")
  1241. month = "%s%s" % (stock_date.split("-")[0],stock_date.split("-")[1])
  1242. qset = cm.UserStock.get_db_model(month).objects.filter(stock_date=stock_date,fund__gt=0)
  1243. qset = qset.values("stock_id","stock_name").annotate(count=Count("stock_id"),total_fund=Sum("fund")).order_by("-count")
  1244. cm.Stock.objects.update(stock_date=None)
  1245. for q in qset:
  1246. stock_id = q["stock_id"]
  1247. count = q["count"]
  1248. cm.Stock.objects.filter(id=stock_id).update(user_num=count,stock_date=stock_date)
  1249. def get_stock_list(**kwargs):
  1250. """
  1251. """
  1252. name = kwargs.get("name")
  1253. stock_date = kwargs.get("stock_date")
  1254. qset = cm.Stock.objects.all()
  1255. if name:
  1256. qset = qset.filter(name__icontains=name)
  1257. if stock_date:
  1258. qset = qset.filter(stock_date=stock_date)
  1259. data = list(qset.order_by("-user_num").values())
  1260. page = int(kwargs.get("page",1))
  1261. page_size = int(kwargs.get("page_size",20))
  1262. if page and page_size:
  1263. total,data = ccf.get_page_list(data,page,page_size)
  1264. return total,data
  1265. else:
  1266. return len(data),data
  1267. def signup_forbid(**kwargs):
  1268. """
  1269. """
  1270. _id = kwargs.get("id")
  1271. forbid_status = 1-cm.UserInfo.objects.filter(id=_id).first().forbid_status
  1272. cm.UserInfo.objects.filter(id=_id).update(forbid_status=forbid_status)