This commit is contained in:
caoqianming 2022-08-11 22:04:04 +08:00
commit 7d089dd6f0
22 changed files with 991 additions and 44 deletions

View File

@ -0,0 +1,38 @@
# Generated by Django 2.2.8 on 2022-08-02 13:58
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('safesite', '0396_auto_20220304_1648'),
('enp', '0019_auto_20220517_1717'),
]
operations = [
migrations.CreateModel(
name='Archives',
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='删除标记')),
('title', models.CharField(max_length=50)),
('path', models.CharField(blank=True, max_length=200, null=True)),
('createdate', models.DateTimeField(default=django.utils.timezone.now)),
('deletemark', models.IntegerField(default=1)),
('filepath', models.CharField(blank=True, max_length=200, null=True)),
('reads', models.IntegerField(default='0')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='archives_create_by', to='safesite.User', verbose_name='创建人')),
('createuser', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User')),
('type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='safesite.Dickey')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='archives_update_by', to='safesite.User', verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 2.2.8 on 2022-08-02 14:09
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('enp', '0020_archives'),
]
operations = [
migrations.RemoveField(
model_name='archives',
name='filepath',
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.8 on 2022-08-02 14:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0396_auto_20220304_1648'),
('enp', '0021_remove_archives_filepath'),
]
operations = [
migrations.AddField(
model_name='archives',
name='usecomp',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.8 on 2022-08-02 16:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('enp', '0022_archives_usecomp'),
]
operations = [
migrations.AddField(
model_name='archives',
name='note',
field=models.CharField(blank=True, max_length=500, null=True, verbose_name='备注'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.8 on 2022-08-03 14:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('enp', '0023_archives_note'),
]
operations = [
migrations.AlterField(
model_name='prevention',
name='preventiontype',
field=models.IntegerField(blank=True, choices=[(1, '废水'), (2, '废气'), (3, '噪声')], default=1, null=True, verbose_name='防治类型'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.8 on 2022-08-03 14:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('enp', '0024_auto_20220803_1425'),
]
operations = [
migrations.AlterField(
model_name='prevention',
name='hdl',
field=models.FloatField(blank=True, max_length=100, null=True, verbose_name='耗电率kWh'),
),
]

View File

@ -1,6 +1,8 @@
from django.db import models from django.db import models
from safesite.models import User, Partment from safesite.models import User, Partment,Dickey
from utils.models import CommonModel from utils.models import CommonModel
import django.utils.timezone as timezone
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
# Create your models here. # Create your models here.
@ -154,11 +156,12 @@ class Facilities(CommonModel):
usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司')
class Prevention(CommonModel): class Prevention(CommonModel):
""" """
废气废水防治设施 废气废水噪声防治设施
""" """
type_choices = ( type_choices = (
(1, '废水'), (1, '废水'),
(2, '废气') (2, '废气'),
(3, '噪声')
) )
name = models.CharField('防治设施名称', max_length=100) name = models.CharField('防治设施名称', max_length=100)
number = models.CharField('编码', max_length=100) number = models.CharField('编码', max_length=100)
@ -178,7 +181,7 @@ class Prevention(CommonModel):
pkwd = models.FloatField('排口温度℃', max_length=200, null=True, blank=True) pkwd = models.FloatField('排口温度℃', max_length=200, null=True, blank=True)
yl = models.FloatField('压力kPa', max_length=100, null=True, blank=True) yl = models.FloatField('压力kPa', max_length=100, null=True, blank=True)
pfsj = models.FloatField('排放时间h', max_length=100, null=True, blank=True) pfsj = models.FloatField('排放时间h', max_length=100, null=True, blank=True)
hdl = models.FloatField('耗电率kWh', max_length=100) hdl = models.FloatField('耗电率kWh', max_length=100,null=True, blank=True)
fcpname = models.CharField('副产品名称', max_length=100, null=True, blank=True) fcpname = models.CharField('副产品名称', max_length=100, null=True, blank=True)
fcwcl = models.FloatField('副产物产生量t', max_length=100, null=True, blank=True) fcwcl = models.FloatField('副产物产生量t', max_length=100, null=True, blank=True)
yjname = models.CharField('药剂名称', max_length=100, null=True, blank=True) yjname = models.CharField('药剂名称', max_length=100, null=True, blank=True)
@ -252,3 +255,17 @@ class Waterequipment(CommonModel):
jcyqmodel = models.CharField('监测仪器型号', max_length=100, null=True, blank=True) jcyqmodel = models.CharField('监测仪器型号', max_length=100, null=True, blank=True)
note = models.CharField('备注', max_length=500, null=True, blank=True) note = models.CharField('备注', max_length=500, null=True, blank=True)
usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司') usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name='所属公司')
class Archives(CommonModel):
"""
档案管理
"""
title = models.CharField(max_length=50)#标题
type=models.ForeignKey(Dickey,on_delete=models.CASCADE,null=True,blank=True)#档案类型
path = models.CharField(max_length=200,null=True,blank=True)#上传文件
createuser = models.ForeignKey(User,on_delete=models.CASCADE)#上传者
createdate = models.DateTimeField(default = timezone.now)#上传时间
deletemark = models.IntegerField(default=1)#是否删除
reads = models.IntegerField(default='0')
note = models.CharField('备注', max_length=500, null=True, blank=True)
usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, null=True, blank=True,verbose_name='所属公司')

389
enp/templates/archives.html Normal file
View File

@ -0,0 +1,389 @@
<style type="text/css">
#content {
border: 1px solid saddlebrown;
padding: 16px;
border-radius: 2px
}
.list {
top: 15px;
width: 140px;
height: 40px;
border: 1px solid #0082E6;
display: inline-block;
border-radius: 2px;
position: relative;
line-height: 40px;
}
#file {
position: absolute;
opacity: 0;
color: white;
width: 100%;
height: 100%;
z-index: 100;
}
.list span {
display: inline-block;
text-align: center;
width: 100%;
line-height: 40px;
position: absolute;
color: #0082E6;
}
video {
margin-top: 8px;
border-radius: 4px;
}
._p {
margin: 14px;
}
._p input {
display: inline-block;
width: 70%;
margin-left: 6px;
}
._p span {
font-size: 15px;
}
.container {
width: 100%;
height: 20px;
background-color: gray;
}
#progress {
height: 20px;
background-color: orange;
display: inline-block;
}
.btn {
text-align: center;
color: #0082E6;
width: 140px;
height: 41px;
border: 1px solid #0082E6;
display: inline-block;
border-radius: 2px;
position: relative;
line-height: 40px;
background-color: white;
}
.ploadname {
display: inline-block;
text-align: center;
color: #0082E6;
height: 40px;
display: inline-block;
border-radius: 2px;
position: relative;
line-height: 40px;
background-color: white;
}
</style>
<div id="edubar" style="padding: 4px;height: 40px;background-color:#FCFCFC">
<div id="wasteTableBar">
<a onclick="addAechives()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="delArchives()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
</div>
<table id="mgttab" style="width:100%;height:100%;text-align: center;"></table>
<div id="arechivesDialog" class="easyui-dialog" style="width:600px;height:600px;padding:5px 15px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="arechivesForm">
<input name="id" type="hidden">
<div style="margin-bottom:10px">
<input name="title" data-options="label:'档案名称:'" class="easyui-textbox" style="width:480px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="createdate" data-options="label:'上传时间:'" class="easyui-datetimebox" style="width:480px;" data-options="currentText:'今天',closeText:'关闭',showSeconds:false" required></input>
</div>
<div style="margin-bottom:10px">
<input id="type" name="type" data-options="label:'文件类型:'" class="easyui-textbox" style="width:480px">
</div>
<div style="margin-bottom:10px">
<input name="note" data-options="label:'备注',multiline:true" class="easyui-textbox" style="width:480px;height:60px" ></input>
</div>
<div id="content">
<p class="_p">
<span>选择文件: </span>
<!--文件选择按钮-->
<a class="list" href="javascript:;">
<input id="file" type="file" name="myfile" accept=".txt,.ppt,.doc,.pdf,dot" onchange="UpladFile(this);" /><span>选择文件</span>
</a>
<a class="el-upload-list__item-name">
<i class="el-icon-document"></i><span class="ploadname" id="fileName"></span>
</a>
<span id="url" style="display:none"></span>
</p>
<!--进度条-->
<div class="el-progress el-progress--line" style="display: none;">
<div class='container'>
<span id="progress"></span>
</div>
<!--上传速度显示-->
<span id="time"></span>
</div>
</div>
<div style="text-align: center;margin-top:20px">
<a class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="saveArchives()">保存</a>
</div>
</form>
</div>
<script>
$("#type").combobox({
url: '/api/enp/archives/dic/?dicclass=60',
valueField: 'value',
textField: 'text',
editable: false,
});
$('#mgttab').datagrid({
url: '/api/enp/archives/listall/',
rownumbers: true,
singleSelect: true,
striped: true,
fitColumns: true,
method: 'get',
pagination: 'true',
pageSize: 20,
border: false,
toolbar:'#edubar',
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'title', title: '档案名称', width: 100 },
{ field: 'type__dickeyname', title: '档案类型', width: 100 },
{ field: 'createdate', title: '上传时间', width: 100 },
{ field: 'createuser__name', title: '创建人', width: 100 },
{ field: 'note', title: '备注', width: 100 },
{
field: 'path', title: '点击观看', width: 100, formatter: function (value, row, index) {
return '<a style="color:blue" target="_blank" href="' + row.path + '" id="one">点击查看</a>';
}
},
]]
});
var xhr;//异步请求对象
var ot; //时间
var oloaded;//大小
//上传文件方法
function UpladFile(target, id) {
var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
if (fileObj.name) {
$(".el-upload-list").css("display", "block");
$(".el-upload-list li").css("border", "1px solid #20a0ff");
if (fileObj == undefined || fileObj == "") {
alert("请选择文件");
return false;
};
var filetypes = [ ".txt", ".ppt", ".doc", ".pdf", ".dot"];//判断上传文件格式类型
var filepath = target.value;
if (filepath) {
var isnext = false;
var fileend = filepath.substring(filepath.indexOf("."));
if (filetypes && filetypes.length > 0) {
for (var i = 0; i < filetypes.length; i++) {
if (filetypes[i] == fileend) {
isnext = true;
break;
}
}
}
if (!isnext) {
alert("不接受此文件类型!");
target.value = "";
return false;
}
} else {
return false;
}
var imagSize = fileObj.size;
if (imagSize > 1024 * 1024 * 10) {
alert("文件大小为:" + (imagSize / (1024 * 1024)).toFixed(2) + "M超出了10M");
return false;
}
var url = "/api/enp/archives/upload/"; // 接收上传文件的后台地址
var form = new FormData(); // FormData 对象
form.append("mf", fileObj); // 文件对象
xhr = new XMLHttpRequest(); // XMLHttpRequest 对象
xhr.open("post", url, true); //post方式url为服务器请求地址true 该参数规定请求是否异步处理。
xhr.onload = uploadComplete; //请求完成
xhr.onerror = uploadFailed; //请求失败
xhr.upload.onprogress = progressFunction; //【上传进度调用方法实现】
xhr.upload.onloadstart = function () { //上传开始执行方法
ot = new Date().getTime(); //设置上传开始时间
oloaded = 0; //设置上传开始时以上传的文件大小为0
};
xhr.send(form); //开始上传发送form数据
$("#fileName").text(fileObj.name);
}
else {
alert("请选择文件");
}
}
//上传进度实现方法,上传过程中会频繁调用该方法
function progressFunction(evt) {
// event.total是需要传输的总字节event.loaded是已经传输的字节。如果event.lengthComputable不为真则event.total等于0
if (evt.lengthComputable) {
$(".el-progress--line").css("display", "block");
var percent = Math.round(evt.loaded * 100 / evt.total);
/*进度条显示进度*/
document.getElementById('progress').innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";
document.getElementById('progress').style.width = percent.toFixed(2) + '%';
}
var time = document.getElementById("time");
var nt = new Date().getTime(); //获取当前时间
var pertime = (nt - ot) / 1000; //计算出上次调用该方法时到现在的时间差单位为s
ot = new Date().getTime(); //重新赋值时间,用于下次计算
var perload = evt.loaded - oloaded; //计算该分段上传的文件大小单位b
oloaded = evt.loaded; //重新赋值已上传文件大小,用以下次计算
//上传速度计算
var speed = perload / pertime; //单位b/s
var bspeed = speed;
var units = 'b/s'; //单位名称
if (speed / 1024 > 1) {
speed = speed / 1024;
units = 'k/s';
}
if (speed / 1024 > 1) {
speed = speed / 1024;
units = 'M/s';
}
speed = speed.toFixed(1);
//剩余时间
var resttime = ((evt.total - evt.loaded) / bspeed).toFixed(1);
time.innerHTML = '上传速度:' + speed + units + ',剩余时间:' + resttime + 's';
if (bspeed == 0)
time.innerHTML = '上传已取消';
}
//上传成功响应
function uploadComplete(evt) {
//服务断接收完文件返回的结果 注意返回的字符串要去掉双引号
if (evt.target.responseText) {
var data = JSON.parse(evt.target.responseText);
if (data.code = 1) {
var str = data.filepath;
document.getElementById('url').innerHTML = str;
alert("上传成功!");
}
} else {
alert("上传失败");
}
}
//上传失败
function uploadFailed(evt) {
alert("上传失败!");
}
//新增档案
function addAechives() {
$('#arechivesDialog').dialog('open').dialog('setTitle', '新增档案文件').window('center');
$('#arechivesForm').form('clear');
$('#typeFormItem').attr('value',1);
waste_action_url = '/api/enp/archives/create/'
}
//提交
function saveArchives(){
var data = $('#arechivesForm').serializeJSON();
data['filepath'] = document.getElementById('url').innerHTML;
$.ajax({
type: "POST",
url: waste_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#arechivesForm').form('validate')
},
success: function (data) {
$("#mgttab").datagrid('reload');
$("#arechivesDialog").dialog("close");
},
});
}
//编辑数据
function editArchives(){
var row = $('#mgttab').datagrid('getSelected');
if(row){
$('#arechivesDialog').dialog('open').dialog('setTitle', '编辑档案文件').window('center');
$('#arechivesForm').form('load', row);
waste_action_url = '/api/enp/archives/update/'}
else{
$.messager.alert('提示', '请选择一条数据!');
}
}
//删除数据
function delArchives() {
var row = $('#mgttab').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/archives/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#mgttab").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
</script>

View File

@ -0,0 +1,157 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'center',title:'噪声防治设施表',split:true,border:false" style="height:100%;">
<div id="wpreventionTableBar">
<a onclick="addzprevention()" class="easyui-linkbutton" data-options="iconCls: 'fa-plus',plain: true">新增</a>
<a onclick="edizprevention()" class="easyui-linkbutton" data-options="iconCls: 'fa-pencil',plain: true">编辑</a>
<a onclick="delzprevention()" class="easyui-linkbutton" data-options="iconCls: 'fa-trash',plain: true">删除</a>
</div>
<table id="zpreventionTable" style="height:100%"></table>
</div>
</div>
<div id="zpreventionDialog" class="easyui-dialog" style="width:800px;height:600px;padding:20px 25px;"
data-options="resizable:true,modal:true,closed:true,border:false">
<form method="post" id="zpreventionForm">
<input name="id" type="hidden">
<div style="margin-bottom:10px">
<input name="name" data-options="label:'设施名称', labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
<input name="number" data-options="label:'编码', labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="type" data-options="label:'设施型号',labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
<input name="cs_name" data-options="label:'参数名称', labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="desig_nnumber" data-options="label:'设计值',labelWidth:100" class="easyui-numberbox" style="width:300px;" required></input>
<input name="em_unit" data-options="label:'单位',labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="start_time" data-options="label:'运行开始时间', editable:false, labelWidth:100" class="easyui-datebox" style="width:300px;" required ></input>
<input name="end_time" data-options="label:'运行结束日期', editable:false, labelWidth:100" class="easyui-datebox" style="width:300px;" required ></input>
</div>
<div style="margin-bottom:10px">
<input name="state" data-options="label:'运行状态',labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
<input name="clfs" data-options="label:'处理方式',labelWidth:100" class="easyui-textbox" style="width:300px;" required></input>
</div>
<div style="margin-bottom:10px">
<input name="hdl" data-options="label:'耗电量kWh', labelWidth:100" class="easyui-numberbox" style="width:300px;" required></input>
<input name="zlxl" 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="savezprevention()">保存</a>
</div>
</form>
</div>
<script>
var zprevention_action_url = '/api/enp/zprevention/create/';
$('#zpreventionTable').datagrid({
url: '/api/enp/zprevention/list/',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#wpreventionTableBar',
border: false,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'name', title: '防治设施名称', width: 200 },
{ field: 'number', title: '编码', width: 200 },
{ field: 'type', title: '防治设施型号', width: 200 },
{ field: 'cs_name', title: '参数名', width: 200 },
{ field: 'desig_nnumber', title: '设计值', width: 200 },
{ field: 'em_unit', title: '单位', width: 200 },
{ field: 'start_time', title: '运行开始时间', width: 200 },
{ field: 'end_time', title: '运行结束时间', width: 200 },
{ field: 'state', title: '运行状态', width: 200 },
{ field: 'zlxl', title: '治理效率', width: 200 },
{ field: 'clfs', title: '处理方式', width: 200 },
{ field: 'hdl', title: '耗电量kWh', width: 200 },
]],
onClickRow: function (index, row) {
}
});
//新增
function addzprevention() {
$('#zpreventionDialog').dialog('open').dialog('setTitle', '新增噪声防治设施').window('center');
$('#zpreventionForm').form('clear');
zprevention_action_url = '/api/enp/zprevention/create/'
}
//保存数据
function savezprevention() {
var data = $('#zpreventionForm').serializeJSON();
$.ajax({
type: "POST",
url: zprevention_action_url,
data: JSON.stringify(data),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
return $('#zpreventionForm').form('validate')
},
success: function (data) {
$("#zpreventionTable").datagrid('reload');
$("#zpreventionDialog").dialog("close");
},
});
}
//编辑数据
function edizprevention(){
var row = $('#zpreventionTable').datagrid('getSelected');
if(row){
$('#zpreventionDialog').dialog('open').dialog('setTitle', '编辑噪声防治设施').window('center');
$('#zpreventionForm').form('load', row);
zprevention_action_url = '/api/enp/zprevention/update/'}
else{
$.messager.alert('提示', '请选择一条数据!');
}
}
//删除数据
function delzprevention(){
var row = $('#zpreventionTable').datagrid('getSelected');
if (row) {
$.messager.confirm('提示', '确定删除吗?', function (r) {
if (r) {
var data = { id: row.id }
$.ajax({
type: "POST",
url: '/api/enp/zprevention/delete/',
data: JSON.stringify(data),
datatype: "json",
beforeSend: function () { },
success: function (data) {
if (data.code == 1) {
$("#zpreventionTable").datagrid('reload');
$("#zpreventionTable").datagrid('reload');
}
else {
$.messager.alert('提示', '操作失败!');
}
},
});
}
});
}
else { $.messager.alert('提示', '请选择一条数据!'); }
}
</script>

View File

@ -13,4 +13,8 @@ urlpatterns = [
path('detection/', views.HtmlDetection), path('detection/', views.HtmlDetection),
path('fuel/', views.HtmlFuel), path('fuel/', views.HtmlFuel),
path('waterequipment/', views.HtmlWaterequipment), path('waterequipment/', views.HtmlWaterequipment),
path('archives/', views.HtmlArchives),
path('zprevention/', views.HtmlZprevention),
] ]

View File

@ -21,6 +21,9 @@ urlpatterns = [
path('detection/<str:action>/', views.ApiDetection),#废水污染物检测 path('detection/<str:action>/', views.ApiDetection),#废水污染物检测
path('fuel/<str:action>/', views.ApiFuel),#燃料信息表 path('fuel/<str:action>/', views.ApiFuel),#燃料信息表
path('waterequipment/<str:action>/', views.ApiWaterequipment),#废水监测仪器信息表 path('waterequipment/<str:action>/', views.ApiWaterequipment),#废水监测仪器信息表
path('archives/<str:action>/', views.ApiArchives),#档案管理表
path('zprevention/<str:action>/', views.ApiZprevention),#噪声防治设施

View File

@ -1,9 +1,11 @@
import time
import os
from django.shortcuts import render from django.shortcuts import render
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.authentication import BaseAuthentication from rest_framework.authentication import BaseAuthentication
from safesite.models import User from safesite.models import User,Dickey,Partment
from rest_framework.exceptions import AuthenticationFailed from rest_framework.exceptions import AuthenticationFailed
from .models import DWasteHandleRecord, DWasteKeepRecord, DWasteMakeList, DWasteMakeRecord, Drain, GasEmit, NormalWasteRecord, Waste, Facilities,Prevention,abnormal,Detection,Fuel,Waterequipment from .models import DWasteHandleRecord, DWasteKeepRecord, DWasteMakeList, DWasteMakeRecord, Drain, GasEmit, NormalWasteRecord, Waste, Facilities,Prevention,abnormal,Detection,Fuel,Waterequipment,Archives
from safesite.views import transjson, fenye, MyEncoder from safesite.views import transjson, fenye, MyEncoder
from django.http import HttpResponse, JsonResponse from django.http import HttpResponse, JsonResponse
import json import json
@ -44,8 +46,29 @@ def HtmlWaterequipment(request):
return render(request, 'waterequipment.html') return render(request, 'waterequipment.html')
def HtmlGprevention(request): def HtmlGprevention(request):
return render(request, 'gprevention.html') return render(request, 'gprevention.html')
def HtmlArchives(request):
return render(request, 'archives.html')
def HtmlZprevention(request):
return render(request, 'zprevention.html')
# 转换为combobox所用string
def transstr(obj, str1, str2):
keylist = []
for i in list(obj):
keydictstr = '{"value":"' + str(i[str1])+'","text":"'+i[str2]+'"}'
keylist.append(keydictstr)
keystr = '['+','.join(keylist)+']'
return keystr
# 获取user所在公司
def getcompany(x):
a = User.objects.get(userid=x)
if a.ubelongpart.iscompany == 1:
return str(a.ubelongpart.partid)
else:
return a.ubelongpart.partlink.split(',')[1]
def ApiWaste(request, action): def ApiWaste(request, action):
user = User.objects.get(userid=request.session['userid']) user = User.objects.get(userid=request.session['userid'])
if action == 'list': if action == 'list':
@ -538,6 +561,64 @@ def ApiWaterequipment(request, action):
obj = Waterequipment.objects.get(id=data['id']) obj = Waterequipment.objects.get(id=data['id'])
obj.delete() obj.delete()
return JsonResponse({"code":1}) return JsonResponse({"code":1})
#噪声防治设施
def ApiZprevention(request, action):
user = User.objects.get(userid=request.session['userid'])
if action == 'list':
objs = Prevention.objects.filter(usecomp=user.usecomp, is_deleted=False,preventiontype=3)
total = objs.count()
startnum, endnum = fenye(request)
objs = objs.order_by('-create_time')[startnum:endnum].values('id', 'name', 'number', 'type', 'cs_name',
'desig_nnumber', 'em_unit', 'start_time', 'end_time', 'state','zlxl','clfs','hdl' )
return HttpResponse(transjson(total, objs), content_type="application/json")
elif action == 'create':
data = json.loads(request.body.decode('utf-8'))
obj = Prevention()
obj.create_by = user
obj.update_by = user
obj.usecomp = user.usecomp
obj.name = data['name']
obj.number = data['number']
obj.preventiontype=3
obj.type = data['type']
obj.cs_name = data['cs_name']
obj.desig_nnumber = data['desig_nnumber']
obj.em_unit = data['em_unit']
obj.start_time = data['start_time']
obj.end_time = data['end_time']
obj.state = data['state']
obj.zlxl = data['zlxl']
obj.clfs = data['clfs']
obj.hdl = data['hdl']
obj.save()
return JsonResponse({"code":1})
elif action == 'update':
data = json.loads(request.body.decode('utf-8'))
obj = Prevention.objects.get(id=data['id'])
obj.create_by = user
obj.update_by = user
obj.usecomp = user.usecomp
obj.name = data['name']
obj.number = data['number']
obj.preventiontype=3
obj.type = data['type']
obj.cs_name = data['cs_name']
obj.desig_nnumber = data['desig_nnumber']
obj.em_unit = data['em_unit']
obj.start_time = data['start_time']
obj.end_time = data['end_time']
obj.state = data['state']
obj.zlxl = data['zlxl']
obj.clfs = data['clfs']
obj.hdl = data['hdl']
obj.save()
return JsonResponse({"code":1})
elif action == 'delete':
data = json.loads(request.body.decode('utf-8'))
obj = Prevention.objects.get(id=data['id'])
obj.delete()
return JsonResponse({"code":1})
@ -809,6 +890,73 @@ def ApiGasEmit(request,action):
obj.delete() obj.delete()
return JsonResponse({"code":1}) return JsonResponse({"code":1})
#档案管理
def ApiArchives(req,action):
userid = req.session['userid']
companyid = getcompany(userid)
if action =='dic':
dicclass=req.GET.get('dicclass')
a = Dickey.objects.filter(dicparent=dicclass,deletemark=1)
a = a.values('dickeyid','dicparent__dicname','dickeyname','dicparent__dicid','detail').order_by('dickeyid')
return HttpResponse(transstr(a,'dickeyid','dickeyname'),content_type="application/json")
elif action== 'upload':#文件上传
username = User.objects.get(userid=req.session['userid']).username
file_name = time.strftime('%Y%m%d%H%M%S')+ '_' + req.FILES ['mf'].name
user_upload_folder = os.path.join('media/caozuo', username)
if not os.path.exists(user_upload_folder):
os.mkdir(user_upload_folder)
filepath = os.path.join(user_upload_folder, file_name)
filepath = filepath.replace('\\','/')
with open( filepath, 'wb') as f:
f.write(req.FILES['mf'].read())
return JsonResponse({"code":1,"filename":file_name,"filepath":filepath})
elif action=='create':#新增档案
obj = Archives()
data = json.loads(req.body.decode('utf-8'))
obj.title = data['title']
obj.note = data['note']
if 'type' in data and data['type']:
obj.type= Dickey.objects.get(dickeyid=data['type'])
if data['filepath']:
obj.path=data['filepath']
obj.createuser=User.objects.get(userid=userid)
if 'createdate' in data and data['createdate']:
obj.createdate=data['createdate']
obj.usecomp=Partment.objects.get(partid=companyid)
obj.save()
return JsonResponse({"code":1})
elif action=='listall':#责任列表
startnum,endnum=fenye(req)
a = Archives.objects.filter(usecomp=companyid,deletemark=1).order_by('id')
total = a.count()
startnum,endnum=fenye(req)
a = a[startnum:endnum].values('id','title','path','type__dickeyname','createdate','createuser__name','reads','note')
return HttpResponse(transjson(total,a),content_type="application/json")
elif action == 'delete':
data = json.loads(req.body.decode('utf-8'))
obj = Archives.objects.get(id=data['id'])
obj.delete()
return JsonResponse({"code":1})
elif action == 'update':
data = json.loads(req.body.decode('utf-8'))
obj = Archives.objects.get(id=data['id'])
obj.title = data['title']
obj.note = data['note']
if 'type' in data and data['type']:
obj.type= Dickey.objects.get(dickeyid=data['type'])
if data['filepath']:
obj.path=data['filepath']
obj.createuser=User.objects.get(userid=userid)
if 'createdate' in data and data['createdate']:
obj.createdate=data['createdate']
obj.usecomp=Partment.objects.get(partid=companyid)
obj.save()
return JsonResponse({"code":1})
import numpy as np import numpy as np
from .predict import GM11 from .predict import GM11
def ApiGasPredict(request, element, drainId): def ApiGasPredict(request, element, drainId):

View File

@ -60,6 +60,8 @@ class Partment(models.Model):
def __str__(self): def __str__(self):
return self.partname return self.partname
class MySchedule(models.Model): class MySchedule(models.Model):
name = models.CharField('名称', max_length=200) name = models.CharField('名称', max_length=200)
typeset = models.CharField('类型', default=1,max_length=10) typeset = models.CharField('类型', default=1,max_length=10)

View File

@ -271,4 +271,4 @@
} }
.icon-feishuijianceyq{ .icon-feishuijianceyq{
background:url('icons/feishuijianceyq.png') no-repeat center center; background:url('icons/feishuijianceyq.png') no-repeat center center;
} }

View File

@ -94,3 +94,30 @@
.icon-large-chart{ .icon-large-chart{
background:url('icons/large_chart.png') no-repeat center center; background:url('icons/large_chart.png') no-repeat center center;
} }
.icon-fspftb{
background:url('icons/fspftb.png') no-repeat center center;
}
.icon-hanbosheshi{
background:url('icons/hanbosheshi.png') no-repeat center center;
}
.icon-shengchansheshi{
background:url('icons/shengchansheshi.png') no-repeat center center;
}
.icon-feiqifangzhiss{
background:url('icons/feiqifangzhiss.png') no-repeat center center;
}
.icon-feishuifangzhiss{
background:url('icons/feishuifangzhiss.png') no-repeat center center;
}
.icon-fangzhiyichang{
background:url('icons/fangzhiyichang.png') no-repeat center center;
}
.icon-ranliaoxinxi{
background:url('icons/ranliaoxinxi.png') no-repeat center center;
}
.icon-feishuijianceyq{
background:url('icons/feishuijianceyq.png') no-repeat center center;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -1,9 +1,9 @@
<div id="map1" class="map" style="width:100%;height:auto;outline: #4A74A8 solid 0.15em;"> <div id="map1" class="map" style="width:100%;height:auto;outline: #4A74A8 solid 0.15em;">
</div> </div>
<div id='mapshowinput'></div> <div id='mapshowinput1'></div>
<div id="popup" class="ol-popup"> <div id="popup1" class="ol-popup">
<a href="#" id="popup-closer" class="ol-popup-closer"></a> <a href="#" id="popup-closer1" class="ol-popup-closer"></a>
<div id="popup-content"></div> <div id="popup-content1"></div>
</div> </div>
<style> <style>
.ol-popup { .ol-popup {
@ -57,9 +57,9 @@
</style> </style>
<script> <script>
var map, source, vector;// global so we can remove it later var map, source, vector;// global so we can remove it later
var container = document.getElementById("popup"); var container = document.getElementById("popup1");
var content = document.getElementById("popup-content"); var content = document.getElementById("popup-content1");
var popupCloser = document.getElementById("popup-closer"); var popupCloser = document.getElementById("popup-closer1");
var overlay = new ol.Overlay({ var overlay = new ol.Overlay({
//设置弹出框的容器 //设置弹出框的容器
element: container, element: container,
@ -132,16 +132,16 @@
closepopup() closepopup()
} }
}); });
map.on('click', function (e) { // map.on('click', function (e) {
var coordinate = e.coordinate; // var coordinate = e.coordinate;
var feature = map.forEachFeatureAtPixel(e.pixel, function (feature, layer) { // var feature = map.forEachFeatureAtPixel(e.pixel, function (feature, layer) {
return feature; // return feature;
}); // });
if (feature) { // if (feature) {
var data = feature.getProperties() // var data = feature.getProperties()
opendetail(data.id) // opendetail(data.id)
} // }
}); // });
popupCloser.onclick = function () { popupCloser.onclick = function () {
closepopup() closepopup()
return false; return false;

View File

@ -261,11 +261,7 @@ float: left;">
</div> </div>
</div> </div>
<div id = 'panelxdiv2' style="width:98%;margin-left:1%;margin-right:1%;height:800px;" hidden=true>
<div id="panelx2" class="easyui-panel" data-options="iconCls:'fa-bar-chart'" >
</div>
</div>
<div style="width:100%;height:600px"> <div style="width:100%;height:600px">
@ -334,7 +330,7 @@ float: left;">
</div> </div>
<div id = 'panelxdiv' style="width:98%;margin-left:1%;margin-right:1%;height:800px;" hidden=true> <div id = 'panelxdiv' style="width:98%;margin-left:1%;height:800px;" hidden=true>
<div id="panelx" class="easyui-panel" data-options="iconCls:'fa-bar-chart'" > <div id="panelx" class="easyui-panel" data-options="iconCls:'fa-bar-chart'" >
</div> </div>
@ -397,18 +393,7 @@ float: left;">
</script> </script>
<script>
$('#panelxdiv2').show()
$('#panelx2').panel({
href:'html/jianceditu',
title:'监测地图展示'
})
;
</script>
{% endif %} {% endif %}
<script> <script>
bindmap9('gzbqst') bindmap9('gzbqst')

View File

@ -1,3 +1,13 @@
from django.test import TestCase from django.test import TestCase
# Create your tests here. # Create your tests here.
import time
import hashlib
import json
def md5(st):
h1 = hashlib.md5()
h1.update(st.encode(encoding = 'utf-8'))
return h1.hexdigest()
data = {'user_id': 1, 'company_id': 1, 'expire': time.time() + 3600}
print(md5(json.dumps(data)))

View File

@ -269,4 +269,6 @@ urlpatterns = [
path('mgt/',include('safesite.mgt.urls')), path('mgt/',include('safesite.mgt.urls')),
path('miniprogram/<str:module>', views.miniprogram), path('miniprogram/<str:module>', views.miniprogram),
path('api/auth/token/', viewsdrf.AuthToken.as_view()),
path('api-o/trouble/', viewsdrf.TroubleListView.as_view())
] ]

View File

@ -8379,7 +8379,7 @@ def apiriskacttask(req):
'taskdo', 'state', 'user__ubelongpart__partname', 'user__name', 'taskdo', 'istask') 'taskdo', 'state', 'user__ubelongpart__partname', 'user__name', 'taskdo', 'istask')
return HttpResponse(transjson(total, objs), content_type="application/json") return HttpResponse(transjson(total, objs), content_type="application/json")
elif a == 'listalltodo': # 全厂待办任务 elif a == 'listalltodo': # 全厂待办任务
objs = RiskActTask.objects.filter(istask=1, taskdo=None, usable=1) objs = RiskActTask.objects.filter(istask=1, taskdo=None, usable=1, user__usecomp__partid=companyid)
objs = objs.filter(riskact__table_type=req.GET.get('table_type', 1)) objs = objs.filter(riskact__table_type=req.GET.get('table_type', 1))
total = objs.count() total = objs.count()
startnum, endnum = fenye(req) startnum, endnum = fenye(req)

View File

@ -75,3 +75,77 @@ class EquipmentCheckFormDetailView(generics.RetrieveUpdateDestroyAPIView):
obj.save() obj.save()
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
from django.contrib.auth.hashers import check_password
import time
import hashlib
import json
from django.core.cache import cache
import random
import string
def ranstr(num):
salt = ''.join(random.sample(string.ascii_lowercase + string.digits, num))
return salt
def md5(st):
h1 = hashlib.md5()
h1.update(st.encode(encoding = 'utf-8'))
return h1.hexdigest()
class AuthToken(APIView):
def post(self, request):
"""获取token
获取token
"""
data = request.data
user = User.objects.filter(username=data['username'], deletemark=1, usecomp__enabled=True).first()
if user:
if check_password(data['password'], user.epassword):
data = {'user_id': user.userid, 'company_id': user.usecomp.partid}
token = ranstr(12)
cache.set(token, data, 1800)
return Response({'code': 200, 'data': {'token': token}, 'msg': None})
return Response({'code': 400, 'msg': '用户不存在或已禁用', 'data': None})
from django.db.models import F
# from django.utils import timezone
from datetime import datetime, timedelta
class TroubleListSerializer(serializers.ModelSerializer):
id = serializers.CharField(source='troubleid')
fxr_name = serializers.CharField(source='fxr.name', read_only=True)
fxbm_name = serializers.CharField(source='fxbm.partname', read_only=True)
yhlb_name = serializers.CharField(source='yhlb.dickeyname', read_only=True)
zgr_name = serializers.CharField(source='zgr.name', read_only=True)
yhpg_name = serializers.CharField(source='yhpg.dickeyname', read_only=True)
yhdj_name = serializers.CharField(source='yhdj.dickeyname', read_only=True)
zgbm_name = serializers.CharField(source='zgbm.partname', read_only=True)
jclx_name = serializers.CharField(source='jclx.dickeyname', read_only=True)
class Meta:
model = Trouble
fields = ['yhms', 'yhzt', 'fxsj', 'tbsj', 'yhnum', 'zgqx', 'zgsj', 'id',
'fxr_name', 'fxbm_name', 'yhlb_name', 'zgr_name', 'yhpg_name', 'yhdj_name', 'zgbm_name', 'jclx_name']
class TroubleListView(APIView):
def post(self, request):
# 查询某一天的隐患, 默认是当天
data = request.data
if 'token' not in data:
return Response({'code': 400, 'msg': '请提供token', 'data': None})
user_data = cache.get(data['token'], None)
if user_data is None:
return Response({'code': 400, 'msg': '无效token', 'data': None})
company_id = user_data['company_id']
day = datetime.now().date()
if 'date' in data:
day = datetime.strptime(data['date'],'%Y-%m-%d').date()
objs = Trouble.objects.filter(usecomp__partid=company_id).exclude(deletemark=0)
if data.get('type', 1) == 2: # 当时整改的
objs = objs.filter(zgsj__year=day.year, zgsj__month=day.month, zgsj__day=day.day)
else:
objs = objs.filter(fxsj__year=day.year, fxsj__month=day.month, fxsj__day=day.day)
serializer = TroubleListSerializer(instance=objs, many=True)
return Response({'code': 200, 'data': serializer.data, 'msg': None})