From 3b427cce596eb8889614124341cca7395a91f1bb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 30 Jun 2023 10:21:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B5=8B=E7=82=B9=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E8=A1=A8=E5=8F=8A=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91cal=5Fval?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enm/migrations/0003_auto_20230630_1020.py | 45 ++++++++++++++ apps/enm/models.py | 22 ++++++- apps/enm/tasks.py | 58 +++++++++++++++++++ 3 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 apps/enm/migrations/0003_auto_20230630_1020.py diff --git a/apps/enm/migrations/0003_auto_20230630_1020.py b/apps/enm/migrations/0003_auto_20230630_1020.py new file mode 100644 index 00000000..b325d813 --- /dev/null +++ b/apps/enm/migrations/0003_auto_20230630_1020.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.12 on 2023-06-30 02:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '0003_auto_20230628_0859'), + ('enm', '0002_initial'), + ] + + operations = [ + migrations.AddField( + model_name='mpointstat', + name='day_s', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班日'), + ), + migrations.AddField( + model_name='mpointstat', + name='month_s', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班月'), + ), + migrations.AddField( + model_name='mpointstat', + name='sflog', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.sflog', verbose_name='关联值班记录'), + ), + migrations.AddField( + model_name='mpointstat', + name='year_s', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班年'), + ), + migrations.AlterField( + model_name='mpointstat', + name='type', + field=models.CharField(default='hour', help_text='year/month/day/year_s/month_s/day_s/sflog/hour', max_length=50, verbose_name='统计维度'), + ), + migrations.AlterField( + model_name='mpointstat', + name='year', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='年'), + ), + ] diff --git a/apps/enm/models.py b/apps/enm/models.py index 356def8b..1ce3e88e 100644 --- a/apps/enm/models.py +++ b/apps/enm/models.py @@ -1,5 +1,6 @@ from django.db import models from apps.utils.models import BaseModel, CommonBModel +from apps.wpm.models import SfLog class Mpoint(CommonBModel): @@ -27,10 +28,25 @@ class MpLog(BaseModel): class MpointStat(BaseModel): """测点统计表 """ - type = models.CharField('统计维度', max_length=50, default='hour', help_text='year/month/day/hour') - year = models.PositiveSmallIntegerField('年') + type = models.CharField('统计维度', max_length=50, default='hour', help_text='year/month/day/year_s/month_s/day_s/sflog/hour') + year = models.PositiveSmallIntegerField('年', null=True, blank=True) month = models.PositiveSmallIntegerField('月', null=True, blank=True) day = models.PositiveSmallIntegerField('日', null=True, blank=True) + + year_s = models.PositiveSmallIntegerField('班年', null=True, blank=True) + month_s = models.PositiveSmallIntegerField('班月', null=True, blank=True) + day_s = models.PositiveSmallIntegerField('班日', null=True, blank=True) + hour = models.PositiveSmallIntegerField('时', null=True, blank=True) + sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True) mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE) - val = models.FloatField('统计值', default=0) \ No newline at end of file + val = models.FloatField('统计值', default=0) + + +# class EnStat(BaseModel): +# """ +# 能源数据统计表 +# """ +# type = models.CharField('统计种类', max_length=50, default='elec', help_text='year_s/month_s/day_s/sflog') +# sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True) +# mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE) diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index 35c78397..8f8efafd 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -9,6 +9,10 @@ from apps.enm.models import MpLog, Mpoint, MpointStat from apps.wpm.models import SfLog import datetime from django.db.models import Sum +from dateutil import tz +from django.conf import settings +from django.utils.timezone import localtime +from apps.wpm.services import make_sflogs def get_current_and_previous_time(): now = datetime.datetime.now() @@ -42,6 +46,8 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in 计算某一测点, 某一时间点某一小时的统计值 """ mpoint = Mpoint.objects.get(id=mpointId) + mytz = tz.gettz(settings.TIME_ZONE) + dt = datetime.datetime(year=year, month=month, day=day, hour=hour, tzinfo=mytz) if mpoint.cate == 'elec': # 是否是电能 params = {'mpoint': mpoint, 'type': 'hour'} params['year'], params['month'], params['day'], params['hour'] = year, month, day, hour @@ -57,6 +63,19 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in ms, _ = MpointStat.objects.get_or_create(**params, defaults=params) ms.val = val ms.save() + # 绑定值班记录 + sflog = SfLog.objects.filter(strat_time__lte=dt, end_time__gt=dt, mgroup=mpoint.mgroup).first() + year_s, month_s, day_s = 0, 0, 0 + if sflog: + ms.sflog = sflog + end_time_local = localtime(sflog.end_time) + year_s, month_s, day_s = end_time_local.year, end_time_local.month, end_time_local.day + ms.year_s = year_s + ms.month_s = month_s + ms.day_s = day_s + ms.save() + else: + raise Exception('未找到值班记录') # 更新更高级别的值 sum_dict_day = MpointStat.objects.filter(type='hour', mpoint=mpoint, year=year, month=month, day=day).aggregate(sum=Sum('val')) params_day = {'type':'day', 'mpoint': mpoint, 'year': year, 'month': month, 'day': day} @@ -76,6 +95,45 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in ms_year.val = sum_dict_year['sum'] ms_year.save() + if year_s and month_s and day_s: + # 这种是距离点相减 + # params_s = {'mpoint': mpoint, 'type': 'sflog'} + # mrs = MpLog.objects.filter( + # mpoint=mpoint, + # tag_update__gte=sflog.create_time, tag_update__lt=sflog.end_time).order_by('tag_update') + # val = 0 + # if mrs.exists(): + # val = mrs.last().tag_val - mrs.first().tag_val + # params_s_default = {'mpoint': mpoint, 'type': 'sflog', 'year_s': year_s, 'month_s': month_s, 'day_s': day_s} + # ms, _ = MpointStat.objects.get_or_create(**params_s, defaults=params_s_default) + # ms.val = val + # ms.save() + + # 这种是加和 + sum_dict_sflog_s = MpointStat.objects.filter(type='hour', mpoint=mpoint, year_s=year_s, month_s=month_s, day_s=day_s, sflog=sflog).aggregate(sum=Sum('val')) + params_sflog_s = {'type':'sflog', 'mpoint': mpoint, 'year_s': year_s, 'month_s': month_s, 'day_s': day_s} + ms_sflog_s, _ = MpointStat.objects.get_or_create(**params_sflog_s, defaults=params_sflog_s) + ms_sflog_s.val = sum_dict_sflog_s['sum'] + ms_sflog_s.save() + + sum_dict_day_s = MpointStat.objects.filter(type='hour', mpoint=mpoint, year_s=year_s, month_s=month_s, day_s=day_s).aggregate(sum=Sum('val')) + params_day_s = {'type':'day_s', 'mpoint': mpoint, 'year_s': year_s, 'month_s': month_s, 'day_s': day_s} + ms_day_s, _ = MpointStat.objects.get_or_create(**params_day_s, defaults=params_day_s) + ms_day_s.val = sum_dict_day_s['sum'] + ms_day_s.save() + + sum_dict_month_s = MpointStat.objects.filter(type='hour', mpoint=mpoint, year_s=year_s, month=month_s).aggregate(sum=Sum('val')) + params_month_s = {'type':'month', 'mpoint': mpoint, 'year': year_s, 'month': month_s} + ms_month_s, _ = MpointStat.objects.get_or_create(**params_month_s, defaults=params_month_s) + ms_month_s.val = sum_dict_month_s['sum'] + ms_month_s.save() + + sum_dict_year_s = MpointStat.objects.filter(type='hour', mpoint=mpoint, year_s=year_s).aggregate(sum=Sum('val')) + params_year_s = {'type':'year', 'mpoint': mpoint, 'year': year_s} + ms_year_s, _ = MpointStat.objects.get_or_create(**params_year_s, defaults=params_year_s) + ms_year_s.val = sum_dict_year_s['sum'] + ms_year_s.save() + @shared_task(base=CustomTask) def cal_mpointstats(is_now=1): """