ServiceDataController.py 36 KB

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