From 646bed55c90432bf63a42cc5d4fdb904f4053131 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sun, 23 May 2021 21:04:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E5=85=A8=E6=B8=85=E5=8D=95=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- safesite/daoru.py | 58 ++- .../0380_safefeedback_safeitem_safelist.py | 49 +++ .../migrations/0381_auto_20210523_1033.py | 18 + .../migrations/0382_auto_20210523_1110.py | 18 + safesite/migrations/0383_safelist_qrcode.py | 18 + safesite/models.py | 15 +- safesite/static/safesite/muban/safelist.xlsx | Bin 0 -> 10655 bytes safesite/templates/safefeedback.html | 95 +++++ safesite/templates/safelist.html | 361 ++++++++++++++++++ safesite/urls.py | 9 +- safesite/views.py | 148 ++++++- 11 files changed, 762 insertions(+), 27 deletions(-) create mode 100644 safesite/migrations/0380_safefeedback_safeitem_safelist.py create mode 100644 safesite/migrations/0381_auto_20210523_1033.py create mode 100644 safesite/migrations/0382_auto_20210523_1110.py create mode 100644 safesite/migrations/0383_safelist_qrcode.py create mode 100644 safesite/static/safesite/muban/safelist.xlsx create mode 100644 safesite/templates/safefeedback.html create mode 100644 safesite/templates/safelist.html 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 88672c00..e5ca6246 100644 --- a/safesite/models.py +++ b/safesite/models.py @@ -1386,33 +1386,34 @@ class Checkjob(models.Model): zghtp = models.TextField(null=True, blank=True) -class WorkList(models.Model): +class SafeList(models.Model): """ 安全清单 """ - user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="责任人") + user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name="责任人") usecomp = models.ForeignKey(Partment, on_delete=models.CASCADE, verbose_name="所属公司") - name = models.CharField('清单名称') + 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 WorkItem(models.Model): +class SafeItem(models.Model): """ 清单项目 """ - worklist = models.ForeignKey(WorkList, on_delete=models.CASCADE, verbose_name="所属清单") + 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 WorkFeedBack(models.Model): +class SafeFeedBack(models.Model): """ 清单反馈记录 """ user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="反馈人") - workitem = models.ForeignKey(WorkItem, on_delete=models.SET_NULL, null=True, blank=True) + 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="创建时间") diff --git a/safesite/static/safesite/muban/safelist.xlsx b/safesite/static/safesite/muban/safelist.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4e180f91907c79e966fd862b4c6dbcdcd87d75ca GIT binary patch literal 10655 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 W%S(a(01lMrVs&Q~Na-v1At31J%m literal 0 HcmV?d00001 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 00c3b80c..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') @@ -8936,37 +8942,145 @@ def apioffence(req): @apicheck_login -def apiworklist(req): +def apisafelist(req): a = req.GET.get('a') userid = req.session['userid'] companyid = getcompany(userid) if a == 'listall': - objs = WorkList.objects.filter(usecomp__partid=companyid) + # 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') + 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=userid) - data['user'] = user - data['usecomp'] = user.usecomp - instance = WorkList(**data) - instance.save() + 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': - id = req.GET.get('id') - obj = Offence.objects.filter(id=id) - res = obj.values('id', 'type', 'dept', 'area', 'parter', 'reporter', 'reporter__name', 'createtime', 'area__name', 'happentime', 'description', 'imgs', 'post', 'place')[0] - if res['imgs']: - res['imgs'] = res['imgs'].split('?') + 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 = Offence.objects.get(id=data['id']) + 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}) - \ No newline at end of file +@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