From 81783317e75b0520e0c7b508e905d207048b8927 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 9 Sep 2020 17:11:09 +0800 Subject: [PATCH] gridtaskset --- celerybeat.pid | 2 +- mysite/celery.py | 66 +++++++++---------- mysite/settings.py | 2 +- .../migrations/0357_auto_20200909_1048.py | 42 ++++++++++++ .../migrations/0358_auto_20200909_1315.py | 21 ++++++ safesite/models.py | 8 +-- safesite/tasks.py | 7 ++ safesite/templates/gridtaskset.html | 7 +- safesite/templates/gridtasksetadd.html | 8 +-- safesite/templates/gridtasksetedit.html | 9 +-- safesite/templates/riskactcheck.html | 17 +++-- safesite/templates/scheduleset.html | 6 +- safesite/templates/taskdo.html | 9 ++- safesite/views.py | 66 +++++++++---------- 14 files changed, 167 insertions(+), 103 deletions(-) create mode 100644 safesite/migrations/0357_auto_20200909_1048.py create mode 100644 safesite/migrations/0358_auto_20200909_1315.py diff --git a/celerybeat.pid b/celerybeat.pid index 0f0ed871..7246036f 100644 --- a/celerybeat.pid +++ b/celerybeat.pid @@ -1 +1 @@ -25112 +12524 diff --git a/mysite/celery.py b/mysite/celery.py index b6d72001..2701e459 100644 --- a/mysite/celery.py +++ b/mysite/celery.py @@ -24,37 +24,37 @@ def debug_task(self): print('Request: {0!r}'.format(self.request)) app.conf.update( - CELERYBEAT_SCHEDULE = { - 'yc-task': { - 'task': 'safesite.tasks.ycjs', - #'schedule': crontab(hour=4, minute=30, day_of_week=1), - #'schedule': timedelta(seconds=20), - #'schedule': crontab(minute=00,hour=1,day_of_month=1), - 'schedule': crontab(minute=2), - #'args': (5, 6) - }, - # 'grid-task': { - # 'task': 'safesite.tasks.gridtasksend', - # 'schedule': timedelta(minutes=1), - # #'args': (5, 6) - # }, - # 'riskact-task': { - # 'task': 'safesite.tasks.riskacttask', - # 'schedule': timedelta(minutes=1), - # #'args': (5, 6) - # }, - 'check-task': { - 'task': 'safesite.tasks.checktask', - 'schedule': timedelta(minutes=1), - #'args': (5, 6) - }, - 'updatetzzs-task':{ - 'task': 'safesite.tasks.updateTzzs', - 'schedule': crontab(hour=4, minute=30, day_of_week=1), - }, - 'updateaqzs-task':{ - 'task': 'safesite.tasks.updateAqzs', - 'schedule': crontab(hour=4, minute=30, day_of_week=1), - }, - } + # CELERYBEAT_SCHEDULE = { + # 'yc-task': { + # 'task': 'safesite.tasks.ycjs', + # #'schedule': crontab(hour=4, minute=30, day_of_week=1), + # #'schedule': timedelta(seconds=20), + # #'schedule': crontab(minute=00,hour=1,day_of_month=1), + # 'schedule': crontab(minute=2), + # #'args': (5, 6) + # }, + # # 'grid-task': { + # # 'task': 'safesite.tasks.gridtasksend', + # # 'schedule': timedelta(minutes=1), + # # #'args': (5, 6) + # # }, + # # 'riskact-task': { + # # 'task': 'safesite.tasks.riskacttask', + # # 'schedule': timedelta(minutes=1), + # # #'args': (5, 6) + # # }, + # 'check-task': { + # 'task': 'safesite.tasks.checktask', + # 'schedule': timedelta(minutes=1), + # #'args': (5, 6) + # }, + # 'updatetzzs-task':{ + # 'task': 'safesite.tasks.updateTzzs', + # 'schedule': crontab(hour=4, minute=30, day_of_week=1), + # }, + # 'updateaqzs-task':{ + # 'task': 'safesite.tasks.updateAqzs', + # 'schedule': crontab(hour=4, minute=30, day_of_week=1), + # }, + # } ) \ No newline at end of file diff --git a/mysite/settings.py b/mysite/settings.py index 231f44f3..974eccbd 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -147,7 +147,7 @@ CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0' CELERY_BROKER_TRANSPORT = 'redis' CELERYD_MAX_TASKS_PER_CHILD = 10 CELERY_TIMEZONE='Asia/Shanghai' -# CELERY_ENABLE_UTC=True +CELERY_ENABLE_UTC = False DJANGO_CELERY_BEAT_TZ_AWARE = False CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' diff --git a/safesite/migrations/0357_auto_20200909_1048.py b/safesite/migrations/0357_auto_20200909_1048.py new file mode 100644 index 00000000..f230ed88 --- /dev/null +++ b/safesite/migrations/0357_auto_20200909_1048.py @@ -0,0 +1,42 @@ +# Generated by Django 2.2.8 on 2020-09-09 10:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0356_auto_20200908_1646'), + ] + + operations = [ + # migrations.RemoveField( + # model_name='companyinfo', + # name='liaison_fax', + # ), + migrations.RemoveField( + model_name='myschedule', + name='deletemark', + ), + migrations.AddField( + model_name='gridtaskset', + name='count', + field=models.IntegerField(default=0, verbose_name='派发次数'), + ), + migrations.AddField( + model_name='gridtaskset', + name='last_run_at', + field=models.DateTimeField(blank=True, null=True, verbose_name='最近派发时间'), + ), + migrations.AlterField( + model_name='gridtaskset', + name='expire', + field=models.IntegerField(blank=True, null=True, verbose_name='执行有效期'), + ), + migrations.AlterField( + model_name='gridtaskset', + name='myschedule', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='safesite.MySchedule'), + ), + ] diff --git a/safesite/migrations/0358_auto_20200909_1315.py b/safesite/migrations/0358_auto_20200909_1315.py new file mode 100644 index 00000000..cd99bf0a --- /dev/null +++ b/safesite/migrations/0358_auto_20200909_1315.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.8 on 2020-09-09 13:15 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('safesite', '0357_auto_20200909_1048'), + ] + + operations = [ + # migrations.RemoveField( + # model_name='companyinfo', + # name='liaison_fax', + # ), + migrations.RemoveField( + model_name='gridtaskset', + name='start_time', + ), + ] diff --git a/safesite/models.py b/safesite/models.py index c500042a..a9616ea0 100644 --- a/safesite/models.py +++ b/safesite/models.py @@ -1046,7 +1046,6 @@ from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSch class MySchedule(models.Model): name = models.CharField('名称', max_length=1000) typeset = models.CharField('类型', default=1,max_length=10) - deletemark = models.IntegerField(default=1) interval = models.ForeignKey(IntervalSchedule, null=True, blank=True, on_delete=models.SET_NULL) crontab = models.ForeignKey(CrontabSchedule, null=True, blank=True, on_delete=models.SET_NULL) usecomp = models.ForeignKey( @@ -1060,9 +1059,10 @@ class GridTaskSet(models.Model): gridlevel = models.ForeignKey(Dickey, on_delete=models.CASCADE, verbose_name='网格化层级') user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='执行人') note = models.TextField('检查备注', null=True) - myschedule = models.ForeignKey(MySchedule,on_delete=models.CASCADE) - start_time = models.DateTimeField('开始派发时间', null=True, blank=True) - expire = models.IntegerField('派发有效期', null=True, blank=True) + myschedule = models.ForeignKey(MySchedule,on_delete=models.SET_NULL, null=True, blank=True) + expire = models.IntegerField('执行有效期', null=True, blank=True) + count = models.IntegerField('派发次数', default=0) + last_run_at = models.DateTimeField('最近派发时间', null=True, blank=True) periodictask = models.ForeignKey(PeriodicTask, on_delete=models.CASCADE, related_name='gridtaskset_periodictask') class RiskActTask(models.Model): # 风险点排查执行记录 diff --git a/safesite/tasks.py b/safesite/tasks.py index dc82a0b1..e5626a2e 100644 --- a/safesite/tasks.py +++ b/safesite/tasks.py @@ -318,6 +318,13 @@ def sendGridtask2(**kwargs): 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 checktask(): diff --git a/safesite/templates/gridtaskset.html b/safesite/templates/gridtaskset.html index 643d9f05..c3901245 100644 --- a/safesite/templates/gridtaskset.html +++ b/safesite/templates/gridtaskset.html @@ -105,15 +105,14 @@ { field: 'id', title: 'ID', hidden: true }, { field: 'gridlevel__dickeyname', title: '网格层级', width: 100 }, { field: 'user__name', title: '执行人', width: 100 }, - { field: 'myschedule__name', title: '任务策略', width: 100 , + { field: 'myschedule__name', title: '任务策略', width: 200 , // formatter: function (value, row, index) { // if(value.hasOwnProperty('interval')){ // return value.interval.replace(',hours', '小时').replace(',days', '天').replace(',weeks', '星期').replace(',months', '月').replace(',years', '年').replace(',seconds', '秒') // } // } }, - { field: 'periodictask__start_time', title: '开始派发时间', width: 150 }, - { field: 'periodictask__last_run_at', title: '最近派发时间', width: 150 }, + { field: 'last_run_at', title: '最近派发时间', width: 150 }, { field: 'periodictask__enabled', title: '派发状态', width: 100, formatter: function (value, row, index) { switch (value) { @@ -128,7 +127,7 @@ } } }, - { field: 'periodictask__total_run_count', title: '已派发次数', width: 100 }, + { field: 'count', title: '已派发次数', width: 100 }, { field: 'note', title: '执行备注', width: 100 }, ]], }); diff --git a/safesite/templates/gridtasksetadd.html b/safesite/templates/gridtasksetadd.html index 394cd873..c5aea91b 100644 --- a/safesite/templates/gridtasksetadd.html +++ b/safesite/templates/gridtasksetadd.html @@ -24,12 +24,6 @@
-
- - - -
- +
- 删除 @@ -43,14 +43,14 @@ $.messager.alert('提示', '请先选择一个策略!'); } } - function delgirdtaskset() { + function delscheduleset() { var row = $('#schedulesettable').datagrid('getSelected'); if (row) { $.messager.confirm('提示', '确定删除吗?', function (r) { if (r) { $.ajax({ type: "GET", - url: 'api/scheduleset?a=del&id=' + row.id, + url: 'api/myschedule?a=del&id=' + row.id, datatype: "json", beforeSend: function () { }, success: function (data) { diff --git a/safesite/templates/taskdo.html b/safesite/templates/taskdo.html index c8de43cb..0ac2c9ec 100644 --- a/safesite/templates/taskdo.html +++ b/safesite/templates/taskdo.html @@ -20,7 +20,7 @@ pageSize: 20, columns: [[ { field: 'riskact__name', title: '风险点名称', width: 80 }, - { field: 'riskact__group__groupname', title: '所属岗位', width: 100 }, + { field: 'user__name', title: '任务执行人', width: 80 }, { field: 'riskact__area__name', title: '区域', width: 100 }, //{ field: 'num', title: '风险数量', width: 80 }, { field: 'taskadd', title: '任务开始时间', width: 80 }, @@ -35,11 +35,11 @@ switch (value) { case 1: return 'color:white;background-color:green'; break; }}}, - { field: '', title: '执行状态', width: 80, formatter: function (value, row, index) { + { field: 'taskdo', title: '执行时间', width: 80, formatter: function (value, row, index) { if(row.taskdo==null){ return '未执行'; }else{ - return '已完成'; + return '已完成' + '-' + row.taskdo; } }, styler: function (value, row, index) { if(value==null){ @@ -48,8 +48,7 @@ return 'color:green;font-weight:bold'; }} }, - { field: 'taskdo', title: '执行时间', width: 80 }, - { field: 'user__name', title: '执行人', width: 80 }, + ]], // onSelect: function (index, row) { // $('#tasktable').datagrid({url:'api/risktask?a=listtask&riskact='+row.risk__riskact__id+'&group='+row.risk__group__groupid}) diff --git a/safesite/views.py b/safesite/views.py index 7dd8166a..77380499 100644 --- a/safesite/views.py +++ b/safesite/views.py @@ -7073,36 +7073,40 @@ def apimyschedule(req): userid = req.session['userid'] companyid = getcompany(userid) if a == 'listcombobox': - objs = MySchedule.objects.filter(usecomp__partid=companyid,deletemark=1) + objs = MySchedule.objects.filter(usecomp__partid=companyid) objsdata = objs.values('id','name') keystr = transstr(objsdata, 'id', 'name') return HttpResponse(keystr, content_type="application/json") elif a == 'listall': - objs = MySchedule.objects.filter(usecomp__partid=companyid, deletemark=1) + objs = MySchedule.objects.filter(usecomp__partid=companyid) total = objs.count() startnum, endnum = fenye(req) objdata = objs.order_by('-pk')[startnum:endnum].values('id', 'name') return HttpResponse(transjson(total, objdata), content_type="application/json") elif a == 'add': data = json.loads(req.body.decode('utf-8')) - print(data) if data['set'] == 'interval': - iobj = IntervalSchedule() - iobj.every = data['every'] - iobj.period = data['period'] - iobj.save() + iobj, b = IntervalSchedule.objects.get_or_create(every=data['every'], period=data['period'], defaults={'every':data['every'], 'period':data['period']}) MySchedule.objects.create(name=data['name'], typeset=data['set'], interval=iobj, usecomp=Partment.objects.get(partid=companyid)) elif data['set'] == 'crontab': - iobj = CrontabSchedule() - iobj.minute = data['minute'] - iobj.hour = data['hour'] - iobj.day_of_week = data['day_of_week'] - iobj.day_of_month = data['day_of_month'] - iobj.month_of_year = data['month_of_year'] - iobj.timezone = 'Asia/Shanghai' - iobj.save() + cron = { + 'minute' : data['minute'], + 'hour': data['hour'], + 'day_of_week': data['day_of_week'], + 'day_of_month': data['day_of_month'], + 'month_of_year': data['month_of_year'], + 'timezone': 'Asia/Shanghai' + } + iobj, b = CrontabSchedule.objects.get_or_create(**cron, defaults=cron) MySchedule.objects.create(name=data['name'], typeset=data['set'], crontab=iobj, usecomp=Partment.objects.get(partid=companyid)) return JsonResponse({'code': 1}) + elif a == 'del': + user = User.objects.get(userid=userid) + if user.issuper == 1: + MySchedule.objects.get(id=req.GET.get('id')).delete() + return JsonResponse({'code': 1}) + else: + return JsonResponse({'code': 0}) def apigridtaskset(req): a = req.GET.get('a') userid = req.session['userid'] @@ -7114,7 +7118,7 @@ def apigridtaskset(req): total = objs.count() startnum, endnum = fenye(req) objs = objs.order_by('-pk')[startnum:endnum].values('id', 'gridlevel__dickeyname', 'user__name', - 'myschedule__name', 'note', 'periodictask__enabled','periodictask__start_time','periodictask__last_run_at','periodictask__total_run_count') + 'myschedule__name', 'note', 'periodictask__enabled','last_run_at','count') return HttpResponse(transjson(total, objs), content_type="application/json") elif a == 'add': data = json.loads(req.body.decode('utf-8')) @@ -7125,7 +7129,6 @@ def apigridtaskset(req): pobj.task = 'safesite.tasks.sendGridtask2' pobj.interval = schobj.interval if schobj.interval else None pobj.crontab = schobj.crontab if schobj.crontab else None - pobj.start_time = data['start_time'] if ('start_time' in data and data['start_time']) else None pobj.save() obj = GridTaskSet() obj.riskact = RiskAct.objects.get(id=data['riskact']) @@ -7142,7 +7145,7 @@ def apigridtaskset(req): elif a == 'detail': objs = GridTaskSet.objects.filter(id=req.GET.get('id')) objdata = objs.values('id', 'gridlevel__dickeyname', 'user__name','user__userid','gridlevel__dickeyid','myschedule__id', - 'myschedule__name', 'note', 'periodictask__start_time')[0] + 'myschedule__name', 'note')[0] xx = {'code':1, 'data':objdata} return HttpResponse(json.dumps(xx, cls=MyEncoder), content_type="application/json") elif a == 'del': @@ -7163,7 +7166,6 @@ def apigridtaskset(req): schobj = MySchedule.objects.get(id=data['myschedule']) pobj.interval = schobj.interval if schobj.interval else None pobj.crontab = schobj.crontab if schobj.crontab else None - pobj.start_time = data['start_time'] if ('start_time' in data and data['start_time']) else None pobj.save() obj.myschedule = schobj obj.save() @@ -7470,8 +7472,7 @@ def apiriskacttask(req): objs = objs[startnum:endnum] return HttpResponse(transjson(total, objs), content_type="application/json") elif a == 'listall': # 全厂排查记录 - objs = RiskActTask.objects.filter( - riskact__usecomp__partid=companyid).exclude(user=None) + objs = RiskActTask.objects.filter(riskact__usecomp__partid=companyid).exclude(taskdo=None) if req.GET.get('pcbm'): parts = getparts(req.GET.get('pcbm')) objs = objs.filter(user__ubelongpart__in=parts) @@ -7481,23 +7482,22 @@ def apiriskacttask(req): objs = objs.filter(taskdo__lte=req.GET.get('jssj')) total = objs.count() startnum, endnum = fenye(req) - objs = objs[startnum:endnum].values('id', 'riskact__name', 'riskact__area__name', 'riskact__place', - 'taskdo', 'state', 'user__ubelongpart__partname', 'user__name', 'taskdo') + objs = objs.order_by('-taskdo')[startnum:endnum].values('id', 'riskact__name', 'riskact__area__name', 'riskact__place', + 'taskdo', 'state', 'user__ubelongpart__partname', 'user__name', 'taskdo', 'istask') return HttpResponse(transjson(total, objs), content_type="application/json") elif a == 'listalltodo': # 全厂待办任务 - objs = RiskActTask.objects.filter( - riskact__usecomp__partid=companyid, istask=1, user=None) + objs = RiskActTask.objects.filter(istask=1, taskdo=None, usable=1) total = objs.count() startnum, endnum = fenye(req) objs = objs[startnum:endnum].values('id', 'riskact__group__groupname', 'riskact__area__name', 'riskact__type__dickeyname', 'riskact__id', - 'riskact__group__groupid', 'riskact__name', 'riskact__level', 'riskact__tasktype', 'taskadd', 'taskexpire', 'user__userid', 'usable') + 'riskact__group__groupid', 'riskact__name', 'riskact__level', 'riskact__tasktype', 'taskadd', 'taskexpire', 'user__userid', 'usable', 'user__name') return HttpResponse(transjson(total, objs), content_type="application/json") elif a == 'listself': # 排查记录 a = RiskActTask.objects.filter(user__userid=userid) total = a.count() startnum, endnum = fenye(req) a = a.order_by('-id')[startnum:endnum].values('id', 'riskact__level', 'riskact__name', 'riskact__area__name', 'riskact__place', - 'taskdo', 'state', 'usable', 'riskact__group__groupname', 'taskadd', 'taskexpire', 'user__userid', 'riskact__id') + 'taskdo', 'state', 'usable', 'riskact__group__groupname', 'taskadd', 'taskexpire', 'user__userid', 'riskact__id', 'user__name') return HttpResponse(transjson(total, a), content_type="application/json") elif a == 'listmytodo': # 待办 groups = Group.objects.filter(users__userid=userid) @@ -7506,14 +7506,14 @@ def apiriskacttask(req): total = objs.count() startnum, endnum = fenye(req) objs = objs[startnum:endnum].values('id', 'riskact__group__groupname', 'riskact__area__name', 'riskact__type__dickeyname', 'riskact__id', - 'riskact__group__groupid', 'riskact__name', 'riskact__level', 'riskact__tasktype', 'taskadd', 'taskexpire', 'user__userid') + 'riskact__group__groupid', 'riskact__name', 'riskact__level', 'riskact__tasktype', 'taskadd', 'taskexpire', 'user__userid', 'user__name') return HttpResponse(transjson(total, objs), content_type="application/json") elif a == 'listmytodo2': # 我的待办 objs = RiskActTask.objects.filter(usable=1, istask=1, user__userid=userid) total = objs.count() startnum, endnum = fenye(req) objs = objs[startnum:endnum].values('id', 'riskact__group__groupname', 'riskact__area__name', 'riskact__type__dickeyname', 'riskact__id', - 'riskact__group__groupid', 'riskact__name', 'riskact__level', 'riskact__tasktype', 'taskadd', 'taskexpire', 'user__userid') + 'riskact__group__groupid', 'riskact__name', 'riskact__level', 'riskact__tasktype', 'taskadd', 'taskexpire', 'user__userid', 'user__name') return HttpResponse(transjson(total, objs), content_type="application/json") elif a == 'todonum': groups = Group.objects.filter(users__userid=userid) @@ -7546,9 +7546,9 @@ def apiriskcheck2(req): # objs = RiskActTask.objects.filter( # riskact__id=data['riskact'], usable=1, user=None, istask=1) # 匹配未处理的任务 objs = RiskActTask.objects.filter( - riskact__id=data['riskact'], usable=1, user=user, istask=1) # 匹配本人未处理的任务 + riskact__id=data['riskact'], usable=1, user=user, istask=1) # 匹配最近本人未处理的任务 if objs.exists(): - obj = objs[0] + obj = objs.last() obj.user = user obj.taskdo = nowtime obj.usable = 0 @@ -7577,8 +7577,8 @@ def apiriskcheck2(req): objs = objs.filter(riskacttask__id=req.GET.get('riskacttask')) total = objs.count() startnum, endnum = fenye(req) - objs = objs.order_by('-id')[startnum:endnum].values('id', 'risk__step', 'risk__level', 'trouble__yhnum', 'risk__hazard', - 'risk__result', 'risk__measure1', 'risk__measure2', 'risk__measure3', 'risk__measure4', 'risk__measure5') + objs = objs.order_by('trouble')[startnum:endnum].values('id','risk', 'risk__step', 'risk__level','trouble', 'trouble__yhnum', 'risk__hazard', + 'risk__result', 'risk__measure1', 'risk__measure2', 'risk__measure3', 'risk__measure4', 'risk__measure5', 'riskacttask', 'riskacttask__taskdo') return HttpResponse(transjson(total, objs), content_type="application/json")