diff --git a/apps/develop/views.py b/apps/develop/views.py index c72f0d86..c4fc76a1 100755 --- a/apps/develop/views.py +++ b/apps/develop/views.py @@ -140,6 +140,18 @@ class CorrectViewSet(CustomGenericViewSet): Opl.objects.filter(id=opl.id).update(number=sn) return Response() + @action(methods=['post'], detail=False, serializer_class=Serializer) + def mgroups_allocate(self, request, pk=None): + """矫正测点分配 + + 矫正测点分配 + """ + from apps.enm.models import Mpoint + for mpoint in Mpoint.objects.exclude(mgroup=None): + mgroup = mpoint.mgroup + mpoint.mgroups_allocate = [{'mgroup': mgroup.id, 'mgroup_name': mgroup.name, 'ratio': 1}] + mpoint.save() + return Response() class TestViewSet(CustomGenericViewSet): authentication_classes = () diff --git a/apps/enm/migrations/0006_mpoint_mgroups_allocate.py b/apps/enm/migrations/0006_mpoint_mgroups_allocate.py new file mode 100644 index 00000000..9d68964b --- /dev/null +++ b/apps/enm/migrations/0006_mpoint_mgroups_allocate.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-07-11 02:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enm', '0005_auto_20230707_1707'), + ] + + operations = [ + migrations.AddField( + model_name='mpoint', + name='mgroups_allocate', + field=models.JSONField(blank=True, default=list, help_text='[{"mgroup":"x", "ratio": 1}]', verbose_name='各工段分配'), + ), + ] diff --git a/apps/enm/models.py b/apps/enm/models.py index 35af0545..a2fd124a 100644 --- a/apps/enm/models.py +++ b/apps/enm/models.py @@ -15,6 +15,7 @@ class Mpoint(CommonBModel): 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) + mgroups_allocate = models.JSONField('各工段分配', default=list, blank=True, help_text='[{"mgroup":"x", "ratio": 1}]') is_auto = models.BooleanField('是否自动采集', default=True) diff --git a/apps/enm/serializers.py b/apps/enm/serializers.py index 8b2c43af..8c32e895 100644 --- a/apps/enm/serializers.py +++ b/apps/enm/serializers.py @@ -8,7 +8,7 @@ from django.utils.timezone import localtime class MpointSerializer(CustomModelSerializer): - mgroup = serializers.PrimaryKeyRelatedField(label="测点集", queryset=Mgroup.objects.all(), required=True) + mgroup = serializers.PrimaryKeyRelatedField(label="测点集", queryset=Mgroup.objects.all(), required=False) mgroup_name = serializers.CharField(source='mgroup.name', read_only=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) ep_monitored_name = serializers.CharField(source='ep_monitored.name', read_only=True) @@ -22,7 +22,18 @@ class MpointSerializer(CustomModelSerializer): def validate(self, attrs): if 'material' in attrs and attrs['material']: attrs['cate'] = 'material' - attrs['belong_dept'] = attrs['mgroup'].belong_dept + if 'mgroup' in attrs and attrs['mgroup']: + attrs['belong_dept'] = attrs['mgroup'].belong_dept + attrs['mgroups_allocate'] = [{'mgroup': attrs['mgroup'].id, 'mgroup_name': attrs['mgroup'].name, 'ratio': 1}] + ratio_ = 0 + mgroupIds = [] + for i in attrs['mgroups_allocate']: + ratio_ = ratio_ + i['ratio'] + if i['mgroup'] in mgroupIds: + raise ParseError('分配集错误') + mgroupIds.append(i['mgroup']) + if ratio_ != 1: + raise ParseError('比例合计错误') return attrs diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index 16ca32ca..5ad56239 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -5,7 +5,7 @@ from celery import shared_task from apps.utils.sql import DbConnection from server.settings import get_sysconfig from django.core.cache import cache -from apps.enm.models import MpLog, Mpoint, MpointStat +from apps.enm.models import MpLog, Mpoint, MpointStat, EnStat from apps.wpm.models import SfLog import datetime from django.db.models import Sum @@ -13,6 +13,7 @@ from dateutil import tz from django.conf import settings from django.utils.timezone import localtime from apps.wpm.services import make_sflogs +from apps.mtm.models import Mgroup def get_current_and_previous_time(): now = datetime.datetime.now() @@ -63,6 +64,7 @@ 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() + # 更新更高级别的值 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} @@ -82,56 +84,50 @@ 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() - if sflog is None: # 需要创建值班记录 - from apps.wpm.services import make_sflogs - make_sflogs(mgroup=mpoint.mgroup, start_date=(dt-datetime.timedelta(days=1)).date(), end_date=dt.date()) - sflog = SfLog.objects.filter(start_time__lte=dt, end_time__gt=dt, mgroup=mpoint.mgroup).first() - 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() - # 这种是距离点相减 - # 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() + if mpoint.mgroups_allocate: # 如果有分配系数 + for allocate in mpoint.mgroups_allocate: + mgroup = Mgroup.objects.get(id=allocate['mgroup']) + ratio = allocate['ratio'] + # 查找并绑定值班记录 + sflog = SfLog.objects.filter(start_time__lte=dt, end_time__gt=dt, mgroup=mgroup).first() + if sflog is None: # 需要创建值班记录 + make_sflogs(mgroup=mgroup, start_date=(dt-datetime.timedelta(days=1)).date(), end_date=dt.date()) + sflog = SfLog.objects.filter(start_time__lte=dt, end_time__gt=dt, mgroup=mgroup).first() + 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() - # 开始往上计算 - 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='sflog', 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_sflog_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_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']*ratio + ms_sflog_s.save() - sum_dict_month_s = MpointStat.objects.filter(type='day_s', mpoint=mpoint, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val')) - params_month_s = {'type':'month_s', 'mpoint': mpoint, 'year_s': year_s, 'month_s': 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_day_s = MpointStat.objects.filter(type='sflog', 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_year_s = MpointStat.objects.filter(type='month_s', mpoint=mpoint, year_s=year_s).aggregate(sum=Sum('val')) - params_year_s = {'type':'year_s', 'mpoint': mpoint, 'year_s': 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() + sum_dict_month_s = MpointStat.objects.filter(type='day_s', mpoint=mpoint, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val')) + params_month_s = {'type':'month_s', 'mpoint': mpoint, 'year_s': year_s, 'month_s': 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='month_s', mpoint=mpoint, year_s=year_s).aggregate(sum=Sum('val')) + params_year_s = {'type':'year_s', 'mpoint': mpoint, 'year_s': 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() + + # compute_enstat.delay(mpoint.id, year_s, month_s, day_s, hour) + @shared_task(base=CustomTask) def cal_mpointstats(is_now=1): @@ -169,4 +165,19 @@ def cal_mpointstat_manual(mpointId: str, year_s: int, month_s: int, day_s=None): params_year_s = {'type':'year_s', 'mpoint': mpoint, 'year_s': 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() \ No newline at end of file + ms_year_s.save() + + +def compute_enstat(mpointId: str, year_s, month_s, day_s, sflogId, hour): + """ + 计算能源数据统计 + """ + mpoint = Mpoint.objects.get(id=mpointId) + mgroup = mpoint.mgroup + sflog = SfLog.objects.get(id=sflogId) + if mpoint.material.code == 'elec': + MpointStat.objects.filter(type="hour", mpoint__material__code='elec', mpoint__mgroup=mgroup, year_s=year_s, month_s=month_s, day_s=day_s, hour=hour).aggregate(sum=Sum('val')) + # hour + enm_hour, _ = EnStat.objects.get_or_create(type='hour', ) + elif mpoint.material == mgroup.product: + pass \ No newline at end of file