From ddd0d2a6df6a892ce469073920074c32039bc05f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 22 Jan 2024 08:27:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20enp=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/enp/migrations/0001_initial.py | 72 ++++++++++++------- .../enp/migrations/0002_auto_20240119_1053.py | 66 +++++++++++++++++ apps/enp/migrations/0002_envdata.py | 48 ------------- .../enp/migrations/0003_auto_20240119_1620.py | 25 +++++++ apps/enp/models.py | 19 ++++- apps/enp/timedb.py | 24 ++++--- 6 files changed, 170 insertions(+), 84 deletions(-) create mode 100644 apps/enp/migrations/0002_auto_20240119_1053.py delete mode 100644 apps/enp/migrations/0002_envdata.py create mode 100644 apps/enp/migrations/0003_auto_20240119_1620.py diff --git a/apps/enp/migrations/0001_initial.py b/apps/enp/migrations/0001_initial.py index e7a4ad1e..76474d5f 100644 --- a/apps/enp/migrations/0001_initial.py +++ b/apps/enp/migrations/0001_initial.py @@ -21,22 +21,36 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Drain', 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, '污染源')], help_text="((10, '排放口'), (20, '污染源'))", verbose_name='类型')), + ('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, '污染源')], help_text="((10, '排放口'), (20, '污染源'))", verbose_name='类型')), ('number', models.CharField(max_length=20, verbose_name='编号')), ('name', models.CharField(max_length=20, verbose_name='名称')), - ('level', models.PositiveSmallIntegerField(choices=[(10, '主要排放口'), (20, '次要排放口')], default=20, help_text="((10, '主要排放口'), (20, '次要排放口'))", verbose_name='排口等级')), - ('cate', models.CharField(blank=True, choices=[('product', '生产工艺'), ('mtrans', '物料输送'), ('mstore', '物料储存')], help_text="(('product', '生产工艺'), ('mtrans', '物料输送'), ('mstore', '物料储存'))", max_length=10, null=True, verbose_name='分类')), - ('height', models.PositiveSmallIntegerField(default=0, verbose_name='排气筒高度')), - ('treatment_capacity', models.CharField(default='', max_length=20, verbose_name='处理量')), - ('pm_limit', models.FloatField(default=10, help_text='单位:mg/m³', verbose_name='PM超低排放限值')), - ('measure', models.CharField(default='', max_length=20, verbose_name='治理措施')), - ('coordinates', models.JSONField(default=dict, null=True, verbose_name='坐标')), - ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='drain_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='drain_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('level', models.PositiveSmallIntegerField(choices=[ + (10, '主要排放口'), (20, '次要排放口')], default=20, help_text="((10, '主要排放口'), (20, '次要排放口'))", verbose_name='排口等级')), + ('cate', models.CharField(blank=True, choices=[('product', '生产工艺'), ('mtrans', '物料输送'), ( + 'mstore', '物料储存')], help_text="(('product', '生产工艺'), ('mtrans', '物料输送'), ('mstore', '物料储存'))", max_length=10, null=True, verbose_name='分类')), + ('height', models.PositiveSmallIntegerField( + default=0, verbose_name='排气筒高度')), + ('treatment_capacity', models.CharField( + default='', max_length=20, verbose_name='处理量')), + ('pm_limit', models.FloatField(default=10, + help_text='单位:mg/m³', verbose_name='PM超低排放限值')), + ('measure', models.CharField(default='', + max_length=20, verbose_name='治理措施')), + ('coordinates', models.JSONField( + default=dict, null=True, verbose_name='坐标')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, + related_name='drain_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='drain_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), ], options={ 'abstract': False, @@ -45,13 +59,20 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DrainEquip', 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='删除标记')), - ('params_list', models.JSONField(default=list, null=True, verbose_name='监测参数列表')), - ('drain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.drain', verbose_name='排口')), - ('equipment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='em.equipment', verbose_name='关联设备')), + ('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='删除标记')), + ('params_list', models.JSONField( + default=list, null=True, verbose_name='监测参数列表')), + ('drain', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to='enp.drain', verbose_name='排口')), + ('equipment', models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to='em.equipment', verbose_name='关联设备')), ], options={ 'abstract': False, @@ -60,16 +81,19 @@ class Migration(migrations.Migration): migrations.AddField( model_name='drain', name='equipments', - field=models.ManyToManyField(blank=True, related_name='drain_equipments', through='enp.DrainEquip', to='em.Equipment', verbose_name='关联设备'), + field=models.ManyToManyField(blank=True, related_name='drain_equipments', + through='enp.DrainEquip', to='em.Equipment', verbose_name='关联设备'), ), migrations.AddField( model_name='drain', name='mgroup', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.mgroup', verbose_name='所属工段'), + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to='mtm.mgroup', verbose_name='所属工段'), ), migrations.AddField( model_name='drain', name='update_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='drain_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, + related_name='drain_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), ), ] diff --git a/apps/enp/migrations/0002_auto_20240119_1053.py b/apps/enp/migrations/0002_auto_20240119_1053.py new file mode 100644 index 00000000..fe9ae22b --- /dev/null +++ b/apps/enp/migrations/0002_auto_20240119_1053.py @@ -0,0 +1,66 @@ +# Generated by Django 3.2.12 on 2024-01-19 02:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('enp', '0001_initial'), + ] + + operations = [ + migrations.RunSQL( + sql=[( + """ +CREATE TABLE public.enp_envdata ( + "time" timestamp 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) +); +SELECT create_hypertable('enp_envdata', 'time'); + """ + )], + reverse_sql=[ + "DROP TABLE IF EXISTS public.enp_envdata;" + ] + ), + migrations.AddField( + 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='排口'), + ), + 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='关联设备'), + ), + ] diff --git a/apps/enp/migrations/0002_envdata.py b/apps/enp/migrations/0002_envdata.py deleted file mode 100644 index fbadf48a..00000000 --- a/apps/enp/migrations/0002_envdata.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 3.2.12 on 2024-01-12 04:17 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('em', '0010_auto_20240110_1232'), - ('enp', '0001_initial'), - ] - - operations = [ - migrations.RunSQL( - sql=[( - """ -CREATE TABLE public.enp_envdata ( - "time" timestamp NOT NULL, - "equipment_id" text NOT NULL, - "is_online" bool NOT NULL, - "is_runing" bool NOT NULL, - "dust_rtd" decimal, - "dust_zs" decimal, - "temperature" decimal, - "pressure" decimal, - "speed" decimal, - "humidity" decimal, - "flux" decimal, - "pm25" decimal, - "pm10" decimal, - "tsp" decimal, - "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) -); -SELECT create_hypertable('enp_envdata', 'time'); - """ - )], - reverse_sql=[ - "DROP TABLE IF EXISTS public.enp_envdata;" - ] - ) - ] diff --git a/apps/enp/migrations/0003_auto_20240119_1620.py b/apps/enp/migrations/0003_auto_20240119_1620.py new file mode 100644 index 00000000..f8ad7237 --- /dev/null +++ b/apps/enp/migrations/0003_auto_20240119_1620.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.12 on 2024-01-19 08:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enp', '0002_auto_20240119_1053'), + ] + + operations = [ + migrations.AddField( + model_name='drainequip', + name='pm10_alarm', + field=models.DecimalField( + blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='PM10报警值'), + ), + migrations.AddField( + model_name='drainequip', + name='pm25_alarm', + field=models.DecimalField( + blank=True, decimal_places=4, max_digits=10, null=True, verbose_name='PM2.5报警值'), + ), + ] diff --git a/apps/enp/models.py b/apps/enp/models.py index 34a22cf1..be4c135b 100644 --- a/apps/enp/models.py +++ b/apps/enp/models.py @@ -52,17 +52,30 @@ class DrainEquip(BaseModel): equipment = models.ForeignKey( Equipment, verbose_name='关联设备', related_name='drainequip_equipment', on_delete=models.CASCADE) params_list = models.JSONField('监测参数列表', default=list, null=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) 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.BooleanField('是否在线', default=True) - is_runing = models.BooleanField('是否运行', default=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( @@ -83,6 +96,8 @@ class EnvData(models.Model): '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( diff --git a/apps/enp/timedb.py b/apps/enp/timedb.py index 8249b8b7..5a2dcfd3 100644 --- a/apps/enp/timedb.py +++ b/apps/enp/timedb.py @@ -3,19 +3,23 @@ CONNECTION = "postgres://postgres:zcDsj2021@49.232.14.174:5432/ehs_develop" with psycopg2.connect(CONNECTION) as conn: cursor = conn.cursor() query = """ -SELECT generate_series(now() - interval '24 hour', now(), interval '5 minute') AS time, - '3491356310052896768' as equipment_id, - random()*100 AS temperature, - random() AS pressure; +SELECT generate_series(now() - interval '48 hour', now(), interval '20 second') AS time, + '3491356310052896768' as equipment_id, + random()*100 AS temperature, + random() AS pressure, + random()*10 AS dust_rtd, + random()*10 AS pm25, + random()*10 AS pm10 """ cursor.execute(query) values = cursor.fetchall() - for i in values: + try: + insert_values = [(str(row[0]), row[1], 1, 10, row[2], + row[3], row[4], row[5], row[6]) for row in values] query_insert = """ -INSERT INTO enp_envdata (time, equipment_id, is_online, is_runing, temperature, pressure) values (%s, %s, true, true, %s, %s) +INSERT INTO enp_envdata (time, equipment_id, is_online, running_state, temperature, pressure, dust_rtd, pm25, pm10) values (%s, %s, %s, %s, %s, %s, %s, %s, %s) """ - try: - cursor.execute(query_insert, (i[0], i[1], i[2], i[3])) - except (Exception, psycopg2.Error) as error: - print(error.pgerror) + cursor.executemany(query_insert, insert_values) + except (Exception, psycopg2.Error) as error: + print(error) conn.commit()