feat: price change 时计算加锁

This commit is contained in:
caoqianming 2023-08-23 12:45:14 +08:00
parent 4fdddec6d6
commit beb9624548
1 changed files with 37 additions and 37 deletions

View File

@ -7,6 +7,7 @@ from server.settings import get_sysconfig
from django.core.cache import cache from django.core.cache import cache
from apps.fim.models import PriceSet, FeeSet from apps.fim.models import PriceSet, FeeSet
from apps.mtm.models import Mgroup 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 materialId = material.id
# 受影响的工段 # 受影响的工段
mgroups = Mgroup.objects.filter(input_materials__contains=material.id) mgroups = Mgroup.objects.filter(input_materials__contains=material.id)
enstats = EnStat.objects.filter(mgroup__in=mgroups) with transaction.atomic():
for enstat in enstats: enstats = EnStat.objects.select_for_update().filter(mgroup__in=mgroups)
enstat = EnStat.objects.select_for_update().get(id=enstat.id) # 加锁一下 for enstat in enstats:
old_cost_unit = 0 old_cost_unit = 0
new_cost_unit = 0 new_cost_unit = 0
imaterial_data = enstat.imaterial_data imaterial_data = enstat.imaterial_data
for idata in imaterial_data: for idata in imaterial_data:
old_cost_unit = old_cost_unit + idata['cost_unit'] old_cost_unit = old_cost_unit + idata['cost_unit']
if idata['material'] == materialId: if idata['material'] == materialId:
idata['price_unit'] = price_unit idata['price_unit'] = price_unit
idata['cost'] = idata['price_unit'] * idata['amount_consume'] idata['cost'] = idata['price_unit'] * idata['amount_consume']
try: try:
idata['cost_unit'] = idata['cost']/enstat.total_production idata['cost_unit'] = idata['cost']/enstat.total_production
except: except:
idata['cost_unit'] = 0 idata['cost_unit'] = 0
new_cost_unit = new_cost_unit + idata['cost_unit'] new_cost_unit = new_cost_unit + idata['cost_unit']
# 更新一些数据 # 更新一些数据
enstat.imaterial_data = imaterial_data enstat.imaterial_data = imaterial_data
enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit
enstat.save(update_fields=['imaterial_data', 'production_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 from apps.enm.tasks import cal_enstat2
from apps.enm.models import EnStat2 from apps.enm.models import EnStat2
@ -60,19 +61,18 @@ def cal_enstat_when_feeset_change(feesetId):
fee = feeset.fee fee = feeset.fee
feeId = fee.id feeId = fee.id
# 受影响的工段 # 受影响的工段
enstats = EnStat.objects.filter(mgroup=mgroup) with transaction.atomic():
for enstat in enstats: enstats = EnStat.objects.select_for_update().filter(mgroup=mgroup)
enstat = EnStat.objects.select_for_update().get(id=enstat.id) # 加锁一下 for enstat in enstats:
old_cost_unit = 0 old_cost_unit = 0
new_cost_unit = 0 new_cost_unit = 0
other_cost_data = enstat.other_cost_data other_cost_data = enstat.other_cost_data
for idata in other_cost_data: for idata in other_cost_data:
old_cost_unit = old_cost_unit + idata['cost_unit'] old_cost_unit = old_cost_unit + idata['cost_unit']
if idata['id'] == feeId: if idata['id'] == feeId:
idata['cost_unit'] = cost_unit idata['cost_unit'] = cost_unit
new_cost_unit = new_cost_unit + idata['cost_unit'] new_cost_unit = new_cost_unit + idata['cost_unit']
# 更新一些数据
# 更新一些数据 enstat.other_cost_data = other_cost_data
enstat.other_cost_data = other_cost_data enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit
enstat.production_cost_unit = enstat.production_cost_unit - old_cost_unit + new_cost_unit enstat.save(update_fields=['other_cost_data', 'production_cost_unit'])
enstat.save(update_fields=['other_cost_data', 'production_cost_unit'])