This commit is contained in:
caoqianming 2021-10-06 22:13:55 +08:00
commit 72ebcb1848
34 changed files with 2431 additions and 0 deletions

Binary file not shown.

Binary file not shown.

0
enp/__init__.py Normal file
View File

3
enp/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
enp/apps.py Normal file
View File

@ -0,0 +1,5 @@
from django.apps import AppConfig
class EnpConfig(AppConfig):
name = 'enp'

View File

@ -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,
},
),
]

View File

@ -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,
),
]

View File

@ -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='关联废物'),
),
]

View File

@ -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,
},
),
]

View File

@ -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,
},
),
]

View File

@ -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,
),
]

View File

@ -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,
},
),
]

View File

@ -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,
},
),
]

View File

@ -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,
},
),
]

View File

@ -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,
},
),
]

View File

119
enp/models.py Normal file
View File

@ -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='所属公司')

54
enp/predict.py Normal file
View File

@ -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)

View File

@ -0,0 +1,612 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'west', title:'危险废物名称', split:true, border:false" style="width: 300px;height:100%;">
<div id="dwasteTableBar">
<a onclick="addDwaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="editDWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-pencil',plain: true">编辑</a>
<a onclick="delDWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="dwasteTable" style="height:100%"></table>
</div>
<div data-options="region:'center',split:true,border:false" style="height:100%;">
<div id="dwasteTT" class="easyui-tabs" style="width:100%;height:100%;">
<div title="一览表">
<div id="dwasteMakeListTableBar">
<a onclick="addDwasteMakeList()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delDwasteMakeList()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="dwasteMakeListTable" style="height:100%"></table>
</div>
<div title="产生环节记录">
<div id="dwasteMakeRecordTableBar">
<a onclick="addDwasteMakeRecord()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delDwasteMakeRecord()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="dwasteMakeRecordTable" style="height:100%"></table>
</div>
<div title="贮存环节记录">
<div id="dwasteKeepRecordTableBar">
<a onclick="addDwasteKeepRecord()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delDwasteKeepRecord()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="dwasteKeepRecordTable" style="height:100%"></table>
</div>
<div title="自行利用处置记录">
<div id="dwasteHandleRecordTableBar">
<a onclick="addDwasteHandleRecord()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delDwasteHandleRecord()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="dwasteHandleRecordTable" style="height:100%"></table>
</div>
</div>
</div>
</div>
<div id="dwasteDialog" class="easyui-dialog" style="width:400px;height:200px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="dwasteForm">
<input name="id" type="hidden">
<input name="type" type="hidden" id="typedFormItem">
<div style="margin-bottom:10px">
<input name="number" data-options="label:'废物编号'" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="name" data-options="label:'废物名称'" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveDWaste()">保存</a>
</div>
</form>
</div>
<div id="dwasteMakeListDialog" class="easyui-dialog" style="width:400px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="dwasteMakeListForm">
<input name="id" type="hidden">
<input name="waste" type="hidden" id="dwasteFormItem">
<div style="margin-bottom:10px">
<input class="easyui-combobox" name="waste"
data-options="label:'危废', valueField:'id',textField:'name',url:'/api/enp/waste/combobox/?type=2', labelWidth:100" style="width:300px;" required>
</div>
<div style="margin-bottom:10px">
<input name="license" data-options="label:'许可证', labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="process" data-options="label:'产生工序', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="source" data-options="label:'生产源/车间', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="goto" data-options="label:'废物流向', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="companyname" data-options="label:'处理企业', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="gen_count" data-options="label:'年度产生量(吨)', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveDwasteMakeList()">保存</a>
</div>
</form>
</div>
<div id="dwasteMakeRecordDialog" class="easyui-dialog" style="width:400px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="dwasteMakeRecordForm">
<input name="id" type="hidden">
<input name="waste" type="hidden" id="dwasteMakeRecordForm_waste">
<div style="margin-bottom:10px">
<input class="easyui-combobox" name="waste"
data-options="label:'危废', valueField:'id',textField:'name',url:'/api/enp/waste/combobox/?type=2', labelWidth:100" style="width:300px;" required>
</div>
<div style="margin-bottom:10px">
<input name="gen_time" data-options="label:'产生时间', labelWidth:100" class="easyui-datetimebox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="gen_count" data-options="label:'产生数量', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="container" data-options="label:'容器规格', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="container_count" data-options="label:'容器个数', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="trans_time" data-options="label:'转移时间', labelWidth:100" class="easyui-datetimebox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="trans_count" data-options="label:'转移个数', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="goto" data-options="label:'去向', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveDwasteMakeRecord()">保存</a>
</div>
</form>
</div>
<div id="dwasteKeepRecordDialog" class="easyui-dialog" style="width:400px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="dwasteKeepRecordForm">
<input name="id" type="hidden">
<input name="waste" type="hidden" id="dwasteKeepRecordForm_waste">
<div style="margin-bottom:10px">
<input class="easyui-combobox" name="waste"
data-options="label:'危废', valueField:'id',textField:'name',url:'/api/enp/waste/combobox/?type=2', labelWidth:100" style="width:300px;" required>
</div>
<div style="margin-bottom:10px">
<input name="in_time" data-options="label:'入库时间', labelWidth:100" class="easyui-datetimebox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_count" data-options="label:'入库数量', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="source" data-options="label:'废物来源', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="container" data-options="label:'容器规格', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="container_count" data-options="label:'容器个数', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="place" data-options="label:'存放位置', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_time" data-options="label:'出库时间', labelWidth:100" class="easyui-datetimebox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_count" data-options="label:'出库数量', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="goto" data-options="label:'去向', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveDwasteKeepRecord()">保存</a>
</div>
</form>
</div>
<div id="dwasteHandleRecordDialog" class="easyui-dialog" style="width:400px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="dwasteHandleRecordForm">
<input name="id" type="hidden">
<input name="waste" type="hidden" id="dwasteHandleRecordForm_waste">
<div style="margin-bottom:10px">
<input class="easyui-combobox" name="waste"
data-options="label:'危废', valueField:'id',textField:'name',url:'/api/enp/waste/combobox/?type=2', labelWidth:100" style="width:300px;" required>
</div>
<div style="margin-bottom:10px">
<input name="accept_time" data-options="label:'接收时间', labelWidth:100" class="easyui-datetimebox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="accept_count" data-options="label:'接收数量', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="source" data-options="label:'废物来源', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="container" data-options="label:'容器规格', labelWidth:100" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="container_count" data-options="label:'容器个数', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="handle_time" data-options="label:'处置时间', labelWidth:100" class="easyui-datetimebox" style="width:300px;"
required></input>
</div>
<div style="margin-bottom:10px">
<input name="handle_method" data-options="label:'处置方式', labelWidth:100" class="easyui-numberbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveDwasteHandleRecord()">保存</a>
</div>
</form>
</div>
<script>
// var wasteOptions=[]
// $(function(){
// $.get('/api/enp/waste/combobox/?type=2',function(res){
// wasteOptions = res
// })
// })
var dwaste_action_url = '/api/enp/waste/create/';
var dwasteMakeList_action_url = '';
var dwasteMakeRecord_action_url="";
var dwasteKeepRecord_action_url="";
var dwasteHandleRecord_action_url="";
$('#dwasteTable').datagrid({
url: '/api/enp/waste/list/?type=2',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#dwasteTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'number', title: '废物编号', width: 100 },
{ field: 'name', title: '废物名称', width: 100 },
]],
onClickRow: function (index, row) {
}
});
$('#dwasteMakeListTable').datagrid({
url: '/api/enp/dwastemakelist/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#dwasteMakeListTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'waste', title: 'waste', hidden: true },
{ field: 'waste__number', title: '废物编号', width: 100 },
{ field: 'waste__name', title: '废物名称', width: 100 },
{ field: 'license', title: '许可证', width: 100 },
{ field: 'process', title: '产生工序', width: 100 },
{ field: 'source', title: '产生源/车间', width: 100 },
{ field: 'goto', title: '废物流向', width: 100 },
{ field: 'companyname', title: '处置企业', width: 100 },
{ field: 'gen_count', title: '年度产生量(吨)', width: 100 },
{ field: 'create_time', title: '创建时间', width: 100 }
]],
onClickRow: function (index, row) {
}
});
$('#dwasteMakeRecordTable').datagrid({
url: '/api/enp/dwastemakerecord/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#dwasteMakeRecordTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'waste', title: 'waste', hidden: true },
{ field: 'waste__number', title: '废物编号', width: 100 },
{ field: 'waste__name', title: '废物名称', width: 100 },
{ field: 'gen_time', title: '产生时间', width: 100 },
{ field: 'gen_count', title: '产生数量', width: 80 },
{ field: 'container', title: '容器规格', width: 100 },
{ field: 'container_count', title: '容器个数', width: 80 },
{ field: 'trans_time', title: '转移时间', width: 100 },
{ field: 'trans_count', title: '转移个数', width: 80 },
{ field: 'gen_count', title: '年度产生量(吨)', width: 80 },
{ field: 'goto', title: '去向', width: 100 }
]],
onClickRow: function (index, row) {
}
});
$('#dwasteKeepRecordTable').datagrid({
url: '/api/enp/dwastekeeprecord/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#dwasteKeepRecordTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'waste', title: 'waste', hidden: true },
{ field: 'waste__number', title: '废物编号', width: 80 },
{ field: 'waste__name', title: '废物名称', width: 100 },
{ field: 'in_time', title: '入库时间', width: 100 },
{ field: 'in_count', title: '入库数量', width: 80 },
{ field: 'source', title: '废物来源', width: 100 },
{ field: 'container', title: '容器规格', width: 100 },
{ field: 'container_count', title: '容器个数', width: 80 },
{ field: 'place', title: '存放位置', width: 100 },
{ field: 'out_time', title: '出库时间', width: 100 },
{ field: 'out_count', title: '出库数量', width: 80 },
{ field: 'goto', title: '去向', width: 100 }
]],
onClickRow: function (index, row) {
}
});
$('#dwasteHandleRecordTable').datagrid({
url: '/api/enp/dwastehandlerecord/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#dwasteHandleRecordTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'waste', title: 'waste', hidden: true },
{ field: 'waste__number', title: '废物编号', width: 80 },
{ field: 'waste__name', title: '废物名称', width: 100 },
{ field: 'accept_time', title: '接收时间', width: 100 },
{ field: 'accept_count', title: '接收数量', width: 80 },
{ field: 'source', title: '废物来源', width: 100 },
{ field: 'container', title: '容器规格', width: 100 },
{ field: 'container_count', title: '容器个数', width: 80 },
{ field: 'handle_time', title: '处置时间', width: 100 },
{ field: 'handle_method', title: '处置方式', width: 80 }
]],
onClickRow: function (index, row) {
}
});
function addDwaste() {
$('#dwasteDialog').dialog('open').dialog('setTitle', '新增危废名').window('center');
$('#dwasteForm').form('clear');
$('#typedFormItem').attr('value',2);
dwaste_action_url = '/api/enp/waste/create/'
}
function addDwasteMakeList(){
$('#dwasteMakeListDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#dwasteMakeListForm').form('clear');
dwasteMakeList_action_url = '/api/enp/dwastemakelist/create/'
}
function addDwasteMakeRecord(){
$('#dwasteMakeRecordDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#dwasteMakeRecordForm').form('clear');
dwasteMakeRecord_action_url = '/api/enp/dwastemakerecord/create/'
}
function addDwasteKeepRecord(){
$('#dwasteKeepRecordDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#dwasteKeepRecordForm').form('clear');
dwasteKeepRecord_action_url = '/api/enp/dwastekeeprecord/create/'
}
function addDwasteHandleRecord(){
$('#dwasteHandleRecordDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#dwasteHandleRecordForm').form('clear');
dwasteHandleRecord_action_url = '/api/enp/dwastehandlerecord/create/'
}
function saveDWaste() {
var data = $('#dwasteForm').serializeJSON();
$.ajax({
type: "POST",
url: dwaste_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#dwasteForm').form('validate')
},
success: function (data) {
$("#dwasteTable").datagrid('reload');
$("#dwasteDialog").dialog("close");
},
});
}
function saveDwasteMakeList() {
var data = $('#dwasteMakeListForm').serializeJSON();
$.ajax({
type: "POST",
url: dwasteMakeList_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#dwasteMakeListForm').form('validate')
},
success: function (data) {
$("#dwasteMakeListTable").datagrid('reload');
$("#dwasteMakeListDialog").dialog("close");
},
});
}
function saveDwasteMakeRecord() {
var data = $('#dwasteMakeRecordForm').serializeJSON();
$.ajax({
type: "POST",
url: dwasteMakeRecord_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#dwasteMakeRecordForm').form('validate')
},
success: function (data) {
$("#dwasteMakeRecordTable").datagrid('reload');
$("#dwasteMakeRecordDialog").dialog("close");
},
});
}
function saveDwasteKeepRecord() {
var data = $('#dwasteKeepRecordForm').serializeJSON();
$.ajax({
type: "POST",
url: dwasteKeepRecord_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#dwasteKeepRecordForm').form('validate')
},
success: function (data) {
$("#dwasteKeepRecordTable").datagrid('reload');
$("#dwasteKeepRecordDialog").dialog("close");
},
});
}
function saveDwasteHandleRecord() {
var data = $('#dwasteHandleRecordForm').serializeJSON();
$.ajax({
type: "POST",
url: dwasteHandleRecord_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#dwasteHandleRecordForm').form('validate')
},
success: function (data) {
$("#dwasteHandleRecordTable").datagrid('reload');
$("#dwasteHandleRecordDialog").dialog("close");
},
});
}
function delDwasteMakeList(){
var row = $('#dwasteMakeListTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/dwastemakelist/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#dwasteMakeListTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
function delDwasteMakeRecord(){
var row = $('#dwasteMakeRecordTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/dwastemakerecord/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#dwasteMakeRecordTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
function delDwasteKeepRecord(){
var row = $('#dwasteKeepRecordTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/dwastekeeprecord/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#dwasteKeepRecordTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
function delDwasteHandleRecord(){
var row = $('#dwasteHandleRecordTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/dwastehandlerecord/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#dwasteHandleRecordTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
function delDWaste() {
var row = $('#dwasteTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/waste/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#dwasteTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
</script>

View File

@ -0,0 +1,139 @@
<div style="padding: 10px;" id="fulldiv">
</div>
<script>
$.get('/api/enp/drain/combobox/', function (res) {
for (var i = 0; i < res.length; i++) {
var drain = res[i]
var panelId = 'panel' + res[i]['id']
var panelTitle = res[i]['name'] + ':' + res[i]['number']
$('#fulldiv').append('<div id="' + panelId + '" style="margin-bottom:10px;padding:10px"></div>')
$('#' + panelId).panel({
height: 360,
title: panelTitle,
});
var div1 = panelId + 'out_smoke';
var div2 = panelId + 'out_so2';
var div3 = panelId + 'out_particle';
var div4 = panelId + 'out_nox';
$('#' + panelId).append(
'<div style="float:left;width:25%;height:100%" id="' + div1 + '"></div>' +
'<div style="float:left;width:25%;height:100%" id="' + div2 + '"></div>' +
'<div style="float:left;width:25%;height:100%" id="' + div3 + '"></div>' +
'<div style="float:left;width:25%;height:100%" id="' + div4 + '"></div>'
)
initMap(div1, 'out_smoke', res[i]['id'], '标态干烟气量', 'Nm3/h');
initMap(div2, 'out_so2', res[i]['id'], '二氧化硫', 'mg/m3');
initMap(div3, 'out_particle', res[i]['id'], '颗粒物', 'mg/m3');
initMap(div4, 'out_nox', res[i]['id'], '氮氧化物', 'mg/m3');
}
})
function initMap(div, element, drainId, text, unit) {
var dom = document.getElementById(div);
var myChart = echarts.init(dom);
myChart.showLoading()
var option;
option = {
title: {
text: text,
// subtext: '纯属虚构'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
toolbox: {
show: true,
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['00:00', '01:15', '02:30', '03:45', '05:00', '06:15', '07:30', '08:45', '10:00', '11:15', '12:30', '13:45', '15:00', '16:15', '17:30', '18:45', '20:00', '21:15', '22:30', '23:45']
},
yAxis: {
type: 'value',
// axisLabel: {
// formatter: '{value} W'
// },
axisPointer: {
snap: true
},
name: unit
},
visualMap: {
show: false,
dimension: 0,
pieces: [{
lte: 14,
color: 'green'
}, {
gt: 14,
lte: 17,
color: 'red'
}, {
gt: 17,
color: 'red'
}]
},
series: [
{
name: '含量',
type: 'line',
smooth: true,
data: [300, 280, 250, 260, 270, 300, 550, 500, 400, 390, 380, 390, 400, 500, 600, 750, 800, 700, 600, 400],
markArea: {
data: [[{
name: '预测区',
xAxis: '17:30'
}, {
xAxis: '23:45'
}]]
}
}
]
};
$.get('/api/enp/gaspredict/' + element + '/' + drainId + '/', function (res) {
if (res.code == 0) {
$('#' + div).html('<p style="text-align:center">' + text + '-' + res.msg + '</p>')
return
} else {
var ydata = res.data
var xdata = []
var leng = ydata.length
for(var i=0;i<leng;i++){
xdata.push(i+1)
}
option.xAxis.data = xdata;
option.series[0].data = ydata
option.series[0].markArea.data = [ [{
name: '预测区',
xAxis: leng-3
}, {
xAxis: leng-1
}] ]
option.visualMap.pieces = [{
lte: leng-3,
color: 'green'
}, {
gt: leng-3,
lte: leng-2,
color: 'red'
}, {
gt: leng-2,
color: 'red'
}]
console.log(option)
if (option && typeof option === 'object') {
myChart.hideLoading();
myChart.setOption(option);
}
}
})
}
</script>

215
enp/templates/waste.html Normal file
View File

@ -0,0 +1,215 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'west', title:'一般固废名称', split:true, border:false" style="width: 300px;height:100%;">
<div id="wasteTableBar">
<a onclick="addWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="editWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-pencil',plain: true">编辑</a>
<a onclick="delWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="wasteTable" style="height:100%"></table>
</div>
<div data-options="region:'center',title:'一般固废台账',split:true,border:false" style="height:100%;">
<div id="normalWasteRecordTableBar">
<a onclick="addNormalWasteRecord()" class="easyui-linkbutton"
data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delNormalWasteRecord()" class="easyui-linkbutton"
data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="normalWasteRecordTable" style="height:100%"></table>
</div>
</div>
<div id="wasteDialog" class="easyui-dialog" style="width:400px;height:200px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="wasteForm">
<input name="id" type="hidden">
<input name="type" type="hidden" id="typeFormItem">
<div style="margin-bottom:10px">
<input name="number" data-options="label:'废物编号'" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="name" data-options="label:'废物名称'" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveWaste()">保存</a>
</div>
</form>
</div>
<div id="normalWasteRecordDialog" class="easyui-dialog" style="width:400px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="normalWasteRecordForm">
<input name="id" type="hidden">
<input name="waste" type="hidden" id="wasteFormItem">
<input name="operator" type="hidden" id="operatorFormItem">
<div style="margin-bottom:10px">
<input name="gen_date" data-options="label:'产生日期', editable:false, labelWidth:100" class="easyui-datebox" style="width:300px;" required ></input>
</div>
<div style="margin-bottom:10px">
<input name="gen_count" data-options="label:'产生数量(吨)', labelWidth:100, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="dis_date" data-options="label:'处置日期', editable:false, labelWidth:100" class="easyui-datebox" style="width:300px;" required ></input>
</div>
<div style="margin-bottom:10px">
<input name="dis_count" data-options="label:'委托处置量(吨)', labelWidth:100, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="inv_count" data-options="label:'库存(吨)', labelWidth:100, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="operator__name" data-options="label:'经办人', labelWidth:100" class="easyui-textbox" style="width:300px;" id="operator__nameFormItem"
required readonly></input>
<a class='easyui-linkbutton' onclick="choseuser('operator')" style="width:auto">选择</a>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveNormalWasteRecord()">保存</a>
</div>
</form>
</div>
<script>
function aaa(x) {
if (x == "operator") {
$('#operatorFormItem').attr('value', top.$('#in').val());
$('#operator__nameFormItem').textbox('setValue', top.$('#in').attr('show'));
}
}
var waste_action_url = '/api/enp/waste/create/';
var record_action_url = '/api/enp/normalwasterecord/create/';
$('#wasteTable').datagrid({
url: '/api/enp/waste/list/?type=1',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#wasteTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'number', title: '废物编号', width: 100 },
{ field: 'name', title: '废物名称', width: 100 },
]],
onClickRow: function (index, row) {
$('#normalWasteRecordTable').datagrid({
url: '/api/enp/normalwasterecord/list/?waste=' + row.id
})
}
});
$('#normalWasteRecordTable').datagrid({
url: '/api/enp/normalwasterecord/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#normalWasteRecordTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'operator', title: 'operator', hidden: true },
{ field: 'waste', title: 'waste', hidden: true },
{ field: 'waste__name', title: '废物名称', width: 100 },
{ field: 'gen_date', title: '产生日期', width: 100 },
{ field: 'gen_count', title: '产生数量(吨)', width: 100 },
{ field: 'dis_date', title: '处置日期', width: 100 },
{ field: 'dis_count', title: '委托处置量(吨)', width: 100 },
{ field: 'inv_count', title: '库存量(吨)', width: 100 },
{ field: 'operator__name', title: '经办人', width: 100 },
]],
onClickRow: function (index, row) {
}
});
function addWaste() {
$('#wasteDialog').dialog('open').dialog('setTitle', '新增一般固废名').window('center');
$('#wasteForm').form('clear');
$('#typeFormItem').attr('value',1);
waste_action_url = '/api/enp/waste/create/'
}
function addNormalWasteRecord() {
var row = $('#wasteTable').datagrid('getSelected');
if(row){
$('#normalWasteRecordDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#normalWasteRecordForm').form('clear');
$('#wasteFormItem').attr('value', row.id);
record_action_url = '/api/enp/normalwasterecord/create/';
}else{
$.messager.alert('提示', '请先选择左侧废物!');
}
}
function editWaste(){
var row = $('#wasteTable').datagrid('getSelected');
if(row){
$('#wasteDialog').dialog('open').dialog('setTitle', '编辑一般固废名').window('center');
$('#wasteForm').form('load', row);
waste_action_url = '/api/enp/waste/update/'}
else{
$.messager.alert('提示', '请选择一条数据!');
}
}
function saveWaste() {
var data = $('#wasteForm').serializeJSON();
$.ajax({
type: "POST",
url: waste_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#wasteForm').form('validate')
},
success: function (data) {
$("#wasteTable").datagrid('reload');
$("#wasteDialog").dialog("close");
},
});
}
function saveNormalWasteRecord() {
var data = $('#normalWasteRecordForm').serializeJSON();
$.ajax({
type: "POST",
url: record_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#normalWasteRecordForm').form('validate')
},
success: function (data) {
$("#normalWasteRecordTable").datagrid('reload');
$("#normalWasteRecordDialog").dialog("close");
},
});
}
function delWaste() {
var row = $('#wasteTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/waste/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#wasteTable").datagrid('reload');
$("#normalWasteRecordTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
</script>

272
enp/templates/wgas.html Normal file
View File

@ -0,0 +1,272 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'west', title:'排放口', split:true, border:false" style="width: 300px;height:100%;">
<div id="drainTableBar">
<a onclick="addDrain()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="editDrain()" class="easyui-linkbutton" data-options="iconCls: 'fa-pencil',plain: true">编辑</a>
<a onclick="delDrain()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="drainTable" style="height:100%"></table>
</div>
<div data-options="region:'center',title:'监测记录',split:true,border:false" style="height:100%;">
<div id="gasEmitTableBar">
<a onclick="addGasEmitRecord()" class="easyui-linkbutton"
data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delGasEmitRecord()" class="easyui-linkbutton"
data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="gasEmitTable" style="height:100%"></table>
</div>
</div>
<div id="drainDialog" class="easyui-dialog" style="width:400px;height:200px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="drainForm">
<input name="id" type="hidden">
<div style="margin-bottom:10px">
<input name="number" data-options="label:'排放口编号'" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="name" data-options="label:'排放口名称'" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveDrain()">保存</a>
</div>
</form>
</div>
<div id="gasEmitDialog" class="easyui-dialog" style="width:400px;height:800px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="gasEmitForm">
<input name="id" type="hidden">
<input name="drain" type="hidden" id="gasEmitForm_drain">
<div style="margin-bottom:10px">
<input name="watch_time" data-options="label:'监测时间', editable:false, labelWidth:120" class="easyui-datebox" style="width:300px;" required ></input>
</div>
<div style="margin-bottom:10px">
<input name="out_smoke" data-options="label:'出:标态干烟气量', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_o2" data-options="label:'出:氧含量', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_so2" data-options="label:'出:二氧化硫', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_so2_s" data-options="label:'出:二氧化硫:折标', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_particle" data-options="label:'出:颗粒物', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_particle_s" data-options="label:'出:颗粒物:折标', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_nox" data-options="label:'出:氮氧化物', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="out_nox_s" data-options="label:'出:氮氧化物:折标', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_smoke" data-options="label:'入:标态干烟气量', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_o2" data-options="label:'入:氧含量', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_so2" data-options="label:'入:二氧化硫', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_so2_s" data-options="label:'入:二氧化硫:折标', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_particle" data-options="label:'入:颗粒物', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_particle_s" data-options="label:'入:颗粒物:折标', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_nox" data-options="label:'入:氮氧化物', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="in_nox_s" data-options="label:'入:氮氧化物:折标', labelWidth:120, min:0,precision:2" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveGasEmitRecord()">保存</a>
</div>
</form>
</div>
<script>
function aaa(x) {
if (x == "operator") {
$('#operatorFormItem').attr('value', top.$('#in').val());
$('#operator__nameFormItem').textbox('setValue', top.$('#in').attr('show'));
}
}
var drain_action_url = '/api/enp/drain/create/';
var record_action_url = '/api/enp/gasemit/create/';
$('#drainTable').datagrid({
url: '/api/enp/drain/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#drainTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'number', title: '排放口编号', width: 100 },
{ field: 'name', title: '排放口名称', width: 100 },
]],
onClickRow: function (index, row) {
$('#gasEmitTable').datagrid({
url: '/api/enp/gasemit/list/?drain=' + row.id
})
}
});
$('#gasEmitTable').datagrid({
url: '/api/enp/gasemit/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#gasEmitTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'drain', title: 'drain', hidden: true },
{ field: 'drain__name', title: '排放口 ', width: 100 },
{ field: 'wath_tiime', title: '监测时间', width: 100 },
{ field: 'out_smoke', title: '出:干烟含量', width: 100 },
{ field: 'out_o2', title: '出:氧含量', width: 100 },
{ field: 'out_so2', title: '出:二氧化硫', width: 100 },
{ field: 'out_so2_s', title: '出:二氧化硫折标', width: 100 },
{ field: 'out_particle', title: '出:颗粒物', width: 100 },
{ field: 'out_particle_s', title: '出:颗粒物折标', width: 100 },
{ field: 'out_nox', title: '出:氮氧化物', width: 100 },
{ field: 'out_nox_s', title: '出:氮氧化物折标', width: 100 },
]],
onClickRow: function (index, row) {
}
});
function addDrain() {
$('#drainDialog').dialog('open').dialog('setTitle', '新增排放口').window('center');
$('#drainForm').form('clear');
drain_action_url = '/api/enp/drain/create/'
}
function addGasEmitRecord() {
var row = $('#drainTable').datagrid('getSelected');
if(row){
$('#gasEmitDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#gasEmitForm').form('clear');
$('#gasEmitForm_drain').attr('value', row.id);
record_action_url = '/api/enp/gasemit/create/';
}else{
$.messager.alert('提示', '请先选择左侧排放口!');
}
}
function editDrain(){
var row = $('#draineTable').datagrid('getSelected');
if(row){
$('#drainDialog').dialog('open').dialog('setTitle', '编辑排放口').window('center');
$('#drainForm').form('load', row);
drain_action_url = '/api/enp/drain/update/'}
else{
$.messager.alert('提示', '请选择一条数据!');
}
}
function saveDrain() {
var data = $('#drainForm').serializeJSON();
$.ajax({
type: "POST",
url: drain_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#drainForm').form('validate')
},
success: function (data) {
$("#drainTable").datagrid('reload');
$("#drainDialog").dialog("close");
},
});
}
function saveGasEmitRecord() {
var data = $('#gasEmitForm').serializeJSON();
$.ajax({
type: "POST",
url: record_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#gasEmitForm').form('validate')
},
success: function (data) {
$("#gasEmitTable").datagrid('reload');
$("#gasEmitDialog").dialog("close");
},
});
}
function delDrain() {
var row = $('#drainTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/drain/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#drainTable").datagrid('reload');
// $("#gasEmitTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
function delGasEmitRecord() {
var row = $('#gasEmitTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/gasemit/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#gasEmitTable").datagrid('reload');
// $("#gasEmitTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
</script>

215
enp/templates/wwater.html Normal file
View File

@ -0,0 +1,215 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'west', title:'一般固废名称', split:true, border:false" style="width: 300px;height:100%;">
<div id="wasteTableBar">
<a onclick="addWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="editWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-pencil',plain: true">编辑</a>
<a onclick="delWaste()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="wasteTable" style="height:100%"></table>
</div>
<div data-options="region:'center',title:'一般固废台账',split:true,border:false" style="height:100%;">
<div id="normalWasteRecordTableBar">
<a onclick="addNormalWasteRecord()" class="easyui-linkbutton"
data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delNormalWasteRecord()" class="easyui-linkbutton"
data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="normalWasteRecordTable" style="height:100%"></table>
</div>
</div>
<div id="wasteDialog" class="easyui-dialog" style="width:400px;height:200px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="wasteForm">
<input name="id" type="hidden">
<input name="type" type="hidden" id="typeFormItem">
<div style="margin-bottom:10px">
<input name="number" data-options="label:'废物编号'" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="name" data-options="label:'废物名称'" class="easyui-textbox" style="width:300px;"
required></input>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveWaste()">保存</a>
</div>
</form>
</div>
<div id="normalWasteRecordDialog" class="easyui-dialog" style="width:400px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="normalWasteRecordForm">
<input name="id" type="hidden">
<input name="waste" type="hidden" id="wasteFormItem">
<input name="operator" type="hidden" id="operatorFormItem">
<div style="margin-bottom:10px">
<input name="gen_date" data-options="label:'产生日期', editable:false, labelWidth:100" class="easyui-datebox" style="width:300px;" required ></input>
</div>
<div style="margin-bottom:10px">
<input name="gen_count" data-options="label:'产生数量(吨)', labelWidth:100" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="dis_date" data-options="label:'处置日期', editable:false, labelWidth:100" class="easyui-datebox" style="width:300px;" required ></input>
</div>
<div style="margin-bottom:10px">
<input name="dis_count" data-options="label:'委托处置量(吨)', labelWidth:100" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="inv_count" data-options="label:'库存(吨)', labelWidth:100" class="easyui-numberbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="operator__name" data-options="label:'经办人', labelWidth:100" class="easyui-textbox" style="width:300px;" id="operator__nameFormItem"
required readonly></input>
<a class='easyui-linkbutton' onclick="choseuser('operator')" style="width:auto">选择</a>
</div>
<div style="text-align: center;">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveNormalWasteRecord()">保存</a>
</div>
</form>
</div>
<script>
function aaa(x) {
if (x == "operator") {
$('#operatorFormItem').attr('value', top.$('#in').val());
$('#operator__nameFormItem').textbox('setValue', top.$('#in').attr('show'));
}
}
var waste_action_url = '/api/enp/waste/create/';
var record_action_url = '/api/enp/normalwasterecord/create/';
$('#wasteTable').datagrid({
url: '/api/enp/waste/list/?type=1',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#wasteTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'number', title: '废物编号', width: 100 },
{ field: 'name', title: '废物名称', width: 100 },
]],
onClickRow: function (index, row) {
$('#normalWasteRecordTable').datagrid({
url: '/api/enp/normalwasterecord/list/?waste=' + row.id
})
}
});
$('#normalWasteRecordTable').datagrid({
url: '/api/enp/normalwasterecord/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#normalWasteRecordTableBar',
border: false,
fitColumns: true,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'operator', title: 'operator', hidden: true },
{ field: 'waste', title: 'waste', hidden: true },
{ field: 'waste__name', title: '废物名称', width: 100 },
{ field: 'gen_date', title: '产生日期', width: 100 },
{ field: 'gen_count', title: '产生数量(吨)', width: 100 },
{ field: 'dis_date', title: '处置日期', width: 100 },
{ field: 'dis_count', title: '委托处置量(吨)', width: 100 },
{ field: 'inv_count', title: '库存量(吨)', width: 100 },
{ field: 'operator__name', title: '经办人', width: 100 },
]],
onClickRow: function (index, row) {
}
});
function addWaste() {
$('#wasteDialog').dialog('open').dialog('setTitle', '新增一般固废名').window('center');
$('#wasteForm').form('clear');
$('#typeFormItem').attr('value',1);
waste_action_url = '/api/enp/waste/create/'
}
function addNormalWasteRecord() {
var row = $('#wasteTable').datagrid('getSelected');
if(row){
$('#normalWasteRecordDialog').dialog('open').dialog('setTitle', '新增记录').window('center');
$('#normalWasteRecordForm').form('clear');
$('#wasteFormItem').attr('value', row.id);
record_action_url = '/api/enp/normalwasterecord/create/';
}else{
$.messager.alert('提示', '请先选择左侧废物!');
}
}
function editWaste(){
var row = $('#wasteTable').datagrid('getSelected');
if(row){
$('#wasteDialog').dialog('open').dialog('setTitle', '编辑一般固废名').window('center');
$('#wasteForm').form('load', row);
waste_action_url = '/api/enp/waste/update/'}
else{
$.messager.alert('提示', '请选择一条数据!');
}
}
function saveWaste() {
var data = $('#wasteForm').serializeJSON();
$.ajax({
type: "POST",
url: waste_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#wasteForm').form('validate')
},
success: function (data) {
$("#wasteTable").datagrid('reload');
$("#wasteDialog").dialog("close");
},
});
}
function saveNormalWasteRecord() {
var data = $('#normalWasteRecordForm').serializeJSON();
$.ajax({
type: "POST",
url: record_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#normalWasteRecordForm').form('validate')
},
success: function (data) {
$("#normalWasteRecordTable").datagrid('reload');
$("#normalWasteRecordDialog").dialog("close");
},
});
}
function delWaste() {
var row = $('#wasteTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/waste/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#wasteTable").datagrid('reload');
$("#normalWasteRecordTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
</script>

3
enp/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

9
enp/urls.py Normal file
View File

@ -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),
]

14
enp/urls_api.py Normal file
View File

@ -0,0 +1,14 @@
from django.urls import path,include
from . import views
urlpatterns = [
path('waste/<str:action>/', views.ApiWaste),
path('drain/<str:action>/', views.ApiDrain),
path('normalwasterecord/<str:action>/', views.ApiNormalWasteRecord),
path('dwastemakelist/<str:action>/', views.ApiDWasteMakeList),
path('dwastemakerecord/<str:action>/', views.ApiDWasteMakeRecord),
path('dwastekeeprecord/<str:action>/', views.ApiDWasteKeepRecord),
path('dwastehandlerecord/<str:action>/', views.ApiDWasteHandleRecord),
path('gasemit/<str:action>/', views.ApiGasEmit),
path('gaspredict/<str:element>/<int:drainId>/', views.ApiGasPredict)
]

326
enp/views.py Normal file
View File

@ -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":'至少需要三条记录'})

View File

@ -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')),

View File

@ -21,5 +21,7 @@ class CompanyInfoForm(forms.Form):
legalperson_phone = forms.CharField(max_length=24, label='法人电话', widget=forms.TextInput(attrs={'size': '50'}))
liaison = forms.CharField(max_length=24, label='联系人', widget=forms.TextInput(attrs={'size': '50'}))
liaison_phone = forms.CharField(max_length=24, label='联系人电话', widget=forms.TextInput(attrs={'size': '50'}))
enp_number = forms.CharField(max_length=24, label='环评批复文号', widget=forms.TextInput(attrs={'size': '50'}), required=False)
waste_number = forms.CharField(max_length=24, label='排污许可证编号', widget=forms.TextInput(attrs={'size': '50'}), required=False)
introduce = forms.CharField(label='公司概况', widget=forms.Textarea)

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.8 on 2021-10-06 18:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0389_auto_20210905_1612'),
]
operations = [
migrations.AddField(
model_name='companyinfo',
name='enp_number',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='环评批复文号'),
),
migrations.AddField(
model_name='companyinfo',
name='waste_number',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='排污许可证编号'),
),
]

View File

@ -1233,6 +1233,8 @@ class CompanyInfo(models.Model):
liaison = models.CharField(max_length=24, verbose_name='联系人')
liaison_phone = models.CharField(max_length=24, verbose_name='联系人电话')
introduce = models.TextField(null=True, blank=True, verbose_name='公司概况')
enp_number = models.CharField(max_length=50, verbose_name='环评批复文号', null=True, blank=True)
waste_number = models.CharField(max_length=50, verbose_name='排污许可证编号', null=True, blank=True)
createtime = models.DateTimeField(auto_now_add=True)
modifytime = models.DateTimeField(auto_now=True)
# 法律法规分类表

View File

@ -8312,6 +8312,8 @@ def companyinfo(req):
companyinfo.peoplenum = companyinfo_form.cleaned_data.get(
'peoplenum')
companyinfo.website = companyinfo_form.cleaned_data.get('website')
companyinfo.enp_number = companyinfo_form.cleaned_data.get('enp_number', None)
companyinfo.waste_number = companyinfo_form.cleaned_data.get('waste_number', None)
companyinfo.save()
#html = 'companyinfo.html'
# return redirect('/withmenu/', html="companyinfo.html")

29
utils/models.py Normal file
View File

@ -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