Files
shanxia2.0/backend/app/schemas/pl/base_data.py
T
2026-06-21 09:19:07 +08:00

259 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""运输计划管理 - 基础数据 Schema(承运商、车辆、人员、证书)"""
from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from pydantic import BaseModel, Field
# =============================================================================
# 承运商 Schema
# =============================================================================
class CarrierBase(BaseModel):
carrier_name: str = Field(..., max_length=200, alias="carrierName", description="承运商名称")
contact_name: Optional[str] = Field(default=None, max_length=100, alias="contactName", description="联系人")
contact_phone: Optional[str] = Field(default=None, max_length=32, alias="contactPhone", description="联系电话")
status: str = Field(default="1", max_length=1, description="合作状态 1-合作中 0-已终止")
remark: Optional[str] = Field(default=None, description="备注")
class CarrierCreate(CarrierBase):
model_config = {"populate_by_name": True}
class CarrierUpdate(BaseModel):
carrier_name: Optional[str] = Field(default=None, max_length=200, alias="carrierName")
contact_name: Optional[str] = Field(default=None, max_length=100, alias="contactName")
contact_phone: Optional[str] = Field(default=None, max_length=32, alias="contactPhone")
status: Optional[str] = Field(default=None, max_length=1)
remark: Optional[str] = None
model_config = {"populate_by_name": True}
class CarrierRead(CarrierBase):
id: str
tenant_no: str = Field(alias="tenantNo")
order_num: Optional[int] = Field(default=None, alias="orderNum")
create_by: Optional[str] = Field(default=None, alias="createBy")
create_dept_id: Optional[str] = Field(default=None, alias="createDeptId")
create_time: datetime = Field(alias="createTime")
update_by: Optional[str] = Field(default=None, alias="updateBy")
update_time: datetime = Field(alias="updateTime")
del_flag: int = Field(default=0, alias="delFlag")
model_config = {"from_attributes": True, "populate_by_name": True}
# =============================================================================
# 子表行 Schema
# =============================================================================
class VehiclePersonnelRow(BaseModel):
personnel_id: Optional[str] = Field(default=None, alias="personnelId")
personnel_name: str = Field(..., alias="personnelName")
phone_no: Optional[str] = Field(default=None, alias="phoneNo")
age: Optional[int] = None
role: str = Field(..., description="driver|escort")
is_default: int = Field(default=0, alias="isDefault")
remark: Optional[str] = None
model_config = {"populate_by_name": True}
class CertRow(BaseModel):
cert_id: Optional[str] = Field(default=None, alias="certId")
cert_name: str = Field(..., alias="certName")
cert_no: Optional[str] = Field(default=None, alias="certNo")
expire_date: Optional[date] = Field(default=None, alias="expireDate")
remind_days: int = Field(default=30, alias="remindDays")
attachment_urls: Optional[str] = Field(default=None, alias="attachmentUrls")
model_config = {"populate_by_name": True}
class CertRead(CertRow):
id: str
owner_type: str = Field(alias="ownerType")
owner_id: str = Field(alias="ownerId")
status: str
tenant_no: str = Field(alias="tenantNo")
create_time: datetime = Field(alias="createTime")
update_time: datetime = Field(alias="updateTime")
model_config = {"from_attributes": True, "populate_by_name": True}
# =============================================================================
# 车辆 Schema
# =============================================================================
class VehicleBase(BaseModel):
vehicle_type: str = Field(..., alias="vehicleType", description="车辆类型 self-自有 carrier-承运商")
carrier_id: Optional[str] = Field(default=None, alias="carrierId", description="承运商ID")
carrier_name: Optional[str] = Field(default=None, max_length=200, alias="carrierName", description="承运商名称")
license_plate: str = Field(..., max_length=20, alias="licensePlate", description="车牌号")
default_driver_id: Optional[str] = Field(default=None, alias="defaultDriverId", description="默认司机ID(只读兼容)")
default_driver_name: Optional[str] = Field(default=None, max_length=100, alias="defaultDriverName", description="默认司机姓名(只读兼容)")
load_capacity: Optional[Decimal] = Field(default=None, alias="loadCapacity", description="载重(吨)")
vehicle_status: str = Field(default="available", max_length=20, alias="vehicleStatus", description="车辆状态")
remark: Optional[str] = None
class VehicleCreate(VehicleBase):
personnel_list: list[VehiclePersonnelRow] = Field(default_factory=list, alias="personnelList")
cert_list: list[CertRow] = Field(default_factory=list, alias="certList")
model_config = {"populate_by_name": True}
class VehicleUpdate(BaseModel):
vehicle_type: Optional[str] = Field(default=None, max_length=20, alias="vehicleType")
carrier_id: Optional[str] = Field(default=None, alias="carrierId")
carrier_name: Optional[str] = Field(default=None, max_length=200, alias="carrierName")
license_plate: Optional[str] = Field(default=None, max_length=20, alias="licensePlate")
load_capacity: Optional[Decimal] = Field(default=None, alias="loadCapacity")
vehicle_status: Optional[str] = Field(default=None, max_length=20, alias="vehicleStatus")
remark: Optional[str] = None
personnel_list: Optional[list[VehiclePersonnelRow]] = Field(default=None, alias="personnelList")
cert_list: Optional[list[CertRow]] = Field(default=None, alias="certList")
model_config = {"populate_by_name": True}
class VehicleRead(VehicleBase):
id: str
tenant_no: str = Field(alias="tenantNo")
order_num: Optional[int] = Field(default=None, alias="orderNum")
personnel_summary: Optional[str] = Field(default=None, alias="personnelSummary")
create_by: Optional[str] = Field(default=None, alias="createBy")
create_dept_id: Optional[str] = Field(default=None, alias="createDeptId")
create_time: datetime = Field(alias="createTime")
update_by: Optional[str] = Field(default=None, alias="updateBy")
update_time: datetime = Field(alias="updateTime")
del_flag: int = Field(default=0, alias="delFlag")
model_config = {"from_attributes": True, "populate_by_name": True}
class VehicleDetailRead(VehicleRead):
personnel_list: list[VehiclePersonnelRow] = Field(default_factory=list, alias="personnelList")
cert_list: list[CertRead] = Field(default_factory=list, alias="certList")
model_config = {"from_attributes": True, "populate_by_name": True}
# =============================================================================
# 人员 Schema
# =============================================================================
class PersonnelBase(BaseModel):
personnel_name: str = Field(..., max_length=100, alias="personnelName", description="姓名")
phone_no: Optional[str] = Field(default=None, max_length=32, alias="phoneNo", description="手机号")
age: Optional[int] = Field(default=None, description="年龄")
id_card_no: Optional[str] = Field(default=None, max_length=32, alias="idCardNo", description="身份证号")
status: str = Field(default="1", max_length=1, description="状态 1-在职 0-停用")
remark: Optional[str] = None
class PersonnelCreate(PersonnelBase):
cert_list: list[CertRow] = Field(default_factory=list, alias="certList")
model_config = {"populate_by_name": True}
class PersonnelUpdate(BaseModel):
personnel_name: Optional[str] = Field(default=None, max_length=100, alias="personnelName")
phone_no: Optional[str] = Field(default=None, max_length=32, alias="phoneNo")
age: Optional[int] = None
id_card_no: Optional[str] = Field(default=None, max_length=32, alias="idCardNo")
status: Optional[str] = Field(default=None, max_length=1)
remark: Optional[str] = None
cert_list: Optional[list[CertRow]] = Field(default=None, alias="certList")
model_config = {"populate_by_name": True}
class PersonnelRead(PersonnelBase):
id: str
tenant_no: str = Field(alias="tenantNo")
order_num: Optional[int] = Field(default=None, alias="orderNum")
nearest_expire_date: Optional[date] = Field(default=None, alias="nearestExpireDate")
create_by: Optional[str] = Field(default=None, alias="createBy")
create_dept_id: Optional[str] = Field(default=None, alias="createDeptId")
create_time: datetime = Field(alias="createTime")
update_by: Optional[str] = Field(default=None, alias="updateBy")
update_time: datetime = Field(alias="updateTime")
del_flag: int = Field(default=0, alias="delFlag")
model_config = {"from_attributes": True, "populate_by_name": True}
class PersonnelDetailRead(PersonnelRead):
cert_list: list[CertRead] = Field(default_factory=list, alias="certList")
model_config = {"from_attributes": True, "populate_by_name": True}
# =============================================================================
# 司机 Schema(兼容旧 API)
# =============================================================================
class DriverBase(BaseModel):
driver_name: str = Field(..., max_length=100, alias="driverName", description="姓名")
phone_no: Optional[str] = Field(default=None, max_length=32, alias="phoneNo", description="手机号")
id_card_no: Optional[str] = Field(default=None, max_length=32, alias="idCardNo", description="身份证号")
driving_license_no: Optional[str] = Field(default=None, max_length=32, alias="drivingLicenseNo", description="驾驶证号")
driving_license_expire: Optional[date] = Field(default=None, alias="drivingLicenseExpire", description="驾驶证有效期")
vehicle_license_no: Optional[str] = Field(default=None, max_length=32, alias="vehicleLicenseNo", description="行驶证号")
vehicle_license_expire: Optional[date] = Field(default=None, alias="vehicleLicenseExpire", description="行驶证有效期")
hazmat_cert_no: Optional[str] = Field(default=None, max_length=32, alias="hazmatCertNo", description="危化品证号")
hazmat_cert_expire: Optional[date] = Field(default=None, alias="hazmatCertExpire", description="危化品证有效期")
remark: Optional[str] = None
class DriverCreate(DriverBase):
model_config = {"populate_by_name": True}
class DriverUpdate(BaseModel):
driver_name: Optional[str] = Field(default=None, max_length=100, alias="driverName")
phone_no: Optional[str] = Field(default=None, max_length=32, alias="phoneNo")
id_card_no: Optional[str] = Field(default=None, max_length=32, alias="idCardNo")
driving_license_no: Optional[str] = Field(default=None, max_length=32, alias="drivingLicenseNo")
driving_license_expire: Optional[date] = Field(default=None, alias="drivingLicenseExpire")
vehicle_license_no: Optional[str] = Field(default=None, max_length=32, alias="vehicleLicenseNo")
vehicle_license_expire: Optional[date] = Field(default=None, alias="vehicleLicenseExpire")
hazmat_cert_no: Optional[str] = Field(default=None, max_length=32, alias="hazmatCertNo")
hazmat_cert_expire: Optional[date] = Field(default=None, alias="hazmatCertExpire")
remark: Optional[str] = None
model_config = {"populate_by_name": True}
class DriverRead(DriverBase):
id: str
tenant_no: str = Field(alias="tenantNo")
order_num: Optional[int] = Field(default=None, alias="orderNum")
create_by: Optional[str] = Field(default=None, alias="createBy")
create_dept_id: Optional[str] = Field(default=None, alias="createDeptId")
create_time: datetime = Field(alias="createTime")
update_by: Optional[str] = Field(default=None, alias="updateBy")
update_time: datetime = Field(alias="updateTime")
del_flag: int = Field(default=0, alias="delFlag")
model_config = {"from_attributes": True, "populate_by_name": True}
# =============================================================================
# 车辆-司机关联 Schema(兼容)
# =============================================================================
class VehicleDriverCreate(BaseModel):
vehicle_id: str = Field(..., alias="vehicleId", description="车辆ID")
driver_id: str = Field(..., alias="driverId", description="司机ID")
is_default: int = Field(default=0, alias="isDefault", description="是否默认 0-否 1-是")
model_config = {"populate_by_name": True}
class VehicleDriverRead(BaseModel):
id: str
vehicle_id: str = Field(alias="vehicleId")
driver_id: str = Field(alias="driverId")
is_default: int = Field(alias="isDefault")
tenant_no: str = Field(alias="tenantNo")
create_time: datetime = Field(alias="createTime")
model_config = {"from_attributes": True, "populate_by_name": True}