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 %}
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<title>集团管理分析后台</title>
<!-- 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">
@ -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
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' %}">
<!-- 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 -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
@ -110,9 +116,6 @@ desired effect
</ul>
</li>
<!-- Control Sidebar Toggle Button -->
<li>
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
</li>
</ul>
</div>
</nav>
@ -136,7 +139,7 @@ desired effect
</div>
<!-- search form (Optional) -->
<form action="#" method="get" class="sidebar-form">
<!-- <form action="#" method="get" class="sidebar-form">
<div class="input-group">
<input type="text" name="q" class="form-control" placeholder="搜索...">
<span class="input-group-btn">
@ -144,7 +147,7 @@ desired effect
</button>
</span>
</div>
</form>
</form> -->
<!-- /.search form -->
<!-- Sidebar Menu -->
@ -307,12 +310,7 @@ desired effect
<!-- 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.
Both of these plugins are recommended to enhance the

View File

@ -1,497 +1,176 @@
{% 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-md-3 col-sm-6 col-xs-12">
<div class="info-box">
<span class="info-box-icon bg-aqua"><i class="ion ion-ios-gear-outline"></i></span>
<!-- 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>
<div class="info-box-content">
<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 -->
<p>事故隐患</p>
</div>
<!-- /.row -->
<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 class="icon">
<i class="fa fa-camera"></i>
</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 -->
<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 -->
<p>行为观察</p>
</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 %}

View File

@ -16,6 +16,8 @@ urlpatterns = [
path('tain/', views.job, name='groups_train'),#教育培训统计图
path('test/', views.job, name='groups_test'),#在线考试统计图
path('refresh_captcha/', views.refresh_captcha),
path('updateposition/',views.updateposition),
path('api/positions',views.apipositions),
path('api/troubleChart',views.troubleChart),
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 redirect
from .models import Group,GroupUser
from .forms import GroupUserForm
from safesite import models as s_models
from safesite.tasks import gettime
import requests
import json
import time
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.db.models import F,Count,Sum
def index(request):
if not request.session.get('is_login', None):
return redirect('/groups/login/')
return render(request, 'groups/index.html')
from django.db.models import Q,F,Count,Sum
def check_login(func): # 自定义登录验证装饰器
def warpper(request,*args,**kwargs):
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):
# 不允许重复登录
@ -44,8 +50,8 @@ def login(request):
return render(request, 'groups/login.html', locals())
def logout(request):
if not request.session.get('is_login', None):
return redirect('/groups/login')
# if not request.session.get('is_login', None):
# return redirect('/groups/login')
request.session.flush()
return redirect('/groups/login')
@ -57,7 +63,7 @@ def refresh_captcha(request):
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()
for i in companys:
@ -66,6 +72,48 @@ def company(request):
def job(request):
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):#隐患排查
return render(request, 'groups/troublepic.html', locals())
def observe(request):#行为观察
@ -95,6 +143,6 @@ def observeChart(request):#行为观察
hjzj=[]#环境整洁
first_day,first_day_of_next_month = gettime(datetime(year,month,1))
companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all()
return HttpResponse(json.dumps({'code':companys}), content_type='application/json')
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')

View File

@ -268,10 +268,14 @@ def drusers(companyid,path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
partdict = {}
groupdict = {}
userdict = {}
parts = Partment.objects.filter(partlink__contains=',' + companyid + ',')|Partment.objects.filter(partid=companyid) #获取所有部门
for i in parts:
partdict[i.partname] = i.partid
# groups = Group.objects.filter(usecomp__partid=companyid)
# for i in groups:
# groupdict[i.groupname] = i.groupid
i = 4
while sheet['C'+str(i)].value !=None:
empid = sheet['A'+str(i)].value
@ -283,7 +287,7 @@ def drusers(companyid,path):
username = sheet['C'+str(i)].value
if isinstance(username,str):
username = username.replace(' ', '')
partname = sheet['D'+str(i)].value
partname = sheet['D'+str(i)].value #部门
if partname != None:
partname = partname.replace(' ', '')
if partname not in partdict:
@ -293,6 +297,14 @@ def drusers(companyid,path):
a.partlink = Partment.objects.get(partid=companyid).partlink + str(companyid) + ','
a.save()
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:
a = User()
a.name = name
@ -303,6 +315,8 @@ def drusers(companyid,path):
a.usecomp = Partment.objects.get(partid=companyid)
a.save()
Group.objects.get(usecomp__partid=companyid,grouptype=3).users.add(a) #赋权
# if groupname:
# Group.objects.get(groupid=groupdict[groupname]).users.add(a)
else:
userdict[username]=i
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=',')#安全员
bmzg = models.CharField(max_length=1000,default=',')#主管
bsq = models.CharField(max_length=1000,default=',')#授权者
position = JSONField('坐标',null=True,blank=True)
def __str__(self):
return self.partname
@ -281,9 +282,15 @@ class Group(models.Model):#用户组,岗位
groupname = models.CharField(max_length=30,blank=True,null=True)
grouptype = models.IntegerField(default=4)
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)
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):#菜单
menuid = models.AutoField(primary_key=True)
menuname = models.CharField(max_length=30,blank=True,null=True)

View File

@ -36,6 +36,20 @@
$('#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>
</div>
<script>
@ -62,6 +76,7 @@
}
function submitFormu() {
var form = new FormData(document.getElementById("puffuser"));
console.log(form)
$.ajax({
type: "POST",
url: 'userhandle?a=add',

View File

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

View File

@ -485,29 +485,38 @@ def getspr(ubp):
return User.objects.get(ubelongpart=currentpart,issuper=1)
return a
def getsprs(ubp):
def getsprs(userid,ubp):
currentpart=ubp
a=getsprs_ubp(currentpart)
a=getsprs_ubp(userid,currentpart)
while a==False:
currentpart=currentpart.parentid #已找不到上级部门
if currentpart:
a=getsprs_ubp(currentpart)
a=getsprs_ubp(userid,currentpart)
else:
return User.objects.get(ubelongpart=currentpart,issuper=1)
return a
def getsprs_ubp(ubp):
def getsprs_ubp(userid,ubp):
a=ubp
if a.aqy !=',':
aqystr = a.aqy
aqylist = aqystr.split(',')
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 !=',':
zgstr = a.bmzg
zglist = zgstr.split(',')
zglist = list(map(int, list(filter(None, zglist))))
return zglist
if userid in zglist:
return [userid]
else:
return zglist
else:
return False
@ -1442,6 +1451,12 @@ def grouphandle(req):
a=Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname','grouptype')
total=a.count()
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':
userid = req.session['userid']
companyid = getcompany(userid)
@ -2116,6 +2131,8 @@ def userhandle(req):
name = req.POST.get('name')
empid = req.POST.get('empid')
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)
return JsonResponse({"code":1})
else:
@ -2133,6 +2150,13 @@ def userhandle(req):
companyid = getcompany(a.userid)
a.usecomp = Partment.objects.get(partid=companyid)
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)
return JsonResponse({"code":1})
else:
@ -2963,12 +2987,12 @@ def bwlogin(req):
def unbindwechat(req):
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})
def unbindmp(req):
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})
def vewechat(req):
@ -3054,7 +3078,7 @@ def importusers(req):
def apicompany(req):
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':
admin = req.GET.get('admin')
company = req.GET.get('company')
@ -4212,8 +4236,8 @@ def apioperation(req):
obj.save()
splc = []
splc.append({'jdmc':'作业负责人审批','sprs':[userid]})
splc.append({'jdmc':'作业部门审批','sprs':getsprs(obj.zybm)})
splc.append({'jdmc':'属地部门审批','sprs':getsprs(obj.sdbm)})
splc.append({'jdmc':'作业部门审批','sprs':getsprs(userid,obj.zybm)})
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'):
splc.append({'jdmc':i.jdmc,'sprs':i.sprs})
obj.zyzt['splc']=splc
@ -5024,6 +5048,11 @@ def apiexamtestdetail(req):
total = a.count()
startnum,endnum=fenye(req)
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")
elif a=='listyk':
a = ExamTestDetail.objects