563 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			563 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['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()
 | |
|     count_work = 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_count_work(self, obj):
 | |
|         from django.db.models.aggregates import Sum
 | |
|         count_work = 0
 | |
|         if obj.step.type == Step.STEP_TYPE_NOM:
 | |
|             count_work = OperationWproduct.objects.filter(operation=obj).count()
 | |
|         else:
 | |
|             count_work = OperationMaterial.objects.filter(operation=obj).aggregate(count_work=Sum('count'))['count_work']
 | |
|         return count_work
 | |
|     
 | |
|     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 OperationWproductUpdateSerializer(serializers.ModelSerializer):
 | |
|     class Meta:
 | |
|         model = OperationWproduct
 | |
|         fields = ['place']
 | |
| 
 | |
| 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, allow_blank=True)
 | |
| 
 | |
| 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, allow_blank=True)
 | |
| 
 | |
| 
 | |
| 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'] |