from rest_framework import serializers from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS_DEPT, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS from rest_framework.exceptions import ValidationError from apps.pum.models import Supplier, PuPlan, PuPlanItem, PuOrder, PuOrderItem, SupplierAudit from apps.mtm.serializers import MaterialSerializer, MaterialSimpleSerializer from django.db import transaction from .services import PumService from apps.wf.serializers import TicketSimpleSerializer from apps.system.serializers import FileSerializer class SupplierSerializer(CustomModelSerializer): class Meta: model = Supplier fields = '__all__' read_only_fields = EXCLUDE_FIELDS_DEPT class PuPlanSerializer(CustomModelSerializer): class Meta: model = PuPlan fields = '__all__' read_only_fields = EXCLUDE_FIELDS_DEPT + ['state', 'submit_time', 'total_price'] def update(self, instance, validated_data): if instance.state != PuPlan.PUPLAN_CREATE: raise ValidationError('该状态下不可编辑') return super().update(instance, validated_data) class PuPlanItemSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) pu_plan_number = serializers.CharField( source='pu_plan.number', read_only=True) create_by_name = serializers.CharField( source='create_by.name', read_only=True) belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) note = serializers.CharField(required=False, allow_blank=True) class Meta: model = PuPlanItem fields = '__all__' read_only_fields = EXCLUDE_FIELDS + ['pu_order'] def create(self, validated_data): pu_plan = validated_data['pu_plan'] if pu_plan.state != PuPlan.PUPLAN_CREATE: raise ValidationError('该状态下不可添加需求') material = validated_data['material'] self.complete_belong_dept(validated_data) if PuPlanItem.objects.filter(material=material, belong_dept=validated_data['belong_dept']).exists(): raise ValidationError('同部门已提交该物料需求,请确认!') ins = super().create(validated_data) PumService.cal_pu_plan_total_price(pu_plan) return ins def complete_belong_dept(self, validated_data): belong_dept = validated_data.get('belong_dept', None) if belong_dept is None: belong_dept = self.context['request'].user.belong_dept if belong_dept is None: raise ValidationError('所属部门不可为空') else: validated_data['belong_dept'] = belong_dept def update(self, instance, validated_data): validated_data.pop('pu_plan') pu_plan = instance.pu_plan if pu_plan.state != PuPlan.PUPLAN_CREATE: raise ValidationError('该状态下不可编辑需求') material = validated_data['material'] user = self.context['request'].user if instance.create_by != user: raise ValidationError('非创建人不可编辑') self.complete_belong_dept(validated_data) if PuPlanItem.objects.exclude(id=instance.id).filter(material=material, belong_dept=validated_data['belong_dept']).exists(): raise ValidationError('同部门已提交该物料需求,请确认!') ins = super().update(instance, validated_data) PumService.cal_pu_plan_total_price(pu_plan) return ins class PuOrderSerializer(CustomModelSerializer): supplier_name = serializers.CharField( source='supplier.name', read_only=True) create_by_name = serializers.CharField( source='create_by.name', read_only=True) update_by_name = serializers.CharField( source='update_by.name', read_only=True) materials_ = MaterialSimpleSerializer( source='materials', many=True, read_only=True) class Meta: model = PuOrder fields = '__all__' read_only_fields = EXCLUDE_FIELDS_DEPT + ['state', 'submit_time', 'total_price'] def update(self, instance, validated_data): validated_data.pop('supplier') if instance.state != PuOrder.PUORDER_CREATE: raise ValidationError('该状态下不可编辑') return super().update(instance, validated_data) class PuOrderItemSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) class Meta: model = PuOrderItem fields = '__all__' read_only_fields = EXCLUDE_FIELDS_BASE + ['delivered_count'] def create(self, validated_data): pu_order = validated_data['pu_order'] material = validated_data['material'] if pu_order.state != PuOrder.PUORDER_CREATE: raise ValidationError('采购订单该状态下不可添加明细') if PuOrderItem.objects.filter(pu_order=pu_order, material=material).exists(): raise ValidationError('该物料已添加') ins = super().create(validated_data) PumService.cal_pu_order_total_price(pu_order) return ins def update(self, instance, validated_data): validated_data.pop('material') validated_data.pop('pu_order') pu_order = instance.pu_order if pu_order.state != PuOrder.PUORDER_CREATE: raise ValidationError('采购订单该状态下不可编辑') ins = super().update(instance, validated_data) PumService.cal_pu_order_total_price(pu_order) return ins class AddSerializer(serializers.Serializer): pu_order = serializers.PrimaryKeyRelatedField( label='采购订单ID', queryset=PuOrder.objects.all()) pu_planitems = serializers.PrimaryKeyRelatedField( label='计划明细ID', queryset=PuPlanItem.objects.all(), many=True) class SupplierAuditSerializer(CustomModelSerializer): survery_form_ = FileSerializer(source="survery_form", read_only=True) business_license_ = FileSerializer(source="business_license", read_only=True) quality_certificate_ = FileSerializer(source="quality_certificate", read_only=True) ticket_ = TicketSimpleSerializer(source="ticket", read_only=True) class Meta: model = SupplierAudit fields = "__all__"