feat: 测点统计记录支持手动创建

This commit is contained in:
caoqianming 2023-07-06 17:03:28 +08:00
parent ad0c3cdd7c
commit 9498e5eb22
4 changed files with 111 additions and 13 deletions

View File

@ -0,0 +1,55 @@
# Generated by Django 3.2.12 on 2023-07-04 03:29
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('mtm', '0004_mgroup_test_materials'),
('wpm', '0003_auto_20230628_0859'),
('enm', '0002_auto_20230630_1208'),
]
operations = [
migrations.AddField(
model_name='mpointstat',
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='mpointstat',
name='mpoint',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='enm.mpoint', verbose_name='关联测点'),
),
migrations.CreateModel(
name='EnStat',
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='删除标记')),
('type', models.CharField(default='hour', help_text='year_s/month_s/day_s/sflog/hour', max_length=50, 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='班日')),
('total_production', models.FloatField(blank=True, help_text='t', null=True, verbose_name='总产量')),
('elec_consume', models.FloatField(blank=True, help_text='kw·h', null=True, verbose_name='总电耗')),
('production_cost_unit', models.FloatField(blank=True, help_text='y/t', null=True, verbose_name='单位产品成本')),
('elec_consume_unit', models.FloatField(blank=True, help_text='kw·h/t', null=True, verbose_name='单位产品分布电耗')),
('celec_consume_unit', models.FloatField(blank=True, help_text='kw·h/t', null=True, verbose_name='单位产品综合电耗')),
('coal_consume_unit', models.FloatField(blank=True, help_text='kgce/t', null=True, verbose_name='单位产品标煤耗')),
('cen_consume_unit', models.FloatField(blank=True, help_text='kgce/t', null=True, verbose_name='单位产品综合能耗')),
('production_hour', models.FloatField(blank=True, help_text='t/h', null=True, verbose_name='台时产量')),
('run_hour', models.FloatField(blank=True, help_text='h', null=True, verbose_name='运转时长')),
('run_rate', models.FloatField(blank=True, help_text='%', null=True, verbose_name='运转率')),
('mgroup', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.mgroup', verbose_name='关联工段')),
('sflog', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.sflog', verbose_name='关联值班记录')),
],
options={
'abstract': False,
},
),
]

View File

@ -1,7 +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
from apps.mtm.models import Material, Mgroup
class Mpoint(CommonBModel):
@ -41,14 +41,29 @@ class MpointStat(BaseModel):
hour = models.PositiveSmallIntegerField('', null=True, blank=True)
sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True)
mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE)
mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE, null=True, blank=True)
material = models.ForeignKey(Material, verbose_name='计量的物料', on_delete=models.CASCADE, null=True, blank=True)
val = models.FloatField('统计值', default=0)
# class EnStat(BaseModel):
# """
# 能源数据统计表
# """
# type = models.CharField('统计种类', max_length=50, default='elec', help_text='year_s/month_s/day_s/sflog')
# sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True)
# mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE)
class EnStat(BaseModel):
"""
能源数据统计表
"""
type = models.CharField('统计维度', max_length=50, default='hour', help_text='year_s/month_s/day_s/sflog/hour')
sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True)
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE)
year_s = models.PositiveSmallIntegerField('班年', null=True, blank=True)
month_s = models.PositiveSmallIntegerField('班月', null=True, blank=True)
day_s = models.PositiveSmallIntegerField('班日', null=True, blank=True)
total_production = models.FloatField('总产量', null=True, blank=True, help_text='t')
elec_consume = models.FloatField('总电耗', null=True, blank=True, help_text='kw·h')
production_cost_unit = models.FloatField('单位产品成本', null=True, blank=True, help_text='y/t')
elec_consume_unit = models.FloatField('单位产品分布电耗', null=True, blank=True, help_text='kw·h/t')
celec_consume_unit = models.FloatField('单位产品综合电耗', null=True, blank=True, help_text='kw·h/t')
coal_consume_unit = models.FloatField('单位产品标煤耗', null=True, blank=True, help_text='kgce/t')
cen_consume_unit = models.FloatField('单位产品综合能耗', null=True, blank=True, help_text='kgce/t')
production_hour = models.FloatField('台时产量', null=True, blank=True, help_text='t/h')
run_hour = models.FloatField('运转时长', null=True, blank=True, help_text='h')
run_rate = models.FloatField('运转率', null=True, blank=True, help_text='%')

View File

@ -3,6 +3,8 @@ from apps.enm.models import Mpoint, MpLog, MpointStat
from apps.utils.constants import EXCLUDE_FIELDS
from rest_framework import serializers
from apps.mtm.models import Mgroup
from rest_framework.exceptions import ParseError
from django.utils.timezone import localtime
class MpointSerializer(CustomModelSerializer):
@ -30,10 +32,35 @@ class MpLogSerializer(CustomModelSerializer):
model = MpLog
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['mpoint_name']
class MpointStatSerializer(CustomModelSerializer):
mpoint_name = serializers.CharField(source='mpoint.name', read_only=True)
class Meta:
model = MpointStat
fields = '__all__'
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['mpoint_name', 'type', 'mpoint', 'year', 'month', 'day']
def check_required_keys(dictionary, keys):
for key in keys:
if key not in dictionary or not dictionary[key]:
return False
return True
def validate(self, attrs):
if 'sflog' in attrs and attrs['sflog']:
attrs['type'] = 'sflog'
sflog = attrs['sflog']
end_time_local = localtime(sflog.end_time)
attrs['year_s'], attrs['month_s'], attrs['day_s'] = end_time_local.year, end_time_local.month, end_time_local.day
else:
keys = ['hour', 'day_s', 'month_s', 'year_s']
for ind, key in enumerate(keys):
if key in attrs and attrs['key']:
if not self.check_required_keys(attrs, keys[ind+1:]):
raise ParseError('缺少数据')
attrs['type'] = key
return super().validate(attrs)

View File

@ -2,6 +2,7 @@ from django.shortcuts import render
from apps.enm.models import Mpoint, MpLog, MpointStat
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from rest_framework.mixins import ListModelMixin
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
from apps.enm.serializers import (MpointSerializer, MpLogSerializer, MpointStatSerializer)
@ -28,16 +29,16 @@ class MpLogViewSet(ListModelMixin, CustomGenericViewSet):
queryset = MpLog.objects.all()
serializer_class = MpLogSerializer
select_related_fields = ['mpoint']
filterset_fields = ['mpoint']
filterset_fields = ['mpoint', 'mpoint__mgroup', 'mpoint__mgroup__belong_dept']
class MpointStatViewSet(ListModelMixin, CustomGenericViewSet):
class MpointStatViewSet(BulkCreateModelMixin, BulkDestroyModelMixin, ListModelMixin, CustomGenericViewSet):
"""
list:测点统计记录
测点统计记录
"""
perms_map = {'get': '*'}
perms_map = {'get': '*', 'post': 'mpointstat.create', 'delete': 'mpointstat.delete'}
queryset = MpointStat.objects.all()
serializer_class = MpointStatSerializer
select_related_fields = ['mpoint']