ServiceDataController.py 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDataController.py
  4. @Time : 2022/8/16 10:44
  5. @Author : peng
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. from django.db.models import Q, Count, Sum
  10. from django.views.generic.base import View
  11. from Ansjer.config import DEVICE_TYPE
  12. import datetime
  13. import requests
  14. from Model.models import Order_Model, CountryModel, Device_Info, DeviceTypeModel, UidSetModel, UnicomCombo
  15. from Service.CommonService import CommonService
  16. # 服务数据
  17. class ServiceDataView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. return self.validation(request.GET, request, operation)
  22. def post(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.POST, request, operation)
  26. def validation(self, request_dict, request, operation):
  27. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  28. if token_code != 0:
  29. return response.json(token_code)
  30. if operation == 'payOrder': # 查询付费订单数据
  31. return self.query_pay_order(request_dict, response)
  32. elif operation == 'freeOrder': # 查询免费订单数据
  33. return self.query_free_order(request_dict, response)
  34. elif operation == 'firstPayOrder': # 查询首次付费订单数据
  35. return self.query_first_pay_order(request_dict, response)
  36. elif operation == 'repeatPayOrder': # 查询复购订单数据
  37. return self.query_repeat_pay_order(request_dict, response)
  38. elif operation == 'global/payOrder': # 查询全球付费订单数据
  39. return self.query_global_pay_order(request, request_dict, response)
  40. elif operation == 'global/freeOrder': # 查询全球免费订单数据
  41. return self.query_global_free_order(request, request_dict, response)
  42. elif operation == 'global/firstPayOrder': # 查询全球首次付费订单数据
  43. return self.query_global_first_pay_order(request, request_dict, response)
  44. elif operation == 'global/repeatPayOrder': # 查询全球复购订单数据
  45. return self.query_global_repeat_pay_order(request, request_dict, response)
  46. else:
  47. return response.json(414)
  48. @classmethod
  49. def query_pay_order(cls, request_dict, response):
  50. """
  51. 查询付费订单数据
  52. @param request_dict:请求参数
  53. @request_dict startTime:开始时间
  54. @request_dict endTime:结束时间
  55. @request_dict timeUnit:时间单位
  56. @request_dict storeMealType:套餐类型
  57. @param response:响应对象
  58. @return:
  59. """
  60. start_time = request_dict.get('startTime', None)
  61. end_time = request_dict.get('endTime', None)
  62. time_unit = request_dict.get('timeUnit', None)
  63. store_meal_type = request_dict.get('storeMealType', None)
  64. if not all([start_time, end_time, time_unit, store_meal_type]):
  65. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  66. try:
  67. store_meal_type = int(store_meal_type)
  68. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  69. addTime__range=(start_time, end_time)).filter(
  70. ~Q(price='0.00') & ~Q(price='0'))
  71. count = order_qs.count()
  72. total = order_qs.aggregate(total=Sum('price'))['total']
  73. start_time = datetime.datetime.fromtimestamp(int(start_time))
  74. end_time = datetime.datetime.fromtimestamp(int(end_time))
  75. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  76. # 订单数量统计
  77. order_list = []
  78. for item in time_list:
  79. order_temp_qs = order_qs.filter(addTime__range=item)
  80. order_dict = {
  81. 'count': order_temp_qs.count(),
  82. 'startTime': item[0],
  83. 'endTime': item[1]
  84. }
  85. order_list.append(order_dict)
  86. # 区域订单统计
  87. region_list = []
  88. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  89. for item in region_qs:
  90. country_id = item['userID__region_country']
  91. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  92. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  93. if count:
  94. rate = round(item['count'] / count * 100, 2)
  95. else:
  96. rate = 0
  97. region_dict = {
  98. 'countryName': country_name,
  99. 'count': item['count'],
  100. 'rate': rate
  101. }
  102. region_list.append(region_dict)
  103. # 设备类型订单统计
  104. device_type_list = []
  105. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  106. uid_list = []
  107. uid_type_dict = {}
  108. for item in device_type_qs:
  109. uid_list.append(item['UID'])
  110. device_temp_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  111. if device_temp_qs.exists():
  112. if device_temp_qs[0]['Type'] not in uid_type_dict:
  113. uid_type_dict[device_temp_qs[0]['Type']] = []
  114. uid_type_dict[device_temp_qs[0]['Type']].append(item['UID'])
  115. # device_qs = Device_Info.objects.filter(UID__in=uid_list).values('Type').annotate(
  116. # count=Count('Type', distinct=True)).order_by('-count')
  117. for k, v in uid_type_dict.items():
  118. type_name = DEVICE_TYPE.get(k, '未知类型')
  119. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  120. device_count = order_qs.filter(UID__in=v).count()
  121. if count:
  122. type_rate = round(device_count / count * 100, 2)
  123. else:
  124. type_rate = 0
  125. temp_total = order_qs.filter(UID__in=v).aggregate(total=Sum('price'))['total']
  126. if total:
  127. total_rate = round(temp_total / total * 100, 2)
  128. else:
  129. total_rate = 0
  130. device_temp_qs = {
  131. 'typeName': type_name,
  132. 'count': device_count,
  133. 'typeRate': type_rate,
  134. 'totalMoney': temp_total,
  135. 'totalRate': total_rate
  136. }
  137. device_type_list.append(device_temp_qs)
  138. # 套餐订单统计
  139. store_meal_list = []
  140. if store_meal_type == 0:
  141. store_meal_qs = order_qs.values('rank').annotate(count=Count('rank')).order_by('-count')
  142. elif store_meal_type == 1:
  143. store_meal_qs = order_qs.values('ai_rank').annotate(count=Count('ai_rank')).order_by('-count')
  144. else:
  145. store_meal_qs = order_qs.values('unify_combo_id').annotate(count=Count('unify_combo_id')).order_by(
  146. '-count')
  147. for item in store_meal_qs:
  148. if store_meal_type == 0:
  149. store_meal_id = item['rank']
  150. store_meal_content_qs = store_meal_qs.filter(rank=store_meal_id, rank__lang__lang='cn').values(
  151. 'rank__lang__content')
  152. store_meal_name = store_meal_content_qs[0][
  153. 'rank__lang__content'] if store_meal_content_qs.exists() else '未知套餐'
  154. elif store_meal_type == 1:
  155. store_meal_id = item['ai_rank']
  156. store_meal_content_qs = store_meal_qs.filter(ai_rank=store_meal_id,
  157. ai_rank__lang__lang='cn').values(
  158. 'ai_rank__lang__content')
  159. store_meal_name = store_meal_content_qs[0][
  160. 'ai_rank__lang__content'] if store_meal_content_qs.exists() else '未知套餐'
  161. else:
  162. store_meal_id = item['unify_combo_id']
  163. store_meal_content_qs = UnicomCombo.objects.filter(id=store_meal_id).values(
  164. 'combo_name')
  165. store_meal_name = store_meal_content_qs[0][
  166. 'combo_name'] if store_meal_content_qs.exists() else '未知套餐'
  167. if count:
  168. rate = round(item['count'] / count * 100, 2)
  169. else:
  170. rate = 0
  171. store_meal_dict = {
  172. 'storeMealId': store_meal_id,
  173. 'count': item['count'],
  174. 'storeMealName': store_meal_name,
  175. 'rate': rate
  176. }
  177. store_meal_list.append(store_meal_dict)
  178. res = {
  179. 'orders': order_list,
  180. 'regions': region_list,
  181. 'deviceType': device_type_list,
  182. 'storeMeal': store_meal_list,
  183. }
  184. return response.json(0, res)
  185. except Exception as e:
  186. return response.json(500, repr(e))
  187. @classmethod
  188. def query_free_order(cls, request_dict, response):
  189. """
  190. 查询免费订单数据
  191. @param request_dict:请求参数
  192. @request_dict startTime:开始时间
  193. @request_dict endTime:结束时间
  194. @request_dict timeUnit:时间单位
  195. @request_dict storeMealType:套餐类型
  196. @param response:响应对象
  197. @return:
  198. """
  199. start_time = request_dict.get('startTime', None)
  200. end_time = request_dict.get('endTime', None)
  201. time_unit = request_dict.get('timeUnit', None)
  202. store_meal_type = request_dict.get('storeMealType', None)
  203. if not all([start_time, end_time, time_unit, store_meal_type]):
  204. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  205. try:
  206. store_meal_type = int(store_meal_type)
  207. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  208. addTime__range=(start_time, end_time)).filter(
  209. Q(price='0.00') | Q(price='0'))
  210. count = order_qs.count()
  211. uidset_qs = UidSetModel.objects.filter(addTime__range=(start_time, end_time))
  212. start_time = datetime.datetime.fromtimestamp(int(start_time))
  213. end_time = datetime.datetime.fromtimestamp(int(end_time))
  214. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  215. # 转化率
  216. if store_meal_type == 0:
  217. uidset_count = uidset_qs.filter(is_vod=1).count()
  218. elif store_meal_type == 1:
  219. uidset_count = uidset_qs.filter(is_ai=1).count()
  220. else:
  221. uidset_count = uidset_qs.filter(mobile_4g=1).count()
  222. order_device_count = order_qs.values('UID').distinct().order_by('UID').count()
  223. if uidset_count:
  224. inversion_rate = round(order_device_count / uidset_count * 100, 2)
  225. else:
  226. inversion_rate = 0
  227. # 订单数量统计
  228. order_list = []
  229. for item in time_list:
  230. order_temp_qs = order_qs.filter(addTime__range=item)
  231. order_dict = {
  232. 'count': order_temp_qs.count(),
  233. 'startTime': item[0],
  234. 'endTime': item[1]
  235. }
  236. order_list.append(order_dict)
  237. # 区域订单统计
  238. region_list = []
  239. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  240. for item in region_qs:
  241. country_id = item['userID__region_country']
  242. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  243. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  244. if count:
  245. rate = round(item['count'] / count * 100, 2)
  246. else:
  247. rate = 0
  248. region_dict = {
  249. 'countryName': country_name,
  250. 'count': item['count'],
  251. 'rate': rate
  252. }
  253. region_list.append(region_dict)
  254. # 设备类型订单统计
  255. device_type_list = []
  256. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  257. uid_dict = {}
  258. for item in device_type_qs:
  259. device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  260. device_type = device_qs[0]['Type'] if device_qs.exists() else 0
  261. if device_type not in uid_dict:
  262. uid_dict[device_type] = []
  263. uid_dict[device_type].append(item['UID'])
  264. for k, v in uid_dict.items():
  265. type_name = DEVICE_TYPE.get(k, '未知类型')
  266. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  267. device_count = order_qs.filter(UID__in=v).count()
  268. if count:
  269. type_rate = round(device_count / count * 100, 2)
  270. else:
  271. type_rate = 0
  272. device_temp_qs = {
  273. 'typeName': type_name,
  274. 'count': device_count,
  275. 'typeRate': type_rate,
  276. }
  277. device_type_list.append(device_temp_qs)
  278. res = {
  279. 'orders': order_list,
  280. 'regions': region_list,
  281. 'deviceType': device_type_list,
  282. 'inversionRate': inversion_rate,
  283. 'newDeviceCount': uidset_count,
  284. 'orderDeviceCount': order_device_count
  285. }
  286. return response.json(0, res)
  287. except Exception as e:
  288. return response.json(500, repr(e))
  289. @classmethod
  290. def query_first_pay_order(cls, request_dict, response):
  291. """
  292. 查询首次付费订单数据
  293. @param request_dict:请求参数
  294. @request_dict startTime:开始时间
  295. @request_dict endTime:结束时间
  296. @request_dict timeUnit:时间单位
  297. @request_dict storeMealType:套餐类型
  298. @param response:响应对象
  299. @return:
  300. """
  301. start_time = request_dict.get('startTime', None)
  302. end_time = request_dict.get('endTime', None)
  303. time_unit = request_dict.get('timeUnit', None)
  304. store_meal_type = request_dict.get('storeMealType', None)
  305. if not all([start_time, end_time, time_unit, store_meal_type]):
  306. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  307. try:
  308. order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  309. addTime__lte=start_time).filter(
  310. ~Q(price='0.00') & ~Q(price='0'))
  311. uid_list = []
  312. for item in order_gte_start_time_qs:
  313. uid_list.append(item.UID)
  314. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  315. addTime__range=(start_time, end_time)).filter(~Q(price='0.00'),
  316. ~Q(UID__in=uid_list),
  317. ~Q(price='0'))
  318. count = order_qs.count()
  319. start_time = datetime.datetime.fromtimestamp(int(start_time))
  320. end_time = datetime.datetime.fromtimestamp(int(end_time))
  321. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  322. # 订单数量统计
  323. order_list = []
  324. for item in time_list:
  325. order_temp_qs = order_qs.filter(addTime__range=item)
  326. order_dict = {
  327. 'count': order_temp_qs.count(),
  328. 'startTime': item[0],
  329. 'endTime': item[1]
  330. }
  331. order_list.append(order_dict)
  332. # 区域订单统计
  333. region_list = []
  334. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  335. for item in region_qs:
  336. country_id = item['userID__region_country']
  337. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  338. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  339. if count:
  340. rate = round(item['count'] / count * 100, 2)
  341. else:
  342. rate = 0
  343. region_dict = {
  344. 'countryName': country_name,
  345. 'count': item['count'],
  346. 'rate': rate
  347. }
  348. region_list.append(region_dict)
  349. # 设备类型订单统计
  350. device_type_list = []
  351. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  352. uid_dict = {}
  353. for item in device_type_qs:
  354. device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  355. device_type = device_qs[0]['Type'] if device_qs.exists() else 0
  356. if device_type not in uid_dict:
  357. uid_dict[device_type] = []
  358. uid_dict[device_type].append(item['UID'])
  359. for k, v in uid_dict.items():
  360. type_name = DEVICE_TYPE.get(k, '未知类型')
  361. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  362. device_count = order_qs.filter(UID__in=v).count()
  363. if count:
  364. type_rate = round(device_count / count * 100, 2)
  365. else:
  366. type_rate = 0
  367. device_temp_qs = {
  368. 'typeName': type_name,
  369. 'count': device_count,
  370. 'typeRate': type_rate,
  371. }
  372. device_type_list.append(device_temp_qs)
  373. res = {
  374. 'orders': order_list,
  375. 'regions': region_list,
  376. 'deviceType': device_type_list,
  377. }
  378. return response.json(0, res)
  379. except Exception as e:
  380. return response.json(500, repr(e))
  381. @classmethod
  382. def query_repeat_pay_order(cls, request_dict, response):
  383. """
  384. 查询复购订单数据
  385. @param request_dict:请求参数
  386. @request_dict startTime:开始时间
  387. @request_dict endTime:结束时间
  388. @request_dict timeUnit:时间单位
  389. @request_dict storeMealType:套餐类型
  390. @param response:响应对象
  391. @return:
  392. """
  393. start_time = request_dict.get('startTime', None)
  394. end_time = request_dict.get('endTime', None)
  395. time_unit = request_dict.get('timeUnit', None)
  396. store_meal_type = request_dict.get('storeMealType', None)
  397. if not all([start_time, end_time, time_unit, store_meal_type]):
  398. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  399. try:
  400. order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  401. addTime__lte=start_time).filter(
  402. ~Q(price='0.00') & ~Q(price='0'))
  403. uid_list = []
  404. for item in order_gte_start_time_qs:
  405. uid_list.append(item.UID)
  406. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  407. addTime__range=(start_time, end_time)).filter(
  408. ~Q(price='0.00'), ~Q(price='0'), Q(UID__in=uid_list))
  409. total = order_gte_start_time_qs.count()
  410. # 订单复购率
  411. count = order_qs.count()
  412. if total:
  413. repeat_rate = round(count / total * 100, 2)
  414. else:
  415. repeat_rate = 0
  416. start_time = datetime.datetime.fromtimestamp(int(start_time))
  417. end_time = datetime.datetime.fromtimestamp(int(end_time))
  418. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  419. # 订单数量统计
  420. order_list = []
  421. for item in time_list:
  422. order_temp_qs = order_qs.filter(addTime__range=item)
  423. order_dict = {
  424. 'count': order_temp_qs.count(),
  425. 'startTime': item[0],
  426. 'endTime': item[1]
  427. }
  428. order_list.append(order_dict)
  429. # 区域订单统计
  430. region_list = []
  431. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  432. for item in region_qs:
  433. country_id = item['userID__region_country']
  434. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  435. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  436. if count:
  437. rate = round(item['count'] / count * 100, 2)
  438. else:
  439. rate = 0
  440. region_dict = {
  441. 'countryName': country_name,
  442. 'count': item['count'],
  443. 'rate': rate
  444. }
  445. region_list.append(region_dict)
  446. # 设备类型订单统计
  447. device_type_list = []
  448. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  449. uid_dict = {}
  450. for item in device_type_qs:
  451. device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  452. device_type = device_qs[0]['Type'] if device_qs.exists() else 0
  453. if device_type not in uid_dict:
  454. uid_dict[device_type] = []
  455. uid_dict[device_type].append(item['UID'])
  456. for k, v in uid_dict.items():
  457. type_name = DEVICE_TYPE.get(k, '未知类型')
  458. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  459. device_count = order_qs.filter(UID__in=v).count()
  460. if count:
  461. if count:
  462. type_rate = round(device_count / count * 100, 2)
  463. else:
  464. type_rate = 0
  465. else:
  466. type_rate = 0
  467. device_temp_qs = {
  468. 'typeName': type_name,
  469. 'count': device_count,
  470. 'typeRate': type_rate,
  471. }
  472. device_type_list.append(device_temp_qs)
  473. res = {
  474. 'orders': order_list,
  475. 'regions': region_list,
  476. 'deviceType': device_type_list,
  477. 'repeatRate': repeat_rate,
  478. 'repeatCount': count,
  479. 'orderCount': total
  480. }
  481. return response.json(0, res)
  482. except Exception as e:
  483. return response.json(500, repr(e))
  484. @classmethod
  485. def query_global_pay_order(cls, request, request_dict, response):
  486. """
  487. 查询全球付费订单数据
  488. @param request:请求
  489. @param request_dict:请求参数
  490. @param response:响应对象
  491. @return:
  492. """
  493. url_list = CommonService.get_domain_name()
  494. try:
  495. headers = {
  496. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  497. }
  498. order_list = []
  499. region_list = []
  500. region_count = 0
  501. device_type_list = []
  502. device_type_count = 0
  503. device_type_total = 0
  504. store_meal_list = []
  505. store_meal_count = 0
  506. for url in url_list:
  507. url = url + request.path.replace('global/', '')
  508. res = requests.get(url=url, params=request_dict, headers=headers)
  509. result = res.json()
  510. if result['result_code'] == 0:
  511. # 处理订单
  512. for item in result['result']['orders']:
  513. flag = 0
  514. for each in order_list:
  515. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  516. each['count'] += int(item['count'])
  517. flag = 1
  518. break
  519. if flag == 0:
  520. order_list.append(item)
  521. # 处理地区
  522. for item in result['result']['regions']:
  523. flag = 0
  524. for each in region_list:
  525. if each['countryName'] == item['countryName']:
  526. each['count'] += int(item['count'])
  527. region_count += int(item['count'])
  528. flag = 1
  529. break
  530. if flag == 0:
  531. region_list.append(item)
  532. region_count += int(item['count'])
  533. for item in region_list:
  534. if region_count:
  535. rate = round(item['count'] / region_count * 100, 2)
  536. else:
  537. rate = 0
  538. item['rate'] = rate
  539. # 处理设备类型
  540. for item in result['result']['deviceType']:
  541. flag = 0
  542. for each in device_type_list:
  543. if each['typeName'] == item['typeName']:
  544. each['count'] += int(item['count'])
  545. item['totalMoney'] += item['totalMoney']
  546. device_type_count += int(item['count'])
  547. device_type_total += item['totalMoney']
  548. flag = 1
  549. break
  550. if flag == 0:
  551. device_type_list.append(item)
  552. device_type_count += int(item['count'])
  553. device_type_total += item['totalMoney']
  554. for item in device_type_list:
  555. if device_type_count:
  556. type_rate = round(item['count'] / device_type_count * 100, 2)
  557. else:
  558. type_rate = 0
  559. if device_type_total:
  560. total_rate = round(item['totalMoney'] / device_type_total * 100, 2)
  561. else:
  562. total_rate = 0
  563. item['typeRate'] = type_rate
  564. item['totalRate'] = total_rate
  565. # 处理套餐
  566. for item in result['result']['storeMeal']:
  567. flag = 0
  568. for each in store_meal_list:
  569. if each['storeMealId'] == item['storeMealId']:
  570. each['count'] += int(item['count'])
  571. store_meal_count += int(item['count'])
  572. flag = 1
  573. break
  574. if flag == 0:
  575. store_meal_list.append(item)
  576. store_meal_count += int(item['count'])
  577. for item in store_meal_list:
  578. if store_meal_count:
  579. rate = round(item['count'] / store_meal_count * 100, 2)
  580. else:
  581. rate = 0
  582. item['rate'] = rate
  583. else:
  584. return response.json(result['result_code'])
  585. res = {
  586. 'orders': order_list,
  587. 'regions': CommonService.list_sort(region_list),
  588. 'deviceType': CommonService.list_sort(device_type_list),
  589. 'storeMeal': CommonService.list_sort(store_meal_list)
  590. }
  591. return response.json(0, res)
  592. except Exception as e:
  593. return response.json(500, repr(e))
  594. @classmethod
  595. def query_global_free_order(cls, request, request_dict, response):
  596. """
  597. 查询全球免费订单数据
  598. @param request:请求
  599. @param request_dict:请求参数
  600. @param response:响应对象
  601. @return:
  602. """
  603. url_list = CommonService.get_domain_name()
  604. try:
  605. headers = {
  606. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  607. }
  608. order_list = []
  609. region_list = []
  610. region_count = 0
  611. device_type_list = []
  612. device_type_count = 0
  613. new_device_count = 0
  614. order_device_count = 0
  615. for url in url_list:
  616. url = url + request.path.replace('global/', '')
  617. res = requests.get(url=url, params=request_dict, headers=headers)
  618. result = res.json()
  619. if result['result_code'] == 0:
  620. # 处理订单
  621. for item in result['result']['orders']:
  622. flag = 0
  623. for each in order_list:
  624. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  625. each['count'] += int(item['count'])
  626. flag = 1
  627. break
  628. if flag == 0:
  629. order_list.append(item)
  630. # 处理地区
  631. for item in result['result']['regions']:
  632. flag = 0
  633. for each in region_list:
  634. if each['countryName'] == item['countryName']:
  635. each['count'] += int(item['count'])
  636. region_count += int(item['count'])
  637. flag = 1
  638. break
  639. if flag == 0:
  640. region_list.append(item)
  641. region_count += int(item['count'])
  642. for item in region_list:
  643. if region_count:
  644. rate = round(item['count'] / region_count * 100, 2)
  645. else:
  646. rate = 0
  647. item['rate'] = rate
  648. # 处理设备类型
  649. for item in result['result']['deviceType']:
  650. flag = 0
  651. for each in device_type_list:
  652. if each['typeName'] == item['typeName']:
  653. each['count'] += int(item['count'])
  654. device_type_count += int(item['count'])
  655. flag = 1
  656. break
  657. if flag == 0:
  658. device_type_list.append(item)
  659. device_type_count += int(item['count'])
  660. for item in device_type_list:
  661. if device_type_count:
  662. type_rate = round(item['count'] / device_type_count * 100, 2)
  663. else:
  664. type_rate = 0
  665. item['typeRate'] = type_rate
  666. # 处理转化率
  667. new_device_count += int(result['result']['newDeviceCount'])
  668. order_device_count += int(result['result']['orderDeviceCount'])
  669. else:
  670. return response.json(result['result_code'])
  671. if new_device_count:
  672. inversion_rate = round(order_device_count / new_device_count * 100, 2)
  673. else:
  674. inversion_rate = 0
  675. res = {
  676. 'orders': order_list,
  677. 'regions': CommonService.list_sort(region_list),
  678. 'deviceType': CommonService.list_sort(device_type_list),
  679. 'newDeviceCount': new_device_count,
  680. 'orderDeviceCount': order_device_count,
  681. 'inversionRate': inversion_rate
  682. }
  683. return response.json(0, res)
  684. except Exception as e:
  685. return response.json(500, repr(e))
  686. @classmethod
  687. def query_global_first_pay_order(cls, request, request_dict, response):
  688. """
  689. 查询全球首次付费订单数据
  690. @param request:请求
  691. @param request_dict:请求参数
  692. @param response:响应对象
  693. @return:
  694. """
  695. url_list = CommonService.get_domain_name()
  696. try:
  697. headers = {
  698. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  699. }
  700. order_list = []
  701. region_list = []
  702. region_count = 0
  703. device_type_list = []
  704. device_type_count = 0
  705. for url in url_list:
  706. url = url + request.path.replace('global/', '')
  707. res = requests.get(url=url, params=request_dict, headers=headers)
  708. result = res.json()
  709. if result['result_code'] == 0:
  710. # 处理订单
  711. for item in result['result']['orders']:
  712. flag = 0
  713. for each in order_list:
  714. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  715. each['count'] += int(item['count'])
  716. flag = 1
  717. break
  718. if flag == 0:
  719. order_list.append(item)
  720. # 处理地区
  721. for item in result['result']['regions']:
  722. flag = 0
  723. for each in region_list:
  724. if each['countryName'] == item['countryName']:
  725. each['count'] += int(item['count'])
  726. region_count += int(item['count'])
  727. flag = 1
  728. break
  729. if flag == 0:
  730. region_list.append(item)
  731. region_count += int(item['count'])
  732. for item in region_list:
  733. if region_count:
  734. rate = round(item['count'] / region_count * 100, 2)
  735. else:
  736. rate = 0
  737. item['rate'] = rate
  738. # 处理设备类型
  739. for item in result['result']['deviceType']:
  740. flag = 0
  741. for each in device_type_list:
  742. if each['typeName'] == item['typeName']:
  743. each['count'] += int(item['count'])
  744. device_type_count += int(item['count'])
  745. flag = 1
  746. break
  747. if flag == 0:
  748. device_type_list.append(item)
  749. device_type_count += int(item['count'])
  750. for item in device_type_list:
  751. if device_type_count:
  752. type_rate = round(item['count'] / device_type_count * 100, 2)
  753. else:
  754. type_rate = 0
  755. item['typeRate'] = type_rate
  756. else:
  757. return response.json(result['result_code'])
  758. res = {
  759. 'orders': order_list,
  760. 'regions': CommonService.list_sort(region_list),
  761. 'deviceType': CommonService.list_sort(device_type_list),
  762. }
  763. return response.json(0, res)
  764. except Exception as e:
  765. return response.json(500, repr(e))
  766. @classmethod
  767. def query_global_repeat_pay_order(cls, request, request_dict, response):
  768. """
  769. 查询全球复购订单数据
  770. @param request:请求
  771. @param request_dict:请求参数
  772. @param response:响应对象
  773. @return:
  774. """
  775. url_list = CommonService.get_domain_name()
  776. try:
  777. headers = {
  778. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  779. }
  780. order_list = []
  781. region_list = []
  782. region_count = 0
  783. device_type_list = []
  784. device_type_count = 0
  785. repeat_count = 0
  786. order_count = 0
  787. for url in url_list:
  788. url = url + request.path.replace('global/', '')
  789. res = requests.get(url=url, params=request_dict, headers=headers)
  790. result = res.json()
  791. if result['result_code'] == 0:
  792. # 处理订单
  793. for item in result['result']['orders']:
  794. flag = 0
  795. for each in order_list:
  796. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  797. each['count'] += int(item['count'])
  798. flag = 1
  799. break
  800. if flag == 0:
  801. order_list.append(item)
  802. # 处理地区
  803. for item in result['result']['regions']:
  804. flag = 0
  805. for each in region_list:
  806. if each['countryName'] == item['countryName']:
  807. each['count'] += int(item['count'])
  808. region_count += int(item['count'])
  809. flag = 1
  810. break
  811. if flag == 0:
  812. region_list.append(item)
  813. region_count += int(item['count'])
  814. for item in region_list:
  815. if region_count:
  816. rate = round(item['count'] / region_count * 100, 2)
  817. else:
  818. rate = 0
  819. item['rate'] = rate
  820. # 处理设备类型
  821. for item in result['result']['deviceType']:
  822. flag = 0
  823. for each in device_type_list:
  824. if each['typeName'] == item['typeName']:
  825. each['count'] += int(item['count'])
  826. device_type_count += int(item['count'])
  827. flag = 1
  828. break
  829. if flag == 0:
  830. device_type_list.append(item)
  831. device_type_count += int(item['count'])
  832. for item in device_type_list:
  833. if device_type_count:
  834. type_rate = round(item['count'] / device_type_count * 100, 2)
  835. else:
  836. type_rate = 0
  837. item['typeRate'] = type_rate
  838. # 处理订单复购率
  839. repeat_count += result['result']['repeatCount']
  840. order_count += result['result']['orderCount']
  841. else:
  842. return response.json(result['result_code'])
  843. if order_count:
  844. repeat_rate = round(repeat_count / order_count * 100, 2)
  845. else:
  846. repeat_rate = 0
  847. res = {
  848. 'orders': order_list,
  849. 'regions': CommonService.list_sort(region_list),
  850. 'deviceType': CommonService.list_sort(device_type_list),
  851. 'repeatRate': repeat_rate,
  852. 'repeatCount': repeat_count,
  853. 'orderCount': order_count
  854. }
  855. return response.json(0, res)
  856. except Exception as e:
  857. return response.json(500, repr(e))