feat: 完善enm表

This commit is contained in:
caoqianming 2023-06-14 15:30:51 +08:00
parent 2db95349b2
commit 5f9ef83c6e
9 changed files with 515 additions and 20 deletions

View File

@ -0,0 +1,51 @@
# Generated by Django 3.2.12 on 2023-06-09 09:13
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('system', '0002_myschedule'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Equipment',
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.PositiveSmallIntegerField(choices=[(10, '生产设备'), (20, '计量检测工具')], default=10, verbose_name='类型')),
('name', models.CharField(max_length=50, verbose_name='设备名称')),
('number', models.CharField(max_length=50, unique=True, verbose_name='设备编号')),
('model', models.CharField(blank=True, default='', max_length=60, verbose_name='规格型号')),
('factory', models.CharField(blank=True, default='', max_length=50, verbose_name='生产厂')),
('production_date', models.DateField(blank=True, null=True, verbose_name='生产日期')),
('buy_date', models.DateField(blank=True, null=True, verbose_name='购置日期')),
('state', models.PositiveIntegerField(choices=[(10, '完好'), (20, '限用'), (30, '在修'), (40, '禁用'), (50, '报废')], default=10, verbose_name='设备状态')),
('parameter', models.TextField(blank=True, default='', verbose_name='技术参数')),
('place', models.CharField(blank=True, default='', max_length=50, verbose_name='安装/存放位置')),
('count', models.PositiveIntegerField(default=1, verbose_name='数量')),
('description', models.CharField(default='', max_length=200, null=True, verbose_name='描述')),
('cycle', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='校准或检定周期(月)')),
('check_date', models.DateField(blank=True, null=True, verbose_name='最近校准检查日期')),
('next_check_date', models.DateField(blank=True, null=True, verbose_name='预计下次校准检查日期')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipment_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipment_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('keeper', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='责任人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='equipment_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '设备信息',
'verbose_name_plural': '设备信息',
},
),
]

View File

View File

@ -0,0 +1,249 @@
# Generated by Django 3.2.12 on 2023-06-14 07:27
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('em', '0001_initial'),
('system', '0002_myschedule'),
]
operations = [
migrations.CreateModel(
name='Mgroup',
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='删除标记')),
('name', models.CharField(max_length=50, verbose_name='名称')),
('cate', models.CharField(default='section', max_length=50, verbose_name='分类')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mgroup_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mgroup_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mgroup_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '测点集',
},
),
migrations.CreateModel(
name='SfLog',
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='删除标记')),
('start_time', models.DateTimeField(verbose_name='值班开始')),
('end_time', models.DateTimeField(verbose_name='值班结束')),
('note', models.TextField(blank=True, null=True, verbose_name='生产情况记录')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sflog_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('leader', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='班长')),
('mgroup', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.mgroup', verbose_name='关联工段')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='StLog',
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='删除标记')),
('start_time', models.DateTimeField(verbose_name='停机开始')),
('end_time', models.DateTimeField(blank=True, null=True, verbose_name='停机结束')),
('duration', models.FloatField(blank=True, null=True, verbose_name='停机时长(h)')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stlog_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('mgroup', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.mgroup', verbose_name='关联工段')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stlog_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Team',
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='删除标记')),
('name', models.CharField(max_length=50, verbose_name='名称')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='team_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='team_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('leader', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='班长')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='team_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='StSfLog',
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='删除标记')),
('is_current_down', models.BooleanField(default=False, verbose_name='是否本班停机')),
('reason', models.TextField(blank=True, null=True, verbose_name='停机原因')),
('sflog', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.sflog', verbose_name='关联值班记录')),
('stlog', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.stlog', verbose_name='关联停机记录')),
],
options={
'ordering': ['sflog__start_time'],
},
),
migrations.CreateModel(
name='Shift',
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='删除标记')),
('name', models.CharField(max_length=50, verbose_name='名称')),
('start_time_o', models.TimeField(verbose_name='开始时间')),
('end_time_o', models.TimeField(verbose_name='结束时间')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='shift_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='shift_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '班次',
},
),
migrations.AddField(
model_name='sflog',
name='shift',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.shift', verbose_name='当班班次'),
),
migrations.AddField(
model_name='sflog',
name='stlogs',
field=models.ManyToManyField(through='enm.StSfLog', to='enm.StLog', verbose_name='关联停机记录'),
),
migrations.AddField(
model_name='sflog',
name='team',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.team', verbose_name='班组'),
),
migrations.AddField(
model_name='sflog',
name='update_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sflog_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'),
),
migrations.CreateModel(
name='Product',
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='删除标记')),
('name', models.CharField(max_length=50, verbose_name='名称')),
('code', models.CharField(blank=True, max_length=50, null=True, verbose_name='编号')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='product_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='product_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'verbose_name': '产品',
},
),
migrations.CreateModel(
name='Mpoint',
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='删除标记')),
('name', models.CharField(max_length=50, verbose_name='测点名称')),
('code', models.CharField(max_length=50, unique=True, verbose_name='测点编号')),
('unit', models.CharField(max_length=50, verbose_name='单位')),
('cate', models.CharField(default='elec', max_length=50, verbose_name='分类')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mpoint_belong_dept', to='system.dept', 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_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='enm.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,
},
),
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,
},
),
migrations.CreateModel(
name='HourStat',
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='删除标记')),
('year', models.PositiveSmallIntegerField(verbose_name='')),
('month', models.PositiveSmallIntegerField(verbose_name='')),
('day', models.PositiveSmallIntegerField(verbose_name='')),
('hour', models.PositiveSmallIntegerField(verbose_name='')),
('val', models.FloatField(default=0, verbose_name='统计值')),
('is_calculated', models.BooleanField(default=False, verbose_name='是否计算过')),
('mpoint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enm.mpoint', verbose_name='关联测点')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Goal',
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='删除标记')),
('year', models.PositiveSmallIntegerField(verbose_name='')),
('goal_name', models.CharField(help_text='总产量/台时产量/单位产品分布电耗/', max_length=50, verbose_name='目标名称')),
('goal_val', models.FloatField(verbose_name='全年目标值')),
('goal_val_1', models.FloatField(verbose_name='1月份目标值')),
('goal_val_2', models.FloatField(verbose_name='2月份目标值')),
('goal_val_3', models.FloatField(verbose_name='3月份目标值')),
('goal_val_4', models.FloatField(verbose_name='4月份目标值')),
('goal_val_5', models.FloatField(verbose_name='5月份目标值')),
('goal_val_6', models.FloatField(verbose_name='6月份目标值')),
('goal_val_7', models.FloatField(verbose_name='7月份目标值')),
('goal_val_8', models.FloatField(verbose_name='8月份目标值')),
('goal_val_9', models.FloatField(verbose_name='9月份目标值')),
('goal_val_10', models.FloatField(verbose_name='10月份目标值')),
('goal_val_11', models.FloatField(verbose_name='11月份目标值')),
('goal_val_12', models.FloatField(verbose_name='12月份目标值')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='goal_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('mgroup', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='enm.mgroup', verbose_name='关联工段')),
('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='enm.product', verbose_name='关联产品')),
('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='enm.team', verbose_name='关联班组')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='goal_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -21,10 +21,11 @@ class Shift(CommonAModel):
class Meta:
verbose_name = '班次'
class Mgroup(CommonBDModel):
class Mgroup(CommonBModel):
"""测点集
"""
name = models.CharField('名称', max_length=50)
cate = models.CharField('分类', max_length=50, default='section') # section是工段
class Meta:
verbose_name = '测点集'
@ -41,29 +42,88 @@ class Mpoint(CommonBDModel):
"""测点
"""
name = models.CharField('测点名称', max_length=50)
code = 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')
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('enm.mgroup', verbose_name='所在集合', on_delete=models.SET_NULL, null=True, blank=True)
class Mrecord(BaseModel):
class MpLog(BaseModel):
"""测点原始记录
"""
mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.SET_NULL, null=True, blank=True)
tag_id = models.BigIntegerField('记录ID')
tag_id = models.BigIntegerField('记录ID', db_index=True)
tag_code = models.CharField('测点编号', max_length=50)
tag_update = models.DateTimeField('更新时间')
tag_val = models.FloatField('当前值')
class StLog(CommonADModel):
"""
停机记录
"""
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE)
start_time = models.DateTimeField('停机开始')
end_time = models.DateTimeField('停机结束', null=True, blank=True)
duration = models.FloatField('停机时长(h)', null=True, blank=True)
class Drecord(CommonADModel):
class SfLog(CommonADModel):
"""值班记录
"""
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE)
team = models.ForeignKey(Team, verbose_name='班组', on_delete=models.CASCADE)
shit = models.ForeignKey(Shift, verbose_name='当班班次', on_delete=models.CASCADE)
shift = models.ForeignKey(Shift, verbose_name='当班班次', on_delete=models.CASCADE)
leader = models.ForeignKey('system.user', verbose_name='班长', on_delete=models.CASCADE)
start_time = models.DateTimeField('值班开始')
end_time = models.DateTimeField('值班结束')
end_time = models.DateTimeField('值班结束')
note = models.TextField('生产情况记录', null=True, blank=True)
stlogs = models.ManyToManyField('enm.stlog', verbose_name='关联停机记录', through='enm.stsflog')
class StSfLog(BaseModel):
"""
停机-值班记录关联表
"""
stlog = models.ForeignKey(StLog, verbose_name='关联停机记录', on_delete=models.CASCADE)
sflog = models.ForeignKey(SfLog, verbose_name='关联值班记录', on_delete=models.CASCADE)
is_current_down = models.BooleanField('是否本班停机', default=False)
reason = models.TextField('停机原因', null=True, blank=True)
class Meta:
ordering = ['sflog__start_time']
class HourStat(BaseModel):
"""小时统计表
"""
year = models.PositiveSmallIntegerField('')
month = models.PositiveSmallIntegerField('')
day = models.PositiveSmallIntegerField('')
hour = models.PositiveSmallIntegerField('')
mpoint = models.ForeignKey(Mpoint, verbose_name='关联测点', on_delete=models.CASCADE)
val = models.FloatField('统计值', default=0)
is_calculated = models.BooleanField('是否计算过', default=False)
class Goal(CommonADModel):
"""目标
"""
mgroup = models.ForeignKey(Mgroup, verbose_name='关联工段', on_delete=models.CASCADE, null=True, blank=True)
product = models.ForeignKey(Product, verbose_name='关联产品', on_delete=models.CASCADE, null=True, blank=True)
team = models.ForeignKey(Team, verbose_name='关联班组', on_delete=models.CASCADE, null=True, blank=True)
year = models.PositiveSmallIntegerField('')
goal_name = models.CharField('目标名称', max_length=50, help_text='总产量/台时产量/单位产品分布电耗/')
goal_val = models.FloatField('全年目标值')
goal_val_1 = models.FloatField('1月份目标值')
goal_val_2 = models.FloatField('2月份目标值')
goal_val_3 = models.FloatField('3月份目标值')
goal_val_4 = models.FloatField('4月份目标值')
goal_val_5 = models.FloatField('5月份目标值')
goal_val_6 = models.FloatField('6月份目标值')
goal_val_7 = models.FloatField('7月份目标值')
goal_val_8 = models.FloatField('8月份目标值')
goal_val_9 = models.FloatField('9月份目标值')
goal_val_10 = models.FloatField('10月份目标值')
goal_val_11 = models.FloatField('11月份目标值')
goal_val_12 = models.FloatField('12月份目标值')

View File

@ -1,5 +1,5 @@
from apps.utils.serializers import CustomModelSerializer
from apps.enm.models import Mpoint, Mgroup, Mrecord, Team, Drecord
from apps.enm.models import Mpoint, Mgroup, MpLog, Team, SfLog, StLog
from apps.system.models import Dept
from apps.system.serializers import DeptSimpleSerializer
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
@ -33,9 +33,35 @@ class MpointSerializer(CustomModelSerializer):
read_only_fields = EXCLUDE_FIELDS + ['mgroup_name', 'belong_dept_name']
class MrecordSerializer(CustomModelSerializer):
class MpLogSerializer(CustomModelSerializer):
mpoint_name = serializers.CharField(source='mpoint.name')
class Meta:
model = Mrecord
model = MpLog
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['mpoint_name']
class StLogSerializer(CustomModelSerializer):
mgroup_name = serializers.CharField(source='mgroup.name')
class Meta:
model = StLog
fields = '__all__'
class SfLogSerializer(CustomModelSerializer):
mgroup_name = serializers.CharField(source='mgroup.name')
team_name = serializers.CharField(source='team.name')
shift_name = serializers.CharField(source='shift.name')
leader_name = serializers.CharField(source='leader.name')
class Meta:
model = SfLog
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS + ['mgroup_name', 'team_name', 'shift_name', 'leader_name']
update_fields = ['start_time', 'end_time', 'note']
def to_internal_value(self, data):
if hasattr(self.Meta, 'update_fields') and self.context['request'].method in ['PUT', 'PATCH']:
u_fields = self.Meta.update_fields
new_data = {key: data[key] for key in u_fields if key in data}
return super().to_internal_value(new_data)
return super().to_internal_value(data)

0
apps/enm/services.py Normal file
View File

View File

@ -4,12 +4,78 @@ from apps.utils.tasks import CustomTask
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 Mrecord, Mpoint, HourStat
import datetime
def get_current_and_previous_hour():
now = datetime.datetime.now()
current_hour = now.hour
current_date = now.date()
current_start_time = datetime.datetime.combine(current_date, datetime.time(current_hour, 0, 0))
current_end_time = datetime.datetime.combine(current_date, datetime.time(current_hour, 59, 59))
current_time_range = (current_start_time, current_end_time)
previous_hour = current_hour - 1 if current_hour > 0 else 23
previous_date = current_date if previous_hour < current_hour else current_date - datetime.timedelta(days=1)
previous_start_time = datetime.datetime.combine(previous_date, datetime.time(previous_hour, 0, 0))
previous_end_time = datetime.datetime.combine(previous_date, datetime.time(previous_hour, 59, 59))
previous_time_range = (previous_start_time, previous_end_time)
return current_time_range, previous_time_range
@shared_task(base=CustomTask)
def get_tag_val():
config = get_sysconfig()
with DbConnection(config['enm']['db_host'], config['enm']['db_user'], config['enm']['db_password'], config['enm']['db_database']) as cursor:
cursor.execute("select * from tag_value")
results = cursor.fetchall()
last_tag_id = cache.get('last_tag_id')
if last_tag_id is None:
mr = Mrecord.objects.all().order_by('-tag_update', 'tag_id').first()
if mr is None:
last_tag_id = 0
else:
last_tag_id = mr.tag_id
cache.set('last_tag_id', last_tag_id)
cursor.execute("select id, val, tag_code, update_time from tag_value where id > %s order by id", (last_tag_id))
results = cursor.fetchall() # 获取数据后保存至本地
for row in results:
print(row)
mr_one = Mrecord()
mr_one.tag_id, mr_one.tag_val, mr_one.tag_code, mr_one.tag_update = row
mr_one.mpoint, _ = Mpoint.objects.get_or_create(code=mr_one.tag_code, defaults={'name': mr_one.tag_code, 'code': mr_one.tag_code, 'unit': 'unknown'})
mr_one.save()
@shared_task(base=CustomTask)
def cal_hourstat():
"""
计算小时统计量,默认计算本小时和上小时
"""
for mpoint in Mpoint.objects.all():
c_t_r, p_t_r = get_current_and_previous_hour()
if mpoint.cate == 'elec': # 是否是电能
# 计算本小时,可能不需要
start_time = c_t_r[0]
params = {'mpoint': mpoint}
params['year'], params['month'], params['day'], params['hour'] = start_time.year, start_time.month, start_time.day, start_time.hour
mrs = Mrecord.objects.filter(mpoint=mpoint, tag_update__gte=c_t_r[0], tag_update__lte=c_t_r[1]).order_by('tag_update')
val = 0
if mrs.exists():
val = mrs.last() - mrs.first()
hs, _ = HourStat.objects.get_or_create(**params, defaults=params)
hs.val = val
hs.save()
# 计算上小时
start_time2 = p_t_r[0]
params = {'mpoint': mpoint}
params['year'], params['month'], params['day'], params['hour'] = start_time2.year, start_time2.month, start_time2.day, start_time2.hour
hs, _ = HourStat.objects.get_or_create(**params, defaults=params)
if not hs.is_calculated:
mrs = Mrecord.objects.filter(mpoint=mpoint, tag_update__gte=p_t_r[0], tag_update__lte=p_t_r[1]).order_by('tag_update')
val = 0
if mrs.exists():
val = mrs.last() - mrs.first()
hs.val = val
hs.is_calculated = True
hs.save()

View File

@ -1,6 +1,6 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from apps.enm.views import MpointViewSet, MgroupViewSet, TeamViewSet
from apps.enm.views import MpointViewSet, MgroupViewSet, TeamViewSet, MpLogViewSet, SfLogViewSet, StLogViewSet
API_BASE_URL = 'api/enm/'
HTML_BASE_URL = 'enm/'
@ -9,7 +9,9 @@ router = DefaultRouter()
router.register('mpoint', MpointViewSet, basename='mpoint')
router.register('mgroup', MgroupViewSet, basename='mgroup')
router.register('team', TeamViewSet, basename='team')
router.register('mplog', MpLogViewSet, basename='mplog')
router.register('sflog', SfLogViewSet, basename='sflog')
router.register('stlog', StLogViewSet, basename='stlog')
urlpatterns = [
path(API_BASE_URL, include(router.urls)),
]

View File

@ -1,8 +1,11 @@
from django.shortcuts import render
from apps.enm.models import Mpoint, Mgroup, Team, Mrecord
from apps.utils.viewsets import CustomModelViewSet
from apps.enm.serializers import MpointSerializer, TeamSerializer, MgroupSerializer
from apps.enm.models import Mpoint, Mgroup, Team, MpLog, SfLog, StLog, StSfLog
from apps.utils.viewsets import CustomModelViewSet, GenericViewSet
from rest_framework.mixins import ListModelMixin
from apps.enm.serializers import MpointSerializer, TeamSerializer, MgroupSerializer, MpLogSerializer, SfLogSerializer, StLogSerializer
from rest_framework.exceptions import ParseError
from django.db import transaction
from django.db.models import Q
class MgroupViewSet(CustomModelViewSet):
queryset = Mgroup.objects.all()
@ -25,4 +28,42 @@ class MpointViewSet(CustomModelViewSet):
serializer_class = MpointSerializer
select_related_fields = ['create_by', 'belong_dept', 'ep_monitored', 'ep_belong', 'mgroup']
filterset_fields = ['belong_dept', 'ep_monitored', 'ep_belong', 'mgroup']
search_fields = ['number', 'code']
search_fields = ['number', 'code']
class MpLogViewSet(ListModelMixin, GenericViewSet):
queryset = MpLog.objects.all()
serializer_class = MpLogSerializer
select_related_fields = ['mpoint']
filterset_fields = ['mpoint']
class StLogViewSet(ListModelMixin, GenericViewSet):
queryset = StLog.objects.all()
serializer_class = StLogSerializer
select_related_fields = ['mgroup']
filterset_fields = ['mgroup']
ordering = ['-start_time']
class SfLogViewSet(CustomModelViewSet):
queryset = SfLog.objects.all()
serializer_class = SfLogSerializer
select_related_fields = ['mgroup', 'shift', 'team', 'leader']
filterset_fields = ['mgroup', 'shift', 'team', 'leader', 'team__belong_dept']
search_fields = ['note']
@transaction.atomic
def perform_create(self, serializer):
ins = serializer.save()
# 查看并比对停机记录
stls = StLog.objects.filter(mroup=ins.mgroup)
stls_ = (stls.filter(start_time__gte=ins.start_time, start_time__lt=ins.end_time)|
stls.exclude(end_time=None).filter(start_time__lte=ins.start_time, end_time__gt=ins.end_time)|
stls.exclude(end_time=None).filter(end_time__gte=ins.start_time, end_time__lt=ins.end_time))
for i in stls_:
StSfLog.objects.get_or_create(stlog=i, sflog=ins, defaults={'stlog': i, 'sflog': ins})
stsflog = StSfLog.objects.filter(stlog=i).order_by('-sflog__start_time').first()
if stsflog:
stsflog.is_current_down = True
stsflog.save()