diff --git a/apps/enp/migrations/0002_auto_20240119_1053.py b/apps/enp/migrations/0002_auto_20240119_1053.py index 84642dad..2d534e85 100644 --- a/apps/enp/migrations/0002_auto_20240119_1053.py +++ b/apps/enp/migrations/0002_auto_20240119_1053.py @@ -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="关联设备"), ), ] diff --git a/apps/enp/migrations/0009_auto_20240411_1521.py b/apps/enp/migrations/0009_auto_20240411_1521.py new file mode 100644 index 00000000..18014a69 --- /dev/null +++ b/apps/enp/migrations/0009_auto_20240411_1521.py @@ -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报警值'), + ), + ] diff --git a/apps/enp/models.py b/apps/enp/models.py index 5df1a20e..8b1624b0 100644 --- a/apps/enp/models.py +++ b/apps/enp/models.py @@ -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) diff --git a/apps/enp/serializers.py b/apps/enp/serializers.py index d929cedd..f6ccb909 100644 --- a/apps/enp/serializers.py +++ b/apps/enp/serializers.py @@ -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 diff --git a/apps/enp/tasks.py b/apps/enp/tasks.py index 9284f74c..4774818b 100644 --- a/apps/enp/tasks.py +++ b/apps/enp/tasks.py @@ -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)