ServiceDataController.py 42 KB

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