safesite/safesite/tasks.py

561 lines
24 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
import json
import logging
import requests
from .models import *
import datetime
import calendar
import pandas as pd
from sklearn import linear_model
from django.db.models import Sum
from django.conf import settings
from .safespider import getTzzs, getAqzs
import time
dirname = settings.BASE_DIR +'/safesite/'
def getcs(companyid):#获取公司相关参数设置
return Yjsetup.objects.filter(usecomp__partid=companyid).values()[0]
def gettime(x=datetime.datetime.now()):
days_num = calendar.monthrange(x.year, x.month)[1]
first_day = datetime.date(x.year,x.month,1)
first_day_of_next_month = first_day + datetime.timedelta(days = days_num)
return first_day,first_day_of_next_month
@shared_task
def send_wechatmsgs(postdict,tolist):
with open(dirname + 'token.txt','r',encoding= 'utf-8') as f:
token=f.read()
try:
for i in tolist:
postdict['touser']=i
requests.post('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='+token,data=json.dumps(postdict))
except:
pass
@shared_task
def send_wechatmsg(postdict):
with open(dirname + 'token.txt','r',encoding= 'utf-8') as f:
token=f.read()
try:
v = requests.post('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='+token,data=json.dumps(postdict))
print(v.text())
except:
pass
@shared_task
def yjjs(companyid):
first_day,first_day_of_next_month = gettime()
#隐患算分
a = Trouble.objects.filter(fxsj__range=(first_day, first_day_of_next_month),usecomp__partid=companyid,deletemark=1)
#隐患按时上报率
if a.count()==0:
sbjs = 1
else:
sbjs = 0
#隐患整改率
if a.count() != 0:
zgjs = a.filter(yhzt__in=[4,5,6]).count()/a.count()
else:
zgjs = 4
if zgjs == 1:
zgjs = 0
elif zgjs>=0.8 and zgjs <1:
zgjs = 0.1
elif zgjs>=0.5 and zgjs<0.8:
zgjs = 0.3
elif zgjs>=0.3 and zgjs<0.5:
zgjs = 0.5
else:
zgjs = 1*4
cs = getcs(companyid)
yhsw = a.filter(yhpg__dickeyid=53).count() #死亡隐患数
yhzs = a.filter(yhpg__dickeyid=52).count()
yhqs = a.filter(yhpg__dickeyid=51).count()
yhqws = a.filter(yhpg__dickeyid=50).count()
yhwsh = a.filter(yhpg__dickeyid=49).count()
score = (((yhsw*1 + yhzs*0.6 + yhqs*0.3+ yhqws*0.2 + yhwsh*0.1)/cs['monthyhavg'] )* cs['yhpgqz']+ #隐患评估
(a.filter(yhdj__dickeyid=55).count()*0.3+a.filter(yhdj__dickeyid=56).count()*1)* cs['yhdjqz']+ #隐患等级
sbjs*cs['yhsblqz']+ #隐患上报率
zgjs*cs['yhzglqz']) #隐患整改率
#print(score)
year = first_day.year
month = first_day.month
obj,created = Yjyc.objects.get_or_create(usecomp__partid=companyid,year=year,month=month,defaults={'usecomp':Partment.objects.get(partid=companyid) ,'year':year,'month':month})
obj.troublevalue = score
obj.yjz = round(obj.troublevalue + obj.trainvalue + obj.drillvalue + obj.missvalue + obj.observevalue,2)
obj.save()
@shared_task
def yjjs_px(companyid):
first_day,first_day_of_next_month = gettime()
#培训算分
a = Train.objects.filter(starttime__range=(first_day, first_day_of_next_month),usecomp__partid=companyid,state=1,deletemark=1) #有效培训
#计算培训效果
participantnum = Trainuser.objects.filter(train__in=a).count()
knownum = a.aggregate(knownum = Sum('knownum'))['knownum']
if participantnum != 0:
x = knownum/participantnum
else:
x = 0
if x == 1:
pxxg = 1
elif 1>x>= 0.9:
pxxg = 0.8
elif 0.9>x>=0.6:
pxxg = 0.5
else:
pxxg = 0.1
#培训等级
cs = getcs(companyid)
score = ((a.filter(trainlevel__dicid=5).count()*0.5 + a.filter(trainlevel__dicid=6).count()*0.8 + a.filter(trainlevel__dicid=7).count()*0.5+ a.filter(trainlevel__dicid=42).count()*0.5)*cs['pxdjqz'] +
pxxg*cs['pxxgqz'] ) #培训效果
year = first_day.year
month = first_day.month
obj,created = Yjyc.objects.get_or_create(usecomp__partid=companyid,year=year,month=month,defaults={'usecomp':Partment.objects.get(partid=companyid) ,'year':year,'month':month})
obj.trainvalue = -score
obj.yjz = round(obj.troublevalue + obj.trainvalue + obj.drillvalue + obj.missvalue + obj.observevalue,2)
obj.save()
@shared_task
def yjjs_gc(companyid):
first_day,first_day_of_next_month = gettime()
#观察算分
a = Observe.objects.filter(looktime__range=(first_day, first_day_of_next_month),usecomp__partid=companyid,deletemark=1)
num = a.count()
if num>40:
score = (num-40)*0.04 + 40*0.4
else:
score = num*0.4
year = first_day.year
month = first_day.month
obj,created = Yjyc.objects.get_or_create(usecomp__partid=companyid,year=year,month=month,defaults={'usecomp':Partment.objects.get(partid=companyid) ,'year':year,'month':month})
obj.observevalue = -score
obj.yjz = round(obj.troublevalue + obj.trainvalue + obj.drillvalue + obj.missvalue + obj.observevalue,2)
obj.save()
@shared_task
def yjjs_ws(companyid):
#未遂算分
first_day,first_day_of_next_month = gettime()
a = Miss.objects.filter(misstime__range=(first_day, first_day_of_next_month),usecomp__partid=companyid,deletemark=1) #
score = (a.count())*0.6
year = first_day.year
month = first_day.month
obj,created = Yjyc.objects.get_or_create(usecomp__partid=companyid,year=year,month=month,defaults={'usecomp':Partment.objects.get(partid=companyid) ,'year':year,'month':month})
obj.missvalue = score
obj.yjz = round(obj.troublevalue + obj.trainvalue + obj.drillvalue + obj.missvalue + obj.observevalue,2)
obj.save()
@shared_task
def yjjs_yl(companyid):
first_day,first_day_of_next_month = gettime()
a = Drill.objects.filter(starttime__range=(first_day, first_day_of_next_month),usecomp__partid=companyid,state=1,deletemark=1) #有效演练
#计算演练效果
participantnum = Drill.objects.filter(drillid__in=a).count()
knownum = a.aggregate(knownum = Sum('knownum'))['knownum']
if participantnum != 0:
x = knownum/participantnum
else:
x = 0
if x == 1:
ylxg = 1
elif 1>x>= 0.9:
ylxg = 0.8
elif 0.9>x>=0.6:
ylxg = 0.5
else:
ylxg = 0.1
#演练等级
cs = getcs(companyid)
score = ((a.filter(drilllevel__dicid=20).count()*1 + a.filter(drilllevel__dicid=21).count()*0.5 + a.filter(drilllevel__dicid=22).count()*1 + a.filter(drilllevel__dicid=43).count()*0.5)*cs['yldjqz'] +
ylxg*cs['ylxgqz'] ) #演练效果
year = first_day.year
month = first_day.month
obj,created = Yjyc.objects.get_or_create(usecomp__partid=companyid,year=year,month=month,defaults={'usecomp':Partment.objects.get(partid=companyid) ,'year':year,'month':month})
obj.drillvalue = -score
obj.yjz = round(obj.troublevalue + obj.trainvalue + obj.drillvalue,2)
obj.save()
@shared_task
def ycjs(nowyear=datetime.datetime.now().year, nowmonth=datetime.datetime.now().month):
#print('正在执行预测计算。。。')
companys = Partment.objects.filter(iscompany=1)
objs = Yjyc.objects.exclude(yjz=0,year=nowyear,month=nowmonth)
for x in companys:
obj = objs.filter(usecomp=x).order_by('-yjycid')
objv = obj.values('yjycid','yjz')
#print(objv)
if len(obj)>1:
vl = list(objv)
for i in range(len(vl)):
vl[i]['num'] = i+1
if i == 0:
vl[i]['yjzs'] = vl[i]['yjz']
if i > 0 :
vl[i]['yjzs'] = vl[i-1]['yjzs'] + vl[i]['yjz']
df = pd.DataFrame(vl)
# 建立线性回归模型
regr = linear_model.LinearRegression()
# 拟合
regr.fit(df['num'].values.reshape(-1, 1), df['yjzs']) # 注意此处.reshape(-1, 1)因为X是一维的
# 得到直线的斜率、截距
a, b = regr.coef_, regr.intercept_
# 更新本月的预测值
# first_day,first_day_of_next_month = gettime()
# year = first_day_of_next_month.year
# month = first_day_of_next_month.month
objnew,created = Yjyc.objects.get_or_create(usecomp=x,year=nowyear,month=nowmonth,defaults={'usecomp':x,'year':nowyear,'month':nowmonth})
objnew.ycz = ("%.2f" % a)
objnew.b = ("%.2f" % b)
objnew.save()
#print('执行完毕!')
@shared_task
def risktask():
nowtime = datetime.datetime.now()
for i in Risk.objects.exclude(tasktype=0):
if i.tasktype == 1:
if i.tasktime:
if (nowtime - i.tasktime).seconds>=28800:
taskexpire = nowtime + datetime.timedelta(seconds=28800)
Risktask.objects.filter(risk=i).update(usable=0)
Risktask.objects.create(risk=i,group=i.group,taskexpire = taskexpire,taskadd=nowtime)
i.tasktime = nowtime
i.save()
elif i.tasktype == 2:
if i.tasktime:
if (nowtime - i.tasktime).days>=1:
taskexpire = nowtime + datetime.timedelta(days=1)
Risktask.objects.filter(risk=i).update(usable=0)
Risktask.objects.create(risk=i,group=i.group,taskexpire = taskexpire,taskadd=nowtime)
i.tasktime = nowtime
i.save()
elif i.tasktype == 3:
if i.tasktime:
if (nowtime - i.tasktime).days>=7:
taskexpire = nowtime + datetime.timedelta(days=7)
Risktask.objects.filter(risk=i).update(usable=0)
Risktask.objects.create(risk=i,group=i.group,taskexpire = taskexpire,taskadd=nowtime)
i.tasktime = nowtime
i.save()
# elif i.tasktype == 4:
# if i.tasktime:
# if (nowtime - i.tasktime).weeks>=4:
# taskexpire = i.tasktime + datetime.timedelta(weeks=4)
# Risktask.objects.filter(risk=i).update(usable=0)
# Risktask.objects.create(risk=i,group=i.group,taskexpire = taskexpire)
# i.tasktime = taskexpire
# i.save()
@shared_task
def riskacttask():
nowtime = datetime.datetime.now()
for i in RiskAct.objects.exclude(tasktype=0):
if i.tasktype == 1:
if i.tasktime:
if (nowtime - i.tasktime).seconds>=28800:
taskexpire = nowtime + datetime.timedelta(seconds=28800)
RiskActTask.objects.filter(riskact=i,istask=1).update(usable=0)
RiskActTask.objects.create(riskact=i,taskexpire = taskexpire,taskadd=nowtime,istask=1)
i.tasktime = nowtime
i.save()
elif i.tasktype == 2:
if i.tasktime:
if (nowtime - i.tasktime).days>=1:
taskexpire = nowtime + datetime.timedelta(days=1)
RiskActTask.objects.filter(riskact=i,istask=1).update(usable=0)
RiskActTask.objects.create(riskact=i,taskexpire = taskexpire,taskadd=nowtime,istask=1)
i.tasktime = nowtime
i.save()
elif i.tasktype == 3:
if i.tasktime:
if (nowtime - i.tasktime).days>=7:
taskexpire = nowtime + datetime.timedelta(days=7)
RiskActTask.objects.filter(riskact=i,istask=1).update(usable=0)
RiskActTask.objects.create(riskact=i,taskexpire = taskexpire,taskadd=nowtime,istask=1)
i.tasktime = nowtime
i.save()
@shared_task
def gridtasksend():
nowtime = datetime.datetime.now()
time2 = nowtime + datetime.timedelta(minutes=50)
RiskActTask.objects.filter(taskexpire__lte=nowtime, usable=1).update(usable=0)
# for i in GridTaskSet.objects.filter(is_paused=False, last_send____gte=time2):
for i in GridTaskSet.objects.filter(is_paused=False, start_task____lte=time2):
sendGridtask(i)
from dateutil.relativedelta import *
def sendGridtask(obj):
nowtime = datetime.datetime.now()
schedule = obj.schedule
if 'interval' in schedule and schedule['interval']:
number, type_ = schedule['interval'].split(',')
start_task = obj.start_task
m = start_task + relativedelta({type_:int(number)})
if nowtime >= m:
newm = nowtime + relativedelta({type_:int(number)})
RiskActTask.objects.filter(taskset=obj, usable=1).update(usable=0)
RiskActTask.objects.create(riskact=obj.riskact,taskexpire = newm,taskadd=nowtime,istask=1,taskset=obj,tasknote=obj.note,user=obj.user)
obj.start_task = nowtime
obj.count = obj.count + 1
obj.save()
else:
pass
@shared_task
def sendGridtask2(**kwargs):
obj = GridTaskSet.objects.get(id=kwargs['gridtaskset'])
if obj.trouble:
if obj.trouble.yhzt == 6:
#如果隐患关闭了就直接停止计划任务
obj.periodictask.enabled = False
obj.periodictask.save()
else:
TroubleFollowTask.objects.filter(taskset=obj, usable=1).update(usable=0)
nowtime = datetime.datetime.now()
if obj.expire:
newm = nowtime + datetime.timedelta(hours=int(obj.expire))
TroubleFollowTask.objects.create(trouble=obj.trouble,taskexpire = newm,taskadd=nowtime,taskset=obj,tasknote=obj.note,user=obj.user,gridlevel=obj.gridlevel)
else:
TroubleFollowTask.objects.create(trouble=obj.trouble,taskadd=nowtime,taskset=obj,tasknote=obj.note,user=obj.user,gridlevel=obj.gridlevel)
obj.last_run_at = nowtime
obj.count = obj.count+1
obj.save()
elif obj.riskact:
RiskActTask.objects.filter(taskset=obj, usable=1).update(usable=0)
nowtime = datetime.datetime.now()
if obj.expire:
newm = nowtime + datetime.timedelta(hours=int(obj.expire))
RiskActTask.objects.create(riskact=obj.riskact,taskexpire = newm,taskadd=nowtime,istask=1,taskset=obj,tasknote=obj.note,user=obj.user)
else:
RiskActTask.objects.create(riskact=obj.riskact,taskadd=nowtime,istask=1,taskset=obj,tasknote=obj.note,user=obj.user)
obj.last_run_at = nowtime
obj.count = obj.count+1
obj.save()
@shared_task
def expireRiskacttask():
RiskActTask.objects.filter(taskexpire__lte = datetime.datetime.now(), usable=1).update(usable=0)
@shared_task
def expireTroublefollowtask():
TroubleFollowTask.objects.filter(taskexpire__lte = datetime.datetime.now(), usable=1).update(usable=0)
@shared_task
def closeExamtest():
# 自动关闭到期的考试
ExamTest.objects.filter(state=1, endtime__lt = datetime.datetime.now()).update(state=0)
@shared_task
def checktask():
nowtime = datetime.datetime.now()
for i in Checktask.objects.filter(deletemark=1,taskstate=1):
if i.tasktype==1:
if i.checktime:
if (nowtime - i.checktime).days>=1:
endtimes = nowtime + datetime.timedelta(days=1)
for j in i.checkname.all():
x=User.objects.get(userid=j.userid)
Checkjob.objects.filter(checktask=i,checkname=x).update(jobstate=2)
Checkjob.objects.create(checktask=i,checkname=x,taskstate=4,starttime=nowtime,endtime = endtimes,usecomp=i.usecomp)
i.checktime = nowtime
i.save()
elif i.tasktype==2:
if i.checktime:
if (nowtime - i.checktime).days>=7:
endtimes = nowtime + datetime.timedelta(days=7)
for j in i.checkname.all():
x=User.objects.get(userid=j.userid)
Checkjob.objects.filter(checktask=i,checkname=x).update(jobstate=2)
Checkjob.objects.create(checktask=i,checkname=x,taskstate=4,starttime=nowtime,endtime = endtimes,usecomp=i.usecomp)
i.checktime = nowtime
i.save()
elif i.tasktype==3:
if i.checktime:
if (nowtime - i.checktime).days>=30:
endtimes = nowtime + datetime.timedelta(days=30)
for j in i.checkname.all():
x=User.objects.get(userid=j.userid)
Checkjob.objects.filter(checktask=i,checkname=x).update(jobstate=2)
Checkjob.objects.create(checktask=i,checkname=x,taskstate=4,starttime=nowtime,endtime = endtimes,usecomp=i.usecomp)
i.checktime = nowtime
i.save()
elif i.tasktype==4:
if i.checktime:
if (nowtime - i.checktime).days>=120:
endtimes = nowtime + datetime.timedelta(days=120)
for j in i.checkname.all():
x=User.objects.get(userid=j.userid)
Checkjob.objects.filter(checktask=i,checkname=x).update(jobstate=2)
Checkjob.objects.create(checktask=i,checkname=x,taskstate=4,starttime=nowtime,endtime = endtimes,usecomp=i.usecomp)
i.checktime = nowtime
i.save()
elif i.tasktype==5:
if i.checktime:
if (nowtime - i.checktime).days>=182:
endtimes = nowtime + datetime.timedelta(days=182)
for j in i.checkname.all():
x=User.objects.get(userid=j.userid)
Checkjob.objects.filter(checktask=i,checkname=x).update(jobstate=2)
Checkjob.objects.create(checktask=i,checkname=x,taskstate=4,starttime=nowtime,endtime = endtimes,usecomp=i.usecomp)
i.checktime = nowtime
i.save()
elif i.tasktype==6:
if i.checktime:
if (nowtime - i.checktime).days>=365:
endtimes = nowtime + datetime.timedelta(days=365)
for j in i.checkname.all():
x=User.objects.get(userid=j.userid)
Checkjob.objects.filter(checktask=i,checkname=x).update(jobstate=2)
Checkjob.objects.create(checktask=i,checkname=x,taskstate=4,starttime=nowtime,endtime = endtimes,usecomp=i.usecomp)
i.checktime = nowtime
i.save()
@shared_task
def expireTzzs():
queryset = Socertificate.objects.filter(yfsrq__lte = datetime.datetime.now()+datetime.timedelta(days=185))
for x in queryset:
try:
x.zszt = guoqi(x.yfsrq)
x.save()
except:
pass
@shared_task
def expireAqzs():
queryset = Safecert.objects.filter(yfsrq__lte = datetime.datetime.now()+datetime.timedelta(days=185))
for x in queryset:
try:
x.zszt = guoqi(x.yfsrq)
x.save()
except:
pass
@shared_task
def updateTzzs():
queryset = Socertificate.objects.filter(yfsrq__lte = datetime.datetime.now()+datetime.timedelta(days=200))
for x in queryset:
data = getTzzs(x.cardnum,x.realname)
time.sleep(10)
if data:
for i in data:
updated_values={
'realname':i['姓名'],
'gender':i['性别'],
'zylb':i['作业类别'],
'czxm':i['操作项目'],
'fzjg':i['发证机关'],
'ccfzrq':i['初次发证日期'] if i['初次发证日期'] else None,
'yfsrq':i['应复审日期'] if i['应复审日期'] else None,
'yxqkssj':i['有效期开始时间'] if i['有效期开始时间'] else None,
'yxqjssj':i['有效期结束时间'] if i['有效期结束时间'] else None,
'sjfssj':i['实际复审时间'] if i['实际复审时间'] else None,
'user':x.user,
'usecomp':x.usecomp
}
try:
updated_values['zszt'] = guoqi(i['应复审日期'])
except:
pass
# obj, created = Socertificate.objects.update_or_create(
# cardnum=x.cardnum, czxm=i['操作项目'], defaults=updated_values)
try:
obj = Socertificate.objects.get(cardnum=x.cardnum, czxm=i['操作项目'])
if obj.yxqjssj.strftime('%Y-%m-%d')<i['有效期结束时间']:
obj.yfsrq = i['应复审日期'] if i['应复审日期'] else None
obj.yxqkssj = i['有效期结束时间'] if i['有效期结束时间'] else None
obj.yxqjssj = i['有效期结束时间'] if i['有效期结束时间'] else None
obj.sjfssj = i['实际复审时间'] if i['实际复审时间'] else None
try:
zsst = guoqi(i['应复审日期'])
obj.zszt = zsst
except:
pass
obj.save()
except:
obj = Socertificate(**updated_values)
obj.save()
def guoqi(x):
now = datetime.datetime.now()
now1 = datetime.datetime.now() + datetime.timedelta(days=180)
if datetime.datetime.strptime(x,'%Y-%m-%d')>now1:
return 1
elif now1 > datetime.datetime.strptime(x,'%Y-%m-%d')>now:
return 2
else:
return 3
@shared_task
def updateAqzs():
queryset = Safecert.objects.filter(yfsrq__lte = datetime.datetime.now()+datetime.timedelta(days=200))
for x in queryset:
data = getAqzs(x.cardnum,x.realname)
time.sleep(10)
if data:
for i in data:
updated_values={
'realname':i['姓名'],
'gender':i['性别'],
'zglx':i['资格类型'],
'dwlx':i['单位类型'],
'fzjg':i['发证机关'],
'yfsrq':i['应复审日期'] if i['应复审日期'] else None,
'yxqkssj':i['有效期开始时间'] if i['有效期开始时间'] else None,
'yxqjssj':i['有效期结束时间'] if i['有效期结束时间'] else None,
'user':x.user,
'usecomp':x.usecomp
}
try:
updated_values['zszt'] = guoqi(i['有效期结束时间'])
except:
pass
# obj, created = Safecert.objects.update_or_create(
# cardnum=x.cardnum, zglx=i['资格类型'], dwlx=i['单位类型'], defaults=updated_values)
try:
obj = Safecert.objects.get(cardnum=x.cardnum, zglx=i['资格类型'], dwlx=i['单位类型'])
if obj.yxqjssj.strftime('%Y-%m-%d')<i['有效期结束时间']:
obj.yfsrq = i['应复审日期'] if i['应复审日期'] else None
obj.yxqkssj = i['有效期结束时间'] if i['有效期结束时间'] else None
obj.yxqjssj = i['有效期结束时间'] if i['有效期结束时间'] else None
try:
zsst = guoqi(i['有效期结束时间'])
obj.zszt = zsst
except:
pass
obj.save()
except:
obj = Safecert(**updated_values)
obj.save()
@shared_task
def call_trainplan_manager():
first_day,first_day_of_next_month = gettime()
year = first_day.year
month = first_day.month
pass