From beb96245489dc09baee057c8f7578bc06bc8cde9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 23 Aug 2023 12:45:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20price=20change=20=E6=97=B6=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/fim/tasks.py | 74 +++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/apps/fim/tasks.py b/apps/fim/tasks.py index 3a87d77c..ff2c0fd3 100644 --- a/apps/fim/tasks.py +++ b/apps/fim/tasks.py @@ -7,6 +7,7 @@ from server.settings import get_sysconfig from django.core.cache import cache from apps.fim.models import PriceSet, FeeSet from apps.mtm.models import Mgroup +from django.db import transaction @@ -20,27 +21,27 @@ def cal_enstat_when_priceset_change(pricesetId): materialId = material.id # 受影响的工段 mgroups = Mgroup.objects.filter(input_materials__contains=material.id) - enstats = EnStat.objects.filter(mgroup__in=mgroups) - for enstat in enstats: - enstat = EnStat.objects.select_for_update().get(id=enstat.id) # 加锁一下 - old_cost_unit = 0 - new_cost_unit = 0 - imaterial_data = enstat.imaterial_data - for idata in imaterial_data: - old_cost_unit = old_cost_unit + idata['cost_unit'] - if idata['material'] == materialId: - idata['price_unit'] = price_unit - idata['cost'] = idata['price_unit'] * idata['amount_consume'] - try: - idata['cost_unit'] = idata['cost']/enstat.total_production - except: - idata['cost_unit'] = 0 - new_cost_unit = new_cost_unit + idata['cost_unit'] - - # 更新一些数据 - 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']) + with transaction.atomic(): + enstats = EnStat.objects.select_for_update().filter(mgroup__in=mgroups) + for enstat in enstats: + old_cost_unit = 0 + new_cost_unit = 0 + imaterial_data = enstat.imaterial_data + for idata in imaterial_data: + old_cost_unit = old_cost_unit + idata['cost_unit'] + if idata['material'] == materialId: + idata['price_unit'] = price_unit + idata['cost'] = idata['price_unit'] * idata['amount_consume'] + try: + idata['cost_unit'] = idata['cost']/enstat.total_production + except: + idata['cost_unit'] = 0 + new_cost_unit = new_cost_unit + idata['cost_unit'] + + # 更新一些数据 + 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 袋装水泥/散装水泥/熟料价格变化 from apps.enm.tasks import cal_enstat2 from apps.enm.models import EnStat2 @@ -60,19 +61,18 @@ def cal_enstat_when_feeset_change(feesetId): fee = feeset.fee feeId = fee.id # 受影响的工段 - enstats = EnStat.objects.filter(mgroup=mgroup) - for enstat in enstats: - enstat = EnStat.objects.select_for_update().get(id=enstat.id) # 加锁一下 - old_cost_unit = 0 - new_cost_unit = 0 - other_cost_data = enstat.other_cost_data - for idata in other_cost_data: - old_cost_unit = old_cost_unit + idata['cost_unit'] - if idata['id'] == feeId: - idata['cost_unit'] = cost_unit - new_cost_unit = new_cost_unit + idata['cost_unit'] - - # 更新一些数据 - enstat.other_cost_data = other_cost_data - enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit - enstat.save(update_fields=['other_cost_data', 'production_cost_unit']) + with transaction.atomic(): + enstats = EnStat.objects.select_for_update().filter(mgroup=mgroup) + for enstat in enstats: + old_cost_unit = 0 + new_cost_unit = 0 + other_cost_data = enstat.other_cost_data + for idata in other_cost_data: + old_cost_unit = old_cost_unit + idata['cost_unit'] + if idata['id'] == feeId: + idata['cost_unit'] = cost_unit + new_cost_unit = new_cost_unit + idata['cost_unit'] + # 更新一些数据 + enstat.other_cost_data = other_cost_data + enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit + enstat.save(update_fields=['other_cost_data', 'production_cost_unit'])