CronTaskController.py 2.5 KB

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