259 lines
13 KiB
Python
259 lines
13 KiB
Python
"""运输计划管理 - 基础数据 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}
|