ServiceDataController.py 40 KB

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