safesite/safesite/daoru.py

544 lines
21 KiB
Python

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 datetime import datetime,date
import base64
from django.conf import settings
import qrcode
import os
from django.contrib.auth.hashers import make_password
def makeqr(data):
upload_folder = 'media/qr_equipment'
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 makeqr_train(data):
upload_folder = 'media/qr_train'
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 makeqr_riskact(data):
upload_folder = 'media/qr_riskact'
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 makeqr_examtest(data):
upload_folder = 'media/qr_examtest'
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 makeqr_area(data):
upload_folder = 'media/qr_area'
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]
i = 4
user = User.objects.get(userid=userid)
qlist = ['A','B','C','D','E','F']
leveldict = {'':1,'':2,'':3}
notinlist = []
while sheet['c'+str(i)].value!=None:
type = sheet['a'+str(i)].value.replace(' ', '')
cate = sheet['b'+str(i)].value.replace(' ', '')
title = sheet['c'+str(i)].value
answer = {}
if sheet['d'+str(i)].value:
answer['A'] = sheet['d'+str(i)].value
if sheet['e'+str(i)].value:
answer['B'] = sheet['e'+str(i)].value
if sheet['f'+str(i)].value:
answer['C'] = sheet['f'+str(i)].value
if sheet['g'+str(i)].value:
answer['D'] = sheet['g'+str(i)].value
if sheet['h'+str(i)].value:
answer['E'] = sheet['h'+str(i)].value
if sheet['i'+str(i)].value:
answer['F'] = sheet['i'+str(i)].value
right = sheet['j'+str(i)].value.replace(' ', '')
resolution = sheet['k'+str(i)].value
level = sheet['l'+str(i)].value
objs = Questioncat.objects.filter(usecomp__partid=1,name=cate)
if objs.exists():
cateobj = objs[0]
else:
objs = Questioncat.objects.filter(usecomp__partid=companyid,name=cate)
if objs.exists():
cateobj = objs[0]
else:
cateobj = Questioncat.objects.create(usecomp=Partment.objects.get(partid=companyid),name=cate)
print(cateobj)
if type == '单选':
if Question.objects.filter(type=1,title=title,right=right,deletemark=1).exists():
notinlist.append(i)
else:
if right in ['A','B','C','D','E','F']:
obj = Question()
obj.type = 1
obj.questioncat = cateobj
obj.title = title
obj.answer=answer
obj.right = right
obj.resolution = resolution if resolution else ''
if level in leveldict:
obj.level = leveldict[level]
else:
obj.level = 1
obj.usecoms = ','+companyid+','
obj.createuser = user
obj.save()
elif type == '多选':
right = list(right)
if Question.objects.filter(type=2,title=title,right=right,deletemark=1).exists():
notinlist.append(i)
else:
if [False for c in right if c not in qlist]:
pass
else:
obj = Question()
obj.type = 2
obj.questioncat = cateobj
obj.title = title
obj.answer=answer
obj.right = right
obj.resolution = resolution if resolution else ''
if level in leveldict:
obj.level = leveldict[level]
else:
obj.level = 1
obj.usecoms = ','+companyid+','
obj.createuser = user
obj.save()
elif type == '判断':
if right == 'A' or right == '':
right = 'A'
else:
right = 'B'
if Question.objects.filter(type=3,title=title,right=right,deletemark=1).exists():
notinlist.append(i)
else:
obj = Question()
obj.type = 3
obj.questioncat = cateobj
obj.title = title
obj.answer={'A':'','B':''}
obj.right = right
obj.resolution = resolution if resolution else ''
if level in leveldict:
obj.level = leveldict[level]
else:
obj.level = 1
obj.usecoms = ','+companyid+','
obj.createuser = user
obj.save()
i = i +1
print(notinlist)
return notinlist
def drequipments(companyid,path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
numdict = {}
numsdict = {}
nums = Equipment.objects.filter(usecomp__partid=companyid)
for i in nums:
numdict[i.num]=i
i=4
catedict = {'锅炉':352,'塔类':353,'反应器类':354,'储罐及容器类':355,'冷换设备类':356,'通用机械类':357,'动力类':358,'化工机械类':359,'起重运输类':360,'其他设备类':361,'其它设备类':361}
while sheet['c'+str(i)].value!=None:
area = sheet['a'+str(i)].value
cate = sheet['b'+str(i)].value
name = sheet['d'+str(i)].value
type = sheet['e'+str(i)].value
oem = sheet['f'+str(i)].value
fnum = sheet['g'+str(i)].value
fdate = sheet['h'+str(i)].value
udate = sheet['i'+str(i)].value
place = sheet['j'+str(i)].value
parameter = sheet['k'+str(i)].value
partment = sheet['n'+str(i)].value
user = sheet['o'+str(i)].value
note = sheet['p'+str(i)].value
num = sheet['c'+str(i)].value
iskey = sheet['m'+str(i)].value
istz = sheet['l'+str(i)].value
if num:
if num not in numdict:
a = Equipment()
a.num = num
a.name = name
a.type = type
a.oem = oem
a.fnum = fnum
a.place = place
a.note = note
a.parameter = parameter
if iskey:
iskey = iskey.replace(' ', '')
if iskey=='':
a.iskey=1
if istz:
istz = istz.replace(' ', '')
if istz=='':
a.istz=1
if fdate:
if isinstance(fdate,datetime):
a.fdate = fdate
else:
fdate = fdate.replace(' ','')
if '-' in fdate:
a.fdate = datetime.strptime(fdate,'%Y-%m-%d').date()
elif '.' in fdate:
a.fdate = datetime.strptime(fdate,'%Y.%m.%d').date()
elif '/' in fdate:
a.fdate = datetime.strptime(fdate,'%Y/%m/%d').date()
if udate:
if isinstance(udate,datetime):
a.udate = udate
else:
udate = udate.replace(' ','')
if '-' in udate:
a.udate = datetime.strptime(udate,'%Y-%m-%d').date()
elif '.' in udate:
a.udate = datetime.strptime(udate,'%Y.%m.%d').date()
elif '/' in udate:
a.udate = datetime.strptime(udate,'%Y/%m/%d').date()
if area:
area = area.replace(' ', '')
objs = Area.objects.filter(usecomp__partid=companyid,name=area)
if objs.exists():
a.area = objs[0]
if partment and user:
partment = partment.replace(' ', '')
user = user.replace(' ', '')
parts = Partment.objects.filter(partname=partment,partlink__contains=','+companyid+',')
if parts.exists():
a.zrbm = parts[0]
users = User.objects.filter(name=user,usecomp__partid=companyid)
if users.exists():
a.zrr = users[0]
if cate:
cate = cate.replace(' ', '')
if cate in catedict:
a.cate=Dickey.objects.get(dickeyid=catedict[cate])
a.usecomp=Partment.objects.get(partid=companyid)
a.save()
a.qrcode = makeqr('https://safeyun.ctcshe.com/miniprogram/equipment?id='+str(a.id))
a.save()
numdict[num]=a
else:
numsdict[num]=name
i = i+1
return numsdict
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
if empid!=None and isinstance(empid,str):
empid = empid.replace(' ', '')
name = sheet['B'+str(i)].value
if name !=None:
name = name.replace(' ', '')
username = sheet['C'+str(i)].value
if isinstance(username,str):
username = username.replace(' ', '')
partname = sheet['D'+str(i)].value #部门
if partname != None:
partname = partname.replace(' ', '')
if partname not in partdict:
a = Partment()
a.parentid = Partment.objects.get(partid=companyid)
a.partname = partname
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
a.empid = empid
a.username = username
a.password = '0000'
a.epassword = make_password('0000')
a.ubelongpart = Partment.objects.get(partid=partdict[partname])
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
return userdict
def drrisks(companyid,path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
errorlist = []
i=5
while sheet['d'+str(i)].value!=None:
area = sheet['a'+str(i)].value.replace(' ', '')
place = sheet['b'+str(i)].value
type = sheet['c'+str(i)].value.replace(' ', '')
name = sheet['d'+str(i)].value
group = sheet['e'+str(i)].value
step = sheet['f'+str(i)].value
hazard = sheet['g'+str(i)].value
result = sheet['h'+str(i)].value
measure1 = sheet['i'+str(i)].value
measure2 = sheet['j'+str(i)].value
measure3 = sheet['k'+str(i)].value
measure4 = sheet['l'+str(i)].value
measure5 = sheet['m'+str(i)].value
gkcj = sheet['n'+str(i)].value
zrbm = sheet['o'+str(i)].value
zrr = sheet['p'+str(i)].value
riskl = sheet['q'+str(i)].value
riske = sheet['r'+str(i)].value
riskc = sheet['s'+str(i)].value
step = step if step else None
hazard = hazard if hazard else None
result = result if result else None
measure1 = measure1 if measure1 else None
measure2 = measure2 if measure2 else None
measure3 = measure3 if measure2 else None
measure4 = measure4 if measure2 else None
measure5 = measure5 if measure2 else None
gkcj = gkcj if gkcj else None
riskl = float(riskl)
riske = float(riske)
riskc = float(riskc)
riskd = riskl*riske*riskc
level = ''
if area and type and name:
a = Risk()
areas = Area.objects.filter(name=area,usecomp__partid=companyid)
group = group.replace(' ','')
groups = Group.objects.filter(groupname=group,usecomp__partid=companyid)
if area and areas.exists():
riskacts = RiskAct.objects.filter(area=areas[0],name=name,usecomp__partid=companyid)
if riskacts.exists():
riskact = riskacts[0]
risks = Risk.objects.filter(riskact=riskact,step=step)
if risks.exists():
a = risks[0]
else:
a = Risk()
a.riskact = riskact
else:
obj = RiskAct()
obj.area = areas[0]
obj.place = place
if type == '设备设施类':
obj.type = Dickey.objects.get(dickeyid=396)
elif type == '作业活动类':
obj.type = Dickey.objects.get(dickeyid=397)
obj.name=name
obj.usecomp=Partment.objects.get(partid=companyid)
obj.gkcj=gkcj
if groups.exists():
obj.group = groups[0]
else:
g = Group()
g.groupname = group
g.usecomp = Partment.objects.get(partid=companyid)
g.save()
obj.group = g
if zrbm and zrr:
zrbm = zrbm.replace(' ', '')
zrr = zrr.replace(' ', '')
parts = Partment.objects.filter(partname=zrbm,partlink__contains=','+companyid+',')
if parts.exists():
obj.zrbm = parts[0]
users = User.objects.filter(name=zrr,usecomp__partid=companyid)
if users.exists():
obj.zrr = users[0]
obj.save()
obj.qrcode = makeqr_riskact('https://safeyun.ctcshe.com/miniprogram/riskact?id='+str(obj.id))
obj.save()
a = Risk()
a.riskact=obj
# else:
# riskacts = RiskAct.objects.filter(name=name,usecomp__partid=companyid)
# if riskacts.exists():
# riskact = riskacts[0]
# risks = Risk.objects.filter(riskact=riskact,step=step)
# if risks.exists():
# a = risks[0]
# else:
# a = Risk()
# a.riskact = riskact
# else:
# obj = RiskAct()
# obj.place = place
# if type == '设备设施类':
# obj.type = Dickey.objects.get(dickeyid=396)
# elif type == '作业活动类':
# obj.type = Dickey.objects.get(dickeyid=397)
# obj.name=name
# obj.usecomp=Partment.objects.get(partid=companyid)
# obj.gkcj=gkcj
# if groups.exists():
# obj.group = groups[0]
# else:
# g = Group()
# g.groupname = group
# g.usecomp = Partment.objects.get(partid=companyid)
# g.save()
# obj.group = g
# if zrbm and zrr:
# zrbm = zrbm.replace(' ', '')
# zrr = zrr.replace(' ', '')
# parts = Partment.objects.filter(partname=zrbm,partlink__contains=','+companyid+',')
# if parts.exists():
# obj.zrbm = parts[0]
# users = User.objects.filter(name=zrr,usecomp__partid=companyid)
# if users.exists():
# obj.zrr = users[0]
# obj.save()
# obj.qrcode = makeqr3('https://safeyun.ctcshe.com/miniprogram/riskact?id='+str(obj.id))
# obj.save()
# a = Risk()
# a.riskact=obj
if riskd>=320:
a.level='重大风险'
elif 320>riskd>=160:
a.level='较大风险'
elif 160>riskd>=70:
a.level='一般风险'
else:
a.level='低风险'
a.step = step
a.hazard = hazard
a.result = result
a.measure1 = measure1
a.measure2 = measure2
a.measure3 = measure3
a.measure4 = measure4
a.measure5 = measure5
a.riskl = riskl
a.riske = riske
a.riskc = riskc
a.riskd = riskd
a.usecomp=Partment.objects.get(partid=companyid)
a.save()
cal_riskact_level(a.riskact)
else:
errorlist.append(i)
i = i+1
return errorlist
def cal_riskact_level(riskact):
levellist = []
for i in Risk.objects.filter(riskact=riskact):
levellist.append(i.level)
if '重大风险' in levellist:
riskact.level = '重大风险'
riskact.save()
elif '较大风险' in levellist:
riskact.level = '较大风险'
riskact.save()
elif '一般风险' in levellist:
riskact.level = '一般风险'
riskact.save()
else:
riskact.level = '低风险'
riskact.save()
cal_area_risk_level(riskact.area)
def cal_area_risk_level(area):
levellist = []
objs = RiskAct.objects.filter(area=area,type__dickeyid=396)
if objs.exists:
for i in objs:#区域等级只按设备设施类来划分
levellist.append(i.level)
if '重大风险' in levellist:
area.risklevel = '重大风险'
area.save()
elif '较大风险' in levellist:
area.risklevel = '较大风险'
area.save()
elif '一般风险' in levellist:
area.risklevel = '一般风险'
area.save()
else:
area.risklevel = '低风险'
area.save()
else:
area.risklevel = None
area.save()
def is_float(str):
if str.count('.') == 1: #小数有且仅有一个小数点
left = str.split('.')[0] #小数点左边(整数位,可为正或负)
right = str.split('.')[1] #小数点右边(小数位,一定为正)
lright = '' #取整数位的绝对值(排除掉负号)
if str.count('-') == 1 and str[0] == '-': #如果整数位为负,则第一个元素一定是负号
lright = left.split('-')[1]
elif str.count('-') == 0:
lright = left
else:
#print('%s 不是小数'%str)
return False
if right.isdigit() and lright.isdigit(): #判断整数位的绝对值和小数位是否全部为数字
#print('%s 是小数'%str)
return True
else:
#print('%s 不是小数'%str)
return False
else:
#print('%s 不是小数'%str)
return False