feat: 变更一下envdata表结构
This commit is contained in:
parent
74cbaa8497
commit
0061285355
|
@ -5,111 +5,87 @@ import django.db.models.deletion
|
|||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('enp', '0001_initial'),
|
||||
("enp", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunSQL(
|
||||
sql=[(
|
||||
"""
|
||||
sql=[
|
||||
(
|
||||
"""
|
||||
CREATE TABLE public.enp_envdata (
|
||||
"time" timestamptz NOT NULL,
|
||||
"timex" timestamptz NOT NULL,
|
||||
"equipment_id" text NOT NULL,
|
||||
"is_online" INT DEFAULT 1,
|
||||
"running_state" INT DEFAULT 10,
|
||||
"dust_rtd" decimal,
|
||||
"dust_zs" decimal,
|
||||
"temperature" decimal,
|
||||
"pressure" decimal,
|
||||
"speed" decimal,
|
||||
"humidity" decimal,
|
||||
"flux" decimal,
|
||||
"pm25" decimal,
|
||||
"pm10" decimal,
|
||||
"tsp" decimal,
|
||||
"wind_direction" INT,
|
||||
"wind_speed" decimal,
|
||||
"so2_rtd" decimal,
|
||||
"so2_zs" decimal,
|
||||
"nox_rtd" decimal,
|
||||
"nox_zs" decimal,
|
||||
"o2" decimal,
|
||||
CONSTRAINT enp_envdata_pkey PRIMARY KEY (time, equipment_id)
|
||||
"dust_rtd" float,
|
||||
"dust_zs" float,
|
||||
"temperature" float,
|
||||
"pressure" float,
|
||||
"speed" float,
|
||||
"humidity" float,
|
||||
"flux" float,
|
||||
"pm25" float,
|
||||
"pm10" float,
|
||||
"tsp" float,
|
||||
"wind_direction" int,
|
||||
"wind_speed" float,
|
||||
"so2_rtd" float,
|
||||
"so2_zs" float,
|
||||
"nox_rtd" float,
|
||||
"nox_zs" float,
|
||||
"o2" float,
|
||||
CONSTRAINT enp_envdata_pkey PRIMARY KEY (timex, equipment_id)
|
||||
);
|
||||
SELECT create_hypertable('enp_envdata', 'time');
|
||||
SELECT create_hypertable('enp_envdata', 'timex');
|
||||
"""
|
||||
)],
|
||||
reverse_sql=[
|
||||
"DROP TABLE IF EXISTS public.enp_envdata;"
|
||||
]
|
||||
)
|
||||
],
|
||||
reverse_sql=["DROP TABLE IF EXISTS public.enp_envdata;"],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='EnvData',
|
||||
name="EnvData",
|
||||
fields=[
|
||||
('time', models.DateTimeField(primary_key=True,
|
||||
serialize=False, verbose_name='采集时间')),
|
||||
('is_online', models.PositiveSmallIntegerField(
|
||||
default=1, verbose_name='是否在线')),
|
||||
('running_state', models.PositiveSmallIntegerField(
|
||||
default=10, verbose_name='运行状态')),
|
||||
('dust_rtd', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='颗粒物实测(mg/m3)')),
|
||||
('dust_zs', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='颗粒物折算(mg/m3)')),
|
||||
('temperature', models.DecimalField(
|
||||
blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='温度(℃)')),
|
||||
('pressure', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='压力(kPa)')),
|
||||
('speed', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='流速(m/s)')),
|
||||
('humidity', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='湿度(%)')),
|
||||
('flux', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='流量(m3/h)')),
|
||||
('pm25', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='PM2.5(ug/m3)')),
|
||||
('pm10', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='PM10(ug/m3)')),
|
||||
('tsp', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='TSP(ug/m3)')),
|
||||
('wind_direction', models.PositiveSmallIntegerField(
|
||||
blank=True, null=True, verbose_name='风向')),
|
||||
('wind_speed', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='风速(m/s)')),
|
||||
('so2_rtd', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='二氧化硫实测(mg/m3)')),
|
||||
('so2_zs', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='二氧化硫折算(mg/m3)')),
|
||||
('nox_rtd', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='氮氧化物实测(mg/m3)')),
|
||||
('nox_zs', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='氮氧化物折算(mg/m3)')),
|
||||
('o2', models.DecimalField(blank=True, decimal_places=4,
|
||||
max_digits=10, null=True, verbose_name='含氧量(%)')),
|
||||
("time", models.DateTimeField(primary_key=True, serialize=False, verbose_name="采集时间")),
|
||||
("is_online", models.PositiveSmallIntegerField(default=1, verbose_name="是否在线")),
|
||||
("running_state", models.PositiveSmallIntegerField(default=10, verbose_name="运行状态")),
|
||||
("dust_rtd", models.FloatField(blank=True, null=True, verbose_name="颗粒物实测(mg/m3)")),
|
||||
("dust_zs", models.FloatField(blank=True, null=True, verbose_name="颗粒物折算(mg/m3)")),
|
||||
("temperature", models.FloatField(blank=True, null=True, verbose_name="温度(℃)")),
|
||||
("pressure", models.FloatField(blank=True, null=True, verbose_name="压力(kPa)")),
|
||||
("speed", models.FloatField(blank=True, null=True, verbose_name="流速(m/s)")),
|
||||
("humidity", models.FloatField(blank=True, null=True, verbose_name="湿度(%)")),
|
||||
("flux", models.FloatField(blank=True, null=True, verbose_name="流量(m3/h)")),
|
||||
("pm25", models.FloatField(blank=True, null=True, verbose_name="PM2.5(ug/m3)")),
|
||||
("pm10", models.FloatField(blank=True, null=True, verbose_name="PM10(ug/m3)")),
|
||||
("tsp", models.FloatField(blank=True, null=True, verbose_name="TSP(ug/m3)")),
|
||||
("wind_direction", models.PositiveSmallIntegerField(blank=True, null=True, verbose_name="风向")),
|
||||
("wind_speed", models.FloatField(blank=True, null=True, verbose_name="风速(m/s)")),
|
||||
("so2_rtd", models.FloatField(blank=True, null=True, verbose_name="二氧化硫实测(mg/m3)")),
|
||||
("so2_zs", models.FloatField(blank=True, null=True, verbose_name="二氧化硫折算(mg/m3)")),
|
||||
("nox_rtd", models.FloatField(blank=True, null=True, verbose_name="氮氧化物实测(mg/m3)")),
|
||||
("nox_zs", models.FloatField(blank=True, null=True, verbose_name="氮氧化物折算(mg/m3)")),
|
||||
("o2", models.FloatField(blank=True, null=True, verbose_name="含氧量(%)")),
|
||||
],
|
||||
options={
|
||||
'db_table': 'enp_envdata',
|
||||
'managed': False,
|
||||
"db_table": "enp_envdata",
|
||||
"managed": False,
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='drainequip',
|
||||
name='dust_alarm',
|
||||
field=models.DecimalField(
|
||||
blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='颗粒物报警值'),
|
||||
model_name="drainequip",
|
||||
name="dust_alarm",
|
||||
field=models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True, verbose_name="颗粒物报警值"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='drainequip',
|
||||
name='drain',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='drainequip_drain', to='enp.drain', verbose_name='排口'),
|
||||
model_name="drainequip",
|
||||
name="drain",
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="drainequip_drain", to="enp.drain", verbose_name="排口"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='drainequip',
|
||||
name='equipment',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='drainequip_equipment', to='em.equipment', verbose_name='关联设备'),
|
||||
model_name="drainequip",
|
||||
name="equipment",
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="drainequip_equipment", to="em.equipment", verbose_name="关联设备"),
|
||||
),
|
||||
]
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
# Generated by Django 3.2.12 on 2024-04-11 07:21
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('enp', '0008_vehicleaccess_is_new_energy'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='drainequip',
|
||||
name='dust_alarm',
|
||||
field=models.FloatField(blank=True, null=True, verbose_name='颗粒物报警值'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='drainequip',
|
||||
name='pm10_alarm',
|
||||
field=models.FloatField(blank=True, null=True, verbose_name='PM10报警值'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='drainequip',
|
||||
name='pm25_alarm',
|
||||
field=models.FloatField(blank=True, null=True, verbose_name='PM2.5报警值'),
|
||||
),
|
||||
]
|
|
@ -7,135 +7,95 @@ from apps.em.models import Equipment
|
|||
|
||||
class Drain(CommonBModel):
|
||||
DR_TYPE_CHOICES = (
|
||||
(10, '排放口'),
|
||||
(20, '污染源'),
|
||||
)
|
||||
DR_LEVLE_CHOICES = (
|
||||
(10, '主要排放口'),
|
||||
(20, '次要排放口')
|
||||
(10, "排放口"),
|
||||
(20, "污染源"),
|
||||
)
|
||||
DR_LEVLE_CHOICES = ((10, "主要排放口"), (20, "次要排放口"))
|
||||
|
||||
DR_CATE_MTRAN = 'mtrans'
|
||||
DR_CATE_PRODUCT = 'product'
|
||||
DR_CATE_MSTORE = 'mstore'
|
||||
DR_CATE_MTRAN = "mtrans"
|
||||
DR_CATE_PRODUCT = "product"
|
||||
DR_CATE_MSTORE = "mstore"
|
||||
DR_CATE_CHOICES = (
|
||||
(DR_CATE_PRODUCT, '生产工艺'),
|
||||
(DR_CATE_MTRAN, '物料输送'),
|
||||
(DR_CATE_MSTORE, '物料储存'),
|
||||
(DR_CATE_PRODUCT, "生产工艺"),
|
||||
(DR_CATE_MTRAN, "物料输送"),
|
||||
(DR_CATE_MSTORE, "物料储存"),
|
||||
)
|
||||
type = models.PositiveSmallIntegerField(
|
||||
'类型', choices=DR_TYPE_CHOICES, help_text=str(DR_TYPE_CHOICES))
|
||||
number = models.CharField('编号', max_length=20)
|
||||
name = models.CharField('名称', max_length=20)
|
||||
level = models.PositiveSmallIntegerField(
|
||||
'排口等级', default=20, choices=DR_LEVLE_CHOICES, help_text=str(DR_LEVLE_CHOICES))
|
||||
cate = models.CharField('分类', max_length=10,
|
||||
choices=DR_CATE_CHOICES, null=True, blank=True, help_text=str(DR_CATE_CHOICES))
|
||||
height = models.PositiveSmallIntegerField('排气筒高度', default=0)
|
||||
treatment_capacity = models.CharField('处理量', max_length=20, default='')
|
||||
pm_limit = models.FloatField('PM超低排放限值', default=10, help_text='单位:mg/m³')
|
||||
measure = models.CharField('治理措施', max_length=20, default='')
|
||||
type = models.PositiveSmallIntegerField("类型", choices=DR_TYPE_CHOICES, help_text=str(DR_TYPE_CHOICES))
|
||||
number = models.CharField("编号", max_length=20)
|
||||
name = models.CharField("名称", max_length=20)
|
||||
level = models.PositiveSmallIntegerField("排口等级", default=20, choices=DR_LEVLE_CHOICES, help_text=str(DR_LEVLE_CHOICES))
|
||||
cate = models.CharField("分类", max_length=10, choices=DR_CATE_CHOICES, null=True, blank=True, help_text=str(DR_CATE_CHOICES))
|
||||
height = models.PositiveSmallIntegerField("排气筒高度", default=0)
|
||||
treatment_capacity = models.CharField("处理量", max_length=20, default="")
|
||||
pm_limit = models.FloatField("PM超低排放限值", default=10, help_text="单位:mg/m³")
|
||||
measure = models.CharField("治理措施", max_length=20, default="")
|
||||
# {"x": 1.0, "y": 2.0, "z": 3.0}
|
||||
coordinates = models.JSONField('坐标', default=dict, blank=True)
|
||||
mgroup = models.ForeignKey(
|
||||
Mgroup, verbose_name='所属工段', on_delete=models.CASCADE)
|
||||
equipments = models.ManyToManyField(
|
||||
Equipment, verbose_name='关联设备', through='DrainEquip', related_name='drain_equipments', blank=True)
|
||||
coordinates = models.JSONField("坐标", default=dict, blank=True)
|
||||
mgroup = models.ForeignKey(Mgroup, verbose_name="所属工段", on_delete=models.CASCADE)
|
||||
equipments = models.ManyToManyField(Equipment, verbose_name="关联设备", through="DrainEquip", related_name="drain_equipments", blank=True)
|
||||
|
||||
|
||||
class DrainEquip(BaseModel):
|
||||
"""
|
||||
排口/设备关系表
|
||||
"""
|
||||
drain = models.ForeignKey(
|
||||
Drain, verbose_name='排口', related_name='drainequip_drain', on_delete=models.CASCADE)
|
||||
equipment = models.ForeignKey(
|
||||
Equipment, verbose_name='关联设备', related_name='drainequip_equipment', on_delete=models.CASCADE)
|
||||
params_list = models.JSONField('监测参数列表', default=list, blank=True)
|
||||
dust_alarm = models.DecimalField(
|
||||
'颗粒物报警值', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
pm10_alarm = models.DecimalField(
|
||||
'PM10报警值', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
pm25_alarm = models.DecimalField(
|
||||
'PM2.5报警值', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
|
||||
drain = models.ForeignKey(Drain, verbose_name="排口", related_name="drainequip_drain", on_delete=models.CASCADE)
|
||||
equipment = models.ForeignKey(Equipment, verbose_name="关联设备", related_name="drainequip_equipment", on_delete=models.CASCADE)
|
||||
params_list = models.JSONField("监测参数列表", default=list, blank=True)
|
||||
dust_alarm = models.FloatField("颗粒物报警值", null=True, blank=True)
|
||||
pm10_alarm = models.FloatField("PM10报警值", null=True, blank=True)
|
||||
pm25_alarm = models.FloatField("PM2.5报警值", null=True, blank=True)
|
||||
|
||||
|
||||
class EnvData(models.Model):
|
||||
"""
|
||||
环保监测数据
|
||||
"""
|
||||
RUNING_STATE_CHOICES = (
|
||||
(10, '运行'),
|
||||
(20, '待机'),
|
||||
(30, '停机'),
|
||||
(40, '故障'),
|
||||
(50, '未知')
|
||||
)
|
||||
equipment = models.ForeignKey(
|
||||
Equipment, verbose_name='关联设备', on_delete=models.CASCADE)
|
||||
time = models.DateTimeField('采集时间', primary_key=True)
|
||||
is_online = models.PositiveSmallIntegerField('是否在线', default=1)
|
||||
running_state = models.PositiveSmallIntegerField('运行状态', default=10)
|
||||
dust_rtd = models.DecimalField(
|
||||
'颗粒物实测(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
dust_zs = models.DecimalField(
|
||||
'颗粒物折算(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
temperature = models.DecimalField(
|
||||
'温度(℃)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
pressure = models.DecimalField(
|
||||
'压力(kPa)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
speed = models.DecimalField(
|
||||
'流速(m/s)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
humidity = models.DecimalField(
|
||||
'湿度(%)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
flux = models.DecimalField(
|
||||
'流量(m3/h)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
pm25 = models.DecimalField(
|
||||
'PM2.5(ug/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
pm10 = models.DecimalField(
|
||||
'PM10(ug/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
tsp = models.DecimalField(
|
||||
'TSP(ug/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
wind_direction = models.PositiveSmallIntegerField(
|
||||
'风向', null=True, blank=True)
|
||||
wind_speed = models.DecimalField(
|
||||
'风速(m/s)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
so2_rtd = models.DecimalField(
|
||||
'二氧化硫实测(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
so2_zs = models.DecimalField(
|
||||
'二氧化硫折算(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
nox_rtd = models.DecimalField(
|
||||
'氮氧化物实测(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
nox_zs = models.DecimalField(
|
||||
'氮氧化物折算(mg/m3)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
o2 = models.DecimalField('含氧量(%)', max_digits=10,
|
||||
decimal_places=4, null=True, blank=True)
|
||||
|
||||
RUNING_STATE_CHOICES = ((10, "运行"), (20, "待机"), (30, "停机"), (40, "故障"), (50, "未知"))
|
||||
equipment = models.ForeignKey(Equipment, verbose_name="关联设备", on_delete=models.CASCADE)
|
||||
timex = models.DateTimeField("采集时间", primary_key=True)
|
||||
is_online = models.PositiveSmallIntegerField("是否在线", default=1)
|
||||
running_state = models.PositiveSmallIntegerField("运行状态", default=10)
|
||||
dust_rtd = models.FloatField("颗粒物实测(mg/m3)", null=True, blank=True)
|
||||
dust_zs = models.FloatField("颗粒物折算(mg/m3)", null=True, blank=True)
|
||||
temperature = models.FloatField("温度(℃)", null=True, blank=True)
|
||||
pressure = models.FloatField("压力(kPa)", null=True, blank=True)
|
||||
speed = models.FloatField("流速(m/s)", null=True, blank=True)
|
||||
humidity = models.FloatField("湿度(%)", null=True, blank=True)
|
||||
flux = models.FloatField("流量(m3/h)", null=True, blank=True)
|
||||
pm25 = models.FloatField("PM2.5(ug/m3)", null=True, blank=True)
|
||||
pm10 = models.FloatField("PM10(ug/m3)", null=True, blank=True)
|
||||
tsp = models.FloatField("TSP(ug/m3)", null=True, blank=True)
|
||||
wind_direction = models.PositiveSmallIntegerField("风向", null=True, blank=True)
|
||||
wind_speed = models.FloatField("风速(m/s)", null=True, blank=True)
|
||||
so2_rtd = models.FloatField("二氧化硫实测(mg/m3)", null=True, blank=True)
|
||||
so2_zs = models.FloatField("二氧化硫折算(mg/m3)", null=True, blank=True)
|
||||
nox_rtd = models.FloatField("氮氧化物实测(mg/m3)", null=True, blank=True)
|
||||
nox_zs = models.FloatField("氮氧化物折算(mg/m3)", null=True, blank=True)
|
||||
o2 = models.FloatField("含氧量(%)", null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'enp_envdata'
|
||||
db_table = "enp_envdata"
|
||||
managed = False
|
||||
unique_together = (('equipment', 'time'), )
|
||||
unique_together = (("equipment", "timex"),)
|
||||
|
||||
|
||||
class VehicleAccess(BaseModel):
|
||||
type = models.PositiveSmallIntegerField(
|
||||
'出入类型', default=1, help_text='1: 进厂, 2: 出厂')
|
||||
vehicle_number = models.CharField('车牌号', max_length=10)
|
||||
access_time = models.DateTimeField('出入时间', null=True, blank=True)
|
||||
emission_standard = models.CharField(
|
||||
'排放标准', max_length=10, null=True, blank=True)
|
||||
is_new_energy = models.BooleanField('是否新能源', default=False)
|
||||
door_name = models.CharField('门禁名称', max_length=10, null=True, blank=True)
|
||||
type = models.PositiveSmallIntegerField("出入类型", default=1, help_text="1: 进厂, 2: 出厂")
|
||||
vehicle_number = models.CharField("车牌号", max_length=10)
|
||||
access_time = models.DateTimeField("出入时间", null=True, blank=True)
|
||||
emission_standard = models.CharField("排放标准", max_length=10, null=True, blank=True)
|
||||
is_new_energy = models.BooleanField("是否新能源", default=False)
|
||||
door_name = models.CharField("门禁名称", max_length=10, null=True, blank=True)
|
||||
|
||||
|
||||
class CarWash(BaseModel):
|
||||
station = models.ForeignKey(
|
||||
Equipment, verbose_name='洗车台', on_delete=models.CASCADE)
|
||||
vehicle_number = models.CharField('车牌号', max_length=10, default='')
|
||||
start_time = models.DateTimeField('洗车时间', null=True, blank=True)
|
||||
end_time = models.DateTimeField('洗车完成时间', null=True, blank=True)
|
||||
duration = models.PositiveIntegerField('洗车时长(s)', null=True, blank=True)
|
||||
pressure = models.DecimalField(
|
||||
'洗车压力(Mpa)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
flux = models.DecimalField(
|
||||
'洗车流量(L/min)', max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
station = models.ForeignKey(Equipment, verbose_name="洗车台", on_delete=models.CASCADE)
|
||||
vehicle_number = models.CharField("车牌号", max_length=10, default="")
|
||||
start_time = models.DateTimeField("洗车时间", null=True, blank=True)
|
||||
end_time = models.DateTimeField("洗车完成时间", null=True, blank=True)
|
||||
duration = models.PositiveIntegerField("洗车时长(s)", null=True, blank=True)
|
||||
pressure = models.DecimalField("洗车压力(Mpa)", max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
flux = models.DecimalField("洗车流量(L/min)", max_digits=10, decimal_places=4, null=True, blank=True)
|
||||
|
|
|
@ -10,7 +10,8 @@ from apps.utils.sql import query_all_dict
|
|||
|
||||
class DrainSerializer(CustomModelSerializer):
|
||||
"""Serializer for Drain model"""
|
||||
mgroup_name = serializers.CharField(source='mgroup.name', read_only=True)
|
||||
|
||||
mgroup_name = serializers.CharField(source="mgroup.name", read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Drain
|
||||
|
@ -18,13 +19,13 @@ class DrainSerializer(CustomModelSerializer):
|
|||
read_only_fields = EXCLUDE_FIELDS_DEPT
|
||||
|
||||
def validate(self, attrs):
|
||||
attrs['belong_dept'] = attrs['mgroup'].belong_dept
|
||||
attrs["belong_dept"] = attrs["mgroup"].belong_dept
|
||||
return super().validate(attrs)
|
||||
|
||||
|
||||
class Drain2Serializer(CustomModelSerializer):
|
||||
equip_data = serializers.SerializerMethodField()
|
||||
mgroup_name = serializers.CharField(source='mgroup.name', read_only=True)
|
||||
mgroup_name = serializers.CharField(source="mgroup.name", read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = Drain
|
||||
|
@ -34,13 +35,12 @@ class Drain2Serializer(CustomModelSerializer):
|
|||
def get_equip_data(self, obj):
|
||||
equips = obj.equipments.all()
|
||||
now = datetime.now()
|
||||
today = str(now)[:10]+' 00:00:00'
|
||||
today_last = str(now)[:10]+' 23:59:59'
|
||||
odata = equips.values('id', 'name', 'type',
|
||||
'is_online', 'running_state')
|
||||
today = str(now)[:10] + " 00:00:00"
|
||||
today_last = str(now)[:10] + " 23:59:59"
|
||||
odata = equips.values("id", "name", "type", "is_online", "running_state")
|
||||
eids = [f"'{e['id']}'" for e in odata]
|
||||
eids_str = ','.join(eids)
|
||||
sql_str = f'''
|
||||
eids_str = ",".join(eids)
|
||||
sql_str = f"""
|
||||
SELECT
|
||||
equipment_id,
|
||||
AVG ( tsp ) AS avg_tsp,
|
||||
|
@ -86,29 +86,32 @@ FROM
|
|||
) AS durations
|
||||
GROUP BY
|
||||
equipment_id;
|
||||
'''
|
||||
"""
|
||||
res = query_all_dict(sql_str)
|
||||
data = {}
|
||||
for i in res:
|
||||
data[i['equipment_id']] = i
|
||||
data[i["equipment_id"]] = i
|
||||
|
||||
for i in odata:
|
||||
i.update(data.get(i['id'], {
|
||||
"avg_tsp": None,
|
||||
"total_duration_online": 0,
|
||||
"total_duration_run": 0,
|
||||
"total_duration_standby": 0,
|
||||
"last_running_state": 50,
|
||||
}))
|
||||
i.update(
|
||||
data.get(
|
||||
i["id"],
|
||||
{
|
||||
"avg_tsp": None,
|
||||
"total_duration_online": 0,
|
||||
"total_duration_run": 0,
|
||||
"total_duration_standby": 0,
|
||||
"last_running_state": 50,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
return odata
|
||||
|
||||
|
||||
class DrainEquipSerializer(CustomModelSerializer):
|
||||
equipment_type = serializers.CharField(
|
||||
source='equipment.type', read_only=True)
|
||||
equipment_name = serializers.CharField(
|
||||
source='equipment.name', read_only=True)
|
||||
equipment_type = serializers.CharField(source="equipment.type", read_only=True)
|
||||
equipment_name = serializers.CharField(source="equipment.name", read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = DrainEquip
|
||||
|
@ -125,21 +128,17 @@ class EnvDataSerializer(CustomModelSerializer):
|
|||
|
||||
|
||||
class DrainEquipEnvSerializer(CustomModelSerializer):
|
||||
equipment_number = serializers.CharField(
|
||||
source='equipment.number', read_only=True)
|
||||
equipment_type = serializers.CharField(
|
||||
source='equipment.type', read_only=True)
|
||||
equipment_name = serializers.CharField(
|
||||
source='equipment.name', read_only=True)
|
||||
equipment_number = serializers.CharField(source="equipment.number", read_only=True)
|
||||
equipment_type = serializers.CharField(source="equipment.type", read_only=True)
|
||||
equipment_name = serializers.CharField(source="equipment.name", read_only=True)
|
||||
equipment_envdata = serializers.SerializerMethodField()
|
||||
equipment_ = EquipmentSerializer(source='equipment', read_only=True)
|
||||
drain_ = DrainSerializer(source='drain', read_only=True)
|
||||
equipment_ = EquipmentSerializer(source="equipment", read_only=True)
|
||||
drain_ = DrainSerializer(source="drain", read_only=True)
|
||||
|
||||
def get_equipment_envdata(self, obj):
|
||||
now = timezone.now()
|
||||
now_10_before = now - timezone.timedelta(minutes=10)
|
||||
obj = EnvData.objects.filter(
|
||||
equipment=obj.equipment, time__gte=now_10_before, time__lte=now).order_by('-time').select_related('equipment').first()
|
||||
obj = EnvData.objects.filter(equipment=obj.equipment, time__gte=now_10_before, time__lte=now).order_by("-time").select_related("equipment").first()
|
||||
if obj:
|
||||
return EnvDataSerializer(instance=obj).data
|
||||
else:
|
||||
|
@ -152,6 +151,7 @@ class DrainEquipEnvSerializer(CustomModelSerializer):
|
|||
|
||||
class VehicleAccessSerializer(CustomModelSerializer):
|
||||
"""Serializer for VehicleAccess model"""
|
||||
|
||||
class Meta:
|
||||
model = VehicleAccess
|
||||
fields = "__all__"
|
||||
|
@ -159,13 +159,12 @@ class VehicleAccessSerializer(CustomModelSerializer):
|
|||
|
||||
|
||||
class EnvDataExportSerializer(serializers.Serializer):
|
||||
time = serializers.DateTimeField(label='时间')
|
||||
type = serializers.ChoiceField(
|
||||
label='导出类型', choices=['hour', 'day', 'week', 'month', 'season', 'year'])
|
||||
time = serializers.DateTimeField(label="时间")
|
||||
type = serializers.ChoiceField(label="导出类型", choices=["hour", "day", "week", "month", "season", "year"])
|
||||
|
||||
|
||||
class CarWashSerializer(CustomModelSerializer):
|
||||
station_name = serializers.CharField(source='station.name', read_only=True)
|
||||
station_name = serializers.CharField(source="station.name", read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = CarWash
|
||||
|
|
|
@ -11,14 +11,13 @@ import random
|
|||
|
||||
@shared_task(base=CustomTask)
|
||||
def generate_envdata():
|
||||
"""生成模拟数据
|
||||
"""
|
||||
"""生成模拟数据"""
|
||||
now = timezone.now()
|
||||
eIds = DrainEquip.objects.values_list('equipment__id', flat=True)
|
||||
equips = Equipment.objects.filter(id__in=eIds)|Equipment.objects.filter(cate__code='aqms')
|
||||
eIds = DrainEquip.objects.values_list("equipment__id", flat=True)
|
||||
equips = Equipment.objects.filter(id__in=eIds) | Equipment.objects.filter(cate__code="aqms")
|
||||
save_list = []
|
||||
for equip in equips:
|
||||
default_dict = {"equipment": equip, "time": now, "is_online": 1, "running_state": 10}
|
||||
default_dict = {"equipment": equip, "timex": now, "is_online": 1, "running_state": 10}
|
||||
equip.is_online = 1
|
||||
equip.running_state = 10
|
||||
equip.save()
|
||||
|
@ -42,8 +41,8 @@ def generate_envdata():
|
|||
default_dict["tsp"] = random.uniform(0.01, 0.04)
|
||||
default_dict["temperature"] = random.uniform(12, 30)
|
||||
default_dict["humidity"] = random.uniform(30, 40)
|
||||
elif equip.cate.code == 'aqms':
|
||||
default_dict['pm25'] = random.uniform(8, 12)
|
||||
elif equip.cate.code == "aqms":
|
||||
default_dict["pm25"] = random.uniform(8, 12)
|
||||
default_dict["pm10"] = random.uniform(26, 35)
|
||||
default_dict["temperature"] = random.uniform(12, 30)
|
||||
default_dict["humidity"] = random.uniform(30, 40)
|
||||
|
@ -51,8 +50,6 @@ def generate_envdata():
|
|||
default_dict["wind_direction"] = 1
|
||||
save_list.append(EnvData(**default_dict))
|
||||
EnvData.objects.bulk_create(save_list)
|
||||
|
||||
|
||||
|
||||
|
||||
@shared_task(base=CustomTask)
|
||||
|
|
Loading…
Reference in New Issue