views.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from rest_framework.views import APIView
  2. from rest_framework.generics import GenericAPIView
  3. from rest_framework.response import Response
  4. import time
  5. from .serializers import SearchEquipSerializer, DeviceListSerializer, DeviceDetailSerializer
  6. from utils.utils import get_equip_list
  7. from utils.JWTAuthentication_diy import MyJWTAuthentication
  8. from utils.permissions import ModulePermission, DeviceDetailPermission, AccessPermission
  9. from utils.MyRateThrottle import DeviceListRateThrottle, DeviceDetailRateThrottle
  10. from utils.paginations import CustomPagination
  11. from utils.db_utils import MongoDBTools
  12. from .models import Device, QXZData
  13. # Create your views here.
  14. class SearchEquip(APIView):
  15. def post(self, request):
  16. serializer = SearchEquipSerializer(data=request.data)
  17. serializer.is_valid(raise_exception=True)
  18. request_data = serializer.validated_data
  19. data = get_equip_list(
  20. d_id=request_data.get("device_id"),
  21. isfullId=request_data.get("isfullId")
  22. )
  23. return Response(data)
  24. class ReceiveQXZ(APIView):
  25. def post(self, request):
  26. data = request.data
  27. if data.get("cmd") == "offline":
  28. imei = data["ext"]["imei"]
  29. try:
  30. device = Device.objects.get(device_id=imei)
  31. device.upl_time = int(time.time())
  32. device.is_online = 0
  33. device.save()
  34. except Exception as e:
  35. print("离线数据保存异常", e)
  36. elif "terminalStatus" in data:
  37. imei = data["StationID"]
  38. status_data = data["terminalStatus"]
  39. if Device.objects.filter(device_id=imei).exists():
  40. device = Device.objects.get(device_id=imei)
  41. else:
  42. device = Device.objects.create(
  43. device_id=imei,
  44. device_type=1
  45. )
  46. if status_data.get("VOLT"):
  47. device.volt = status_data.get("VOLT")
  48. if status_data.get("RSSI"):
  49. device.rssi = status_data.get("RSSI")
  50. if status_data.get("ICCID"):
  51. device.iccid = status_data.get("ICCID")
  52. if status_data.get("longitude"):
  53. device.lng = status_data.get("longitude")
  54. if status_data.get("latitude"):
  55. device.lat = status_data.get("latitude")
  56. if status_data.get("Version"):
  57. device.version = status_data.get("Version")
  58. device.is_online = 1
  59. device.upl_time = int(time.time())
  60. device.save()
  61. elif 'data' in data:
  62. imei = data["StationID"]
  63. save_data = data["data"]
  64. if Device.objects.filter(device_id=imei).exists():
  65. device = Device.objects.get(device_id=imei)
  66. else:
  67. device = Device.objects.create(
  68. device_id=imei,
  69. device_type=1
  70. )
  71. device.is_online = 1
  72. device.upl_time = int(time.time())
  73. device.save()
  74. QXZData.objects.create(
  75. device_id=device,
  76. device_data=save_data,
  77. add_time=int(time.time())
  78. )
  79. return Response("已接收保存")
  80. class DeviceList(GenericAPIView):
  81. authentication_classes = [MyJWTAuthentication]
  82. permission_classes = [ModulePermission]
  83. throttle_classes = [DeviceListRateThrottle]
  84. serializer_class = DeviceListSerializer
  85. queryset = Device.objects.all()
  86. def post(self, request):
  87. uid = int(request.user.get("uid"))
  88. device_queryset = self.get_queryset().filter(owner=uid)
  89. serializer = self.get_serializer(instance=device_queryset, many=True)
  90. return Response(serializer.data)
  91. class DeviceDetail(GenericAPIView):
  92. authentication_classes = [MyJWTAuthentication]
  93. permission_classes = [DeviceDetailPermission]
  94. throttle_classes = [DeviceDetailRateThrottle]
  95. serializer_class = DeviceDetailSerializer
  96. queryset = QXZData.objects.all().order_by("-id")
  97. def post(self, request):
  98. deviceId = request.data.get("device_id")
  99. start_time = int(request.data.get("start_time"))
  100. device_queryset = self.get_queryset().filter(device_id_id=deviceId, add_time__gt=start_time)
  101. serializer = self.get_serializer(instance=device_queryset, many=True)
  102. return Response(serializer.data)
  103. def get_page_or_page_size(request):
  104. try:
  105. page = int(request.query_params['page']) - 1
  106. if page < 0:
  107. page = 0
  108. except Exception as e:
  109. page = 0
  110. try:
  111. page_size = int(request.query_params['page_size'])
  112. if page_size < 0:
  113. page_size = 10
  114. except Exception as e:
  115. page_size = 10
  116. return page, page_size
  117. class QxzDeviceListView(APIView):
  118. permission_classes = [AccessPermission]
  119. def get(self, request, *args, **kwargs):
  120. """获取气象站设备列表接口"""
  121. uid = request.uid
  122. wheres = {
  123. '$or': [
  124. {'owner_uid': uid},
  125. {'user_dealer': uid}
  126. ]
  127. },
  128. project = {
  129. 'device_id': '$device_id',
  130. 'uptime': '$uptime',
  131. 'device_status': '$device_status',
  132. 'lng': '$lng',
  133. 'lat': '$lat'
  134. }
  135. page, page_size = get_page_or_page_size(request)
  136. skip, limit = page * page_size, page_size
  137. m = MongoDBTools(db_name='smartfarming', table_name='sa_device')
  138. data = m.find_many(wheres=wheres, options=project, skip=skip, limit=limit)
  139. result = []
  140. for item in data:
  141. result.append(item)
  142. return Response(result)