From 479851ba4c1604145068a53a4e6f4d925d86ae54 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Sun, 2 Aug 2026 10:30:14 +0800 Subject: [PATCH] feat(pl): expose photoUrls on vehicle and personnel APIs Co-authored-by: Cursor --- backend/app/api/pl/base_data.py | 2 + backend/app/schemas/pl/base_data.py | 12 ++++++ .../test_pl_vehicle_personnel_photo_schema.py | 39 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 backend/tests/test_pl_vehicle_personnel_photo_schema.py diff --git a/backend/app/api/pl/base_data.py b/backend/app/api/pl/base_data.py index 87ace7bb7..0b4f26014 100644 --- a/backend/app/api/pl/base_data.py +++ b/backend/app/api/pl/base_data.py @@ -414,6 +414,7 @@ def create_vehicle( trailer_no=payload.trailer_no, load_capacity=payload.load_capacity, vehicle_status=payload.vehicle_status, + photo_urls=payload.photo_urls, remark=payload.remark, create_by=user.id, create_dept_id=user.dept_id, @@ -680,6 +681,7 @@ def create_personnel( personnel_type=payload.personnel_type, personnel_affiliation=payload.personnel_affiliation, status=payload.status, + photo_urls=payload.photo_urls, remark=payload.remark, create_by=user.id, create_dept_id=user.dept_id, diff --git a/backend/app/schemas/pl/base_data.py b/backend/app/schemas/pl/base_data.py index 7b319459a..d8c769819 100644 --- a/backend/app/schemas/pl/base_data.py +++ b/backend/app/schemas/pl/base_data.py @@ -181,6 +181,9 @@ class VehicleBase(BaseModel): 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="车辆状态") + photo_urls: Optional[str] = Field( + default=None, max_length=2000, alias="photoUrls", description="车辆照片URL,逗号分隔(默认1张)" + ) remark: Optional[str] = None @@ -198,6 +201,9 @@ class VehicleUpdate(BaseModel): trailer_no: Optional[str] = Field(default=None, max_length=20, alias="trailerNo") load_capacity: Optional[Decimal] = Field(default=None, alias="loadCapacity") vehicle_status: Optional[str] = Field(default=None, max_length=20, alias="vehicleStatus") + photo_urls: Optional[str] = Field( + default=None, max_length=2000, alias="photoUrls", description="车辆照片URL,逗号分隔(默认1张)" + ) remark: Optional[str] = None personnel_list: Optional[list[VehiclePersonnelRow]] = Field(default=None, alias="personnelList") cert_list: Optional[list[CertRow]] = Field(default=None, alias="certList") @@ -248,6 +254,9 @@ class PersonnelBase(BaseModel): description="人员归属 self-山峡 carrier-非山峡", ) status: str = Field(default="1", max_length=1, description="状态 1-在职 0-停用") + photo_urls: Optional[str] = Field( + default=None, max_length=2000, alias="photoUrls", description="人员照片URL,逗号分隔(默认1张)" + ) remark: Optional[str] = None @@ -266,6 +275,9 @@ class PersonnelUpdate(BaseModel): default=None, max_length=20, alias="personnelAffiliation" ) status: Optional[str] = Field(default=None, max_length=1) + photo_urls: Optional[str] = Field( + default=None, max_length=2000, alias="photoUrls", description="人员照片URL,逗号分隔(默认1张)" + ) remark: Optional[str] = None cert_list: Optional[list[CertRow]] = Field(default=None, alias="certList") model_config = {"populate_by_name": True} diff --git a/backend/tests/test_pl_vehicle_personnel_photo_schema.py b/backend/tests/test_pl_vehicle_personnel_photo_schema.py new file mode 100644 index 000000000..01a5d49ed --- /dev/null +++ b/backend/tests/test_pl_vehicle_personnel_photo_schema.py @@ -0,0 +1,39 @@ +"""车辆/人员 Schema 接受 photoUrls。""" +from __future__ import annotations + +from app.schemas.pl.base_data import PersonnelCreate, PersonnelUpdate, VehicleCreate, VehicleUpdate + + +def test_vehicle_create_accepts_photo_urls(): + body = VehicleCreate.model_validate( + { + "vehicleType": "carrier", + "licensePlate": "皖A12345", + "vehicleStatus": "available", + "photoUrls": "pl/vehicle-photo/a.jpg", + } + ) + assert body.photo_urls == "pl/vehicle-photo/a.jpg" + + +def test_vehicle_update_accepts_photo_urls(): + body = VehicleUpdate.model_validate({"photoUrls": "pl/vehicle-photo/b.jpg"}) + assert body.photo_urls == "pl/vehicle-photo/b.jpg" + + +def test_personnel_create_accepts_photo_urls(): + body = PersonnelCreate.model_validate( + { + "personnelName": "张三", + "personnelType": "driver", + "personnelAffiliation": "self", + "status": "1", + "photoUrls": "pl/personnel-photo/c.jpg", + } + ) + assert body.photo_urls == "pl/personnel-photo/c.jpg" + + +def test_personnel_update_accepts_photo_urls(): + body = PersonnelUpdate.model_validate({"photoUrls": ""}) + assert body.photo_urls == ""