152 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			152 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'],
 | 
						|
        "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']
 |