|
@@ -1,16 +1,14 @@
|
|
|
from rest_framework.views import APIView
|
|
from rest_framework.views import APIView
|
|
|
-from rest_framework.generics import GenericAPIView
|
|
|
|
|
from rest_framework.response import Response
|
|
from rest_framework.response import Response
|
|
|
-import time
|
|
|
|
|
|
|
+from django.core.cache import cache as default_cache
|
|
|
|
|
|
|
|
-from .serializers import SearchEquipSerializer, DeviceListSerializer, DeviceDetailSerializer
|
|
|
|
|
|
|
+from .serializers import SearchEquipSerializer, QxzDeviceDetailSerializer
|
|
|
|
|
+from utils.JWTAuthentication_diy import APIAuthentication
|
|
|
|
|
+from utils.permissions import QXZDeviceDetailPermission
|
|
|
|
|
+from utils.MyRateThrottle import QxzDeviceListRateThrottle, QxzDeviceDetailRateThrottle
|
|
|
from utils.utils import get_equip_list
|
|
from utils.utils import get_equip_list
|
|
|
-from utils.JWTAuthentication_diy import MyJWTAuthentication
|
|
|
|
|
-from utils.permissions import ModulePermission, DeviceDetailPermission, AccessPermission
|
|
|
|
|
-from utils.MyRateThrottle import DeviceListRateThrottle, DeviceDetailRateThrottle
|
|
|
|
|
-from utils.paginations import CustomPagination
|
|
|
|
|
from utils.db_utils import MongoDBTools
|
|
from utils.db_utils import MongoDBTools
|
|
|
-from .models import Device, QXZData
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create your views here.
|
|
# Create your views here.
|
|
@@ -27,124 +25,22 @@ class SearchEquip(APIView):
|
|
|
return Response(data)
|
|
return Response(data)
|
|
|
|
|
|
|
|
|
|
|
|
|
-class ReceiveQXZ(APIView):
|
|
|
|
|
- def post(self, request):
|
|
|
|
|
- data = request.data
|
|
|
|
|
- if data.get("cmd") == "offline":
|
|
|
|
|
- imei = data["ext"]["imei"]
|
|
|
|
|
- try:
|
|
|
|
|
- device = Device.objects.get(device_id=imei)
|
|
|
|
|
- device.upl_time = int(time.time())
|
|
|
|
|
- device.is_online = 0
|
|
|
|
|
- device.save()
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- print("离线数据保存异常", e)
|
|
|
|
|
- elif "terminalStatus" in data:
|
|
|
|
|
- imei = data["StationID"]
|
|
|
|
|
- status_data = data["terminalStatus"]
|
|
|
|
|
- if Device.objects.filter(device_id=imei).exists():
|
|
|
|
|
- device = Device.objects.get(device_id=imei)
|
|
|
|
|
- else:
|
|
|
|
|
- device = Device.objects.create(
|
|
|
|
|
- device_id=imei,
|
|
|
|
|
- device_type=1
|
|
|
|
|
- )
|
|
|
|
|
- if status_data.get("VOLT"):
|
|
|
|
|
- device.volt = status_data.get("VOLT")
|
|
|
|
|
- if status_data.get("RSSI"):
|
|
|
|
|
- device.rssi = status_data.get("RSSI")
|
|
|
|
|
- if status_data.get("ICCID"):
|
|
|
|
|
- device.iccid = status_data.get("ICCID")
|
|
|
|
|
- if status_data.get("longitude"):
|
|
|
|
|
- device.lng = status_data.get("longitude")
|
|
|
|
|
- if status_data.get("latitude"):
|
|
|
|
|
- device.lat = status_data.get("latitude")
|
|
|
|
|
- if status_data.get("Version"):
|
|
|
|
|
- device.version = status_data.get("Version")
|
|
|
|
|
- device.is_online = 1
|
|
|
|
|
- device.upl_time = int(time.time())
|
|
|
|
|
- device.save()
|
|
|
|
|
-
|
|
|
|
|
- elif 'data' in data:
|
|
|
|
|
- imei = data["StationID"]
|
|
|
|
|
- save_data = data["data"]
|
|
|
|
|
- if Device.objects.filter(device_id=imei).exists():
|
|
|
|
|
- device = Device.objects.get(device_id=imei)
|
|
|
|
|
- else:
|
|
|
|
|
- device = Device.objects.create(
|
|
|
|
|
- device_id=imei,
|
|
|
|
|
- device_type=1
|
|
|
|
|
- )
|
|
|
|
|
- device.is_online = 1
|
|
|
|
|
- device.upl_time = int(time.time())
|
|
|
|
|
- device.save()
|
|
|
|
|
-
|
|
|
|
|
- QXZData.objects.create(
|
|
|
|
|
- device_id=device,
|
|
|
|
|
- device_data=save_data,
|
|
|
|
|
- add_time=int(time.time())
|
|
|
|
|
- )
|
|
|
|
|
- return Response("已接收保存")
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-class DeviceList(GenericAPIView):
|
|
|
|
|
- authentication_classes = [MyJWTAuthentication]
|
|
|
|
|
- permission_classes = [ModulePermission]
|
|
|
|
|
- throttle_classes = [DeviceListRateThrottle]
|
|
|
|
|
- serializer_class = DeviceListSerializer
|
|
|
|
|
- queryset = Device.objects.all()
|
|
|
|
|
-
|
|
|
|
|
- def post(self, request):
|
|
|
|
|
- uid = int(request.user.get("uid"))
|
|
|
|
|
- device_queryset = self.get_queryset().filter(owner=uid)
|
|
|
|
|
- serializer = self.get_serializer(instance=device_queryset, many=True)
|
|
|
|
|
- return Response(serializer.data)
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-class DeviceDetail(GenericAPIView):
|
|
|
|
|
- authentication_classes = [MyJWTAuthentication]
|
|
|
|
|
- permission_classes = [DeviceDetailPermission]
|
|
|
|
|
- throttle_classes = [DeviceDetailRateThrottle]
|
|
|
|
|
- serializer_class = DeviceDetailSerializer
|
|
|
|
|
- queryset = QXZData.objects.all().order_by("-id")
|
|
|
|
|
-
|
|
|
|
|
- def post(self, request):
|
|
|
|
|
- deviceId = request.data.get("device_id")
|
|
|
|
|
- start_time = int(request.data.get("start_time"))
|
|
|
|
|
- device_queryset = self.get_queryset().filter(device_id_id=deviceId, add_time__gt=start_time)
|
|
|
|
|
- serializer = self.get_serializer(instance=device_queryset, many=True)
|
|
|
|
|
- return Response(serializer.data)
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-def get_page_or_page_size(request):
|
|
|
|
|
- try:
|
|
|
|
|
- page = int(request.query_params['page']) - 1
|
|
|
|
|
- if page < 0:
|
|
|
|
|
- page = 0
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- page = 0
|
|
|
|
|
-
|
|
|
|
|
- try:
|
|
|
|
|
- page_size = int(request.query_params['page_size'])
|
|
|
|
|
- if page_size < 0:
|
|
|
|
|
- page_size = 10
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- page_size = 10
|
|
|
|
|
- return page, page_size
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
class QxzDeviceListView(APIView):
|
|
class QxzDeviceListView(APIView):
|
|
|
- permission_classes = [AccessPermission]
|
|
|
|
|
|
|
+ authentication_classes = APIAuthentication
|
|
|
|
|
+ throttle_classes = [QxzDeviceListRateThrottle]
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
def get(self, request, *args, **kwargs):
|
|
|
"""获取气象站设备列表接口"""
|
|
"""获取气象站设备列表接口"""
|
|
|
- uid = request.uid
|
|
|
|
|
|
|
+ uid = request.user
|
|
|
|
|
+ # uid = 896
|
|
|
|
|
+
|
|
|
wheres = {
|
|
wheres = {
|
|
|
|
|
+ "device_type_id":5,
|
|
|
'$or': [
|
|
'$or': [
|
|
|
{'owner_uid': uid},
|
|
{'owner_uid': uid},
|
|
|
{'user_dealer': uid}
|
|
{'user_dealer': uid}
|
|
|
]
|
|
]
|
|
|
- },
|
|
|
|
|
|
|
+ }
|
|
|
project = {
|
|
project = {
|
|
|
'device_id': '$device_id',
|
|
'device_id': '$device_id',
|
|
|
'uptime': '$uptime',
|
|
'uptime': '$uptime',
|
|
@@ -152,13 +48,53 @@ class QxzDeviceListView(APIView):
|
|
|
'lng': '$lng',
|
|
'lng': '$lng',
|
|
|
'lat': '$lat'
|
|
'lat': '$lat'
|
|
|
}
|
|
}
|
|
|
- page, page_size = get_page_or_page_size(request)
|
|
|
|
|
- skip, limit = page * page_size, page_size
|
|
|
|
|
m = MongoDBTools(db_name='smartfarming', table_name='sa_device')
|
|
m = MongoDBTools(db_name='smartfarming', table_name='sa_device')
|
|
|
- data = m.find_many(wheres=wheres, options=project, skip=skip, limit=limit)
|
|
|
|
|
- result = []
|
|
|
|
|
|
|
+ data = m.find_many(wheres=wheres, options=project)
|
|
|
|
|
+ if data:
|
|
|
|
|
+ total_counts = data.count()
|
|
|
|
|
+ else:
|
|
|
|
|
+ total_counts = 0
|
|
|
|
|
+ result = {"total_counts":total_counts,"items":[]}
|
|
|
|
|
+ qxz_list_cache = []
|
|
|
for item in data:
|
|
for item in data:
|
|
|
- result.append(item)
|
|
|
|
|
|
|
+ result["items"].append(item)
|
|
|
|
|
+ qxz_list_cache.append(item["device_id"])
|
|
|
|
|
+ default_cache.set(str(uid)+"_qxz_list", qxz_list_cache,60*5)
|
|
|
return Response(result)
|
|
return Response(result)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class QxzDeviceDetailView(APIView):
|
|
|
|
|
+ authentication_classes = [APIAuthentication]
|
|
|
|
|
+ permission_classes = [QXZDeviceDetailPermission]
|
|
|
|
|
+ throttle_classes = [QxzDeviceDetailRateThrottle]
|
|
|
|
|
+
|
|
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
|
|
+ serializer = QxzDeviceDetailSerializer(data=request.query_params)
|
|
|
|
|
+ serializer.is_valid(raise_exception=True)
|
|
|
|
|
+ request_data = serializer.validated_data
|
|
|
|
|
+ start_time, device_id = request_data["start_timestamp"], request_data["device_id"]
|
|
|
|
|
+
|
|
|
|
|
+ conf_wheres = {
|
|
|
|
|
+ "device_id":device_id,
|
|
|
|
|
+ }
|
|
|
|
|
+ conf_m = MongoDBTools(db_name='smartfarming', table_name='sa_qxz_conf')
|
|
|
|
|
+ conf_data = conf_m.find_one(wheres=conf_wheres)
|
|
|
|
|
+ conf_data.pop("id")
|
|
|
|
|
+ conf_data.pop("device_id")
|
|
|
|
|
+ conf_data.pop("uptime")
|
|
|
|
|
+ conf_data = dict(sorted(conf_data.items(), key=lambda e:int(e[0].split("e")[1])))
|
|
|
|
|
+ result = {"conf":conf_data,"items":[]}
|
|
|
|
|
+
|
|
|
|
|
+ data_m = MongoDBTools(db_name='smartfarming', table_name='sa_qxz_data')
|
|
|
|
|
+ data_wheres = {
|
|
|
|
|
+ "device_id": device_id,
|
|
|
|
|
+ "uptime": {"$gt":start_time}
|
|
|
|
|
+ }
|
|
|
|
|
+ data = data_m.find_many(wheres=data_wheres)
|
|
|
|
|
+
|
|
|
|
|
+ for item in data:
|
|
|
|
|
+ item.pop("id")
|
|
|
|
|
+ item.pop("device_id")
|
|
|
|
|
+ result["items"].append(item)
|
|
|
|
|
+ return Response(result)
|
|
|
|
|
+
|