From 4cd2c0f85b451adba9ed43b6d35e06e3c3f5b546 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 23 Aug 2023 08:33:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20enstat2=E5=A2=9E=E5=8A=A0day=5Fs?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=8F=8A=E7=9B=B8=E5=BA=94=E7=9A=84tasks?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enm/migrations/0020_auto_20230822_1758.py | 23 ++++++++ apps/enm/models.py | 2 + apps/enm/tasks.py | 59 ++++++++++++++----- apps/fim/tasks.py | 8 ++- apps/wpm/tasks.py | 2 +- 5 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 apps/enm/migrations/0020_auto_20230822_1758.py diff --git a/apps/enm/migrations/0020_auto_20230822_1758.py b/apps/enm/migrations/0020_auto_20230822_1758.py new file mode 100644 index 00000000..1c2a961b --- /dev/null +++ b/apps/enm/migrations/0020_auto_20230822_1758.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.12 on 2023-08-22 09:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enm', '0019_auto_20230818_1721'), + ] + + operations = [ + migrations.AddField( + model_name='enstat2', + name='day_s', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='班日'), + ), + migrations.AddField( + model_name='enstat2', + name='type', + field=models.CharField(default='month_s', help_text='month_s/day_s', max_length=50, verbose_name='统计维度'), + ), + ] diff --git a/apps/enm/models.py b/apps/enm/models.py index 0083c33e..1fa9af94 100644 --- a/apps/enm/models.py +++ b/apps/enm/models.py @@ -98,8 +98,10 @@ class EnStat2(BaseModel): """ 能源数据统计表2 """ + type = models.CharField('统计维度', max_length=50, default='month_s', help_text='month_s/day_s') year_s = models.PositiveSmallIntegerField('班年') month_s = models.PositiveSmallIntegerField('班月') + day_s = models.PositiveSmallIntegerField('班日', null=True, blank=True) industry_total_val = models.FloatField('工业总产值', default=0, help_text='万元') industry_add_val = models.FloatField('工业增加值', default=0, help_text='万元') elec_consume = models.FloatField('总电耗', default=0, help_text='kw·h') diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index fd027ca6..971bc9e8 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -166,17 +166,20 @@ def cal_mpointstats(is_now=1, year=None, month=None, day=None, hour=None): # 开始计算enstat mgroups = Mgroup.objects.all().order_by('sort') - mgroups_group = [] + # mgroups_group = [] + year_s, month_s, day_s = 0, 0, 0 for mgroup in mgroups: # mgroups_group.append(cal_enstat.s('hour_s', None, mgroup.id, year, month, day, hour, None, None, None, True, ['material', 'run_hour'])) - cal_enstat('hour_s', None, mgroup.id, year, month, day, hour, None, None, None, True) + year_s, month_s, day_s = cal_enstat('hour_s', None, mgroup.id, year, month, day, hour, None, None, None, True) # mgroups_t = mgroups.filter(name__in=['回转窑', '水泥磨']) # mgroups_t_group = [] # for mgroup in mgroups_t: # mgroups_t_group.append(cal_enstat.s('hour_s', None, mgroup.id, year, month, day, hour, None, None, None, True, ['pcoal'])) + + # 最后计算enstat2 - cal_enstat2(year_s=year, month_s=month) + cal_enstat2(type="day_s", year_s=year_s, month_s=month_s, day_s=day_s) # task_chain = chain(group(mpoints_without_formula_group), group(mpoints_other_group), group(mgroups_group), group(mgroups_t_group), group([cal_enstat2.s(year_s=year, month_s=month)])) # task_chain.delay() @@ -225,8 +228,8 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s, start_index = types_list.index(type) new_types_list = types_list[start_index:] for type in new_types_list: - cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s, False) - return + year_s, month_s, day_s = cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s, day_s, False) + return year_s, month_s, day_s if not cal_attrs: this_cal_attrs = ['material', 'pcoal', 'run_hour'] else: @@ -414,6 +417,7 @@ def cal_enstat(type, sflogId, mgroupId, year, month, day, hour, year_s, month_s, pass enstat.save() enstat.save() + return year_s, month_s, day_s # 返回这个值主要为了全厂数据计算而用 def get_total_hour_now_and_shut_hour(enstat: EnStat): @@ -464,8 +468,20 @@ def get_total_hour_now_and_shut_hour(enstat: EnStat): return res['sum1'] if res['sum1'] else 0, res['sum2'] if res['sum2'] else 0 @shared_task(base=CustomTask) -def cal_enstat2(year_s: int, month_s: int): - enstat2, _ = EnStat2.objects.get_or_create(year_s=year_s, month_s=month_s, defaults={'year_s': year_s, 'month_s': month_s}) +def cal_enstat2(type: str, year_s: int, month_s: int, day_s: int, cascade=True): + if type == 'day_s': + cal_enstat2('day_s', year_s, month_s, day_s) + if cascade: + cal_enstat2('month_s', year_s, month_s, day_s) + elif type == 'month_s': + cal_enstat2('month_s', year_s, month_s, day_s) + else: + return + if type == 'month_s': + enstat2, _ = EnStat2.objects.get_or_create(type="month_s", year_s=year_s, month_s=month_s, defaults={'year_s': year_s, 'month_s': month_s, 'type': 'month_s'}) + elif type == 'day_s': + enstat2, _ = EnStat2.objects.get_or_create(type="day_s", year_s=year_s, month_s=month_s, day_s=day_s, defaults={'year_s': year_s, 'month_s': month_s, 'day_s': day_s, 'type': 'day_s'}) + enstat2 = EnStat2.objects.select_for_update().get(id=enstat2.id) # 加锁 material_cement = Material.objects.get(code='cement') material_clinker = Material.objects.get(code='clinker') material_bulk_cement = Material.objects.get(code='bulk_cement') @@ -474,27 +490,41 @@ def cal_enstat2(year_s: int, month_s: int): enstat2.bulk_cement_price = get_price_unit(material_bulk_cement, year_s, month_s) enstat2.clinker_price = get_price_unit(material_clinker, year_s, month_s) enstat2.bag_cement_price = get_price_unit(material_bag_cement, year_s, month_s) - enstat2.bulk_cement_val = MpointStat.objects.filter(type='month_s', mpoint__material=material_bulk_cement, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val'))['sum'] + if type == 'month_s': + enstat2.bulk_cement_val = MpointStat.objects.filter(type='month_s', mpoint__material=material_bulk_cement, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val'))['sum'] + elif type == 'day_s': + enstat2.bulk_cement_val = MpointStat.objects.filter(type='day_s', mpoint__material=material_bulk_cement, year_s=year_s, month_s=month_s, day_s=day_s).aggregate(sum=Sum('val'))['sum'] if enstat2.bulk_cement_val is None: enstat2.bulk_cement_val = 0 - enstat2.bag_cement_val = MpointStat.objects.filter(type='month_s', mpoint__material=material_bag_cement, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val'))['sum'] + if type == 'month_s': + enstat2.bag_cement_val = MpointStat.objects.filter(type='month_s', mpoint__material=material_bag_cement, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val'))['sum'] + elif type == 'day_s': + enstat2.bag_cement_val = MpointStat.objects.filter(type='day_s', mpoint__material=material_bag_cement, year_s=year_s, month_s=month_s, day_s=day_s).aggregate(sum=Sum('val'))['sum'] if enstat2.bag_cement_val is None: enstat2.bag_cement_val = 0 - enstat2.clinker_val = MpointStat.objects.filter(type='month_s', mpoint__material=material_cement, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val'))['sum'] + if type == 'month_s': + enstat2.clinker_val = MpointStat.objects.filter(type='month_s', mpoint__material=material_cement, year_s=year_s, month_s=month_s).aggregate(sum=Sum('val'))['sum'] + elif type == 'day_s': + enstat2.clinker_val = MpointStat.objects.filter(type='day_s', mpoint__material=material_cement, year_s=year_s, month_s=month_s, day_s=day_s).aggregate(sum=Sum('val'))['sum'] if enstat2.clinker_val is None: enstat2.clinker_val = 0 enstat2.industry_total_val = (enstat2.bulk_cement_val*enstat2.bulk_cement_price+enstat2.bag_cement_val*enstat2.bag_cement_price+enstat2.clinker_val*enstat2.clinker_price)/10000 - res = EnStat.objects.filter(mgroup__product__code='cement', type='month_s', year_s=year_s, month_s=month_s).aggregate(sum=Sum('total_production'), avg=Avg('production_cost_unit')) - + if type == 'month_s': + res = EnStat.objects.filter(mgroup__product__code='cement', type='month_s', year_s=year_s, month_s=month_s).aggregate(sum=Sum('total_production'), avg=Avg('production_cost_unit')) + elif type == 'day_s': + res = EnStat.objects.filter(mgroup__product__code='cement', type='day_s', year_s=year_s, month_s=month_s, day_s=day_s).aggregate(sum=Sum('total_production'), avg=Avg('production_cost_unit')) enstat2.cement_val = res['sum'] if res['sum'] else 0 enstat2.cement_cost_unit = res['avg'] if res['avg'] else 0 enstat2.industry_add_val = enstat2.industry_total_val - enstat2.cement_val * enstat2.cement_cost_unit /10000 # 全厂电量 - enstat_qs = EnStat.objects.filter(type='month_s', year_s=year_s, month_s=month_s) + if type == 'month_s': + enstat_qs = EnStat.objects.filter(type='month_s', year_s=year_s, month_s=month_s) + elif type == 'day_s': + enstat_qs = EnStat.objects.filter(type='day_s', year_s=year_s, month_s=month_s, day_s=day_s) res_elec_pcoal = enstat_qs.aggregate(sum1=Sum('elec_consume'), sum2=Sum('elec_coal_consume'), sum3=Sum('pcoal_consume'), sum4=Sum('pcoal_coal_consume'), sum5=Sum('water_consume'), sum6=Sum('cair_consume')) enstat2.elec_consume = res_elec_pcoal['sum1'] if res_elec_pcoal['sum1'] else 0 @@ -544,5 +574,4 @@ def cal_enstat_pcoal_change(enstat, new_pcoal_heat): next_enstat = EnStat.objects.filter(type=enstat.type, year_s=enstat.year_s, month_s=enstat.month_s, day_s=enstat.day_s, hour=enstat.hour, mgroup__name='水泥磨').first() if next_enstat: next_enstat.cen_consume_unit = next_enstat.elec_consume_unit*0.1229 + 0.7*enstat.cen_consume_unit - next_enstat.save(update_fields=['cen_consume_unit']) - \ No newline at end of file + next_enstat.save(update_fields=['cen_consume_unit']) \ No newline at end of file diff --git a/apps/fim/tasks.py b/apps/fim/tasks.py index 4df886b2..3a87d77c 100644 --- a/apps/fim/tasks.py +++ b/apps/fim/tasks.py @@ -41,9 +41,13 @@ def cal_enstat_when_priceset_change(pricesetId): enstat.imaterial_data = imaterial_data enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit enstat.save(update_fields=['imaterial_data', 'production_cost_unit']) - if material.code in ['bulk_cement', 'bag_cement', 'clinker']: # 需要更新enstat2 + if material.code in ['bulk_cement', 'bag_cement', 'clinker']: # 需要更新enstat2 袋装水泥/散装水泥/熟料价格变化 from apps.enm.tasks import cal_enstat2 - cal_enstat2(priceset.year, priceset.month) + from apps.enm.models import EnStat2 + enstat2s = EnStat2.objects.filter(type='day_s', year_s=priceset.year, month_s=priceset.month) + for enstat2 in enstat2s: + cal_enstat2('day_s', enstat2.year_s, enstat2.month_s, enstat2.day_s, False) + cal_enstat2('month_s', priceset.year, priceset.month, None) @shared_task(base=CustomTask) diff --git a/apps/wpm/tasks.py b/apps/wpm/tasks.py index 6ac6e997..ac966b18 100644 --- a/apps/wpm/tasks.py +++ b/apps/wpm/tasks.py @@ -114,7 +114,7 @@ def cal_enstat_when_pcoal_heat_change(sflogId): for enstat in enstats_other: cal_enstat_pcoal_change(enstat, pcoal_heat) - cal_enstat2(year_s, month_s) + cal_enstat2('day_s', year_s, month_s, day_s) @shared_task(base=CustomTask)