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 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'])