From 7555d6f8e9301aa35feace71cddf677e1818730c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 6 Oct 2021 17:32:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=AF=E4=BF=9D=E7=AE=A1=E7=90=86=E9=A2=84?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...废管理台账和日常记录表 (1).docx | Bin 0 -> 20577 bytes doc/2.危废相关台账(1).docx | Bin 0 -> 27414 bytes doc/3.污染物排放台账(1).docx | Bin 0 -> 56738 bytes enp/__init__.py | 0 enp/admin.py | 3 + enp/apps.py | 5 + enp/migrations/0001_initial.py | 56 ++ .../0002_normalwasterrecord_waste.py | 20 + enp/migrations/0003_auto_20211003_2240.py | 50 ++ enp/migrations/0004_dwastemakelist.py | 38 ++ enp/migrations/0005_dwastemakerecord.py | 38 ++ .../0006_dwastemakerecord_usecomp.py | 21 + enp/migrations/0007_dwastekeeprecord.py | 41 ++ enp/migrations/0008_dwastehandlerecord.py | 39 ++ enp/migrations/0009_drain.py | 33 + enp/migrations/0010_gasemit.py | 49 ++ enp/migrations/__init__.py | 0 enp/models.py | 119 ++++ enp/predict.py | 54 ++ enp/templates/dangerousWaste.html | 612 ++++++++++++++++++ enp/templates/gaspredict.html | 139 ++++ enp/templates/waste.html | 215 ++++++ enp/templates/wgas.html | 272 ++++++++ enp/templates/wwater.html | 215 ++++++ enp/tests.py | 3 + enp/urls.py | 9 + enp/urls_api.py | 14 + enp/views.py | 326 ++++++++++ mysite/urls.py | 2 + utils/models.py | 29 + 30 files changed, 2402 insertions(+) create mode 100644 doc/1.一般工业固废管理台账和日常记录表 (1).docx create mode 100644 doc/2.危废相关台账(1).docx create mode 100644 doc/3.污染物排放台账(1).docx create mode 100644 enp/__init__.py create mode 100644 enp/admin.py create mode 100644 enp/apps.py create mode 100644 enp/migrations/0001_initial.py create mode 100644 enp/migrations/0002_normalwasterrecord_waste.py create mode 100644 enp/migrations/0003_auto_20211003_2240.py create mode 100644 enp/migrations/0004_dwastemakelist.py create mode 100644 enp/migrations/0005_dwastemakerecord.py create mode 100644 enp/migrations/0006_dwastemakerecord_usecomp.py create mode 100644 enp/migrations/0007_dwastekeeprecord.py create mode 100644 enp/migrations/0008_dwastehandlerecord.py create mode 100644 enp/migrations/0009_drain.py create mode 100644 enp/migrations/0010_gasemit.py create mode 100644 enp/migrations/__init__.py create mode 100644 enp/models.py create mode 100644 enp/predict.py create mode 100644 enp/templates/dangerousWaste.html create mode 100644 enp/templates/gaspredict.html create mode 100644 enp/templates/waste.html create mode 100644 enp/templates/wgas.html create mode 100644 enp/templates/wwater.html create mode 100644 enp/tests.py create mode 100644 enp/urls.py create mode 100644 enp/urls_api.py create mode 100644 enp/views.py create mode 100644 utils/models.py diff --git a/doc/1.一般工业固废管理台账和日常记录表 (1).docx b/doc/1.一般工业固废管理台账和日常记录表 (1).docx new file mode 100644 index 0000000000000000000000000000000000000000..26b87a8e8a3013fc85dc585a3e2dfa33ff9ce619 GIT binary patch literal 20577 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 J3d=1J4*)W>t(*V= literal 0 HcmV?d00001 diff --git a/enp/__init__.py b/enp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/enp/admin.py b/enp/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/enp/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/enp/apps.py b/enp/apps.py new file mode 100644 index 00000000..afadc1d7 --- /dev/null +++ b/enp/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class EnpConfig(AppConfig): + name = 'enp' diff --git a/enp/migrations/0001_initial.py b/enp/migrations/0001_initial.py new file mode 100644 index 00000000..1869f1b9 --- /dev/null +++ b/enp/migrations/0001_initial.py @@ -0,0 +1,56 @@ +# Generated by Django 2.2.8 on 2021-10-02 23:26 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ] + + operations = [ + migrations.CreateModel( + name='Waste', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('number', models.CharField(max_length=100, verbose_name='编号')), + ('name', models.CharField(max_length=100, verbose_name='名称')), + ('type', models.IntegerField(choices=[(1, '一般工业固废')], default=1, verbose_name='废物类型')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='waste_create_by', to='safesite.User', verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='waste_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='NormalWasterRecord', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('gen_date', models.DateField(verbose_name='产生日期')), + ('dis_date', models.DateField(verbose_name='处置日期')), + ('gen_count', models.FloatField(verbose_name='产生数量')), + ('dis_count', models.FloatField(verbose_name='委托处置量')), + ('inv_count', models.FloatField(verbose_name='库存量')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='normalwasterrecord_create_by', to='safesite.User', verbose_name='创建人')), + ('operator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User', verbose_name='经办人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='normalwasterrecord_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/0002_normalwasterrecord_waste.py b/enp/migrations/0002_normalwasterrecord_waste.py new file mode 100644 index 00000000..ff825556 --- /dev/null +++ b/enp/migrations/0002_normalwasterrecord_waste.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.8 on 2021-10-02 23:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('enp', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='normalwasterrecord', + name='waste', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='enp.Waste', verbose_name='关联废物'), + preserve_default=False, + ), + ] diff --git a/enp/migrations/0003_auto_20211003_2240.py b/enp/migrations/0003_auto_20211003_2240.py new file mode 100644 index 00000000..4057709c --- /dev/null +++ b/enp/migrations/0003_auto_20211003_2240.py @@ -0,0 +1,50 @@ +# Generated by Django 2.2.8 on 2021-10-03 22:40 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0002_normalwasterrecord_waste'), + ] + + operations = [ + migrations.CreateModel( + name='NormalWasteRecord', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('gen_date', models.DateField(verbose_name='产生日期')), + ('dis_date', models.DateField(verbose_name='处置日期')), + ('gen_count', models.FloatField(verbose_name='产生数量')), + ('dis_count', models.FloatField(verbose_name='委托处置量')), + ('inv_count', models.FloatField(verbose_name='库存量')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='normalwasterecord_create_by', to='safesite.User', verbose_name='创建人')), + ('operator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User', verbose_name='经办人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='normalwasterecord_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterField( + model_name='waste', + name='type', + field=models.IntegerField(choices=[(1, '一般工业固废'), (2, '危废')], default=1, verbose_name='废物类型'), + ), + migrations.DeleteModel( + name='NormalWasterRecord', + ), + migrations.AddField( + model_name='normalwasterecord', + name='waste', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.Waste', verbose_name='关联废物'), + ), + ] diff --git a/enp/migrations/0004_dwastemakelist.py b/enp/migrations/0004_dwastemakelist.py new file mode 100644 index 00000000..5dc394ae --- /dev/null +++ b/enp/migrations/0004_dwastemakelist.py @@ -0,0 +1,38 @@ +# Generated by Django 2.2.8 on 2021-10-03 23:49 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0003_auto_20211003_2240'), + ] + + operations = [ + migrations.CreateModel( + name='DWasteMakeList', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('process', models.CharField(max_length=100, verbose_name='产生工序')), + ('source', models.CharField(max_length=100, verbose_name='源/车间')), + ('goto', models.CharField(max_length=100, verbose_name='废物流向')), + ('companyname', models.CharField(max_length=100, verbose_name='处理企业名称')), + ('gen_count', models.FloatField(verbose_name='年度产生量(吨)')), + ('license', models.CharField(max_length=100, verbose_name='许可证编号')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastemakelist_create_by', to='safesite.User', verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastemakelist_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ('waste', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.Waste', verbose_name='关联废物')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/0005_dwastemakerecord.py b/enp/migrations/0005_dwastemakerecord.py new file mode 100644 index 00000000..976479d1 --- /dev/null +++ b/enp/migrations/0005_dwastemakerecord.py @@ -0,0 +1,38 @@ +# Generated by Django 2.2.8 on 2021-10-04 16:19 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0004_dwastemakelist'), + ] + + operations = [ + migrations.CreateModel( + name='DWasteMakeRecord', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('gen_time', models.DateTimeField(verbose_name='产生时间')), + ('gen_count', models.FloatField(verbose_name='产生数量')), + ('container', models.CharField(max_length=100, verbose_name='容器情况')), + ('container_count', models.IntegerField(verbose_name='容器个数')), + ('trans_time', models.DateTimeField(verbose_name='转移时间')), + ('trans_count', models.IntegerField(verbose_name='转移个数')), + ('goto', models.CharField(max_length=100, verbose_name='去向')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastemakerecord_create_by', to='safesite.User', verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastemakerecord_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('waste', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.Waste', verbose_name='关联废物')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/0006_dwastemakerecord_usecomp.py b/enp/migrations/0006_dwastemakerecord_usecomp.py new file mode 100644 index 00000000..0e99ccec --- /dev/null +++ b/enp/migrations/0006_dwastemakerecord_usecomp.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.8 on 2021-10-04 16:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0005_dwastemakerecord'), + ] + + operations = [ + migrations.AddField( + model_name='dwastemakerecord', + name='usecomp', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司'), + preserve_default=False, + ), + ] diff --git a/enp/migrations/0007_dwastekeeprecord.py b/enp/migrations/0007_dwastekeeprecord.py new file mode 100644 index 00000000..5faf5542 --- /dev/null +++ b/enp/migrations/0007_dwastekeeprecord.py @@ -0,0 +1,41 @@ +# Generated by Django 2.2.8 on 2021-10-04 20:42 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0006_dwastemakerecord_usecomp'), + ] + + operations = [ + migrations.CreateModel( + name='DWasteKeepRecord', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('in_time', models.DateTimeField(verbose_name='入库时间')), + ('in_count', models.FloatField(verbose_name='入库数量')), + ('source', models.CharField(max_length=100, verbose_name='废物来源')), + ('container', models.CharField(max_length=100, verbose_name='容器规格')), + ('container_count', models.IntegerField(verbose_name='容器个数')), + ('place', models.CharField(max_length=50, verbose_name='存放位置')), + ('out_time', models.DateTimeField(verbose_name='出库时间')), + ('out_count', models.IntegerField(verbose_name='出库数量')), + ('goto', models.CharField(max_length=100, verbose_name='去向')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastekeeprecord_create_by', to='safesite.User', verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastekeeprecord_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ('waste', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.Waste', verbose_name='关联废物')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/0008_dwastehandlerecord.py b/enp/migrations/0008_dwastehandlerecord.py new file mode 100644 index 00000000..44bbd044 --- /dev/null +++ b/enp/migrations/0008_dwastehandlerecord.py @@ -0,0 +1,39 @@ +# Generated by Django 2.2.8 on 2021-10-04 21:46 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0007_dwastekeeprecord'), + ] + + operations = [ + migrations.CreateModel( + name='DWasteHandleRecord', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('accept_time', models.DateTimeField(verbose_name='接收时间')), + ('accept_count', models.FloatField(verbose_name='接收数量')), + ('source', models.CharField(max_length=100, verbose_name='废物来源')), + ('container', models.CharField(max_length=100, verbose_name='容器规格')), + ('container_count', models.IntegerField(verbose_name='容器个数')), + ('handle_time', models.DateTimeField(verbose_name='处置时间')), + ('handle_method', models.CharField(max_length=100, verbose_name='处置方式')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastehandlerecord_create_by', to='safesite.User', verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='dwastehandlerecord_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ('waste', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.Waste', verbose_name='关联废物')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/0009_drain.py b/enp/migrations/0009_drain.py new file mode 100644 index 00000000..515bb959 --- /dev/null +++ b/enp/migrations/0009_drain.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.8 on 2021-10-05 15:23 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0008_dwastehandlerecord'), + ] + + operations = [ + migrations.CreateModel( + name='Drain', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('number', models.CharField(max_length=100, verbose_name='编号')), + ('name', models.CharField(max_length=100, verbose_name='名称')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='drain_create_by', to='safesite.User', verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='drain_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/0010_gasemit.py b/enp/migrations/0010_gasemit.py new file mode 100644 index 00000000..4f964598 --- /dev/null +++ b/enp/migrations/0010_gasemit.py @@ -0,0 +1,49 @@ +# Generated by Django 2.2.8 on 2021-10-05 17:02 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0389_auto_20210905_1612'), + ('enp', '0009_drain'), + ] + + operations = [ + migrations.CreateModel( + name='GasEmit', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('watch_time', models.DateTimeField(verbose_name='监测时间')), + ('out_smoke', models.FloatField(verbose_name='标态干烟气量')), + ('out_o2', models.FloatField(verbose_name='氧含量')), + ('out_so2', models.FloatField(verbose_name='二氧化硫')), + ('out_so2_s', models.FloatField(verbose_name='二氧化硫s')), + ('out_particle', models.FloatField(verbose_name='颗粒物')), + ('out_particle_s', models.FloatField(verbose_name='颗粒物s')), + ('out_nox', models.FloatField(verbose_name='氮氧化物')), + ('out_nox_s', models.FloatField(verbose_name='氮氧化物s')), + ('in_smoke', models.FloatField(verbose_name='标态干烟气量')), + ('in_o2', models.FloatField(verbose_name='氧含量')), + ('in_so2', models.FloatField(verbose_name='二氧化硫')), + ('in_so2_s', models.FloatField(verbose_name='二氧化硫s')), + ('in_particle', models.FloatField(verbose_name='颗粒物')), + ('in_particle_s', models.FloatField(verbose_name='颗粒物s')), + ('in_nox', models.FloatField(verbose_name='氮氧化物')), + ('in_nox_s', models.FloatField(verbose_name='氮氧化物s')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='gasemit_create_by', to='safesite.User', verbose_name='创建人')), + ('drain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='enp.Drain', verbose_name='关联排放口')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='gasemit_update_by', to='safesite.User', verbose_name='最后编辑人')), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/enp/migrations/__init__.py b/enp/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/enp/models.py b/enp/models.py new file mode 100644 index 00000000..14a490e4 --- /dev/null +++ b/enp/models.py @@ -0,0 +1,119 @@ +from django.db import models +from safesite.models import User, Partment +from utils.models import CommonModel +# Create your models here. + +class Waste(CommonModel): + type_choices = ( + (1, '一般工业固废'), + (2, '危废') + ) + number = models.CharField('编号', max_length=100) + name = models.CharField('名称', max_length=100) + type = models.IntegerField('废物类型', choices=type_choices, default=1) + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + + +class NormalWasteRecord(CommonModel): + """ + 一般废物排放记录 + """ + gen_date = models.DateField('产生日期') + dis_date = models.DateField('处置日期') + gen_count = models.FloatField('产生数量') + dis_count = models.FloatField('委托处置量') + inv_count = models.FloatField('库存量') + waste = models.ForeignKey(Waste, on_delete=models.CASCADE, verbose_name='关联废物') + operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='经办人') + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + +class DWasteMakeList(CommonModel): + """ + 危废产生一览表 + """ + waste = models.ForeignKey(Waste, on_delete=models.CASCADE, verbose_name='关联废物') + process = models.CharField('产生工序', max_length=100) + source = models.CharField('源/车间', max_length=100) + goto = models.CharField('废物流向', max_length=100) + companyname = models.CharField('处理企业名称', max_length=100) + gen_count = models.FloatField('年度产生量(吨)') + license = models.CharField('许可证编号', max_length=100) + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + +class DWasteMakeRecord(CommonModel): + """ + 危废产生环节记录 + """ + waste = models.ForeignKey(Waste, on_delete=models.CASCADE, verbose_name='关联废物') + gen_time = models.DateTimeField('产生时间') + gen_count = models.FloatField('产生数量') + container = models.CharField('容器情况', max_length=100) + container_count = models.IntegerField('容器个数') + trans_time = models.DateTimeField('转移时间') + trans_count = models.IntegerField('转移个数') + goto = models.CharField('去向', max_length=100) + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + + +class DWasteKeepRecord(CommonModel): + """ + 危废贮存环节记录 + """ + waste = models.ForeignKey(Waste, on_delete=models.CASCADE, verbose_name='关联废物') + in_time = models.DateTimeField('入库时间') + in_count = models.FloatField('入库数量') + source = models.CharField('废物来源', max_length=100) + container = models.CharField('容器规格', max_length=100) + container_count = models.IntegerField('容器个数') + place = models.CharField('存放位置', max_length=50) + out_time = models.DateTimeField('出库时间') + out_count = models.IntegerField('出库数量') + goto = models.CharField('去向', max_length=100) + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + + +class DWasteHandleRecord(CommonModel): + """ + 危废处置环节记录 + """ + waste = models.ForeignKey(Waste, on_delete=models.CASCADE, verbose_name='关联废物') + accept_time = models.DateTimeField('接收时间') + accept_count = models.FloatField('接收数量') + source = models.CharField('废物来源', max_length=100) + container = models.CharField('容器规格', max_length=100) + container_count = models.IntegerField('容器个数') + handle_time = models.DateTimeField('处置时间') + handle_method = models.CharField('处置方式', max_length=100) + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + +class Drain(CommonModel): + """ + 排放口 + """ + number = models.CharField('编号', max_length=100) + name = models.CharField('名称', max_length=100) + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') + +class GasEmit(CommonModel): + """ + 废气排放记录 + """ + drain = models.ForeignKey(Drain, verbose_name='关联排放口', on_delete=models.CASCADE) + watch_time = models.DateTimeField('监测时间') + out_smoke = models.FloatField('标态干烟气量') + out_o2 = models.FloatField("氧含量") + out_so2 = models.FloatField("二氧化硫") + out_so2_s = models.FloatField("二氧化硫s") + out_particle = models.FloatField("颗粒物") + out_particle_s = models.FloatField("颗粒物s") + out_nox = models.FloatField("氮氧化物") + out_nox_s = models.FloatField("氮氧化物s") + in_smoke = models.FloatField('标态干烟气量') + in_o2 = models.FloatField("氧含量") + in_so2 = models.FloatField("二氧化硫") + in_so2_s = models.FloatField("二氧化硫s") + in_particle = models.FloatField("颗粒物") + in_particle_s = models.FloatField("颗粒物s") + in_nox = models.FloatField("氮氧化物") + in_nox_s = models.FloatField("氮氧化物s") + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') \ No newline at end of file diff --git a/enp/predict.py b/enp/predict.py new file mode 100644 index 00000000..6abc1d4b --- /dev/null +++ b/enp/predict.py @@ -0,0 +1,54 @@ +import numpy as np + +def GM11(x,n): + ''' + 灰色预测 + x:序列,numpy对象 + n:需要往后预测的个数 + ''' + x1 = x.cumsum()#一次累加 + z1 = (x1[:len(x1) - 1] + x1[1:])/2.0#紧邻均值 + z1 = z1.reshape((len(z1),1)) + B = np.append(-z1,np.ones_like(z1),axis=1) + Y = x[1:].reshape((len(x) - 1,1)) + #a为发展系数 b为灰色作用量 + [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)#计算参数 + result = (x[0]-b/a)*np.exp(-a*(n-1))-(x[0]-b/a)*np.exp(-a*(n-2)) + S1_2 = x.var()#原序列方差 + e = list()#残差序列 + for index in range(1,x.shape[0]+1): + predict = (x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2)) + e.append(x[index-1]-predict) + S2_2 = np.array(e).var()#残差方差 + C = S2_2/S1_2#后验差比 + if C<=0.35: + assess = '后验差比<=0.35,模型精度等级为好' + elif C<=0.5: + assess = '后验差比<=0.5,模型精度等级为合格' + elif C<=0.65: + assess = '后验差比<=0.65,模型精度等级为勉强' + else: + assess = '后验差比>0.65,模型精度等级为不合格' + #预测数据 + predict = list() + for index in range(x.shape[0]+1,x.shape[0]+n+1): + predict.append((x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2))) + predict = np.array(predict) + return { + 'a':{'value':a,'desc':'发展系数'}, + 'b':{'value':b,'desc':'灰色作用量'}, + 'predict':{'value':result,'desc':'第%d个预测值'%n}, + 'C':{'value':C,'desc':assess}, + 'predict':{'value':predict,'desc':'往后预测%d个的序列'%(n)}, + } + +if __name__ == "__main__": + data = np.array([1.2,2.2,3.1,4.5,5.6,6.7,7.1,8.2,9.6,10.6,11,12.4,13.5,14.7,15.2]) + x = data[0:5]#输入数据 + y = data[5:7]#需要预测的数据 + result = GM11(x,len(y)) + predict = result['predict']['value'] + predict = np.round(predict,1) + print('真实值:',y) + print('预测值:',predict) + print(result) \ No newline at end of file diff --git a/enp/templates/dangerousWaste.html b/enp/templates/dangerousWaste.html new file mode 100644 index 00000000..909b527f --- /dev/null +++ b/enp/templates/dangerousWaste.html @@ -0,0 +1,612 @@ +
+ + +
+
+
+
+ 新增 + 删除 +
+
+
+
+
+ 新增 + 删除 +
+
+
+
+
+ 新增 + 删除 +
+
+
+
+
+ 新增 + 删除 +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ 保存 +
+
+
+ \ No newline at end of file diff --git a/enp/templates/gaspredict.html b/enp/templates/gaspredict.html new file mode 100644 index 00000000..39993417 --- /dev/null +++ b/enp/templates/gaspredict.html @@ -0,0 +1,139 @@ +
+
+ \ No newline at end of file diff --git a/enp/templates/waste.html b/enp/templates/waste.html new file mode 100644 index 00000000..f888db11 --- /dev/null +++ b/enp/templates/waste.html @@ -0,0 +1,215 @@ +
+ +
+
+ 新增 + 编辑 + 删除 +
+
+
+
+
+ 新增 + 删除 +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + 选择 +
+
+ 保存 +
+
+
+ \ No newline at end of file diff --git a/enp/templates/wgas.html b/enp/templates/wgas.html new file mode 100644 index 00000000..732cf6ce --- /dev/null +++ b/enp/templates/wgas.html @@ -0,0 +1,272 @@ +
+ +
+
+ 新增 + 编辑 + 删除 +
+
+
+
+
+ 新增 + 删除 +
+
+
+
+
+
+ +
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ 保存 +
+
+
+ \ No newline at end of file diff --git a/enp/templates/wwater.html b/enp/templates/wwater.html new file mode 100644 index 00000000..89bfb15d --- /dev/null +++ b/enp/templates/wwater.html @@ -0,0 +1,215 @@ +
+ +
+
+ 新增 + 编辑 + 删除 +
+
+
+
+
+ 新增 + 删除 +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+ 保存 +
+
+
+
+
+ + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + 选择 +
+
+ 保存 +
+
+
+ \ No newline at end of file diff --git a/enp/tests.py b/enp/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/enp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/enp/urls.py b/enp/urls.py new file mode 100644 index 00000000..6ecc0ea7 --- /dev/null +++ b/enp/urls.py @@ -0,0 +1,9 @@ +from django.urls import path,include +from . import views +urlpatterns = [ + path('waste/', views.HtmlWaste), + path('dangerouswaste/', views.HtmlDangerousWaste), + path('wgas/', views.HtmlWgas), + path('wwater/', views.HtmlWwater), + path('gaspredict/', views.HtmlGasPredict), +] \ No newline at end of file diff --git a/enp/urls_api.py b/enp/urls_api.py new file mode 100644 index 00000000..4514d317 --- /dev/null +++ b/enp/urls_api.py @@ -0,0 +1,14 @@ +from django.urls import path,include +from . import views + +urlpatterns = [ + path('waste//', views.ApiWaste), + path('drain//', views.ApiDrain), + path('normalwasterecord//', views.ApiNormalWasteRecord), + path('dwastemakelist//', views.ApiDWasteMakeList), + path('dwastemakerecord//', views.ApiDWasteMakeRecord), + path('dwastekeeprecord//', views.ApiDWasteKeepRecord), + path('dwastehandlerecord//', views.ApiDWasteHandleRecord), + path('gasemit//', views.ApiGasEmit), + path('gaspredict///', views.ApiGasPredict) +] \ No newline at end of file diff --git a/enp/views.py b/enp/views.py new file mode 100644 index 00000000..b16b3635 --- /dev/null +++ b/enp/views.py @@ -0,0 +1,326 @@ +from django.shortcuts import render +from rest_framework.views import APIView +from rest_framework.authentication import BaseAuthentication +from safesite.models import User +from rest_framework.exceptions import AuthenticationFailed +from .models import DWasteHandleRecord, DWasteKeepRecord, DWasteMakeList, DWasteMakeRecord, Drain, GasEmit, NormalWasteRecord, Waste +from safesite.views import transjson, fenye, MyEncoder +from django.http import HttpResponse, JsonResponse +import json +# Create your views here. +def myAuthentication(BaseAuthentication): + def authenticate(self, request): + user = User.objects.get(userid=request.session['userid']) + if user: + return (user, None) + raise AuthenticationFailed() + + +def HtmlWaste(request): + return render(request, 'waste.html') + +def HtmlDangerousWaste(request): + return render(request, 'dangerousWaste.html') + +def HtmlWgas(request): + return render(request, 'wgas.html') + +def HtmlWwater(request): + return render(request, 'wwater.html') + +def HtmlGasPredict(request): + return render(request, 'gaspredict.html') + +def ApiWaste(request, action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = Waste.objects.filter(usecomp=user.usecomp, is_deleted=False) + objs = objs.filter(type=request.GET.get('type', 1)) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('id')[startnum:endnum].values('id', 'number', 'name', 'type') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'combobox': + objs = Waste.objects.filter(usecomp=user.usecomp, is_deleted=False) + objs = objs.filter(type=request.GET.get('type', 1)).order_by('id') + data = objs.values('id', 'number', 'name') + return JsonResponse(list(data), safe=False) + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj= Waste() + obj.number = data['number'] + obj.name = data['name'] + obj.type = data['type'] + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = Waste.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + elif action == 'update': + data = json.loads(request.body.decode('utf-8')) + obj = Waste.objects.get(id=data['id']) + obj.number = data['number'] + obj.name = data['name'] + obj.update_by=user + obj.save() + return JsonResponse({"code":1}) + +def ApiNormalWasteRecord(request, action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = NormalWasteRecord.objects.filter(usecomp=user.usecomp, is_deleted=False) + if request.GET.get('waste', None): + objs = objs.filter(waste=request.GET.get('waste')) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'gen_date', 'dis_date', 'gen_count', 'dis_count', 'operator__name', 'waste__name', 'waste', 'operator', 'inv_count') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj = NormalWasteRecord() + obj.waste = Waste.objects.get(id=data['waste']) + obj.operator = User.objects.get(userid=data['operator']) + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.gen_date = data['gen_date'] + obj.dis_date = data['dis_date'] + obj.gen_count = data['gen_count'] + obj.dis_count = data['dis_count'] + obj.inv_count = data['inv_count'] + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = NormalWasteRecord.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +def ApiDWasteMakeList(request,action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = DWasteMakeList.objects.filter(usecomp=user.usecomp, is_deleted=False) + if request.GET.get('waste', None): + objs = objs.filter(waste=request.GET.get('waste')) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'waste', 'process', 'source', 'goto', 'companyname', 'gen_count', 'license', 'waste__name', 'waste__number', 'create_time') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteMakeList() + obj.waste = Waste.objects.get(id=data['waste']) + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.process = data['process'] + obj.source = data['source'] + obj.goto = data['goto'] + obj.companyname = data['companyname'] + obj.gen_count = data['gen_count'] + obj.license = data['license'] + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteMakeList.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +def ApiDWasteMakeRecord(request,action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = DWasteMakeRecord.objects.filter(usecomp=user.usecomp, is_deleted=False) + if request.GET.get('waste', None): + objs = objs.filter(waste=request.GET.get('waste')) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'waste', 'gen_time', 'gen_count', 'container', 'container_count', 'trans_time', 'trans_count', 'waste__name', 'waste__number', 'goto') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteMakeRecord() + obj.waste = Waste.objects.get(id=data['waste']) + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.gen_time = data['gen_time'] + obj.gen_count = data['gen_count'] + obj.goto = data['goto'] + obj.container = data['container'] + obj.container_count = data['container_count'] + obj.trans_time = data['trans_time'] + obj.trans_count = data['trans_count'] + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteMakeRecord.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +def ApiDWasteKeepRecord(request,action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = DWasteKeepRecord.objects.filter(usecomp=user.usecomp, is_deleted=False) + if request.GET.get('waste', None): + objs = objs.filter(waste=request.GET.get('waste')) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'waste', 'in_time', 'in_count', 'source', 'container', 'container_count', 'place', 'out_time', 'out_count', 'waste__name', 'waste__number', 'goto') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteKeepRecord() + obj.waste = Waste.objects.get(id=data['waste']) + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.in_time = data['in_time'] + obj.in_count = data['in_count'] + obj.source = data['source'] + obj.place = data['place'] + obj.goto = data['goto'] + obj.container = data['container'] + obj.container_count = data['container_count'] + obj.out_time = data['out_time'] + obj.out_count = data['out_count'] + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteKeepRecord.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +def ApiDWasteHandleRecord(request,action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = DWasteHandleRecord.objects.filter(usecomp=user.usecomp, is_deleted=False) + if request.GET.get('waste', None): + objs = objs.filter(waste=request.GET.get('waste')) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'waste', 'accept_time', 'accept_count', 'source', 'container', 'container_count', 'handle_time', 'handle_method', 'waste__name', 'waste__number') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteHandleRecord() + obj.waste = Waste.objects.get(id=data['waste']) + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.accept_time = data['accept_time'] + obj.accept_count = data['accept_count'] + obj.source = data['source'] + obj.container = data['container'] + obj.container_count = data['container_count'] + obj.handle_time = data['handle_time'] + obj.handle_method = data['handle_method'] + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = DWasteHandleRecord.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +def ApiDrain(request, action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = Drain.objects.filter(usecomp=user.usecomp, is_deleted=False) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('id')[startnum:endnum].values('id', 'number', 'name') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'combobox': + objs = Drain.objects.filter(usecomp=user.usecomp, is_deleted=False).order_by('id') + data = objs.values('id', 'number', 'name') + return JsonResponse(list(data), safe=False) + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj= Drain() + obj.number = data['number'] + obj.name = data['name'] + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = Drain.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + elif action == 'update': + data = json.loads(request.body.decode('utf-8')) + obj = Drain.objects.get(id=data['id']) + obj.number = data['number'] + obj.name = data['name'] + obj.update_by=user + obj.save() + return JsonResponse({"code":1}) + +def ApiGasEmit(request,action): + user = User.objects.get(userid=request.session['userid']) + if action == 'list': + objs = GasEmit.objects.filter(usecomp=user.usecomp, is_deleted=False) + if request.GET.get('drain', None): + objs = objs.filter(drain=request.GET.get('drain')) + total = objs.count() + startnum, endnum = fenye(request) + objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'drain', 'watch_time', 'out_smoke', 'out_o2', 'out_so2', 'out_so2_s', 'out_particle', 'out_particle_s', 'drain__name', 'drain__number' + , 'out_nox', 'out_nox_s', 'in_smoke', 'in_o2', 'in_so2', 'in_so2_s', 'in_particle', 'in_particle_s' + , 'in_nox', 'in_nox_s') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif action == 'create': + data = json.loads(request.body.decode('utf-8')) + obj = GasEmit() + obj.drain = Drain.objects.get(id=data['drain']) + obj.create_by = user + obj.update_by = user + obj.usecomp = user.usecomp + obj.watch_time = data['watch_time'] + obj.out_smoke = data['out_smoke'] + obj.out_o2 = data['out_o2'] + obj.out_so2 = data['out_so2'] + obj.out_so2_s = data['out_so2_s'] + obj.out_particle = data['out_particle'] + obj.out_particle_s = data['out_particle_s'] + obj.out_nox = data['out_nox'] + obj.out_nox_s = data['out_nox_s'] + obj.in_smoke = data['in_smoke'] + obj.in_o2 = data['in_o2'] + obj.in_so2 = data['in_so2'] + obj.in_so2_s = data['in_so2_s'] + obj.in_particle = data['in_particle'] + obj.in_particle_s = data['in_particle_s'] + obj.in_nox = data['in_nox'] + obj.in_nox_s = data['in_nox_s'] + obj.save() + return JsonResponse({"code":1}) + elif action == 'delete': + data = json.loads(request.body.decode('utf-8')) + obj = GasEmit.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +import numpy as np +from .predict import GM11 +def ApiGasPredict(request, element, drainId): + element_list = list(GasEmit.objects.filter(is_deleted=False, drain__id=drainId)\ + .order_by('-create_time')[0:5].values_list(element, flat=True)) + element_list.reverse() + if len(element_list)>=3: + result = GM11(np.array(element_list), 3) + element_list.extend(result['predict']['value']) + ret = {"code":1, "data":[round(i,2) for i in element_list]} + return JsonResponse(ret) + else: + return JsonResponse({"code":0, "msg":'至少需要三条记录'}) + \ No newline at end of file diff --git a/mysite/urls.py b/mysite/urls.py index cd8b9dde..7d7c55f4 100644 --- a/mysite/urls.py +++ b/mysite/urls.py @@ -22,6 +22,8 @@ from django.urls import include, path urlpatterns = [ path('django/', admin.site.urls), path('groups/', include('groups.urls')), + path('html/enp/', include('enp.urls')), + path('api/enp/', include('enp.urls_api')), path('',include('safesite.urls')), diff --git a/utils/models.py b/utils/models.py new file mode 100644 index 00000000..33ee8e95 --- /dev/null +++ b/utils/models.py @@ -0,0 +1,29 @@ +from django.db import models +from django.utils import timezone +from safesite.models import User + +class BaseModel(models.Model): + """ + 基本表 + """ + create_time = models.DateTimeField( + default=timezone.now, verbose_name='创建时间', help_text='创建时间') + update_time = models.DateTimeField( + auto_now=True, verbose_name='修改时间', help_text='修改时间') + is_deleted = models.BooleanField( + default=False, verbose_name='删除标记', help_text='删除标记') + + class Meta: + abstract = True + +class CommonModel(BaseModel): + """ + 业务用基本表A,包含create_by, update_by字段 + """ + create_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name= '%(class)s_create_by') + update_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name= '%(class)s_update_by') + + class Meta: + abstract = True \ No newline at end of file