quotation.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. """Pydantic schemas - 报价单管理"""
  2. from pydantic import BaseModel, Field
  3. from typing import Optional, List
  4. from datetime import datetime
  5. from decimal import Decimal
  6. class QuotationItemBase(BaseModel):
  7. """报价单项基础字段"""
  8. product_id: str = Field(..., description="商品ID")
  9. unit_id: str = Field(..., description="单位ID")
  10. price: Decimal = Field(..., description="单价")
  11. class QuotationItemCreate(QuotationItemBase):
  12. """创建报价单项请求"""
  13. pass
  14. class QuotationItemUpdate(BaseModel):
  15. """更新报价单项请求"""
  16. unit_id: Optional[str] = None
  17. price: Optional[Decimal] = None
  18. class QuotationItemResponse(QuotationItemBase):
  19. """报价单项响应"""
  20. id: str
  21. quotation_id: str
  22. is_del: int
  23. create_at: Optional[datetime] = None
  24. class Config:
  25. from_attributes = True
  26. class QuotationBase(BaseModel):
  27. """报价单基础字段"""
  28. inquiry_id: str = Field(..., description="询价单ID")
  29. items: List[QuotationItemCreate] = Field(default_factory=list, description="报价项列表")
  30. class QuotationCreate(QuotationBase):
  31. """创建报价单请求"""
  32. pass
  33. class QuotationUpdate(BaseModel):
  34. """更新报价单请求"""
  35. items: Optional[List[QuotationItemCreate]] = None
  36. class QuotationResponse(BaseModel):
  37. """报价单响应"""
  38. id: str
  39. inquiry_id: str
  40. supplier_id: str
  41. region_id: str
  42. status: str
  43. total_amount: Decimal
  44. submit_time: Optional[datetime] = None
  45. is_del: int
  46. create_at: Optional[datetime] = None
  47. create_by: Optional[str] = None
  48. create_name: Optional[str] = None
  49. update_at: Optional[datetime] = None
  50. class Config:
  51. from_attributes = True
  52. class QuotationDetailResponse(QuotationResponse):
  53. """报价单详情响应(包含报价项)"""
  54. items: List[QuotationItemResponse] = []
  55. class QuotationListResponse(BaseModel):
  56. """报价单列表响应"""
  57. items: List[QuotationResponse]
  58. total: int
  59. page: int
  60. pageSize: int
  61. totalPages: int
  62. class QuotationStatusResponse(BaseModel):
  63. """报价单状态更新响应"""
  64. id: str
  65. status: str
  66. message: str = "操作成功"
  67. class QuotationWithSupplierResponse(QuotationResponse):
  68. """带供应商信息的报价单响应"""
  69. supplier_name: Optional[str] = None
  70. supplier_phone: Optional[str] = None
  71. region_name: Optional[str] = None
  72. class QuotationWithItemsResponse(QuotationDetailResponse):
  73. """带询价信息的报价单响应"""
  74. inquiry_title: Optional[str] = None
  75. inquiry_status: Optional[str] = None
  76. supplier_name: Optional[str] = None
  77. supplier_phone: Optional[str] = None
  78. region_name: Optional[str] = None