# 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, SfLogExp from django.utils import timezone 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 = timezone.now() if sflogId: sflog = SfLog.objects.get(id=sflogId) if sflog.end_time <= now: sflog.total_hour_now = 12 else: total_hour_now = (now-i.start_time).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-i.start_time).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) now = timezone.now() for stlog in stlogs: st_start = stlog.start_time if st_start >= now: break 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 sflogexp, _ = SfLogExp.objects.get_or_create(stlog=stlog, sflog=sflog, defaults={'stlog': stlog, 'sflog': sflog, 'is_current_down': is_current_down, 'title': '停机'}) # 计算duration sf_end, sf_start = sflog.end_time, sflog.start_time duration_item_delta = min(sf_end, st_end) - max(sf_start, st_start) total_seconds = duration_item_delta.total_seconds() if total_seconds < 0: duration_item = 0 else: duration_item = total_seconds/3600 sflogexp.duration = duration_item sflogexp.save() # 计算每班的总停机时间 ret = SfLogExp.objects.filter(sflog=sflog).exclude(stlog=None).aggregate(sum=Sum('duration')) if ret.get('sum', 0): sflog.shut_hour = ret['sum'] sflog.save() # 更新sflog总时长 if sflog.end_time > now: get_total_hour_now(sflog.id) if stlogId: cal_enstat('sflog', sflog.id, sflog.mgroup.id, None, None, None, None, None, None, None, cascade=True, cal_attrs=['run_hour']) @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, type__in = ['month_st', 'month_s'])|EnStat.objects.filter(mgroup__name='回转窑', year_s=year_s, type__in = ['year_s']) for enstat in enstats_other: cal_enstat_pcoal_change(enstat, pcoal_heat) cal_enstat2('day_s', year_s, month_s, day_s) @shared_task(base=CustomTask) def cal_enstat_when_team_change(sflogId): from apps.enm.tasks import cal_enstat sflog = SfLog.objects.get(id=sflogId) cal_enstat('month_st', sflogId, sflog.mgroup.id, None, None, None, None, None, None, None, False, [])