feat: hour计数改为sec计数 步骤2
This commit is contained in:
parent
8753994468
commit
b4b3d6eadc
|
@ -593,6 +593,6 @@ class TestViewSet(CustomGenericViewSet):
|
||||||
|
|
||||||
@action(methods=['post'], detail=False, serializer_class=Serializer, permission_classes=[])
|
@action(methods=['post'], detail=False, serializer_class=Serializer, permission_classes=[])
|
||||||
def test_cal(self, request, pk=None):
|
def test_cal(self, request, pk=None):
|
||||||
from apps.wpm.tasks import cal_exp_duration_hour
|
from apps.wpm.tasks import cal_exp_duration_sec
|
||||||
cal_exp_duration_hour('3397169058570170368')
|
cal_exp_duration_sec('3397169058570170368')
|
||||||
return Response()
|
return Response()
|
||||||
|
|
|
@ -123,6 +123,8 @@ class EnStatSerializer(CustomModelSerializer):
|
||||||
|
|
||||||
def to_representation(self, instance):
|
def to_representation(self, instance):
|
||||||
ret = super().to_representation(instance)
|
ret = super().to_representation(instance)
|
||||||
|
if 'run_sec' in ret:
|
||||||
|
ret['run_hour'] = ret['run_sec'] / 3600
|
||||||
my_dic_keys = list(ret.keys())
|
my_dic_keys = list(ret.keys())
|
||||||
for key in my_dic_keys:
|
for key in my_dic_keys:
|
||||||
ret_one_val = ret[key]
|
ret_one_val = ret[key]
|
||||||
|
|
|
@ -23,7 +23,7 @@ from apps.third.king.k import kingClient
|
||||||
from apps.third.king.king_api import kapis
|
from apps.third.king.king_api import kapis
|
||||||
from apps.enm.services import insert_mplogx_from_king_rest_chunk, MpointCache
|
from apps.enm.services import insert_mplogx_from_king_rest_chunk, MpointCache
|
||||||
from django.utils.timezone import localtime
|
from django.utils.timezone import localtime
|
||||||
from apps.wpm.tasks import get_total_hour_now, cal_exp_duration_hour
|
from apps.wpm.tasks import get_total_sec_now, cal_exp_duration_sec
|
||||||
|
|
||||||
myLogger = logging.getLogger("log")
|
myLogger = logging.getLogger("log")
|
||||||
|
|
||||||
|
@ -241,8 +241,8 @@ 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_hour_now() # 先处理total_hour_now
|
get_total_sec_now() # 先处理total_hour_now
|
||||||
cal_exp_duration_hour() # 再处理shut_hour
|
cal_exp_duration_sec() # 再处理shut_hour
|
||||||
|
|
||||||
# 开始计算enstat
|
# 开始计算enstat
|
||||||
mgroups = Mgroup.objects.filter(need_enm=True).order_by("sort")
|
mgroups = Mgroup.objects.filter(need_enm=True).order_by("sort")
|
||||||
|
@ -527,7 +527,7 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s,
|
||||||
enstat.save()
|
enstat.save()
|
||||||
# 运转时长相关
|
# 运转时长相关
|
||||||
if type != "hour_s" and "run_hour" in this_cal_attrs:
|
if type != "hour_s" and "run_hour" in this_cal_attrs:
|
||||||
enstat.total_sec_now, enstat.shut_sec = get_total_hour_now_and_shut_hour(enstat)
|
enstat.total_sec_now, enstat.shut_sec = get_total_sec_now_and_shut_sec(enstat)
|
||||||
enstat.run_sec = enstat.total_sec_now - enstat.shut_sec
|
enstat.run_sec = enstat.total_sec_now - enstat.shut_sec
|
||||||
try:
|
try:
|
||||||
enstat.run_rate = (enstat.run_sec / enstat.total_sec_now) * 100
|
enstat.run_rate = (enstat.run_sec / enstat.total_sec_now) * 100
|
||||||
|
@ -542,7 +542,7 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s,
|
||||||
return year_s, month_s, day_s # 返回这个值主要为了全厂数据计算而用
|
return year_s, month_s, day_s # 返回这个值主要为了全厂数据计算而用
|
||||||
|
|
||||||
|
|
||||||
def get_total_hour_now_and_shut_hour(enstat: EnStat):
|
def get_total_sec_now_and_shut_sec(enstat: EnStat):
|
||||||
from apps.wpm.models import SfLog
|
from apps.wpm.models import SfLog
|
||||||
|
|
||||||
# if enstat.type == 'hour_s':
|
# if enstat.type == 'hour_s':
|
||||||
|
|
|
@ -7,7 +7,7 @@ from apps.utils.tools import ranstr
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from apps.wpm.models import StLog
|
from apps.wpm.models import StLog
|
||||||
from apps.wpm.services import get_sflog
|
from apps.wpm.services import get_sflog
|
||||||
from apps.wpm.tasks import cal_exp_duration_hour
|
from apps.wpm.tasks import cal_exp_duration_sec
|
||||||
|
|
||||||
|
|
||||||
def get_mgroup_goals(mgroupId, year, reload=False):
|
def get_mgroup_goals(mgroupId, year, reload=False):
|
||||||
|
@ -93,9 +93,8 @@ def mgroup_run_change(mgroup: Mgroup, new_run: bool, last_timex: datetime):
|
||||||
if last_stlog.end_time is None and new_run: # 从停到开
|
if last_stlog.end_time is None and new_run: # 从停到开
|
||||||
last_stlog.end_time = last_timex
|
last_stlog.end_time = last_timex
|
||||||
last_stlog.duration_sec = (last_stlog.end_time - last_stlog.start_time).total_seconds()
|
last_stlog.duration_sec = (last_stlog.end_time - last_stlog.start_time).total_seconds()
|
||||||
last_stlog.duration = last_stlog.duration_sec / 3600
|
|
||||||
last_stlog.save()
|
last_stlog.save()
|
||||||
cal_exp_duration_hour(last_stlog.id) # 触发时间分配
|
cal_exp_duration_sec(last_stlog.id) # 触发时间分配
|
||||||
elif last_stlog.end_time and new_run is False and last_timex > last_stlog.end_time: # 从开到停
|
elif last_stlog.end_time and new_run is False and last_timex > last_stlog.end_time: # 从开到停
|
||||||
StLog.objects.create(title="停机", is_shutdown=True, mgroup=mgroup, end_time=None, start_time=last_timex, sflog=get_sflog(mgroup, last_timex))
|
StLog.objects.create(title="停机", is_shutdown=True, mgroup=mgroup, end_time=None, start_time=last_timex, sflog=get_sflog(mgroup, last_timex))
|
||||||
elif new_run is False:
|
elif new_run is False:
|
||||||
|
|
|
@ -8,7 +8,7 @@ from .models import SfLog, StLog, SfLogExp, WMaterial, Mlog, Handover, Mlogb, At
|
||||||
from apps.system.models import Dept, User
|
from apps.system.models import Dept, User
|
||||||
from apps.system.serializers import UserSimpleSerializer
|
from apps.system.serializers import UserSimpleSerializer
|
||||||
from apps.pm.models import Mtask
|
from apps.pm.models import Mtask
|
||||||
from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change, cal_exp_duration_hour
|
from apps.wpm.tasks import cal_enstat_when_pcoal_heat_change, cal_enstat_when_team_change, cal_exp_duration_sec
|
||||||
from apps.wpm.services import get_sflog
|
from apps.wpm.services import get_sflog
|
||||||
from apps.mtm.models import Mgroup, TeamMember, Shift, Material
|
from apps.mtm.models import Mgroup, TeamMember, Shift, Material
|
||||||
from apps.mtm.serializers import MaterialSimpleSerializer
|
from apps.mtm.serializers import MaterialSimpleSerializer
|
||||||
|
@ -63,7 +63,7 @@ class StLogSerializer(CustomModelSerializer):
|
||||||
current_note = validated_data.pop('current_note', '')
|
current_note = validated_data.pop('current_note', '')
|
||||||
instance = super().update(instance, validated_data)
|
instance = super().update(instance, validated_data)
|
||||||
if end_time: # 需要把涉及到的sflog都拉入
|
if end_time: # 需要把涉及到的sflog都拉入
|
||||||
cal_exp_duration_hour(instance.id)
|
cal_exp_duration_sec(instance.id)
|
||||||
try:
|
try:
|
||||||
sflogexp = SfLogExp.objects.get(
|
sflogexp = SfLogExp.objects.get(
|
||||||
stlog=instance.stlog, sflog=current_sflog)
|
stlog=instance.stlog, sflog=current_sflog)
|
||||||
|
@ -83,8 +83,8 @@ class StLogSerializer(CustomModelSerializer):
|
||||||
if end_time > now:
|
if end_time > now:
|
||||||
raise ParseError('开始时间应为历史时间')
|
raise ParseError('开始时间应为历史时间')
|
||||||
if end_time > start_time:
|
if end_time > start_time:
|
||||||
attrs['duration'] = (
|
attrs['duration_sec'] = (
|
||||||
end_time - start_time).total_seconds() / 3600
|
end_time - start_time).total_seconds()
|
||||||
else:
|
else:
|
||||||
raise ParseError('结束时间应大于开始时间')
|
raise ParseError('结束时间应大于开始时间')
|
||||||
return super().validate(attrs)
|
return super().validate(attrs)
|
||||||
|
|
|
@ -44,15 +44,12 @@ def make_sflogs(mgroup: Mgroup, start_date: datetime.date, end_date: datetime.da
|
||||||
else:
|
else:
|
||||||
start_time -= datetime.timedelta(days=1)
|
start_time -= datetime.timedelta(days=1)
|
||||||
total_sec = (end_time - start_time).total_seconds()
|
total_sec = (end_time - start_time).total_seconds()
|
||||||
total_hour = total_sec / 3600
|
|
||||||
SfLog.objects.get_or_create(mgroup=mgroup, shift=shift, start_time=start_time, defaults={
|
SfLog.objects.get_or_create(mgroup=mgroup, shift=shift, start_time=start_time, defaults={
|
||||||
"mgroup": mgroup,
|
"mgroup": mgroup,
|
||||||
"shift": shift,
|
"shift": shift,
|
||||||
"work_date": current_date,
|
"work_date": current_date,
|
||||||
"start_time": start_time,
|
"start_time": start_time,
|
||||||
"end_time": end_time,
|
"end_time": end_time,
|
||||||
"total_hour_now": total_hour,
|
|
||||||
"total_hour": total_hour,
|
|
||||||
"total_sec_now": total_sec,
|
"total_sec_now": total_sec,
|
||||||
"total_sec": total_sec,
|
"total_sec": total_sec,
|
||||||
"create_by": create_by
|
"create_by": create_by
|
||||||
|
|
|
@ -32,38 +32,33 @@ def make_sflogs_simple(days, state_date: str, end_date: str):
|
||||||
|
|
||||||
|
|
||||||
@shared_task(base=CustomTask)
|
@shared_task(base=CustomTask)
|
||||||
def get_total_hour_now(sflogId: str=''):
|
def get_total_sec_now(sflogId: str=''):
|
||||||
"""
|
"""
|
||||||
获取当前总时长, 当传入的是一个sflog时, 返回其total_hour_now
|
获取当前总时长, 当传入的是一个sflog时, 返回其total_sec_now
|
||||||
否则更新所有total_hour_now
|
否则更新所有total_sec_now
|
||||||
"""
|
"""
|
||||||
now = timezone.now()
|
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:
|
||||||
sflog.total_hour_now = sflog.total_hour
|
|
||||||
sflog.total_sec_now = sflog.total_sec
|
sflog.total_sec_now = sflog.total_sec
|
||||||
else:
|
else:
|
||||||
total_sec_now = (now-sflog.start_time).total_seconds()
|
total_sec_now = (now-sflog.start_time).total_seconds()
|
||||||
sflog.total_sec_now = total_sec_now if total_sec_now > 0 else 0
|
sflog.total_sec_now = total_sec_now if total_sec_now > 0 else 0
|
||||||
sflog.total_hour_now = total_sec_now/3600 if total_sec_now > 0 else 0
|
|
||||||
sflog.save()
|
sflog.save()
|
||||||
return sflog.total_hour_now
|
return sflog.total_sec_now
|
||||||
else:
|
else:
|
||||||
SfLog.objects.filter(end_time__lte=now).exclude(
|
|
||||||
total_hour_now=F('total_hour')).update(total_hour_now=F('total_hour'))
|
|
||||||
SfLog.objects.filter(end_time__lte=now).exclude(
|
SfLog.objects.filter(end_time__lte=now).exclude(
|
||||||
total_sec_now=F('total_sec')).update(total_sec_now=F('total_sec'))
|
total_sec_now=F('total_sec')).update(total_sec_now=F('total_sec'))
|
||||||
sf_qs = SfLog.objects.filter(end_time__gt=now)
|
sf_qs = SfLog.objects.filter(end_time__gt=now)
|
||||||
for i in sf_qs:
|
for i in sf_qs:
|
||||||
total_sec_now = (now-i.start_time).total_seconds()
|
total_sec_now = (now-i.start_time).total_seconds()
|
||||||
i.total_sec_now = total_sec_now if total_sec_now > 0 else 0
|
i.total_sec_now = total_sec_now if total_sec_now > 0 else 0
|
||||||
i.total_hour_now = total_sec_now/3600 if total_sec_now > 0 else 0
|
|
||||||
i.save()
|
i.save()
|
||||||
|
|
||||||
|
|
||||||
@shared_task(base=CustomTask)
|
@shared_task(base=CustomTask)
|
||||||
def cal_exp_duration_hour(stlogId: str='', all=False):
|
def cal_exp_duration_sec(stlogId: str='', all=False):
|
||||||
"""
|
"""
|
||||||
计算异常记录对应的每班持续时间
|
计算异常记录对应的每班持续时间
|
||||||
"""
|
"""
|
||||||
|
@ -97,26 +92,18 @@ def cal_exp_duration_hour(stlogId: str='', all=False):
|
||||||
sf_end, sf_start = sflog.end_time, sflog.start_time
|
sf_end, sf_start = sflog.end_time, sflog.start_time
|
||||||
duration_item_delta = min(sf_end, st_end) - max(sf_start, st_start)
|
duration_item_delta = min(sf_end, st_end) - max(sf_start, st_start)
|
||||||
total_seconds = duration_item_delta.total_seconds()
|
total_seconds = duration_item_delta.total_seconds()
|
||||||
if total_seconds < 0:
|
sflogexp.duration_sec = total_seconds if total_seconds > 0 else 0
|
||||||
duration_item = 0
|
|
||||||
duration_item_sec = 0
|
|
||||||
else:
|
|
||||||
duration_item_sec = total_seconds
|
|
||||||
duration_item = total_seconds/3600
|
|
||||||
sflogexp.duration = duration_item
|
|
||||||
sflogexp.duration_sec = duration_item_sec
|
|
||||||
sflogexp.save()
|
sflogexp.save()
|
||||||
if is_shutdown_stlog:
|
if is_shutdown_stlog:
|
||||||
# 计算每班的总停机时间
|
# 计算每班的总停机时间
|
||||||
ret = SfLogExp.objects.filter(
|
ret = SfLogExp.objects.filter(
|
||||||
sflog=sflog, stlog__is_shutdown=True).aggregate(sum=Sum('duration'), sum1=Sum('duration_sec'))
|
sflog=sflog, stlog__is_shutdown=True).aggregate(sum=Sum('duration_sec'))
|
||||||
if ret.get('sum', 0):
|
if ret.get('sum', 0):
|
||||||
sflog.shut_hour = ret['sum']
|
sflog.shut_sec = ret['sum']
|
||||||
sflog.shut_sec = ret['sum1']
|
|
||||||
sflog.save()
|
sflog.save()
|
||||||
# 更新sflog总时长
|
# 更新sflog总时长
|
||||||
if sflog.end_time > now:
|
if sflog.end_time > now:
|
||||||
get_total_hour_now(sflog.id)
|
get_total_sec_now(sflog.id)
|
||||||
# if stlogId:
|
# if stlogId:
|
||||||
# cal_enstat('sflog', sflog.id, sflog.mgroup.id, None, None, None,
|
# cal_enstat('sflog', sflog.id, sflog.mgroup.id, None, None, None,
|
||||||
# None, None, None, None, cascade=True, cal_attrs=['run_hour'])
|
# None, None, None, None, cascade=True, cal_attrs=['run_hour'])
|
||||||
|
|
Loading…
Reference in New Issue