feat: mpoint增加material字段

This commit is contained in:
caoqianming 2023-06-30 12:09:57 +08:00
parent f620dc0bcb
commit f6a15be31d
8 changed files with 75 additions and 150 deletions

View File

@ -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.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -11,28 +11,14 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('em', '0001_initial'), ('mtm', '0002_auto_20230626_1559'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('wpm', '0003_auto_20230628_0859'),
('system', '0002_myschedule'), ('system', '0002_myschedule'),
('em', '0001_initial'),
] ]
operations = [ 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( migrations.CreateModel(
name='Mpoint', name='Mpoint',
fields=[ 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='创建人')), ('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_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='监测哪个设备')), ('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={ options={
'abstract': False, 'abstract': False,
@ -60,13 +48,34 @@ class Migration(migrations.Migration):
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, 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='删除标记')), ('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='统计维度')), ('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(verbose_name='')), ('year', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='')),
('month', 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='')), ('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='')), ('hour', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='')),
('val', models.FloatField(default=0, verbose_name='统计值')), ('val', models.FloatField(default=0, verbose_name='统计值')),
('mpoint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.mpoint', 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={ options={
'abstract': False, 'abstract': False,

View File

@ -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='分类'),
),
]

View File

@ -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='关联测点'),
),
]

View File

@ -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=''),
),
]

View File

@ -1,6 +1,7 @@
from django.db import models from django.db import models
from apps.utils.models import BaseModel, CommonBModel from apps.utils.models import BaseModel, CommonBModel
from apps.wpm.models import SfLog from apps.wpm.models import SfLog
from apps.mtm.models import Material
class Mpoint(CommonBModel): class Mpoint(CommonBModel):
@ -9,7 +10,8 @@ class Mpoint(CommonBModel):
name = models.CharField('测点名称', max_length=50) name = models.CharField('测点名称', max_length=50)
code = models.CharField('测点编号', max_length=50, unique=True) code = models.CharField('测点编号', max_length=50, unique=True)
unit = models.CharField('单位', max_length=50) 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_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)

View File

@ -14,9 +14,11 @@ class MpointSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Mpoint model = Mpoint
fields = '__all__' fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['belong_dept'] read_only_fields = EXCLUDE_FIELDS + ['belong_dept', 'cate']
def validate(self, attrs): def validate(self, attrs):
if 'material' in attrs and attrs['material']:
attrs['cate'] = 'material'
attrs['belong_dept'] = attrs['mgroup'].belong_dept attrs['belong_dept'] = attrs['mgroup'].belong_dept
return attrs return attrs

View File

@ -48,7 +48,7 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
mpoint = Mpoint.objects.get(id=mpointId) mpoint = Mpoint.objects.get(id=mpointId)
mytz = tz.gettz(settings.TIME_ZONE) mytz = tz.gettz(settings.TIME_ZONE)
dt = datetime.datetime(year=year, month=month, day=day, hour=hour, tzinfo=mytz) 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 = {'mpoint': mpoint, 'type': 'hour'}
params['year'], params['month'], params['day'], params['hour'] = year, month, day, hour params['year'], params['month'], params['day'], params['hour'] = year, month, day, hour
mrs = MpLog.objects.filter( 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, _ = MpointStat.objects.get_or_create(**params, defaults=params)
ms.val = val ms.val = val
ms.save() 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')) 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}
@ -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.val = sum_dict_year['sum']
ms_year.save() 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: if year_s and month_s and day_s:
# 这种是距离点相减 # 这种是距离点相减
# params_s = {'mpoint': mpoint, 'type': 'sflog'} # 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) 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)

View File

@ -41,4 +41,4 @@ class MpointStatViewSet(ListModelMixin, CustomGenericViewSet):
queryset = MpointStat.objects.all() queryset = MpointStat.objects.all()
serializer_class = MpointStatSerializer serializer_class = MpointStatSerializer
select_related_fields = ['mpoint'] select_related_fields = ['mpoint']
filterset_fields = ['mpoint'] filterset_fields = ['mpoint', 'mpoint__mgroup', 'mpoint__mgroup__belong_dept', 'sflog', 'hour', 'day', 'month', 'year', 'day_s', 'month_s', 'year_s']