This commit is contained in:
caoqianming 2021-11-10 09:22:57 +08:00
commit 68b2e848f2
42 changed files with 2631 additions and 15 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-datetimebox" 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: 'watch_time', 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

@ -2,7 +2,7 @@ from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm, Inches, Pt
from openpyxl import Workbook, load_workbook
from openpyxl.drawing.image import Image
from .models import User,Trouble,Dickey,Partment,Dicclass,Train,Drill,TroubleAccess,Group,Yjyc,ExamPaper,ExamPaperDetail,Question,Operation,Operzyry,Operspxq,Fxcs,Suggest,Suggestflow,Trainuser,Miss
from .models import Checkjob, User,Trouble,Dickey,Partment,Dicclass,Train,Drill,TroubleAccess,Group,Yjyc,ExamPaper,ExamPaperDetail,Question,Operation,Operzyry,Operspxq,Fxcs,Suggest,Suggestflow,Trainuser,Miss
from datetime import datetime,date
import base64
import os
@ -256,6 +256,14 @@ def exportdoc(a,id):
import re
ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]')
def placeImg(sheet, imgp, place):
try:
img = Image(dirname + imgp)
if img.format!='mpo':
img.width, img.height = (90, 90) #这两个属性分别是对应添加图片的宽高
sheet.add_image(img, place)
except:
pass
def exportxlsx(a,objs,pic=1):
if a =='yh':
wb = load_workbook(dirname + 'safesite/exportemp/yhdc.xlsx')
@ -735,6 +743,57 @@ def exportxlsx(a,objs,pic=1):
res['Content-Disposition'] = 'attachment;filename='+filename+'.xlsx'
res.write(output.getvalue())
return res
elif a == 'checkjob':
#查询数据
wb = load_workbook(dirname + 'safesite/exportemp/checkjob.xlsx')
sheet = wb.active
for i, x in enumerate(objs):
num = str(i+3)
sheet['a'+num] = x.checktask.checktype.checktitle
sheet['b'+num] = x.checktask.get_tasktype_display()
sheet['c'+num] = x.checktask.checkplace
sheet['d'+num] = x.checktask.checktype.checkcontent
sheet['e'+num] = x.starttime
sheet['f'+num] = x.endtime
sheet['g'+num] = x.checkname.name
sheet['h'+num] = x.checkquestion
sheet['i'+num] = x.get_taskstate_display()
sheet['j'+num] = x.zguser.name if x.zguser else None
sheet['k'+num] = x.zgyq
sheet['l'+num] = x.zgjg
sheet['m'+num] = x.yanshouren.name if x.yanshouren else None
sheet['n'+num] = x.yanshou
if x.yhtp:
x1 = x.yhtp.split('?')
lenx1 = len(x1)
if lenx1>=1:
placeImg(sheet, x1[0], 'o'+num)
if lenx1>=2:
placeImg(sheet, x1[1], 'p'+num)
if lenx1>=3:
placeImg(sheet, x1[2], 'q'+num)
if x.zghtp:
x1 = x.zghtp.split('?')
lenx1 = len(x1)
if lenx1>=1:
placeImg(sheet, x1[0], 'r'+num)
if lenx1>=2:
placeImg(sheet, x1[1], 's'+num)
if lenx1>=3:
placeImg(sheet, x1[2], 't'+num)
#开始生成excel
sheet['b1'] = datetime.now().strftime('%Y%m%d%H%M%S')
filename = '安全检查整改记录'
output = BytesIO()
wb.save(output)
output.seek(0)
res = HttpResponse(content_type='application/vnd.ms-excel')
res['Content-Disposition'] = 'attachment;filename='+filename+'.xlsx'
res.write(output.getvalue())
return res
def exportyjdoc(vl):
doc = DocxTemplate(dirname + "safesite/exportemp/fxbg.docx")

Binary file not shown.

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,18 @@
# Generated by Django 2.2.8 on 2021-09-05 16:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0387_auto_20210826_2028'),
]
operations = [
migrations.AlterField(
model_name='checktask',
name='tasktype',
field=models.IntegerField(choices=[(1, '每天一次'), (2, '每周一次'), (3, '每月一次'), (4, '每季度一次'), (5, '每半年一次'), (6, '每年一次')], default=1),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.8 on 2021-09-05 16:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0388_auto_20210905_1611'),
]
operations = [
migrations.AlterField(
model_name='checkjob',
name='taskstate',
field=models.IntegerField(choices=[(1, '正在整改中'), (2, '已整改完成'), (3, '任务关闭'), (4, '待执行')], default=1),
),
]

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)
# 法律法规分类表
@ -1360,6 +1362,14 @@ class Checktable(models.Model):
#检查任务
class Checktask(models.Model):
tasktype_choice = (
(1, '每天一次'),
(2, '每周一次'),
(3, '每月一次'),
(4, '每季度一次'),
(5, '每半年一次'),
(6, '每年一次'),
)
id=models.AutoField(primary_key=True)#主键
checktaskname=models.CharField(max_length=300)#任务名
checktype=models.ForeignKey(Checktable,on_delete=models.CASCADE)#关联检查表
@ -1370,12 +1380,18 @@ class Checktask(models.Model):
createdate = models.DateTimeField(default = timezone.now)#创建时间
usecomp = models.ForeignKey(Partment,related_name='taskscomp',on_delete=models.CASCADE,null=True,blank=True)#创建公司
deletemark = models.IntegerField(default=1)#是否删除
tasktype = models.IntegerField(default=0)#任务执行频率1每天2每周3每月4每季度5每半年6每年
tasktype = models.IntegerField(default=1, choices=tasktype_choice)#任务执行频率1每天2每周3每月4每季度5每半年6每年
userlist = models.TextField(default='')#检查人列表
zxstate = models.IntegerField(default=1)#1同时执行2一个执行就执行
taskstate = models.IntegerField(default=1)#是否暂停1运行2暂停
class Checkjob(models.Model):
taskstate_choice = (
(1, '正在整改中'),
(2, '已整改完成'),
(3, '任务关闭'),
(4, '待执行')
)
id=models.AutoField(primary_key=True)#主键
checktask=models.ForeignKey(Checktask,on_delete=models.CASCADE)#关联任务表
checkname=models.ForeignKey(User,related_name='jianchas',on_delete=models.CASCADE)#检查人员
@ -1388,7 +1404,7 @@ class Checkjob(models.Model):
createdate = models.DateTimeField(default = timezone.now)#创建时间
usecomp = models.ForeignKey(Partment,related_name='taskcomps',on_delete=models.CASCADE,null=True,blank=True)#创建公司
deletemark = models.IntegerField(default=1)#是否删除
taskstate = models.IntegerField(default=1)#执行状态1正在检查2检查完毕,3,已关闭,4,未执行
taskstate = models.IntegerField(default=1, choices=taskstate_choice)#执行状态1正在检查2检查完毕,3,已关闭,4,未执行
starttime=models.DateTimeField(null=True, blank=True)#任务开始时间
endtime=models.DateTimeField(null=True, blank=True)#任务结束时间
jobstate = models.IntegerField(default=1)#检查任务状态1可执行2过期

View File

@ -22,6 +22,7 @@
{% if request|has_permission:'b_checkjob_del' %}
<a id="deljob" class="easyui-linkbutton" onclick="deljob()" data-options="iconCls: 'fa-trash',plain:true">删除</a>
{% endif %}
<a id="exportcheckjobexcel" onclick="exportcheckjobexcel()" class="easyui-linkbutton" data-options="iconCls: 'fa-download',plain:true">导出Excel</a>
@ -32,7 +33,7 @@
data-options="iconCls:'fa-search',resizable:true,modal:true,closed:true,border:false">
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'center'" style="height:100%;text-align:right;">
<form id='searchyhff' style="margin-right: 10px">
<form id='searchcheckjobff' style="margin-right: 10px">
<div style="margin-top:4px"><label>起始时间:</label><input name='qssj' id='qssjyh' style="width:300px"></div>
<div style="margin-top:4px"><label>结束时间:</label><input name='jssj' id='jssjyh' style="width:300px"></div>
@ -53,7 +54,7 @@
<script>
$(function () {
var option = $('#main').attr('value')
$("#searchyhff").form('clear');
$("#searchcheckjobff").form('clear');
})
$('#jobtab').datagrid({
url: 'api/checkproject?a=listall4',
@ -137,16 +138,15 @@
editable: false,
});
function yhsearch() {
var querydata = $('#searchyhff').serializeJSON();
querydata['a'] = 'listsearch'
var querydata = $('#searchcheckjobff').serializeJSON();
$('#sdg_job').dialog('close')
$('#jobtab').datagrid('load', querydata);
}
function reset() {
$('#searchyhff').form('clear')
$('#searchcheckjobff').form('clear')
$('#jobtab').datagrid('options').queryParams = {
a:'listall'
a:'listall4'
}
$('#jobtab').datagrid('load');
@ -223,5 +223,11 @@
}
}
function exportcheckjobexcel() {
var querydata = $('#searchcheckjobff').serializeJSON();
let url = 'api/checkjob?a=exportexcel&' + parseParams(querydata)
window.open(url);
// $('<form method="post" action="' + url + '"></form>').appendTo('body').submit().remove();
}
</script>

View File

@ -6,8 +6,9 @@
<a id="yanshou" onclick="yanshou()" class="easyui-linkbutton" data-options="iconCls: 'fa-download'">验收</a>
{{/if}}
<a iconCls="fa-close" class="easyui-linkbutton" onclick="closeForm()">关闭</a>
<a iconCls="fa-download" class="easyui-linkbutton" onclick="exportcheckjobword()" data-options="{ iconCls: 'fa-download'}">导出</a>
</div>
<div data-options="region:'center'" style="height:100%;padding:15px 15px;">
<div data-options="region:'center'" style="height:100%;padding:15px 15px;" id="checkjobdiv">
<div style="text-align:center;font-size: 24px;font-weight: bold;margin-bottom: 20px;">{{checktask__checktaskname}}</div>
<table class='detailtable' style="text-align:center;">
<tr>
@ -211,4 +212,7 @@
}
});
}
function exportcheckjobword(e) {
$("#checkjobdiv").wordExport('安全检查整改记录');
}
</script>

View File

@ -36,9 +36,9 @@
data-options="label:'初次检查',currentText:'今天',closeText:'关闭',showSeconds:false" required=true />
</div>
<div style="margin-bottom:5px">
<input id="checktabtitle" class="easyui-textbox" name="checktabtitle" style=" width: 480px;
<input id="checktabtitlex" class="easyui-textbox" name="checktabtitle" style=" width: 480px;
height: 40px
" data-options="label:'检查项目'" required=true />
" data-options="label:'检查'" required=true />
</div>
<div style="margin-top:10px;margin-bottom:5px">
<input id="checkplace" class="easyui-textbox" name="checkplace" style=" width: 480px;
@ -55,7 +55,7 @@
$(function () {
$("#checktabtitle").combobox({
$("#checktabtitlex").combobox({
url: 'api/checkproject?a=checktablist',
valueField: 'value',
textField: 'text',

View File

@ -232,6 +232,7 @@ urlpatterns = [
path('api/safeitem/', views.apisafeitem),
path('api/safefeedback/', views.apisafefeedback),
path('api/countsafe/', viewsn.apicountsafe), # 安全数据统计
path('api/checkjob/', views.apicheckjob),
path('api/examtestrate',views.apiexamtestrate),

View File

@ -1882,7 +1882,8 @@ def accesstrain(req):
companyid = getcompany(userid)
# 绑定考试
if req.POST.get('examtest',None):
a.update(examtest=ExamTest.objects.get(id=req.POST.get('examtest')))
a.examtest = ExamTest.objects.get(id=req.POST.get('examtest'))
a.save()
for i in Trainuser.objects.filter(train__trainid=trainid):
objs = ExamTestDetail.objects.filter(
examtest__id=req.POST.get('examtest'), user=i.participant)
@ -8311,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")
@ -8664,6 +8667,9 @@ def checkprojects(req):
return HttpResponse(transjson(total, a), content_type="application/json")
elif a == 'listall3':
"""
任务分配列表
"""
startnum,endnum = fenye(req)
a = Checktask.objects.filter(usecomp=Partment.objects.get(partid=companyid), deletemark=1).order_by('-createdate')
total = a.count()
@ -8673,8 +8679,27 @@ def checkprojects(req):
return HttpResponse(transjson(total, a), content_type="application/json")
elif a == 'listall4':
"""
检查工作列表
"""
startnum,endnum = fenye(req)
a = Checkjob.objects.filter(usecomp=Partment.objects.get(partid=companyid),checkname__userid=userid,deletemark=1).order_by('-starttime')
a = Checkjob.objects.filter(usecomp=Partment.objects.get(
partid=companyid)).exclude(deletemark=0)
qssj = req.GET.get('qssj')#开始时间
jssj = req.GET.get('jssj')#结束时间
checktabtitle = req.GET.get('checktabtitle')#检查表名
checktaskname = req.GET.get('checktaskname')#任务名称
checkername = req.GET.get('checkername', None)
if qssj:
a = a.filter(starttime__gte=qssj)
if jssj:
a = a.filter(starttime__lte=jssj)
if checktabtitle:
a = a.filter(checktask__checktype__id=checktabtitle)
if checktaskname:
a = a.filter(checktask__id=checktaskname)
if checkername:
a = a.filter(checkname__name=checkername)
total = a.count()
startnum, endnum = fenye(req)
@ -9046,6 +9071,48 @@ def checkprojects(req):
return HttpResponse(transjson(total, a), content_type="application/json")
def apicheckjob(req):
a = req.GET.get('a')
userid = req.session['userid']
companyid = getcompany(userid)
if a == 'exportexcel':
"""
检查工作列表导出
"""
objs = Checkjob.objects.filter(usecomp=Partment.objects.get(
partid=companyid)).exclude(deletemark=0)
qssj = req.GET.get('qssj', None)#开始时间
jssj = req.GET.get('jssj', None)#结束时间
checktabtitle = req.GET.get('checktabtitle', None)#检查表名
checktaskname = req.GET.get('checktaskname', None)#任务名称
checkername = req.GET.get('checkername', None)
if qssj:
objs = objs.filter(starttime__gte=qssj)
if jssj:
objs = objs.filter(starttime__lte=jssj)
if checktabtitle:
objs = objs.filter(checktask__checktype__id=checktabtitle)
if checktaskname:
objs = objs.filter(checktask__id=checktaskname)
if checkername:
objs = objs.filter(checkname__name=checkername)
total = objs.count()
if total > 200:
res = HttpResponse()
res.write('数量超过200,请筛选后导出!')
return res
objs = objs.order_by('-starttime')
# .values('id',
# 'checktask__checktaskname','jobstate',
# 'starttime','endtime','yanshou','checkquestion','zguser__name','zgtime','yanshouren__name',
# 'checktask__checktype__checktitle','checkname__username','checkname__name',
# 'taskstate','checktask__checktime','createuser__username','createdate', 'taskstate',
# 'checktask__tasktype', 'checktask__checkplace', 'checktask__checktype__checkcontent', 'yhtp', 'zghtp'
# )
res = exportxlsx('checkjob', objs)
return res
@apicheck_login
def apioffence(req):

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