CronTaskController.py 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. #!/usr/bin/python3.6
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Copyright (C) 2022 #
  5. # @Time : 2022/4/1 11:27
  6. # @Author : ming
  7. # @Email : zhangdongming@asj6.wecom.work
  8. # @File : CronTaskController.py
  9. # @Software: PyCharm
  10. import datetime
  11. import time
  12. from django.db import connection, connections, transaction
  13. from django.db.models import Q, Sum, Count
  14. from django.views import View
  15. from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
  16. VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
  17. CountryModel, DeviceTypeModel, Lang, UnicomCombo, OrdersSummary, DeviceInfoSummary
  18. from Object.ResponseObject import ResponseObject
  19. from Object.utils import LocalDateTimeUtil
  20. from Service.CommonService import CommonService
  21. class CronDelDataView(View):
  22. def get(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.GET, request, operation)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.POST, request, operation)
  30. def validation(self, request_dict, request, operation):
  31. response = ResponseObject()
  32. if operation == 'delAccessLog': # 定时删除访问接口数据
  33. return self.delAccessLog(response)
  34. elif operation == 'delPushInfo': # 定时删除推送数据
  35. return self.delPushInfo(response)
  36. elif operation == 'delVodHls': # 定时删除云存播放列表
  37. return self.delVodHls(response)
  38. elif operation == 'delCloudLog': # 定时删除云存接口数据
  39. return self.delCloudLog(response)
  40. elif operation == 'delTesterDevice': # 定时删除测试账号下的设备数据
  41. return self.delTesterDevice(response)
  42. else:
  43. return response.json(404)
  44. @staticmethod
  45. def delAccessLog(response):
  46. try:
  47. cursor = connection.cursor()
  48. # 删除7天前的数据
  49. last_week = LocalDateTimeUtil.get_last_week()
  50. sql = 'DELETE FROM access_log WHERE time < %s limit %s'
  51. cursor.execute(sql, [last_week, 10000])
  52. # 关闭游标
  53. cursor.close()
  54. connection.close()
  55. return response.json(0)
  56. except Exception as e:
  57. return response.json(500, repr(e))
  58. @staticmethod
  59. def delPushInfo(response):
  60. now_time = int(time.time())
  61. cursor = connections['mysql02'].cursor()
  62. try:
  63. # 当前时间转日期
  64. local_date_now = str(datetime.datetime.fromtimestamp(int(now_time)).date())
  65. # 根据日期获取周几
  66. week_val = LocalDateTimeUtil.date_to_week(local_date_now)
  67. # 根据当前时间获取7天前时间戳
  68. expiration_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
  69. # 每次删除条数
  70. size = 10000
  71. # 删除7天前的数据
  72. sql = "DELETE FROM equipment_info WHERE addTime<= %s LIMIT %s "
  73. for i in range(6):
  74. cursor.execute(sql, [expiration_time, size])
  75. if week_val == 1:
  76. sql = "DELETE FROM equipment_info_sunday WHERE add_time<= %s LIMIT %s "
  77. if week_val == 2:
  78. sql = "DELETE FROM equipment_info_monday WHERE add_time<= %s LIMIT %s "
  79. if week_val == 3:
  80. sql = "DELETE FROM equipment_info_tuesday WHERE add_time<= %s LIMIT %s "
  81. if week_val == 4:
  82. sql = "DELETE FROM equipment_info_wednesday WHERE add_time<= %s LIMIT %s "
  83. if week_val == 5:
  84. sql = "DELETE FROM equipment_info_thursday WHERE add_time<= %s LIMIT %s "
  85. if week_val == 6:
  86. sql = "DELETE FROM equipment_info_friday WHERE add_time<= %s LIMIT %s "
  87. if week_val == 7:
  88. sql = "DELETE FROM equipment_info_saturday WHERE add_time<= %s LIMIT %s "
  89. for i in range(5):
  90. cursor.execute(sql, [expiration_time, size])
  91. # 关闭游标
  92. cursor.close()
  93. return response.json(0)
  94. except Exception as e:
  95. return response.json(500, repr(e))
  96. @staticmethod
  97. def delVodHls(response):
  98. nowTime = int(time.time())
  99. try:
  100. with transaction.atomic():
  101. month_ago_time = nowTime - 30 * 24 * 60 * 60 # 删除1个月前的数据
  102. vod_hls_qs = VodHlsModel.objects.filter(endTime__lte=month_ago_time)
  103. for vod_hls in vod_hls_qs:
  104. end_time = vod_hls.endTime
  105. end_time_str = datetime.datetime.fromtimestamp(int(end_time))
  106. this_month_start = datetime.datetime(end_time_str.year, end_time_str.month, 1)
  107. this_month_start_stamp = CommonService.str_to_timestamp(
  108. this_month_start.strftime('%Y-%m-%d %H:%M:%S'))
  109. vod_hls_summary_qs = VodHlsSummary.objects.filter(time=this_month_start_stamp,
  110. uid=vod_hls.uid)
  111. if vod_hls_summary_qs.exists():
  112. vod_hls_summary = vod_hls_summary_qs.first()
  113. vod_hls_summary.upload_duration = vod_hls_summary.upload_duration + vod_hls.sec
  114. vod_hls_summary.upload_frequency = vod_hls_summary.upload_frequency + 1
  115. vod_hls_summary.save()
  116. else:
  117. VodHlsSummary.objects.create(time=this_month_start_stamp, uid=vod_hls.uid,
  118. upload_duration=vod_hls.sec, upload_frequency=1)
  119. vod_hls.delete()
  120. return response.json(0)
  121. except Exception as e:
  122. return response.json(500, repr(e))
  123. @staticmethod
  124. def delCloudLog(response):
  125. nowTime = int(time.time())
  126. cursor = connection.cursor()
  127. try:
  128. # 删除3个月前的数据
  129. sql = "DELETE FROM `cloud_log` WHERE time<={} LIMIT 50000".format(
  130. nowTime - 3 * 30 * 24 * 60 * 60)
  131. cursor.execute(sql)
  132. # 关闭游标
  133. cursor.close()
  134. return response.json(0)
  135. except Exception as e:
  136. return response.json(500, repr(e))
  137. @staticmethod
  138. def delTesterDevice(response):
  139. try:
  140. userID_list = [
  141. 'tech01@ansjer.com',
  142. 'tech02@ansjer.com',
  143. 'tech03@ansjer.com',
  144. 'tech04@ansjer.com',
  145. 'tech05@ansjer.com',
  146. 'tech06@ansjer.com',
  147. 'tech07@ansjer.com',
  148. 'tech08@ansjer.com',
  149. 'tech09@ansjer.com',
  150. 'tech10@ansjer.com',
  151. 'fix01@ansjer.com',
  152. 'fix02@ansjer.com',
  153. 'fix03@ansjer.com',
  154. 'fix04@ansjer.com',
  155. 'fix05@ansjer.com']
  156. device_user = Device_User.objects.filter(username__in=userID_list)
  157. device_info_qs = Device_Info.objects.filter(
  158. userID__in=device_user).values('UID')
  159. uid_list = []
  160. for device_info in device_info_qs:
  161. uid_list.append(device_info['UID'])
  162. with transaction.atomic():
  163. # 删除设备云存相关数据
  164. UidSetModel.objects.filter(uid__in=uid_list).delete()
  165. UID_Bucket.objects.filter(uid__in=uid_list).delete()
  166. Unused_Uid_Meal.objects.filter(uid__in=uid_list).delete()
  167. Order_Model.objects.filter(UID__in=uid_list).delete()
  168. StsCrdModel.objects.filter(uid__in=uid_list).delete()
  169. VodHlsModel.objects.filter(uid__in=uid_list).delete()
  170. ExperienceContextModel.objects.filter(
  171. uid__in=uid_list).delete()
  172. Device_Info.objects.filter(userID__in=device_user).delete()
  173. return response.json(0)
  174. except Exception as e:
  175. return response.json(500, repr(e))
  176. class CronUpdateDataView(View):
  177. def get(self, request, *args, **kwargs):
  178. request.encoding = 'utf-8'
  179. operation = kwargs.get('operation')
  180. return self.validation(request.GET, request, operation)
  181. def post(self, request, *args, **kwargs):
  182. request.encoding = 'utf-8'
  183. operation = kwargs.get('operation')
  184. return self.validation(request.POST, request, operation)
  185. def validation(self, request_dict, request, operation):
  186. response = ResponseObject()
  187. if operation == 'updateUnusedUidBucket': # 定时更新过期云存关联的未使用套餐状态
  188. return self.updateUnusedUidBucket(response)
  189. elif operation == 'updateUnusedAiService': # 定时更新过期ai关联的未使用套餐状态
  190. return self.updateUnusedAiService(response)
  191. else:
  192. return response.json(404)
  193. @staticmethod
  194. def updateUnusedUidBucket(response):
  195. """
  196. 监控云存套餐过期修改状态
  197. @param response:
  198. @return:
  199. """
  200. # 定时更新已过期套餐修改状态为2
  201. now_time = int(time.time())
  202. expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
  203. expired_uid_bucket = expired_uid_bucket.filter(~Q(use_status=2)).values('id')
  204. if expired_uid_bucket.exists():
  205. expired_uid_bucket.update(use_status=2)
  206. # 监控有未使用套餐则自动生效
  207. expired_uid_buckets = \
  208. UID_Bucket.objects.filter(endTime__lte=now_time, has_unused=1).values("id", "uid")[0:1000]
  209. for expired_uid_bucket in expired_uid_buckets:
  210. unuseds = Unused_Uid_Meal.objects.filter(
  211. uid=expired_uid_bucket['uid']).values(
  212. "id",
  213. "uid",
  214. "channel",
  215. "addTime",
  216. "expire",
  217. "num",
  218. "bucket_id").order_by('addTime')[0:1]
  219. if not unuseds.exists():
  220. continue
  221. unused = unuseds[0]
  222. try:
  223. with transaction.atomic():
  224. count_unused = Unused_Uid_Meal.objects.filter(
  225. uid=expired_uid_bucket['uid']).count()
  226. has_unused = 1 if count_unused > 1 else 0
  227. endTime = CommonService.calcMonthLater(
  228. unused['expire'] * unused['num'])
  229. UID_Bucket.objects.filter(
  230. uid=expired_uid_bucket['uid']).update(
  231. channel=unused['channel'],
  232. endTime=endTime,
  233. bucket_id=unused['bucket_id'],
  234. updateTime=now_time,
  235. use_status=1,
  236. has_unused=has_unused)
  237. Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
  238. StsCrdModel.objects.filter(
  239. uid=expired_uid_bucket['uid']).delete() # 删除sts记录
  240. except Exception as e:
  241. print(repr(e))
  242. continue
  243. return response.json(0)
  244. @staticmethod
  245. def updateUnusedAiService(response):
  246. now_time = int(time.time())
  247. ai_service_qs = AiService.objects.filter(
  248. endTime__lte=now_time,
  249. use_status=1).values(
  250. 'id',
  251. 'uid')[
  252. 0:200]
  253. for ai_service in ai_service_qs:
  254. try:
  255. with transaction.atomic():
  256. AiService.objects.filter(
  257. id=ai_service['id']).update(
  258. use_status=2) # 更新过期ai订单状态
  259. # 如果存在未使用套餐,更新为使用
  260. unused_ai_service = AiService.objects.filter(
  261. uid=ai_service['uid'],
  262. use_status=0).order_by('addTime')[
  263. :1].values(
  264. 'id',
  265. 'endTime')
  266. if unused_ai_service.exists():
  267. # 未使用套餐的endTime在购买的时候保存为有效时间
  268. effective_day = unused_ai_service[0]['endTime']
  269. endTime = now_time + effective_day
  270. AiService.objects.filter(
  271. id=unused_ai_service[0]['id']).update(
  272. use_status=1, endTime=endTime, updTime=now_time)
  273. except Exception:
  274. continue
  275. return response.json(0)
  276. class CronCollectDataView(View):
  277. def get(self, request, *args, **kwargs):
  278. request.encoding = 'utf-8'
  279. operation = kwargs.get('operation')
  280. return self.validation(request.GET, request, operation)
  281. def post(self, request, *args, **kwargs):
  282. request.encoding = 'utf-8'
  283. operation = kwargs.get('operation')
  284. return self.validation(request.POST, request, operation)
  285. def validation(self, request_dict, request, operation):
  286. response = ResponseObject()
  287. if operation == 'collectPlayBack': # 定时保存云存视频回放
  288. return self.collect_play_back(response)
  289. elif operation == 'collectDeviceUser': # 定时保存用户数据
  290. return self.collect_device_user(response)
  291. elif operation == 'collectOrder': # 定时保存订单数据
  292. return self.collect_order(response)
  293. elif operation == 'collectDeviceInfo': # 定时保存设备数据
  294. return self.collect_device_info(response)
  295. else:
  296. return response.json(404)
  297. @staticmethod
  298. def collect_play_back(response):
  299. try:
  300. end_time = int(time.time())
  301. start_time = end_time - 24 * 60 * 60 # 每天执行一次
  302. today = datetime.datetime.today()
  303. this_month_str = datetime.datetime(today.year, today.month, 1)
  304. this_month_stamp = CommonService.str_to_timestamp(this_month_str.strftime('%Y-%m-%d %H:%M:%S'))
  305. video_play_back_time_qs = VideoPlaybackTimeModel.objects.filter(startTime__gte=start_time,
  306. startTime__lt=end_time,
  307. playMode='cloud').values('uid').annotate(
  308. play_duration=Sum('duration'), play_frequency=Count('uid'))
  309. with transaction.atomic():
  310. for item in video_play_back_time_qs:
  311. vod_hls_summary_qs = VodHlsSummary.objects.filter(uid=item['uid'], time=this_month_stamp)
  312. if vod_hls_summary_qs.exists():
  313. vod_hls_summary = vod_hls_summary_qs.first()
  314. vod_hls_summary.play_duration += item['play_duration']
  315. vod_hls_summary.play_frequency += 1
  316. vod_hls_summary.save()
  317. else:
  318. VodHlsSummary.objects.create(uid=item['uid'], time=this_month_stamp,
  319. play_duration=item['play_duration'], play_frequency=1)
  320. return response.json(0)
  321. except Exception as e:
  322. return response.json(500, repr(e))
  323. @staticmethod
  324. def collect_device_user(response):
  325. try:
  326. today = datetime.datetime.today()
  327. start_time = datetime.datetime(today.year, today.month, today.day)
  328. end_time = start_time + datetime.timedelta(days=1)
  329. increase_user_qs = Device_User.objects.filter(data_joined__gte=start_time, data_joined__lt=end_time).values(
  330. 'data_joined',
  331. 'region_country')
  332. active_user_qs = Device_User.objects.filter(last_login__gte=start_time, last_login__lt=end_time).values(
  333. 'last_login',
  334. 'region_country')
  335. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  336. country_qs = CountryModel.objects.all().values('id', 'region__name', 'country_name')
  337. country_dict = {}
  338. continent_dict = {}
  339. for item in country_qs:
  340. country_dict[item['id']] = item['country_name']
  341. continent_dict[item['country_name']] = item['region__name']
  342. with transaction.atomic():
  343. for item in increase_user_qs:
  344. device_user_summary_qs = DeviceUserSummary.objects.filter(time=start_time, query_type=0)
  345. country_name = country_dict.get(item['region_country'], '未知国家')
  346. continent_name = continent_dict.get(country_name, '未知大洲')
  347. if device_user_summary_qs.exists():
  348. device_user_summary = device_user_summary_qs.first()
  349. country_temp_dict = eval(device_user_summary.country)
  350. continent_temp_dict = eval(device_user_summary.continent)
  351. if country_name in country_temp_dict:
  352. country_temp_dict[country_name] += 1
  353. else:
  354. country_temp_dict[country_name] = 1
  355. if continent_name in continent_temp_dict:
  356. continent_temp_dict[continent_name] += 1
  357. else:
  358. continent_temp_dict[continent_name] = 1
  359. device_user_summary.country = country_temp_dict
  360. device_user_summary.continent = continent_temp_dict
  361. device_user_summary.count += 1
  362. device_user_summary.save()
  363. else:
  364. country_temp_dict = {country_name: 1}
  365. continent_temp_dict = {continent_name: 1}
  366. DeviceUserSummary.objects.create(time=start_time, count=1,
  367. country=country_temp_dict,
  368. continent=continent_temp_dict)
  369. for item in active_user_qs:
  370. device_user_summary_qs = DeviceUserSummary.objects.filter(time=start_time, query_type=1)
  371. country_name = country_dict.get(item['region_country'], '未知国家')
  372. continent_name = continent_dict.get(country_name, '未知大洲')
  373. if device_user_summary_qs.exists():
  374. device_user_summary = device_user_summary_qs.first()
  375. country_temp_dict = eval(device_user_summary.country)
  376. continent_temp_dict = eval(device_user_summary.continent)
  377. if country_name in country_temp_dict:
  378. country_temp_dict[country_name] += 1
  379. else:
  380. country_temp_dict[country_name] = 1
  381. if continent_name in continent_temp_dict:
  382. continent_temp_dict[continent_name] += 1
  383. else:
  384. continent_temp_dict[continent_name] = 1
  385. device_user_summary.country = country_temp_dict
  386. device_user_summary.continent = continent_temp_dict
  387. device_user_summary.count += 1
  388. device_user_summary.save()
  389. else:
  390. country_temp_dict = {country_name: 1}
  391. continent_temp_dict = {continent_name: 1}
  392. DeviceUserSummary.objects.create(time=start_time, query_type=1, count=1,
  393. country=country_temp_dict,
  394. continent=continent_temp_dict)
  395. return response.json(0)
  396. except Exception as e:
  397. return response.json(500, repr(e))
  398. @staticmethod
  399. def collect_order(response):
  400. try:
  401. today = datetime.datetime.today()
  402. start_time = datetime.datetime(today.year, today.month, today.day)
  403. end_time = start_time + datetime.timedelta(days=1)
  404. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  405. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  406. order_qs = Order_Model.objects.filter(addTime__gte=start_time, addTime__lt=end_time,
  407. status=1).values('UID', 'order_type',
  408. 'ai_rank', 'price',
  409. 'unify_combo_id',
  410. 'rank',
  411. 'addTime').order_by(
  412. 'addTime')
  413. uid_list = []
  414. all_order_qs = Order_Model.objects.filter(addTime__lt=start_time, status=1).values('UID')
  415. for item in all_order_qs:
  416. if item['UID'] not in uid_list:
  417. uid_list.append(item['UID'])
  418. # 国家表数据
  419. country_qs = CountryModel.objects.values('id', 'country_name')
  420. country_dict = {}
  421. for item in country_qs:
  422. country_dict[item['id']] = item['country_name']
  423. # 设备类型数据
  424. device_type_qs = DeviceTypeModel.objects.values('name', 'type')
  425. device_type_dict = {}
  426. for item in device_type_qs:
  427. device_type_dict[item['type']] = item['name']
  428. # 云存套餐数据
  429. cloud_store_meal_dict = {}
  430. cloud_lang_qs = Lang.objects.filter(lang='cn').values('store_meal__id', 'title', 'content')
  431. for item in cloud_lang_qs:
  432. cloud_store_meal_dict[item['store_meal__id']] = item['title'] + ':' + item['content']
  433. # AI套餐数据
  434. ai_store_meal_dict = {}
  435. ai_lang_qs = Lang.objects.filter(lang='cn').values('aistoremeal__id', 'title', 'content')
  436. for item in ai_lang_qs:
  437. ai_store_meal_dict[item['aistoremeal__id']] = item['title'] + ':' + item['content']
  438. # 4g套餐数据
  439. unicom_combo_store_meal_dict = {}
  440. unicom_combo_qs = UnicomCombo.objects.values('id', 'combo_name')
  441. for item in unicom_combo_qs:
  442. unicom_combo_store_meal_dict[item['id']] = item['combo_name']
  443. with transaction.atomic():
  444. for item in order_qs:
  445. is_pay = 0
  446. price = float(item['price'])
  447. uid_set_qs = UidSetModel.objects.filter(uid=item['UID']).values('tb_country')
  448. country_id = uid_set_qs[0]['tb_country'] if uid_set_qs.exists() else 0
  449. country_name = country_dict.get(country_id, '未知国家')
  450. order_type = item['order_type']
  451. device_info_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  452. device_type_id = device_info_qs[0]['Type'] if device_info_qs.exists() else 0
  453. device_type_name = device_type_dict.get(device_type_id, '未知设备')
  454. if item['order_type'] == 0:
  455. store_meal_id = item['rank']
  456. store_meal_name = cloud_store_meal_dict.get(store_meal_id, '未知套餐')
  457. elif item['order_type'] == 1:
  458. store_meal_id = item['ai_rank']
  459. store_meal_name = ai_store_meal_dict.get(store_meal_id, '未知套餐')
  460. else:
  461. store_meal_id = item['unify_combo_id']
  462. store_meal_name = unicom_combo_store_meal_dict.get(store_meal_id, '未知套餐')
  463. add_time_stamp = item['addTime']
  464. add_time_str = datetime.datetime.fromtimestamp(int(add_time_stamp))
  465. add_time_str = datetime.datetime(add_time_str.year, add_time_str.month, add_time_str.day)
  466. add_time_stamp = CommonService.str_to_timestamp(add_time_str.strftime('%Y-%m-%d %H:%M:%S'))
  467. if price == 0:
  468. is_pay = 1
  469. order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=1,
  470. service_type=order_type)
  471. else:
  472. order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=0,
  473. service_type=order_type)
  474. if item['UID'] not in uid_list:
  475. pay_order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=2,
  476. service_type=order_type)
  477. query_type = 2
  478. else:
  479. pay_order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=3,
  480. service_type=order_type)
  481. query_type = 3
  482. if pay_order_summary_qs.exists():
  483. pay_order_summary = pay_order_summary_qs.first()
  484. pay_order_summary.count += 1
  485. pay_order_summary.total = str(round(float(pay_order_summary.total) + price, 2))
  486. country_temp_dict = eval(pay_order_summary.country)
  487. if country_name in country_temp_dict:
  488. country_temp_dict[country_name] += 1
  489. else:
  490. country_temp_dict[country_name] = 1
  491. pay_order_summary.country = country_temp_dict
  492. device_type_temp_dict = eval(pay_order_summary.device_type)
  493. if device_type_name in device_type_temp_dict:
  494. device_type_temp_dict[device_type_name] += 1
  495. else:
  496. device_type_temp_dict[device_type_name] = 1
  497. pay_order_summary.device_type = device_type_temp_dict
  498. store_meal_temp_dict = eval(pay_order_summary.store_meal)
  499. if store_meal_name in store_meal_temp_dict:
  500. store_meal_temp_dict[store_meal_name] += 1
  501. else:
  502. store_meal_temp_dict[store_meal_name] = 1
  503. pay_order_summary.store_meal = store_meal_temp_dict
  504. pay_order_summary.save()
  505. else:
  506. country_temp_dict = {
  507. country_name: 1
  508. }
  509. device_type_temp_dict = {
  510. device_type_name: 1
  511. }
  512. store_meal_temp_dict = {
  513. store_meal_name: 1
  514. }
  515. OrdersSummary.objects.create(time=add_time_stamp, count=1, query_type=query_type,
  516. service_type=order_type, total=price,
  517. country=country_temp_dict,
  518. device_type=device_type_temp_dict,
  519. store_meal=store_meal_temp_dict)
  520. if order_summary_qs.exists():
  521. order_summary = order_summary_qs.first()
  522. order_summary.count += 1
  523. order_summary.total = str(round(float(order_summary.total) + price, 2))
  524. country_temp_dict = eval(order_summary.country)
  525. if country_name in country_temp_dict:
  526. country_temp_dict[country_name] += 1
  527. else:
  528. country_temp_dict[country_name] = 1
  529. order_summary.country = country_temp_dict
  530. device_type_temp_dict = eval(order_summary.device_type)
  531. if device_type_name in device_type_temp_dict:
  532. if is_pay == 0:
  533. device_type_temp_dict[device_type_name]['数量'] += 1
  534. device_type_temp_dict[device_type_name]['销售额'] = str(
  535. round(float(device_type_temp_dict[device_type_name]['销售额']) + price, 2))
  536. else:
  537. device_type_temp_dict[device_type_name] += 1
  538. else:
  539. if is_pay == 0:
  540. device_type_temp_dict = {
  541. device_type_name: {
  542. '数量': 1,
  543. '销售额': price
  544. }
  545. }
  546. else:
  547. device_type_temp_dict = {
  548. device_type_name: 1
  549. }
  550. order_summary.device_type = device_type_temp_dict
  551. store_meal_temp_dict = eval(order_summary.store_meal)
  552. if store_meal_name in store_meal_temp_dict:
  553. if is_pay == 0:
  554. store_meal_temp_dict[store_meal_name]['数量'] += 1
  555. store_meal_temp_dict[store_meal_name]['销售额'] = str(
  556. round(float(store_meal_temp_dict[store_meal_name]['销售额']) + price, 2))
  557. else:
  558. store_meal_temp_dict[store_meal_name] += 1
  559. else:
  560. if is_pay == 0:
  561. store_meal_temp_dict = {
  562. store_meal_name: {
  563. '数量': 1,
  564. '销售额': price
  565. }
  566. }
  567. else:
  568. store_meal_temp_dict = {
  569. store_meal_name: 1
  570. }
  571. order_summary.store_meal = store_meal_temp_dict
  572. order_summary.save()
  573. else:
  574. country_temp_dict = {
  575. country_name: 1
  576. }
  577. if is_pay == 0:
  578. device_type_temp_dict = {
  579. device_type_name: {
  580. '数量': 1,
  581. '销售额': price
  582. }
  583. }
  584. store_meal_temp_dict = {
  585. store_meal_name: {
  586. '数量': 1,
  587. '销售额': price
  588. }
  589. }
  590. else:
  591. device_type_temp_dict = {
  592. device_type_name: 1
  593. }
  594. store_meal_temp_dict = {
  595. store_meal_name: 1
  596. }
  597. OrdersSummary.objects.create(time=add_time_stamp, count=1, query_type=is_pay,
  598. service_type=order_type, total=price,
  599. country=country_temp_dict,
  600. device_type=device_type_temp_dict, store_meal=store_meal_temp_dict)
  601. return response.json(0)
  602. except Exception as e:
  603. return response.json(500, repr(e))
  604. @staticmethod
  605. def collect_device_info(response):
  606. try:
  607. today = datetime.datetime.today()
  608. start_time = datetime.datetime(today.year, today.month, today.day)
  609. end_time = start_time + datetime.timedelta(days=1)
  610. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  611. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  612. increase_device_qs = UidSetModel.objects.filter(addTime__gte=start_time, addTime__lt=end_time).values(
  613. 'tb_country',
  614. 'cloud_vod',
  615. 'uid',
  616. 'addTime')
  617. video_play_back_time_qs = VideoPlaybackTimeModel.objects.filter(startTime__gte=start_time,
  618. startTime__lt=end_time).values('uid')
  619. active_device_qs = UidSetModel.objects.filter(uid__in=video_play_back_time_qs).values('tb_country',
  620. 'addTime',
  621. 'cloud_vod',
  622. 'uid')
  623. # 国家表数据
  624. country_qs = CountryModel.objects.values('id', 'country_name', 'region__name')
  625. country_dict = {}
  626. continent_dict = {}
  627. for item in country_qs:
  628. country_dict[item['id']] = item['country_name']
  629. continent_dict[item['country_name']] = item['region__name']
  630. # 设备类型数据
  631. device_type_qs = DeviceTypeModel.objects.values('name', 'type')
  632. device_type_dict = {}
  633. for item in device_type_qs:
  634. device_type_dict[item['type']] = item['name']
  635. with transaction.atomic():
  636. for index, each in enumerate([increase_device_qs, active_device_qs]):
  637. for item in each:
  638. device_info_qs = Device_Info.objects.filter(UID=item['uid']).values('Type')
  639. device_type_id = device_info_qs[0]['Type'] if device_info_qs.exists() else 0
  640. time_stamp = item['addTime']
  641. time_str = datetime.datetime.fromtimestamp(int(time_stamp))
  642. this_day_str = datetime.datetime(time_str.year, time_str.month, time_str.day)
  643. this_day_stamp = CommonService.str_to_timestamp(this_day_str.strftime('%Y-%m-%d %H:%M:%S'))
  644. device_info_summary_qs = DeviceInfoSummary.objects.filter(time=this_day_stamp, query_type=index)
  645. country_name = country_dict.get(item['tb_country'], '未知国家')
  646. continent_name = continent_dict.get(country_name, '未知大洲')
  647. device_type_name = device_type_dict.get(device_type_id, '未知设备类型')
  648. if device_info_summary_qs.exists():
  649. device_info_summary = device_info_summary_qs.first()
  650. country_temp_dict = eval(device_info_summary.country)
  651. continent_temp_dict = eval(device_info_summary.continent)
  652. vod_service_temp_dict = eval(device_info_summary.vod_service)
  653. device_type_temp_dict = eval(device_info_summary.device_type)
  654. if country_name in country_temp_dict:
  655. country_temp_dict[country_name] += 1
  656. else:
  657. country_temp_dict[country_name] = 1
  658. if continent_name in continent_temp_dict:
  659. continent_temp_dict[continent_name] += 1
  660. else:
  661. continent_temp_dict[continent_name] = 1
  662. if item['cloud_vod'] != 2:
  663. if device_type_name in vod_service_temp_dict:
  664. vod_service_temp_dict[device_type_name] += 1
  665. else:
  666. vod_service_temp_dict[device_type_name] = 1
  667. if device_type_name in device_type_temp_dict:
  668. device_type_temp_dict[device_type_name] += 1
  669. else:
  670. device_type_temp_dict[device_type_name] = 1
  671. device_info_summary.country = country_temp_dict
  672. device_info_summary.continent = continent_temp_dict
  673. device_info_summary.vod_service = vod_service_temp_dict
  674. device_info_summary.device_type = device_type_temp_dict
  675. device_info_summary.count += 1
  676. device_info_summary.save()
  677. else:
  678. country_temp_dict = {country_name: 1}
  679. continent_temp_dict = {continent_name: 1}
  680. vod_service_temp_dict = {device_type_name: 1} if item['cloud_vod'] != 2 else {
  681. device_type_name: 0}
  682. device_type_temp_dict = {device_type_name: 1}
  683. DeviceInfoSummary.objects.create(time=this_day_stamp, count=1,
  684. query_type=index,
  685. country=country_temp_dict,
  686. continent=continent_temp_dict,
  687. vod_service=vod_service_temp_dict,
  688. device_type=device_type_temp_dict)
  689. return response.json(0)
  690. except Exception as e:
  691. return response.json(500, repr(e))