serializers.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from rest_framework import serializers
  2. from .models import InboundBill, MaterialDetail
  3. from utils import datasolve
  4. class InboundApplySerializer(serializers.ModelSerializer):
  5. """
  6. 生产入库申请序列化器
  7. """
  8. class Meta:
  9. model = InboundBill
  10. fields = '__all__'
  11. ordering_fields = ['update_time', 'create_time']
  12. read_only_fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount']
  13. class boundPostSerializer(serializers.Serializer):
  14. """
  15. 生产入库申请序列化器
  16. """
  17. billId = serializers.IntegerField(required=True, label='原始单据ID')
  18. number = serializers.CharField(required=True, label='单据编号')
  19. type = serializers.IntegerField(required=True, label='绑定类型')
  20. date = serializers.CharField(required=True, label='入库时间')
  21. department = serializers.CharField(required=True, label='部门')
  22. warehouse = serializers.CharField(required=True, label='仓库')
  23. creater = serializers.CharField(required=True, label='创建人')
  24. note = serializers.CharField(required=False, label='备注说明')
  25. totalCount = serializers.IntegerField(required=True, label='总条目数')
  26. materials = serializers.ListField(required=True, label='物料明细')
  27. class Meta:
  28. fields = ['billId', 'number', 'type', 'date', 'department', 'warehouse', 'creater', 'note', 'totalCount','materials']
  29. def validate_materials(self, value):
  30. """
  31. 增强版物料明细验证
  32. 返回带具体缺失字段的错误信息
  33. """
  34. required_fields = [
  35. 'entryIds', 'production_batch',
  36. 'goods_code', 'goods_name', 'goods_std',
  37. 'plan_qty',
  38. 'goods_unit'
  39. ]
  40. errors = []
  41. for index, item in enumerate(value):
  42. # 识别缺失字段
  43. missing_fields = [field for field in required_fields if field not in item]
  44. if missing_fields:
  45. errors.append({
  46. "index": index,
  47. "entryIds": item.get('entryIds'), # 保留原始标识
  48. "production_batch": item.get('production_batch'),
  49. "missing_fields": missing_fields,
  50. "message": f"第{index+1}条物料缺少必填字段: {', '.join(missing_fields)}"
  51. })
  52. if errors:
  53. # 抛出结构化错误
  54. raise serializers.ValidationError([
  55. {
  56. "detail": error["message"],
  57. "metadata": {
  58. "entryIds": error["entryIds"],
  59. "production_batch": error["production_batch"],
  60. "missing_fields": error["missing_fields"]
  61. }
  62. } for error in errors
  63. ])
  64. return value
  65. class MaterialDetailSerializer(serializers.ModelSerializer):
  66. """
  67. 物料明细序列化器
  68. """
  69. class Meta:
  70. model = MaterialDetail
  71. exclude = ['id', 'note']
  72. read_only_fields = ['entryIds', 'production_batch', 'goods_code', 'goods_name', 'goods_std', 'goods_weight', 'plan_qty', 'goods_total_weight', 'goods_unit', 'note']