feat: hour计数改为sec计数

This commit is contained in:
caoqianming 2024-05-15 10:06:49 +08:00
parent e6fb2c8c72
commit a3f5e48b8c
9 changed files with 126 additions and 17 deletions

View File

@ -0,0 +1,28 @@
# Generated by Django 3.2.12 on 2024-05-15 01:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('enm', '0034_enstat_production_elec_unit'),
]
operations = [
migrations.AddField(
model_name='enstat',
name='run_sec',
field=models.PositiveIntegerField(default=0, help_text='s', verbose_name='运转时长'),
),
migrations.AddField(
model_name='enstat',
name='shut_sec',
field=models.PositiveIntegerField(default=0, help_text='s', verbose_name='停机时长'),
),
migrations.AddField(
model_name='enstat',
name='total_sec_now',
field=models.PositiveIntegerField(default=0, help_text='s', verbose_name='动态总时长'),
),
]

View File

@ -135,6 +135,9 @@ class EnStat(BaseModel):
cen_consume_unit = models.FloatField("单位产品综合能耗", default=0, help_text="kgce/t")
production_hour = models.FloatField("台时产量", default=0, help_text="t/h")
production_elec_unit = models.FloatField("吨熟料发电量", default=0, help_text="kw·h/t")
total_sec_now = models.PositiveIntegerField("动态总时长", default=0, help_text="s")
run_sec = models.PositiveIntegerField("运转时长", default=0, help_text="s")
shut_sec = models.PositiveIntegerField("停机时长", default=0, help_text="s")
total_hour_now = models.FloatField("动态总时长", default=0, help_text="h")
run_hour = models.FloatField("运转时长", default=0, help_text="h")
shut_hour = models.FloatField("停机时长", default=0, help_text="h")

View File

@ -527,14 +527,14 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s,
enstat.save()
# 运转时长相关
if type != "hour_s" and "run_hour" in this_cal_attrs:
enstat.total_hour_now, enstat.shut_hour = get_total_hour_now_and_shut_hour(enstat)
enstat.run_hour = enstat.total_hour_now - enstat.shut_hour
enstat.total_sec_now, enstat.shut_sec = get_total_hour_now_and_shut_hour(enstat)
enstat.run_sec = enstat.total_sec_now - enstat.shut_sec
try:
enstat.run_rate = (enstat.run_hour / enstat.total_hour_now) * 100
enstat.run_rate = (enstat.run_sec / enstat.total_sec_now) * 100
except ZeroDivisionError:
enstat.run_rate = 0
try:
enstat.production_hour = enstat.total_production / enstat.run_hour
enstat.production_hour = enstat.total_production * 3600 / enstat.run_sec
except ZeroDivisionError:
enstat.production_hour = 0
enstat.save()
@ -562,22 +562,22 @@ def get_total_hour_now_and_shut_hour(enstat: EnStat):
# return 1, 0
if enstat.type == "sflog":
sflog = enstat.sflog
return sflog.total_hour_now, sflog.shut_hour
return sflog.total_sec_now, sflog.shut_sec
elif enstat.type == "day_s":
res = SfLog.objects.filter(work_date__year=enstat.year_s, work_date__month=enstat.month_s, work_date__day=enstat.day_s, mgroup=enstat.mgroup).aggregate(
sum1=Sum("total_hour_now"), sum2=Sum("shut_hour")
sum1=Sum("total_sec_now"), sum2=Sum("shut_sec")
)
return res["sum1"] if res["sum1"] else 0, res["sum2"] if res["sum2"] else 0
elif enstat.type == "month_st":
res = SfLog.objects.filter(work_date__year=enstat.year_s, work_date__month=enstat.month_s, mgroup=enstat.mgroup, team=enstat.team).aggregate(
sum1=Sum("total_hour_now"), sum2=Sum("shut_hour")
sum1=Sum("total_sec_now"), sum2=Sum("shut_sec")
)
return res["sum1"] if res["sum1"] else 0, res["sum2"] if res["sum2"] else 0
elif enstat.type == "month_s":
res = SfLog.objects.filter(work_date__year=enstat.year_s, work_date__month=enstat.month_s, mgroup=enstat.mgroup).aggregate(sum1=Sum("total_hour_now"), sum2=Sum("shut_hour"))
res = SfLog.objects.filter(work_date__year=enstat.year_s, work_date__month=enstat.month_s, mgroup=enstat.mgroup).aggregate(sum1=Sum("total_sec_now"), sum2=Sum("shut_sec"))
return res["sum1"] if res["sum1"] else 0, res["sum2"] if res["sum2"] else 0
elif enstat.type == "year_s":
res = SfLog.objects.filter(work_date__year=enstat.year_s, mgroup=enstat.mgroup).aggregate(sum1=Sum("total_hour_now"), sum2=Sum("shut_hour"))
res = SfLog.objects.filter(work_date__year=enstat.year_s, mgroup=enstat.mgroup).aggregate(sum1=Sum("total_sec_now"), sum2=Sum("shut_sec"))
return res["sum1"] if res["sum1"] else 0, res["sum2"] if res["sum2"] else 0

View File

@ -92,7 +92,8 @@ def mgroup_run_change(mgroup: Mgroup, new_run: bool, last_timex: datetime):
if last_timex >= last_stlog.start_time: # 认为是有效信号
if last_stlog.end_time is None and new_run: # 从停到开
last_stlog.end_time = last_timex
last_stlog.duration = (last_stlog.end_time - last_stlog.start_time).total_seconds() / 3600
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()
cal_exp_duration_hour(last_stlog.id) # 触发时间分配
elif last_stlog.end_time and new_run is False and last_timex > last_stlog.end_time: # 从开到停

View File

@ -0,0 +1,38 @@
# Generated by Django 3.2.12 on 2024-05-15 01:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wpm', '0043_alter_stlog_unique_together'),
]
operations = [
migrations.AddField(
model_name='sflog',
name='shut_sec',
field=models.PositiveIntegerField(default=0, verbose_name='停机时长'),
),
migrations.AddField(
model_name='sflog',
name='total_sec',
field=models.PositiveIntegerField(default=43200, verbose_name='总时长'),
),
migrations.AddField(
model_name='sflog',
name='total_sec_now',
field=models.PositiveIntegerField(default=0, verbose_name='总时长动'),
),
migrations.AddField(
model_name='sflogexp',
name='duration_sec',
field=models.PositiveIntegerField(default=0, verbose_name='持续时长(s)'),
),
migrations.AddField(
model_name='stlog',
name='duration_sec',
field=models.PositiveIntegerField(default=0, verbose_name='持续时长(s)'),
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.12 on 2024-05-15 02:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wpm', '0044_auto_20240515_0949'),
]
operations = [
migrations.AlterField(
model_name='sflogexp',
name='duration_sec',
field=models.PositiveIntegerField(blank=True, null=True, verbose_name='持续时长(s)'),
),
migrations.AlterField(
model_name='stlog',
name='duration_sec',
field=models.PositiveIntegerField(blank=True, null=True, verbose_name='持续时长(s)'),
),
]

View File

@ -29,6 +29,9 @@ class SfLog(CommonADModel):
stlogs = models.ManyToManyField(
'wpm.stlog', verbose_name='关联异常记录', through='wpm.sflogexp', related_name='sflog_stlogs')
last_test_time = models.DateTimeField('最后质检时间', null=True, blank=True)
total_sec_now = models.PositiveIntegerField('总时长动', default=0)
total_sec = models.PositiveIntegerField('总时长', default=43200)
shut_sec = models.PositiveIntegerField('停机时长', default=0)
total_hour_now = models.FloatField('总时长动', default=0)
total_hour = models.FloatField('总时长', default=12)
shut_hour = models.FloatField('停机时长', default=0)
@ -59,6 +62,7 @@ class StLog(CommonADModel):
'wpm.sflog', verbose_name='关联所有当班', through='wpm.sflogexp', related_name='stlog_sflogs')
start_time = models.DateTimeField('发生时间')
end_time = models.DateTimeField('结束时间', null=True, blank=True)
duration_sec = models.PositiveIntegerField('持续时长(s)', null=True, blank=True)
duration = models.FloatField('持续时间(h)', null=True, blank=True)
cate = models.CharField('原因类别', max_length=10, null=True, blank=True)
reason = models.TextField('事件原因', default='', max_length=100)
@ -79,6 +83,7 @@ class SfLogExp(CommonADModel):
stlog = models.ForeignKey(
StLog, verbose_name='关联异常记录', on_delete=models.CASCADE)
duration = models.FloatField('持续时长(h)', null=True, blank=True)
duration_sec = models.PositiveIntegerField('持续时长(s)', null=True, blank=True)
note = models.TextField('处理备注', default='', blank=True)

View File

@ -43,8 +43,8 @@ def make_sflogs(mgroup: Mgroup, start_date: datetime.date, end_date: datetime.da
end_time += datetime.timedelta(days=1)
else:
start_time -= datetime.timedelta(days=1)
duration = end_time - start_time
total_hour = duration.total_seconds() / 3600
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={
"mgroup": mgroup,
"shift": shift,
@ -53,6 +53,8 @@ def make_sflogs(mgroup: Mgroup, start_date: datetime.date, end_date: datetime.da
"end_time": end_time,
"total_hour_now": total_hour,
"total_hour": total_hour,
"total_sec_now": total_sec,
"total_sec": total_sec,
"create_by": create_by
})
current_date = current_date + datetime.timedelta(days=1)

View File

@ -42,18 +42,23 @@ def get_total_hour_now(sflogId: str=''):
sflog = SfLog.objects.get(id=sflogId)
if sflog.end_time <= now:
sflog.total_hour_now = sflog.total_hour
sflog.total_sec_now = sflog.total_sec
else:
total_hour_now = (now-sflog.start_time).total_seconds()/3600
sflog.total_hour_now = total_hour_now if total_hour_now > 0 else 0
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_hour_now = total_sec_now/3600 if total_sec_now > 0 else 0
sflog.save()
return sflog.total_hour_now
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(
total_sec_now=F('total_sec')).update(total_sec_now=F('total_sec'))
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
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_hour_now = total_sec_now/3600 if total_sec_now > 0 else 0
i.save()
@ -94,16 +99,20 @@ def cal_exp_duration_hour(stlogId: str='', all=False):
total_seconds = duration_item_delta.total_seconds()
if total_seconds < 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()
if is_shutdown_stlog:
# 计算每班的总停机时间
ret = SfLogExp.objects.filter(
sflog=sflog, stlog__is_shutdown=True).aggregate(sum=Sum('duration'))
sflog=sflog, stlog__is_shutdown=True).aggregate(sum=Sum('duration'), sum1=Sum('duration_sec'))
if ret.get('sum', 0):
sflog.shut_hour = ret['sum']
sflog.shut_sec = ret['sum1']
sflog.save()
# 更新sflog总时长
if sflog.end_time > now: