diff --git a/apps/enm/migrations/0035_auto_20240515_0949.py b/apps/enm/migrations/0035_auto_20240515_0949.py new file mode 100644 index 00000000..ed65c097 --- /dev/null +++ b/apps/enm/migrations/0035_auto_20240515_0949.py @@ -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='动态总时长'), + ), + ] diff --git a/apps/enm/models.py b/apps/enm/models.py index 0eb596e1..f61f228b 100644 --- a/apps/enm/models.py +++ b/apps/enm/models.py @@ -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") diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index c73ba2cb..b6e6797b 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -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 diff --git a/apps/mtm/services.py b/apps/mtm/services.py index 14d3cf90..b1b1541f 100644 --- a/apps/mtm/services.py +++ b/apps/mtm/services.py @@ -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: # 从开到停 diff --git a/apps/wpm/migrations/0044_auto_20240515_0949.py b/apps/wpm/migrations/0044_auto_20240515_0949.py new file mode 100644 index 00000000..7ca67dc6 --- /dev/null +++ b/apps/wpm/migrations/0044_auto_20240515_0949.py @@ -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)'), + ), + ] diff --git a/apps/wpm/migrations/0045_auto_20240515_1001.py b/apps/wpm/migrations/0045_auto_20240515_1001.py new file mode 100644 index 00000000..7d1e2a93 --- /dev/null +++ b/apps/wpm/migrations/0045_auto_20240515_1001.py @@ -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)'), + ), + ] diff --git a/apps/wpm/models.py b/apps/wpm/models.py index 098f7b13..7503e526 100644 --- a/apps/wpm/models.py +++ b/apps/wpm/models.py @@ -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) diff --git a/apps/wpm/services.py b/apps/wpm/services.py index 4dab0779..6a5004d8 100644 --- a/apps/wpm/services.py +++ b/apps/wpm/services.py @@ -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) diff --git a/apps/wpm/tasks.py b/apps/wpm/tasks.py index 6573c45d..2e57f5b9 100644 --- a/apps/wpm/tasks.py +++ b/apps/wpm/tasks.py @@ -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: