123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- from rest_framework import serializers
- from .models import InboundBill, MaterialDetail
- from utils import datasolve
- class InboundApplySerializer(serializers.ModelSerializer):
- """
- 生产入库申请序列化器
- """
- class Meta:
- model = InboundBill
- exclude = [ 'creater', 'note', 'totalCount']
- 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=True, 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']
|