diff --git a/需求/安全培训系统建议.docx b/doc/安全培训系统建议.docx similarity index 100% rename from 需求/安全培训系统建议.docx rename to doc/安全培训系统建议.docx diff --git a/doc/安全清单使用文档.docx b/doc/安全清单使用文档.docx new file mode 100644 index 00000000..6236f31a Binary files /dev/null and b/doc/安全清单使用文档.docx differ diff --git a/需求/惠东需求.xlsx b/doc/惠东需求.xlsx similarity index 100% rename from 需求/惠东需求.xlsx rename to doc/惠东需求.xlsx diff --git a/需求/违章举报.docx b/doc/违章举报使用文档.docx similarity index 100% rename from 需求/违章举报.docx rename to doc/违章举报使用文档.docx diff --git a/doc/隐患跟踪模块使用文档.docx b/doc/隐患跟踪模块使用文档.docx new file mode 100644 index 00000000..687e546e Binary files /dev/null and b/doc/隐患跟踪模块使用文档.docx differ diff --git a/doc/风险管控模块使用文档.docx b/doc/风险管控模块使用文档.docx new file mode 100644 index 00000000..a672d5f7 Binary files /dev/null and b/doc/风险管控模块使用文档.docx differ diff --git a/safesite/daoru.py b/safesite/daoru.py index a352cc9b..22078d6e 100644 --- a/safesite/daoru.py +++ b/safesite/daoru.py @@ -2,7 +2,7 @@ from docxtpl import DocxTemplate, InlineImage from docx.shared import Mm, Inches, Pt from openpyxl import Workbook, load_workbook from openpyxl.drawing.image import Image -from .models import User,Trouble,Dickey,Partment,Dicclass,Train,Drill,TroubleAccess,Group,Yjyc,Equipment,Area,RiskAct,Risk,Question,Questioncat +from .models import SafeItem, SafeList, User,Trouble,Dickey,Partment,Dicclass,Train,Drill,TroubleAccess,Group,Yjyc,Equipment,Area,RiskAct,Risk,Question,Questioncat from datetime import datetime,date import base64 from django.conf import settings @@ -56,6 +56,15 @@ def makeqr_area(data): img.save(filepath) return filepath +def makeqr_safelist(data): + upload_folder = 'media/qr_safelist' + if not os.path.exists(upload_folder): + os.mkdir(upload_folder) + img = qrcode.make(data=data) + filepath = os.path.join(upload_folder, data.split('=')[1]+'.png').replace('\\','/') + img.save(filepath) + return filepath + def drquestions(companyid,path,userid): wb = load_workbook(path) sheet = wb.worksheets[0] @@ -743,4 +752,49 @@ def is_float(str): return False else: #print('%s 不是小数'%str) - return False \ No newline at end of file + return False + +def drsafelist(companyid,path): + wb = load_workbook(path) + sheet = wb.worksheets[0] + # 验证文件内容 + if sheet['a5'].value != '项目类型': + return {'code':0,'msg':'项目类型列错误!'} + if sheet['b5'].value != '项目内容': + return {'code':0,'msg':'项目内容列错误!'} + safelist_name = sheet['b3'].value + user_name = sheet['b4'].value + if not safelist_name: + return {'code':0,'msg':'清单名称不能为空!'} + try: + user = User.objects.get(usecomp__partid=companyid, name=user_name) + except: + return {'code':0,'msg':'责任人不存在或重名!'} + try: + safelist = SafeList() + safelist.user = user + safelist.usecomp = user.usecomp + safelist.name = safelist_name + safelist.save() + safelist.qrcode = makeqr_safelist('https://safeyun.ctcshe.com/miniprogram/safelist?id='+str(safelist.id)) + safelist.save() + except: + return {'code':0,'msg':'创建清单失败!'} + i=6 + while sheet['a'+str(i)].value!=None: + type = sheet['a'+str(i)].value + name = sheet['b'+str(i)].value + if type == '职责': + type = 1 + elif type == '目标': + type = 2 + else: + return {'code':0,'msg': '第'+str(i)+ '行项目类型错误!'} + if name: + safeitem = SafeItem() + safeitem.name = name + safeitem.type = type + safeitem.safelist = safelist + safeitem.save() + i = i+1 + return {'code':1,'msg': '导入成功'} \ No newline at end of file diff --git a/safesite/migrations/0380_safefeedback_safeitem_safelist.py b/safesite/migrations/0380_safefeedback_safeitem_safelist.py new file mode 100644 index 00000000..3f6b4545 --- /dev/null +++ b/safesite/migrations/0380_safefeedback_safeitem_safelist.py @@ -0,0 +1,49 @@ +# Generated by Django 2.2.8 on 2021-05-23 08:41 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0379_auto_20210509_1916'), + ] + + operations = [ + migrations.CreateModel( + name='SafeList', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, verbose_name='清单名称')), + ('createtime', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), + ('updatetime', models.DateTimeField(auto_now=True)), + ('usecomp', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Partment', verbose_name='所属公司')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='safesite.User', verbose_name='责任人')), + ], + ), + migrations.CreateModel( + name='SafeItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(verbose_name='清单项目名称')), + ('type', models.IntegerField(default=1)), + ('createtime', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), + ('updatetime', models.DateTimeField(auto_now=True)), + ('worklist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.SafeList', verbose_name='所属清单')), + ], + ), + migrations.CreateModel( + name='SafeFeedBack', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('isdone', models.IntegerField(default=1)), + ('content', models.TextField(verbose_name='反馈内容')), + ('createtime', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), + ('updatetime', models.DateTimeField(auto_now=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User', verbose_name='反馈人')), + ('workitem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='safesite.SafeItem')), + ], + ), + ] diff --git a/safesite/migrations/0381_auto_20210523_1033.py b/safesite/migrations/0381_auto_20210523_1033.py new file mode 100644 index 00000000..7bbc41ca --- /dev/null +++ b/safesite/migrations/0381_auto_20210523_1033.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.8 on 2021-05-23 10:33 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0380_safefeedback_safeitem_safelist'), + ] + + operations = [ + migrations.RenameField( + model_name='safeitem', + old_name='worklist', + new_name='safelist', + ), + ] diff --git a/safesite/migrations/0382_auto_20210523_1110.py b/safesite/migrations/0382_auto_20210523_1110.py new file mode 100644 index 00000000..944ab512 --- /dev/null +++ b/safesite/migrations/0382_auto_20210523_1110.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.8 on 2021-05-23 11:10 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0381_auto_20210523_1033'), + ] + + operations = [ + migrations.RenameField( + model_name='safefeedback', + old_name='workitem', + new_name='safeitem', + ), + ] diff --git a/safesite/migrations/0383_safelist_qrcode.py b/safesite/migrations/0383_safelist_qrcode.py new file mode 100644 index 00000000..a5c1aaae --- /dev/null +++ b/safesite/migrations/0383_safelist_qrcode.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.8 on 2021-05-23 13:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0382_auto_20210523_1110'), + ] + + operations = [ + migrations.AddField( + model_name='safelist', + name='qrcode', + field=models.CharField(blank=True, max_length=200, null=True), + ), + ] diff --git a/safesite/models.py b/safesite/models.py index 698b156c..e5ca6246 100644 --- a/safesite/models.py +++ b/safesite/models.py @@ -1383,4 +1383,38 @@ class Checkjob(models.Model): pmpeople=models.ManyToManyField(User,related_name='bcfr')#被处罚人员 content=models.TextField(null=True)#处罚内容 yhtp = models.TextField(null=True, blank=True) - zghtp = models.TextField(null=True, blank=True) \ No newline at end of file + zghtp = models.TextField(null=True, blank=True) + + +class SafeList(models.Model): + """ + 安全清单 + """ + user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name="责任人") + usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name="所属公司") + name = models.CharField('清单名称', max_length=200) + qrcode = models.CharField(max_length=200, blank=True, null=True) # 清单二维码 + createtime = models.DateTimeField(default=timezone.now, verbose_name="创建时间") + updatetime = models.DateTimeField(auto_now=True) + + +class SafeItem(models.Model): + """ + 清单项目 + """ + safelist = models.ForeignKey(SafeList, on_delete=models.CASCADE, verbose_name="所属清单") + name = models.TextField('清单项目名称') + type = models.IntegerField(default=1) # 默认是责任,2是指标 ,需反馈 + createtime = models.DateTimeField(default=timezone.now, verbose_name="创建时间") + updatetime = models.DateTimeField(auto_now=True) + +class SafeFeedBack(models.Model): + """ + 清单反馈记录 + """ + user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="反馈人") + safeitem = models.ForeignKey(SafeItem, on_delete=models.SET_NULL, null=True, blank=True) + isdone = models.IntegerField(default=1) # 默认是完成,0是未完成 + content = models.TextField('反馈内容') + createtime = models.DateTimeField(default=timezone.now, verbose_name="创建时间") + updatetime = models.DateTimeField(auto_now=True) diff --git a/safesite/static/safesite/muban/safelist.xlsx b/safesite/static/safesite/muban/safelist.xlsx new file mode 100644 index 00000000..4e180f91 Binary files /dev/null and b/safesite/static/safesite/muban/safelist.xlsx differ diff --git a/safesite/templates/safefeedback.html b/safesite/templates/safefeedback.html new file mode 100644 index 00000000..59737501 --- /dev/null +++ b/safesite/templates/safefeedback.html @@ -0,0 +1,95 @@ +
+ +
+ +
+
+ + - + 查询 + 重置 +
+ +
+
+ + 删除 +
+
+ \ No newline at end of file diff --git a/safesite/templates/safelist.html b/safesite/templates/safelist.html new file mode 100644 index 00000000..687da0a2 --- /dev/null +++ b/safesite/templates/safelist.html @@ -0,0 +1,361 @@ +
+
+
+
+
+ + 查询 + 导入清单 +
+ +
+
+ 新增 + 编辑 + 删除 +
+
+
+
+
+
+
+ 新增 + 编辑 + 删除 +
+
+
+
+
+
+ +
+

请按模板录入个人清单后导入

+

点击下载模板

+

录入完成后点击下方按钮上传文件

+ +
+
+
+ + +
+ +
+
+ + + 选择 +
+
+
清单二维码
+ +
+
+ 保存 +
+
+
+
+
+ + +
+ +
+
+ +
+
+ 保存 +
+
+
+ \ No newline at end of file diff --git a/safesite/urls.py b/safesite/urls.py index fbc85eca..f54067ca 100644 --- a/safesite/urls.py +++ b/safesite/urls.py @@ -1,4 +1,4 @@ -from safesite.views import apioffence, apitrainplan, inspectitem, trainplanchosehtml, trainplanhtml +from safesite.views import apioffence, apisafefeedback, apitrainplan, inspectitem, trainplanchosehtml, trainplanhtml from django.urls import path,include from . import views, viewsdrf, viewsn from . import datashowview @@ -145,9 +145,13 @@ urlpatterns = [ path('html/personalp/', views.personalphtml), + + # 违章举报 path('html/offence/', views.offence), path('html/offence/detail//', views.offencedetail), + path('html/safelist/', views.safelist), + path('html/safefeedback/', views.safefeedback), path('getuser', views.getuser), path('addyh', views.addyh), path('accessyh',views.accessyh), @@ -223,6 +227,9 @@ urlpatterns = [ path('api/troublefollowtask/', views.apitroublefollowtask), path('api/offence/', views.apioffence), + path('api/safelist/', views.apisafelist), + path('api/safeitem/', views.apisafeitem), + path('api/safefeedback/', views.apisafefeedback), path('api/countsafe/', viewsn.apicountsafe), # 安全数据统计 diff --git a/safesite/views.py b/safesite/views.py index 76813f5d..dcaf2e1a 100644 --- a/safesite/views.py +++ b/safesite/views.py @@ -34,8 +34,8 @@ from groups import models as g_models from . import forms from .daoru import (cal_area_risk_level, cal_riskact_level, drequipments, - drquestions, drrisks, drtodotroubles, drusers, makeqr, - makeqr_area, makeqr_examtest, makeqr_riskact, makeqr_train) + drquestions, drrisks, drtodotroubles, drusers, makeqr, drsafelist, + makeqr_area, makeqr_examtest, makeqr_riskact, makeqr_train, makeqr_safelist) from .export import (exportdoc, exportdoc2, exportsimplexlsx, exportxlsx, exportyjdoc) from .forms import UserForm @@ -160,6 +160,12 @@ def upfile(req): # html页面 +def safelist(req): + return render(req, 'safelist.html') + +def safefeedback(req): + return render(req, 'safefeedback.html') + def offence(req): return render(req, 'offence.html') @@ -8933,4 +8939,148 @@ def apioffence(req): obj = Offence.objects.get(id=data['id']) obj.delete() return JsonResponse({"code":1}) - \ No newline at end of file + + +@apicheck_login +def apisafelist(req): + a = req.GET.get('a') + userid = req.session['userid'] + companyid = getcompany(userid) + if a == 'listall': + # objs = SafeList.objects.filter(usecomp__partid=companyid) + objs = SafeList.objects.all() + if req.GET.get('search', None): + objs = objs.filter(Q(user__name__contains=req.GET.get('search'))|Q(name__contains=req.GET.get('search'))) + total = objs.count() + startnum, endnum = fenye(req) + objs = objs.order_by('-createtime')[startnum:endnum].values('id', 'name', 'user__name', 'createtime', 'updatetime', 'user', 'qrcode') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif a == 'add': + data = json.loads(req.body.decode('utf-8')) + user = User.objects.get(userid=data['user']) + obj= SafeList() + obj.user = user + obj.usecomp = user.usecomp + obj.name = data['name'] + obj.save() + obj.qrcode = makeqr_safelist( + 'https://safeyun.ctcshe.com/miniprogram/safelist?id='+str(obj.id)) + obj.save() + return JsonResponse({"code":1}) + elif a == 'edit': + data = json.loads(req.body.decode('utf-8')) + obj= SafeList.objects.get(id=data['id']) + obj.name = data['name'] + obj.save() + return JsonResponse({"code":1}) + elif a == 'my': + try: + obj = SafeList.objects.filter(user__userid=userid) + res = obj.values('id', 'name', 'user__name', 'createtime', 'updatetime')[0] + items = SafeItem.objects.filter(safelist=obj[0]) + res['items'] = list(items.values('id', 'name', 'type', 'createtime', 'updatetime')) + res['code'] = 1 + except: + return JsonResponse({"code":0, "msg":"清单配置有误"}) + return HttpResponse(json.dumps(res, cls=MyEncoder), content_type="application/json") + elif a == 'detail': + try: + id = req.GET.get('id') + obj = SafeList.objects.filter(id=id) + res = obj.values('id', 'name', 'user__name', 'createtime', 'updatetime')[0] + items = SafeItem.objects.filter(safelist=obj[0]) + res['items'] = list(items.values('id', 'name', 'type', 'createtime', 'updatetime')) + res['code'] = 1 + except: + return JsonResponse({"code":0, "msg":"清单配置有误"}) + return HttpResponse(json.dumps(res, cls=MyEncoder), content_type="application/json") + elif a == 'del': + data = json.loads(req.body.decode('utf-8')) + obj = SafeList.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + elif a == 'dr': + file_name = 'c'+str(companyid)+'_'+req.FILES['upfile'].name + upload_folder = 'media/temp' + if not os.path.exists(upload_folder): + os.mkdir(upload_folder) + filepath = os.path.join(upload_folder, file_name) + filepath = filepath.replace('\\', '/') + with open(filepath, 'wb') as f: + f.write(req.FILES['upfile'].read()) + return JsonResponse(drsafelist(companyid, filepath)) + + + +@apicheck_login +def apisafeitem(req): + a = req.GET.get('a') + userid = req.session['userid'] + companyid = getcompany(userid) + if a == 'listall': + # objs = SafeItem.objects.filter(safelist__usecomp__partid=companyid) + objs = SafeItem.objects.all() + if req.GET.get('safelist', None): + objs = objs.filter(safelist = req.GET.get('safelist')) + total = objs.count() + startnum, endnum = fenye(req) + objs = objs.order_by('type', 'name')[startnum:endnum].values('id', 'name', 'type', 'createtime', 'updatetime', 'safelist') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif a == 'add': + data = json.loads(req.body.decode('utf-8')) + obj= SafeItem() + obj.safelist = SafeList.objects.get(id=data['safelist']) + obj.name = data['name'] + obj.type = data['type'] + obj.save() + obj.safelist.updatetime = datetime.now() + obj.safelist.save() + return JsonResponse({"code":1}) + elif a == 'edit': + data = json.loads(req.body.decode('utf-8')) + obj= SafeItem.objects.get(id=data['id']) + obj.name = data['name'] + obj.type = data['type'] + obj.save() + obj.safelist.updatetime = datetime.now() + obj.safelist.save() + return JsonResponse({"code":1}) + elif a == 'del': + data = json.loads(req.body.decode('utf-8')) + obj = SafeItem.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) + +@apicheck_login +def apisafefeedback(req): + a = req.GET.get('a') + userid = req.session['userid'] + companyid = getcompany(userid) + if a == 'listall': + objs = SafeFeedBack.objects.filter(safeitem__safelist__usecomp=companyid) + if req.GET.get('safeitem', None): + objs = objs.filter(safeitem = req.GET.get('safeitem')) + if req.GET.get('qssj', None): + objs = objs.filter(createtime__gte=req.GET.get('qssj')) + if req.GET.get('jssj', None): + objs = objs.filter(createtime__lte=req.GET.get('jssj')) + if req.GET.get('fkr', None): + objs = objs.filter(user__name__contains=req.GET.get('fkr')) + total = objs.count() + startnum, endnum = fenye(req) + objs = objs.order_by('-createtime')[startnum:endnum].values('id', 'content', 'isdone', 'createtime', 'updatetime', 'safeitem','user', 'user__name', 'safeitem__name') + return HttpResponse(transjson(total, objs), content_type="application/json") + elif a == 'add': + data = json.loads(req.body.decode('utf-8')) + obj= SafeFeedBack() + obj.safeitem = SafeItem.objects.get(id=data['safeitem']) + obj.content = data['content'] + obj.isdone = data['isdone'] + obj.user = User.objects.get(userid=userid) + obj.save() + return JsonResponse({"code":1}) + elif a == 'del': + data = json.loads(req.body.decode('utf-8')) + obj = SafeFeedBack.objects.get(id=data['id']) + obj.delete() + return JsonResponse({"code":1}) \ No newline at end of file