修复:完善报表查询校验

This commit is contained in:
焦龙言
2026-07-27 02:04:45 +08:00
parent dfd720359a
commit 6b97bb9f49
3 changed files with 124 additions and 10 deletions
@@ -1,18 +1,40 @@
from datetime import datetime
from pydantic import BaseModel, ConfigDict, Field
from pydantic import BaseModel, ConfigDict, Field, model_validator
from pydantic.alias_generators import to_camel
from module_business.domain.enums import DocumentStatus, PalletEventType, PalletFlowState, ReturnStatus
def _parse_report_query_date(value: str) -> datetime:
try:
parsed = datetime.strptime(value, '%Y-%m-%d')
except ValueError as exc:
raise ValueError('日期必须为有效的 YYYY-MM-DD 格式') from exc
if parsed.strftime('%Y-%m-%d') != value:
raise ValueError('日期必须为有效的 YYYY-MM-DD 格式')
return parsed
def _validate_report_query_date_range(value: BaseModel) -> BaseModel:
begin_value = value.begin_time
end_value = value.end_time
begin_date = _parse_report_query_date(begin_value) if begin_value else None
end_date = _parse_report_query_date(end_value) if end_value else None
if end_date and end_date.date() == datetime.max.date():
raise ValueError('结束日期必须早于 9999-12-31')
if begin_date and end_date and begin_date > end_date:
raise ValueError('开始日期不能晚于结束日期')
return value
class PalletInventoryReportQueryModel(BaseModel):
"""托盘库存报表查询模型。"""
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
page_num: int = Field(default=1, gt=0, description='当前页码')
page_size: int = Field(default=10, gt=0, description='每页记录数')
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
begin_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='开始时间')
end_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='结束时间')
pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
@@ -23,6 +45,8 @@ class PalletInventoryReportQueryModel(BaseModel):
strain_id: int | None = Field(default=None, gt=0, description='菌种ID')
batch_no: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='生产批次')
_validate_date_range = model_validator(mode='after')(_validate_report_query_date_range)
class PalletInventoryReportModel(BaseModel):
"""托盘库存报表行模型。"""
@@ -53,7 +77,7 @@ class FillingReportQueryModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
page_num: int = Field(default=1, gt=0, description='当前页码')
page_size: int = Field(default=10, gt=0, description='每页记录数')
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
begin_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='开始时间')
end_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='结束时间')
warehouse_id: int | None = Field(default=None, gt=0, description='仓库ID')
@@ -61,6 +85,8 @@ class FillingReportQueryModel(BaseModel):
strain_id: int | None = Field(default=None, gt=0, description='菌种ID')
batch_no: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='生产批次')
_validate_date_range = model_validator(mode='after')(_validate_report_query_date_range)
class FillingReportModel(BaseModel):
"""装填记录报表行模型。"""
@@ -90,7 +116,7 @@ class ShipmentReportQueryModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
page_num: int = Field(default=1, gt=0, description='当前页码')
page_size: int = Field(default=10, gt=0, description='每页记录数')
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
begin_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='开始时间')
end_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='结束时间')
shipment_no: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='发货单号')
@@ -99,6 +125,8 @@ class ShipmentReportQueryModel(BaseModel):
pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
status: DocumentStatus | None = Field(default=None, description='单据状态')
_validate_date_range = model_validator(mode='after')(_validate_report_query_date_range)
class ShipmentReportModel(BaseModel):
"""发货出库报表行模型。"""
@@ -126,7 +154,7 @@ class ConsumptionReportQueryModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
page_num: int = Field(default=1, gt=0, description='当前页码')
page_size: int = Field(default=10, gt=0, description='每页记录数')
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
begin_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='开始时间')
end_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='结束时间')
customer_id: int | None = Field(default=None, gt=0, description='客户ID')
@@ -136,6 +164,8 @@ class ConsumptionReportQueryModel(BaseModel):
strain_id: int | None = Field(default=None, gt=0, description='菌种ID')
batch_no: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='生产批次')
_validate_date_range = model_validator(mode='after')(_validate_report_query_date_range)
class ConsumptionReportModel(BaseModel):
"""产线消耗报表行模型。"""
@@ -169,7 +199,7 @@ class ReturnReportQueryModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
page_num: int = Field(default=1, gt=0, description='当前页码')
page_size: int = Field(default=10, gt=0, description='每页记录数')
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
begin_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='开始时间')
end_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='结束时间')
return_no: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='退回单号')
@@ -178,6 +208,8 @@ class ReturnReportQueryModel(BaseModel):
pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
status: ReturnStatus | None = Field(default=None, description='退回状态')
_validate_date_range = model_validator(mode='after')(_validate_report_query_date_range)
class ReturnReportModel(BaseModel):
"""退回仓库报表行模型。"""
@@ -205,12 +237,14 @@ class PalletTraceReportQueryModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
page_num: int = Field(default=1, gt=0, description='当前页码')
page_size: int = Field(default=10, gt=0, description='每页记录数')
page_size: int = Field(default=10, gt=0, le=100, description='每页记录数')
begin_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='开始时间')
end_time: str | None = Field(default=None, min_length=1, pattern=r'\S', description='结束时间')
pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
event_type: PalletEventType | None = Field(default=None, description='事件类型')
_validate_date_range = model_validator(mode='after')(_validate_report_query_date_range)
class PalletTraceReportModel(BaseModel):
"""托盘追溯报表行模型。"""