From f6a15be31d66406de593260c7b26821776647fdf Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 30 Jun 2023 12:09:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20mpoint=E5=A2=9E=E5=8A=A0material?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/enm/migrations/0001_initial.py | 49 +++++++++------ .../enm/migrations/0002_auto_20230630_1208.py | 25 ++++++++ apps/enm/migrations/0002_initial.py | 34 ---------- .../enm/migrations/0003_auto_20230630_1020.py | 45 -------------- apps/enm/models.py | 4 +- apps/enm/serializers.py | 4 +- apps/enm/tasks.py | 62 +++++-------------- apps/enm/views.py | 2 +- 8 files changed, 75 insertions(+), 150 deletions(-) create mode 100644 apps/enm/migrations/0002_auto_20230630_1208.py delete mode 100644 apps/enm/migrations/0002_initial.py delete mode 100644 apps/enm/migrations/0003_auto_20230630_1020.py diff --git a/apps/enm/migrations/0001_initial.py b/apps/enm/migrations/0001_initial.py index 81b322c9..1588eb49 100644 --- a/apps/enm/migrations/0001_initial.py +++ b/apps/enm/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.12 on 2023-06-20 09:05 +# Generated by Django 3.2.12 on 2023-06-30 02:28 from django.conf import settings from django.db import migrations, models @@ -11,28 +11,14 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('em', '0001_initial'), + ('mtm', '0002_auto_20230626_1559'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wpm', '0003_auto_20230628_0859'), ('system', '0002_myschedule'), + ('em', '0001_initial'), ] operations = [ - migrations.CreateModel( - name='MpLog', - fields=[ - ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), - ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), - ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), - ('tag_id', models.BigIntegerField(db_index=True, verbose_name='记录ID')), - ('tag_code', models.CharField(max_length=50, verbose_name='测点编号')), - ('tag_update', models.DateTimeField(verbose_name='更新时间')), - ('tag_val', models.FloatField(verbose_name='当前值')), - ], - options={ - 'abstract': False, - }, - ), migrations.CreateModel( name='Mpoint', fields=[ @@ -48,6 +34,8 @@ class Migration(migrations.Migration): ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpoint_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), ('ep_belong', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mp_ep_belong', to='em.equipment', verbose_name='属于哪个设备')), ('ep_monitored', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mp_ep_monitored', to='em.equipment', verbose_name='监测哪个设备')), + ('mgroup', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mtm.mgroup', verbose_name='所在集合')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpoint_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), ], options={ 'abstract': False, @@ -60,13 +48,34 @@ class Migration(migrations.Migration): ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), - ('type', models.CharField(default='hour', help_text='year/month/day/hour', max_length=50, verbose_name='统计维度')), - ('year', models.PositiveSmallIntegerField(verbose_name='年')), + ('type', models.CharField(default='hour', help_text='year/month/day/year_s/month_s/day_s/sflog/hour', max_length=50, verbose_name='统计维度')), + ('year', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='年')), ('month', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='月')), ('day', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='日')), + ('year_s', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班年')), + ('month_s', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班月')), + ('day_s', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班日')), ('hour', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='时')), ('val', models.FloatField(default=0, verbose_name='统计值')), ('mpoint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.mpoint', verbose_name='关联测点')), + ('sflog', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.sflog', verbose_name='关联值班记录')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='MpLog', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('tag_id', models.BigIntegerField(db_index=True, verbose_name='记录ID')), + ('tag_code', models.CharField(max_length=50, verbose_name='测点编号')), + ('tag_update', models.DateTimeField(verbose_name='更新时间')), + ('tag_val', models.FloatField(verbose_name='当前值')), + ('mpoint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='enm.mpoint', verbose_name='关联测点')), ], options={ 'abstract': False, diff --git a/apps/enm/migrations/0002_auto_20230630_1208.py b/apps/enm/migrations/0002_auto_20230630_1208.py new file mode 100644 index 00000000..dcd13f34 --- /dev/null +++ b/apps/enm/migrations/0002_auto_20230630_1208.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2023-06-30 04:08 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0002_auto_20230626_1559'), + ('enm', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='mpoint', + name='material', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='计量某种物料'), + ), + migrations.AlterField( + model_name='mpoint', + name='cate', + field=models.CharField(default='material', max_length=50, verbose_name='分类'), + ), + ] diff --git a/apps/enm/migrations/0002_initial.py b/apps/enm/migrations/0002_initial.py deleted file mode 100644 index 83be74dd..00000000 --- a/apps/enm/migrations/0002_initial.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.2.12 on 2023-06-20 09:05 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('enm', '0001_initial'), - ('mtm', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.AddField( - model_name='mpoint', - name='mgroup', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mtm.mgroup', verbose_name='所在集合'), - ), - migrations.AddField( - model_name='mpoint', - name='update_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpoint_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), - ), - migrations.AddField( - model_name='mplog', - name='mpoint', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='enm.mpoint', verbose_name='关联测点'), - ), - ] diff --git a/apps/enm/migrations/0003_auto_20230630_1020.py b/apps/enm/migrations/0003_auto_20230630_1020.py deleted file mode 100644 index b325d813..00000000 --- a/apps/enm/migrations/0003_auto_20230630_1020.py +++ /dev/null @@ -1,45 +0,0 @@ -# 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 1ce3e88e..1e977bc2 100644 --- a/apps/enm/models.py +++ b/apps/enm/models.py @@ -1,6 +1,7 @@ from django.db import models from apps.utils.models import BaseModel, CommonBModel from apps.wpm.models import SfLog +from apps.mtm.models import Material class Mpoint(CommonBModel): @@ -9,7 +10,8 @@ class Mpoint(CommonBModel): name = models.CharField('测点名称', max_length=50) code = models.CharField('测点编号', max_length=50, unique=True) unit = models.CharField('单位', max_length=50) - cate = models.CharField('分类', max_length=50, default='elec') + cate = models.CharField('分类', max_length=50, default='material') + material = models.ForeignKey(Material, verbose_name='计量某种物料', on_delete=models.CASCADE, null=True, blank=True) ep_monitored = models.ForeignKey('em.equipment', verbose_name='监测哪个设备', related_name='mp_ep_monitored', on_delete=models.SET_NULL, null=True, blank=True) ep_belong = models.ForeignKey('em.equipment', verbose_name='属于哪个设备', related_name='mp_ep_belong', on_delete=models.SET_NULL, null=True, blank=True) mgroup = models.ForeignKey('mtm.mgroup', verbose_name='所在集合', on_delete=models.SET_NULL, null=True, blank=True) diff --git a/apps/enm/serializers.py b/apps/enm/serializers.py index 022d7263..a1b78f02 100644 --- a/apps/enm/serializers.py +++ b/apps/enm/serializers.py @@ -14,9 +14,11 @@ class MpointSerializer(CustomModelSerializer): class Meta: model = Mpoint fields = '__all__' - read_only_fields = EXCLUDE_FIELDS + ['belong_dept'] + read_only_fields = EXCLUDE_FIELDS + ['belong_dept', 'cate'] def validate(self, attrs): + if 'material' in attrs and attrs['material']: + attrs['cate'] = 'material' attrs['belong_dept'] = attrs['mgroup'].belong_dept return attrs diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index 8f8efafd..c6cd8e09 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -48,7 +48,7 @@ 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': # 是否是电能 + if mpoint.material: # 如果计量的是物料 params = {'mpoint': mpoint, 'type': 'hour'} params['year'], params['month'], params['day'], params['hour'] = year, month, day, hour mrs = MpLog.objects.filter( @@ -63,19 +63,6 @@ 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} @@ -95,6 +82,19 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in ms_year.val = sum_dict_year['sum'] ms_year.save() + # 绑定值班记录 + sflog = SfLog.objects.filter(start_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('未找到值班记录') if year_s and month_s and day_s: # 这种是距离点相减 # params_s = {'mpoint': mpoint, 'type': 'sflog'} @@ -148,38 +148,4 @@ def cal_mpointstats(is_now=1): cal_mpointstat_hour.delay(mpoint.id, pre.year, pre.month, pre.day, pre.hour) -def cal_sflog_en_val(sflogId: str): - """ - 计算某值班记录相应能耗 - """ - sflog = SfLog.objects.get(id=sflogId) - mpoints = Mpoint.objects.filter(mgroup=sflog.mgroup) - # 统计电耗 - mpoints_elec = mpoints.filter(cate='elec') - elec_val = 0 - params = {'mpoint': mpoint, 'tag_update__gte': sflog.create_time, 'tag_update__lt': sflog.end_time} - for mpoint in mpoints_elec: - mrs = MpLog.objects.filter(**params).order_by('tag_update') - if mrs.exists(): - elec_val += mrs.last().tag_val - mrs.first().tag_val - SfLog.objects.filter(id=sflog).update(elec_val=elec_val, cal_time=datetime.datetime.now()) - - -@shared_task(base=CustomTask) -def cal_sflogs_en_val(is_today=1): - """ - 计算班组能耗值, 默认开始时间是当天的 - """ - now = datetime.datetime.now() - if is_today: - sflogs = SfLog.objects.filter(start_time__year=now.year, start_time__month=now.month, start_time__day=now.day) - for i in sflogs: - cal_sflog_en_val(i.id) - else: - pre = now - datetime.timedelta(days=1) - sflogs = SfLog.objects.filter(start_time__year=pre.year, start_time__month=pre.month, start_time__day=pre.day) - for i in sflogs: - cal_sflog_en_val(i.id) - - diff --git a/apps/enm/views.py b/apps/enm/views.py index 895a2d6f..698d606a 100644 --- a/apps/enm/views.py +++ b/apps/enm/views.py @@ -41,4 +41,4 @@ class MpointStatViewSet(ListModelMixin, CustomGenericViewSet): queryset = MpointStat.objects.all() serializer_class = MpointStatSerializer select_related_fields = ['mpoint'] - filterset_fields = ['mpoint'] \ No newline at end of file + filterset_fields = ['mpoint', 'mpoint__mgroup', 'mpoint__mgroup__belong_dept', 'sflog', 'hour', 'day', 'month', 'year', 'day_s', 'month_s', 'year_s'] \ No newline at end of file