feat: 停机记录分配到每一个班
This commit is contained in:
parent
d487f0889f
commit
6d5d2f84d4
|
@ -10,6 +10,8 @@ from apps.mtm.models import Mgroup
|
||||||
import datetime
|
import datetime
|
||||||
from django.db.models import Sum
|
from django.db.models import Sum
|
||||||
from apps.wpm.services import make_sflogs
|
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)
|
@shared_task(base=CustomTask)
|
||||||
|
@ -22,3 +24,65 @@ def make_sflogs_simple(days=2):
|
||||||
mgroups = Mgroup.objects.filter(cate='section').all()
|
mgroups = Mgroup.objects.filter(cate='section').all()
|
||||||
for mgroup in mgroups:
|
for mgroup in mgroups:
|
||||||
make_sflogs(mgroup, start_date, end_date)
|
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')
|
Loading…
Reference in New Issue