feat: 支持测点数据反向分配给各工段

This commit is contained in:
caoqianming 2023-07-11 10:53:28 +08:00
parent f02135dc10
commit c122335f8c
5 changed files with 103 additions and 50 deletions

View File

@ -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 = ()

View File

@ -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='各工段分配'),
),
]

View File

@ -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)

View File

@ -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

View File

@ -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()
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