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 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 from apps.mtm.models import Material, Mgroup
class Mpoint(CommonBModel): class Mpoint(CommonBModel):
@ -41,14 +41,29 @@ class MpointStat(BaseModel):
hour = models.PositiveSmallIntegerField('', null=True, blank=True) hour = models.PositiveSmallIntegerField('', null=True, blank=True)
sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, 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) val = models.FloatField('统计值', default=0)
# class EnStat(BaseModel): class EnStat(BaseModel):
# """ """
# 能源数据统计表 能源数据统计表
# """ """
# type = models.CharField('统计种类', max_length=50, default='elec', help_text='year_s/month_s/day_s/sflog') 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) sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE, null=True, blank=True)
# mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE) 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 apps.utils.constants import EXCLUDE_FIELDS
from rest_framework import serializers from rest_framework import serializers
from apps.mtm.models import Mgroup from apps.mtm.models import Mgroup
from rest_framework.exceptions import ParseError
from django.utils.timezone import localtime
class MpointSerializer(CustomModelSerializer): class MpointSerializer(CustomModelSerializer):
@ -32,8 +34,33 @@ class MpLogSerializer(CustomModelSerializer):
read_only_fields = EXCLUDE_FIELDS + ['mpoint_name'] read_only_fields = EXCLUDE_FIELDS + ['mpoint_name']
class MpointStatSerializer(CustomModelSerializer): class MpointStatSerializer(CustomModelSerializer):
mpoint_name = serializers.CharField(source='mpoint.name', read_only=True) mpoint_name = serializers.CharField(source='mpoint.name', read_only=True)
class Meta: class Meta:
model = MpointStat 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.enm.models import Mpoint, MpLog, MpointStat
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from rest_framework.mixins import ListModelMixin from rest_framework.mixins import ListModelMixin
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
from apps.enm.serializers import (MpointSerializer, MpLogSerializer, MpointStatSerializer) from apps.enm.serializers import (MpointSerializer, MpLogSerializer, MpointStatSerializer)
@ -28,16 +29,16 @@ class MpLogViewSet(ListModelMixin, CustomGenericViewSet):
queryset = MpLog.objects.all() queryset = MpLog.objects.all()
serializer_class = MpLogSerializer serializer_class = MpLogSerializer
select_related_fields = ['mpoint'] 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:测点统计记录 list:测点统计记录
测点统计记录 测点统计记录
""" """
perms_map = {'get': '*'} perms_map = {'get': '*', 'post': 'mpointstat.create', 'delete': 'mpointstat.delete'}
queryset = MpointStat.objects.all() queryset = MpointStat.objects.all()
serializer_class = MpointStatSerializer serializer_class = MpointStatSerializer
select_related_fields = ['mpoint'] select_related_fields = ['mpoint']