add main login pulled

This commit is contained in:
wcharles 2019-11-04 16:40:53 +08:00
commit 98b0542ec1
17 changed files with 1674 additions and 155 deletions

11
Pipfile
View File

@ -1,11 +0,0 @@
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
[requires]
python_version = "3.5"

BIN
groups.zip Normal file

Binary file not shown.

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block title %}隐患统计{% endblock %}
@ -132,3 +133,145 @@
</script>
{% endblock %}
=======
{% extends "./base.html" %}
{% block title %}在线考试统计{% endblock %}
{% block pagehead %}
<ol class="breadcrumb">
<li><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">在线考试统计</li>
</ol>
{% endblock %}
{% block content %}
{% load static %}
<div class="callout callout-warning" style="margin-top: 20px;">
<h3>在线考试统计</h3>
</div>
<div style="height:600px;width:100%;background-color:#dac2a3">
<div style="width:100%;height:100px;">
开始日期:<input type="text" id="test">
结束日期:<input type="text" id="test2">
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
</div>
<div id="examchart" style="width:60%;height:400px;margin:auto"></div>
</div>
<!-- jQuery 3 -->
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'groups/time/laydate/laydate.js' %}"></script>
<link rel="stylesheet" href="{% static 'groups/time/laydate/theme/default/laydate.css' %}">
<!-- iCheck -->
<script src="{% static 'groups/plugins/iCheck/icheck.min.js' %}"></script>
<script src="{% static 'groups/bower_components/echarts.min.js' %}"></script>
<script type="text/javascript">
//隐患数量趋势图
$(function () {
laydate.render({
elem: '#test'
, format: 'yyyy-MM-dd' //可任意组合
});
laydate.render({
elem: '#test2'
, format: 'yyyy-MM-dd' //可任意组合
});
exam();
});
function funTypeChange() {
exam();
}
function exam() {
var start = $("#test").val();
var end = $("#test2").val();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "/groups/api/examChart?code=exam&start=" + start + "&end=" + end, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
console.log(data.data.number);
//请求成功时执行该函数内容data即为服务器返回的json对象
var examChart = echarts.init(document.getElementById("examchart"));
var exnum = [];
var companyName = [];
if (data.data != null) {
$.each(data.data, function (i, item) {
exnum.push(item.number);
companyName.push(item.companyName);
})
examChart.setOption(
option = {
color: ['#32CD32'],
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
title: {
text: '本集团各公司在线考试统计图'
},
tooltip: {},
legend: {
data: ['公司在线考试总数']
},
grid: {
y2: 140
},
xAxis: {
type: 'category',
data: companyName,
boundaryGap: [0, 0.01],
axisLabel: {
interval: 0,//横轴信息全部显示
rotate: -30,//-30度角倾斜显示
}
},
yAxis: {},
series: [{
name: '公司在线考试总数',
data: exnum,
type: 'bar'
}]
}
);
}
},
error: function (errorMsg) {
examChart.hideLoading();
}
});
}
</script>
{% endblock %}
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block pagehead %}
<h1>
@ -173,4 +174,181 @@
map.setCenter([x/num,y/num])
})
</script>
=======
{% extends "./base.html" %}
{% block pagehead %}
<h1>
本月数据
<small>Month Data</small>
</h1>
<ol class="breadcrumb">
<li class="active"><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
</ol>
{% endblock %}
{% block content %}
<!-- Info boxes -->
<div class="row">
<div class="col-lg-2 col-xs-6">
<!-- small box -->
<div class="small-box bg-yellow">
<div class="inner">
<h3>{{troublenum}}</h3>
<p>事故隐患</p>
</div>
<div class="icon">
<i class="fa fa-camera"></i>
</div>
<a href="{% url 'groups_trouble' %}" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-2 col-xs-6">
<!-- small box -->
<div class="small-box bg-green">
<div class="inner">
<h3>{{observenum}}
<!-- <sup style="font-size: 20px">%</sup> -->
</h3>
<p>行为观察</p>
</div>
<div class="icon">
<i class="fa fa-eye"></i>
</div>
<a href="{% url 'groups_observe' %}" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-2 col-xs-6">
<!-- small box -->
<div class="small-box bg-red">
<div class="inner">
<h3>{{missnum}}</h3>
<p>未遂事件</p>
</div>
<div class="icon">
<i class="fa fa-life-ring"></i>
</div>
<a href="{% url 'groups_miss' %}" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-2 col-xs-6">
<!-- small box -->
<div class="small-box bg-aqua">
<div class="inner">
<h3>{{trainnum}}</h3>
<p>教育培训</p>
</div>
<div class="icon">
<i class="fa fa-graduation-cap"></i>
</div>
<a href="{% url 'groups_train' %}" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-2 col-xs-6">
<!-- small box -->
<div class="small-box bg-teal">
<div class="inner">
<h3>{{companynum}}</h3>
<p>下属公司数</p>
</div>
<div class="icon">
<i class="fa fa-industry"></i>
</div>
<a href="{% url 'groups_company' %}" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
<div class="col-lg-2 col-xs-6">
<!-- small box -->
<div class="small-box bg-orange">
<div class="inner">
<h3>{{usernum}}</h3>
<p>下属员工总数</p>
</div>
<div class="icon">
<i class="fa fa-users"></i>
</div>
<a href="#" class="small-box-footer">更多分析 <i class="fa fa-arrow-circle-right"></i></a>
</div>
</div>
</div>
<!-- /.row -->
<div class="row">
<div class="col-md-12">
<h3>
{{group.groupname}}
</h3>
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">公司分布</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="row">
<div class="col-md-12">
<!-- <p class="text-center">
<strong>Sales: 1 Jan, 2014 - 30 Jul, 2014</strong>
</p> -->
<div id="container" style="height: 800px;width:auto">
</div>
<!-- /.chart-responsive -->
</div>
</div>
<!-- /.row -->
</div>
<!-- ./box-body -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
<script src="https://webapi.amap.com/maps?v=1.4.15&key=978fc7c286560aa4cb3f18ef06737f9a"></script>
<script>
var map = new AMap.Map('container', {
resizeEnable: true, //是否监控地图容器尺寸变化
zoom: 6, //初始化地图层级
center: [116.397428, 39.90923],//初始化地图中心点
//viewMode:'3D'//使用3D视图
});
$.getJSON('/groups/api/positions', function (res) {
var x=0,y=0,num=0;
for (var i = 0; i < res.data.length; i++) {
let podata = res.data[i]
if(podata.position !=null){
let arrayposition = podata.position.location.split(',')
x = x + parseFloat(arrayposition[0])
y = y + parseFloat(arrayposition[1])
num = num + 1
let marker = new AMap.Marker({
position: podata.position.location.split(','), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
label:{'content':podata.partname,'direction':'bottom'}
// title: res.data[i].partname,
// bubble:true,
// clickable:true
});
map.add(marker);
}
}
map.setCenter([x/num,y/num])
})
</script>
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345
{% endblock %}

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block title %}隐患统计{% endblock %}
@ -133,3 +134,146 @@
</script>
{% endblock %}
=======
{% extends "./base.html" %}
{% block title %}未遂事件统计{% endblock %}
{% block pagehead %}
<ol class="breadcrumb">
<li><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">未遂事件统计</li>
</ol>
{% endblock %}
{% block content %}
{% load static %}
<div class="callout callout-warning" style="margin-top: 20px;">
<h3>未遂事件统计</h3>
</div>
<div style="height:600px;width:100%;background-color:#dac2a3">
<div style="width:100%;height:100px;">
开始日期:<input type="text" id="test">
结束日期:<input type="text" id="test2">
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
</div>
<div id="misschart" style="width:60%;height:400px;margin:auto"></div>
</div>
<!-- jQuery 3 -->
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'groups/time/laydate/laydate.js' %}"></script>
<link rel="stylesheet" href="{% static 'groups/time/laydate/theme/default/laydate.css' %}">
<!-- iCheck -->
<script src="{% static 'groups/plugins/iCheck/icheck.min.js' %}"></script>
<script src="{% static 'groups/bower_components/echarts.min.js' %}"></script>
<script type="text/javascript">
//隐患数量趋势图
$(function () {
laydate.render({
elem: '#test'
, format: 'yyyy-MM-dd' //可任意组合
});
laydate.render({
elem: '#test2'
, format: 'yyyy-MM-dd' //可任意组合
});
miss();
});
function funTypeChange() {
miss();
}
function miss() {
var start = $("#test").val();
var end = $("#test2").val();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "/groups/api/missChart?code=miss&start=" + start + "&end=" + end, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
console.log(data);
//请求成功时执行该函数内容data即为服务器返回的json对象
var missChart = echarts.init(document.getElementById("misschart"));
var missnum = [];
var companyName = [];
if (data.data.misslist != null) {
$.each(data.data.misslist, function (i, item) {
missnum.push(item.number);
companyName.push(item.usecomp__partname);
})
missChart.setOption(
option = {
color: ['#dd4b39'],
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
title: {
text: '本集团各公司未遂事件统计图'
},
tooltip: {},
legend: {
data: ['公司未遂事件总数']
},
grid: {
y2: 140
},
xAxis: {
type: 'category',
data: companyName,
boundaryGap: [0, 0.01],
axisLabel: {
interval: 0,//横轴信息全部显示
rotate: -30,//-30度角倾斜显示
}
},
yAxis: {},
series: [{
name: '公司未遂事件总数',
data: missnum,
type: 'bar'
}]
}
);
}
},
error: function (errorMsg) {
missChart.hideLoading();
}
});
}
</script>
{% endblock %}
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block title %}隐患统计{% endblock %}
@ -130,3 +131,143 @@
</script>
{% endblock %}
=======
{% extends "./base.html" %}
{% block title %}行为统计{% endblock %}
{% block pagehead %}
<ol class="breadcrumb">
<li><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">行为观察统计</li>
</ol>
{% endblock %}
{% block content %}
{% load static %}
<div class="callout callout-warning" style="margin-top: 20px;">
<h3>行为统计</h3>
</div>
<div style="height:600px;width:100%;background-color:#dac2a3">
<div style="width:100%;height:100px;">
开始日期:<input type="text" id="test">
结束日期:<input type="text" id="test2">
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
</div>
<div id="obvchart" style="width:60%;height:400px;margin:auto"></div>
</div>
<!-- jQuery 3 -->
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'groups/time/laydate/laydate.js' %}"></script>
<link rel="stylesheet" href="{% static 'groups/time/laydate/theme/default/laydate.css' %}">
<!-- iCheck -->
<script src="{% static 'groups/plugins/iCheck/icheck.min.js' %}"></script>
<script src="{% static 'groups/bower_components/echarts.min.js' %}"></script>
<script type="text/javascript">
//隐患数量趋势图
$(function () {
laydate.render({
elem: '#test'
, format: 'yyyy-MM-dd' //可任意组合
});
laydate.render({
elem: '#test2'
, format: 'yyyy-MM-dd' //可任意组合
});
observe();
});
function funTypeChange() {
observe();
}
function observe() {
var start = $("#test").val();
var end = $("#test2").val();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "/groups/api/observeChart?code=obv&start=" + start + "&end=" + end, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
console.log(data);
//请求成功时执行该函数内容data即为服务器返回的json对象
var obvChart = echarts.init(document.getElementById("obvchart"));
var obvnum = [];
var companyName = [];
if (data.data.observelist != null) {
$.each(data.data.observelist, function (i, item) {
obvnum.push(item.number);
companyName.push(item.usecomp__partname);
})
obvChart.setOption(
option = {
color: ['#00a65a'],
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
title: {
text: '本集团各公司行为观察统计图'
},
tooltip: {},
legend: {
data: ['公司行为观察总数']
},
xAxis: {
type: 'category',
data: companyName,
boundaryGap: [0, 0.01],
axisLabel: {
interval: 0,//横轴信息全部显示
rotate: -30,//-30度角倾斜显示
}
},
grid: {
y2: 140
},
yAxis: {},
series: [{
name: '公司行为观察总数',
data: obvnum,
type: 'bar'
}]
}
);
}
},
error: function (errorMsg) {
obvChart.hideLoading();
}
});
}
</script>
{% endblock %}
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block title %}风险管控{% endblock %}
@ -132,3 +133,180 @@
</script>
{% endblock %}
=======
{% extends "./base.html" %}
{% block title %}风险管控{% endblock %}
{% block pagehead %}
<ol class="breadcrumb">
<li><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">风险统计</li>
</ol>
{% endblock %}
{% block content %}
{% load static %}
<div class="callout callout-warning" style="margin-top: 20px;">
<h3>风险统计</h3>
</div>
<div style="height:600px;width:100%;background-color:#dac2a3">
<div style="width:100%;height:100px;">
开始日期:<input type="text" id="test">
结束日期:<input type="text" id="test2">
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
</div>
<div id="riskchart" style="width:60%;height:400px;margin:auto"></div>
</div>
<!-- jQuery 3 -->
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'groups/time/laydate/laydate.js' %}"></script>
<link rel="stylesheet" href="{% static 'groups/time/laydate/theme/default/laydate.css' %}">
<!-- iCheck -->
<script src="{% static 'groups/plugins/iCheck/icheck.min.js' %}"></script>
<script src="{% static 'groups/bower_components/echarts.min.js' %}"></script>
<script type="text/javascript">
//隐患数量趋势图
$(function () {
laydate.render({
elem: '#test'
, format: 'yyyy-MM-dd' //可任意组合
});
laydate.render({
elem: '#test2'
, format: 'yyyy-MM-dd' //可任意组合
});
risk();
});
function funTypeChange() {
risk();
}
function risk() {
var start = $("#test").val();
var end = $("#test2").val();
var myChart = echarts.init(document.getElementById("riskchart"));
myChart.setOption(option = {
title: {
text: '集团公司风险点统计图',
},
legend: {
data: ['风险点', '低风险点', '一般风险点', '较大风险点', '重大风险点']
},
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
xAxis: {
type: 'category',
data: [],
},
yAxis: {
type: 'value',
},
series: [],
});
myChart.showLoading();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "/groups/api/riskChart?code=risk&start=" + start + "&end=" + end, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
console.log(data);
//请求成功时执行该函数内容data即为服务器返回的json对象
var datariskact = [];
var datariskact1 = [];
var datariskact2 = [];
var datariskact3 = [];
var datariskact4 = [];
var companyName = [];
if (data!= null) {
$.each(data.risks, function (i, item) {
datariskact.push(item.datariskact);
datariskact1.push(item.datariskact1);
datariskact2.push(item.datariskact2);
datariskact3.push(item.datariskact3);
datariskact4.push(item.datariskact4);
companyName.push(item.companyName);
})
if (data) {
myChart.hideLoading(); //隐藏加载动画
myChart.setOption({
xAxis: {
data: companyName,
boundaryGap: [0, 0.01],
axisLabel: {
interval: 0,//横轴信息全部显示
rotate: -10,//-30度角倾斜显示
}
},
series: [{
name: '风险点',
type: 'bar',
data: datariskact
}, {
name: '低风险点',
type: 'bar',
stack: '风险点',
color: 'blue',
data: datariskact1
},
{
name: '一般风险点',
type: 'bar',
stack: '风险点',
color: 'yellow',
data: datariskact2
}, {
name: '较大风险点',
type: 'bar',
stack: '风险点',
color: 'orange',
data: datariskact3
}, {
name: '重大风险点',
type: 'bar',
stack: '风险点',
color: 'red',
data:datariskact4
}]
});
}
}
},
error: function (errorMsg) {
myChart.hideLoading();
}
});
}
</script>
{% endblock %}
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block title %}教育培训统计{% endblock %}
@ -134,3 +135,147 @@
</script>
{% endblock %}
=======
{% extends "./base.html" %}
{% block title %}教育培训统计{% endblock %}
{% block pagehead %}
<ol class="breadcrumb">
<li><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">教育培训统计</li>
</ol>
{% endblock %}
{% block content %}
{% load static %}
<div class="callout callout-warning" style="margin-top: 20px;">
<h3>教育培训统计</h3>
</div>
<div style="height:600px;width:100%;background-color:#dac2a3">
<div style="width:100%;height:100px;">
开始日期:<input type="text" id="test">
结束日期:<input type="text" id="test2">
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
<div id="trainchart" style="width:60%;height:400px;margin:auto"></div>
</div>
</div>
<!-- jQuery 3 -->
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'groups/time/laydate/laydate.js' %}"></script>
<link rel="stylesheet" href="{% static 'groups/time/laydate/theme/default/laydate.css' %}">
<!-- iCheck -->
<script src="{% static 'groups/plugins/iCheck/icheck.min.js' %}"></script>
<script src="{% static 'groups/bower_components/echarts.min.js' %}"></script>
<script type="text/javascript">
//隐患数量趋势图
$(function () {
laydate.render({
elem: '#test'
, format: 'yyyy-MM-dd' //可任意组合
});
laydate.render({
elem: '#test2'
, format: 'yyyy-MM-dd' //可任意组合
});
train();
});
function funTypeChange() {
train();
}
function train() {
var start = $("#test").val();
var end = $("#test2").val();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "/groups/api/trainChart?code=train&start=" + start + "&end=" + end, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
console.log(data);
//请求成功时执行该函数内容data即为服务器返回的json对象
var trainChart = echarts.init(document.getElementById("trainchart"));
var trainnum = [];
var companyName = [];
if (data.data.trainlist != null) {
$.each(data.data.trainlist, function (i, item) {
trainnum.push(item.number);
companyName.push(item.usecomp__partname);
})
trainChart.setOption(
option = {
color: ['#00c0ef'],
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
title: {
text: '本集团各公司教育培训统计图'
},
tooltip: {},
legend: {
data: ['公司教育培训总数']
},
grid: {
y2: 140
},
xAxis: {
type: 'category',
data: companyName,
boundaryGap: [0, 0.01],
axisLabel: {
interval: 0,//横轴信息全部显示
rotate: -30,//-30度角倾斜显示
}
},
yAxis: {},
series: [{
name: '公司教育培训总数',
data: trainnum,
type: 'bar'
}]
}
);
}
},
error: function (errorMsg) {
trainChart.hideLoading();
}
});
}
</script>
{% endblock %}
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{% extends "./base.html" %}
{% block title %}隐患统计{% endblock %}
@ -127,3 +128,140 @@
</script>
{% endblock %}
=======
{% extends "./base.html" %}
{% block title %}隐患统计{% endblock %}
{% block pagehead %}
<ol class="breadcrumb">
<li><a href="{% url 'groups_index' %}"><i class="fa fa-dashboard"></i> 主页</a></li>
<li class="active">隐患统计</li>
</ol>
{% endblock %}
{% block content %}
{% load static %}
<div class="callout callout-warning" style="margin-top: 20px;">
<h3>隐患统计</h3>
</div>
<div style="height:600px;width:100%;background-color:#dac2a3">
<div style="width:100%;height:100px;">
开始日期:<input type="text" id="test">
结束日期:<input type="text" id="test2">
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
</div>
<div id="troubchart" style="width:60%;height:400px;margin:auto"></div>
</div>
<!-- jQuery 3 -->
<script src="{% static 'groups/bower_components/jquery/dist/jquery.min.js' %}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{% static 'groups/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'groups/time/laydate/laydate.js' %}"></script>
<link rel="stylesheet" href="{% static 'groups/time/laydate/theme/default/laydate.css' %}">
<!-- iCheck -->
<script src="{% static 'groups/plugins/iCheck/icheck.min.js' %}"></script>
<script src="{% static 'groups/bower_components/echarts.min.js' %}"></script>
<script type="text/javascript">
//隐患数量趋势图
$(function () {
laydate.render({
elem: '#test'
, format: 'yyyy-MM-dd' //可任意组合
});
laydate.render({
elem: '#test2'
, format: 'yyyy-MM-dd' //可任意组合
});
troub();
});
function funTypeChange() {
troub();
}
function troub() {
var start = $("#test").val();
var end = $("#test2").val();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "/groups/api/troubleChart?code=tbpic&start=" + start + "&end=" + end, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
console.log(data.data.troublelist);
console.log(data.num);
//请求成功时执行该函数内容data即为服务器返回的json对象
var yhChart = echarts.init(document.getElementById("troubchart"));
var yhnum = [];
var companyName = [];
if (data.data.troublelist != null) {
$.each(data.data.troublelist, function (i, item) {
yhnum.push(item.number);
companyName.push(item.usecomp__partname);
})
yhChart.setOption(
option = {
color: ['#FF7F50'],
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
title: {
text: '本集团各公司隐患统计图'
},
tooltip: {},
legend: {
data: ['公司隐患总数']
},
grid: {
y2: 140
},
xAxis: {
type: 'category',
data: companyName,
boundaryGap: [0, 0.01],
axisLabel: {
interval: 0,//横轴信息全部显示
rotate: -30,//-30度角倾斜显示
}
},
yAxis: {},
series: [{
name: '公司隐患总数',
data: yhnum,
type: 'bar'
}]
}
);
}
},
error: function (errorMsg) {
yhChart.hideLoading();
}
});
}
</script>
{% endblock %}
>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345

View File

@ -1,4 +1,4 @@
from django.http import HttpResponse,JsonResponse
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.shortcuts import redirect
from .models import Group, GroupUser
@ -8,21 +8,24 @@ from safesite.tasks import gettime
import requests
import json
import time
from datetime import datetime,date,timedelta
from datetime import datetime, date, timedelta
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Q,F,Count,Sum
from django.db.models import Q, F, Count, Sum
from django.forms.models import model_to_dict
from django.http import Http404
def check_login(func): # 自定义登录验证装饰器
def warpper(request,*args,**kwargs):
def warpper(request, *args, **kwargs):
is_login = request.session.get('is_login', False)
if is_login:
return func(request,*args,**kwargs)
return func(request, *args, **kwargs)
else:
return redirect('/groups/login')
return warpper
def login(request):
# 不允许重复登录
if request.session.get('is_login', None):
@ -51,47 +54,56 @@ def login(request):
groups_form = GroupUserForm()
return render(request, 'groups/login.html', locals())
def logout(request):
# if not request.session.get('is_login', None):
# return redirect('/groups/login')
request.session.flush()
return redirect('/groups/login')
import json
from captcha.models import CaptchaStore
from captcha.helpers import captcha_image_url
def refresh_captcha(request):
hashkey = CaptchaStore.generate_key()
image_url = captcha_image_url(hashkey)
return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json')
@check_login
def company(request):
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
for i in companys:
i.useradmin = s_models.User.objects.get(ubelongpart=i,issuper=1).username
i.useradmin = s_models.User.objects.get(ubelongpart=i, issuper=1).username
return render(request, 'groups/company.html', locals())
def job(request):
return render(request, 'groups/job.html', locals())
def company_user(request, cid):
users = s_models.User.objects.filter(usecomp=cid)
# for user in users:
# dump(user)
return render(request, 'groups/company_user.html', locals())
def company_userdetail(request, uid):
try:
user = s_models.User.objects.get(pk=uid)
except s_models.User.DoesNotExist:
raise Http404("User does not exist")
#UserForm.set_usecomp(s_models.Partment.objects.filter(group__id=1))
# UserForm.set_usecomp(s_models.Partment.objects.filter(group__id=1))
user_form = UserForm(model_to_dict(user))
return render(request, 'groups/company_userdetail.html', locals())
def groups_userupdate(request):
if request.method == 'POST':
user_form = UserForm(request.POST)
@ -120,7 +132,7 @@ def groups_userupdate(request):
model_user.save()
for i in s_models.Group.objects.filter(usecomp=usecomp):
i.users.remove(model_user)
i.users.remove(model_user)
groupobj = s_models.Group.objects.filter(usecomp=usecomp, grouptype=3).first()
groupobj.users.add(model_user)
else:
@ -129,6 +141,7 @@ def groups_userupdate(request):
else:
return redirect('/groups/company/')
def company_userchange_page(request, uid):
try:
user = s_models.User.objects.get(pk=uid)
@ -138,39 +151,45 @@ def company_userchange_page(request, uid):
return render(request, 'groups/company_userchange.html', locals())
def dump(obj):
print('\n'.join(['%s:%s' % item for item in obj.__dict__.items()]))
@check_login
def index(req):
first_day,first_day_of_next_month=gettime()
group = GroupUser.objects.get(id = req.session['user_id']).group
first_day, first_day_of_next_month = gettime()
group = GroupUser.objects.get(id=req.session['user_id']).group
companys = group.members.all()
troublenum = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys,fxsj__range=(first_day, first_day_of_next_month)).count()
observenum = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys,looktime__range=(first_day, first_day_of_next_month)).count()
missnum = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys,misstime__range=(first_day, first_day_of_next_month)).count()
trainnum = s_models.Train.objects.filter(deletemark=1,usecomp__in=companys,starttime__range=(first_day, first_day_of_next_month)).count()
troublenum = s_models.Trouble.objects.filter(deletemark=1, usecomp__in=companys,
fxsj__range=(first_day, first_day_of_next_month)).count()
observenum = s_models.Observe.objects.filter(deletemark=1, usecomp__in=companys,
looktime__range=(first_day, first_day_of_next_month)).count()
missnum = s_models.Miss.objects.filter(deletemark=1, usecomp__in=companys,
misstime__range=(first_day, first_day_of_next_month)).count()
trainnum = s_models.Train.objects.filter(deletemark=1, usecomp__in=companys,
starttime__range=(first_day, first_day_of_next_month)).count()
companynum = len(companys)
usernum = s_models.User.objects.filter(deletemark=1,usecomp__in=companys).count()
usernum = s_models.User.objects.filter(deletemark=1, usecomp__in=companys).count()
return render(req, 'groups/index.html', locals())
def updateposition(req):
allcompanys = s_models.Partment.objects.filter(deletemark=1,iscompany=1)
allcompanys = s_models.Partment.objects.filter(deletemark=1, iscompany=1)
for i in allcompanys:
address = i.partname
data = getPosition(address)
if data['status'] == '1' and int(data['count'])>0:
if data['status'] == '1' and int(data['count']) > 0:
i.position = data['geocodes'][0]
i.save()
else:
address = i.partname.replace('公司','').replace('责任','').replace('有限','')
address = i.partname.replace('公司', '').replace('责任', '').replace('有限', '')
data = getPosition(address)
if data['status'] == '1' and int(data['count'])>0:
if data['status'] == '1' and int(data['count']) > 0:
i.position = data['geocodes'][0]
i.save()
return JsonResponse({"code":1})
return JsonResponse({"code": 1})
def getPosition(address):
url = 'http://restapi.amap.com/v3/geocode/geo'
@ -179,101 +198,138 @@ def getPosition(address):
json_data = json.loads(res.text)
return json_data
def apipositions(req):
companys = GroupUser.objects.get(id = req.session['user_id']).group.members.all()
positions = companys.values('position','partname')
return JsonResponse({"code":1,"data":list(positions)})
def trouble(request):#隐患排查
companys = GroupUser.objects.get(id=req.session['user_id']).group.members.all()
positions = companys.values('position', 'partname')
return JsonResponse({"code": 1, "data": list(positions)})
def trouble(request): # 隐患排查
return render(request, 'groups/troublepic.html', locals())
def observe(request):#行为观察
def observe(request): # 行为观察
return render(request, 'groups/observe.html', locals())
def miss(request):#未遂事件
def miss(request): # 未遂事件
return render(request, 'groups/miss.html', locals())
def risk(request):#风险管控
def risk(request): # 风险管控
return render(request, 'groups/risk.html', locals())
def train(request):#教育培训
def train(request): # 教育培训
return render(request, 'groups/train.html', locals())
def exam(request):#在线考试
def exam(request): # 在线考试
return render(request, 'groups/exam.html', locals())
def troubleChart(request):#隐患统计图
def troubleChart(request): # 隐患统计图
code = request.GET.get('code')
start = request.GET.get('start')
end = request.GET.get('end')
if code=='tbpic':
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
troublelist = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('troubleid'))
if start:
troublelist = troublelist.filter(fxsj__gte=start)
if end:
troublelist = troublelist.filter(fxsj__lte=end)
return HttpResponse(json.dumps({'code':1,'data':{'troublelist':list(troublelist)}}), content_type='application/json')
def observeChart(request):#行为观察
if code == 'tbpic':
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
troublelist = s_models.Trouble.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid',
'usecomp__partname').annotate(
number=Count('troubleid'))
if start:
troublelist = troublelist.filter(fxsj__gte=start)
if end:
troublelist = troublelist.filter(fxsj__lte=end)
return HttpResponse(json.dumps({'code': 1, 'data': {'troublelist': list(troublelist)}}),
content_type='application/json')
def observeChart(request): # 行为观察
code = request.GET.get('code')
start = request.GET.get('start')
end = request.GET.get('end')
if code=='obv':
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
observelist = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('lookid'))
if start:
observelist = observelist.filter(looktime__gte=start)
if end:
observelist = observelist.filter(looktime__lte=end)
return HttpResponse(json.dumps({'code':1,'data':{'observelist':list(observelist)}}), content_type='application/json')
def missChart(request):#未遂事件
if code == 'obv':
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
observelist = s_models.Observe.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid',
'usecomp__partname').annotate(
number=Count('lookid'))
if start:
observelist = observelist.filter(looktime__gte=start)
if end:
observelist = observelist.filter(looktime__lte=end)
return HttpResponse(json.dumps({'code': 1, 'data': {'observelist': list(observelist)}}),
content_type='application/json')
def missChart(request): # 未遂事件
code = request.GET.get('code')
start = request.GET.get('start')
end = request.GET.get('end')
if code=='miss':
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
misslist = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('missid'))
if start:
misslist = misslist.filter(misstime__gte=start)
if end:
misslist = misslist.filter(misstime__lte=end)
return HttpResponse(json.dumps({'code':1,'data':{'misslist':list(misslist)}}), content_type='application/json')
def riskChart(request):#风险管控
if code == 'miss':
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
misslist = s_models.Miss.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid',
'usecomp__partname').annotate(
number=Count('missid'))
if start:
misslist = misslist.filter(misstime__gte=start)
if end:
misslist = misslist.filter(misstime__lte=end)
return HttpResponse(json.dumps({'code': 1, 'data': {'misslist': list(misslist)}}),
content_type='application/json')
def riskChart(request): # 风险管控
code = request.GET.get('code')
start = request.GET.get('start')
end = request.GET.get('end')
if code=='risk':
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
risklist = s_models.Risk.objects.filter(usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('id'))
if start:
risklist = risklist.filter(createtime__gte=start)
if end:
risklist = risklist.filter(createtime__lte=end)
return HttpResponse(json.dumps({'code':1,'data':{'risklist':list(risklist)}}), content_type='application/json')
def trainChart(request):#教育培训
if code == 'risk':
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
risklist = s_models.Risk.objects.filter(usecomp__in=companys).values('usecomp__partid',
'usecomp__partname').annotate(
number=Count('id'))
if start:
risklist = risklist.filter(createtime__gte=start)
if end:
risklist = risklist.filter(createtime__lte=end)
return HttpResponse(json.dumps({'code': 1, 'data': {'risklist': list(risklist)}}),
content_type='application/json')
def trainChart(request): # 教育培训
code = request.GET.get('code')
start = request.GET.get('start')
end = request.GET.get('end')
if code=='train':
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
trainlist = s_models.Train.objects.filter(usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('trainid'))
if start:
trainlist = trainlist.filter(starttime__gte=start)
if end:
trainlist = trainlist.filter(starttime__lte=end)
return HttpResponse(json.dumps({'code':1,'data':{'trainlist':list(trainlist)}}), content_type='application/json')
def examChart(request):#在线考试
if code == 'train':
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
trainlist = s_models.Train.objects.filter(usecomp__in=companys).values('usecomp__partid',
'usecomp__partname').annotate(
number=Count('trainid'))
if start:
trainlist = trainlist.filter(starttime__gte=start)
if end:
trainlist = trainlist.filter(starttime__lte=end)
return HttpResponse(json.dumps({'code': 1, 'data': {'trainlist': list(trainlist)}}),
content_type='application/json')
def examChart(request): # 在线考试
code = request.GET.get('code')
start = request.GET.get('start')
end = request.GET.get('end')
examjson = []
if code=='exam':
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
for i in companys:
examlist = s_models.ExamTest.objects.filter(usecomps__contains=','+i+',').count()
if start:
if code == 'exam':
companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all()
for i in companys:
examlist = s_models.ExamTest.objects.filter(usecomps__contains=',' + i + ',').count()
if start:
examlist = examlist.filter(starttime__gte=start)
if end:
if end:
examlist = examlist.filter(starttime__lte=end)
examjson.append({'companyName':i.Partment,'number':Partment})
return HttpResponse(json.dumps({'code':1,'data':examjson}), content_type='application/json')
examjson.append({'companyName': i.Partment, 'number': Partment})
return HttpResponse(json.dumps({'code': 1, 'data': examjson}), content_type='application/json')

View File

@ -10,7 +10,7 @@ For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
import os
import os,time
import psycopg2.extensions
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
@ -146,5 +146,82 @@ CELERY_ENABLE_UTC=True
##配置session
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_AGE = 1800
SESSION_SAVE_EVERY_REQUEST = True
#日志配置
# 创建日志的路径
LOG_PATH = os.path.join(BASE_DIR, 'log')
# 如果地址不存在则自动创建log文件夹
if not os.path.join(LOG_PATH):
os.mkdir(LOG_PATH)
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
# 日志格式
'standard': {
'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] '
'[%(levelname)s]- %(message)s'},
'simple': { # 简单格式
'format': '%(levelname)s %(message)s'
},
},
# 过滤
'filters': {
},
# 定义具体处理日志的方式
'handlers': {
# 默认记录所有日志
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_PATH, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))),
'maxBytes': 1024 * 1024 * 5, # 文件大小
'backupCount': 5, # 备份数
'formatter': 'standard', # 输出格式
'encoding': 'utf-8', # 设置默认编码,否则打印出来汉字乱码
},
# 输出错误日志
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_PATH, 'error-{}.log'.format(time.strftime('%Y-%m-%d'))),
'maxBytes': 1024 * 1024 * 5, # 文件大小
'backupCount': 5, # 备份数
'formatter': 'standard', # 输出格式
'encoding': 'utf-8', # 设置默认编码
},
# 控制台输出
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
# 输出info日志
'info': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_PATH, 'info-{}.log'.format(time.strftime('%Y-%m-%d'))),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8', # 设置默认编码
},
},
# 配置用哪几种 handlers 来处理日志
'loggers': {
# 类型 为 django 处理所有类型的日志, 默认调用
'django': {
'handlers': ['default', 'console'],
'level': 'INFO',
'propagate': False
},
# log 调用时需要当作参数传入
'log': {
'handlers': ['error', 'info', 'console', 'default'],
'level': 'INFO',
'propagate': True
},
}
}

View File

@ -268,7 +268,7 @@ def drusers(companyid,path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
partdict = {}
groupdict = {}
# groupdict = {}
userdict = {}
parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门
for i in parts:

View File

@ -101,15 +101,15 @@ canvas{
}
.login{z-index: 2;position:absolute;width: 350px;border-radius: 5px;height: 500px;box-shadow: 0px 0px 5px #333333;background:white;top: 50%;left: 50%;margin-top: -250px;margin-left: -175px;transition: all 1s;-moz-transition: all 1s; /* Firefox 4 */-webkit-transition: all 1s; /* Safari 和 Chrome */-o-transition: all 1s; /* Opera */}
.login-top{font-size: 24px;margin-top: 100px;padding-left: 40px;box-sizing: border-box;color: #333333;margin-bottom: 50px;font-family:"微软雅黑";font-weight:bold;color:dodgerblue}
.login-top{font-size: 24px;margin-top: 100px;text-align: center;;box-sizing: border-box;color: #333333;margin-bottom: 50px;font-family:"微软雅黑";font-weight:bold;color:dodgerblue}
.login-center{width: 100%;box-sizing: border-box;padding: 0 40px;margin-bottom: 30px;}
.login-center-img{width: 20px;height: 20px;float: left;margin-top: 5px;}
.login-center-img>img{width: 100%;}
.login-center-input{float: left;width: 230px;margin-left: 15px;height: 30px;position: relative;}
.login-center-input{float: left;width: 80%;margin-left: 15px;height: 30px;position: relative;}
.login-center-input input{z-index: 2;transition: all 0.5s;padding-left: 10px;color: #333333;width: 100%;height: 30px;border: 0;border-bottom: 1px solid #cccccc;border-top: 1px solid #ffffff;border-left: 1px solid #ffffff;border-right: 1px solid #ffffff;box-sizing: border-box;outline: none;position: relative;}
.login-center-input input:focus{border: 1px solid dodgerblue;}
.login-center-input-text{background: white;padding: 0 5px;position: absolute;z-index: 0;opacity: 0;height: 20px;top: 50%;margin-top: -10px;font-size: 14px;left: 5px;color: dodgerblue;line-height: 20px;transition: all 0.5s;-moz-transition: all 0.5s; /* Firefox 4 */-webkit-transition: all 0.5s; /* Safari 和 Chrome */-o-transition: all 0.5s; /* Opera */}
.login-center-input input:focus~.login-center-input-text{top: 0;z-index: 3;opacity: 1;margin-top: -15px;}
.login.active{-webkit-animation: login-small 0.8s ; animation: login-small 0.8s ;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}
.login-button{cursor: pointer;width: 250px;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;border-radius: 5px;margin: 0 auto;margin-top: 50px;color: white;font-size: 18px}
.login-button{cursor: pointer;width: 80%;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;margin: 0 auto;margin-top: 50px;color: white;font-size: 18px}

View File

@ -526,7 +526,7 @@ function jsonSort(jsonObj) {
}
return str.substr(0, str.length - 1)
}
//map定时显示,每分钟请求一次
//map定时显示,每分钟请求一次,如果存在map
function update() {
if ($('#mapshowinput').length) {
source.clear()
@ -571,4 +571,15 @@ function update() {
})
}
}
var t1 = window.setInterval(update, 1000 * 60)
function checksession(){
$.get('api/check_session',function(res){
if(res.code==1){
}else{
$.messager.alert('','长时间未操作,请重新登陆!','warning',function(){
window.location.reload(true)
});
}
})
}
var t1 = window.setInterval(update, 1000 * 60)
var t2 = window.setInterval(checksession,1000*60*31)

View File

@ -0,0 +1,268 @@
<script>
var now = new Date();
$(function () {
year = now.getFullYear();
month = now.getMonth() + 1;
for (var i = 0; i < 5; i++) {
$('#year').append('<option value="' + (year - i) + '">' + (year - i) + '</option>');
$('#years').append('<option value="' + (year - i) + '">' + (year - i) + '</option>');
}
$.get('api/tool?a=servertime', function (res) {
$('#year').combobox().combobox('setValue', res.year);
$('#years').combobox().combobox('setValue', res.year);
$('#month').combobox().combobox('setValue', res.month);
behaviorDate();
trainstatistical();
})
});
function gcpmsearch() {
var querydata = $('#fxrpms').serializeJSON();
$('#fxrpmtable').datagrid('load', querydata);
}
//培训分析柱形图
function behaviorDate() {
var y = $("#year").val();
var gcChart = echarts.init(document.getElementById("piecontainer"));
gcChart.setOption(option = {
title: {
text: '培训数量趋势图',
x: 'left'
},
tooltip: {
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
legend: {
data: []
},
xAxis: {
type: 'category',
data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月','8月','9月','10月','11月','12月']
},
yAxis: {
type: 'value'
},
toolbox: {
show: true,
feature: {
mark: { show: true },
dataView: { show: true, readOnly: false },
restore: { show: true },
saveAsImage: { show: true }
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
});
gcChart.showLoading();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "api/trainfg?a=trainfig&year=" + y, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
//请求成功时执行该函数内容data即为服务器返回的json对象
console.log(data);
if (data) {
gcChart.hideLoading(); //隐藏加载动画
gcChart.setOption({
legend: { data: data.key },
series: [{
name: '公司级',
type: 'bar',
stack: '总量',
label: {
normal: {
show: true,
position: 'insideRight'
}
},
data: data.companylevel
},
{
name: '车间/工段级',
type: 'bar',
stack: '总量',
label: {
normal: {
show: true,
position: 'insideRight'
}
},
data: data.workshoplevel
},
{
name: '班组级',
type: 'bar',
stack: '总量',
label: {
normal: {
show: true,
position: 'insideRight'
}
},
data: data.teamlevel
},
{
name: '部门分厂级',
type: 'bar',
stack: '总量',
label: {
normal: {
show: true,
position: 'insideRight'
}
},
data: data.departmentlevel
}]
}
);
}
},
error: function (errorMsg) {
gcChart.hideLoading();
}
});
}
//培训分析扇形图
function trainstatistical() {
var y = $("#year").val();
var m = $("#month").val();
var gcChart = echarts.init(document.getElementById("piecontainer2"));
gcChart.setOption(option = {
title: {
text: '培训类型分布',
x: 'left'
},
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: 'vertical',
x: 'left',
y: 'bottom',
data: []
},
toolbox: {
show: true,
feature: {
mark: { show: true },
dataView: { show: true, readOnly: false },
restore: { show: true },
saveAsImage: { show: true }
}
},
calculable: true,
});
gcChart.showLoading();
$.ajax({
type: "get",
async: true, //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "api/trainfg?a=traintype&year=" + y + "&month=" + m, //请求发送
dataType: "json", //返回数据形式为json
success: function (data) {
//请求成功时执行该函数内容data即为服务器返回的json对象
console.log(data)
if (data) {
gcChart.hideLoading(); //隐藏加载动画
gcChart.setOption({
legend: {
orient: 'vertical',
left: 'left',
data: ['日常培训', '相关方培训', '在岗人员培训'] },
series: [{
name: '培训类型',
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: [
{ value: data.daily, name: '日常培训' },
{ value: data.related, name: '相关方培训' },
{ value: data.jobuser, name: '在岗人员培训' }
],
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}]
}
);
}
},
error: function (errorMsg) {
gcChart.hideLoading();
}
});
}
function funTypeChange() {
behaviorDate();//
}
function funTypeChange2() {
trainstatistical();//
}
</script>
<div class="border" id="desktop" style="margin: 10px 10px 0 10px; background: #fff; overflow: auto;">
<div style="width:100%">
<div style="width:80%;margin:auto">
<select class="txtInput select3" id="year" name="year" style="width:100px;"></select><label></label>
<button class="btn btn-info" onclick="funTypeChange()">&nbsp;查询</button>
<div id="piecontainer" style="height:400px;width:100%">
</div>
</div>
<div style="width:80%;margin:auto">
<select class="txtInput select3" id="month" name="month" style="width:100px;">
<option value="1">1月</option>
<option value="2">2月</option>
<option value="3">3月</option>
<option value="4">4月</option>
<option value="5">5月</option>
<option value="6">6月</option>
<option value="7">7月</option>
<option value="8">8月</option>
<option value="9">9月</option>
<option value="10">10月</option>
<option value="11">11月</option>
<option value="12">12月</option>
</select>
<button class="btn btn-info" onclick="funTypeChange2()">&nbsp;查询</button>
<div id="piecontainer2" style="height:400px;width:100%">
</div>
</div>
</div>
</div>

View File

@ -88,6 +88,7 @@ urlpatterns = [
path('html/bhr',views.bhrhtml),
path('riskas',views.riskas),
path('html/examhistory/<int:id>/',views.examhistory),
path('html/trainfig',views.trainfigure),
#html页面
@ -153,7 +154,8 @@ urlpatterns = [
path('api/report',views.apireport),
path('api/obscount',views.observepic),
path('api/riskas',views.apiriskas),
path('api/trainfg',views.trainfg),
path('api/check_session',views.check_session),
#path('api/rights/group/<int:groupid>',views.rightsgroup),
path('api/main',views.mainapi),

View File

@ -27,6 +27,9 @@ import jwt
import decimal
from . import forms
from .models import CompanyInfo
from django.contrib.sessions.models import Session
import logging
logger = logging.getLogger('log')
#分页功能
def fenye(req):
@ -63,7 +66,7 @@ def getcompany(x):
else:
return a.ubelongpart.partlink.split(',')[1]
def getparts(partid):#获取该部门及下属部门
return Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ','))
return Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ','))
#转换为datagrid所用json
def transjson(total, obj):
a = {'total':total,'rows':list(obj),'code':1}
@ -181,9 +184,9 @@ def noticedetail(req,id):
def noticeedit(req,id):
return render(req,'noticeedit.html',{'id':id})
def suggestupdate(req,jyid):
return render(req,'suggestupdate.html',{'jyid':jyid})
return render(req,'suggestupdate.html',{'jyid':jyid})
def suggestdetail(req,jyid):
return render(req,'suggestdetail.html',{'jyid':jyid})
return render(req,'suggestdetail.html',{'jyid':jyid})
def suggestadd(req):
return render(req,'suggestadd.html')
def suggest(req):
@ -239,6 +242,8 @@ def userhtml(req):
return render(req,'userhtml.html')
def bhrhtml(req):
return render(req,'behavior.html')
def trainfigure(req):
return render(req,'trainfigure.html')
def check_login(func):
def warpper(request,*args,**kwargs):
is_login = request.session.get('userid', None)
@ -271,6 +276,11 @@ def check_login(func):
# return JsonResponse({"code": 401, "message": "please login!"})
return warpper
def check_session(req):
if req.session.get('userid',None):
return JsonResponse({"code":1})
else:
return JsonResponse({"code":0})
#存储文件
def upfile(req):
username = User.objects.get(userid=req.session['userid']).username
@ -309,6 +319,7 @@ def login(req):
user_form = UserForm()
return render(req,'login.html', locals())
def index(req):
if not req.session.get('userid', None):
return redirect('login')
@ -327,6 +338,7 @@ def logout(req):
#del req.session['username']
# if "userid" in req.session:
# del req.session['userid']
logger.info('method: %s user: %s 登出' % (req.method,req.session['userid']))
req.session.flush()
#req.session.flush()
#req.session.delete("session_key")
@ -553,7 +565,7 @@ def apirights(req):
groupid = req.GET.get('groupid')
haverights = Group.objects.get(groupid=groupid).menulink.split(',')
userid = req.session['userid']
companyid = getcompany(userid)
companyid = getcompany(userid)
allrights = Group.objects.get(usecomp__partid=companyid,grouptype=0).menulink.split(',')
menus = Menu.objects.exclude(menuid__in=[11,9]).filter(menuid__in = allrights,deletemark=1).order_by('menuid').values('menuid','menucode','parentid','url','menuname','icon').distinct()
for i in menus:
@ -573,7 +585,7 @@ def apirights(req):
return JsonResponse({"code":1})
elif a=='have':
userid = req.session['userid']
companyid = getcompany(userid)
companyid = getcompany(userid)
allrights = Group.objects.get(usecomp__partid=companyid,grouptype=0).menulink.split(',')
return JsonResponse({'code':1,'rights':allrights})
@ -611,7 +623,7 @@ def addyh(req):
a.yhdd = yhdd
if 'yhqy' in yhdata:
if yhdata['yhqy']:
a.yhqy = Area.objects.get(id= yhdata['yhqy'])
a.yhqy = Area.objects.get(id= yhdata['yhqy'])
a.yhms = yhms
a.yhtp = yhtp
a.yhnum='YH'+time.strftime('%Y%m%d%H%M%S')
@ -1471,7 +1483,7 @@ def grouphandle(req):
companyid = getcompany(userid)
a = Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname')
keystr=transstr(a,'groupid','groupname')
return HttpResponse(keystr,content_type="application/json")
return HttpResponse(keystr,content_type="application/json")
elif req.method == 'POST':
data = json.loads(req.body.decode('utf-8'))
userid = req.session['userid']
@ -1544,7 +1556,7 @@ def troublehandle(req):
a = a.filter(fxr__userid=fxr)
elif fxbm:
parts = Partment.objects.filter(partlink__contains=','+str(fxbm)+',')|Partment.objects.filter(partid=fxbm)
a = a.filter(fxbm__in=parts)
a = a.filter(fxbm__in=parts)
if qssj:
a = a.filter(fxsj__gte=qssj)
if jssj:
@ -1753,7 +1765,7 @@ def charthandle(req):
partid = req.GET.get('part')
else:
partid = companyid
parts = Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ','))
parts = Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ','))
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
a = Train.objects.filter(deletemark=1,trainpart__in=parts,state=1)
value=[]
@ -2224,11 +2236,10 @@ def parthandle(req):
return HttpResponse(json.dumps(b,cls=MyEncoder),content_type="application/json")
elif req.GET.get('a')=='del':
a = req.POST.get('partid')
if Partment.objects.filter(partlink__contains=','+a+',') or User.objects.filter(ubelongpart=a):
if Partment.objects.filter(partlink__contains=','+a+',').exists() or User.objects.filter(ubelongpart=a).exists():
return JsonResponse({"code":0})
else:
a = Partment.objects.get(partid=a)
a.delete()
Partment.objects.get(partid=a).delete()
return JsonResponse({"code":1})
elif req.GET.get('a')=='addpart':
if req.POST.get('partid') != '':
@ -2699,7 +2710,7 @@ def gchandle(req):
obj.lookpart = User.objects.get(userid=userid).ubelongpart
if 'looktime2' in gcdata:
if gcdata['looktime2']:
obj.looktime2 = gcdata['looktime2']
obj.looktime2 = gcdata['looktime2']
if 'lookeder' in gcdata:
obj.lookeder = gcdata['lookeder']
if 'otherunsafe' in gcdata:
@ -2736,7 +2747,7 @@ def gchandle(req):
i['readtime'] = Observeto.objects.filter(observe__lookid=i['lookid'],user__userid = userid)[0].submittime
else:
i['read']=0
return HttpResponse(transjson(total,a),content_type="application/json")
return HttpResponse(transjson(total,a),content_type="application/json")
elif a == 'listself':
startnum,endnum=fenye(req)
a = Observe.objects.filter(looker__userid=userid,deletemark=1).order_by('-looktime')
@ -2825,7 +2836,7 @@ def gchandle(req):
data = json.loads(req.body.decode('utf-8'))
url = exportdoc2('gc',data)
return JsonResponse({"code":1,"downloadurl":url})
def observepic(req):
userid = req.session['userid']
companyid = getcompany(userid)
@ -2859,7 +2870,7 @@ def observepic(req):
rtgcx=[]#人体工程学
hjzj=[]#环境整洁
for month in months:
for month in months:
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
if req.GET.get('part'):
partid = req.GET.get('part')
@ -2882,14 +2893,14 @@ def observepic(req):
rtgcx.append(Unsafes.objects.filter(observe__in=a,unsafedicclass=i).count())
elif i.dicid==30:
hjzj.append(Unsafes.objects.filter(observe__in=a,unsafedicclass=i).count())
return JsonResponse({'code':1,'months':months,'userfy':userfy,'userwz':userwz,'grfh':grfh,'gjhsb':gjhsb,'cxhbz':cxhbz,'rtgcx':rtgcx,'hjzj':hjzj,})
elif req.GET.get('a')=='gclxbg':
userid = req.session['userid']
companyid = getcompany(userid)
a = Observe.objects.filter(usecomp=Partment.objects.get(partid=companyid),deletemark=1)
if req.GET.get('qssj'):#开始时间
a = a.filter(looktime__gte=req.GET.get('qssj'))
if req.GET.get('jssj'):#结束时间
@ -2898,13 +2909,13 @@ def observepic(req):
gcbm = req.GET.get('fxbm')
parts = Partment.objects.filter(partlink__contains=',' + gcbm + ',')|Partment.objects.filter(partid=gcbm)
a = a.filter(lookpart__in=parts)
total = a.count()
objs = a.values('looker__userid','looker__name','lookpart__partname').annotate(number = Count('looker')).order_by('-number')
return HttpResponse(transjson(total,objs),content_type="application/json")
def dicchandle(req):
a = req.GET.get('a')
if a == 'tree':
@ -3119,7 +3130,7 @@ def apicompany(req):
Yjsetup.objects.create(monthyhavg=100,safev=50,warnv=75,alertv=100,maxv=200,yhpgqz=4,yhdjqz=4,yhsblqz=1,yhzglqz=4,pxdjqz=3,pxxgqz=4,yldjqz=3,ylxgqz=3,usecomp=y)
Map.objects.create(name='默认地图',pic='/static/safesite/mystatic/images/snc.jpg',usecomp=y,default=1)
return JsonResponse({'code':1,'companyid':y.partid})
def drapi(req):
a = req.GET.get('a')
if a == 'user':
@ -3195,13 +3206,13 @@ def drapi(req):
return JsonResponse({"code":1})
def apimiss(req):
a = req.GET.get('a')
userid = req.session['userid']
companyid = getcompany(userid)
if a == 'add':
if a == 'add':
obj = Miss()
data = json.loads(req.body.decode('utf-8'))
obj.missplace = data['missplace']
@ -3453,7 +3464,7 @@ def apisocert(req):
return JsonResponse({"code":1,"data":getTzzs(cardnum,realname)})
elif a=='updateTzzs':
updateTzzs()
def guoqi(x):
now = datetime.now()
now1 = datetime.now() + timedelta(days=180)
@ -3462,7 +3473,7 @@ def guoqi(x):
elif now1 > datetime.strptime(x,'%Y-%m-%d') > now:
return 2
else:
return 3
return 3
def apisafecert(req):
a = req.GET.get('a')
if a=='listall':
@ -3630,8 +3641,8 @@ def apipartuser(req):
userobjs = User.objects.filter(ubelongpart=req.GET.get('parentid'),deletemark=1).exclude(issuper=1)
for i in userobjs:
lst.append({'id':i.userid,'name':i.name,'parentId':0,'checked':False,'isPeople':True,'children':[]})
return JsonResponse({"code":1,"data":lst})
return JsonResponse({"code":1,"data":lst})
def apiuser(req):
a = req.GET.get('a')
@ -3804,7 +3815,7 @@ def apisuggest(req):
id = req.GET.get('id')
res = exportdoc('jy',id)
return res
elif a == 'update': #评估
userid = req.session['userid']
data = json.loads(req.body.decode('utf-8'))
@ -3874,7 +3885,7 @@ def apisuggest(req):
obj.save()
Suggestflow.objects.create(suggest=obj,user=User.objects.get(userid=userid),action='驳回处理结果')
return JsonResponse({"code":1})
@ -4029,7 +4040,7 @@ def apitool(req):
m.append(x)
return JsonResponse({'wxgs':m})
def apinotice(req):
a = req.GET.get('a')
@ -4166,7 +4177,7 @@ def apinotice(req):
data['reads'] = list(reads)
data['readpeople']= readobj.exclude(read=0).count()
data['readsnum'] = readobj.aggregate(num=Sum('read')).get('num') or 0
try:
toobj = Noticeto.objects.get(noticeid__id=id,receiver__userid = userid)
toobj.read = int(toobj.read) + 1
@ -4258,7 +4269,7 @@ def apioperation(req):
m = Operzyry(oper=obj,operzyry=x)
m.save()
b.append(x.openid)
postdict={
'touser':'',
'template_id':'lOuwSE67vZC3ZVFYPZvz2eb7JdFxqx7ysMFkXrYmYh0',
@ -4484,7 +4495,7 @@ def apioperation(req):
}
}
send_wechatmsg.delay(postdict)
Operspxq.objects.create(oper=Operation.objects.get(zyid=zyid),jdmc=oldjdmc,spr=spruser,checked=1,spbm=spruser.ubelongpart)
except :
obj.zyzt['zyzt'] = '待关闭'
@ -4733,7 +4744,8 @@ def apiquestion(req):
elif a == 'exercise':
data = json.loads(req.body.decode('utf-8'))
x = Question.objects.filter(deletemark=1)
a = (x.filter(usecomps__contains=',1,')|x.filter(usecomps__contains=','+companyid+',')).exclude(nousecomps__contains=','+companyid+',')
#a = (x.filter(usecomps__contains=',1,')|x.filter(usecomps__contains=','+companyid+',')).exclude(nousecomps__contains=','+companyid+',')
a = x.exclude(nousecomps__contains=','+companyid+',')
tmlxs = data['tmlx']
ydtms = data['ydtms']
a = x.filter(questioncat__id__in=tmlxs).exclude(id__in=ydtms)
@ -4852,7 +4864,7 @@ def apiexampaper(req):
elif int(i['type']) == 3:
ExamPaperDetail.objects.create(exampaper=obj,question=Question.objects.get(id=i['id']),score=int(pds))
return JsonResponse({"code":1})
def apiexamtest(req):
a = req.GET.get('a')
@ -5112,7 +5124,7 @@ def apiexamtestdetail(req):
obj.testnum = obj.testnum + 1
obj.starttime = starttime
obj.endtime = endtime
obj.took = took
obj.took = took
obj.testdetail = testdetail
obj.rights = rights
obj.score = score
@ -5226,7 +5238,7 @@ def apimap(req):
id = req.POST.get('id')
Map.objects.filter(id=id).update(pic=req.POST.get('pic'))
return JsonResponse({"code":1})
def apiarea(req):
a = req.GET.get('a')
userid = req.session['userid']
@ -5269,7 +5281,7 @@ def apiarea(req):
name = data['name']
order = data['order']
Area.objects.filter(id=data['id']).update(name = name,order=order)
return JsonResponse({"code":1})
return JsonResponse({"code":1})
def apimapshow(req):
a = req.GET.get('a')
@ -5459,7 +5471,7 @@ def apiinspect(req):
id = req.GET.get('id')
a = Inspect.objects.filter(id=id).values('id','state','content','creattime','equipment__num','equipment__id','equipment__name','equipment__area__name','user__name','user__ubelongpart__partname','trouble__yhzt','trouble__yhnum','trouble__yhms','trouble__troubleid')
return JsonResponse(a[0])
def apiriskact(req):
a = req.GET.get('a')
userid = req.session['userid']
@ -5568,7 +5580,7 @@ def apiriskact(req):
RiskActTask.objects.create(riskact=obj,taskadd=tasktime,taskexpire = tasktime + timedelta(days=1),istask=1)
elif tasktype == 3:
RiskActTask.objects.create(riskact=obj,taskadd=tasktime,taskexpire = tasktime + timedelta(days=7),istask=1)
return JsonResponse({"code":1})
return JsonResponse({"code":1})
def apirisk(req):
a = req.GET.get('a')
@ -5949,7 +5961,7 @@ def apiriskcheck(req):
startnum,endnum=fenye(req)
objs = objs.order_by('-id')[startnum:endnum].values('id','risk__step','risk__level','risk__riskact__name','risk__riskact__area__name','risk__riskact__place','dotime','trouble__yhnum','user__ubelongpart__partname','user__name')
return HttpResponse(transjson(total,objs),content_type="application/json")
def apireport(req):
a = req.GET.get('a')
userid = req.session['userid']
@ -5988,7 +6000,7 @@ def apireport(req):
obj.cause = data['cause']
obj.suggest = data['suggest']
obj.save()
return JsonResponse({'code':1})
return JsonResponse({'code':1})
#公司信息展示
@ -6039,4 +6051,41 @@ def refresh_captcha(request):
return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json')
def dump(obj):
print('\n'.join(['%s:%s' % item for item in obj.__dict__.items()]))
print('\n'.join(['%s:%s' % item for item in obj.__dict__.items()]))
def trainfg(req):
a = req.GET.get('a')
userid = req.session['userid']
companyid = getcompany(userid)
if a == 'trainfig':
year = int(req.GET.get('year'))
months = [1,2,3,4,5,6,7,8,9,10,11,12]
companylevel=[]#公司级
workshoplevel=[]#车间/工段级
teamlevel=[]#班组级
departmentlevel =[]#部门分厂级
for month in months:
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
a = Train.objects.filter(usecomp__partid=companyid,deletemark=1,starttime__range=(first_day, first_day_of_next_month))
companylevel.append(a.filter(trainlevel__dicid=5).count())
workshoplevel.append(a.filter(trainlevel__dicid=6).count())
teamlevel.append(a.filter(trainlevel__dicid=7).count())
departmentlevel.append(a.filter(trainlevel__dicid=42).count())
return JsonResponse({'code':1,'companylevel':companylevel,'workshoplevel':workshoplevel,'teamlevel':teamlevel,'departmentlevel':departmentlevel})
elif a=='traintype':
year = int(req.GET.get('year'))
month = int(req.GET.get('month'))
daily=[]#日常培训
related=[]#相关方培训
jobuser=[]#在岗人员培训
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
a = Train.objects.filter(usecomp__partid=companyid,deletemark=1,starttime__range=(first_day, first_day_of_next_month))
daily.append(a.filter(traintype__dickeyid=1).count())
related.append(a.filter(traintype__dickeyid=108).count())
jobuser.append(a.filter(traintype__dickeyid=107).count())
return JsonResponse({'code':1,'daily':daily,'related':related,'jobuser':jobuser})