# Create your tasks here from __future__ import absolute_import, unicode_literals from apps.utils.tasks import CustomTask from celery import shared_task from apps.utils.sql import DbConnection 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 @shared_task(base=CustomTask) def cal_enstat_when_priceset_change(pricesetId): from apps.enm.models import EnStat priceset = PriceSet.objects.get(id=pricesetId) # 影响物料成本的计算 price_unit = priceset.price_unit material = priceset.material materialId = material.id # 受影响的工段 mgroups = Mgroup.objects.filter(input_materials__contains=material.id) 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 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) def cal_enstat_when_feeset_change(feesetId): from apps.enm.models import EnStat feeset = FeeSet.objects.get(id=feesetId) # 影响物料成本的计算 cost_unit = feeset.cost_unit mgroup = feeset.mgroup fee = feeset.fee feeId = fee.id # 受影响的工段 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'])