550 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			550 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
from django.db.models.query_utils import Q
 | 
						|
from rest_framework import serializers, exceptions
 | 
						|
from rest_framework.serializers import ModelSerializer
 | 
						|
from apps.em.models import Equipment
 | 
						|
from apps.em.serializers import EquipmentSimpleSerializer
 | 
						|
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse
 | 
						|
from apps.inm.signals import update_inm
 | 
						|
from apps.inm.serializers import WareHouseSimpleSerializer
 | 
						|
from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial
 | 
						|
from apps.mtm.serializers import MaterialSimpleSerializer, ProcessSimpleSerializer, RecordFormSimpleSerializer, StepSimpleSerializer
 | 
						|
 | 
						|
from apps.pm.models import SubProductionPlan, SubProductionProgress
 | 
						|
from django.utils import timezone
 | 
						|
from django.utils.translation import gettext_lazy as _
 | 
						|
from apps.pm.serializers import SubproductionPlanSimpleSerializer
 | 
						|
from apps.qm.models import TestRecord, TestRecordItem
 | 
						|
from apps.sam.serializers import OrderSimpleSerializer
 | 
						|
from apps.system.models import User
 | 
						|
from apps.system.serializers import UserSimpleSerializer
 | 
						|
from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket
 | 
						|
from django.db import transaction
 | 
						|
 | 
						|
class PickHalfSerializer(serializers.Serializer):
 | 
						|
    id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID')
 | 
						|
    wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all())
 | 
						|
                                             , label='半成品ID', required=False) # 从半成品表里直接修改状态
 | 
						|
 | 
						|
class PickHalfsSerializer(serializers.ListSerializer):
 | 
						|
    child = PickHalfSerializer()
 | 
						|
class PickDetailSerializer(serializers.Serializer):
 | 
						|
    material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID")
 | 
						|
    batch = serializers.CharField(label='物料批次', allow_blank=True)
 | 
						|
    warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
 | 
						|
    pick_count = serializers.IntegerField(label="领料数量", required=False)
 | 
						|
    iproducts = serializers.PrimaryKeyRelatedField(queryset=IProduct.objects.all(), label='库存半成品ID',required=False, many=True)
 | 
						|
 | 
						|
class PickSerializer(serializers.Serializer):
 | 
						|
    subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID")
 | 
						|
    picks = PickDetailSerializer(many=True) # 从库存里拿
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        picks = validated_data.pop('picks')
 | 
						|
        sp = validated_data.pop('subproduction_plan')
 | 
						|
        if sp.state not in [SubProductionPlan.SUBPLAN_STATE_ASSGINED, SubProductionPlan.SUBPLAN_STATE_ACCEPTED,
 | 
						|
                     SubProductionPlan.SUBPLAN_STATE_WORKING]:
 | 
						|
            raise exceptions.APIException('该子计划状态错误')
 | 
						|
        # if sp.is_picked:
 | 
						|
        #     raise exceptions.APIException('该子计划已领料')
 | 
						|
        # for i in picks:
 | 
						|
        #     try:
 | 
						|
        #         instance = MaterialBatch.objects.get(material=i['material'], batch=i['batch'])
 | 
						|
        #         if instance.count < i['pick_count']:
 | 
						|
        #             raise exceptions.APIException('物料不足')
 | 
						|
        #     except:
 | 
						|
        #         raise exceptions.APIException('物料不存在')
 | 
						|
        # 创建出库记录
 | 
						|
 | 
						|
        with transaction.atomic():
 | 
						|
            fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_OUT, inout_date=timezone.now(), create_by=self.context['request'].user)
 | 
						|
            for i in picks:
 | 
						|
                isLowLevel = False
 | 
						|
                # 更新出库详情
 | 
						|
                i['count'] = i.pop('pick_count', 0)
 | 
						|
                # 是否勾选每一个
 | 
						|
                if 'iproducts' in i and len(i['iproducts'])>0:
 | 
						|
                    i['count'] = len(i['iproducts'])
 | 
						|
                    isLowLevel = True
 | 
						|
                if i['count']>0:
 | 
						|
                    if isLowLevel:
 | 
						|
                        iproducts = i.pop('iproducts')
 | 
						|
                    i['fifo'] = fifo
 | 
						|
                    i['is_testok'] = True # 默认检验合格
 | 
						|
                    i['subproduction_plan'] = sp
 | 
						|
                    fifoitem = FIFOItem.objects.create(**i)
 | 
						|
                    # 创建再下一个层级
 | 
						|
                    if isLowLevel:
 | 
						|
                        mls = []
 | 
						|
                        for m in iproducts:
 | 
						|
                            ml = {}
 | 
						|
                            ml['material'] = m.material
 | 
						|
                            ml['number'] = m.number
 | 
						|
                            ml['wproduct'] = m.wproduct
 | 
						|
                            ml['fifoitem'] = fifoitem
 | 
						|
                            mls.append(FIFOItemProduct(**ml))
 | 
						|
                        FIFOItemProduct.objects.bulk_create(mls)
 | 
						|
 | 
						|
                    # 更新车间物料
 | 
						|
                    wm, _ = WMaterial.objects.get_or_create(material=i['material'], batch=i['batch'], \
 | 
						|
                        subproduction_plan=sp,defaults={
 | 
						|
                            'material':i['material'],
 | 
						|
                            'batch':i['batch'],
 | 
						|
                            'subproduction_plan':sp,
 | 
						|
                            'count':0
 | 
						|
                        })
 | 
						|
                    wm.count = wm.count + i['count']
 | 
						|
                    wm.save()
 | 
						|
                    # 更新子计划物料情况
 | 
						|
                    spp = SubProductionProgress.objects.get(material=i['material'], subproduction_plan=sp, type=SubprodctionMaterial.SUB_MA_TYPE_IN)
 | 
						|
                    spp.count_pick = spp.count_pick + i['count']
 | 
						|
                    spp.save()
 | 
						|
                    # if spp.count_pick > spp.count:
 | 
						|
                    #     raise exceptions.APIException('超过计划需求数')
 | 
						|
                    if isLowLevel:
 | 
						|
                        # 更新半成品表
 | 
						|
                        wids = IProduct.objects.filter(pk__in=[x.id for x in iproducts]).values_list('wproduct', flat=True)
 | 
						|
                        wproducts = WProduct.objects.filter(pk__in=wids)
 | 
						|
                        first_step = Step.objects.get(pk=sp.steps[0]['id'])
 | 
						|
                        wproducts.update(step=first_step, 
 | 
						|
                        act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None,
 | 
						|
                        subproduction_plan=sp)
 | 
						|
            sp.is_picked=True
 | 
						|
            sp.state = SubProductionPlan.SUBPLAN_STATE_WORKING #生产中
 | 
						|
            sp.state_date_real = timezone.now() #实际开工日期
 | 
						|
            sp.save()
 | 
						|
            # 创建领料记录
 | 
						|
            pick = Pick()
 | 
						|
            pick.subproduction_plan = sp
 | 
						|
            pick.type = Pick.PICK_FROM_WAREHOUSE
 | 
						|
            pick.fifo = fifo
 | 
						|
            pick.create_by = self.context['request'].user
 | 
						|
            pick.save()
 | 
						|
            # 更新库存
 | 
						|
            fifo.is_audited = True
 | 
						|
            fifo.save()
 | 
						|
            update_inm(fifo)
 | 
						|
        return fifo
 | 
						|
    
 | 
						|
class WMaterialListSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    车间物料
 | 
						|
    """
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = WMaterial
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class WProductBaseSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    半成品列表
 | 
						|
    """
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = WProduct
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class WProductListSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    半成品列表
 | 
						|
    """
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
    children = serializers.SerializerMethodField()
 | 
						|
    class Meta:
 | 
						|
        model = WProduct
 | 
						|
        fields = '__all__'
 | 
						|
    
 | 
						|
    def get_children(self, obj):
 | 
						|
        wps = WProduct.objects.filter(child=obj)
 | 
						|
        if wps.exists():
 | 
						|
             return WProductBaseSerializer(instance=wps, many=True).data
 | 
						|
        return []
 | 
						|
 | 
						|
class WProductCardBaseSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    产品流程序列化
 | 
						|
    """
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
    step_list_full = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = WProduct
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
    def get_step_list_full(self, obj):
 | 
						|
        """
 | 
						|
        获取所有步骤信息
 | 
						|
        """
 | 
						|
        step_list_full = []
 | 
						|
        comb_step = Step.objects.filter(type=Step.STEP_TYPE_COMB, is_deleted=False).first()
 | 
						|
        if obj.material.type == Material.MA_TYPE_GOOD:
 | 
						|
            # 如果是成品获取可能经过的步骤
 | 
						|
            steps = Step.objects.filter(number__gte=comb_step.number).order_by('number')
 | 
						|
        elif obj.material.type == Material.MA_TYPE_HALFGOOD:
 | 
						|
            steps = Step.objects.filter(number__lt=comb_step.number).order_by('number')
 | 
						|
        for i in steps:
 | 
						|
            actions = []
 | 
						|
            ops = Operation.objects.filter(Q(ow_operation__wproduct=obj)|Q(wp_coperation=obj))\
 | 
						|
                .filter(step=i, is_submited=True).distinct()
 | 
						|
            for m in ops:
 | 
						|
                actions.append({'action_by_name':m.create_by.name, 'action_time':m.update_time.strftime('%Y-%m-%d %H:%M:%S')})
 | 
						|
            step_list_full.append({'step_name':i.name, 'actions':actions})
 | 
						|
        return step_list_full
 | 
						|
 | 
						|
class WProductCardSerializer(WProductCardBaseSerializer):
 | 
						|
    """
 | 
						|
    产品流程序列化
 | 
						|
    """
 | 
						|
    parents = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    def get_parents(self, obj):
 | 
						|
        parent_wps = WProduct.objects.filter(child=obj)
 | 
						|
        return WProductCardBaseSerializer(instance=parent_wps, many=True).data
 | 
						|
 | 
						|
 | 
						|
        
 | 
						|
 | 
						|
 | 
						|
class WProductDetailSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    半成品列表
 | 
						|
    """
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
 | 
						|
    children = serializers.SerializerMethodField()
 | 
						|
    class Meta:
 | 
						|
        model = WProduct
 | 
						|
        fields = '__all__'
 | 
						|
    
 | 
						|
    def get_children(self, obj):
 | 
						|
        wps = WProduct.objects.filter(child=obj)
 | 
						|
        if wps.exists():
 | 
						|
            print(wps)
 | 
						|
            return WProductBaseSerializer(instance=wps, many=True).data
 | 
						|
        return []
 | 
						|
 | 
						|
class OperationDetailSerializer(serializers.ModelSerializer):
 | 
						|
    create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = Operation
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class OperationListSerializer(serializers.ModelSerializer):
 | 
						|
    create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    wproduct_ = serializers.SerializerMethodField()
 | 
						|
    equip_ = serializers.SerializerMethodField()
 | 
						|
    record_ = serializers.SerializerMethodField()
 | 
						|
    class Meta:
 | 
						|
        model = Operation
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
    def get_wproduct_(self, obj):
 | 
						|
        return WProduct.objects.filter(ow_wproduct__operation=obj).values('id', 'number')
 | 
						|
    
 | 
						|
    def get_equip_(self, obj):
 | 
						|
        return EquipmentSimpleSerializer(instance=Equipment.objects.filter(oe_equip__operation=obj), many=True).data 
 | 
						|
    
 | 
						|
    def get_record_(self, obj):
 | 
						|
        return RecordFormSimpleSerializer(instance=RecordForm.objects.filter(or_form__operation=obj), many=True).data
 | 
						|
 | 
						|
class OperationCreateSerializer(serializers.Serializer):
 | 
						|
    """
 | 
						|
    操作创建
 | 
						|
    """
 | 
						|
    step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID")
 | 
						|
    # subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
 | 
						|
    wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label="半成品ID列表", required=False, many=True)
 | 
						|
    
 | 
						|
    def validate(self, data):
 | 
						|
        # subproduction_plan = data['subproduction_plan']
 | 
						|
        step = data['step']
 | 
						|
        
 | 
						|
        # stepIds=[i['id'] for i in subproduction_plan.steps]
 | 
						|
        # if step.id not in stepIds:
 | 
						|
        #     raise exceptions.APIException('请选择正确的子工序操作')
 | 
						|
        
 | 
						|
        if 'wproducts' in data and data['wproducts']:
 | 
						|
            if step.type == Step.STEP_TYPE_DIV:
 | 
						|
                raise exceptions.APIException(_('不可进行此操作'))
 | 
						|
            for i in data['wproducts']:
 | 
						|
                if i.act_state != WProduct.WPR_ACT_STATE_DOWAIT:
 | 
						|
                    raise exceptions.APIException('半成品不在待操作状态')
 | 
						|
                # if i.is_executed:
 | 
						|
                #     raise exceptions.APIException('不可进行操作')
 | 
						|
                # if i.subproduction_plan != subproduction_plan:
 | 
						|
                #     raise exceptions.APIException('半成品所属子计划不一致')
 | 
						|
                if i.step != step:
 | 
						|
                    raise exceptions.APIException('半成品所属子工序不一致')
 | 
						|
        else:
 | 
						|
            if step.type != Step.STEP_TYPE_DIV:
 | 
						|
                raise exceptions.APIException(_('请选择半成品进行操作'))
 | 
						|
        return data
 | 
						|
 | 
						|
 | 
						|
class OperationUpdateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Operation
 | 
						|
        fields =['remark']
 | 
						|
 | 
						|
class OperationInitSerializer(serializers.Serializer):
 | 
						|
    step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID")
 | 
						|
    subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
 | 
						|
    wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label="半成品ID列表", required=False, many=True)
 | 
						|
    
 | 
						|
    def validate(self, data):
 | 
						|
        # subproduction_plan = data['subproduction_plan']
 | 
						|
        step = data['step']
 | 
						|
        
 | 
						|
        # stepIds=[i['id'] for i in subproduction_plan.steps]
 | 
						|
        # if step.id not in stepIds:
 | 
						|
        #     raise exceptions.APIException('请选择正确的子工序操作')
 | 
						|
        
 | 
						|
        if 'wproducts' in data and data['wproducts']:
 | 
						|
            if step.type == Step.STEP_TYPE_DIV:
 | 
						|
                raise exceptions.APIException(_('不可进行此操作'))
 | 
						|
            for i in data['wproducts']:
 | 
						|
                if i.act_state != WProduct.WPR_ACT_STATE_DOWAIT:
 | 
						|
                    raise exceptions.APIException('半成品不在待操作状态')
 | 
						|
                # if i.subproduction_plan != subproduction_plan:
 | 
						|
                #     raise exceptions.APIException('半成品所属子计划不一致')
 | 
						|
                if i.step != step:
 | 
						|
                    raise exceptions.APIException('半成品所属子工序不一致')
 | 
						|
        else:
 | 
						|
            if step.type != Step.STEP_TYPE_DIV:
 | 
						|
                raise exceptions.APIException(_('请选择半成品进行操作'))
 | 
						|
        return data
 | 
						|
 | 
						|
 | 
						|
class DoInputSerializer(serializers.Serializer):
 | 
						|
    id = serializers.PrimaryKeyRelatedField(queryset=WMaterial.objects.all(), label='车间物料ID')
 | 
						|
    count_input = serializers.IntegerField(min_value=0, label='消耗数量')
 | 
						|
 | 
						|
class DoOutputSerializer(serializers.Serializer):
 | 
						|
    subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
 | 
						|
    material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label='物料ID')
 | 
						|
    count_output = serializers.IntegerField(min_value=0, label='产出数量')
 | 
						|
 | 
						|
class OperationRecordItemUpdateSerializer(serializers.Serializer):
 | 
						|
    id = serializers.PrimaryKeyRelatedField(queryset=OperationRecordItem.objects.all())
 | 
						|
    field_value = serializers.JSONField(allow_null=True, required=False)
 | 
						|
 | 
						|
class OperationRecordSubmitSerializer(serializers.ModelSerializer):
 | 
						|
    record_data = OperationRecordItemUpdateSerializer(many=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationRecord
 | 
						|
        fields = ['record_data']
 | 
						|
 | 
						|
class OperationRecordSerializer(serializers.ModelSerializer):
 | 
						|
    record_data = OperationRecordItemUpdateSerializer(many=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationRecord
 | 
						|
        fields = ['form', 'record_data']
 | 
						|
 | 
						|
class OperationWproductListSerializer(serializers.ModelSerializer):
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationWproduct
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class OperationSubmitSerializer(serializers.Serializer):
 | 
						|
    step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID")
 | 
						|
    subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False)
 | 
						|
    wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label="半成品ID列表", required=False, many=True)
 | 
						|
    input = DoInputSerializer(many=True, required=False)
 | 
						|
    output = DoOutputSerializer(many=True, required=False)
 | 
						|
    forms = OperationRecordSerializer(many=True, required=False)
 | 
						|
    remark = serializers.CharField(required=False, label='操作备注', allow_blank=True, allow_null=True)
 | 
						|
    use_scrap = serializers.BooleanField(required=False, default=False)
 | 
						|
 | 
						|
class WpmTestRecordItemCreateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = TestRecordItem
 | 
						|
        fields = ['form_field', 'field_value', 'is_testok', 'is_hidden']
 | 
						|
 | 
						|
class WpmTestRecordCreateSerializer(serializers.ModelSerializer):
 | 
						|
    record_data = WpmTestRecordItemCreateSerializer(many=True)
 | 
						|
    wproduct = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), required=True)
 | 
						|
    is_testok = serializers.BooleanField(required=False)
 | 
						|
    origin_test = serializers.PrimaryKeyRelatedField(queryset=TestRecord.objects.all(), default=None)
 | 
						|
    class Meta:
 | 
						|
        model = TestRecord
 | 
						|
        fields = ['form', 'record_data', 'is_testok', 'wproduct', 'is_submited', 'origin_test']
 | 
						|
 | 
						|
class WpmTestFormInitSerializer(serializers.Serializer):
 | 
						|
    wproduct = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), required=True)
 | 
						|
    form = serializers.PrimaryKeyRelatedField(queryset=RecordForm.objects.all(), required=True)
 | 
						|
    
 | 
						|
    # def validate(self, attrs):
 | 
						|
    #     wproduct = attrs['wproduct']
 | 
						|
    #     form = attrs.get('form', None)
 | 
						|
    #     if wproduct.act_state != WProduct.WPR_ACT_STATE_TORETEST:
 | 
						|
    #         if not form:
 | 
						|
    #             raise exceptions.APIException('请指定检查表')
 | 
						|
    #     return super().validate(attrs)
 | 
						|
 | 
						|
 | 
						|
class WplanPutInSerializer(serializers.Serializer):
 | 
						|
    warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
 | 
						|
    remark = serializers.CharField(label="入库备注", required =False)
 | 
						|
 | 
						|
class WproductPutInSerializer(serializers.Serializer):
 | 
						|
    warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
 | 
						|
    remark = serializers.CharField(label="入库备注", required =False)
 | 
						|
 | 
						|
class WproductPutInsSerializer(serializers.Serializer):
 | 
						|
    warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
 | 
						|
    wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID', many=True)
 | 
						|
    remark = serializers.CharField(label="入库备注", required =False)
 | 
						|
 | 
						|
 | 
						|
class OperationEquipListSerializer(serializers.Serializer):
 | 
						|
    equip_ = EquipmentSimpleSerializer(source='equip', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationEquip
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class OperationEquipUpdateSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = OperationEquip
 | 
						|
        fields = ['remark']
 | 
						|
 | 
						|
class OperationRecordListSerializer(serializers.ModelSerializer):
 | 
						|
    form_ = RecordFormSimpleSerializer(source='form', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationRecord
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class OperationMaterialListSerializer(serializers.ModelSerializer):
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationMaterial
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class OperationMaterialCreate1Serailizer(serializers.ModelSerializer):
 | 
						|
    wmaterial = serializers.PrimaryKeyRelatedField(required=True, queryset=WMaterial.objects.all())
 | 
						|
    class Meta:
 | 
						|
        model = OperationMaterial
 | 
						|
        fields = ['operation', 'wmaterial', 'count', 'use_scrap']
 | 
						|
    
 | 
						|
    def validate(self, attrs):
 | 
						|
        if attrs['count'] <=0:
 | 
						|
            raise exceptions.APIException('消耗物料数量错误')
 | 
						|
        
 | 
						|
        return super().validate(attrs)
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        wmaterial = validated_data['wmaterial']
 | 
						|
        validated_data['material'] = wmaterial.material
 | 
						|
        validated_data['subproduction_plan'] = wmaterial.subproduction_plan
 | 
						|
        validated_data['batch'] = wmaterial.batch
 | 
						|
        validated_data['type'] = SubprodctionMaterial.SUB_MA_TYPE_IN
 | 
						|
        operation = validated_data['operation']
 | 
						|
        if operation.is_submited:
 | 
						|
            raise exceptions.APIException('该操作已提交')
 | 
						|
        return super().create(validated_data)
 | 
						|
 | 
						|
class OperationMaterialCreate1ListSerailizer(serializers.ListSerializer):
 | 
						|
    child=OperationMaterialCreate1Serailizer()
 | 
						|
 | 
						|
class OperationMaterialCreate2Serailizer(serializers.ModelSerializer):
 | 
						|
    subproduction_progress = serializers.PrimaryKeyRelatedField(required=True, queryset=SubProductionProgress.objects.all())
 | 
						|
    class Meta:
 | 
						|
        model = OperationMaterial
 | 
						|
        fields = ['operation', 'subproduction_progress', 'count', 'use_scrap']
 | 
						|
    
 | 
						|
    def create(self, validated_data):
 | 
						|
        subproduction_progress = validated_data['subproduction_progress']
 | 
						|
        validated_data['material'] = subproduction_progress.material
 | 
						|
        validated_data['subproduction_plan'] = subproduction_progress.subproduction_plan
 | 
						|
        validated_data['type'] = SubprodctionMaterial.SUB_MA_TYPE_OUT
 | 
						|
        operation = validated_data['operation']
 | 
						|
        if operation.is_submited:
 | 
						|
            raise exceptions.APIException('该操作已提交')
 | 
						|
        return super().create(validated_data)
 | 
						|
 | 
						|
 | 
						|
class OperationMaterialCreate2ListSerailizer(serializers.ListSerializer):
 | 
						|
    child=OperationMaterialCreate2Serailizer()
 | 
						|
    
 | 
						|
class OperationMaterialCreate3Serializer(serializers.ModelSerializer):
 | 
						|
    material = serializers.PrimaryKeyRelatedField(required=True, queryset=Material.objects.all())
 | 
						|
    class Meta:
 | 
						|
        model = OperationMaterial
 | 
						|
        fields = ['operation', 'material']
 | 
						|
    
 | 
						|
    def create(self, validated_data):
 | 
						|
        validated_data['type'] = SubprodctionMaterial.SUB_MA_TYPE_TOOL
 | 
						|
        operation = validated_data['operation']
 | 
						|
        if operation.is_submited:
 | 
						|
            raise exceptions.APIException('该操作已提交')
 | 
						|
        return super().create(validated_data)
 | 
						|
 | 
						|
 | 
						|
class OperationRecordItemSerializer(serializers.ModelSerializer):
 | 
						|
    field_key = serializers.CharField(source='form_field.field_key', read_only=True)
 | 
						|
    field_name = serializers.CharField(source='form_field.field_name', read_only=True)
 | 
						|
    field_type = serializers.CharField(source='form_field.field_type', read_only=True)
 | 
						|
    field_choice = serializers.JSONField(source='form_field.field_choice', read_only=True)
 | 
						|
    is_hidden = serializers.BooleanField(source='form_field.is_hidden', read_only=True)
 | 
						|
    help_text = serializers.CharField(source='form_field.help_text', read_only=True)
 | 
						|
    sort = serializers.IntegerField(source='form_field.sort', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationRecordItem
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class OperationRecordDetailSerializer(serializers.ModelSerializer):
 | 
						|
    form_ = RecordFormSimpleSerializer(source='form', read_only=True)
 | 
						|
    record_data = serializers.SerializerMethodField()
 | 
						|
    create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationRecord
 | 
						|
        fields = '__all__'
 | 
						|
    
 | 
						|
    def get_record_data(self, obj):
 | 
						|
        return OperationRecordItemSerializer(instance=obj.item_operation_record.order_by('form_field__sort'), many=True).data
 | 
						|
 | 
						|
class ScrapSerializer(serializers.Serializer):
 | 
						|
    scrap_reason = serializers.ChoiceField(choices=WProduct.scrap_reason_choices, required=False)
 | 
						|
    # wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label='半成品ID列表')
 | 
						|
 | 
						|
 | 
						|
class WproductTicketListSerializer(serializers.ModelSerializer):
 | 
						|
    material_ = MaterialSimpleSerializer(source='material', read_only=True)
 | 
						|
    step_ = StepSimpleSerializer(source='step', read_only=True)
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    resp_process_ = ProcessSimpleSerializer(source='resp_process', read_only=True)
 | 
						|
    order_ = OrderSimpleSerializer(source='subproduction_plan.production_plan.order', read_only=True)
 | 
						|
    product_ = MaterialSimpleSerializer(source='subproduction_plan.production_plan.product', read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = WprouctTicket
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class CuttingListSerializer(serializers.ModelSerializer):
 | 
						|
    subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
 | 
						|
    from_material_ = MaterialSimpleSerializer(source='from_material', read_only=True)
 | 
						|
    create_by_ = UserSimpleSerializer(source='operation.create_by', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = OperationMaterial
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class WproductMtestSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = WProduct
 | 
						|
        fields = ['remark_mtest', 'is_mtestok'] |