From 263c336c049286e92ee61a331793934f8f415b65 Mon Sep 17 00:00:00 2001 From: xianfuxing Date: Fri, 5 Jun 2020 12:04:09 +0800 Subject: [PATCH] =?UTF-8?q?#=20=E5=AE=8C=E5=96=84=E7=94=B5=E9=87=8F?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/counter/api/serializers.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/apps/counter/api/serializers.py b/apps/counter/api/serializers.py index 7cf394d..3ce2485 100644 --- a/apps/counter/api/serializers.py +++ b/apps/counter/api/serializers.py @@ -1,4 +1,4 @@ -from django.db.models import Q +from django.db.models import Q, Min, Max from django.core.cache import cache from rest_framework import serializers from counter.models import DeviceCount, DeviceInfo @@ -6,6 +6,22 @@ from mosquito.models import DeviceInfo as CelexDeviceInfo from mosquito.models import MosqPostStatistic, DevicePostStatistic +def get_vol(device_id, cur_vol): + vol_min_key = '{}_vol_min'.format(device_id) + vol_max_key = '{}_vol_max'.format(device_id) + vol_min = cache.get(vol_min_key) + vol_max = cache.get(vol_max_key) + if not vol_min: + vol_min = DeviceCount.objects.filter(device_id=device_id).aggregate(vol_min=Min('vol'))['vol_min'] + cache.set(vol_min_key, vol_min, 60 * 5) + if not vol_max: + vol_max = DeviceCount.objects.filter(device_id=device_id).aggregate(vol_max=Max('vol'))['vol_max'] + cache.set(vol_max_key, vol_max, 60 * 5) + + vol = 100 * (int(cur_vol) - int(vol_min)) / (int(vol_max) - int(vol_min)) + return '{}{}'.format(round(vol, 1), '%') + + class DeviceCountSerializer(serializers.ModelSerializer): device_name = serializers.SerializerMethodField() mosq_count = serializers.SerializerMethodField() @@ -34,16 +50,16 @@ class DeviceCountSerializer(serializers.ModelSerializer): return obj.csq def get_energy(self, obj): - return obj.vol + return get_vol(obj.device_id, obj.vol) def get_calc_time(self, obj): return obj.data_time.strftime('%Y-%m-%d %H:%M:%S') def get_device_name(self, obj): device_id = obj.device_id - cache_content = cache.get(device_id) - if cache_content: - return cache_content + device_name = cache.get(device_id) + if device_name: + return device_name qs = CelexDeviceInfo.objects.filter(device_id=device_id) if qs.count() > 0: device = qs[0] @@ -105,7 +121,7 @@ class DeviceInfoSerializer(serializers.ModelSerializer): def get_energy(self, obj): if self.latest: - return self.latest.vol + return get_vol(obj.device_id, self.latest.vol) return 0 def get_coordinate(self, obj):