diff --git a/apps/wpm/tasks.py b/apps/wpm/tasks.py index 9377bc24..2d1d0fce 100644 --- a/apps/wpm/tasks.py +++ b/apps/wpm/tasks.py @@ -10,6 +10,8 @@ from apps.mtm.models import Mgroup import datetime from django.db.models import Sum from apps.wpm.services import make_sflogs +from apps.wpm.models import SfLog, StLog, StSfLog +from django.utils.timezone import localtime @shared_task(base=CustomTask) @@ -21,4 +23,66 @@ def make_sflogs_simple(days=2): end_date = start_date + datetime.timedelta(days=days) mgroups = Mgroup.objects.filter(cate='section').all() for mgroup in mgroups: - make_sflogs(mgroup, start_date, end_date) \ No newline at end of file + make_sflogs(mgroup, start_date, end_date) + +@shared_task(base=CustomTask) +def get_total_hour_now(sflogId: str): + """ + 获取当前总时长, 当传入的是一个sflog时, 返回其total_hour_now + 否则更新所有total_hour_now + """ + now = datetime.datetime.now() + if sflogId: + sflog = SfLog.objects.get(id=sflogId) + if localtime(sflog.end_time) <= now: + sflog.total_hour_now = 12 + else: + sflog.total_hour_now = (now - localtime(sflog.start_time)).total_seconds/3600 + sflog.save() + return sflog.total_hour_now + else: + SfLog.objects.filter(end_time__lte=now).exclude(total_hour_now=12).update(total_hour_now=12) + sf_qs = SfLog.objects.filter(end_time_gt=now) + for i in sf_qs: + i.total_hour_now = (now-localtime(i.start_time)).total_seconds/3600 + i.save() + +@shared_task(base=CustomTask) +def cal_shut_hour(stlogId: str): + """ + 计算停机记录对应的班停时长 + """ + from apps.enm.tasks import compute_enstat + if stlogId: + stlogs = StLog.objects.filter(id=stlogId) + else: + stlogs = StLog.objects.filter(end_time=None) + for stlog in stlogs: + now = datetime.datetime.now() + st_start = stlog.start_time + if stlog.end_time is None: # 说明停机还未结束,此时也需要计算duration + st_end = now + else: + st_end = stlog.end_time + sf_qs = SfLog.objects.filter(mgroup=stlog.mgroup) + sf_qs = (sf_qs.filter(start_time__gte=st_start, start_time__lt=st_end)|sf_qs.filter(end_time__gt=st_start, end_time__lte=st_end)|sf_qs.filter(start_time__lte=st_start, end_time__gte=st_end)).order_by('start_time').distinct() + for ind, sflog in enumerate(sf_qs): + is_current_down = False + if ind == 0: + is_current_down = True + stsf, _ = StSfLog.objects.get_or_create(stlog=stlog, sflog=sflog, defaults={'stlog': stlog, 'sflog': sflog, 'is_current_down': is_current_down}) + # 计算duration + sf_end, sf_start = sflog.end_time, sflog.start_time + duration_item = min(sf_end, st_end) - min(sf_start, st_start) + if duration_item < 0: + duration_item = 0 + else: + duration_item = duration_item.total_seconds/3600 + stsf.duration = duration_item + stsf.save() + # 计算每班的总停机时间 + ret = StSfLog.objects.filter(sflog=sflog).aggregate(sum=Sum('duration')) + if ret.get('sum', 0): + sflog.shut_hour = ret['sum'] + sflog.save() + compute_enstat('sflog') \ No newline at end of file