ServiceDataController.py 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  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, Sum
  10. from django.views.generic.base import View
  11. import datetime
  12. import requests
  13. from Model.models import OrdersSummary, DeviceInfoSummary
  14. from Service.CommonService import CommonService
  15. # 服务数据
  16. class ServiceDataView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.GET, request, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.POST, request, operation)
  25. def validation(self, request_dict, request, operation):
  26. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  27. if token_code != 0:
  28. return response.json(token_code)
  29. if operation == 'payOrder': # 查询付费订单数据
  30. return self.query_pay_order(request_dict, response)
  31. elif operation == 'freeOrder': # 查询免费订单数据
  32. return self.query_free_order(request_dict, response)
  33. elif operation == 'firstPayOrder': # 查询首次付费订单数据
  34. return self.query_first_pay_order(request_dict, response)
  35. elif operation == 'repeatPayOrder': # 查询复购订单数据
  36. return self.query_repeat_pay_order(request_dict, response)
  37. elif operation == 'global/payOrder': # 查询全球付费订单数据
  38. return self.query_global_pay_order(request, request_dict, response)
  39. elif operation == 'global/freeOrder': # 查询全球免费订单数据
  40. return self.query_global_free_order(request, request_dict, response)
  41. elif operation == 'global/firstPayOrder': # 查询全球首次付费订单数据
  42. return self.query_global_first_pay_order(request, request_dict, response)
  43. elif operation == 'global/repeatPayOrder': # 查询全球复购订单数据
  44. return self.query_global_repeat_pay_order(request, request_dict, response)
  45. else:
  46. return response.json(414)
  47. @classmethod
  48. def query_pay_order(cls, request_dict, response):
  49. """
  50. 查询付费订单数据
  51. @param request_dict:请求参数
  52. @request_dict startTime:开始时间
  53. @request_dict endTime:结束时间
  54. @request_dict timeUnit:时间单位
  55. @request_dict storeMealType:套餐类型
  56. @param response:响应对象
  57. @return:
  58. """
  59. start_time = request_dict.get('startTime', None)
  60. end_time = request_dict.get('endTime', None)
  61. time_unit = request_dict.get('timeUnit', None)
  62. store_meal_type = request_dict.get('storeMealType', None)
  63. if not all([start_time, end_time, time_unit, store_meal_type]):
  64. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  65. try:
  66. store_meal_type = int(store_meal_type)
  67. order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=0,
  68. service_type=store_meal_type).values('count', 'country', 'total',
  69. 'device_type', 'store_meal')
  70. all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
  71. Q(query_type=0) | Q(query_type=1)).aggregate(total=Sum('total'), count=Sum('count'))
  72. all_order_count = all_order_qs['count']
  73. all_order_total = all_order_qs['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(time__gte=item[0], time__lt=item[1])
  81. temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
  82. temp_count = temp_count if temp_count else 0
  83. order_dict = {
  84. 'count': temp_count,
  85. 'startTime': item[0],
  86. 'endTime': item[1]
  87. }
  88. order_list.append(order_dict)
  89. device_type_dict = {}
  90. country_dict = {}
  91. store_meal_dict = {}
  92. for each in order_qs:
  93. device_type_temp_dict = eval(each['device_type'])
  94. country_temp_dict = eval(each['country'])
  95. store_meal_temp_dict = eval(each['store_meal'])
  96. for k, v in device_type_temp_dict.items():
  97. if k in device_type_dict:
  98. device_type_dict[k]['数量'] += v['数量']
  99. device_type_dict[k]['销售额'] = str(round(float(device_type_dict[k]['销售额']) + float(v['销售额']), 2))
  100. else:
  101. device_type_dict[k] = v
  102. for k, v in country_temp_dict.items():
  103. if k in country_dict:
  104. country_dict[k] += v
  105. else:
  106. country_dict[k] = v
  107. for k, v in store_meal_temp_dict.items():
  108. if k in store_meal_dict:
  109. store_meal_dict[k]['数量'] += v['数量']
  110. store_meal_dict[k]['销售额'] = str(
  111. round(float(store_meal_dict[k]['销售额']) + float(v['销售额']), 2))
  112. else:
  113. store_meal_dict[k] = v
  114. # 设备类型订单统计
  115. device_type_list = []
  116. for k, v in device_type_dict.items():
  117. type_rate = round(v['数量'] / all_order_count * 100, 2) if all_order_count else 0
  118. total_rate = round(float(v['销售额']) / all_order_total * 100, 2) if all_order_total else 0
  119. device_temp_dict = {
  120. 'typeName': k,
  121. 'count': v['数量'],
  122. 'typeRate': type_rate,
  123. 'totalMoney': v['销售额'],
  124. 'totalRate': total_rate
  125. }
  126. device_type_list.append(device_temp_dict)
  127. # 区域订单统计
  128. region_list = []
  129. for k, v in country_dict.items():
  130. rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  131. region_temp_dict = {
  132. 'countryName': k,
  133. 'count': v,
  134. 'rate': rate
  135. }
  136. region_list.append(region_temp_dict)
  137. # 套餐订单统计
  138. store_meal_list = []
  139. for k, v in store_meal_dict.items():
  140. total_rate = round(float(v['销售额']) / all_order_total * 100, 2) if all_order_total else 0
  141. count_rate = round(v['数量'] / all_order_count * 100, 2) if all_order_count else 0
  142. store_temp_dict = {
  143. 'count': v['数量'],
  144. 'storeMealName': k,
  145. 'storeMealTotal': v['销售额'],
  146. 'totalRate': total_rate,
  147. 'rate': count_rate
  148. }
  149. store_meal_list.append(store_temp_dict)
  150. res = {
  151. 'orders': order_list,
  152. 'regions': region_list,
  153. 'deviceType': device_type_list,
  154. 'storeMeal': store_meal_list,
  155. 'allOrderCount': all_order_count,
  156. 'allOrderTotal': all_order_total
  157. }
  158. return response.json(0, res)
  159. except Exception as e:
  160. return response.json(500, repr(e))
  161. @classmethod
  162. def query_free_order(cls, request_dict, response):
  163. """
  164. 查询免费订单数据
  165. @param request_dict:请求参数
  166. @request_dict startTime:开始时间
  167. @request_dict endTime:结束时间
  168. @request_dict timeUnit:时间单位
  169. @request_dict storeMealType:套餐类型
  170. @param response:响应对象
  171. @return:
  172. """
  173. start_time = request_dict.get('startTime', None)
  174. end_time = request_dict.get('endTime', None)
  175. time_unit = request_dict.get('timeUnit', None)
  176. store_meal_type = request_dict.get('storeMealType', None)
  177. if not all([start_time, end_time, time_unit, store_meal_type]):
  178. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  179. try:
  180. store_meal_type = int(store_meal_type)
  181. order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=1,
  182. service_type=store_meal_type).values('count', 'country',
  183. 'device_type')
  184. free_order_count = order_qs.aggregate(count=Sum('count'))['count']
  185. free_order_count = free_order_count if free_order_count else 0 # 免费订单数量
  186. all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
  187. Q(query_type=0) | Q(query_type=1)).aggregate(count=Sum('count'))
  188. all_order_count = all_order_qs['count'] # 所有订单数量
  189. device_qs = DeviceInfoSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=0).values(
  190. 'vod_service', 'ai_service', 'unicom_service')
  191. new_device_count = 0 # 销售设备数量
  192. start_time = datetime.datetime.fromtimestamp(int(start_time))
  193. end_time = datetime.datetime.fromtimestamp(int(end_time))
  194. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  195. # 转化率
  196. for item in device_qs:
  197. if store_meal_type == 0:
  198. service = eval(item['vod_service'])
  199. elif store_meal_type == 1:
  200. service = eval(item['ai_service'])
  201. else:
  202. service = eval(item['unicom_service'])
  203. for each in service.values():
  204. new_device_count += each
  205. inversion_rate = round(free_order_count / new_device_count * 100, 2) if new_device_count else 0
  206. # 订单数量统计
  207. order_list = []
  208. for item in time_list:
  209. order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
  210. temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
  211. temp_count = temp_count if temp_count else 0
  212. order_dict = {
  213. 'count': temp_count,
  214. 'startTime': item[0],
  215. 'endTime': item[1]
  216. }
  217. order_list.append(order_dict)
  218. device_type_dict = {}
  219. country_dict = {}
  220. for each in order_qs:
  221. device_type_temp_dict = eval(each['device_type'])
  222. for k, v in device_type_temp_dict.items():
  223. if k in device_type_dict:
  224. device_type_dict[k] += v
  225. else:
  226. device_type_dict[k] = v
  227. country_temp_dict = eval(each['country'])
  228. for k, v in country_temp_dict.items():
  229. if k in country_dict:
  230. country_dict[k] += v
  231. else:
  232. country_dict[k] = v
  233. # 设备类型订单统计
  234. device_type_list = []
  235. for k, v in device_type_dict.items():
  236. type_rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  237. device_temp_qs = {
  238. 'typeName': k,
  239. 'count': v,
  240. 'typeRate': type_rate,
  241. }
  242. device_type_list.append(device_temp_qs)
  243. # 区域订单统计
  244. region_list = []
  245. for k, v in country_dict.items():
  246. rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  247. region_temp_dict = {
  248. 'countryName': k,
  249. 'count': v,
  250. 'rate': rate
  251. }
  252. region_list.append(region_temp_dict)
  253. res = {
  254. 'orders': order_list,
  255. 'regions': region_list,
  256. 'deviceType': device_type_list,
  257. 'inversionRate': inversion_rate,
  258. 'newDeviceCount': new_device_count,
  259. 'allOrderCount': all_order_count
  260. }
  261. return response.json(0, res)
  262. except Exception as e:
  263. return response.json(500, repr(e))
  264. @classmethod
  265. def query_first_pay_order(cls, request_dict, response):
  266. """
  267. 查询首次付费订单数据
  268. @param request_dict:请求参数
  269. @request_dict startTime:开始时间
  270. @request_dict endTime:结束时间
  271. @request_dict timeUnit:时间单位
  272. @request_dict storeMealType:套餐类型
  273. @param response:响应对象
  274. @return:
  275. """
  276. start_time = request_dict.get('startTime', None)
  277. end_time = request_dict.get('endTime', None)
  278. time_unit = request_dict.get('timeUnit', None)
  279. store_meal_type = request_dict.get('storeMealType', None)
  280. if not all([start_time, end_time, time_unit, store_meal_type]):
  281. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  282. try:
  283. order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=2,
  284. service_type=store_meal_type).values('count', 'country',
  285. 'device_type')
  286. all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
  287. Q(query_type=0) | Q(query_type=1)).aggregate(count=Sum('count'))
  288. all_order_count = all_order_qs['count'] # 所有订单数量
  289. start_time = datetime.datetime.fromtimestamp(int(start_time))
  290. end_time = datetime.datetime.fromtimestamp(int(end_time))
  291. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  292. # 订单数量统计
  293. order_list = []
  294. for item in time_list:
  295. order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
  296. temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
  297. temp_count = temp_count if temp_count else 0
  298. order_dict = {
  299. 'count': temp_count,
  300. 'startTime': item[0],
  301. 'endTime': item[1]
  302. }
  303. order_list.append(order_dict)
  304. country_dict = {}
  305. device_type_dict = {}
  306. for each in order_qs:
  307. country_temp_dict = eval(each['country'])
  308. device_type_temp_dict = eval(each['device_type'])
  309. for k, v in country_temp_dict.items():
  310. if k in country_dict:
  311. country_dict[k] += v
  312. else:
  313. country_dict[k] = v
  314. for k, v in device_type_temp_dict.items():
  315. if k in device_type_dict:
  316. device_type_dict[k] += v
  317. else:
  318. device_type_dict[k] = v
  319. # 设备类型订单统计
  320. device_type_list = []
  321. for k, v in device_type_dict.items():
  322. type_rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  323. device_temp_qs = {
  324. 'typeName': k,
  325. 'count': v,
  326. 'typeRate': type_rate,
  327. }
  328. device_type_list.append(device_temp_qs)
  329. # 区域订单统计
  330. region_list = []
  331. for k, v in country_dict.items():
  332. rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  333. region_temp_dict = {
  334. 'countryName': k,
  335. 'count': v,
  336. 'rate': rate
  337. }
  338. region_list.append(region_temp_dict)
  339. res = {
  340. 'orders': order_list,
  341. 'regions': region_list,
  342. 'deviceType': device_type_list,
  343. 'allOrderCount': all_order_count
  344. }
  345. return response.json(0, res)
  346. except Exception as e:
  347. return response.json(500, repr(e))
  348. @classmethod
  349. def query_repeat_pay_order(cls, request_dict, response):
  350. """
  351. 查询复购订单数据
  352. @param request_dict:请求参数
  353. @request_dict startTime:开始时间
  354. @request_dict endTime:结束时间
  355. @request_dict timeUnit:时间单位
  356. @request_dict storeMealType:套餐类型
  357. @param response:响应对象
  358. @return:
  359. """
  360. start_time = request_dict.get('startTime', None)
  361. end_time = request_dict.get('endTime', None)
  362. time_unit = request_dict.get('timeUnit', None)
  363. store_meal_type = request_dict.get('storeMealType', None)
  364. if not all([start_time, end_time, time_unit, store_meal_type]):
  365. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  366. try:
  367. order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time, query_type=3,
  368. service_type=store_meal_type).values('count', 'country',
  369. 'device_type')
  370. repeat_pay_order_count = order_qs.aggregate(count=Sum('count'))['count']
  371. repeat_pay_order_count = repeat_pay_order_count if repeat_pay_order_count else 0
  372. all_order_qs = OrdersSummary.objects.filter(time__gte=start_time, time__lt=end_time).filter(
  373. Q(query_type=0) | Q(query_type=1)).aggregate(count=Sum('count'))
  374. all_order_count = all_order_qs['count'] # 所有订单数量
  375. # 订单复购率
  376. repeat_rate = round(repeat_pay_order_count / all_order_count * 100, 2) if all_order_count else 0
  377. start_time = datetime.datetime.fromtimestamp(int(start_time))
  378. end_time = datetime.datetime.fromtimestamp(int(end_time))
  379. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  380. # 订单数量统计
  381. order_list = []
  382. for item in time_list:
  383. order_temp_qs = order_qs.filter(time__gte=item[0], time__lt=item[1])
  384. temp_count = order_temp_qs.aggregate(count=Sum('count'))['count']
  385. temp_count = temp_count if temp_count else 0
  386. order_dict = {
  387. 'count': temp_count,
  388. 'startTime': item[0],
  389. 'endTime': item[1]
  390. }
  391. order_list.append(order_dict)
  392. device_type_dict = {}
  393. country_dict = {}
  394. for each in order_qs:
  395. country_temp_dict = eval(each['country'])
  396. device_type_temp_dict = eval(each['device_type'])
  397. for k, v in country_temp_dict.items():
  398. if k in country_dict:
  399. country_dict[k] += v
  400. else:
  401. country_dict[k] = v
  402. for k, v in device_type_temp_dict.items():
  403. if k in device_type_dict:
  404. device_type_dict[k] += v
  405. else:
  406. device_type_dict[k] = v
  407. # 设备类型订单统计
  408. device_type_list = []
  409. for k, v in device_type_dict.items():
  410. type_rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  411. device_temp_qs = {
  412. 'typeName': k,
  413. 'count': v,
  414. 'typeRate': type_rate,
  415. }
  416. device_type_list.append(device_temp_qs)
  417. # 区域订单统计
  418. region_list = []
  419. for k, v in country_dict.items():
  420. rate = round(v / all_order_count * 100, 2) if all_order_count else 0
  421. region_temp_dict = {
  422. 'countryName': k,
  423. 'count': v,
  424. 'rate': rate
  425. }
  426. region_list.append(region_temp_dict)
  427. res = {
  428. 'orders': order_list,
  429. 'regions': region_list,
  430. 'deviceType': device_type_list,
  431. 'repeatRate': repeat_rate,
  432. 'repeatOrderCount': repeat_pay_order_count,
  433. 'allOrderCount': all_order_count
  434. }
  435. return response.json(0, res)
  436. except Exception as e:
  437. return response.json(500, repr(e))
  438. @classmethod
  439. def query_global_pay_order(cls, request, request_dict, response):
  440. """
  441. 查询全球付费订单数据
  442. @param request:请求
  443. @param request_dict:请求参数
  444. @param response:响应对象
  445. @return:
  446. """
  447. url_list = CommonService.get_domain_name()
  448. try:
  449. headers = {
  450. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  451. }
  452. order_list = []
  453. region_list = []
  454. device_type_list = []
  455. all_order_count = 0
  456. all_order_total = 0
  457. store_meal_list = []
  458. for url in url_list:
  459. url = url + request.path.replace('global/', '')
  460. res = requests.get(url=url, params=request_dict, headers=headers)
  461. result = res.json()
  462. if result['result_code'] == 0:
  463. # 处理订单
  464. for item in result['result']['orders']:
  465. flag = 0
  466. for each in order_list:
  467. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  468. each['count'] += int(item['count'])
  469. flag = 1
  470. break
  471. if flag == 0:
  472. order_list.append(item)
  473. # 处理地区
  474. for item in result['result']['regions']:
  475. flag = 0
  476. for each in region_list:
  477. if each['countryName'] == item['countryName']:
  478. each['count'] += int(item['count'])
  479. flag = 1
  480. break
  481. if flag == 0:
  482. region_list.append(item)
  483. # 处理设备类型
  484. for item in result['result']['deviceType']:
  485. flag = 0
  486. for each in device_type_list:
  487. if each['typeName'] == item['typeName']:
  488. each['count'] += int(item['count'])
  489. item['totalMoney'] += item['totalMoney']
  490. flag = 1
  491. break
  492. if flag == 0:
  493. device_type_list.append(item)
  494. # 处理套餐
  495. for item in result['result']['storeMeal']:
  496. flag = 0
  497. for each in store_meal_list:
  498. if each['storeMealName'] == item['storeMealName']:
  499. each['count'] += int(item['count'])
  500. each['storeMealTotal'] += item['storeMealTotal']
  501. flag = 1
  502. break
  503. if flag == 0:
  504. store_meal_list.append(item)
  505. all_order_total += result['result']['allOrderTotal']
  506. all_order_count += result['result']['allOrderCount']
  507. else:
  508. return response.json(result['result_code'], result['result'])
  509. for item in region_list:
  510. item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  511. for item in device_type_list:
  512. item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  513. item['totalRate'] = round(item['totalMoney'] / all_order_total * 100, 2) if all_order_total else 0
  514. for item in store_meal_list:
  515. item['totalRate'] = round(item['storeMealTotal'] / all_order_total * 100, 2) if all_order_total else 0
  516. item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  517. res = {
  518. 'orders': order_list,
  519. 'regions': CommonService.list_sort(region_list),
  520. 'deviceType': CommonService.list_sort(device_type_list),
  521. 'storeMeal': CommonService.list_sort(store_meal_list)
  522. }
  523. return response.json(0, res)
  524. except Exception as e:
  525. return response.json(500, repr(e))
  526. @classmethod
  527. def query_global_free_order(cls, request, request_dict, response):
  528. """
  529. 查询全球免费订单数据
  530. @param request:请求
  531. @param request_dict:请求参数
  532. @param response:响应对象
  533. @return:
  534. """
  535. url_list = CommonService.get_domain_name()
  536. try:
  537. headers = {
  538. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  539. }
  540. order_list = []
  541. region_list = []
  542. free_order_count = 0
  543. device_type_list = []
  544. new_device_count = 0
  545. all_order_count = 0
  546. for url in url_list:
  547. url = url + request.path.replace('global/', '')
  548. res = requests.get(url=url, params=request_dict, headers=headers)
  549. result = res.json()
  550. if result['result_code'] == 0:
  551. # 处理订单
  552. for item in result['result']['orders']:
  553. flag = 0
  554. for each in order_list:
  555. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  556. each['count'] += int(item['count'])
  557. flag = 1
  558. break
  559. if flag == 0:
  560. order_list.append(item)
  561. # 处理地区
  562. for item in result['result']['regions']:
  563. flag = 0
  564. for each in region_list:
  565. if each['countryName'] == item['countryName']:
  566. each['count'] += int(item['count'])
  567. free_order_count += int(item['count'])
  568. flag = 1
  569. break
  570. if flag == 0:
  571. region_list.append(item)
  572. free_order_count += int(item['count'])
  573. # 处理设备类型
  574. for item in result['result']['deviceType']:
  575. flag = 0
  576. for each in device_type_list:
  577. if each['typeName'] == item['typeName']:
  578. each['count'] += int(item['count'])
  579. flag = 1
  580. break
  581. if flag == 0:
  582. device_type_list.append(item)
  583. # 处理转化率
  584. new_device_count += int(result['result']['newDeviceCount'])
  585. all_order_count += int(result['result']['allOrderCount'])
  586. else:
  587. return response.json(result['result_code'], result['result'])
  588. inversion_rate = round(free_order_count / new_device_count * 100, 2) if new_device_count else 0
  589. for item in region_list:
  590. item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  591. for item in device_type_list:
  592. item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  593. res = {
  594. 'orders': order_list,
  595. 'regions': CommonService.list_sort(region_list),
  596. 'deviceType': CommonService.list_sort(device_type_list),
  597. 'newDeviceCount': new_device_count,
  598. 'allOrderCount': all_order_count,
  599. 'inversionRate': inversion_rate
  600. }
  601. return response.json(0, res)
  602. except Exception as e:
  603. return response.json(500, repr(e))
  604. @classmethod
  605. def query_global_first_pay_order(cls, request, request_dict, response):
  606. """
  607. 查询全球首次付费订单数据
  608. @param request:请求
  609. @param request_dict:请求参数
  610. @param response:响应对象
  611. @return:
  612. """
  613. url_list = CommonService.get_domain_name()
  614. try:
  615. headers = {
  616. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  617. }
  618. order_list = []
  619. region_list = []
  620. device_type_list = []
  621. all_order_count = 0
  622. for url in url_list:
  623. url = url + request.path.replace('global/', '')
  624. res = requests.get(url=url, params=request_dict, headers=headers)
  625. result = res.json()
  626. if result['result_code'] == 0:
  627. # 处理订单
  628. for item in result['result']['orders']:
  629. flag = 0
  630. for each in order_list:
  631. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  632. each['count'] += int(item['count'])
  633. flag = 1
  634. break
  635. if flag == 0:
  636. order_list.append(item)
  637. # 处理地区
  638. for item in result['result']['regions']:
  639. flag = 0
  640. for each in region_list:
  641. if each['countryName'] == item['countryName']:
  642. each['count'] += int(item['count'])
  643. flag = 1
  644. break
  645. if flag == 0:
  646. region_list.append(item)
  647. # 处理设备类型
  648. for item in result['result']['deviceType']:
  649. flag = 0
  650. for each in device_type_list:
  651. if each['typeName'] == item['typeName']:
  652. each['count'] += int(item['count'])
  653. flag = 1
  654. break
  655. if flag == 0:
  656. device_type_list.append(item)
  657. all_order_count += result['result']['allOrderCount']
  658. else:
  659. return response.json(result['result_code'], result['result'])
  660. for item in region_list:
  661. item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  662. for item in device_type_list:
  663. item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  664. res = {
  665. 'orders': order_list,
  666. 'regions': CommonService.list_sort(region_list),
  667. 'deviceType': CommonService.list_sort(device_type_list),
  668. }
  669. return response.json(0, res)
  670. except Exception as e:
  671. return response.json(500, repr(e))
  672. @classmethod
  673. def query_global_repeat_pay_order(cls, request, request_dict, response):
  674. """
  675. 查询全球复购订单数据
  676. @param request:请求
  677. @param request_dict:请求参数
  678. @param response:响应对象
  679. @return:
  680. """
  681. url_list = CommonService.get_domain_name()
  682. try:
  683. headers = {
  684. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  685. }
  686. order_list = []
  687. region_list = []
  688. repeat_order_count = 0
  689. device_type_list = []
  690. all_order_count = 0
  691. for url in url_list:
  692. url = url + request.path.replace('global/', '')
  693. res = requests.get(url=url, params=request_dict, headers=headers)
  694. result = res.json()
  695. if result['result_code'] == 0:
  696. # 处理订单
  697. for item in result['result']['orders']:
  698. flag = 0
  699. for each in order_list:
  700. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  701. each['count'] += int(item['count'])
  702. flag = 1
  703. break
  704. if flag == 0:
  705. order_list.append(item)
  706. # 处理地区
  707. for item in result['result']['regions']:
  708. flag = 0
  709. for each in region_list:
  710. if each['countryName'] == item['countryName']:
  711. each['count'] += int(item['count'])
  712. flag = 1
  713. break
  714. if flag == 0:
  715. region_list.append(item)
  716. # 处理设备类型
  717. for item in result['result']['deviceType']:
  718. flag = 0
  719. for each in device_type_list:
  720. if each['typeName'] == item['typeName']:
  721. each['count'] += int(item['count'])
  722. flag = 1
  723. break
  724. if flag == 0:
  725. device_type_list.append(item)
  726. # 处理订单复购率
  727. repeat_order_count += result['result']['repeatOrderCount']
  728. all_order_count += result['result']['allOrderCount']
  729. else:
  730. return response.json(result['result_code'], result['result'])
  731. repeat_rate = round(repeat_order_count / all_order_count * 100, 2) if all_order_count else 0
  732. for item in device_type_list:
  733. item['typeRate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  734. for item in region_list:
  735. item['rate'] = round(item['count'] / all_order_count * 100, 2) if all_order_count else 0
  736. res = {
  737. 'orders': order_list,
  738. 'regions': CommonService.list_sort(region_list),
  739. 'deviceType': CommonService.list_sort(device_type_list),
  740. 'repeatRate': repeat_rate,
  741. 'repeatOrderCount': repeat_order_count,
  742. 'allOrderCount': all_order_count
  743. }
  744. return response.json(0, res)
  745. except Exception as e:
  746. return response.json(500, repr(e))