add main login pulled
This commit is contained in:
commit
98b0542ec1
11
Pipfile
11
Pipfile
|
|
@ -1,11 +0,0 @@
|
|||
[[source]]
|
||||
name = "pypi"
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
|
||||
[dev-packages]
|
||||
|
||||
[packages]
|
||||
|
||||
[requires]
|
||||
python_version = "3.5"
|
||||
Binary file not shown.
|
|
@ -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()"> 查询</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
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
@ -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()"> 查询</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
|
||||
|
|
|
|||
|
|
@ -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()"> 查询</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
|
||||
|
|
|
|||
|
|
@ -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()"> 查询</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
|
||||
|
|
|
|||
|
|
@ -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()"> 查询</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
|
||||
|
|
|
|||
|
|
@ -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()"> 查询</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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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()"> 查询</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()"> 查询</button>
|
||||
|
||||
<div id="piecontainer2" style="height:400px;width:100%">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue