ServiceDataController.py 36 KB

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