129 lines
4.5 KiB
Python
129 lines
4.5 KiB
Python
from apps.utils.serializers import CustomModelSerializer
|
|
from apps.utils.constants import EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT
|
|
from .models import Drain, DrainEquip, EnvData, VehicleAccess, CarWash
|
|
from apps.em.serializers import EquipmentSerializer
|
|
from rest_framework import serializers
|
|
from django.utils import timezone
|
|
from datetime import datetime
|
|
from apps.utils.sql import query_all_dict
|
|
from apps.enp.sql import duration_hour_one_equip
|
|
|
|
|
|
class DrainSerializer(CustomModelSerializer):
|
|
"""Serializer for Drain model"""
|
|
|
|
mgroup_name = serializers.CharField(source="mgroup.name", read_only=True)
|
|
|
|
class Meta:
|
|
model = Drain
|
|
fields = "__all__"
|
|
read_only_fields = EXCLUDE_FIELDS_DEPT
|
|
|
|
def validate(self, attrs):
|
|
attrs["belong_dept"] = attrs["mgroup"].belong_dept
|
|
return super().validate(attrs)
|
|
|
|
|
|
class DrainWithEquipBaseSerializer(DrainSerializer):
|
|
equip_data = serializers.SerializerMethodField()
|
|
|
|
def get_equip_data(self, obj):
|
|
equips = obj.equipments.all()
|
|
odata = equips.values("id", "number", "name", "type", "running_state")
|
|
return odata
|
|
|
|
class DrainWithEquipEnpSerializer(DrainSerializer):
|
|
equip_data = serializers.SerializerMethodField()
|
|
|
|
def get_equip_data(self, obj):
|
|
equips = obj.equipments.all()
|
|
now = datetime.now()
|
|
today = str(now)[:10] + " 00:00:00"
|
|
today_last = str(now)[:10] + " 23:59:59"
|
|
odata = equips.values("id", "number", "name", "type", "running_state")
|
|
for i in odata:
|
|
i.update(
|
|
{
|
|
"avg_tsp": None,
|
|
"duration_offline": 0,
|
|
"duration_run": 0,
|
|
"duration_stop": 0,
|
|
}
|
|
)
|
|
equipment_id = i["id"]
|
|
sql_str = duration_hour_one_equip.format(equipment_id=equipment_id, start_time=today, end_time=today_last)
|
|
res = query_all_dict(sql_str)
|
|
if res:
|
|
i.update(res[0])
|
|
|
|
return odata
|
|
|
|
|
|
class DrainEquipSerializer(CustomModelSerializer):
|
|
equipment_type = serializers.CharField(source="equipment.type", read_only=True)
|
|
equipment_name = serializers.CharField(source="equipment.name", read_only=True)
|
|
|
|
class Meta:
|
|
model = DrainEquip
|
|
fields = "__all__"
|
|
read_only_fields = EXCLUDE_FIELDS_BASE
|
|
|
|
|
|
class EnvDataSerializer(CustomModelSerializer):
|
|
"""Serializer for EnvData model"""
|
|
|
|
class Meta:
|
|
model = EnvData
|
|
fields = "__all__"
|
|
|
|
def to_representation(self, instance):
|
|
representation = super().to_representation(instance)
|
|
for field_name in ("dust_rtd", "dust_zs", "temperature", "pressure", "speed", "humidity", "flux", "pm25", "pm10", "tsp", "wind_speed", "so2_rtd", "so2_zs", "nox_rtd", "nox_zs", "o2"):
|
|
if representation[field_name]:
|
|
representation[field_name] = round(representation[field_name], 4)
|
|
return representation
|
|
|
|
|
|
class DrainEquipEnvSerializer(CustomModelSerializer):
|
|
equipment_number = serializers.CharField(source="equipment.number", read_only=True)
|
|
equipment_type = serializers.CharField(source="equipment.type", read_only=True)
|
|
equipment_name = serializers.CharField(source="equipment.name", read_only=True)
|
|
equipment_envdata = serializers.SerializerMethodField()
|
|
equipment_ = EquipmentSerializer(source="equipment", read_only=True)
|
|
drain_ = DrainSerializer(source="drain", read_only=True)
|
|
|
|
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").select_related("equipment").first()
|
|
if obj:
|
|
return EnvDataSerializer(instance=obj).data
|
|
else:
|
|
return {}
|
|
|
|
class Meta:
|
|
model = DrainEquip
|
|
fields = "__all__"
|
|
|
|
|
|
class VehicleAccessSerializer(CustomModelSerializer):
|
|
"""Serializer for VehicleAccess model"""
|
|
|
|
class Meta:
|
|
model = VehicleAccess
|
|
fields = "__all__"
|
|
read_only_fields = EXCLUDE_FIELDS_BASE
|
|
|
|
|
|
class EnvDataExportSerializer(serializers.Serializer):
|
|
time = serializers.DateTimeField(label="时间")
|
|
type = serializers.ChoiceField(label="导出类型", choices=["hour", "day", "week", "month", "season", "year"])
|
|
|
|
|
|
class CarWashSerializer(CustomModelSerializer):
|
|
station_name = serializers.CharField(source="station.name", read_only=True)
|
|
|
|
class Meta:
|
|
model = CarWash
|
|
fields = "__all__"
|