from rest_framework import serializers from .models import InboundBill, MaterialDetail ,OutboundBill, OutMaterialDetail from utils import datasolve class InboundApplySerializer(serializers.ModelSerializer): """ 生产入库申请序列化器 """ billId = serializers.CharField( read_only=True) # 新增显式声明 class Meta: model = InboundBill fields = '__all__' ordering_fields = ['update_time', 'create_time'] read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount'] class OutboundApplySerializer(serializers.ModelSerializer): """ 生产出库申请序列化器 """ billId = serializers.CharField( read_only=True) # 新增显式声明 class Meta: model = OutboundBill fields = '__all__' ordering_fields = ['update_time', 'create_time'] read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount'] class boundPostSerializer(serializers.Serializer): """ 生产入库申请序列化器 """ billId = serializers.IntegerField(required=True, label='原始单据ID') number = serializers.CharField(required=True, label='单据编号') type = serializers.IntegerField(required=True, label='绑定类型') date = serializers.CharField(required=True, label='入库时间') department = serializers.CharField(required=False, label='部门') warehouse = serializers.CharField(required=True, label='仓库') creater = serializers.CharField(required=True, label='创建人') note = serializers.CharField(required=False, label='备注说明') totalCount = serializers.IntegerField(required=True, label='总条目数') materials = serializers.ListField(required=True, label='物料明细') class Meta: fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials'] def validate_materials(self, value): """ 增强版物料明细验证 返回带具体缺失字段的错误信息 """ required_fields = [ 'entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_std', 'plan_qty', 'goods_unit' ] errors = [] for index, item in enumerate(value): # 识别缺失字段 missing_fields = [field for field in required_fields if field not in item] if missing_fields: errors.append({ "index": index, "entryIds": item.get('entryIds'), # 保留原始标识 "production_batch": item.get('production_batch'), "missing_fields": missing_fields, "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}" }) if errors: # 抛出结构化错误 raise serializers.ValidationError([ { "detail": error["message"], "metadata": { "entryIds": error["entryIds"], "production_batch": error["production_batch"], "missing_fields": error["missing_fields"] } } for error in errors ]) return value class MaterialDetailSerializer(serializers.ModelSerializer): """ 物料明细序列化器 """ class Meta: model = MaterialDetail exclude = ['id', 'note'] read_only_fields = ['entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_std', 'goods_weight', 'plan_qty', 'goods_total_weight', 'goods_unit', 'note'] class OutMaterialDetailSerializer(serializers.ModelSerializer): """ 物料明细序列化器 """ class Meta: model = OutMaterialDetail exclude = ['id', 'note'] read_only_fields = ['entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_weight', 'goods_out_qty', 'goods_total_weight', 'goods_unit', 'note'] class outboundPostSerializer(serializers.Serializer): """ 生产入库申请序列化器 """ billId = serializers.IntegerField(required=True, label='原始单据ID') number = serializers.CharField(required=True, label='单据编号') type = serializers.IntegerField(required=True, label='绑定类型') date = serializers.CharField(required=True, label='出库时间') department = serializers.CharField(required=False, label='部门',default='空') warehouse = serializers.CharField(required=True, label='仓库') creater = serializers.CharField(required=True, label='创建人') note = serializers.CharField(required=False, label='备注说明') totalCount = serializers.IntegerField(required=True, label='总条目数') materials = serializers.ListField(required=True, label='物料明细') class Meta: fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials'] def validate_materials(self, value): """ 增强版物料明细验证 返回带具体缺失字段的错误信息 """ required_fields = [ 'entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_out_qty', 'goods_unit' ] errors = [] for index, item in enumerate(value): # 识别缺失字段 missing_fields = [field for field in required_fields if field not in item] if missing_fields: errors.append({ "index": index, "entryIds": item.get('entryIds'), # 保留原始标识 "production_batch": item.get('production_batch'), "missing_fields": missing_fields, "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}" }) if errors: # 抛出结构化错误 raise serializers.ValidationError([ { "detail": error["message"], "metadata": { "entryIds": error["entryIds"], "production_batch": error["production_batch"], "missing_fields": error["missing_fields"] } } for error in errors ]) return value