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.db import migrations, models
@ -11,28 +11,14 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('em', '0001_initial'),
('mtm', '0002_auto_20230626_1559'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('wpm', '0003_auto_20230628_0859'),
('system', '0002_myschedule'),
('em', '0001_initial'),
]
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(
name='Mpoint',
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='创建人')),
('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='监测哪个设备')),
('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={
'abstract': False,
@ -60,13 +48,34 @@ class Migration(migrations.Migration):
('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='删除标记')),
('type', models.CharField(default='hour', help_text='year/month/day/hour', max_length=50, verbose_name='统计维度')),
('year', models.PositiveSmallIntegerField(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(blank=True, null=True, verbose_name='')),
('month', 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='')),
('val', models.FloatField(default=0, 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={
'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 apps.utils.models import BaseModel, CommonBModel
from apps.wpm.models import SfLog
from apps.mtm.models import Material
class Mpoint(CommonBModel):
@ -9,7 +10,8 @@ class Mpoint(CommonBModel):
name = models.CharField('测点名称', max_length=50)
code = models.CharField('测点编号', max_length=50, unique=True)
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_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)

View File

@ -14,9 +14,11 @@ class MpointSerializer(CustomModelSerializer):
class Meta:
model = Mpoint
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['belong_dept']
read_only_fields = EXCLUDE_FIELDS + ['belong_dept', 'cate']
def validate(self, attrs):
if 'material' in attrs and attrs['material']:
attrs['cate'] = 'material'
attrs['belong_dept'] = attrs['mgroup'].belong_dept
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)
mytz = tz.gettz(settings.TIME_ZONE)
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['year'], params['month'], params['day'], params['hour'] = year, month, day, hour
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.val = val
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'))
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.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:
# 这种是距离点相减
# 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)
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()
serializer_class = MpointStatSerializer
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']