79 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
# 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'])
 |