171 lines
5.0 KiB
Python
171 lines
5.0 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
|
|
|
|
|
|
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 Drain2Serializer(CustomModelSerializer):
|
|
equip_data = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Drain
|
|
fields = "__all__"
|
|
read_only_fields = EXCLUDE_FIELDS_DEPT
|
|
|
|
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', 'name', 'type')
|
|
eids = [f"'{e['id']}'" for e in odata]
|
|
eids_str = ','.join(eids)
|
|
sql_str = f'''
|
|
SELECT
|
|
equipment_id,
|
|
AVG ( tsp ) AS avg_tsp,
|
|
SUM ( duration_online ) AS total_duration_online,
|
|
SUM ( duration_run ) AS total_duration_run,
|
|
SUM ( duration_standby ) AS total_duration_standby,
|
|
MAX ( last_running_state ) AS last_running_state
|
|
FROM
|
|
(
|
|
SELECT
|
|
equipment_id,
|
|
tsp,
|
|
running_state,
|
|
CASE
|
|
|
|
WHEN is_online = 1 THEN
|
|
TIME - LAG ( TIME ) OVER ( PARTITION BY equipment_id ORDER BY TIME ) ELSE'0'
|
|
END AS duration_online,
|
|
CASE
|
|
|
|
WHEN running_state = 10 THEN
|
|
TIME - LAG ( TIME ) OVER ( PARTITION BY equipment_id ORDER BY TIME ) ELSE'0'
|
|
END AS duration_run,
|
|
CASE
|
|
|
|
WHEN running_state = 20 THEN
|
|
TIME - LAG ( TIME ) OVER ( PARTITION BY equipment_id ORDER BY TIME ) ELSE'0'
|
|
END AS duration_standby,
|
|
CASE
|
|
|
|
WHEN ROW_NUMBER ( ) OVER ( PARTITION BY equipment_id ORDER BY TIME DESC ) = 1 THEN
|
|
running_state ELSE NULL
|
|
END AS last_running_state
|
|
FROM
|
|
enp_envdata
|
|
WHERE
|
|
running_state IN ( 10, 20 )
|
|
AND TIME >= '{today}' -- 替换成想查询的开始时间
|
|
|
|
AND TIME <= '{today_last}' -- 替换成想查询的结束时间
|
|
|
|
AND equipment_id IN ( {eids_str} )
|
|
) AS durations
|
|
GROUP BY
|
|
equipment_id;
|
|
'''
|
|
res = query_all_dict(sql_str)
|
|
data = {}
|
|
for i in res:
|
|
data[i['equipment_id']] = i
|
|
|
|
for i in odata:
|
|
i.update(data.get(i['id'], {
|
|
"avg_tsp": None,
|
|
"total_duration_online": None,
|
|
"total_duration_run": None,
|
|
"total_duration_standby": None,
|
|
"last_running_state": None,
|
|
}))
|
|
|
|
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__"
|
|
|
|
|
|
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').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__"
|