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

@ -14,6 +14,7 @@ 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):
is_login = request.session.get('is_login', False)
@ -21,8 +22,10 @@ def check_login(func): # 自定义登录验证装饰器
return func(request, *args, **kwargs)
else:
return redirect('/groups/login')
return warpper
def login(request):
# 不允许重复登录
if request.session.get('is_login', None):
@ -51,20 +54,25 @@ 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()
@ -72,15 +80,18 @@ def company(request):
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)
@ -92,6 +103,7 @@ def company_userdetail(request, uid):
return render(request, 'groups/company_userdetail.html', locals())
def groups_userupdate(request):
if request.method == 'POST':
user_form = UserForm(request.POST)
@ -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,6 +151,7 @@ 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()]))
@ -147,10 +161,14 @@ def index(req):
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()
return render(req, 'groups/index.html', locals())
@ -172,6 +190,7 @@ def updateposition(req):
i.save()
return JsonResponse({"code": 1})
def getPosition(address):
url = 'http://restapi.amap.com/v3/geocode/geo'
par = {'address': address, 'key': '86e0993305a427ac2d0b5371ad97f242'}
@ -179,46 +198,70 @@ 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): # 隐患排查
return render(request, 'groups/troublepic.html', locals())
def observe(request): # 行为观察
return render(request, 'groups/observe.html', locals())
def miss(request): # 未遂事件
return render(request, 'groups/miss.html', locals())
def risk(request): # 风险管控
return render(request, 'groups/risk.html', locals())
def train(request): # 教育培训
return render(request, 'groups/train.html', locals())
def exam(request): # 在线考试
return render(request, 'groups/exam.html', locals())
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'))
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')
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'))
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')
return HttpResponse(json.dumps({'code': 1, 'data': {'observelist': list(observelist)}}),
content_type='application/json')
def missChart(request): # 未遂事件
code = request.GET.get('code')
@ -227,12 +270,16 @@ def missChart(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'))
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')
return HttpResponse(json.dumps({'code': 1, 'data': {'misslist': list(misslist)}}),
content_type='application/json')
def riskChart(request): # 风险管控
code = request.GET.get('code')
@ -241,24 +288,33 @@ def riskChart(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'))
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')
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'))
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')
return HttpResponse(json.dumps({'code': 1, 'data': {'trainlist': list(trainlist)}}),
content_type='application/json')
def examChart(request): # 在线考试
code = request.GET.get('code')

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() {
})
}
}
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):
@ -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")
@ -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') != '':
@ -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)
@ -6040,3 +6052,40 @@ def refresh_captcha(request):
def dump(obj):
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})