diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index 29a8cf5d..2d7ec73d 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -99,7 +99,7 @@ def cal_mpointstats_duration(start_time: str, end_time: str, m_code_list=[], cal @shared_task(base=CustomTask) -def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: int): +def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: int, cascade=True, sflog_hours=[]): """ 计算某一测点, 某一时间点某一小时的统计值 """ @@ -135,23 +135,26 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in ms.save() # 更新更高级别的值 - sum_dict_day = MpointStat.objects.filter(type="hour", mpoint=mpoint, year=year, month=month, day=day).aggregate(sum=Sum("val")) - params_day = {"type": "day", "mpoint": mpoint, "year": year, "month": month, "day": day} - ms_day, _ = MpointStat.objects.get_or_create(**params_day, defaults=params_day) - ms_day.val = sum_dict_day["sum"] - ms_day.save() + if cascade or hour == 23: + sum_dict_day = MpointStat.objects.filter(type="hour", mpoint=mpoint, year=year, month=month, day=day).aggregate(sum=Sum("val")) + params_day = {"type": "day", "mpoint": mpoint, "year": year, "month": month, "day": day} + ms_day, _ = MpointStat.objects.get_or_create(**params_day, defaults=params_day) + ms_day.val = sum_dict_day.get('sum', 0) + ms_day.save() - sum_dict_month = MpointStat.objects.filter(type="day", mpoint=mpoint, year=year, month=month).aggregate(sum=Sum("val")) - params_month = {"type": "month", "mpoint": mpoint, "year": year, "month": month} - ms_month, _ = MpointStat.objects.get_or_create(**params_month, defaults=params_month) - ms_month.val = sum_dict_month["sum"] - ms_month.save() + if cascade or day in [28, 29, 30, 31]: + sum_dict_month = MpointStat.objects.filter(type="day", mpoint=mpoint, year=year, month=month).aggregate(sum=Sum("val")) + params_month = {"type": "month", "mpoint": mpoint, "year": year, "month": month} + ms_month, _ = MpointStat.objects.get_or_create(**params_month, defaults=params_month) + ms_month.val = sum_dict_month.get('sum', 0) + ms_month.save() - sum_dict_year = MpointStat.objects.filter(type="month", mpoint=mpoint, year=year).aggregate(sum=Sum("val")) - params_year = {"type": "year", "mpoint": mpoint, "year": year} - ms_year, _ = MpointStat.objects.get_or_create(**params_year, defaults=params_year) - ms_year.val = sum_dict_year["sum"] - ms_year.save() + if cascade or month == 12: + sum_dict_year = MpointStat.objects.filter(type="month", mpoint=mpoint, year=year).aggregate(sum=Sum("val")) + params_year = {"type": "year", "mpoint": mpoint, "year": year} + ms_year, _ = MpointStat.objects.get_or_create(**params_year, defaults=params_year) + ms_year.val = sum_dict_year.get('sum', 0) + ms_year.save() mgroup = mpoint.mgroup if mgroup: @@ -181,7 +184,7 @@ def cal_mpointstat_hour(mpointId: str, year: int, month: int, day: int, hour: in sum_dict_sflog_s = MpointStat.objects.filter(type="hour_s", mpoint=mpoint, year_s=year_s, month_s=month_s, day_s=day_s, sflog=sflog).aggregate(sum=Sum("val")) params_sflog_s = {"type": "sflog", "mpoint": mpoint, "sflog": sflog, "year_s": year_s, "month_s": month_s, "day_s": day_s, "mgroup": mgroup} ms_sflog_s, _ = MpointStat.objects.get_or_create(**params_sflog_s, defaults=params_sflog_s) - ms_sflog_s.val = sum_dict_sflog_s["sum"] + ms_sflog_s.val = sum_dict_sflog_s.get('sum', 0) ms_sflog_s.save() # next_cal_dict = [mpoint.material.id, sflog.id, year, month, day, hour, year_s, month_s, day_s] @@ -438,11 +441,11 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s, enstat.other_cost_data = other_cost_data enstat.production_cost_unit = imaterial_cost_unit + other_cost_unit enstat.save() - if enstat.total_production: - # 更新所监测设备测点的total_production - MpointStat.objects.filter(mgroup=enstat.mgroup, mpoint__material__code="elec").exclude(mpoint__ep_monitored=None).update( - total_production=enstat.total_production, elec_consume_unit=F("val") / enstat.total_production - ) + if mgroup.cate == 'section': + # 更新所监测设备测点的total_production + MpointStat.objects.filter(mgroup=enstat.mgroup, mpoint__material__code="elec").exclude(mpoint__ep_monitored=None).update( + total_production=enstat.total_production, elec_consume_unit=F("val") / enstat.total_production + ) if enstat.mgroup.cate == "section": if "material" in this_cal_attrs: # 算能耗