fix: em可返回envdata

This commit is contained in:
caoqianming 2024-02-28 17:20:28 +08:00
parent 820f316511
commit 4ddfbb266c
1 changed files with 16 additions and 5 deletions

View File

@ -15,7 +15,8 @@ from django.db import transaction
from apps.em.services import daoru_equipment from apps.em.services import daoru_equipment
from rest_framework.response import Response from rest_framework.response import Response
from django.conf import settings 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. # Create your views here.
@ -76,15 +77,25 @@ class EquipmentViewSet(CustomModelViewSet):
def add_info_for_list(self, data): def add_info_for_list(self, data):
if self.request.query_params.get('has_envdata', 'no') == 'yes': if self.request.query_params.get('has_envdata', 'no') == 'yes':
now = timezone.now() now = timezone.localtime()
now_10_before = now - timezone.timedelta(minutes=10) now_10_before = now - timezone.timedelta(minutes=10)
data_ids = [item['id'] for item in data] data_ids = [item['id'] for item in data]
from apps.enp.models import EnvData from apps.enp.models import EnvData
from apps.enp.serializers import EnvDataSerializer 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( # 子查询获取每个 equipment_id 对应的最大时间戳
last_time=Max('time')) 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 = 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: for item in data:
item['envdata'] = envdata_dict.get(item['id'], {}) item['envdata'] = envdata_dict.get(item['id'], {})
return data return data