CronTaskController.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # @Author : Rocky
  2. # @File : CronTaskController.py
  3. # @Time : 2023/12/11 15:47
  4. import threading
  5. from django.views import View
  6. from Object.RedisObject import RedisObject
  7. from Object.ResponseObject import ResponseObject
  8. from Service.EquipmentInfoService import EQUIPMENT_INFO_DICT, EQUIPMENT_INFO_KEY_LIST
  9. # 每次写入的数据条数
  10. size = 1000
  11. class CronTaskView(View):
  12. def get(self, request, *args, **kwargs):
  13. request.encoding = 'utf-8'
  14. operation = kwargs.get('operation')
  15. return self.validation(request.GET, request, operation)
  16. def post(self, request, *args, **kwargs):
  17. request.encoding = 'utf-8'
  18. operation = kwargs.get('operation')
  19. return self.validation(request.POST, request, operation)
  20. def validation(self, request_dict, request, operation):
  21. response = ResponseObject()
  22. if operation == 'equipment_info':
  23. return self.equipment_info(response)
  24. else:
  25. return response.json(414)
  26. @classmethod
  27. def equipment_info(cls, response):
  28. for equipment_info_key in EQUIPMENT_INFO_KEY_LIST:
  29. # 异步保存数据
  30. kwargs = {
  31. 'equipment_info_key': equipment_info_key
  32. }
  33. push_thread = threading.Thread(
  34. target=cls.save_equipment_info,
  35. kwargs=kwargs)
  36. push_thread.start()
  37. return response.json(0)
  38. @staticmethod
  39. def save_equipment_info(**kwargs):
  40. equipment_info_key = kwargs['equipment_info_key']
  41. equipment_info_model = EQUIPMENT_INFO_DICT[equipment_info_key]
  42. # 读取缓存的前n条数据批量写入
  43. redis_obj = RedisObject()
  44. equipment_info_redis_list = redis_obj.lrange(equipment_info_key, 0, size - 1)
  45. redis_obj.ltrim(equipment_info_key, size, -1)
  46. equipment_info_list = []
  47. for equipment_info in equipment_info_redis_list:
  48. equipment_info_data = eval(equipment_info)
  49. # 设备昵称存在表情,解码utf-8
  50. if equipment_info_data.get('device_nick_name') is not None:
  51. equipment_info_data['device_nick_name'] = equipment_info_data['device_nick_name']. \
  52. encode('UTF-8', 'ignore').decode('UTF-8')
  53. equipment_info_list.append(equipment_info_model(**equipment_info_data))
  54. equipment_info_model.objects.bulk_create(equipment_info_list)