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) Opl.objects.filter(id=opl.id).update(number=sn)
return Response() 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): class TestViewSet(CustomGenericViewSet):
authentication_classes = () 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_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) 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) 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) is_auto = models.BooleanField('是否自动采集', default=True)

View File

@ -8,7 +8,7 @@ from django.utils.timezone import localtime
class MpointSerializer(CustomModelSerializer): 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) mgroup_name = serializers.CharField(source='mgroup.name', read_only=True)
belong_dept_name = serializers.CharField(source='belong_dept.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) ep_monitored_name = serializers.CharField(source='ep_monitored.name', read_only=True)
@ -22,7 +22,18 @@ class MpointSerializer(CustomModelSerializer):
def validate(self, attrs): def validate(self, attrs):
if 'material' in attrs and attrs['material']: if 'material' in attrs and attrs['material']:
attrs['cate'] = '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 return attrs

View File

@ -5,7 +5,7 @@ from celery import shared_task
from apps.utils.sql import DbConnection from apps.utils.sql import DbConnection
from server.settings import get_sysconfig from server.settings import get_sysconfig
from django.core.cache import cache 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 from apps.wpm.models import SfLog
import datetime import datetime
from django.db.models import Sum from django.db.models import Sum
@ -13,6 +13,7 @@ from dateutil import tz
from django.conf import settings from django.conf import settings
from django.utils.timezone import localtime from django.utils.timezone import localtime
from apps.wpm.services import make_sflogs from apps.wpm.services import make_sflogs
from apps.mtm.models import Mgroup
def get_current_and_previous_time(): def get_current_and_previous_time():
now = datetime.datetime.now() 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, _ = MpointStat.objects.get_or_create(**params, defaults=params)
ms.val = val ms.val = val
ms.save() ms.save()
# 更新更高级别的值 # 更新更高级别的值
sum_dict_day = MpointStat.objects.filter(type='hour', mpoint=mpoint, year=year, month=month, day=day).aggregate(sum=Sum('val')) 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} 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.val = sum_dict_year['sum']
ms_year.save() ms_year.save()
# 查找并绑定值班记录 if mpoint.mgroups_allocate: # 如果有分配系数
sflog = SfLog.objects.filter(start_time__lte=dt, end_time__gt=dt, mgroup=mpoint.mgroup).first() for allocate in mpoint.mgroups_allocate:
if sflog is None: # 需要创建值班记录 mgroup = Mgroup.objects.get(id=allocate['mgroup'])
from apps.wpm.services import make_sflogs ratio = allocate['ratio']
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() sflog = SfLog.objects.filter(start_time__lte=dt, end_time__gt=dt, mgroup=mgroup).first()
ms.sflog = sflog if sflog is None: # 需要创建值班记录
end_time_local = localtime(sflog.end_time) make_sflogs(mgroup=mgroup, start_date=(dt-datetime.timedelta(days=1)).date(), end_date=dt.date())
year_s, month_s, day_s = end_time_local.year, end_time_local.month, end_time_local.day sflog = SfLog.objects.filter(start_time__lte=dt, end_time__gt=dt, mgroup=mgroup).first()
ms.year_s = year_s end_time_local = localtime(sflog.end_time)
ms.month_s = month_s year_s, month_s, day_s = end_time_local.year, end_time_local.month, end_time_local.day
ms.day_s = day_s ms.year_s = year_s
ms.save() ms.month_s = month_s
# 这种是距离点相减 ms.day_s = day_s
# params_s = {'mpoint': mpoint, 'type': 'sflog'} ms.save()
# 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='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} 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'))
ms_day_s, _ = MpointStat.objects.get_or_create(**params_day_s, defaults=params_day_s) params_sflog_s = {'type':'sflog', 'mpoint': mpoint, 'year_s': year_s, 'month_s': month_s, 'day_s': day_s}
ms_day_s.val = sum_dict_day_s['sum'] ms_sflog_s, _ = MpointStat.objects.get_or_create(**params_sflog_s, defaults=params_sflog_s)
ms_day_s.save() 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')) 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_month_s = {'type':'month_s', 'mpoint': mpoint, 'year_s': year_s, 'month_s': month_s} params_day_s = {'type':'day_s', 'mpoint': mpoint, 'year_s': year_s, 'month_s': month_s, 'day_s': day_s}
ms_month_s, _ = MpointStat.objects.get_or_create(**params_month_s, defaults=params_month_s) ms_day_s, _ = MpointStat.objects.get_or_create(**params_day_s, defaults=params_day_s)
ms_month_s.val = sum_dict_month_s['sum'] ms_day_s.val = sum_dict_day_s['sum']
ms_month_s.save() ms_day_s.save()
sum_dict_year_s = MpointStat.objects.filter(type='month_s', mpoint=mpoint, year_s=year_s).aggregate(sum=Sum('val')) 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_year_s = {'type':'year_s', 'mpoint': mpoint, 'year_s': year_s} params_month_s = {'type':'month_s', 'mpoint': mpoint, 'year_s': year_s, 'month_s': month_s}
ms_year_s, _ = MpointStat.objects.get_or_create(**params_year_s, defaults=params_year_s) ms_month_s, _ = MpointStat.objects.get_or_create(**params_month_s, defaults=params_month_s)
ms_year_s.val = sum_dict_year_s['sum'] ms_month_s.val = sum_dict_month_s['sum']
ms_year_s.save() 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) @shared_task(base=CustomTask)
def cal_mpointstats(is_now=1): 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} 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, _ = MpointStat.objects.get_or_create(**params_year_s, defaults=params_year_s)
ms_year_s.val = sum_dict_year_s['sum'] 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