From d5d8bc1f332c93ac54b7030d24a03556c034597a Mon Sep 17 00:00:00 2001 From: xianfx Date: Sun, 18 Feb 2024 22:49:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=9D=90=E6=A0=87?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mosquito/tasks.py | 43 +++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/apps/mosquito/tasks.py b/apps/mosquito/tasks.py index 793cd91..fa71bac 100644 --- a/apps/mosquito/tasks.py +++ b/apps/mosquito/tasks.py @@ -5,17 +5,18 @@ from datetime import datetime, time, timedelta from django.db.models import Max from celery import task - import os import django + pwd = os.path.dirname(os.path.realpath(__file__)) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mosqkiller.settings") django.setup() -from counter.models import DeviceCount -from counter.models import DeviceInfo as D1 +from counter.models import DeviceCount as DeviceCount +from counter.models import DeviceInfo as CounterDeviceInfor from mosquito.models import MosqPostStatistic, DevicePostStatistic, DeviceInfo, Org + def max_count(x, y): if x.count > y.count: return x @@ -55,7 +56,7 @@ def get_daily_statistic(enable_container=False): for q in qs: # 按照 device_id 分组查询最新时间 max_time,然后通过id + max_time 获取实例,用来得到count midnight = tz.localize(datetime.combine(q.date, time(23, 59)), is_dst=None) - dc = DeviceCount.objects.filter(data_time__lte=midnight).values('device_id').\ + dc = DeviceCount.objects.filter(data_time__lte=midnight).values('device_id'). \ annotate(max_time=Max('data_time')) daily_queryset = [DeviceCount.objects.filter(device_id=x['device_id'], data_time=x['max_time']) for x in dc] if daily_queryset: @@ -151,19 +152,35 @@ def update_latest_statistic(): @task() def update_mosq_device_info(): """ 更新mosquito的DeviceInfo表""" - d1 = D1.objects.values_list('device_id', flat=True) - d2 = DeviceInfo.objects.values_list('device_id', flat=True) - s1 = set(d1) - s2 = set(d2) - x = s1 - s2 + counter_devices = CounterDeviceInfor.objects.values_list('device_id', flat=True) + mosq_devices = DeviceInfo.objects.values_list('device_id', flat=True) + s1 = set(counter_devices) + s2 = set(mosq_devices) + delta = s1 - s2 + # update existing device + for device_id in mosq_devices: + counter_device = DeviceCount.objects.filter(device_id=device_id).order_by('-data_time').first() + if counter_device is None: + continue + ds = DeviceInfo.objects.get(device_id=device_id) + ds.longitude = counter_device.longitude + ds.latitude = counter_device.latitude + ds.save() + + # create new device default_org = Org.objects.all().first() - for device_id in x: - DeviceInfo.objects.create(device_id=device_id, org=default_org) - return list(x) + for device_id in delta: + counter_device = DeviceCount.objects.filter(device_id=device_id).order_by('-data_time').first() + DeviceInfo.objects.create(device_id=device_id, + org=default_org, + latitude=counter_device.latitude, + longitude=counter_device.longitude) + return list(delta) if __name__ == '__main__': # a, b = get_daily_statistic() # print(a, b) - update_daily_statistic() \ No newline at end of file + # update_mosq_device_info() + update_daily_statistic()