ServiceDataController.py 38 KB

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