CronTaskController.py 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  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 logging
  12. import threading
  13. import time
  14. import requests
  15. from django.db import connection, connections, transaction
  16. from django.db.models import Q, Sum, Count
  17. from django.views import View
  18. from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
  19. VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
  20. CountryModel, DeviceTypeModel, Lang, UnicomCombo, OrdersSummary, DeviceInfoSummary, CompanySerialModel
  21. from Object.RedisObject import RedisObject
  22. from Object.ResponseObject import ResponseObject
  23. from Object.utils import LocalDateTimeUtil
  24. from Service.CommonService import CommonService
  25. from Ansjer.config import USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST
  26. class CronDelDataView(View):
  27. def get(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. operation = kwargs.get('operation')
  30. return self.validation(request.GET, request, operation)
  31. def post(self, request, *args, **kwargs):
  32. request.encoding = 'utf-8'
  33. operation = kwargs.get('operation')
  34. return self.validation(request.POST, request, operation)
  35. def validation(self, request_dict, request, operation):
  36. response = ResponseObject()
  37. if operation == 'delAccessLog': # 定时删除访问接口数据
  38. return self.delAccessLog(response)
  39. elif operation == 'delPushInfo': # 定时删除推送数据
  40. return self.delPushInfo(response)
  41. elif operation == 'delVodHls': # 定时删除云存播放列表
  42. return self.delVodHls(response)
  43. elif operation == 'delCloudLog': # 定时删除云存接口数据
  44. return self.delCloudLog(response)
  45. elif operation == 'delTesterDevice': # 定时删除测试账号下的设备数据
  46. return self.delTesterDevice(response)
  47. else:
  48. return response.json(404)
  49. @staticmethod
  50. def delAccessLog(response):
  51. try:
  52. cursor = connection.cursor()
  53. # 删除7天前的数据
  54. last_week = LocalDateTimeUtil.get_last_week()
  55. sql = 'DELETE FROM access_log WHERE time < %s limit %s'
  56. cursor.execute(sql, [last_week, 10000])
  57. # 关闭游标
  58. cursor.close()
  59. connection.close()
  60. return response.json(0)
  61. except Exception as e:
  62. return response.json(500, repr(e))
  63. @staticmethod
  64. def delPushInfo(response):
  65. now_time = int(time.time())
  66. cursor = connections['mysql02'].cursor()
  67. try:
  68. # 当前时间转日期
  69. local_date_now = str(datetime.datetime.fromtimestamp(int(now_time)).date())
  70. # 根据日期获取周几
  71. week_val = LocalDateTimeUtil.date_to_week(local_date_now)
  72. # 根据当前时间获取7天前时间戳
  73. expiration_time = LocalDateTimeUtil.get_before_days_timestamp(now_time, 7)
  74. # 每次删除条数
  75. size = 10000
  76. # 删除7天前的数据
  77. sql = "DELETE FROM equipment_info WHERE addTime<= %s LIMIT %s "
  78. for i in range(6):
  79. cursor.execute(sql, [expiration_time, size])
  80. if week_val == 1:
  81. sql = "DELETE FROM equipment_info_sunday WHERE add_time<= %s LIMIT %s "
  82. if week_val == 2:
  83. sql = "DELETE FROM equipment_info_monday WHERE add_time<= %s LIMIT %s "
  84. if week_val == 3:
  85. sql = "DELETE FROM equipment_info_tuesday WHERE add_time<= %s LIMIT %s "
  86. if week_val == 4:
  87. sql = "DELETE FROM equipment_info_wednesday WHERE add_time<= %s LIMIT %s "
  88. if week_val == 5:
  89. sql = "DELETE FROM equipment_info_thursday WHERE add_time<= %s LIMIT %s "
  90. if week_val == 6:
  91. sql = "DELETE FROM equipment_info_friday WHERE add_time<= %s LIMIT %s "
  92. if week_val == 7:
  93. sql = "DELETE FROM equipment_info_saturday WHERE add_time<= %s LIMIT %s "
  94. for i in range(5):
  95. cursor.execute(sql, [expiration_time, size])
  96. # 关闭游标
  97. cursor.close()
  98. return response.json(0)
  99. except Exception as e:
  100. return response.json(500, repr(e))
  101. @staticmethod
  102. def delVodHls(response):
  103. nowTime = int(time.time())
  104. try:
  105. cursor = connection.cursor()
  106. month_ago_time = nowTime - 30 * 24 * 60 * 60 # 删除1个月前的数据
  107. sql = 'DELETE FROM `vod_hls` WHERE endTime<{} LIMIT 50000'.format(month_ago_time)
  108. cursor.execute(sql)
  109. cursor.close()
  110. return response.json(0)
  111. except Exception as e:
  112. return response.json(500, repr(e))
  113. @staticmethod
  114. def delCloudLog(response):
  115. nowTime = int(time.time())
  116. cursor = connection.cursor()
  117. try:
  118. # 删除3个月前的数据
  119. sql = "DELETE FROM `cloud_log` WHERE time<={} LIMIT 50000".format(
  120. nowTime - 3 * 30 * 24 * 60 * 60)
  121. cursor.execute(sql)
  122. # 关闭游标
  123. cursor.close()
  124. return response.json(0)
  125. except Exception as e:
  126. return response.json(500, repr(e))
  127. @staticmethod
  128. def delTesterDevice(response):
  129. try:
  130. userID_list = [
  131. 'tech01@ansjer.com',
  132. 'tech02@ansjer.com',
  133. 'tech03@ansjer.com',
  134. 'tech04@ansjer.com',
  135. 'tech05@ansjer.com',
  136. 'tech06@ansjer.com',
  137. 'tech07@ansjer.com',
  138. 'tech08@ansjer.com',
  139. 'tech09@ansjer.com',
  140. 'tech10@ansjer.com',
  141. 'fix01@ansjer.com',
  142. 'fix02@ansjer.com',
  143. 'fix03@ansjer.com',
  144. 'fix04@ansjer.com',
  145. 'fix05@ansjer.com']
  146. device_user = Device_User.objects.filter(username__in=userID_list)
  147. device_info_qs = Device_Info.objects.filter(
  148. userID__in=device_user).values('UID')
  149. uid_list = []
  150. for device_info in device_info_qs:
  151. uid_list.append(device_info['UID'])
  152. with transaction.atomic():
  153. # 删除设备云存相关数据
  154. UidSetModel.objects.filter(uid__in=uid_list).delete()
  155. UID_Bucket.objects.filter(uid__in=uid_list).delete()
  156. Unused_Uid_Meal.objects.filter(uid__in=uid_list).delete()
  157. Order_Model.objects.filter(UID__in=uid_list).delete()
  158. StsCrdModel.objects.filter(uid__in=uid_list).delete()
  159. VodHlsModel.objects.filter(uid__in=uid_list).delete()
  160. ExperienceContextModel.objects.filter(
  161. uid__in=uid_list).delete()
  162. Device_Info.objects.filter(userID__in=device_user).delete()
  163. return response.json(0)
  164. except Exception as e:
  165. return response.json(500, repr(e))
  166. class CronUpdateDataView(View):
  167. def get(self, request, *args, **kwargs):
  168. request.encoding = 'utf-8'
  169. operation = kwargs.get('operation')
  170. return self.validation(request.GET, request, operation)
  171. def post(self, request, *args, **kwargs):
  172. request.encoding = 'utf-8'
  173. operation = kwargs.get('operation')
  174. return self.validation(request.POST, request, operation)
  175. def validation(self, request_dict, request, operation):
  176. response = ResponseObject()
  177. if operation == 'updateUnusedUidBucket': # 定时更新过期云存关联的未使用套餐状态
  178. return self.updateUnusedUidBucket(response)
  179. elif operation == 'updateUnusedAiService': # 定时更新过期ai关联的未使用套餐状态
  180. return self.updateUnusedAiService(response)
  181. elif operation == 'reqUpdateSerialStatus': # 定时请求更新序列号状态
  182. return self.reqUpdateSerialStatus(response)
  183. elif operation == 'updateSerialStatus': # 更新序列号状态
  184. return self.updateSerialStatus(request_dict, response)
  185. else:
  186. return response.json(404)
  187. @staticmethod
  188. def updateUnusedUidBucket(response):
  189. """
  190. 监控云存套餐过期修改状态
  191. @param response:
  192. @return:
  193. """
  194. # 定时更新已过期套餐修改状态为2
  195. now_time = int(time.time())
  196. expired_uid_bucket = UID_Bucket.objects.filter(endTime__lte=now_time)
  197. expired_uid_bucket = expired_uid_bucket.filter(~Q(use_status=2)).values('id')
  198. if expired_uid_bucket.exists():
  199. expired_uid_bucket.update(use_status=2)
  200. # 监控有未使用套餐则自动生效
  201. expired_uid_buckets = \
  202. UID_Bucket.objects.filter(endTime__lte=now_time, has_unused=1).values("id", "uid")[0:1000]
  203. for expired_uid_bucket in expired_uid_buckets:
  204. unuseds = Unused_Uid_Meal.objects.filter(
  205. uid=expired_uid_bucket['uid']).values(
  206. "id",
  207. "uid",
  208. "channel",
  209. "addTime",
  210. "expire",
  211. "num",
  212. "bucket_id").order_by('addTime')[0:1]
  213. if not unuseds.exists():
  214. continue
  215. unused = unuseds[0]
  216. try:
  217. with transaction.atomic():
  218. count_unused = Unused_Uid_Meal.objects.filter(
  219. uid=expired_uid_bucket['uid']).count()
  220. has_unused = 1 if count_unused > 1 else 0
  221. endTime = CommonService.calcMonthLater(
  222. unused['expire'] * unused['num'])
  223. UID_Bucket.objects.filter(
  224. uid=expired_uid_bucket['uid']).update(
  225. channel=unused['channel'],
  226. endTime=endTime,
  227. bucket_id=unused['bucket_id'],
  228. updateTime=now_time,
  229. use_status=1,
  230. has_unused=has_unused)
  231. Unused_Uid_Meal.objects.filter(id=unused['id']).delete()
  232. StsCrdModel.objects.filter(
  233. uid=expired_uid_bucket['uid']).delete() # 删除sts记录
  234. except Exception as e:
  235. print(repr(e))
  236. continue
  237. return response.json(0)
  238. @staticmethod
  239. def updateUnusedAiService(response):
  240. now_time = int(time.time())
  241. ai_service_qs = AiService.objects.filter(
  242. endTime__lte=now_time,
  243. use_status=1).values(
  244. 'id',
  245. 'uid')[
  246. 0:200]
  247. for ai_service in ai_service_qs:
  248. try:
  249. with transaction.atomic():
  250. AiService.objects.filter(
  251. id=ai_service['id']).update(
  252. use_status=2) # 更新过期ai订单状态
  253. # 如果存在未使用套餐,更新为使用
  254. unused_ai_service = AiService.objects.filter(
  255. uid=ai_service['uid'],
  256. use_status=0).order_by('addTime')[
  257. :1].values(
  258. 'id',
  259. 'endTime')
  260. if unused_ai_service.exists():
  261. # 未使用套餐的endTime在购买的时候保存为有效时间
  262. effective_day = unused_ai_service[0]['endTime']
  263. endTime = now_time + effective_day
  264. AiService.objects.filter(
  265. id=unused_ai_service[0]['id']).update(
  266. use_status=1, endTime=endTime, updTime=now_time)
  267. except Exception:
  268. continue
  269. return response.json(0)
  270. @classmethod
  271. def reqUpdateSerialStatus(cls, response):
  272. redis_obj = RedisObject()
  273. # 更新已使用序列号其他服务器的状态
  274. used_serial_redis_list_len = redis_obj.llen(USED_SERIAL_REDIS_LIST)
  275. if used_serial_redis_list_len > 0:
  276. used_serial_redis_list = []
  277. for i in range(used_serial_redis_list_len):
  278. used_serial_redis_list.append(redis_obj.lpop(USED_SERIAL_REDIS_LIST))
  279. request_thread = threading.Thread(target=cls.do_request_thread, args=(str(used_serial_redis_list), 3))
  280. request_thread.start()
  281. # 更新未使用序列号其他服务器的状态
  282. unused_serial_redis_list_len = redis_obj.llen(UNUSED_SERIAL_REDIS_LIST)
  283. if unused_serial_redis_list_len > 0:
  284. unused_serial_redis_list = []
  285. for i in range(unused_serial_redis_list_len):
  286. unused_serial_redis_list.append(redis_obj.lpop(UNUSED_SERIAL_REDIS_LIST))
  287. request_thread = threading.Thread(target=cls.do_request_thread, args=(str(unused_serial_redis_list), 1))
  288. request_thread.start()
  289. return response.json(0)
  290. @staticmethod
  291. def do_request_thread(serial_redis_list, status):
  292. """
  293. 请求更新序列号线程
  294. @param serial_redis_list: 序列号redis列表
  295. @param status: 状态, 1: 未使用, 3: 已占用
  296. """
  297. data = {
  298. 'serial_redis_list': serial_redis_list,
  299. 'status': status
  300. }
  301. # 确认域名列表
  302. orders_domain_name_list = CommonService.get_orders_domain_name_list()
  303. logger = logging.getLogger('info')
  304. logger.info('---请求更新序列号线程---data:{},orders_domain_name_list:{}'.format(data, orders_domain_name_list))
  305. for domain_name in orders_domain_name_list:
  306. url = '{}cron/update/updateSerialStatus'.format(domain_name)
  307. requests.post(url=url, data=data, timeout=2)
  308. @staticmethod
  309. def updateSerialStatus(request_dict, response):
  310. """
  311. 更新序列号状态
  312. @param request_dict: 请求参数
  313. @request_dict serial_redis_list: 序列号redis列表
  314. @request_dict status: 状态, 1: 未使用, 3: 已占用
  315. @param response: 响应对象
  316. """
  317. serial_redis_list = request_dict.get('serial_redis_list', None)
  318. status = request_dict.get('status', None)
  319. logger = logging.getLogger('info')
  320. logger.info('---更新序列号状态参数---serial_redis_list:{},status:{}'.format(serial_redis_list, status))
  321. if not all([serial_redis_list, status]):
  322. return response.json(444)
  323. try:
  324. serial_redis_list = eval(serial_redis_list)
  325. CompanySerialModel.objects.filter(serial_number__in=serial_redis_list).update(status=int(status))
  326. except Exception as e:
  327. logger.info('---更新序列号状态异常---:{}'.format(repr(e)))
  328. class CronCollectDataView(View):
  329. def get(self, request, *args, **kwargs):
  330. request.encoding = 'utf-8'
  331. operation = kwargs.get('operation')
  332. return self.validation(request.GET, request, operation)
  333. def post(self, request, *args, **kwargs):
  334. request.encoding = 'utf-8'
  335. operation = kwargs.get('operation')
  336. return self.validation(request.POST, request, operation)
  337. def validation(self, request_dict, request, operation):
  338. response = ResponseObject()
  339. if operation == 'collectPlayBack': # 定时保存云存视频回放
  340. return self.collect_play_back(response)
  341. elif operation == 'collectDeviceUser': # 定时保存用户数据
  342. return self.collect_device_user(response)
  343. elif operation == 'collectOrder': # 定时保存订单数据
  344. return self.collect_order(response)
  345. elif operation == 'collectDeviceInfo': # 定时保存设备数据
  346. return self.collect_device_info(response)
  347. else:
  348. return response.json(404)
  349. @staticmethod
  350. def collect_play_back(response):
  351. try:
  352. now_time = int(time.time())
  353. today = datetime.datetime.today()
  354. start_time = datetime.datetime(today.year, today.month, today.day)
  355. end_time = start_time + datetime.timedelta(days=1)
  356. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  357. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  358. this_month_str = datetime.datetime(today.year, today.month, 1)
  359. this_month_stamp = CommonService.str_to_timestamp(this_month_str.strftime('%Y-%m-%d %H:%M:%S'))
  360. video_play_back_time_qs = VideoPlaybackTimeModel.objects.filter(startTime__gte=start_time,
  361. startTime__lt=end_time,
  362. playMode='cloud').values('uid').annotate(
  363. play_duration=Sum('duration'), play_frequency=Count('uid'))
  364. with transaction.atomic():
  365. for item in video_play_back_time_qs:
  366. vod_hls_summary_qs = VodHlsSummary.objects.filter(uid=item['uid'], time=this_month_stamp)
  367. if vod_hls_summary_qs.exists():
  368. vod_hls_summary = vod_hls_summary_qs.first()
  369. vod_hls_summary.play_duration += item['play_duration']
  370. vod_hls_summary.play_frequency += 1
  371. vod_hls_summary.updated_time = now_time
  372. vod_hls_summary.save()
  373. else:
  374. VodHlsSummary.objects.create(uid=item['uid'], time=this_month_stamp, created_time=now_time,
  375. play_duration=item['play_duration'], play_frequency=1,
  376. updated_time=now_time)
  377. return response.json(0)
  378. except Exception as e:
  379. return response.json(500, repr(e))
  380. @staticmethod
  381. def collect_device_user(response):
  382. try:
  383. created_time = int(time.time())
  384. today = datetime.datetime.today()
  385. start_time = datetime.datetime(today.year, today.month, today.day)
  386. increase_user_qs = Device_User.objects.filter(data_joined__year=today.year, data_joined__month=today.month,
  387. data_joined__day=today.day).values('region_country')
  388. active_user_qs = Device_User.objects.filter(last_login__year=today.year, last_login__month=today.month,
  389. last_login__day=today.day).values('region_country')
  390. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  391. country_qs = CountryModel.objects.all().values('id', 'region__name', 'country_name')
  392. country_dict = {}
  393. continent_dict = {}
  394. for item in country_qs:
  395. country_dict[item['id']] = item['country_name']
  396. continent_dict[item['country_name']] = item['region__name']
  397. with transaction.atomic():
  398. if increase_user_qs.exists():
  399. increase_user_count = increase_user_qs.count()
  400. increase_user_country_list = increase_user_qs.values('region_country').annotate(
  401. count=Count('region_country')).order_by('count')
  402. increase_user_country_dict = {}
  403. increase_user_continent_dict = {}
  404. for item in increase_user_country_list:
  405. country_name = country_dict.get(item['region_country'], '未知国家')
  406. continent_name = continent_dict.get(country_name, '未知大洲')
  407. increase_user_country_dict[country_name] = item['count']
  408. if continent_name not in increase_user_continent_dict:
  409. increase_user_continent_dict[continent_name] = 0
  410. increase_user_continent_dict[continent_name] += item['count']
  411. DeviceUserSummary.objects.create(time=start_time, count=increase_user_count,
  412. country=increase_user_country_dict, created_time=created_time,
  413. continent=increase_user_continent_dict)
  414. if active_user_qs.exists():
  415. active_user_count = active_user_qs.count()
  416. active_user_country_list = active_user_qs.values('region_country').annotate(
  417. count=Count('region_country')).order_by(
  418. 'count')
  419. active_user_country_dict = {}
  420. active_user_continent_dict = {}
  421. for item in active_user_country_list:
  422. country_name = country_dict.get(item['region_country'], '未知国家')
  423. continent_name = continent_dict.get(country_name, '未知大洲')
  424. active_user_country_dict[country_name] = item['count']
  425. if continent_name not in active_user_continent_dict:
  426. active_user_continent_dict[continent_name] = 0
  427. active_user_continent_dict[continent_name] += item['count']
  428. DeviceUserSummary.objects.create(time=start_time, query_type=1, count=active_user_count,
  429. country=active_user_country_dict, created_time=created_time,
  430. continent=active_user_continent_dict)
  431. return response.json(0)
  432. except Exception as e:
  433. return response.json(500, repr(e))
  434. @staticmethod
  435. def collect_order(response):
  436. try:
  437. created_time = int(time.time())
  438. today = datetime.datetime.today()
  439. start_time = datetime.datetime(today.year, today.month, today.day)
  440. end_time = start_time + datetime.timedelta(days=1)
  441. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  442. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  443. order_qs = Order_Model.objects.filter(addTime__gte=start_time, addTime__lt=end_time,
  444. status=1).values('UID', 'order_type',
  445. 'store_meal_name', 'price',
  446. 'addTime', 'currency').order_by(
  447. 'addTime')
  448. uid_list = []
  449. all_order_qs = Order_Model.objects.filter(addTime__lt=start_time, status=1).values('UID')
  450. for item in all_order_qs:
  451. if item['UID'] not in uid_list:
  452. uid_list.append(item['UID'])
  453. # 国家表数据
  454. country_qs = CountryModel.objects.values('id', 'country_name')
  455. country_dict = {}
  456. for item in country_qs:
  457. country_dict[item['id']] = item['country_name']
  458. # 设备类型数据
  459. device_type_qs = DeviceTypeModel.objects.values('name', 'type')
  460. device_type_dict = {}
  461. for item in device_type_qs:
  462. device_type_dict[item['type']] = item['name']
  463. with transaction.atomic():
  464. for item in order_qs:
  465. is_pay = 0
  466. price = float(item['price'])
  467. currency = item['currency']
  468. uid_set_qs = UidSetModel.objects.filter(uid=item['UID']).values('tb_country')
  469. country_id = uid_set_qs[0]['tb_country'] if uid_set_qs.exists() else 0
  470. country_name = country_dict.get(country_id, '未知国家')
  471. order_type = item['order_type']
  472. device_info_qs = Device_Info.objects.filter(UID=item['UID']).values('Type')
  473. device_type_id = device_info_qs[0]['Type'] if device_info_qs.exists() else 0
  474. device_type_name = device_type_dict.get(device_type_id, '未知设备')
  475. store_meal_name = item['store_meal_name']
  476. add_time_stamp = item['addTime']
  477. add_time_str = datetime.datetime.fromtimestamp(int(add_time_stamp))
  478. add_time_str = datetime.datetime(add_time_str.year, add_time_str.month, add_time_str.day)
  479. add_time_stamp = CommonService.str_to_timestamp(add_time_str.strftime('%Y-%m-%d %H:%M:%S'))
  480. if price == 0:
  481. is_pay = 1
  482. order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=1,
  483. service_type=order_type)
  484. else:
  485. order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=0,
  486. service_type=order_type)
  487. if item['UID'] not in uid_list:
  488. pay_order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=2,
  489. service_type=order_type)
  490. query_type = 2
  491. else:
  492. pay_order_summary_qs = OrdersSummary.objects.filter(time=add_time_stamp, query_type=3,
  493. service_type=order_type)
  494. query_type = 3
  495. if pay_order_summary_qs.exists():
  496. pay_order_summary = pay_order_summary_qs.first()
  497. pay_order_summary.count += 1
  498. temp_total = eval(pay_order_summary.total)
  499. if currency not in temp_total:
  500. temp_total[currency] = price
  501. else:
  502. temp_total[currency] = round(temp_total[currency] + price, 2)
  503. pay_order_summary.total = temp_total
  504. country_temp_dict = eval(pay_order_summary.country)
  505. if country_name in country_temp_dict:
  506. country_temp_dict[country_name]['数量'] += 1
  507. if currency not in country_temp_dict[country_name]:
  508. country_temp_dict[country_name][currency] = price
  509. else:
  510. country_temp_dict[country_name][currency] = round(
  511. country_temp_dict[country_name][currency] + price, 2)
  512. else:
  513. country_temp_dict[country_name] = {'数量': 1, currency: price}
  514. pay_order_summary.country = country_temp_dict
  515. device_type_temp_dict = eval(pay_order_summary.device_type)
  516. if device_type_name in device_type_temp_dict:
  517. device_type_temp_dict[device_type_name]['数量'] += 1
  518. if currency not in device_type_temp_dict[device_type_name]:
  519. device_type_temp_dict[device_type_name][currency] = price
  520. else:
  521. device_type_temp_dict[device_type_name][currency] = round(
  522. device_type_temp_dict[device_type_name][currency] + price, 2)
  523. else:
  524. device_type_temp_dict[device_type_name] = {'数量': 1, currency: price}
  525. pay_order_summary.device_type = device_type_temp_dict
  526. store_meal_temp_dict = eval(pay_order_summary.store_meal)
  527. if store_meal_name in store_meal_temp_dict:
  528. store_meal_temp_dict[store_meal_name]['数量'] += 1
  529. if currency not in store_meal_temp_dict[store_meal_name]:
  530. store_meal_temp_dict[store_meal_name][currency] = price
  531. else:
  532. store_meal_temp_dict[store_meal_name][currency] = round(
  533. store_meal_temp_dict[store_meal_name][currency] + price, 2)
  534. else:
  535. store_meal_temp_dict[store_meal_name] = {'数量': 1, currency: price}
  536. pay_order_summary.store_meal = store_meal_temp_dict
  537. pay_order_summary.save()
  538. else:
  539. final_total = {currency: price}
  540. country_temp_dict = {
  541. country_name: {
  542. '数量': 1,
  543. currency: price
  544. }
  545. }
  546. device_type_temp_dict = {
  547. device_type_name: {
  548. '数量': 1,
  549. currency: price
  550. }
  551. }
  552. store_meal_temp_dict = {
  553. store_meal_name: {
  554. '数量': 1,
  555. currency: price
  556. }
  557. }
  558. OrdersSummary.objects.create(time=add_time_stamp, count=1, query_type=query_type,
  559. service_type=order_type, total=final_total,
  560. country=country_temp_dict, created_time=created_time,
  561. device_type=device_type_temp_dict,
  562. store_meal=store_meal_temp_dict)
  563. if order_summary_qs.exists():
  564. order_summary = order_summary_qs.first()
  565. order_summary.count += 1
  566. temp_total = eval(order_summary.total)
  567. if currency not in temp_total:
  568. temp_total[currency] = price
  569. else:
  570. temp_total[currency] = round(temp_total[currency] + price, 2)
  571. order_summary.total = temp_total
  572. country_temp_dict = eval(order_summary.country)
  573. if country_name in country_temp_dict:
  574. if is_pay == 0:
  575. country_temp_dict[country_name]['数量'] += 1
  576. if currency not in country_temp_dict[country_name]:
  577. country_temp_dict[country_name][currency] = price
  578. else:
  579. country_temp_dict[country_name][currency] = round(
  580. country_temp_dict[country_name][currency] + price, 2)
  581. else:
  582. country_temp_dict[country_name] += 1
  583. else:
  584. if is_pay == 0:
  585. country_temp_dict[country_name] = {'数量': 1, currency: price}
  586. else:
  587. country_temp_dict[country_name] = 1
  588. order_summary.country = country_temp_dict
  589. device_type_temp_dict = eval(order_summary.device_type)
  590. if device_type_name in device_type_temp_dict:
  591. if is_pay == 0:
  592. device_type_temp_dict[device_type_name]['数量'] += 1
  593. if currency not in device_type_temp_dict[device_type_name]:
  594. device_type_temp_dict[device_type_name][currency] = price
  595. else:
  596. device_type_temp_dict[device_type_name][currency] = round(
  597. device_type_temp_dict[device_type_name][currency] + price, 2)
  598. else:
  599. device_type_temp_dict[device_type_name] += 1
  600. else:
  601. if is_pay == 0:
  602. device_type_temp_dict[device_type_name] = {'数量': 1, currency: price}
  603. else:
  604. device_type_temp_dict[device_type_name] = 1
  605. order_summary.device_type = device_type_temp_dict
  606. store_meal_temp_dict = eval(order_summary.store_meal)
  607. if store_meal_name in store_meal_temp_dict:
  608. if is_pay == 0:
  609. store_meal_temp_dict[store_meal_name]['数量'] += 1
  610. if currency not in store_meal_temp_dict[store_meal_name]:
  611. store_meal_temp_dict[store_meal_name][currency] = price
  612. else:
  613. store_meal_temp_dict[store_meal_name][currency] = round(
  614. store_meal_temp_dict[store_meal_name][currency] + price, 2)
  615. else:
  616. store_meal_temp_dict[store_meal_name] += 1
  617. else:
  618. if is_pay == 0:
  619. store_meal_temp_dict[store_meal_name] = {'数量': 1, currency: price}
  620. else:
  621. store_meal_temp_dict[store_meal_name] = 1
  622. order_summary.store_meal = store_meal_temp_dict
  623. order_summary.save()
  624. else:
  625. final_total = {currency: price}
  626. if is_pay == 0:
  627. country_temp_dict = {
  628. country_name: {
  629. '数量': 1,
  630. currency: price
  631. }
  632. }
  633. device_type_temp_dict = {
  634. device_type_name: {
  635. '数量': 1,
  636. currency: price
  637. }
  638. }
  639. store_meal_temp_dict = {
  640. store_meal_name: {
  641. '数量': 1,
  642. currency: price
  643. }
  644. }
  645. else:
  646. device_type_temp_dict = {
  647. device_type_name: 1
  648. }
  649. store_meal_temp_dict = {
  650. store_meal_name: 1
  651. }
  652. country_temp_dict = {
  653. country_name: 1
  654. }
  655. OrdersSummary.objects.create(time=add_time_stamp, count=1, query_type=is_pay,
  656. service_type=order_type, total=final_total,
  657. country=country_temp_dict, created_time=created_time,
  658. device_type=device_type_temp_dict, store_meal=store_meal_temp_dict)
  659. return response.json(0)
  660. except Exception as e:
  661. return response.json(500, repr(e))
  662. @staticmethod
  663. def collect_device_info(response):
  664. try:
  665. created_time = int(time.time())
  666. today = datetime.datetime.today()
  667. start_time = datetime.datetime(today.year, today.month, today.day)
  668. end_time = start_time + datetime.timedelta(days=1)
  669. start_time = CommonService.str_to_timestamp(start_time.strftime('%Y-%m-%d %H:%M:%S'))
  670. end_time = CommonService.str_to_timestamp(end_time.strftime('%Y-%m-%d %H:%M:%S'))
  671. increase_device_qs = UidSetModel.objects.filter(addTime__gte=start_time, addTime__lt=end_time).values(
  672. 'tb_country',
  673. 'uid',
  674. 'device_type',
  675. 'cloud_vod',
  676. 'is_ai',
  677. 'mobile_4g',
  678. 'addTime')
  679. video_play_back_time_qs = VideoPlaybackTimeModel.objects.filter(startTime__gte=start_time,
  680. startTime__lt=end_time).values('uid')
  681. active_device_qs = UidSetModel.objects.filter(uid__in=video_play_back_time_qs).values('tb_country',
  682. 'addTime',
  683. 'device_type',
  684. 'cloud_vod',
  685. 'is_ai',
  686. 'mobile_4g',
  687. 'uid')
  688. increase_device_count = increase_device_qs.count()
  689. active_device_count = active_device_qs.count()
  690. # 国家表数据
  691. country_qs = CountryModel.objects.values('id', 'country_name', 'region__name')
  692. country_dict = {}
  693. continent_dict = {}
  694. for item in country_qs:
  695. country_dict[item['id']] = item['country_name']
  696. continent_dict[item['country_name']] = item['region__name']
  697. # 设备类型数据
  698. device_type_qs = DeviceTypeModel.objects.values('name', 'type')
  699. device_type_dict = {}
  700. for item in device_type_qs:
  701. device_type_dict[item['type']] = item['name']
  702. with transaction.atomic():
  703. if increase_device_qs.exists():
  704. # 国家大洲设备数据
  705. increase_device_country_list = increase_device_qs.values('tb_country').annotate(
  706. count=Count('tb_country')).order_by('count')
  707. increase_device_country_dict = {}
  708. increase_device_continent_dict = {}
  709. for item in increase_device_country_list:
  710. country_name = country_dict.get(item['tb_country'], '未知国家')
  711. continent_name = continent_dict.get(country_name, '未知大洲')
  712. increase_device_country_dict[country_name] = item['count']
  713. if continent_name not in increase_device_continent_dict:
  714. increase_device_continent_dict[continent_name] = 0
  715. increase_device_continent_dict[continent_name] += item['count']
  716. # 设备类型数据
  717. increase_device_type_list = increase_device_qs.values('device_type').annotate(
  718. count=Count('device_type')).order_by('count')
  719. increase_device_type_dict = {}
  720. for item in increase_device_type_list:
  721. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  722. increase_device_type_dict[type_name] = item['count']
  723. # 云存设备类型数据
  724. increase_device_vod_list = increase_device_qs.filter(~Q(cloud_vod=2)).values(
  725. 'device_type').annotate(
  726. count=Count('device_type')).order_by('count')
  727. increase_device_vod_dict = {}
  728. for item in increase_device_vod_list:
  729. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  730. increase_device_vod_dict[type_name] = item['count']
  731. # AI设备类型数据
  732. increase_device_ai_list = increase_device_qs.filter(~Q(is_ai=2)).values('device_type').annotate(
  733. count=Count('device_type')).order_by('count')
  734. increase_device_ai_dict = {}
  735. for item in increase_device_ai_list:
  736. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  737. increase_device_ai_dict[type_name] = item['count']
  738. # 联通设备类型数据
  739. increase_device_unicom_list = increase_device_qs.filter(~Q(mobile_4g=2)).values(
  740. 'device_type').annotate(
  741. count=Count('device_type')).order_by('count')
  742. increase_device_unicom_dict = {}
  743. for item in increase_device_unicom_list:
  744. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  745. increase_device_unicom_dict[type_name] = item['count']
  746. DeviceInfoSummary.objects.create(time=start_time, count=increase_device_count,
  747. query_type=0, created_time=created_time,
  748. country=increase_device_country_dict,
  749. continent=increase_device_continent_dict,
  750. vod_service=increase_device_vod_dict,
  751. ai_service=increase_device_ai_dict,
  752. unicom_service=increase_device_unicom_dict,
  753. device_type=increase_device_type_dict)
  754. if active_device_qs.exists():
  755. # 国家大洲设备数据
  756. active_device_country_list = active_device_qs.values('tb_country').annotate(
  757. count=Count('tb_country')).order_by('count')
  758. active_device_country_dict = {}
  759. active_device_continent_dict = {}
  760. for item in active_device_country_list:
  761. country_name = country_dict.get(item['tb_country'], '未知国家')
  762. continent_name = continent_dict.get(country_name, '未知大洲')
  763. active_device_country_dict[country_name] = item['count']
  764. if continent_name not in active_device_continent_dict:
  765. active_device_continent_dict[continent_name] = 0
  766. active_device_continent_dict[continent_name] += item['count']
  767. # 设备类型数据
  768. active_device_type_list = active_device_qs.values('device_type').annotate(
  769. count=Count('device_type')).order_by('count')
  770. active_device_type_dict = {}
  771. for item in active_device_type_list:
  772. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  773. active_device_type_dict[type_name] = item['count']
  774. # 云存设备类型数据
  775. active_device_vod_list = active_device_qs.filter(~Q(cloud_vod=2)).values('device_type').annotate(
  776. count=Count('device_type')).order_by('count')
  777. active_device_vod_dict = {}
  778. for item in active_device_vod_list:
  779. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  780. active_device_vod_dict[type_name] = item['count']
  781. # AI设备类型数据
  782. active_device_ai_list = active_device_qs.filter(~Q(is_ai=2)).values('device_type').annotate(
  783. count=Count('device_type')).order_by('count')
  784. active_device_ai_dict = {}
  785. for item in active_device_ai_list:
  786. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  787. active_device_ai_dict[type_name] = item['count']
  788. # 联通设备类型数据
  789. active_device_unicom_list = active_device_qs.filter(~Q(mobile_4g=2)).values('device_type').annotate(
  790. count=Count('device_type')).order_by('count')
  791. active_device_unicom_dict = {}
  792. for item in active_device_unicom_list:
  793. type_name = device_type_dict.get(item['device_type'], '未知设备类型')
  794. active_device_unicom_dict[type_name] = item['count']
  795. DeviceInfoSummary.objects.create(time=start_time, count=active_device_count,
  796. query_type=1, created_time=created_time,
  797. country=active_device_country_dict,
  798. continent=active_device_continent_dict,
  799. vod_service=active_device_vod_dict,
  800. ai_service=active_device_ai_dict,
  801. unicom_service=active_device_unicom_dict,
  802. device_type=active_device_type_dict)
  803. return response.json(0)
  804. except Exception as e:
  805. return response.json(500, repr(e))