ServiceDataController.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  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. device_count = order_qs.values('UID').distinct().order_by('UID').count()
  211. inversion_rate = round(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. }
  263. return response.json(0, res)
  264. except Exception as e:
  265. return response.json(500, repr(e))
  266. @classmethod
  267. def query_first_pay_order(cls, request_dict, response):
  268. """
  269. 查询首次付费订单数据
  270. @param request_dict:请求参数
  271. @request_dict startTime:开始时间
  272. @request_dict endTime:结束时间
  273. @request_dict timeUnit:时间单位
  274. @request_dict storeMealType:套餐类型
  275. @param response:响应对象
  276. @return:
  277. """
  278. start_time = request_dict.get('startTime', None)
  279. end_time = request_dict.get('endTime', None)
  280. time_unit = request_dict.get('timeUnit', None)
  281. store_meal_type = request_dict.get('storeMealType', None)
  282. if not all([start_time, end_time, time_unit, store_meal_type]):
  283. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  284. try:
  285. order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  286. addTime__lte=start_time).filter(
  287. ~Q(price='0.00') & ~Q(price='0'))
  288. uid_list = []
  289. for item in order_gte_start_time_qs:
  290. uid_list.append(item.UID)
  291. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  292. addTime__range=(start_time, end_time)).filter(~Q(price='0.00'),
  293. ~Q(UID__in=uid_list),
  294. ~Q(price='0'))
  295. count = order_qs.count()
  296. start_time = datetime.datetime.fromtimestamp(int(start_time))
  297. end_time = datetime.datetime.fromtimestamp(int(end_time))
  298. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  299. # 订单数量统计
  300. order_list = []
  301. for item in time_list:
  302. order_temp_qs = order_qs.filter(addTime__range=item)
  303. order_dict = {
  304. 'count': order_temp_qs.count(),
  305. 'startTime': item[0],
  306. 'endTime': item[1]
  307. }
  308. order_list.append(order_dict)
  309. # 区域订单统计
  310. region_list = []
  311. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  312. for item in region_qs:
  313. country_id = item['userID__region_country']
  314. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  315. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  316. rate = round(item['count'] / count * 100, 2)
  317. region_dict = {
  318. 'countryName': country_name,
  319. 'count': item['count'],
  320. 'rate': rate
  321. }
  322. region_list.append(region_dict)
  323. # 设备类型订单统计
  324. device_type_list = []
  325. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  326. uid_dict = {}
  327. for item in device_type_qs:
  328. device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  329. device_type = device_qs[0]['Type'] if device_qs.exists() else 0
  330. if device_type not in uid_dict:
  331. uid_dict[device_type] = []
  332. uid_dict[device_type].append(item['UID'])
  333. for k, v in uid_dict.items():
  334. type_name = DEVICE_TYPE.get(k, '未知类型')
  335. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  336. device_count = order_qs.filter(UID__in=v).count()
  337. type_rate = round(device_count / count * 100, 2)
  338. device_temp_qs = {
  339. 'typeName': type_name,
  340. 'count': device_count,
  341. 'typeRate': type_rate,
  342. }
  343. device_type_list.append(device_temp_qs)
  344. res = {
  345. 'orders': order_list,
  346. 'regions': region_list,
  347. 'deviceType': device_type_list,
  348. }
  349. return response.json(0, res)
  350. except Exception as e:
  351. return response.json(500, repr(e))
  352. @classmethod
  353. def query_repeat_pay_order(cls, request_dict, response):
  354. """
  355. 查询复购订单数据
  356. @param request_dict:请求参数
  357. @request_dict startTime:开始时间
  358. @request_dict endTime:结束时间
  359. @request_dict timeUnit:时间单位
  360. @request_dict storeMealType:套餐类型
  361. @param response:响应对象
  362. @return:
  363. """
  364. start_time = request_dict.get('startTime', None)
  365. end_time = request_dict.get('endTime', None)
  366. time_unit = request_dict.get('timeUnit', None)
  367. store_meal_type = request_dict.get('storeMealType', None)
  368. if not all([start_time, end_time, time_unit, store_meal_type]):
  369. return response.json(444, {'error param': 'startTime or endTime or timeUnit or storeMealType'})
  370. try:
  371. order_gte_start_time_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  372. addTime__lte=start_time).filter(
  373. ~Q(price='0.00') & ~Q(price='0'))
  374. uid_list = []
  375. for item in order_gte_start_time_qs:
  376. uid_list.append(item.UID)
  377. order_qs = Order_Model.objects.filter(order_type=store_meal_type, status=1,
  378. addTime__range=(start_time, end_time)).filter(
  379. ~Q(price='0.00'), ~Q(price='0'), Q(UID__in=uid_list))
  380. total = order_qs.count()
  381. # 订单复购率
  382. count = order_qs.count()
  383. repeat_rate = round(count / total * 100, 2)
  384. start_time = datetime.datetime.fromtimestamp(int(start_time))
  385. end_time = datetime.datetime.fromtimestamp(int(end_time))
  386. time_list = CommonService.cutting_time(start_time, end_time, time_unit)
  387. # 订单数量统计
  388. order_list = []
  389. for item in time_list:
  390. order_temp_qs = order_qs.filter(addTime__range=item)
  391. order_dict = {
  392. 'count': order_temp_qs.count(),
  393. 'startTime': item[0],
  394. 'endTime': item[1]
  395. }
  396. order_list.append(order_dict)
  397. # 区域订单统计
  398. region_list = []
  399. region_qs = order_qs.values('userID__region_country').annotate(count=Count('UID')).order_by('-count')
  400. for item in region_qs:
  401. country_id = item['userID__region_country']
  402. country_qs = CountryModel.objects.filter(id=country_id).values('country_name')
  403. country_name = country_qs[0]['country_name'] if country_qs.exists() else '未知区域'
  404. rate = round(item['count'] / count * 100, 2)
  405. region_dict = {
  406. 'countryName': country_name,
  407. 'count': item['count'],
  408. 'rate': rate
  409. }
  410. region_list.append(region_dict)
  411. # 设备类型订单统计
  412. device_type_list = []
  413. device_type_qs = order_qs.values('UID').annotate(count=Count('UID')).order_by('count')
  414. uid_dict = {}
  415. for item in device_type_qs:
  416. device_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  417. device_type = device_qs[0]['Type'] if device_qs.exists() else 0
  418. if device_type not in uid_dict:
  419. uid_dict[device_type] = []
  420. uid_dict[device_type].append(item['UID'])
  421. for k, v in uid_dict.items():
  422. type_name = DEVICE_TYPE.get(k, '未知类型')
  423. type_name = type_name if type_name != 'UNKOWN' else '未知类型'
  424. device_count = order_qs.filter(UID__in=v).count()
  425. type_rate = round(device_count / count * 100, 2)
  426. device_temp_qs = {
  427. 'typeName': type_name,
  428. 'count': device_count,
  429. 'typeRate': type_rate,
  430. }
  431. device_type_list.append(device_temp_qs)
  432. res = {
  433. 'orders': order_list,
  434. 'regions': region_list,
  435. 'deviceType': device_type_list,
  436. 'repeatRate': repeat_rate,
  437. 'repeatCount': count,
  438. 'orderCount': total
  439. }
  440. return response.json(0, res)
  441. except Exception as e:
  442. return response.json(500, repr(e))
  443. @classmethod
  444. def query_global_pay_order(cls, request, request_dict, response):
  445. """
  446. 查询全球付费订单数据
  447. @param request:请求
  448. @param request_dict:请求参数
  449. @param response:响应对象
  450. @return:
  451. """
  452. url_list = CommonService.get_domain_name()
  453. try:
  454. headers = {
  455. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  456. }
  457. order_list = []
  458. region_list = []
  459. region_count = 0
  460. device_type_list = []
  461. device_type_count = 0
  462. device_type_total = 0
  463. store_meal_list = []
  464. store_meal_count = 0
  465. for url in url_list:
  466. url = url + request.path.replace('global/', '')
  467. res = requests.get(url=url, params=request_dict, headers=headers)
  468. result = res.json()
  469. if result['result_code'] == 0:
  470. # 处理订单
  471. for item in result['result']['orders']:
  472. flag = 0
  473. for each in order_list:
  474. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  475. each['count'] += int(item['count'])
  476. flag = 1
  477. break
  478. if flag == 0:
  479. order_list.append(item)
  480. # 处理地区
  481. for item in result['result']['regions']:
  482. flag = 0
  483. for each in region_list:
  484. if each['countryName'] == item['countryName']:
  485. each['count'] += int(item['count'])
  486. region_count += int(item['count'])
  487. flag = 1
  488. break
  489. if flag == 0:
  490. region_list.append(item)
  491. region_count += int(item['count'])
  492. for item in region_list:
  493. rate = round(item['count'] / region_count * 100, 2)
  494. item['rate'] = rate
  495. # 处理设备类型
  496. for item in result['result']['deviceType']:
  497. flag = 0
  498. for each in device_type_list:
  499. if each['typeName'] == item['typeName']:
  500. each['count'] += int(item['count'])
  501. item['totalMoney'] += item['totalMoney']
  502. device_type_count += int(item['count'])
  503. device_type_total += item['totalMoney']
  504. flag = 1
  505. break
  506. if flag == 0:
  507. device_type_list.append(item)
  508. device_type_count += int(item['count'])
  509. device_type_total += item['totalMoney']
  510. for item in device_type_list:
  511. type_rate = round(item['count'] / device_type_count * 100, 2)
  512. total_rate = round(item['totalMoney'] / device_type_total * 100, 2)
  513. item['typeRate'] = type_rate
  514. item['totalRate'] = total_rate
  515. # 处理套餐
  516. for item in result['result']['storeMeal']:
  517. flag = 0
  518. for each in store_meal_list:
  519. if each['storeMealId'] == item['storeMealId']:
  520. each['count'] += int(item['count'])
  521. store_meal_count += int(item['count'])
  522. flag = 1
  523. break
  524. if flag == 0:
  525. store_meal_list.append(item)
  526. store_meal_count += int(item['count'])
  527. for item in store_meal_list:
  528. rate = round(item['count'] / store_meal_count * 100, 2)
  529. item['rate'] = rate
  530. else:
  531. return response.json(result['result_code'])
  532. res = {
  533. 'orders': order_list,
  534. 'regions': CommonService.list_sort(region_list),
  535. 'deviceType': CommonService.list_sort(device_type_list),
  536. 'storeMeal': CommonService.list_sort(store_meal_list)
  537. }
  538. return response.json(0, res)
  539. except Exception as e:
  540. return response.json(500, repr(e))
  541. @classmethod
  542. def query_global_free_order(cls, request, request_dict, response):
  543. """
  544. 查询全球免费订单数据
  545. @param request:请求
  546. @param request_dict:请求参数
  547. @param response:响应对象
  548. @return:
  549. """
  550. url_list = CommonService.get_domain_name()
  551. try:
  552. headers = {
  553. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  554. }
  555. order_list = []
  556. region_list = []
  557. region_count = 0
  558. device_type_list = []
  559. device_type_count = 0
  560. for url in url_list:
  561. url = url + request.path.replace('global/', '')
  562. res = requests.get(url=url, params=request_dict, headers=headers)
  563. result = res.json()
  564. if result['result_code'] == 0:
  565. # 处理订单
  566. for item in result['result']['orders']:
  567. flag = 0
  568. for each in order_list:
  569. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  570. each['count'] += int(item['count'])
  571. flag = 1
  572. break
  573. if flag == 0:
  574. order_list.append(item)
  575. # 处理地区
  576. for item in result['result']['regions']:
  577. flag = 0
  578. for each in region_list:
  579. if each['countryName'] == item['countryName']:
  580. each['count'] += int(item['count'])
  581. region_count += int(item['count'])
  582. flag = 1
  583. break
  584. if flag == 0:
  585. region_list.append(item)
  586. region_count += int(item['count'])
  587. for item in region_list:
  588. rate = round(item['count'] / region_count * 100, 2)
  589. item['rate'] = rate
  590. # 处理设备类型
  591. for item in result['result']['deviceType']:
  592. flag = 0
  593. for each in device_type_list:
  594. if each['typeName'] == item['typeName']:
  595. each['count'] += int(item['count'])
  596. device_type_count += int(item['count'])
  597. flag = 1
  598. break
  599. if flag == 0:
  600. device_type_list.append(item)
  601. device_type_count += int(item['count'])
  602. for item in device_type_list:
  603. type_rate = round(item['count'] / device_type_count * 100, 2)
  604. item['typeRate'] = type_rate
  605. else:
  606. return response.json(result['result_code'])
  607. res = {
  608. 'orders': order_list,
  609. 'regions': CommonService.list_sort(region_list),
  610. 'deviceType': CommonService.list_sort(device_type_list)
  611. }
  612. return response.json(0, res)
  613. except Exception as e:
  614. return response.json(500, repr(e))
  615. @classmethod
  616. def query_global_first_pay_order(cls, request, request_dict, response):
  617. """
  618. 查询全球首次付费订单数据
  619. @param request:请求
  620. @param request_dict:请求参数
  621. @param response:响应对象
  622. @return:
  623. """
  624. url_list = CommonService.get_domain_name()
  625. try:
  626. headers = {
  627. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  628. }
  629. order_list = []
  630. region_list = []
  631. region_count = 0
  632. device_type_list = []
  633. device_type_count = 0
  634. for url in url_list:
  635. url = url + request.path.replace('global/', '')
  636. res = requests.get(url=url, params=request_dict, headers=headers)
  637. result = res.json()
  638. if result['result_code'] == 0:
  639. # 处理订单
  640. for item in result['result']['orders']:
  641. flag = 0
  642. for each in order_list:
  643. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  644. each['count'] += int(item['count'])
  645. flag = 1
  646. break
  647. if flag == 0:
  648. order_list.append(item)
  649. # 处理地区
  650. for item in result['result']['regions']:
  651. flag = 0
  652. for each in region_list:
  653. if each['countryName'] == item['countryName']:
  654. each['count'] += int(item['count'])
  655. region_count += int(item['count'])
  656. flag = 1
  657. break
  658. if flag == 0:
  659. region_list.append(item)
  660. region_count += int(item['count'])
  661. for item in region_list:
  662. rate = round(item['count'] / region_count * 100, 2)
  663. item['rate'] = rate
  664. # 处理设备类型
  665. for item in result['result']['deviceType']:
  666. flag = 0
  667. for each in device_type_list:
  668. if each['typeName'] == item['typeName']:
  669. each['count'] += int(item['count'])
  670. device_type_count += int(item['count'])
  671. flag = 1
  672. break
  673. if flag == 0:
  674. device_type_list.append(item)
  675. device_type_count += int(item['count'])
  676. for item in device_type_list:
  677. type_rate = round(item['count'] / device_type_count * 100, 2)
  678. item['typeRate'] = type_rate
  679. else:
  680. return response.json(result['result_code'])
  681. res = {
  682. 'orders': order_list,
  683. 'regions': CommonService.list_sort(region_list),
  684. 'deviceType': CommonService.list_sort(device_type_list),
  685. }
  686. return response.json(0, res)
  687. except Exception as e:
  688. return response.json(500, repr(e))
  689. @classmethod
  690. def query_global_repeat_pay_order(cls, request, request_dict, response):
  691. """
  692. 查询全球复购订单数据
  693. @param request:请求
  694. @param request_dict:请求参数
  695. @param response:响应对象
  696. @return:
  697. """
  698. url_list = CommonService.get_domain_name()
  699. try:
  700. headers = {
  701. 'Authorization': request.META.get('HTTP_AUTHORIZATION')
  702. }
  703. order_list = []
  704. region_list = []
  705. region_count = 0
  706. device_type_list = []
  707. device_type_count = 0
  708. repeat_count = 0
  709. order_count = 0
  710. for url in url_list:
  711. url = url + request.path.replace('global/', '')
  712. res = requests.get(url=url, params=request_dict, headers=headers)
  713. result = res.json()
  714. if result['result_code'] == 0:
  715. # 处理订单
  716. for item in result['result']['orders']:
  717. flag = 0
  718. for each in order_list:
  719. if each['startTime'] == item['startTime'] and each['endTime'] == item['endTime']:
  720. each['count'] += int(item['count'])
  721. flag = 1
  722. break
  723. if flag == 0:
  724. order_list.append(item)
  725. # 处理地区
  726. for item in result['result']['regions']:
  727. flag = 0
  728. for each in region_list:
  729. if each['countryName'] == item['countryName']:
  730. each['count'] += int(item['count'])
  731. region_count += int(item['count'])
  732. flag = 1
  733. break
  734. if flag == 0:
  735. region_list.append(item)
  736. region_count += int(item['count'])
  737. for item in region_list:
  738. rate = round(item['count'] / region_count * 100, 2)
  739. item['rate'] = rate
  740. # 处理设备类型
  741. for item in result['result']['deviceType']:
  742. flag = 0
  743. for each in device_type_list:
  744. if each['typeName'] == item['typeName']:
  745. each['count'] += int(item['count'])
  746. device_type_count += int(item['count'])
  747. flag = 1
  748. break
  749. if flag == 0:
  750. device_type_list.append(item)
  751. device_type_count += int(item['count'])
  752. for item in device_type_list:
  753. type_rate = round(item['count'] / device_type_count * 100, 2)
  754. item['typeRate'] = type_rate
  755. # 处理订单复购率
  756. repeat_count += result['result']['repeatCount']
  757. order_count += result['result']['orderCount']
  758. else:
  759. return response.json(result['result_code'])
  760. repeat_rate = round(repeat_count / order_count * 100, 2)
  761. res = {
  762. 'orders': order_list,
  763. 'regions': CommonService.list_sort(region_list),
  764. 'deviceType': CommonService.list_sort(device_type_list),
  765. 'repeatRate': repeat_rate,
  766. 'repeatCount': repeat_count,
  767. 'orderCount': order_count
  768. }
  769. return response.json(0, res)
  770. except Exception as e:
  771. return response.json(500, repr(e))