fix: em可返回envdata
This commit is contained in:
parent
820f316511
commit
4ddfbb266c
|
@ -15,7 +15,8 @@ from django.db import transaction
|
|||
from apps.em.services import daoru_equipment
|
||||
from rest_framework.response import Response
|
||||
from django.conf import settings
|
||||
from django.db.models import Count, Case, When, IntegerField, Max
|
||||
from django.db.models import Count, Case, When, IntegerField, Max, OuterRef, Subquery
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
# Create your views here.
|
||||
|
||||
|
@ -76,15 +77,25 @@ class EquipmentViewSet(CustomModelViewSet):
|
|||
|
||||
def add_info_for_list(self, data):
|
||||
if self.request.query_params.get('has_envdata', 'no') == 'yes':
|
||||
now = timezone.now()
|
||||
now = timezone.localtime()
|
||||
now_10_before = now - timezone.timedelta(minutes=10)
|
||||
data_ids = [item['id'] for item in data]
|
||||
from apps.enp.models import EnvData
|
||||
from apps.enp.serializers import EnvDataSerializer
|
||||
last_envdata_qs = EnvData.objects.filter(equipment_id__in=data_ids, time__gte=now_10_before, time__lte=now).values('equipment_id').annotate(
|
||||
last_time=Max('time'))
|
||||
# 子查询获取每个 equipment_id 对应的最大时间戳
|
||||
last_time_subquery = EnvData.objects.filter(
|
||||
equipment_id=OuterRef('equipment_id'),
|
||||
time__gte=now_10_before,
|
||||
time__lte=now
|
||||
).order_by('-time').values('time')[:1]
|
||||
|
||||
# 主查询,获取每个 equipment_id 对应的完整记录
|
||||
last_envdata_qs = EnvData.objects.filter(
|
||||
equipment_id__in=data_ids,
|
||||
time=Subquery(last_time_subquery)
|
||||
)
|
||||
envdata = EnvDataSerializer(last_envdata_qs, many=True).data
|
||||
envdata_dict = {item['equipment_id']: item for item in envdata}
|
||||
envdata_dict = {item['equipment']: item for item in envdata}
|
||||
for item in data:
|
||||
item['envdata'] = envdata_dict.get(item['id'], {})
|
||||
return data
|
||||
|
|
Loading…
Reference in New Issue