fix: get_total_sec_now及cal_exp_duration_sec 添加now参数

This commit is contained in:
caoqianming 2024-08-02 13:50:05 +08:00
parent 313e9ed1cd
commit dc7e6f9d03
2 changed files with 28 additions and 23 deletions

View File

@ -4,7 +4,7 @@ from apps.utils.tasks import CustomTask
from celery import shared_task from celery import shared_task
from apps.enm.models import MpLogx, Mpoint, MpointStat, EnStat, EnStat2 from apps.enm.models import MpLogx, Mpoint, MpointStat, EnStat, EnStat2
from apps.wpm.models import SfLog from apps.wpm.models import SfLog
import datetime from datetime import datetime, timedelta
from django.db.models import Sum, Avg from django.db.models import Sum, Avg
from dateutil import tz from dateutil import tz
from django.conf import settings from django.conf import settings
@ -33,8 +33,8 @@ myLogger = logging.getLogger("log")
def get_current_and_previous_time(): def get_current_and_previous_time():
now = datetime.datetime.now() now = datetime.now()
pre = now - datetime.timedelta(hours=1) pre = now - timedelta(hours=1)
return now, pre return now, pre
@ -84,15 +84,15 @@ def cal_mpointstats_duration(start_time: str, end_time: str, m_code_list=[], cal
重跑某一段时间的任务 重跑某一段时间的任务
""" """
mytz = tz.gettz(settings.TIME_ZONE) mytz = tz.gettz(settings.TIME_ZONE)
start_time = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S") start_time = datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
start_time.replace(tzinfo=mytz) start_time.replace(tzinfo=mytz)
end_time = datetime.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S") end_time = datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S")
start_time.replace(tzinfo=mytz) start_time.replace(tzinfo=mytz)
current_time = start_time current_time = start_time
while current_time <= end_time: while current_time <= end_time:
year, month, day, hour = current_time.year, current_time.month, current_time.day, current_time.hour year, month, day, hour = current_time.year, current_time.month, current_time.day, current_time.hour
cal_mpointstats(0, year, month, day, hour, m_code_list, cal_attrs=[]) cal_mpointstats(0, year, month, day, hour, m_code_list, cal_attrs=[])
current_time += datetime.timedelta(hours=1) current_time += timedelta(hours=1)
@shared_task(base=CustomTask) @shared_task(base=CustomTask)
@ -102,9 +102,9 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in
""" """
mpoint = Mpoint.objects.get(id=mpointId) mpoint = Mpoint.objects.get(id=mpointId)
mytz = tz.gettz(settings.TIME_ZONE) mytz = tz.gettz(settings.TIME_ZONE)
dt = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=0, second=0, tzinfo=mytz) # 整点时间 dt = datetime(year=year, month=month, day=day, hour=hour, minute=0, second=0, tzinfo=mytz) # 整点时间
dt_hour_p= dt - datetime.timedelta(hours=1) # 上个整点 dt_hour_p= dt - timedelta(hours=1) # 上个整点
dt_hour_n= dt + datetime.timedelta(hours=1) # 下个整点 dt_hour_n= dt + timedelta(hours=1) # 下个整点
if mpoint.material and mpoint.val_type in ['float', 'int']: # 如果计量的是物料 # 累计量 有的会清零,需要额外处理(还未做) if mpoint.material and mpoint.val_type in ['float', 'int']: # 如果计量的是物料 # 累计量 有的会清零,需要额外处理(还未做)
params = {"mpoint": mpoint, "type": "hour"} params = {"mpoint": mpoint, "type": "hour"}
params["year"], params["month"], params["day"], params["hour"] = year, month, day, hour params["year"], params["month"], params["day"], params["hour"] = year, month, day, hour
@ -254,8 +254,11 @@ def cal_mpointstats(is_now=1, year=None, month=None, day=None, hour=None, m_code
cal_mpointstat_hour(item.id, year, month, day, hour) cal_mpointstat_hour(item.id, year, month, day, hour)
# 先调整一下班时间,以防计算错误 # 先调整一下班时间,以防计算错误
get_total_sec_now() # 先处理total_sec # 为了保持一致使用统计的时间点
cal_exp_duration_sec() # 再处理shut_sec nowx = datetime.now()
get_total_sec_now(now=nowx) # 再处理total_sec
cal_exp_duration_sec(now=nowx) # 先处理shut_sec
# 开始计算enstat # 开始计算enstat
mgroups = Mgroup.objects.filter(need_enm=True).order_by("sort") mgroups = Mgroup.objects.filter(need_enm=True).order_by("sort")
@ -360,7 +363,7 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s,
sflog = SfLog.objects.get(id=sflogId) sflog = SfLog.objects.get(id=sflogId)
elif year and month and day and hour is not None: elif year and month and day and hour is not None:
mytz = tz.gettz(settings.TIME_ZONE) mytz = tz.gettz(settings.TIME_ZONE)
dt = datetime.datetime(year=year, month=month, day=day, hour=hour, tzinfo=mytz) dt = datetime(year=year, month=month, day=day, hour=hour, tzinfo=mytz)
sflog = get_sflog(mgroup, dt) sflog = get_sflog(mgroup, dt)
team = None team = None
if sflog: if sflog:
@ -594,8 +597,8 @@ def get_total_sec_now_and_shut_sec(enstat: EnStat):
# if enstat.type == 'hour_s': # if enstat.type == 'hour_s':
# # 找到停机记录,并划分到该小时 # # 找到停机记录,并划分到该小时
# end_time = datetime.datetime(enstat.year, enstat.month, enstat.day, enstat.hour) # end_time = datetime(enstat.year, enstat.month, enstat.day, enstat.hour)
# start_time = end_time - datetime.timedelta(hours=1) # start_time = end_time - timedelta(hours=1)
# sts = StLog.objects.filter(mgroup=enstat.mgroup) # sts = StLog.objects.filter(mgroup=enstat.mgroup)
# sts = (sts.filter(start_time__gt=start_time, start_time__lt=end_time)|sts.filter(start_time__lt=start_time, end_time=None)|sts.filter(end_time__gt=start_time, end_time__lt=end_time)).distinct() # sts = (sts.filter(start_time__gt=start_time, start_time__lt=end_time)|sts.filter(start_time__lt=start_time, end_time=None)|sts.filter(end_time__gt=start_time, end_time__lt=end_time)).distinct()
# shut_hour = 0 # shut_hour = 0

View File

@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
from apps.utils.tasks import CustomTask from apps.utils.tasks import CustomTask
from celery import shared_task from celery import shared_task
from apps.mtm.models import Mgroup from apps.mtm.models import Mgroup
import datetime from datetime import datetime, timedelta
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, SfLogExp from apps.wpm.models import SfLog, StLog, SfLogExp
@ -18,23 +18,24 @@ def make_sflogs_simple(days, state_date: str, end_date: str):
根据班次规则生成今明两天的排班记录 根据班次规则生成今明两天的排班记录
""" """
if days: if days:
start_date = datetime.datetime.today() start_date = datetime.today()
end_date = start_date + datetime.timedelta(days=days) end_date = start_date + timedelta(days=days)
else: else:
start_date = datetime.datetime.strptime(state_date, "%Y-%m-%d").date() start_date = datetime.strptime(state_date, "%Y-%m-%d").date()
end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d").date() end_date = datetime.strptime(end_date, "%Y-%m-%d").date()
mgroups = Mgroup.objects.filter(need_enm=True, cate='section').all() mgroups = Mgroup.objects.filter(need_enm=True, 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) @shared_task(base=CustomTask)
def get_total_sec_now(sflogId: str=''): def get_total_sec_now(sflogId: str='', now: datetime=None):
""" """
获取当前总时长, 当传入的是一个sflog时, 返回其total_sec_now 获取当前总时长, 当传入的是一个sflog时, 返回其total_sec_now
否则更新所有total_sec_now 否则更新所有total_sec_now
""" """
now = timezone.now() if now is None:
now = timezone.now()
if sflogId: if sflogId:
sflog = SfLog.objects.get(id=sflogId) sflog = SfLog.objects.get(id=sflogId)
if sflog.end_time <= now: if sflog.end_time <= now:
@ -55,7 +56,7 @@ def get_total_sec_now(sflogId: str=''):
@shared_task(base=CustomTask) @shared_task(base=CustomTask)
def cal_exp_duration_sec(stlogId: str='', all=False): def cal_exp_duration_sec(stlogId: str='', all=False, now: datetime=None):
""" """
计算异常记录对应的每班持续时间(只针对工段) 计算异常记录对应的每班持续时间(只针对工段)
""" """
@ -66,7 +67,8 @@ def cal_exp_duration_sec(stlogId: str='', all=False):
stlogs = StLog.objects.all() stlogs = StLog.objects.all()
else: # 不传就默认更新未结束的 else: # 不传就默认更新未结束的
stlogs = StLog.objects.filter(end_time=None) stlogs = StLog.objects.filter(end_time=None)
now = timezone.now() if now is None:
now = timezone.now()
for stlog in stlogs: for stlog in stlogs:
is_shutdown_stlog = True is_shutdown_stlog = True
if stlog.is_shutdown is False: if stlog.is_shutdown is False: