ServiceDataController.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  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
  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. @request_dict lang:套餐语言
  58. @param response:响应对象
  59. @return:
  60. """
  61. start_time = request_dict.get('startTime', None)
  62. end_time = request_dict.get('endTime', None)
  63. time_unit = request_dict.get('timeUnit', None)
  64. store_meal_type = request_dict.get('storeMealType', None)
  65. lang = request_dict.get('lang', 'cn')
  66. if not all([start_time, end_time, time_unit, store_meal_type]):
  67. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  68. try:
  69. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  70. addTime__range=(start_time, end_time)).filter(
  71. ~Q(price='0.00') & ~Q(price='0'))
  72. count = order_qs.count()
  73. total = order_qs.aggregate(total=Sum('price'))['total']
  74. start_time = datetime.datetime.fromtimestamp(int(start_time))
  75. end_time = datetime.datetime.fromtimestamp(int(end_time))
  76. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  77. # 订单数量统计
  78. order_list = []
  79. for item in time_list:
  80. order_temp_qs = order_qs.filter(addTime__range=item)
  81. if order_temp_qs.exists():
  82. order_dict = {
  83. 'count': order_temp_qs.count(),
  84. 'startTime': item[0],
  85. 'endTime': item[1]
  86. }
  87. order_list.append(order_dict)
  88. # 区域订单统计
  89. region_list = []
  90. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  91. for item in region_qs:
  92. country_id = item['userID__region_country']
  93. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  94. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  95. rate = round(item['count'] / count * 100, 2)
  96. region_dict = {
  97. 'countryName': country_name,
  98. 'count': item['count'],
  99. 'rate': rate
  100. }
  101. region_list.append(region_dict)
  102. # 设备类型订单统计
  103. device_type_list = []
  104. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  105. uid_list = []
  106. uid_type_dict = {}
  107. for item in device_type_qs:
  108. uid_list.append(item['UID'])
  109. device_temp_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  110. if device_temp_qs.exists():
  111. if device_temp_qs[0]['Type'] not in uid_type_dict:
  112. uid_type_dict[device_temp_qs[0]['Type']] = []
  113. uid_type_dict[device_temp_qs[0]['Type']].append(item['UID'])
  114. device_count = len(set(uid_list))
  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. type_rate = round(len(v) / device_count * 100, 2)
  121. temp_total = order_qs.filter(UID__in=v).aggregate(total=Sum('price'))['total']
  122. total_rate = round(temp_total / total * 100, 2)
  123. device_temp_qs = {
  124. 'typeName': type_name,
  125. 'count': len(v),
  126. 'typeRate': type_rate,
  127. 'totalMoney': temp_total,
  128. 'totalRate': total_rate
  129. }
  130. device_type_list.append(device_temp_qs)
  131. # 套餐订单统计
  132. store_meal_list = []
  133. store_meal_qs = order_qs.values('rank').annotate(count=Count('rank')).order_by('-count').filter(
  134. rank__lang__lang=lang).values('rank', 'count', 'rank__lang__content')
  135. for item in store_meal_qs:
  136. rate = round(item['count'] / count * 100, 2)
  137. store_meal_dict = {
  138. 'storeMealId': item['rank'],
  139. 'count': item['count'],
  140. 'storeMealName': item['rank__lang__content'],
  141. 'rate': rate
  142. }
  143. store_meal_list.append(store_meal_dict)
  144. res = {
  145. 'orders': order_list,
  146. 'regions': region_list,
  147. 'deviceType': device_type_list,
  148. 'storeMeal': store_meal_list,
  149. }
  150. return response.json(0, res)
  151. except Exception as e:
  152. return response.json(500, repr(e))
  153. @classmethod
  154. def query_free_order(cls, request_dict, response):
  155. """
  156. 查询免费订单数据
  157. @param request_dict:请求参数
  158. @request_dict startTime:开始时间
  159. @request_dict endTime:结束时间
  160. @request_dict timeUnit:时间单位
  161. @request_dict storeMealType:套餐类型
  162. @param response:响应对象
  163. @return:
  164. """
  165. start_time = request_dict.get('startTime', None)
  166. end_time = request_dict.get('endTime', None)
  167. time_unit = request_dict.get('timeUnit', None)
  168. store_meal_type = request_dict.get('storeMealType', None)
  169. if not all([start_time, end_time, time_unit, store_meal_type]):
  170. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  171. try:
  172. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  173. addTime__range=(start_time, end_time)).filter(
  174. Q(price='0.00') | Q(price='0'))
  175. count = order_qs.count()
  176. start_time = datetime.datetime.fromtimestamp(int(start_time))
  177. end_time = datetime.datetime.fromtimestamp(int(end_time))
  178. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  179. # 订单数量统计
  180. order_list = []
  181. for item in time_list:
  182. order_temp_qs = order_qs.filter(addTime__range=item)
  183. if order_temp_qs.exists():
  184. order_dict = {
  185. 'count': order_temp_qs.count(),
  186. 'startTime': item[0],
  187. 'endTime': item[1]
  188. }
  189. order_list.append(order_dict)
  190. # 区域订单统计
  191. region_list = []
  192. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  193. for item in region_qs:
  194. country_id = item['userID__region_country']
  195. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  196. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  197. rate = round(item['count'] / count * 100, 2)
  198. region_dict = {
  199. 'countryName': country_name,
  200. 'count': item['count'],
  201. 'rate': rate
  202. }
  203. region_list.append(region_dict)
  204. # 设备类型订单统计
  205. device_type_list = []
  206. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  207. uid_list = []
  208. for item in device_type_qs:
  209. uid_list.append(item['UID'])
  210. device_count = len(set(uid_list))
  211. device_qs = Device_Info.objects.filter(UID__in=uid_list).values('Type').annotate(
  212. count=Count('Type', distinct=True)).order_by('-count')
  213. for item in device_qs:
  214. type_name = DEVICE_TYPE.get(item['Type'], '未知类型')
  215. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  216. type_rate = round(item['count'] / device_count * 100, 2)
  217. device_temp_qs = {
  218. 'typeName': type_name,
  219. 'count': item['count'],
  220. 'typeRate': type_rate,
  221. }
  222. device_type_list.append(device_temp_qs)
  223. res = {
  224. 'orders': order_list,
  225. 'regions': region_list,
  226. 'deviceType': device_type_list,
  227. }
  228. return response.json(0, res)
  229. except Exception as e:
  230. return response.json(500, repr(e))
  231. @classmethod
  232. def query_first_pay_order(cls, request_dict, response):
  233. """
  234. 查询首次付费订单数据
  235. @param request_dict:请求参数
  236. @request_dict startTime:开始时间
  237. @request_dict endTime:结束时间
  238. @request_dict timeUnit:时间单位
  239. @request_dict storeMealType:套餐类型
  240. @param response:响应对象
  241. @return:
  242. """
  243. start_time = request_dict.get('startTime', None)
  244. end_time = request_dict.get('endTime', None)
  245. time_unit = request_dict.get('timeUnit', None)
  246. store_meal_type = request_dict.get('storeMealType', None)
  247. if not all([start_time, end_time, time_unit, store_meal_type]):
  248. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  249. try:
  250. order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  251. addTime__lte=start_time).filter(
  252. ~Q(price='0.00') & ~Q(price='0'))
  253. uid_list = []
  254. for item in order_gte_start_time_qs:
  255. uid_list.append(item.UID)
  256. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  257. addTime__range=(start_time, end_time)).filter(~Q(price='0.00'),
  258. ~Q(UID__in=uid_list))
  259. count = order_qs.count()
  260. start_time = datetime.datetime.fromtimestamp(int(start_time))
  261. end_time = datetime.datetime.fromtimestamp(int(end_time))
  262. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  263. # 订单数量统计
  264. order_list = []
  265. for item in time_list:
  266. order_temp_qs = order_qs.filter(addTime__range=item)
  267. if order_temp_qs.exists():
  268. order_dict = {
  269. 'count': order_temp_qs.count(),
  270. 'startTime': item[0],
  271. 'endTime': item[1]
  272. }
  273. order_list.append(order_dict)
  274. # 区域订单统计
  275. region_list = []
  276. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  277. for item in region_qs:
  278. country_id = item['userID__region_country']
  279. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  280. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  281. rate = round(item['count'] / count * 100, 2)
  282. region_dict = {
  283. 'countryName': country_name,
  284. 'count': item['count'],
  285. 'rate': rate
  286. }
  287. region_list.append(region_dict)
  288. # 设备类型订单统计
  289. device_type_list = []
  290. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  291. uid_list = []
  292. for item in device_type_qs:
  293. uid_list.append(item['UID'])
  294. device_count = len(set(uid_list))
  295. device_qs = Device_Info.objects.filter(UID__in=uid_list).values('Type').annotate(
  296. count=Count('Type', distinct=True)).order_by('-count')
  297. for item in device_qs:
  298. type_name = DEVICE_TYPE.get(item['Type'], '未知类型')
  299. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  300. type_rate = round(item['count'] / device_count * 100, 2)
  301. device_temp_qs = {
  302. 'typeName': type_name,
  303. 'count': item['count'],
  304. 'typeRate': type_rate,
  305. }
  306. device_type_list.append(device_temp_qs)
  307. res = {
  308. 'orders': order_list,
  309. 'regions': region_list,
  310. 'deviceType': device_type_list,
  311. }
  312. return response.json(0, res)
  313. except Exception as e:
  314. return response.json(500, repr(e))
  315. @classmethod
  316. def query_repeat_pay_order(cls, request_dict, response):
  317. """
  318. 查询复购订单数据
  319. @param request_dict:请求参数
  320. @request_dict startTime:开始时间
  321. @request_dict endTime:结束时间
  322. @request_dict timeUnit:时间单位
  323. @request_dict storeMealType:套餐类型
  324. @param response:响应对象
  325. @return:
  326. """
  327. start_time = request_dict.get('startTime', None)
  328. end_time = request_dict.get('endTime', None)
  329. time_unit = request_dict.get('timeUnit', None)
  330. store_meal_type = request_dict.get('storeMealType', None)
  331. if not all([start_time, end_time, time_unit, store_meal_type]):
  332. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  333. try:
  334. order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  335. addTime__lte=start_time).filter(
  336. ~Q(price='0.00') & ~Q(price='0'))
  337. uid_list = []
  338. for item in order_gte_start_time_qs:
  339. uid_list.append(item.UID)
  340. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  341. addTime__range=(start_time, end_time)).filter(
  342. ~Q(price='0.00') & ~Q(price='0'))
  343. total = order_qs.count()
  344. # 订单复购率
  345. order_qs = order_qs.filter(Q(UID__in=uid_list))
  346. count = order_qs.count()
  347. repeat_rate = round(count / total * 100, 2)
  348. start_time = datetime.datetime.fromtimestamp(int(start_time))
  349. end_time = datetime.datetime.fromtimestamp(int(end_time))
  350. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  351. # 订单数量统计
  352. order_list = []
  353. for item in time_list:
  354. order_temp_qs = order_qs.filter(addTime__range=item)
  355. if order_temp_qs.exists():
  356. order_dict = {
  357. 'count': order_temp_qs.count(),
  358. 'startTime': item[0],
  359. 'endTime': item[1]
  360. }
  361. order_list.append(order_dict)
  362. # 区域订单统计
  363. region_list = []
  364. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  365. for item in region_qs:
  366. country_id = item['userID__region_country']
  367. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  368. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  369. rate = round(item['count'] / count * 100, 2)
  370. region_dict = {
  371. 'countryName': country_name,
  372. 'count': item['count'],
  373. 'rate': rate
  374. }
  375. region_list.append(region_dict)
  376. # 设备类型订单统计
  377. device_type_list = []
  378. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  379. uid_list = []
  380. for item in device_type_qs:
  381. uid_list.append(item['UID'])
  382. device_count = len(set(uid_list))
  383. device_qs = Device_Info.objects.filter(UID__in=uid_list).values('Type').annotate(
  384. count=Count('Type', distinct=True)).order_by('-count')
  385. for item in device_qs:
  386. type_name = DEVICE_TYPE.get(item['Type'], '未知类型')
  387. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  388. type_rate = round(item['count'] / device_count * 100, 2)
  389. device_temp_qs = {
  390. 'typeName': type_name,
  391. 'count': item['count'],
  392. 'typeRate': type_rate,
  393. }
  394. device_type_list.append(device_temp_qs)
  395. res = {
  396. 'orders': order_list,
  397. 'regions': region_list,
  398. 'deviceType': device_type_list,
  399. 'repeatRate': repeat_rate,
  400. 'repeatCount': count,
  401. 'orderCount': total
  402. }
  403. return response.json(0, res)
  404. except Exception as e:
  405. return response.json(500, repr(e))
  406. @classmethod
  407. def query_global_pay_order(cls, request, request_dict, response):
  408. """
  409. 查询全球付费订单数据
  410. @param request:请求
  411. @param request_dict:请求参数
  412. @param response:响应对象
  413. @return:
  414. """
  415. url_list = CommonService.get_domain_name()
  416. try:
  417. headers = {
  418. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  419. }
  420. order_list = []
  421. region_list = []
  422. region_count = 0
  423. device_type_list = []
  424. device_type_count = 0
  425. device_type_total = 0
  426. store_meal_list = []
  427. store_meal_count = 0
  428. for url in url_list:
  429. url = url + request.path.replace('global/', '')
  430. res = requests.get(url=url, params=request_dict, headers=headers)
  431. result = res.json()
  432. if result['result_code'] == 0:
  433. # 处理订单
  434. for item in result['result']['orders']:
  435. flag = 0
  436. for each in order_list:
  437. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  438. each['count'] += int(item['count'])
  439. flag = 1
  440. break
  441. if flag == 0:
  442. order_list.append(item)
  443. # 处理地区
  444. for item in result['result']['regions']:
  445. flag = 0
  446. for each in region_list:
  447. if each['countryName'] == item['countryName']:
  448. each['count'] += int(item['count'])
  449. region_count += int(item['count'])
  450. flag = 1
  451. break
  452. if flag == 0:
  453. region_list.append(item)
  454. region_count += int(item['count'])
  455. for item in region_list:
  456. rate = round(item['count'] / region_count * 100, 2)
  457. item['rate'] = rate
  458. # 处理设备类型
  459. for item in result['result']['deviceType']:
  460. flag = 0
  461. for each in device_type_list:
  462. if each['typeName'] == item['typeName']:
  463. each['count'] += int(item['count'])
  464. item['totalMoney'] += item['totalMoney']
  465. device_type_count += int(item['count'])
  466. device_type_total += item['totalMoney']
  467. flag = 1
  468. break
  469. if flag == 0:
  470. device_type_list.append(item)
  471. device_type_count += int(item['count'])
  472. device_type_total += item['totalMoney']
  473. for item in device_type_list:
  474. type_rate = round(item['count'] / device_type_count * 100, 2)
  475. total_rate = round(item['totalMoney'] / device_type_total * 100, 2)
  476. item['typeRate'] = type_rate
  477. item['totalRate'] = total_rate
  478. # 处理套餐
  479. for item in result['result']['storeMeal']:
  480. flag = 0
  481. for each in store_meal_list:
  482. if each['storeMealId'] == item['storeMealId']:
  483. each['count'] += int(item['count'])
  484. store_meal_count += int(item['count'])
  485. flag = 1
  486. break
  487. if flag == 0:
  488. store_meal_list.append(item)
  489. store_meal_count += int(item['count'])
  490. for item in store_meal_list:
  491. rate = round(item['count'] / store_meal_count * 100, 2)
  492. item['rate'] = rate
  493. else:
  494. return response.json(result['result_code'])
  495. res = {
  496. 'orders': order_list,
  497. 'regions': CommonService.list_sort(region_list),
  498. 'deviceType': CommonService.list_sort(device_type_list),
  499. 'storeMeal': CommonService.list_sort(store_meal_list)
  500. }
  501. return response.json(0, res)
  502. except Exception as e:
  503. return response.json(500, repr(e))
  504. @classmethod
  505. def query_global_free_order(cls, request, request_dict, response):
  506. """
  507. 查询全球免费订单数据
  508. @param request:请求
  509. @param request_dict:请求参数
  510. @param response:响应对象
  511. @return:
  512. """
  513. url_list = CommonService.get_domain_name()
  514. try:
  515. headers = {
  516. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  517. }
  518. order_list = []
  519. region_list = []
  520. region_count = 0
  521. device_type_list = []
  522. device_type_count = 0
  523. for url in url_list:
  524. url = url + request.path.replace('global/', '')
  525. res = requests.get(url=url, params=request_dict, headers=headers)
  526. result = res.json()
  527. if result['result_code'] == 0:
  528. # 处理订单
  529. for item in result['result']['orders']:
  530. flag = 0
  531. for each in order_list:
  532. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  533. each['count'] += int(item['count'])
  534. flag = 1
  535. break
  536. if flag == 0:
  537. order_list.append(item)
  538. # 处理地区
  539. for item in result['result']['regions']:
  540. flag = 0
  541. for each in region_list:
  542. if each['countryName'] == item['countryName']:
  543. each['count'] += int(item['count'])
  544. region_count += int(item['count'])
  545. flag = 1
  546. break
  547. if flag == 0:
  548. region_list.append(item)
  549. region_count += int(item['count'])
  550. for item in region_list:
  551. rate = round(item['count'] / region_count * 100, 2)
  552. item['rate'] = rate
  553. # 处理设备类型
  554. for item in result['result']['deviceType']:
  555. flag = 0
  556. for each in device_type_list:
  557. if each['typeName'] == item['typeName']:
  558. each['count'] += int(item['count'])
  559. device_type_count += int(item['count'])
  560. flag = 1
  561. break
  562. if flag == 0:
  563. device_type_list.append(item)
  564. device_type_count += int(item['count'])
  565. for item in device_type_list:
  566. type_rate = round(item['count'] / device_type_count * 100, 2)
  567. item['typeRate'] = type_rate
  568. else:
  569. return response.json(result['result_code'])
  570. res = {
  571. 'orders': order_list,
  572. 'regions': CommonService.list_sort(region_list),
  573. 'deviceType': CommonService.list_sort(device_type_list)
  574. }
  575. return response.json(0, res)
  576. except Exception as e:
  577. return response.json(500, repr(e))
  578. @classmethod
  579. def query_global_first_pay_order(cls, request, request_dict, response):
  580. """
  581. 查询全球首次付费订单数据
  582. @param request:请求
  583. @param request_dict:请求参数
  584. @param response:响应对象
  585. @return:
  586. """
  587. url_list = CommonService.get_domain_name()
  588. try:
  589. headers = {
  590. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  591. }
  592. order_list = []
  593. region_list = []
  594. region_count = 0
  595. device_type_list = []
  596. device_type_count = 0
  597. for url in url_list:
  598. url = url + request.path.replace('global/', '')
  599. res = requests.get(url=url, params=request_dict, headers=headers)
  600. result = res.json()
  601. if result['result_code'] == 0:
  602. # 处理订单
  603. for item in result['result']['orders']:
  604. flag = 0
  605. for each in order_list:
  606. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  607. each['count'] += int(item['count'])
  608. flag = 1
  609. break
  610. if flag == 0:
  611. order_list.append(item)
  612. # 处理地区
  613. for item in result['result']['regions']:
  614. flag = 0
  615. for each in region_list:
  616. if each['countryName'] == item['countryName']:
  617. each['count'] += int(item['count'])
  618. region_count += int(item['count'])
  619. flag = 1
  620. break
  621. if flag == 0:
  622. region_list.append(item)
  623. region_count += int(item['count'])
  624. for item in region_list:
  625. rate = round(item['count'] / region_count * 100, 2)
  626. item['rate'] = rate
  627. # 处理设备类型
  628. for item in result['result']['deviceType']:
  629. flag = 0
  630. for each in device_type_list:
  631. if each['typeName'] == item['typeName']:
  632. each['count'] += int(item['count'])
  633. device_type_count += int(item['count'])
  634. flag = 1
  635. break
  636. if flag == 0:
  637. device_type_list.append(item)
  638. device_type_count += int(item['count'])
  639. for item in device_type_list:
  640. type_rate = round(item['count'] / device_type_count * 100, 2)
  641. item['typeRate'] = type_rate
  642. else:
  643. return response.json(result['result_code'])
  644. res = {
  645. 'orders': order_list,
  646. 'regions': CommonService.list_sort(region_list),
  647. 'deviceType': CommonService.list_sort(device_type_list),
  648. }
  649. return response.json(0, res)
  650. except Exception as e:
  651. return response.json(500, repr(e))
  652. @classmethod
  653. def query_global_repeat_pay_order(cls, request, request_dict, response):
  654. """
  655. 查询全球复购订单数据
  656. @param request:请求
  657. @param request_dict:请求参数
  658. @param response:响应对象
  659. @return:
  660. """
  661. url_list = CommonService.get_domain_name()
  662. try:
  663. headers = {
  664. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  665. }
  666. order_list = []
  667. region_list = []
  668. region_count = 0
  669. device_type_list = []
  670. device_type_count = 0
  671. repeat_count = 0
  672. order_count = 0
  673. for url in url_list:
  674. url = url + request.path.replace('global/', '')
  675. res = requests.get(url=url, params=request_dict, headers=headers)
  676. result = res.json()
  677. if result['result_code'] == 0:
  678. # 处理订单
  679. for item in result['result']['orders']:
  680. flag = 0
  681. for each in order_list:
  682. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  683. each['count'] += int(item['count'])
  684. flag = 1
  685. break
  686. if flag == 0:
  687. order_list.append(item)
  688. # 处理地区
  689. for item in result['result']['regions']:
  690. flag = 0
  691. for each in region_list:
  692. if each['countryName'] == item['countryName']:
  693. each['count'] += int(item['count'])
  694. region_count += int(item['count'])
  695. flag = 1
  696. break
  697. if flag == 0:
  698. region_list.append(item)
  699. region_count += int(item['count'])
  700. for item in region_list:
  701. rate = round(item['count'] / region_count * 100, 2)
  702. item['rate'] = rate
  703. # 处理设备类型
  704. for item in result['result']['deviceType']:
  705. flag = 0
  706. for each in device_type_list:
  707. if each['typeName'] == item['typeName']:
  708. each['count'] += int(item['count'])
  709. device_type_count += int(item['count'])
  710. flag = 1
  711. break
  712. if flag == 0:
  713. device_type_list.append(item)
  714. device_type_count += int(item['count'])
  715. for item in device_type_list:
  716. type_rate = round(item['count'] / device_type_count * 100, 2)
  717. item['typeRate'] = type_rate
  718. # 处理订单复购率
  719. repeat_count += result['result']['repeatCount']
  720. order_count += result['result']['orderCount']
  721. else:
  722. return response.json(result['result_code'])
  723. repeat_rate = round(repeat_count / order_count * 100, 2)
  724. res = {
  725. 'orders': order_list,
  726. 'regions': CommonService.list_sort(region_list),
  727. 'deviceType': CommonService.list_sort(device_type_list),
  728. 'repeatRate': repeat_rate,
  729. 'repeatCount': repeat_count,
  730. 'orderCount': order_count
  731. }
  732. return response.json(0, res)
  733. except Exception as e:
  734. return response.json(500, repr(e))