Просмотр исходного кода

feat(pl): expose photoUrls on vehicle and personnel APIs

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 3 месяцев назад
Родитель
Сommit
479851ba4c

+ 2 - 0
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,

+ 12 - 0
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}

+ 39 - 0
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 == ""