ServiceDataController.py 48 KB

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