feat: 添加drain2serializer
This commit is contained in:
parent
46d8bd7ef6
commit
af5a6c3d55
|
@ -4,6 +4,8 @@ from .models import Drain, DrainEquip, EnvData, VehicleAccess, CarWash
|
||||||
from apps.em.serializers import EquipmentSerializer
|
from apps.em.serializers import EquipmentSerializer
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from datetime import datetime
|
||||||
|
from apps.utils.sql import query_all_dict
|
||||||
|
|
||||||
|
|
||||||
class DrainSerializer(CustomModelSerializer):
|
class DrainSerializer(CustomModelSerializer):
|
||||||
|
@ -20,6 +22,86 @@ class DrainSerializer(CustomModelSerializer):
|
||||||
return super().validate(attrs)
|
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):
|
class DrainEquipSerializer(CustomModelSerializer):
|
||||||
equipment_type = serializers.CharField(
|
equipment_type = serializers.CharField(
|
||||||
source='equipment.type', read_only=True)
|
source='equipment.type', read_only=True)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet, ListModelMixin
|
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet, ListModelMixin
|
||||||
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
|
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
|
||||||
from .serializers import DrainSerializer, DrainEquipSerializer, DrainEquipEnvSerializer, VehicleAccessSerializer, EnvDataSerializer, EnvDataExportSerializer, CarWashSerializer
|
from .serializers import DrainSerializer, DrainEquipSerializer, DrainEquipEnvSerializer, VehicleAccessSerializer, EnvDataSerializer, EnvDataExportSerializer, CarWashSerializer, Drain2Serializer
|
||||||
from .models import Drain, DrainEquip, VehicleAccess, EnvData, CarWash
|
from .models import Drain, DrainEquip, VehicleAccess, EnvData, CarWash
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from apps.utils.sql import query_all_dict
|
from apps.utils.sql import query_all_dict
|
||||||
|
@ -21,6 +21,19 @@ class DrainViewSet(CustomModelViewSet):
|
||||||
serializer_class = DrainSerializer
|
serializer_class = DrainSerializer
|
||||||
filterset_fields = ['type', 'cate', 'mgroup']
|
filterset_fields = ['type', 'cate', '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),
|
||||||
|
])
|
||||||
|
def list(self, request, *args, **kwargs):
|
||||||
|
return super().list(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet):
|
class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet):
|
||||||
"""
|
"""
|
||||||
|
@ -37,7 +50,7 @@ class DrainEquipViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMi
|
||||||
|
|
||||||
def get_serializer_class(self):
|
def get_serializer_class(self):
|
||||||
has_envdata = self.request.query_params.get('has_envdata', 'no')
|
has_envdata = self.request.query_params.get('has_envdata', 'no')
|
||||||
if has_envdata == 'yes':
|
if self.request.method == 'GET' and has_envdata == 'yes':
|
||||||
return DrainEquipEnvSerializer
|
return DrainEquipEnvSerializer
|
||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
|
@ -102,3 +115,4 @@ class CarWashViewSet(ListModelMixin, CustomGenericViewSet):
|
||||||
"station": ['exact'],
|
"station": ['exact'],
|
||||||
"start_time": ['exact', 'gte', 'lte', 'year', 'month', 'day'],
|
"start_time": ['exact', 'gte', 'lte', 'year', 'month', 'day'],
|
||||||
}
|
}
|
||||||
|
ordering = ['-start_time']
|
||||||
|
|
Loading…
Reference in New Issue