This commit is contained in:
shilixia 2019-10-24 09:13:07 +08:00
commit 4388be95db
12 changed files with 376 additions and 529 deletions

View File

@ -9,6 +9,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
{% load static %} {% load static %}
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<title>集团管理分析后台</title> <title>集团管理分析后台</title>
<!-- Tell the browser to be responsive to screen width --> <!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
@ -23,7 +24,12 @@ scratch. This page gets rid of all links and provides the needed markup only.
page. However, you can choose any other skin. Make sure you page. However, you can choose any other skin. Make sure you
apply the skin class to the body tag so the changes take effect. --> apply the skin class to the body tag so the changes take effect. -->
<link rel="stylesheet" href="{% static 'groups/dist/css/skins/skin-blue.min.css' %}"> <link rel="stylesheet" href="{% static 'groups/dist/css/skins/skin-blue.min.css' %}">
<!-- 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>
<!-- AdminLTE App -->
<script src="{% static 'groups/dist/js/adminlte.min.js' %}"></script>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]> <!--[if lt IE 9]>
@ -110,9 +116,6 @@ desired effect
</ul> </ul>
</li> </li>
<!-- Control Sidebar Toggle Button --> <!-- Control Sidebar Toggle Button -->
<li>
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
</li>
</ul> </ul>
</div> </div>
</nav> </nav>
@ -136,7 +139,7 @@ desired effect
</div> </div>
<!-- search form (Optional) --> <!-- search form (Optional) -->
<form action="#" method="get" class="sidebar-form"> <!-- <form action="#" method="get" class="sidebar-form">
<div class="input-group"> <div class="input-group">
<input type="text" name="q" class="form-control" placeholder="搜索..."> <input type="text" name="q" class="form-control" placeholder="搜索...">
<span class="input-group-btn"> <span class="input-group-btn">
@ -144,7 +147,7 @@ desired effect
</button> </button>
</span> </span>
</div> </div>
</form> </form> -->
<!-- /.search form --> <!-- /.search form -->
<!-- Sidebar Menu --> <!-- Sidebar Menu -->
@ -307,12 +310,7 @@ desired effect
<!-- REQUIRED JS SCRIPTS --> <!-- REQUIRED JS SCRIPTS -->
<!-- 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>
<!-- AdminLTE App -->
<script src="{% static 'groups/dist/js/adminlte.min.js' %}"></script>
<!-- Optionally, you can add Slimscroll and FastClick plugins. <!-- Optionally, you can add Slimscroll and FastClick plugins.
Both of these plugins are recommended to enhance the Both of these plugins are recommended to enhance the

View File

@ -1,497 +1,176 @@
{% extends "./base.html" %} {% 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 %} {% block content %}
<!-- Info boxes --> <!-- Info boxes -->
<div class="row"> <div class="row">
<div class="col-md-3 col-sm-6 col-xs-12"> <div class="col-lg-2 col-xs-6">
<div class="info-box"> <!-- small box -->
<span class="info-box-icon bg-aqua"><i class="ion ion-ios-gear-outline"></i></span> <div class="small-box bg-yellow">
<div class="inner">
<h3>{{troublenum}}</h3>
<div class="info-box-content"> <p>事故隐患</p>
<span class="info-box-text">CPU Traffic</span>
<span class="info-box-number">90<small>%</small></span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
<div class="col-md-3 col-sm-6 col-xs-12">
<div class="info-box">
<span class="info-box-icon bg-red"><i class="fa fa-google-plus"></i></span>
<div class="info-box-content">
<span class="info-box-text">Likes</span>
<span class="info-box-number">41,410</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
<!-- fix for small devices only -->
<div class="clearfix visible-sm-block"></div>
<div class="col-md-3 col-sm-6 col-xs-12">
<div class="info-box">
<span class="info-box-icon bg-green"><i class="ion ion-ios-cart-outline"></i></span>
<div class="info-box-content">
<span class="info-box-text">Sales</span>
<span class="info-box-number">760</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
<div class="col-md-3 col-sm-6 col-xs-12">
<div class="info-box">
<span class="info-box-icon bg-yellow"><i class="ion ion-ios-people-outline"></i></span>
<div class="info-box-content">
<span class="info-box-text">New Members</span>
<span class="info-box-number">2,000</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
</div> </div>
<!-- /.row --> <div class="icon">
<i class="fa fa-camera"></i>
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">Monthly Recap Report</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>
<div class="btn-group">
<button type="button" class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-wrench"></i></button>
<ul class="dropdown-menu" role="menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
<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-8">
<p class="text-center">
<strong>Sales: 1 Jan, 2014 - 30 Jul, 2014</strong>
</p>
<div class="chart">
<!-- Sales Chart Canvas -->
<canvas id="salesChart" style="height: 180px;"></canvas>
</div>
<!-- /.chart-responsive -->
</div>
<!-- /.col -->
<div class="col-md-4">
<p class="text-center">
<strong>Goal Completion</strong>
</p>
<div class="progress-group">
<span class="progress-text">Add Products to Cart</span>
<span class="progress-number"><b>160</b>/200</span>
<div class="progress sm">
<div class="progress-bar progress-bar-aqua" style="width: 80%"></div>
</div>
</div>
<!-- /.progress-group -->
<div class="progress-group">
<span class="progress-text">Complete Purchase</span>
<span class="progress-number"><b>310</b>/400</span>
<div class="progress sm">
<div class="progress-bar progress-bar-red" style="width: 80%"></div>
</div>
</div>
<!-- /.progress-group -->
<div class="progress-group">
<span class="progress-text">Visit Premium Page</span>
<span class="progress-number"><b>480</b>/800</span>
<div class="progress sm">
<div class="progress-bar progress-bar-green" style="width: 80%"></div>
</div>
</div>
<!-- /.progress-group -->
<div class="progress-group">
<span class="progress-text">Send Inquiries</span>
<span class="progress-number"><b>250</b>/500</span>
<div class="progress sm">
<div class="progress-bar progress-bar-yellow" style="width: 80%"></div>
</div>
</div>
<!-- /.progress-group -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- ./box-body -->
<div class="box-footer">
<div class="row">
<div class="col-sm-3 col-xs-6">
<div class="description-block border-right">
<span class="description-percentage text-green"><i class="fa fa-caret-up"></i> 17%</span>
<h5 class="description-header">$35,210.43</h5>
<span class="description-text">TOTAL REVENUE</span>
</div>
<!-- /.description-block -->
</div>
<!-- /.col -->
<div class="col-sm-3 col-xs-6">
<div class="description-block border-right">
<span class="description-percentage text-yellow"><i class="fa fa-caret-left"></i> 0%</span>
<h5 class="description-header">$10,390.90</h5>
<span class="description-text">TOTAL COST</span>
</div>
<!-- /.description-block -->
</div>
<!-- /.col -->
<div class="col-sm-3 col-xs-6">
<div class="description-block border-right">
<span class="description-percentage text-green"><i class="fa fa-caret-up"></i> 20%</span>
<h5 class="description-header">$24,813.53</h5>
<span class="description-text">TOTAL PROFIT</span>
</div>
<!-- /.description-block -->
</div>
<!-- /.col -->
<div class="col-sm-3 col-xs-6">
<div class="description-block">
<span class="description-percentage text-red"><i class="fa fa-caret-down"></i> 18%</span>
<h5 class="description-header">1200</h5>
<span class="description-text">GOAL COMPLETIONS</span>
</div>
<!-- /.description-block -->
</div>
</div>
<!-- /.row -->
</div>
<!-- /.box-footer -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div> </div>
<!-- /.row --> <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>
<!-- Main row --> <p>行为观察</p>
<div class="row">
<!-- Left col -->
<div class="col-md-8">
<!-- MAP & BOX PANE -->
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">Visitors Report</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 no-padding">
<div class="row">
<div class="col-md-9 col-sm-8">
<div class="pad">
<!-- Map will be created here -->
<div id="world-map-markers" style="height: 325px;"></div>
</div>
</div>
<!-- /.col -->
<div class="col-md-3 col-sm-4">
<div class="pad box-pane-right bg-green" style="min-height: 280px">
<div class="description-block margin-bottom">
<div class="sparkbar pad" data-color="#fff">90,70,90,70,75,80,70</div>
<h5 class="description-header">8390</h5>
<span class="description-text">Visits</span>
</div>
<!-- /.description-block -->
<div class="description-block margin-bottom">
<div class="sparkbar pad" data-color="#fff">90,50,90,70,61,83,63</div>
<h5 class="description-header">30%</h5>
<span class="description-text">Referrals</span>
</div>
<!-- /.description-block -->
<div class="description-block">
<div class="sparkbar pad" data-color="#fff">90,50,90,70,61,83,63</div>
<h5 class="description-header">70%</h5>
<span class="description-text">Organic</span>
</div>
<!-- /.description-block -->
</div>
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
<!-- TABLE: LATEST ORDERS -->
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">Latest Orders</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="table-responsive">
<table class="table no-margin">
<thead>
<tr>
<th>Order ID</th>
<th>Item</th>
<th>Status</th>
<th>Popularity</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="pages/examples/invoice.html">OR9842</a></td>
<td>Call of Duty IV</td>
<td><span class="label label-success">Shipped</span></td>
<td>
<div class="sparkbar" data-color="#00a65a" data-height="20">90,80,90,-70,61,-83,63</div>
</td>
</tr>
<tr>
<td><a href="pages/examples/invoice.html">OR1848</a></td>
<td>Samsung Smart TV</td>
<td><span class="label label-warning">Pending</span></td>
<td>
<div class="sparkbar" data-color="#f39c12" data-height="20">90,80,-90,70,61,-83,68</div>
</td>
</tr>
<tr>
<td><a href="pages/examples/invoice.html">OR7429</a></td>
<td>iPhone 6 Plus</td>
<td><span class="label label-danger">Delivered</span></td>
<td>
<div class="sparkbar" data-color="#f56954" data-height="20">90,-80,90,70,-61,83,63</div>
</td>
</tr>
<tr>
<td><a href="pages/examples/invoice.html">OR7429</a></td>
<td>Samsung Smart TV</td>
<td><span class="label label-info">Processing</span></td>
<td>
<div class="sparkbar" data-color="#00c0ef" data-height="20">90,80,-90,70,-61,83,63</div>
</td>
</tr>
<tr>
<td><a href="pages/examples/invoice.html">OR1848</a></td>
<td>Samsung Smart TV</td>
<td><span class="label label-warning">Pending</span></td>
<td>
<div class="sparkbar" data-color="#f39c12" data-height="20">90,80,-90,70,61,-83,68</div>
</td>
</tr>
<tr>
<td><a href="pages/examples/invoice.html">OR7429</a></td>
<td>iPhone 6 Plus</td>
<td><span class="label label-danger">Delivered</span></td>
<td>
<div class="sparkbar" data-color="#f56954" data-height="20">90,-80,90,70,-61,83,63</div>
</td>
</tr>
<tr>
<td><a href="pages/examples/invoice.html">OR9842</a></td>
<td>Call of Duty IV</td>
<td><span class="label label-success">Shipped</span></td>
<td>
<div class="sparkbar" data-color="#00a65a" data-height="20">90,80,90,-70,61,-83,63</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.box-body -->
<div class="box-footer clearfix">
<a href="javascript:void(0)" class="btn btn-sm btn-info btn-flat pull-left">Place New Order</a>
<a href="javascript:void(0)" class="btn btn-sm btn-default btn-flat pull-right">View All Orders</a>
</div>
<!-- /.box-footer -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
<div class="col-md-4">
<!-- Info Boxes Style 2 -->
<div class="info-box bg-yellow">
<span class="info-box-icon"><i class="ion ion-ios-pricetag-outline"></i></span>
<div class="info-box-content">
<span class="info-box-text">Inventory</span>
<span class="info-box-number">5,200</span>
<div class="progress">
<div class="progress-bar" style="width: 50%"></div>
</div>
<span class="progress-description">
50% Increase in 30 Days
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
<div class="info-box bg-green">
<span class="info-box-icon"><i class="ion ion-ios-heart-outline"></i></span>
<div class="info-box-content">
<span class="info-box-text">Mentions</span>
<span class="info-box-number">92,050</span>
<div class="progress">
<div class="progress-bar" style="width: 20%"></div>
</div>
<span class="progress-description">
20% Increase in 30 Days
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
<div class="info-box bg-red">
<span class="info-box-icon"><i class="ion ion-ios-cloud-download-outline"></i></span>
<div class="info-box-content">
<span class="info-box-text">Downloads</span>
<span class="info-box-number">114,381</span>
<div class="progress">
<div class="progress-bar" style="width: 70%"></div>
</div>
<span class="progress-description">
70% Increase in 30 Days
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
<div class="info-box bg-aqua">
<span class="info-box-icon"><i class="ion-ios-chatbubble-outline"></i></span>
<div class="info-box-content">
<span class="info-box-text">Direct Messages</span>
<span class="info-box-number">163,921</span>
<div class="progress">
<div class="progress-bar" style="width: 40%"></div>
</div>
<span class="progress-description">
40% Increase in 30 Days
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
<!-- PRODUCT LIST -->
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">Recently Added Products</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">
<ul class="products-list product-list-in-box">
<li class="item">
<div class="product-img">
<img src="dist/img/default-50x50.gif" alt="Product Image">
</div>
<div class="product-info">
<a href="javascript:void(0)" class="product-title">Samsung TV
<span class="label label-warning pull-right">$1800</span></a>
<span class="product-description">
Samsung 32" 1080p 60Hz LED Smart HDTV.
</span>
</div>
</li>
<!-- /.item -->
<li class="item">
<div class="product-img">
<img src="dist/img/default-50x50.gif" alt="Product Image">
</div>
<div class="product-info">
<a href="javascript:void(0)" class="product-title">Bicycle
<span class="label label-info pull-right">$700</span></a>
<span class="product-description">
26" Mongoose Dolomite Men's 7-speed, Navy Blue.
</span>
</div>
</li>
<!-- /.item -->
<li class="item">
<div class="product-img">
<img src="dist/img/default-50x50.gif" alt="Product Image">
</div>
<div class="product-info">
<a href="javascript:void(0)" class="product-title">Xbox One <span
class="label label-danger pull-right">$350</span></a>
<span class="product-description">
Xbox One Console Bundle with Halo Master Chief Collection.
</span>
</div>
</li>
<!-- /.item -->
<li class="item">
<div class="product-img">
<img src="dist/img/default-50x50.gif" alt="Product Image">
</div>
<div class="product-info">
<a href="javascript:void(0)" class="product-title">PlayStation 4
<span class="label label-success pull-right">$399</span></a>
<span class="product-description">
PlayStation 4 500GB Console (PS4)
</span>
</div>
</li>
<!-- /.item -->
</ul>
</div>
<!-- /.box-body -->
<div class="box-footer text-center">
<a href="javascript:void(0)" class="uppercase">View All Products</a>
</div>
<!-- /.box-footer -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div> </div>
<!-- /.row --> <div class="icon">
<i class="fa fa-eye"></i>
</div>
<a href="#" 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="#" 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="#" 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="#" 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>
{% endblock %} {% endblock %}

View File

@ -16,6 +16,8 @@ urlpatterns = [
path('tain/', views.job, name='groups_train'),#教育培训统计图 path('tain/', views.job, name='groups_train'),#教育培训统计图
path('test/', views.job, name='groups_test'),#在线考试统计图 path('test/', views.job, name='groups_test'),#在线考试统计图
path('refresh_captcha/', views.refresh_captcha), path('refresh_captcha/', views.refresh_captcha),
path('updateposition/',views.updateposition),
path('api/positions',views.apipositions),
path('api/troubleChart',views.troubleChart), path('api/troubleChart',views.troubleChart),
path('api/observeChart',views.observeChart) path('api/observeChart',views.observeChart)
] ]

View File

@ -1,19 +1,25 @@
from django.http import HttpResponse from django.http import HttpResponse,JsonResponse
from django.shortcuts import render from django.shortcuts import render
from django.shortcuts import redirect from django.shortcuts import redirect
from .models import Group,GroupUser from .models import Group,GroupUser
from .forms import GroupUserForm from .forms import GroupUserForm
from safesite import models as s_models from safesite import models as s_models
from safesite.tasks import gettime
import requests
import json
import time import time
from datetime import datetime,date,timedelta from datetime import datetime,date,timedelta
from safesite.tasks import send_wechatmsgs,send_wechatmsg,yjjs,gettime,yjjs_px,yjjs_yl,updateTzzs,updateAqzs,yjjs_gc,yjjs_ws
from django.db.models import Q
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import F,Count,Sum from django.db.models import Q,F,Count,Sum
def index(request):
if not request.session.get('is_login', None): def check_login(func): # 自定义登录验证装饰器
return redirect('/groups/login/') def warpper(request,*args,**kwargs):
return render(request, 'groups/index.html') is_login = request.session.get('is_login', False)
if is_login:
return func(request,*args,**kwargs)
else:
return redirect('/groups/login')
return warpper
def login(request): def login(request):
# 不允许重复登录 # 不允许重复登录
@ -44,8 +50,8 @@ def login(request):
return render(request, 'groups/login.html', locals()) return render(request, 'groups/login.html', locals())
def logout(request): def logout(request):
if not request.session.get('is_login', None): # if not request.session.get('is_login', None):
return redirect('/groups/login') # return redirect('/groups/login')
request.session.flush() request.session.flush()
return redirect('/groups/login') return redirect('/groups/login')
@ -57,7 +63,7 @@ def refresh_captcha(request):
image_url = captcha_image_url(hashkey) image_url = captcha_image_url(hashkey)
return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json') return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json')
@check_login
def company(request): def company(request):
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
for i in companys: for i in companys:
@ -66,6 +72,48 @@ def company(request):
def job(request): def job(request):
return render(request, 'groups/job.html', locals()) return render(request, 'groups/job.html', locals())
@check_login
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()
companynum = len(companys)
usernum = s_models.User.objects.filter(deletemark=1,usecomp__in=companys).count()
return render(req, 'groups/index.html', locals())
def updateposition(req):
allcompanys = s_models.Partment.objects.filter(deletemark=1,iscompany=1)
for i in allcompanys:
address = i.partname
data = getPosition(address)
if data['status'] == '1' and int(data['count'])>0:
i.position = data['geocodes'][0]
i.save()
else:
address = i.partname.replace('公司','').replace('责任','').replace('有限','')
data = getPosition(address)
if data['status'] == '1' and int(data['count'])>0:
i.position = data['geocodes'][0]
i.save()
return JsonResponse({"code":1})
def getPosition(address):
url = 'http://restapi.amap.com/v3/geocode/geo'
par = {'address': address, 'key': '86e0993305a427ac2d0b5371ad97f242'}
res = requests.get(url, par)
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):#隐患排查 def trouble(request):#隐患排查
return render(request, 'groups/troublepic.html', locals()) return render(request, 'groups/troublepic.html', locals())
def observe(request):#行为观察 def observe(request):#行为观察
@ -95,6 +143,6 @@ def observeChart(request):#行为观察
hjzj=[]#环境整洁 hjzj=[]#环境整洁
first_day,first_day_of_next_month = gettime(datetime(year,month,1)) first_day,first_day_of_next_month = gettime(datetime(year,month,1))
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
return HttpResponse(json.dumps({'code':1,'data':{'list':list(Observe)},'userfy':userfy,'userwz':userwz,'grfh':grfh,'gjhsb':gjhsb,'cxhbz':cxhbz,'rtgcx':rtgcx,'hjzj':hjzj,}), content_type='application/json')
return HttpResponse(json.dumps({'code':companys}), content_type='application/json')

View File

@ -268,10 +268,14 @@ def drusers(companyid,path):
wb = load_workbook(path) wb = load_workbook(path)
sheet = wb.worksheets[0] sheet = wb.worksheets[0]
partdict = {} partdict = {}
groupdict = {}
userdict = {} userdict = {}
parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门 parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门
for i in parts: for i in parts:
partdict[i.partname] = i.partid partdict[i.partname] = i.partid
# groups = Group.objects.filter(usecomp__partid=companyid)
# for i in groups:
# groupdict[i.groupname] = i.groupid
i = 4 i = 4
while sheet['C'+str(i)].value !=None: while sheet['C'+str(i)].value !=None:
empid = sheet['A'+str(i)].value empid = sheet['A'+str(i)].value
@ -283,7 +287,7 @@ def drusers(companyid,path):
username = sheet['C'+str(i)].value username = sheet['C'+str(i)].value
if isinstance(username,str): if isinstance(username,str):
username = username.replace(' ', '') username = username.replace(' ', '')
partname = sheet['D'+str(i)].value partname = sheet['D'+str(i)].value #部门
if partname != None: if partname != None:
partname = partname.replace(' ', '') partname = partname.replace(' ', '')
if partname not in partdict: if partname not in partdict:
@ -293,6 +297,14 @@ def drusers(companyid,path):
a.partlink = Partment.objects.get(partid=companyid).partlink + str(companyid) + ',' a.partlink = Partment.objects.get(partid=companyid).partlink + str(companyid) + ','
a.save() a.save()
partdict[partname] = a.partid partdict[partname] = a.partid
# groupname = sheet['E'+str(i)].value
# groupname = groupname.replace(' ', '') if groupname else None
# if groupname and groupname not in groupdict:
# obj = Group()
# obj.groupname = groupname
# obj.usecomp = Partment.objects.get(partid=companyid)
# obj.save()
# groupdict[groupname] = obj.groupid
if User.objects.filter(username = username).count() == 0: if User.objects.filter(username = username).count() == 0:
a = User() a = User()
a.name = name a.name = name
@ -303,6 +315,8 @@ def drusers(companyid,path):
a.usecomp = Partment.objects.get(partid=companyid) a.usecomp = Partment.objects.get(partid=companyid)
a.save() a.save()
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a) #赋权 Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a) #赋权
# if groupname:
# Group.objects.get(groupid=groupdict[groupname]).users.add(a)
else: else:
userdict[username]=i userdict[username]=i
i = i + 1 i = i + 1

View File

@ -0,0 +1,23 @@
# Generated by Django 2.1.5 on 2019-10-22 16:35
import django.contrib.postgres.fields.jsonb
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('safesite', '0278_auto_20191018_1723'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.AddField(
model_name='partment',
name='position',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='坐标'),
),
]

View File

@ -0,0 +1,32 @@
# Generated by Django 2.1.5 on 2019-10-23 17:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0279_auto_20191022_1635'),
]
operations = [
migrations.CreateModel(
name='Groupuser2',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Group')),
('part', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User')),
],
),
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.AddField(
model_name='group',
name='users2',
field=models.ManyToManyField(related_name='userg2', through='safesite.Groupuser2', to='safesite.User'),
),
]

View File

@ -17,6 +17,7 @@ class Partment(models.Model):
aqy = models.CharField(max_length=1000,default=',')#安全员 aqy = models.CharField(max_length=1000,default=',')#安全员
bmzg = models.CharField(max_length=1000,default=',')#主管 bmzg = models.CharField(max_length=1000,default=',')#主管
bsq = models.CharField(max_length=1000,default=',')#授权者 bsq = models.CharField(max_length=1000,default=',')#授权者
position = JSONField('坐标',null=True,blank=True)
def __str__(self): def __str__(self):
return self.partname return self.partname
@ -281,9 +282,15 @@ class Group(models.Model):#用户组,岗位
groupname = models.CharField(max_length=30,blank=True,null=True) groupname = models.CharField(max_length=30,blank=True,null=True)
grouptype = models.IntegerField(default=4) grouptype = models.IntegerField(default=4)
users = models.ManyToManyField(User,related_name='userg') users = models.ManyToManyField(User,related_name='userg')
users2 = models.ManyToManyField(User,related_name='userg2',through='Groupuser2')
usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE,related_name='usecompg',default=1) usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE,related_name='usecompg',default=1)
menulink = models.CharField(max_length=200,default='11') menulink = models.CharField(max_length=200,default='11')
class Groupuser2(models.Model): #比较好的方式
group = models.ForeignKey(Group, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
part = models.ForeignKey(Partment, on_delete=models.CASCADE,null=True,blank=True)
class Menu(models.Model):#菜单 class Menu(models.Model):#菜单
menuid = models.AutoField(primary_key=True) menuid = models.AutoField(primary_key=True)
menuname = models.CharField(max_length=30,blank=True,null=True) menuname = models.CharField(max_length=30,blank=True,null=True)

View File

@ -36,6 +36,20 @@
$('#ubelongpart').treegrid('unselect'); $('#ubelongpart').treegrid('unselect');
} }
} --> } -->
<!-- <div style="margin-bottom:5px">
<input id="group" class="easyui-combobox" name="group" style="width:90%"
data-options="
label:'岗位',
url: 'grouphandle?a=list2',
multiple:true,
valueField:'groupid',
textField:'groupname',
loadFilter: function (data) {
return data.rows;
}
"
editable="false">
</select></div> -->
</form> </form>
</div> </div>
<script> <script>
@ -62,6 +76,7 @@
} }
function submitFormu() { function submitFormu() {
var form = new FormData(document.getElementById("puffuser")); var form = new FormData(document.getElementById("puffuser"));
console.log(form)
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: 'userhandle?a=add', url: 'userhandle?a=add',

View File

@ -148,7 +148,7 @@
maximizable: true, maximizable: true,
title: '新增用户', title: '新增用户',
width: 600, width: 600,
height: 300, height: 400,
closed: false, closed: false,
cache: false, cache: false,
href: url, href: url,

View File

@ -485,29 +485,38 @@ def getspr(ubp):
return User.objects.get(ubelongpart=currentpart,issuper=1) return User.objects.get(ubelongpart=currentpart,issuper=1)
return a return a
def getsprs(ubp): def getsprs(userid,ubp):
currentpart=ubp currentpart=ubp
a=getsprs_ubp(currentpart) a=getsprs_ubp(userid,currentpart)
while a==False: while a==False:
currentpart=currentpart.parentid #已找不到上级部门 currentpart=currentpart.parentid #已找不到上级部门
if currentpart: if currentpart:
a=getsprs_ubp(currentpart) a=getsprs_ubp(userid,currentpart)
else: else:
return User.objects.get(ubelongpart=currentpart,issuper=1) return User.objects.get(ubelongpart=currentpart,issuper=1)
return a return a
def getsprs_ubp(ubp): def getsprs_ubp(userid,ubp):
a=ubp a=ubp
if a.aqy !=',': if a.aqy !=',':
aqystr = a.aqy aqystr = a.aqy
aqylist = aqystr.split(',') aqylist = aqystr.split(',')
aqylist = list(map(int, list(filter(None, aqylist)))) aqylist = list(map(int, list(filter(None, aqylist))))
return aqylist if userid in aqylist:
return [userid]
else:
if ',' + str(userid) + ',' in a.bmzg:
return [userid]
else:
return aqylist
if a.bmzg !=',': if a.bmzg !=',':
zgstr = a.bmzg zgstr = a.bmzg
zglist = zgstr.split(',') zglist = zgstr.split(',')
zglist = list(map(int, list(filter(None, zglist)))) zglist = list(map(int, list(filter(None, zglist))))
return zglist if userid in zglist:
return [userid]
else:
return zglist
else: else:
return False return False
@ -1442,6 +1451,12 @@ def grouphandle(req):
a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname','grouptype') a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname','grouptype')
total=a.count() total=a.count()
return HttpResponse(transjson(total,a),content_type="application/json") return HttpResponse(transjson(total,a),content_type="application/json")
elif req.GET.get('a') =='list2':#排除全体用户组
userid = req.session['userid']
companyid = getcompany(userid)
a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).exclude(grouptype=3).values('groupid','groupname','grouptype')
total=a.count()
return HttpResponse(transjson(total,a),content_type="application/json")
elif req.GET.get('a') =='combobox': elif req.GET.get('a') =='combobox':
userid = req.session['userid'] userid = req.session['userid']
companyid = getcompany(userid) companyid = getcompany(userid)
@ -2116,6 +2131,8 @@ def userhandle(req):
name = req.POST.get('name') name = req.POST.get('name')
empid = req.POST.get('empid') empid = req.POST.get('empid')
ubelongpart=Partment.objects.get(partid=req.POST.get('ubelongpart')) ubelongpart=Partment.objects.get(partid=req.POST.get('ubelongpart'))
# if req.POST.getlist('group',None):
# a[0].userg.add(*req.POST.getlist('group'))
a.update(name=name,empid=empid,ubelongpart=ubelongpart,username=newname) a.update(name=name,empid=empid,ubelongpart=ubelongpart,username=newname)
return JsonResponse({"code":1}) return JsonResponse({"code":1})
else: else:
@ -2133,6 +2150,13 @@ def userhandle(req):
companyid = getcompany(a.userid) companyid = getcompany(a.userid)
a.usecomp = Partment.objects.get(partid=companyid) a.usecomp = Partment.objects.get(partid=companyid)
a.save() a.save()
# if req.POST.getlist('group',None):
# #a.userg.add(*req.POST.getlist('group'))
# objs = Group.objects.filter(groupid__in=req.POST.getlist('group'))
# for i in objs:
# if i.grouptype == 1:
# i.users.add(a)
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a) Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a)
return JsonResponse({"code":1}) return JsonResponse({"code":1})
else: else:
@ -2963,12 +2987,12 @@ def bwlogin(req):
def unbindwechat(req): def unbindwechat(req):
userid=req.session['userid'] userid=req.session['userid']
User.objects.filter(userid=userid).update(openid=0,headimgurl=0,nickname=0,mpopenid=0) User.objects.filter(userid=userid).update(openid=None,headimgurl=None,nickname=None,mpopenid=None)
return JsonResponse({"code":1}) return JsonResponse({"code":1})
def unbindmp(req): def unbindmp(req):
userid=req.session['userid'] userid=req.session['userid']
User.objects.filter(userid=userid).update(openid=0,headimgurl=0,nickname=0,mpopenid=0) User.objects.filter(userid=userid).update(openid=None,headimgurl=None,nickname=None,mpopenid=None)
return JsonResponse({"code":1}) return JsonResponse({"code":1})
def vewechat(req): def vewechat(req):
@ -3054,7 +3078,7 @@ def importusers(req):
def apicompany(req): def apicompany(req):
a = req.GET.get('a') a = req.GET.get('a')
menurights = '11,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,19,20,21,22,23,24,28,29,32,36'#菜单编码 menurights = '11,1,2,3,4,5,6,7,8,9,10,12,13,15,16,17,18,19,20,21,22,23,24,28,29,32,36,46,47,48,50'#菜单编码
if a=='add': if a=='add':
admin = req.GET.get('admin') admin = req.GET.get('admin')
company = req.GET.get('company') company = req.GET.get('company')
@ -4212,8 +4236,8 @@ def apioperation(req):
obj.save() obj.save()
splc = [] splc = []
splc.append({'jdmc':'作业负责人审批','sprs':[userid]}) splc.append({'jdmc':'作业负责人审批','sprs':[userid]})
splc.append({'jdmc':'作业部门审批','sprs':getsprs(obj.zybm)}) splc.append({'jdmc':'作业部门审批','sprs':getsprs(userid,obj.zybm)})
splc.append({'jdmc':'属地部门审批','sprs':getsprs(obj.sdbm)}) splc.append({'jdmc':'属地部门审批','sprs':getsprs(userid,obj.sdbm)})
for i in Operationspjd.objects.filter(zylx=obj.zylx,usecomp=Partment.objects.get(partid=getcompany(userid))).order_by('id'): for i in Operationspjd.objects.filter(zylx=obj.zylx,usecomp=Partment.objects.get(partid=getcompany(userid))).order_by('id'):
splc.append({'jdmc':i.jdmc,'sprs':i.sprs}) splc.append({'jdmc':i.jdmc,'sprs':i.sprs})
obj.zyzt['splc']=splc obj.zyzt['splc']=splc
@ -5024,6 +5048,11 @@ def apiexamtestdetail(req):
total = a.count() total = a.count()
startnum,endnum=fenye(req) startnum,endnum=fenye(req)
a = a[startnum:endnum].values('id','examtest__id','examtest__name','examtest__starttime','examtest__endtime','examtest__passscore','examtest__state','examtest__duration') a = a[startnum:endnum].values('id','examtest__id','examtest__name','examtest__starttime','examtest__endtime','examtest__passscore','examtest__state','examtest__duration')
for i in a:
if i['examtest__endtime']>datetime.now():
i['isActive'] = True
else:
i['isActive'] = False
return HttpResponse(transjson(total,a),content_type="application/json") return HttpResponse(transjson(total,a),content_type="application/json")
elif a=='listyk': elif a=='listyk':
a = ExamTestDetail.objects a = ExamTestDetail.objects