feat: 支持测点数据反向分配给各工段
This commit is contained in:
parent
f02135dc10
commit
c122335f8c
|
@ -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 = ()
|
||||
|
|
|
@ -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='各工段分配'),
|
||||
),
|
||||
]
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue