factory/apps/wpm/tasks.py

115 lines
4.7 KiB
Python

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from apps.utils.tasks import CustomTask
from celery import shared_task
from apps.utils.sql import DbConnection
from server.settings import get_sysconfig
from django.core.cache import cache
from apps.wpm.models import SfLog
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
from django.db.models import F
@shared_task(base=CustomTask)
def make_sflogs_simple(days, state_date:str, end_date:str):
"""
根据班次规则生成今明两天的排班记录
"""
if days:
start_date = datetime.datetime.today()
end_date = start_date + datetime.timedelta(days=days)
else:
start_date = datetime.datetime.strptime(state_date, "%Y-%m-%d").date()
end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d").date()
mgroups = Mgroup.objects.filter(cate='section').all()
for mgroup in mgroups:
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:
total_hour_now = (now-localtime(i.start_time).replace(tzinfo=None)).total_seconds()/3600
sflog.total_hour_now = total_hour_now if total_hour_now > 0 else 0
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:
total_hour_now = (now-localtime(i.start_time).replace(tzinfo=None)).total_seconds()/3600
i.total_hour_now = total_hour_now if total_hour_now > 0 else 0
i.save()
@shared_task(base=CustomTask)
def cal_shut_hour(stlogId: str):
"""
计算停机记录对应的班停时长
"""
from apps.enm.tasks import cal_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()
cal_enstat('sflog')
@shared_task(base=CustomTask)
def cal_enstat_when_pcoal_heat_change(sflogId):
from apps.enm.models import EnStat
from apps.enm.tasks import cal_enstat_pcoal_change, cal_enstat2
sflog = SfLog.objects.get(id=sflogId)
pcoal_heat = sflog.pcoal_heat
year_s, month_s, day_s = sflog.get_ymd
# 只会影响到回转窑及水泥磨数据
enstats = EnStat.objects.filter(mgroup__name='回转窑', year_s=year_s, month_s=month_s, day_s=day_s, type__in = ['hour_s', 'sflog', 'day_s'])
for enstat in enstats:
cal_enstat_pcoal_change(enstat, pcoal_heat)
enstats_other = EnStat.objects.filter(mgroup__name='回转窑', year_s=year_s, month_s=month_s, day_s=day_s, type__in = ['month_st', 'month_s', 'year_s'])
for enstat in enstats_other:
cal_enstat_pcoal_change(enstat, pcoal_heat)
cal_enstat2(year_s, month_s)