diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 9c7ae7bd..00000000 --- a/Pipfile +++ /dev/null @@ -1,11 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple" -verify_ssl = true - -[dev-packages] - -[packages] - -[requires] -python_version = "3.5" diff --git a/groups.zip b/groups.zip new file mode 100644 index 00000000..59b0273d Binary files /dev/null and b/groups.zip differ diff --git a/groups/templates/groups/exam.html b/groups/templates/groups/exam.html index bd809608..c67a62cb 100644 --- a/groups/templates/groups/exam.html +++ b/groups/templates/groups/exam.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block title %}隐患统计{% endblock %} @@ -132,3 +133,145 @@ {% endblock %} +======= +{% extends "./base.html" %} + +{% block title %}在线考试统计{% endblock %} +{% block pagehead %} + + +{% endblock %} +{% block content %} +{% load static %} +
+

在线考试统计

+
+
+
+ 开始日期: + 结束日期: + + +
+ +
+
+ + + + + + + + + + + + {% endblock %} +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 diff --git a/groups/templates/groups/index.html b/groups/templates/groups/index.html index 40df5f8c..8278b0a4 100644 --- a/groups/templates/groups/index.html +++ b/groups/templates/groups/index.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block pagehead %}

@@ -173,4 +174,181 @@ map.setCenter([x/num,y/num]) }) +======= +{% extends "./base.html" %} +{% block pagehead %} +

+ 本月数据 + Month Data +

+ +{% endblock %} +{% block content %} + +
+
+ +
+
+

{{troublenum}}

+ +

事故隐患

+
+
+ +
+ 更多分析 +
+
+ +
+ +
+
+

{{observenum}} + +

+ +

行为观察

+
+
+ +
+ 更多分析 +
+
+ +
+ +
+
+

{{missnum}}

+ +

未遂事件

+
+
+ +
+ 更多分析 +
+
+ +
+ +
+
+

{{trainnum}}

+ +

教育培训

+
+
+ +
+ 更多分析 +
+
+ +
+ +
+
+

{{companynum}}

+ +

下属公司数

+
+
+ +
+ 更多分析 +
+
+
+ +
+
+

{{usernum}}

+ +

下属员工总数

+
+
+ +
+ 更多分析 +
+
+
+ + +
+ +
+

+ {{group.groupname}} +

+
+
+

公司分布

+ +
+ + +
+
+ +
+
+
+ + +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ + + +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 {% endblock %} \ No newline at end of file diff --git a/groups/templates/groups/miss.html b/groups/templates/groups/miss.html index 48e70f6f..06a53758 100644 --- a/groups/templates/groups/miss.html +++ b/groups/templates/groups/miss.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block title %}隐患统计{% endblock %} @@ -133,3 +134,146 @@ {% endblock %} +======= +{% extends "./base.html" %} + +{% block title %}未遂事件统计{% endblock %} +{% block pagehead %} + + +{% endblock %} +{% block content %} +{% load static %} +
+

未遂事件统计

+
+
+
+ 开始日期: + 结束日期: + + +
+ +
+
+ + + + + + + + + + + + + {% endblock %} +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 diff --git a/groups/templates/groups/observe.html b/groups/templates/groups/observe.html index 957964fa..bb9b8078 100644 --- a/groups/templates/groups/observe.html +++ b/groups/templates/groups/observe.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block title %}隐患统计{% endblock %} @@ -130,3 +131,143 @@ {% endblock %} +======= +{% extends "./base.html" %} + +{% block title %}行为统计{% endblock %} +{% block pagehead %} + + +{% endblock %} +{% block content %} +{% load static %} +
+

行为统计

+
+
+
+ 开始日期: + 结束日期: + + +
+ +
+
+ + + + + + + + + + + + {% endblock %} +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 diff --git a/groups/templates/groups/risk.html b/groups/templates/groups/risk.html index 45b005a5..c20b48d7 100644 --- a/groups/templates/groups/risk.html +++ b/groups/templates/groups/risk.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block title %}风险管控{% endblock %} @@ -132,3 +133,180 @@ {% endblock %} +======= +{% extends "./base.html" %} + +{% block title %}风险管控{% endblock %} +{% block pagehead %} + + +{% endblock %} +{% block content %} +{% load static %} +
+

风险统计

+
+
+
+ 开始日期: + 结束日期: + + +
+ +
+
+ + + + + + + + + + + + {% endblock %} +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 diff --git a/groups/templates/groups/train.html b/groups/templates/groups/train.html index 83c484c9..27ba7ef6 100644 --- a/groups/templates/groups/train.html +++ b/groups/templates/groups/train.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block title %}教育培训统计{% endblock %} @@ -134,3 +135,147 @@ {% endblock %} +======= +{% extends "./base.html" %} + +{% block title %}教育培训统计{% endblock %} +{% block pagehead %} + + +{% endblock %} +{% block content %} +{% load static %} +
+

教育培训统计

+
+
+
+ 开始日期: + 结束日期: + + + + + +
+
+
+ + + + + + + + + + + {% endblock %} +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 diff --git a/groups/templates/groups/troublepic.html b/groups/templates/groups/troublepic.html index 2be9ec4b..c481a4d6 100644 --- a/groups/templates/groups/troublepic.html +++ b/groups/templates/groups/troublepic.html @@ -1,3 +1,4 @@ +<<<<<<< HEAD {% extends "./base.html" %} {% block title %}隐患统计{% endblock %} @@ -127,3 +128,140 @@ {% endblock %} +======= +{% extends "./base.html" %} + +{% block title %}隐患统计{% endblock %} +{% block pagehead %} + + +{% endblock %} +{% block content %} +{% load static %} +
+

隐患统计

+
+
+
+ 开始日期: + 结束日期: + + +
+ +
+
+ + + + + + + + + + + + {% endblock %} +>>>>>>> 3bc970596107f51c6970b99f250cfccf1d7d4345 diff --git a/groups/views.py b/groups/views.py index 8cf049da..13879bbb 100644 --- a/groups/views.py +++ b/groups/views.py @@ -1,4 +1,4 @@ -from django.http import HttpResponse,JsonResponse +from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.shortcuts import redirect from .models import Group, GroupUser @@ -8,21 +8,24 @@ from safesite.tasks import gettime import requests import json import time -from datetime import datetime,date,timedelta +from datetime import datetime, date, timedelta from django.core.serializers.json import DjangoJSONEncoder -from django.db.models import Q,F,Count,Sum +from django.db.models import Q, F, Count, Sum from django.forms.models import model_to_dict from django.http import Http404 + def check_login(func): # 自定义登录验证装饰器 - def warpper(request,*args,**kwargs): + def warpper(request, *args, **kwargs): is_login = request.session.get('is_login', False) if is_login: - return func(request,*args,**kwargs) + return func(request, *args, **kwargs) else: return redirect('/groups/login') + return warpper + def login(request): # 不允许重复登录 if request.session.get('is_login', None): @@ -51,47 +54,56 @@ def login(request): groups_form = GroupUserForm() return render(request, 'groups/login.html', locals()) + def logout(request): # if not request.session.get('is_login', None): # return redirect('/groups/login') request.session.flush() return redirect('/groups/login') + import json from captcha.models import CaptchaStore from captcha.helpers import captcha_image_url + + def refresh_captcha(request): hashkey = CaptchaStore.generate_key() image_url = captcha_image_url(hashkey) return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json') + @check_login def company(request): - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() for i in companys: - i.useradmin = s_models.User.objects.get(ubelongpart=i,issuper=1).username + i.useradmin = s_models.User.objects.get(ubelongpart=i, issuper=1).username return render(request, 'groups/company.html', locals()) + def job(request): return render(request, 'groups/job.html', locals()) + def company_user(request, cid): users = s_models.User.objects.filter(usecomp=cid) # for user in users: # dump(user) return render(request, 'groups/company_user.html', locals()) + def company_userdetail(request, uid): try: user = s_models.User.objects.get(pk=uid) except s_models.User.DoesNotExist: raise Http404("User does not exist") - #UserForm.set_usecomp(s_models.Partment.objects.filter(group__id=1)) + # UserForm.set_usecomp(s_models.Partment.objects.filter(group__id=1)) user_form = UserForm(model_to_dict(user)) return render(request, 'groups/company_userdetail.html', locals()) + def groups_userupdate(request): if request.method == 'POST': user_form = UserForm(request.POST) @@ -120,7 +132,7 @@ def groups_userupdate(request): model_user.save() for i in s_models.Group.objects.filter(usecomp=usecomp): - i.users.remove(model_user) + i.users.remove(model_user) groupobj = s_models.Group.objects.filter(usecomp=usecomp, grouptype=3).first() groupobj.users.add(model_user) else: @@ -129,6 +141,7 @@ def groups_userupdate(request): else: return redirect('/groups/company/') + def company_userchange_page(request, uid): try: user = s_models.User.objects.get(pk=uid) @@ -138,39 +151,45 @@ def company_userchange_page(request, uid): return render(request, 'groups/company_userchange.html', locals()) + def dump(obj): print('\n'.join(['%s:%s' % item for item in obj.__dict__.items()])) @check_login def index(req): - first_day,first_day_of_next_month=gettime() - group = GroupUser.objects.get(id = req.session['user_id']).group + first_day, first_day_of_next_month = gettime() + group = GroupUser.objects.get(id=req.session['user_id']).group companys = group.members.all() - troublenum = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys,fxsj__range=(first_day, first_day_of_next_month)).count() - observenum = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys,looktime__range=(first_day, first_day_of_next_month)).count() - missnum = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys,misstime__range=(first_day, first_day_of_next_month)).count() - trainnum = s_models.Train.objects.filter(deletemark=1,usecomp__in=companys,starttime__range=(first_day, first_day_of_next_month)).count() + troublenum = s_models.Trouble.objects.filter(deletemark=1, usecomp__in=companys, + fxsj__range=(first_day, first_day_of_next_month)).count() + observenum = s_models.Observe.objects.filter(deletemark=1, usecomp__in=companys, + looktime__range=(first_day, first_day_of_next_month)).count() + missnum = s_models.Miss.objects.filter(deletemark=1, usecomp__in=companys, + misstime__range=(first_day, first_day_of_next_month)).count() + trainnum = s_models.Train.objects.filter(deletemark=1, usecomp__in=companys, + starttime__range=(first_day, first_day_of_next_month)).count() companynum = len(companys) - usernum = s_models.User.objects.filter(deletemark=1,usecomp__in=companys).count() + usernum = s_models.User.objects.filter(deletemark=1, usecomp__in=companys).count() return render(req, 'groups/index.html', locals()) def updateposition(req): - allcompanys = s_models.Partment.objects.filter(deletemark=1,iscompany=1) + allcompanys = s_models.Partment.objects.filter(deletemark=1, iscompany=1) for i in allcompanys: address = i.partname data = getPosition(address) - if data['status'] == '1' and int(data['count'])>0: + if data['status'] == '1' and int(data['count']) > 0: i.position = data['geocodes'][0] i.save() else: - address = i.partname.replace('公司','').replace('责任','').replace('有限','') + address = i.partname.replace('公司', '').replace('责任', '').replace('有限', '') data = getPosition(address) - if data['status'] == '1' and int(data['count'])>0: + if data['status'] == '1' and int(data['count']) > 0: i.position = data['geocodes'][0] i.save() - return JsonResponse({"code":1}) + return JsonResponse({"code": 1}) + def getPosition(address): url = 'http://restapi.amap.com/v3/geocode/geo' @@ -179,101 +198,138 @@ def getPosition(address): json_data = json.loads(res.text) return json_data + def apipositions(req): - companys = GroupUser.objects.get(id = req.session['user_id']).group.members.all() - positions = companys.values('position','partname') - return JsonResponse({"code":1,"data":list(positions)}) -def trouble(request):#隐患排查 + companys = GroupUser.objects.get(id=req.session['user_id']).group.members.all() + positions = companys.values('position', 'partname') + return JsonResponse({"code": 1, "data": list(positions)}) + + +def trouble(request): # 隐患排查 return render(request, 'groups/troublepic.html', locals()) -def observe(request):#行为观察 + + +def observe(request): # 行为观察 return render(request, 'groups/observe.html', locals()) -def miss(request):#未遂事件 + + +def miss(request): # 未遂事件 return render(request, 'groups/miss.html', locals()) -def risk(request):#风险管控 + + +def risk(request): # 风险管控 return render(request, 'groups/risk.html', locals()) -def train(request):#教育培训 + + +def train(request): # 教育培训 return render(request, 'groups/train.html', locals()) -def exam(request):#在线考试 + + +def exam(request): # 在线考试 return render(request, 'groups/exam.html', locals()) -def troubleChart(request):#隐患统计图 + + +def troubleChart(request): # 隐患统计图 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') - if code=='tbpic': - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() - troublelist = s_models.Trouble.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('troubleid')) - if start: - troublelist = troublelist.filter(fxsj__gte=start) - if end: - troublelist = troublelist.filter(fxsj__lte=end) - return HttpResponse(json.dumps({'code':1,'data':{'troublelist':list(troublelist)}}), content_type='application/json') -def observeChart(request):#行为观察 + if code == 'tbpic': + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() + troublelist = s_models.Trouble.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid', + 'usecomp__partname').annotate( + number=Count('troubleid')) + if start: + troublelist = troublelist.filter(fxsj__gte=start) + if end: + troublelist = troublelist.filter(fxsj__lte=end) + return HttpResponse(json.dumps({'code': 1, 'data': {'troublelist': list(troublelist)}}), + content_type='application/json') + + +def observeChart(request): # 行为观察 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') - if code=='obv': - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() - observelist = s_models.Observe.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('lookid')) - if start: - observelist = observelist.filter(looktime__gte=start) - if end: - observelist = observelist.filter(looktime__lte=end) - return HttpResponse(json.dumps({'code':1,'data':{'observelist':list(observelist)}}), content_type='application/json') - -def missChart(request):#未遂事件 + if code == 'obv': + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() + observelist = s_models.Observe.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid', + 'usecomp__partname').annotate( + number=Count('lookid')) + if start: + observelist = observelist.filter(looktime__gte=start) + if end: + observelist = observelist.filter(looktime__lte=end) + return HttpResponse(json.dumps({'code': 1, 'data': {'observelist': list(observelist)}}), + content_type='application/json') + + +def missChart(request): # 未遂事件 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') - if code=='miss': - - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() - misslist = s_models.Miss.objects.filter(deletemark=1,usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('missid')) - if start: - misslist = misslist.filter(misstime__gte=start) - if end: - misslist = misslist.filter(misstime__lte=end) - return HttpResponse(json.dumps({'code':1,'data':{'misslist':list(misslist)}}), content_type='application/json') - -def riskChart(request):#风险管控 + if code == 'miss': + + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() + misslist = s_models.Miss.objects.filter(deletemark=1, usecomp__in=companys).values('usecomp__partid', + 'usecomp__partname').annotate( + number=Count('missid')) + if start: + misslist = misslist.filter(misstime__gte=start) + if end: + misslist = misslist.filter(misstime__lte=end) + return HttpResponse(json.dumps({'code': 1, 'data': {'misslist': list(misslist)}}), + content_type='application/json') + + +def riskChart(request): # 风险管控 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') - if code=='risk': - - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() - risklist = s_models.Risk.objects.filter(usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('id')) - if start: - risklist = risklist.filter(createtime__gte=start) - if end: - risklist = risklist.filter(createtime__lte=end) - return HttpResponse(json.dumps({'code':1,'data':{'risklist':list(risklist)}}), content_type='application/json') -def trainChart(request):#教育培训 + if code == 'risk': + + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() + risklist = s_models.Risk.objects.filter(usecomp__in=companys).values('usecomp__partid', + 'usecomp__partname').annotate( + number=Count('id')) + if start: + risklist = risklist.filter(createtime__gte=start) + if end: + risklist = risklist.filter(createtime__lte=end) + return HttpResponse(json.dumps({'code': 1, 'data': {'risklist': list(risklist)}}), + content_type='application/json') + + +def trainChart(request): # 教育培训 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') - if code=='train': - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() - trainlist = s_models.Train.objects.filter(usecomp__in=companys).values('usecomp__partid','usecomp__partname').annotate(number = Count('trainid')) - if start: - trainlist = trainlist.filter(starttime__gte=start) - if end: - trainlist = trainlist.filter(starttime__lte=end) - return HttpResponse(json.dumps({'code':1,'data':{'trainlist':list(trainlist)}}), content_type='application/json') - -def examChart(request):#在线考试 + if code == 'train': + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() + trainlist = s_models.Train.objects.filter(usecomp__in=companys).values('usecomp__partid', + 'usecomp__partname').annotate( + number=Count('trainid')) + if start: + trainlist = trainlist.filter(starttime__gte=start) + if end: + trainlist = trainlist.filter(starttime__lte=end) + return HttpResponse(json.dumps({'code': 1, 'data': {'trainlist': list(trainlist)}}), + content_type='application/json') + + +def examChart(request): # 在线考试 code = request.GET.get('code') start = request.GET.get('start') end = request.GET.get('end') examjson = [] - if code=='exam': - companys = GroupUser.objects.get(id = request.session['user_id']).group.members.all() - - for i in companys: - examlist = s_models.ExamTest.objects.filter(usecomps__contains=','+i+',').count() - if start: + if code == 'exam': + companys = GroupUser.objects.get(id=request.session['user_id']).group.members.all() + + for i in companys: + examlist = s_models.ExamTest.objects.filter(usecomps__contains=',' + i + ',').count() + if start: examlist = examlist.filter(starttime__gte=start) - if end: + if end: examlist = examlist.filter(starttime__lte=end) - examjson.append({'companyName':i.Partment,'number':Partment}) - return HttpResponse(json.dumps({'code':1,'data':examjson}), content_type='application/json') - + examjson.append({'companyName': i.Partment, 'number': Partment}) + return HttpResponse(json.dumps({'code': 1, 'data': examjson}), content_type='application/json') + diff --git a/mysite/settings.py b/mysite/settings.py index b1fb09f1..01ffba4e 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -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 + }, + } +} \ No newline at end of file diff --git a/safesite/daoru.py b/safesite/daoru.py index 703c23fd..2dace7f4 100644 --- a/safesite/daoru.py +++ b/safesite/daoru.py @@ -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: diff --git a/safesite/static/safesite/mystatic/css/style.css b/safesite/static/safesite/mystatic/css/style.css index e9339c47..f241c8f0 100644 --- a/safesite/static/safesite/mystatic/css/style.css +++ b/safesite/static/safesite/mystatic/css/style.css @@ -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} diff --git a/safesite/static/safesite/mystatic/js/util.js b/safesite/static/safesite/mystatic/js/util.js index 982a2f67..cae3dc06 100644 --- a/safesite/static/safesite/mystatic/js/util.js +++ b/safesite/static/safesite/mystatic/js/util.js @@ -526,7 +526,7 @@ function jsonSort(jsonObj) { } return str.substr(0, str.length - 1) } -//map定时显示,每分钟请求一次 +//map定时显示,每分钟请求一次,如果存在map function update() { if ($('#mapshowinput').length) { source.clear() @@ -571,4 +571,15 @@ function update() { }) } } -var t1 = window.setInterval(update, 1000 * 60) \ No newline at end of file +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) \ No newline at end of file diff --git a/safesite/templates/trainfigure.html b/safesite/templates/trainfigure.html new file mode 100644 index 00000000..ab227e46 --- /dev/null +++ b/safesite/templates/trainfigure.html @@ -0,0 +1,268 @@ + + + + +
+ +
+
+ + + + +
+ +
+
+
+ + + + +
+ +
+
+
+
+ + diff --git a/safesite/urls.py b/safesite/urls.py index 354a213b..311468bf 100644 --- a/safesite/urls.py +++ b/safesite/urls.py @@ -88,6 +88,7 @@ urlpatterns = [ path('html/bhr',views.bhrhtml), path('riskas',views.riskas), path('html/examhistory//',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/',views.rightsgroup), path('api/main',views.mainapi), diff --git a/safesite/views.py b/safesite/views.py index 9b35bc1e..7a8bfabc 100644 --- a/safesite/views.py +++ b/safesite/views.py @@ -27,6 +27,9 @@ import jwt import decimal from . import forms from .models import CompanyInfo +from django.contrib.sessions.models import Session +import logging +logger = logging.getLogger('log') #分页功能 def fenye(req): @@ -63,7 +66,7 @@ def getcompany(x): else: return a.ubelongpart.partlink.split(',')[1] def getparts(partid):#获取该部门及下属部门 - return Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ',')) + return Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ',')) #转换为datagrid所用json def transjson(total, obj): a = {'total':total,'rows':list(obj),'code':1} @@ -181,9 +184,9 @@ def noticedetail(req,id): def noticeedit(req,id): return render(req,'noticeedit.html',{'id':id}) def suggestupdate(req,jyid): - return render(req,'suggestupdate.html',{'jyid':jyid}) + return render(req,'suggestupdate.html',{'jyid':jyid}) def suggestdetail(req,jyid): - return render(req,'suggestdetail.html',{'jyid':jyid}) + return render(req,'suggestdetail.html',{'jyid':jyid}) def suggestadd(req): return render(req,'suggestadd.html') def suggest(req): @@ -239,6 +242,8 @@ def userhtml(req): return render(req,'userhtml.html') def bhrhtml(req): return render(req,'behavior.html') +def trainfigure(req): + return render(req,'trainfigure.html') def check_login(func): def warpper(request,*args,**kwargs): is_login = request.session.get('userid', None) @@ -271,6 +276,11 @@ def check_login(func): # return JsonResponse({"code": 401, "message": "please login!"}) return warpper +def check_session(req): + if req.session.get('userid',None): + return JsonResponse({"code":1}) + else: + return JsonResponse({"code":0}) #存储文件 def upfile(req): username = User.objects.get(userid=req.session['userid']).username @@ -309,6 +319,7 @@ def login(req): user_form = UserForm() return render(req,'login.html', locals()) + def index(req): if not req.session.get('userid', None): return redirect('login') @@ -327,6 +338,7 @@ def logout(req): #del req.session['username'] # if "userid" in req.session: # del req.session['userid'] + logger.info('method: %s user: %s 登出' % (req.method,req.session['userid'])) req.session.flush() #req.session.flush() #req.session.delete("session_key") @@ -553,7 +565,7 @@ def apirights(req): groupid = req.GET.get('groupid') haverights = Group.objects.get(groupid=groupid).menulink.split(',') userid = req.session['userid'] - companyid = getcompany(userid) + companyid = getcompany(userid) allrights = Group.objects.get(usecomp__partid=companyid,grouptype=0).menulink.split(',') menus = Menu.objects.exclude(menuid__in=[11,9]).filter(menuid__in = allrights,deletemark=1).order_by('menuid').values('menuid','menucode','parentid','url','menuname','icon').distinct() for i in menus: @@ -573,7 +585,7 @@ def apirights(req): return JsonResponse({"code":1}) elif a=='have': userid = req.session['userid'] - companyid = getcompany(userid) + companyid = getcompany(userid) allrights = Group.objects.get(usecomp__partid=companyid,grouptype=0).menulink.split(',') return JsonResponse({'code':1,'rights':allrights}) @@ -611,7 +623,7 @@ def addyh(req): a.yhdd = yhdd if 'yhqy' in yhdata: if yhdata['yhqy']: - a.yhqy = Area.objects.get(id= yhdata['yhqy']) + a.yhqy = Area.objects.get(id= yhdata['yhqy']) a.yhms = yhms a.yhtp = yhtp a.yhnum='YH'+time.strftime('%Y%m%d%H%M%S') @@ -1471,7 +1483,7 @@ def grouphandle(req): companyid = getcompany(userid) a = Group.objects.filter(usecomp__partid = companyid).exclude(grouptype=0).values('groupid','groupname') keystr=transstr(a,'groupid','groupname') - return HttpResponse(keystr,content_type="application/json") + return HttpResponse(keystr,content_type="application/json") elif req.method == 'POST': data = json.loads(req.body.decode('utf-8')) userid = req.session['userid'] @@ -1544,7 +1556,7 @@ def troublehandle(req): a = a.filter(fxr__userid=fxr) elif fxbm: parts = Partment.objects.filter(partlink__contains=','+str(fxbm)+',')|Partment.objects.filter(partid=fxbm) - a = a.filter(fxbm__in=parts) + a = a.filter(fxbm__in=parts) if qssj: a = a.filter(fxsj__gte=qssj) if jssj: @@ -1753,7 +1765,7 @@ def charthandle(req): partid = req.GET.get('part') else: partid = companyid - parts = Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ',')) + parts = Partment.objects.filter(Q(partid=partid) | Q(partlink__contains=',' + str(partid) + ',')) first_day,first_day_of_next_month = gettime(datetime(year,month,1)) a = Train.objects.filter(deletemark=1,trainpart__in=parts,state=1) value=[] @@ -2224,11 +2236,10 @@ def parthandle(req): return HttpResponse(json.dumps(b,cls=MyEncoder),content_type="application/json") elif req.GET.get('a')=='del': a = req.POST.get('partid') - if Partment.objects.filter(partlink__contains=','+a+',') or User.objects.filter(ubelongpart=a): + if Partment.objects.filter(partlink__contains=','+a+',').exists() or User.objects.filter(ubelongpart=a).exists(): return JsonResponse({"code":0}) else: - a = Partment.objects.get(partid=a) - a.delete() + Partment.objects.get(partid=a).delete() return JsonResponse({"code":1}) elif req.GET.get('a')=='addpart': if req.POST.get('partid') != '': @@ -2699,7 +2710,7 @@ def gchandle(req): obj.lookpart = User.objects.get(userid=userid).ubelongpart if 'looktime2' in gcdata: if gcdata['looktime2']: - obj.looktime2 = gcdata['looktime2'] + obj.looktime2 = gcdata['looktime2'] if 'lookeder' in gcdata: obj.lookeder = gcdata['lookeder'] if 'otherunsafe' in gcdata: @@ -2736,7 +2747,7 @@ def gchandle(req): i['readtime'] = Observeto.objects.filter(observe__lookid=i['lookid'],user__userid = userid)[0].submittime else: i['read']=0 - return HttpResponse(transjson(total,a),content_type="application/json") + return HttpResponse(transjson(total,a),content_type="application/json") elif a == 'listself': startnum,endnum=fenye(req) a = Observe.objects.filter(looker__userid=userid,deletemark=1).order_by('-looktime') @@ -2825,7 +2836,7 @@ def gchandle(req): data = json.loads(req.body.decode('utf-8')) url = exportdoc2('gc',data) return JsonResponse({"code":1,"downloadurl":url}) - + def observepic(req): userid = req.session['userid'] companyid = getcompany(userid) @@ -2859,7 +2870,7 @@ def observepic(req): rtgcx=[]#人体工程学 hjzj=[]#环境整洁 - for month in months: + for month in months: first_day,first_day_of_next_month = gettime(datetime(year,month,1)) if req.GET.get('part'): partid = req.GET.get('part') @@ -2882,14 +2893,14 @@ def observepic(req): rtgcx.append(Unsafes.objects.filter(observe__in=a,unsafedicclass=i).count()) elif i.dicid==30: hjzj.append(Unsafes.objects.filter(observe__in=a,unsafedicclass=i).count()) - + return JsonResponse({'code':1,'months':months,'userfy':userfy,'userwz':userwz,'grfh':grfh,'gjhsb':gjhsb,'cxhbz':cxhbz,'rtgcx':rtgcx,'hjzj':hjzj,}) elif req.GET.get('a')=='gclxbg': userid = req.session['userid'] companyid = getcompany(userid) a = Observe.objects.filter(usecomp=Partment.objects.get(partid=companyid),deletemark=1) - + if req.GET.get('qssj'):#开始时间 a = a.filter(looktime__gte=req.GET.get('qssj')) if req.GET.get('jssj'):#结束时间 @@ -2898,13 +2909,13 @@ def observepic(req): gcbm = req.GET.get('fxbm') parts = Partment.objects.filter(partlink__contains=',' + gcbm + ',')|Partment.objects.filter(partid=gcbm) a = a.filter(lookpart__in=parts) - + total = a.count() objs = a.values('looker__userid','looker__name','lookpart__partname').annotate(number = Count('looker')).order_by('-number') return HttpResponse(transjson(total,objs),content_type="application/json") - - - + + + def dicchandle(req): a = req.GET.get('a') if a == 'tree': @@ -3119,7 +3130,7 @@ def apicompany(req): Yjsetup.objects.create(monthyhavg=100,safev=50,warnv=75,alertv=100,maxv=200,yhpgqz=4,yhdjqz=4,yhsblqz=1,yhzglqz=4,pxdjqz=3,pxxgqz=4,yldjqz=3,ylxgqz=3,usecomp=y) Map.objects.create(name='默认地图',pic='/static/safesite/mystatic/images/snc.jpg',usecomp=y,default=1) return JsonResponse({'code':1,'companyid':y.partid}) - + def drapi(req): a = req.GET.get('a') if a == 'user': @@ -3195,13 +3206,13 @@ def drapi(req): return JsonResponse({"code":1}) - + def apimiss(req): a = req.GET.get('a') userid = req.session['userid'] companyid = getcompany(userid) - if a == 'add': + if a == 'add': obj = Miss() data = json.loads(req.body.decode('utf-8')) obj.missplace = data['missplace'] @@ -3453,7 +3464,7 @@ def apisocert(req): return JsonResponse({"code":1,"data":getTzzs(cardnum,realname)}) elif a=='updateTzzs': updateTzzs() - + def guoqi(x): now = datetime.now() now1 = datetime.now() + timedelta(days=180) @@ -3462,7 +3473,7 @@ def guoqi(x): elif now1 > datetime.strptime(x,'%Y-%m-%d') > now: return 2 else: - return 3 + return 3 def apisafecert(req): a = req.GET.get('a') if a=='listall': @@ -3630,8 +3641,8 @@ def apipartuser(req): userobjs = User.objects.filter(ubelongpart=req.GET.get('parentid'),deletemark=1).exclude(issuper=1) for i in userobjs: lst.append({'id':i.userid,'name':i.name,'parentId':0,'checked':False,'isPeople':True,'children':[]}) - return JsonResponse({"code":1,"data":lst}) - + return JsonResponse({"code":1,"data":lst}) + def apiuser(req): a = req.GET.get('a') @@ -3804,7 +3815,7 @@ def apisuggest(req): id = req.GET.get('id') res = exportdoc('jy',id) return res - + elif a == 'update': #评估 userid = req.session['userid'] data = json.loads(req.body.decode('utf-8')) @@ -3874,7 +3885,7 @@ def apisuggest(req): obj.save() Suggestflow.objects.create(suggest=obj,user=User.objects.get(userid=userid),action='驳回处理结果') return JsonResponse({"code":1}) - + @@ -4029,7 +4040,7 @@ def apitool(req): m.append(x) return JsonResponse({'wxgs':m}) - + def apinotice(req): a = req.GET.get('a') @@ -4166,7 +4177,7 @@ def apinotice(req): data['reads'] = list(reads) data['readpeople']= readobj.exclude(read=0).count() data['readsnum'] = readobj.aggregate(num=Sum('read')).get('num') or 0 - + try: toobj = Noticeto.objects.get(noticeid__id=id,receiver__userid = userid) toobj.read = int(toobj.read) + 1 @@ -4258,7 +4269,7 @@ def apioperation(req): m = Operzyry(oper=obj,operzyry=x) m.save() b.append(x.openid) - + postdict={ 'touser':'', 'template_id':'lOuwSE67vZC3ZVFYPZvz2eb7JdFxqx7ysMFkXrYmYh0', @@ -4484,7 +4495,7 @@ def apioperation(req): } } send_wechatmsg.delay(postdict) - + Operspxq.objects.create(oper=Operation.objects.get(zyid=zyid),jdmc=oldjdmc,spr=spruser,checked=1,spbm=spruser.ubelongpart) except : obj.zyzt['zyzt'] = '待关闭' @@ -4733,7 +4744,8 @@ def apiquestion(req): elif a == 'exercise': data = json.loads(req.body.decode('utf-8')) x = Question.objects.filter(deletemark=1) - a = (x.filter(usecomps__contains=',1,')|x.filter(usecomps__contains=','+companyid+',')).exclude(nousecomps__contains=','+companyid+',') + #a = (x.filter(usecomps__contains=',1,')|x.filter(usecomps__contains=','+companyid+',')).exclude(nousecomps__contains=','+companyid+',') + a = x.exclude(nousecomps__contains=','+companyid+',') tmlxs = data['tmlx'] ydtms = data['ydtms'] a = x.filter(questioncat__id__in=tmlxs).exclude(id__in=ydtms) @@ -4852,7 +4864,7 @@ def apiexampaper(req): elif int(i['type']) == 3: ExamPaperDetail.objects.create(exampaper=obj,question=Question.objects.get(id=i['id']),score=int(pds)) return JsonResponse({"code":1}) - + def apiexamtest(req): a = req.GET.get('a') @@ -5112,7 +5124,7 @@ def apiexamtestdetail(req): obj.testnum = obj.testnum + 1 obj.starttime = starttime obj.endtime = endtime - obj.took = took + obj.took = took obj.testdetail = testdetail obj.rights = rights obj.score = score @@ -5226,7 +5238,7 @@ def apimap(req): id = req.POST.get('id') Map.objects.filter(id=id).update(pic=req.POST.get('pic')) return JsonResponse({"code":1}) - + def apiarea(req): a = req.GET.get('a') userid = req.session['userid'] @@ -5269,7 +5281,7 @@ def apiarea(req): name = data['name'] order = data['order'] Area.objects.filter(id=data['id']).update(name = name,order=order) - return JsonResponse({"code":1}) + return JsonResponse({"code":1}) def apimapshow(req): a = req.GET.get('a') @@ -5459,7 +5471,7 @@ def apiinspect(req): id = req.GET.get('id') a = Inspect.objects.filter(id=id).values('id','state','content','creattime','equipment__num','equipment__id','equipment__name','equipment__area__name','user__name','user__ubelongpart__partname','trouble__yhzt','trouble__yhnum','trouble__yhms','trouble__troubleid') return JsonResponse(a[0]) - + def apiriskact(req): a = req.GET.get('a') userid = req.session['userid'] @@ -5568,7 +5580,7 @@ def apiriskact(req): RiskActTask.objects.create(riskact=obj,taskadd=tasktime,taskexpire = tasktime + timedelta(days=1),istask=1) elif tasktype == 3: RiskActTask.objects.create(riskact=obj,taskadd=tasktime,taskexpire = tasktime + timedelta(days=7),istask=1) - return JsonResponse({"code":1}) + return JsonResponse({"code":1}) def apirisk(req): a = req.GET.get('a') @@ -5949,7 +5961,7 @@ def apiriskcheck(req): startnum,endnum=fenye(req) objs = objs.order_by('-id')[startnum:endnum].values('id','risk__step','risk__level','risk__riskact__name','risk__riskact__area__name','risk__riskact__place','dotime','trouble__yhnum','user__ubelongpart__partname','user__name') return HttpResponse(transjson(total,objs),content_type="application/json") - + def apireport(req): a = req.GET.get('a') userid = req.session['userid'] @@ -5988,7 +6000,7 @@ def apireport(req): obj.cause = data['cause'] obj.suggest = data['suggest'] obj.save() - return JsonResponse({'code':1}) + return JsonResponse({'code':1}) #公司信息展示 @@ -6039,4 +6051,41 @@ def refresh_captcha(request): return HttpResponse(json.dumps({'key': hashkey, 'image_url': image_url}), content_type='application/json') def dump(obj): - print('\n'.join(['%s:%s' % item for item in obj.__dict__.items()])) \ No newline at end of file + 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}) + +