153 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| from django.shortcuts import render
 | |
| from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet, ListModelMixin
 | |
| from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
 | |
| from .serializers import DrainSerializer, DrainEquipSerializer, DrainEquipEnvSerializer, VehicleAccessSerializer, EnvDataSerializer, EnvDataExportSerializer, CarWashSerializer, Drain2Serializer
 | |
| from .models import Drain, DrainEquip, VehicleAccess, EnvData, CarWash
 | |
| from rest_framework.decorators import action
 | |
| from apps.utils.sql import query_all_dict
 | |
| from drf_yasg.utils import swagger_auto_schema
 | |
| from drf_yasg import openapi
 | |
| from rest_framework.response import Response
 | |
| from django.db.models import Count, Case, When, IntegerField
 | |
| # Create your views here.
 | |
| 
 | |
| 
 | |
| class DrainViewSet(CustomModelViewSet):
 | |
|     """
 | |
|     list: 排口/污染源
 | |
| 
 | |
|     排口/污染源
 | |
|     """
 | |
|     queryset = Drain.objects.all()
 | |
|     serializer_class = DrainSerializer
 | |
|     filterset_fields = ['type', 'cate', 'mgroup', 'level']
 | |
|     select_related_fields = ['mgroup']
 | |
| 
 | |
|     def get_serializer_class(self):
 | |
|         has_equipdata = self.request.query_params.get('has_equipdata', 'no')
 | |
|         if self.request.method == 'GET' and has_equipdata == 'yes':
 | |
|             return Drain2Serializer
 | |
|         return super().get_serializer_class()
 | |
| 
 | |
|     @swagger_auto_schema(manual_parameters=[
 | |
|         openapi.Parameter(name="has_equipdata", in_=openapi.IN_QUERY, description="Include equip data in the response",
 | |
|                           type=openapi.TYPE_STRING, enum=["yes", "no"], required=False),
 | |
|         openapi.Parameter(name="query", in_=openapi.IN_QUERY, description="定制返回数据",
 | |
|                           type=openapi.TYPE_STRING, required=False),
 | |
|     ])
 | |
|     def list(self, request, *args, **kwargs):
 | |
|         return super().list(request, *args, **kwargs)
 | |
| 
 | |
|     @action(methods=['get'], detail=False, perms_map={'get': '*'})
 | |
|     def count_cate(self, request, *args, **kwargs):
 | |
|         """排口分类数量
 | |
| 
 | |
|         排口分类数量
 | |
|         """
 | |
|         queryset = self.filter_queryset(self.get_queryset())
 | |
|         result = queryset.aggregate(
 | |
|             count=Count('id'),
 | |
|             count_product=Count(
 | |
|                 Case(When(cate='product', then=1), output_field=IntegerField())),
 | |
|             count_mtrans=Count(
 | |
|                 Case(When(cate='mtrans', then=1), output_field=IntegerField())),
 | |
|             count_mstore=Count(
 | |
|                 Case(When(cate='mstore', then=1), output_field=IntegerField())),
 | |
|         )
 | |
|         json_result = {
 | |
|             'count': result['count'],
 | |
|             'count_product': result['count_product'],
 | |
|             'count_mtrans': result['count_mtrans'],
 | |
|             'count_mstore': result['count_mstore']
 | |
|         }
 | |
| 
 | |
|         return Response(json_result)
 | |
| 
 | |
| 
 | |
| class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet):
 | |
|     """
 | |
|     list: 排口/设备关系
 | |
| 
 | |
|     排口/设备关系
 | |
|     """
 | |
|     perms_map = {'get': '*', 'post:': 'drain.update', 'delete': 'drain.update'}
 | |
|     queryset = DrainEquip.objects.all()
 | |
|     serializer_class = DrainEquipSerializer
 | |
|     select_related_fields = ['equipment', 'drain']
 | |
|     filterset_fields = ['drain', 'equipment',
 | |
|                         'drain__mgroup', 'equipment__mgroup', 'drain__type', 'equipment__type']
 | |
| 
 | |
|     def get_serializer_class(self):
 | |
|         has_envdata = self.request.query_params.get('has_envdata', 'no')
 | |
|         if self.request.method == 'GET' and has_envdata == 'yes':
 | |
|             return DrainEquipEnvSerializer
 | |
|         return super().get_serializer_class()
 | |
| 
 | |
|     @swagger_auto_schema(manual_parameters=[
 | |
|         openapi.Parameter(name="has_envdata", in_=openapi.IN_QUERY, description="Include environmental data in the response",
 | |
|                           type=openapi.TYPE_STRING, enum=["yes", "no"], required=False),
 | |
|     ])
 | |
|     def list(self, request, *args, **kwargs):
 | |
|         return super().list(request, *args, **kwargs)
 | |
| 
 | |
| 
 | |
| class VehicleAccessViewSet(ListModelMixin, CustomGenericViewSet):
 | |
|     """
 | |
|     list: 车辆出入记录
 | |
| 
 | |
|     车辆出入记录
 | |
|     """
 | |
|     perms_map = {'get': '*'}
 | |
|     queryset = VehicleAccess.objects.all()
 | |
|     serializer_class = VehicleAccessSerializer
 | |
|     filterset_fields = {
 | |
|         "vehicle_number": ['icontains'],
 | |
|         "emission_standard": ['exact', 'in'],
 | |
|         "type": ['exact', 'in'],
 | |
|         "is_new_energy": ["exact"],
 | |
|         "access_time": ['gte', 'lte', 'year', 'month', 'day', 'quarter', 'week']
 | |
|     }
 | |
| 
 | |
| 
 | |
| class EnvDataViewSet(ListModelMixin, CustomGenericViewSet):
 | |
|     """
 | |
|     list: 环保时序数据
 | |
| 
 | |
|     环保时序数据
 | |
|     """
 | |
|     perms_map = {'get': '*'}
 | |
|     queryset = EnvData.objects.all()
 | |
|     serializer_class = EnvDataSerializer
 | |
|     filterset_fields = {
 | |
|         "time": ['exact', 'gte', 'lte', 'year', 'month', 'day'],
 | |
|         "equipment": ['exact'],
 | |
|     }
 | |
|     ordering_fields = ['time']
 | |
|     ordering = ['-time']
 | |
| 
 | |
|     @action(methods=['post'], detail=False, perms_map={'post': '*'},
 | |
|             serializer_class=EnvDataExportSerializer)
 | |
|     def export_excel(self, request, *args, **kwargs):
 | |
|         """导出Excel
 | |
| 
 | |
|         导出Excel
 | |
|         """
 | |
|         return Response()
 | |
| 
 | |
| 
 | |
| class CarWashViewSet(ListModelMixin, CustomGenericViewSet):
 | |
|     """
 | |
|     list: 洗车记录
 | |
| 
 | |
|     洗车记录
 | |
|     """
 | |
|     perms_map = {'get': '*'}
 | |
|     queryset = CarWash.objects.all()
 | |
|     serializer_class = CarWashSerializer
 | |
|     select_related_fields = ['station']
 | |
|     filterset_fields = {
 | |
|         "station": ['exact'],
 | |
|         "start_time": ['exact', 'gte', 'lte', 'year', 'month', 'day'],
 | |
|     }
 | |
|     ordering = ['-start_time']
 |