From c11132e38f68b8d3f5e3d352508df759fe3b7ec9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 15 Jan 2024 17:30:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0drainequip=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E8=BF=94=E5=9B=9Eenvdata=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/enp/models.py | 8 ++++---- apps/enp/serializers.py | 34 +++++++++++++++++++++++++++++++++- apps/enp/tasks.py | 10 ++++++++++ apps/enp/views.py | 27 ++++++++++++++++++++++----- apps/mtm/models.py | 3 +++ 5 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 apps/enp/tasks.py diff --git a/apps/enp/models.py b/apps/enp/models.py index 3014cdee..34a22cf1 100644 --- a/apps/enp/models.py +++ b/apps/enp/models.py @@ -48,9 +48,9 @@ class DrainEquip(BaseModel): 排口/设备关系表 """ drain = models.ForeignKey( - Drain, verbose_name='排口', on_delete=models.CASCADE) + Drain, verbose_name='排口', related_name='drainequip_drain', on_delete=models.CASCADE) equipment = models.ForeignKey( - Equipment, verbose_name='关联设备', on_delete=models.CASCADE) + Equipment, verbose_name='关联设备', related_name='drainequip_equipment', on_delete=models.CASCADE) params_list = models.JSONField('监测参数列表', default=list, null=True) @@ -67,7 +67,7 @@ class EnvData(models.Model): '颗粒物实测(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True) dust_zs = models.DecimalField( '颗粒物折算(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True) - tempreture = models.DecimalField( + temperature = models.DecimalField( '温度(℃)', max_digits=10, decimal_places=4, null=True, blank=True) pressure = models.DecimalField( '压力(kPa)', max_digits=10, decimal_places=4, null=True, blank=True) @@ -97,6 +97,6 @@ class EnvData(models.Model): decimal_places=4, null=True, blank=True) class Meta: - db_table = 'enp.envdata' + db_table = 'enp_envdata' managed = False unique_together = (('equipment', 'time'), ) diff --git a/apps/enp/serializers.py b/apps/enp/serializers.py index f6fb485e..7f938a3a 100644 --- a/apps/enp/serializers.py +++ b/apps/enp/serializers.py @@ -1,8 +1,9 @@ from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT -from .models import Drain, DrainEquip +from .models import Drain, DrainEquip, EnvData from apps.em.serializers import EquipmentSerializer from rest_framework import serializers +from django.utils import timezone class DrainSerializer(CustomModelSerializer): @@ -28,3 +29,34 @@ class DrainEquipSerializer(CustomModelSerializer): model = DrainEquip fields = "__all__" read_only_fields = EXCLUDE_FIELDS_BASE + + +class EnvDataSerializer(CustomModelSerializer): + """Serializer for EnvData model""" + + class Meta: + model = EnvData + fields = "__all__" + + +class DrainEquipEnvSerializer(CustomModelSerializer): + equipment_type = serializers.CharField( + source='equipment.type', read_only=True) + equipment_name = serializers.CharField( + source='equipment.name', read_only=True) + equipment_envdata = serializers.SerializerMethodField() + + def get_equipment_envdata(self, obj): + now = timezone.now() + now_10_before = now - timezone.timedelta(minutes=10) + obj = EnvData.objects.filter( + equipment=obj.equipment, time__gte=now_10_before, time__lte=now).order_by('-time').first() + if obj: + return EnvDataSerializer(instance=obj).data + else: + return {} + + class Meta: + model = DrainEquip + fields = ['equipment', 'equipment_type', + 'equipment_name', 'equipment_envdata'] diff --git a/apps/enp/tasks.py b/apps/enp/tasks.py new file mode 100644 index 00000000..3be6584b --- /dev/null +++ b/apps/enp/tasks.py @@ -0,0 +1,10 @@ +# Create your tasks here +from __future__ import absolute_import, unicode_literals +from datetime import timedelta +from apps.utils.tasks import CustomTask +from celery import shared_task + + +@shared_task(base=CustomTask) +def generate_envdata(): + pass diff --git a/apps/enp/views.py b/apps/enp/views.py index bd1263d7..7bdee52f 100644 --- a/apps/enp/views.py +++ b/apps/enp/views.py @@ -1,9 +1,12 @@ from django.shortcuts import render -from apps.utils.viewsets import CustomModelViewSet, GenericViewSet, ListModelMixin +from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet, ListModelMixin from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin -from .serializers import DrainSerializer, DrainEquipSerializer +from .serializers import DrainSerializer, DrainEquipSerializer, DrainEquipEnvSerializer from .models import Drain, DrainEquip - +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 # Create your views here. @@ -18,7 +21,7 @@ class DrainViewSet(CustomModelViewSet): filterset_fields = ['type', 'cate', 'mgroup'] -class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, GenericViewSet): +class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet): """ list: 排口/设备关系 @@ -27,4 +30,18 @@ class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMi perms_map = {'get': '*', 'post:': 'drain.update', 'delete': 'drain.update'} queryset = DrainEquip.objects.all() serializer_class = DrainEquipSerializer - filterset_fields = ['drain', 'equipment'] + filterset_fields = ['drain', 'equipment', + 'drain__mgroup', 'equipment__mgroup', 'drain__type'] + + def get_serializer_class(self): + has_envdata = self.request.query_params.get('has_envdata', 'no') + if 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) diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 07b6f859..60b2e271 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -119,6 +119,9 @@ class Mgroup(CommonBModel): verbose_name = '测点集' ordering = ['sort', '-create_time'] + def __str__(self) -> str: + return self.name + class TeamMember(BaseModel): team = models.ForeignKey(Team, verbose_name='关联班组',