更新登录页及优化相关功能
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from datetime import datetime
|
||||
from datetime import date, datetime
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
from pydantic import BaseModel, ConfigDict, Field, computed_field, model_validator
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
from module_business.domain.enums import DocumentStatus, PalletEventType, PalletFlowState, ReturnStatus
|
||||
@@ -28,7 +28,18 @@ def _validate_report_query_date_range(value: BaseModel) -> BaseModel:
|
||||
return value
|
||||
|
||||
|
||||
class PalletInventoryReportQueryModel(BaseModel):
|
||||
class TunnelReportQueryModel(BaseModel):
|
||||
"""隧道报表共享筛选;编号/名称可直接输入,溯源号按完整值匹配。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
|
||||
tunnel_id: int | None = Field(default=None, gt=0, description='隧道ID')
|
||||
tunnel_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='隧道编号')
|
||||
tunnel_name: str | None = Field(default=None, min_length=1, max_length=100, pattern=r'\S', description='隧道名称')
|
||||
trace_no: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='内部溯源号(精确匹配)')
|
||||
|
||||
|
||||
class PalletInventoryReportQueryModel(TunnelReportQueryModel):
|
||||
"""托盘库存报表查询模型。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
@@ -69,6 +80,12 @@ class PalletInventoryReportModel(BaseModel):
|
||||
initial_packages: int | None = Field(default=None, strict=True, gt=0, description='初始包数')
|
||||
remaining_packages: int = Field(strict=True, ge=0, description='当前剩余包数')
|
||||
updated_at: datetime = Field(description='库存更新时间')
|
||||
tunnel_id: int | None = Field(default=None, gt=0, description='当前隧道ID')
|
||||
tunnel_code: str | None = Field(default=None, max_length=64, description='当前隧道编号')
|
||||
tunnel_name: str | None = Field(default=None, max_length=100, description='当前隧道名称')
|
||||
trace_no: str | None = Field(default=None, max_length=64, description='当前内部溯源号')
|
||||
production_date: date | None = Field(default=None, description='当前物料生产日期,历史未登记为空')
|
||||
expiry_date: date | None = Field(default=None, description='当前物料有效期至,历史未登记为空')
|
||||
|
||||
|
||||
class FillingReportQueryModel(BaseModel):
|
||||
@@ -148,8 +165,8 @@ class ShipmentReportModel(BaseModel):
|
||||
package_qty: int = Field(strict=True, gt=0, description='发货时包数快照')
|
||||
|
||||
|
||||
class ConsumptionReportQueryModel(BaseModel):
|
||||
"""产线消耗报表查询模型。"""
|
||||
class ConsumptionReportQueryModel(TunnelReportQueryModel):
|
||||
"""隧道消耗报表查询模型,兼容历史产线筛选。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
|
||||
@@ -168,7 +185,7 @@ class ConsumptionReportQueryModel(BaseModel):
|
||||
|
||||
|
||||
class ConsumptionReportModel(BaseModel):
|
||||
"""产线消耗报表行模型。"""
|
||||
"""隧道消耗报表行模型。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
|
||||
@@ -179,7 +196,7 @@ class ConsumptionReportModel(BaseModel):
|
||||
customer_name: str | None = Field(default=None, max_length=100, description='客户名称')
|
||||
site_id: int = Field(gt=0, description='现场ID')
|
||||
site_name: str | None = Field(default=None, max_length=100, description='现场名称')
|
||||
line_id: int = Field(gt=0, description='产线ID')
|
||||
line_id: int | None = Field(default=None, gt=0, description='产线ID(可选)')
|
||||
line_name: str | None = Field(default=None, max_length=100, description='产线名称')
|
||||
pallet_id: int = Field(gt=0, description='托盘ID')
|
||||
pallet_code: str = Field(min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
|
||||
@@ -191,9 +208,16 @@ class ConsumptionReportModel(BaseModel):
|
||||
remaining_packages_after: int = Field(strict=True, ge=0, description='使用后剩余包数')
|
||||
operator_id: int = Field(gt=0, description='操作人ID')
|
||||
operator_name: str | None = Field(default=None, max_length=100, description='操作人名称')
|
||||
tunnel_id: int | None = Field(default=None, gt=0, description='使用时隧道ID')
|
||||
tunnel_code: str | None = Field(default=None, max_length=64, description='使用时隧道编号')
|
||||
tunnel_name: str | None = Field(default=None, max_length=100, description='使用时隧道名称')
|
||||
trace_no: str | None = Field(default=None, max_length=64, description='使用时内部溯源号')
|
||||
batch_no_snapshot: str | None = Field(default=None, max_length=64, description='使用时生产批次快照')
|
||||
production_date: date | None = Field(default=None, description='使用时原装填物料生产日期')
|
||||
expiry_date: date | None = Field(default=None, description='使用时原装填物料有效期至')
|
||||
|
||||
|
||||
class ReturnReportQueryModel(BaseModel):
|
||||
class ReturnReportQueryModel(TunnelReportQueryModel):
|
||||
"""退回仓库报表查询模型。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
@@ -207,6 +231,7 @@ class ReturnReportQueryModel(BaseModel):
|
||||
target_warehouse_id: int | None = Field(default=None, gt=0, description='目标仓库ID')
|
||||
pallet_code: str | None = Field(default=None, min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
|
||||
status: ReturnStatus | None = Field(default=None, description='退回状态')
|
||||
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)
|
||||
|
||||
@@ -229,9 +254,17 @@ class ReturnReportModel(BaseModel):
|
||||
pallet_code: str = Field(min_length=1, max_length=64, pattern=r'\S', description='托盘编号')
|
||||
active_filling_id_snapshot: int | None = Field(default=None, gt=0, description='活动装填记录快照')
|
||||
remaining_packages_snapshot: int = Field(strict=True, ge=0, description='剩余包数快照')
|
||||
tunnel_id: int | None = Field(default=None, gt=0, description='退回时隧道ID快照')
|
||||
tunnel_code: str | None = Field(default=None, max_length=64, description='退回隧道编号')
|
||||
tunnel_name: str | None = Field(default=None, max_length=100, description='退回隧道名称')
|
||||
trace_no: str | None = Field(default=None, max_length=64, description='退回时内部溯源号快照')
|
||||
batch_no_snapshot: str | None = Field(default=None, max_length=64, description='退回时生产批次快照')
|
||||
batch_no: str | None = Field(default=None, max_length=64, description='生产批次,历史记录回查原装填记录')
|
||||
production_date: date | None = Field(default=None, description='退回时原装填物料生产日期')
|
||||
expiry_date: date | None = Field(default=None, description='退回时原装填物料有效期至')
|
||||
|
||||
|
||||
class PalletTraceReportQueryModel(BaseModel):
|
||||
class PalletTraceReportQueryModel(TunnelReportQueryModel):
|
||||
"""托盘追溯报表查询模型。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
@@ -242,6 +275,7 @@ class PalletTraceReportQueryModel(BaseModel):
|
||||
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='事件类型')
|
||||
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)
|
||||
|
||||
@@ -277,3 +311,29 @@ class PalletTraceReportModel(BaseModel):
|
||||
operator_id: int = Field(gt=0, description='操作人ID')
|
||||
operator_name: str | None = Field(default=None, max_length=100, description='操作人名称')
|
||||
occurred_at: datetime = Field(description='发生时间')
|
||||
tunnel_id: int | None = Field(default=None, gt=0, description='事件隧道ID,优先变更后隧道')
|
||||
tunnel_code: str | None = Field(default=None, max_length=64, description='事件隧道编号')
|
||||
tunnel_name: str | None = Field(default=None, max_length=100, description='事件隧道名称')
|
||||
trace_no: str | None = Field(default=None, max_length=64, description='事件内部溯源号')
|
||||
batch_no_snapshot: str | None = Field(default=None, max_length=64, description='事件生产批次快照')
|
||||
before_tunnel_id: int | None = Field(default=None, gt=0, description='变更前隧道ID')
|
||||
before_tunnel_code: str | None = Field(default=None, max_length=64, description='变更前隧道编号')
|
||||
before_tunnel_name: str | None = Field(default=None, max_length=100, description='变更前隧道名称')
|
||||
after_tunnel_id: int | None = Field(default=None, gt=0, description='变更后隧道ID')
|
||||
after_tunnel_code: str | None = Field(default=None, max_length=64, description='变更后隧道编号')
|
||||
after_tunnel_name: str | None = Field(default=None, max_length=100, description='变更后隧道名称')
|
||||
production_date: date | None = Field(default=None, description='事件原装填物料生产日期')
|
||||
expiry_date: date | None = Field(default=None, description='事件原装填物料有效期至')
|
||||
|
||||
@computed_field(description='本事件实际使用包数,仅使用事件计入')
|
||||
@property
|
||||
def used_packages(self) -> int:
|
||||
return (
|
||||
self.before_remaining_packages - self.after_remaining_packages
|
||||
if self.event_type == PalletEventType.USAGE_RECORDED else 0
|
||||
)
|
||||
|
||||
@computed_field(description='本事件确认退回包数,退回申请不重复计入')
|
||||
@property
|
||||
def returned_packages(self) -> int:
|
||||
return self.before_remaining_packages if self.event_type == PalletEventType.RETURN_CONFIRMED else 0
|
||||
|
||||
Reference in New Issue
Block a user