274 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
from rest_framework import exceptions
 | 
						|
from rest_framework import serializers
 | 
						|
 | 
						|
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory
 | 
						|
from apps.mtm.models import Material
 | 
						|
from apps.pum.models import PuOrder, Vendor
 | 
						|
from apps.qm.models import TestRecord, TestRecordItem
 | 
						|
from apps.sam.serializers import OrderSimpleSerializer
 | 
						|
 | 
						|
 | 
						|
from apps.system.serializers import FileSimpleSerializer, UserSimpleSerializer
 | 
						|
from apps.mtm.serializers import MaterialSimpleSerializer
 | 
						|
from django.db import transaction
 | 
						|
from utils.mixins import DynamicFieldsSerializerMixin
 | 
						|
from utils.tools import ranstr
 | 
						|
from rest_framework.exceptions import ValidationError
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class WareHouseSerializer(serializers.ModelSerializer):
 | 
						|
    create_by_ = UserSimpleSerializer('create_by', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = WareHouse
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class WareHouseCreateUpdateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = WareHouse
 | 
						|
        fields = ['name', 'number', 'place']
 | 
						|
 | 
						|
 | 
						|
class WareHouseSimpleSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = WareHouse
 | 
						|
        fields = ['name', 'number', 'place']
 | 
						|
 | 
						|
 | 
						|
class InventorySerializer(serializers.ModelSerializer):
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Inventory
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class MaterialBatchSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer):
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = MaterialBatch
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class IProductListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer):
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
    need_to_order =  serializers.BooleanField(source='wproduct.need_to_order', read_only=True)
 | 
						|
    is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True)
 | 
						|
    remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True)
 | 
						|
    to_order_ = OrderSimpleSerializer(source='wproduct.to_order', read_only=True)
 | 
						|
    order_ = OrderSimpleSerializer(
 | 
						|
        source='wproduct.subproduction_plan.production_plan.order', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = IProduct
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class FIFOListSerializer(serializers.ModelSerializer):
 | 
						|
    auditor_ = UserSimpleSerializer(source='auditor', read_only=True)
 | 
						|
    create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = FIFO
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class FIFOItemCreateSerializer(serializers.ModelSerializer):
 | 
						|
    material_batch = serializers.PrimaryKeyRelatedField(queryset=MaterialBatch.objects.all(), label="物料批次ID", required=False)
 | 
						|
    class Meta:
 | 
						|
        model = FIFOItem
 | 
						|
        fields = ['warehouse', 
 | 
						|
                'material', 'batch', 'fifo', 'files', 'pu_order_item', 'count', 'expiration_date', 'material_batch']
 | 
						|
    
 | 
						|
    def create(self, validated_data):
 | 
						|
        fifo = validated_data['fifo']
 | 
						|
        if fifo.is_audited:
 | 
						|
            raise ValidationError('该出入库记录已审核')
 | 
						|
        pu_order_item = validated_data.get('pu_order_item', None)
 | 
						|
        material_batch = validated_data.pop('material_batch', None)
 | 
						|
        if fifo.type == FIFO.FIFO_TYPE_PUR_IN and pu_order_item is None:
 | 
						|
            raise ValidationError('采购入库需关联采购项')
 | 
						|
        else:
 | 
						|
            if fifo.pu_order != pu_order_item.pu_order:
 | 
						|
                raise ValidationError('项目与采购订单不一致')
 | 
						|
            validated_data['material']=pu_order_item.material
 | 
						|
        if fifo.type == FIFO.FIFO_TYPE_OTHER_OUT and material_batch is None:
 | 
						|
            raise ValidationError('其他出库需关联批次号')
 | 
						|
        if material_batch:
 | 
						|
            validated_data['material'] = material_batch.material
 | 
						|
            validated_data['batch'] = material_batch.batch
 | 
						|
            validated_data['warehouse'] = material_batch.warehouse
 | 
						|
            
 | 
						|
        return super().create(validated_data)
 | 
						|
    
 | 
						|
    def validate_batch(self, value):
 | 
						|
        if value == '':
 | 
						|
            return value
 | 
						|
        elif len(value) > 6:
 | 
						|
            return value
 | 
						|
        raise ValidationError('批次号错误')
 | 
						|
 | 
						|
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = FIFOItem
 | 
						|
        fields = ['files', 'count', 'expiration_date']
 | 
						|
 | 
						|
class FIFOItemSerializer(serializers.ModelSerializer):
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    files_ = FileSimpleSerializer(source='files', many=True, read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = FIFOItem
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class FIFOItemProductCreateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = IProduct
 | 
						|
        fields = ['number']
 | 
						|
 | 
						|
 | 
						|
class FIFODetailInPurSerializer(serializers.ModelSerializer):
 | 
						|
    details = FIFOItemProductCreateSerializer(many=True, required=False)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = FIFOItem
 | 
						|
        fields = ['material', 'count', 'batch', 'details', 'warehouse', 'expiration_date']
 | 
						|
    
 | 
						|
    def validate_batch(self, value):
 | 
						|
        if value == '':
 | 
						|
            return value
 | 
						|
        elif len(value) > 6:
 | 
						|
            return value
 | 
						|
        raise ValidationError('批次号错误')
 | 
						|
 | 
						|
 | 
						|
class MaterialBatchQuerySerializer(serializers.Serializer):
 | 
						|
    warehouse = serializers.IntegerField(label="仓库ID", required=False)
 | 
						|
    materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False)
 | 
						|
 | 
						|
class FIFODetailOutOtherSerializer(serializers.Serializer):
 | 
						|
    material_batch = serializers.PrimaryKeyRelatedField(queryset=MaterialBatch.objects.all(), label="物料批次ID")
 | 
						|
    count = serializers.IntegerField(label="数量", min_value=0)
 | 
						|
 | 
						|
class FIFOOutOtherSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    其他出库序列化
 | 
						|
    """
 | 
						|
    details = FIFODetailOutOtherSerializer(many=True, required=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = FIFO
 | 
						|
        fields = ['details']
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        details = validated_data.pop('details')
 | 
						|
        with transaction.atomic():
 | 
						|
            validated_data['type'] = FIFO.FIFO_TYPE_OTHER_OUT
 | 
						|
            validated_data['number'] = 'CK' + ranstr(7)
 | 
						|
            obj = FIFO(**validated_data)
 | 
						|
            obj.save()
 | 
						|
            for i in details:
 | 
						|
                mb = i.pop('material_batch')
 | 
						|
                if mb.material.type in [Material.MA_TYPE_GOOD, Material.MA_TYPE_HALFGOOD]:
 | 
						|
                    raise ValidationError('不可直接出成品或半成品')
 | 
						|
                i['material'] = mb.material
 | 
						|
                i['batch'] = mb.batch
 | 
						|
                i['warehouse'] = mb.warehouse
 | 
						|
                i['fifo'] = obj
 | 
						|
                FIFOItem.objects.create(**i)
 | 
						|
        return obj
 | 
						|
 | 
						|
class FIFOInOtherSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    其他入库序列化
 | 
						|
    """
 | 
						|
    details = FIFODetailInPurSerializer(many=True, required=True)
 | 
						|
    vendor = serializers.PrimaryKeyRelatedField(label='供应商ID',
 | 
						|
        queryset=Vendor.objects.all())
 | 
						|
    class Meta:
 | 
						|
        model = FIFO
 | 
						|
        fields = ['details', 'vendor']
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        details = validated_data.pop('details')
 | 
						|
        with transaction.atomic():
 | 
						|
            validated_data['type'] = FIFO.FIFO_TYPE_OTHER_IN
 | 
						|
            validated_data['number'] = 'RK' + ranstr(7)
 | 
						|
            obj = FIFO(**validated_data)
 | 
						|
            obj.save()
 | 
						|
            for i in details:
 | 
						|
                if 'details' in i:
 | 
						|
                    p_details = i.pop('details')
 | 
						|
                    if len(p_details) != i['count']:
 | 
						|
                        raise serializers.ValidationError('数目对不上')
 | 
						|
                    else:
 | 
						|
                        i['fifo'] = obj
 | 
						|
                        fifoitem = FIFOItem.objects.create(**i)
 | 
						|
                        p_list0 = []
 | 
						|
                        for x in p_details:
 | 
						|
                            x['material'] = i['material']
 | 
						|
                            x['fifoitem'] = fifoitem
 | 
						|
                            p_list0.append(FIFOItemProduct(**x))
 | 
						|
                        FIFOItemProduct.objects.bulk_create(p_list0)
 | 
						|
                else:
 | 
						|
                    i['fifo'] = obj
 | 
						|
                    FIFOItem.objects.create(**i)
 | 
						|
        return obj
 | 
						|
 | 
						|
class FIFOInPurSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    采购入库序列化
 | 
						|
    """
 | 
						|
    pu_order = serializers.PrimaryKeyRelatedField(label='采购订单ID',
 | 
						|
        queryset = PuOrder.objects.filter(is_audited=True))
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = FIFO
 | 
						|
        fields = ['pu_order']
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        pu_order = validated_data['pu_order']
 | 
						|
        if not pu_order.is_audited:
 | 
						|
            raise  ValidationError('该采购订单未审核')
 | 
						|
        validated_data['vendor'] = pu_order.vendor
 | 
						|
        validated_data['number'] = 'RK' + ranstr(7)
 | 
						|
        validated_data['type'] = FIFO.FIFO_TYPE_PUR_IN
 | 
						|
        obj = FIFO.objects.create(**validated_data)
 | 
						|
        return obj
 | 
						|
 | 
						|
 | 
						|
class InmTestRecordItemCreateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = TestRecordItem
 | 
						|
        fields = ['form_field', 'field_value', 'is_testok']
 | 
						|
 | 
						|
 | 
						|
class InmTestRecordCreateSerializer(serializers.ModelSerializer):
 | 
						|
    record_data = InmTestRecordItemCreateSerializer(many=True)
 | 
						|
    fifo_item = serializers.PrimaryKeyRelatedField(queryset=FIFOItem.objects.all(), required=True)
 | 
						|
    is_testok = serializers.BooleanField()
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = TestRecord
 | 
						|
        fields = ['form', 'record_data', 'is_testok', 'fifo_item']
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = FIFOItem
 | 
						|
        fields = ['need_test', 'files']
 | 
						|
 | 
						|
    def validate(self, attrs):
 | 
						|
        ins = self.instance
 | 
						|
        fifo = ins.fifo
 | 
						|
        if fifo.is_audited:
 | 
						|
            raise exceptions.APIException('该记录已审核')
 | 
						|
        if ins.is_testok is not None:
 | 
						|
            attrs.pop('need_test')
 | 
						|
        return super().validate(attrs) |