feat(pl): optional escort selection on transport arrange

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wuzilongandCursor committed 2026-09-13 10:48:23 +08:00
1 parent 3dc71788d4
commit ca3062b0e2
10 files changed
+339 -10

No files matched your search

@@ -0,0 +1,28 @@
"""运输计划解析押运员:车辆未关联押运时允许为空。"""
from __future__ import annotations
from unittest.mock import MagicMock
from app.services.pl_plan_service import _resolve_escort
def test_resolve_escort_without_vehicle_link_returns_none():
db = MagicMock()
db.query.return_value.filter.return_value.order_by.return_value.first.return_value = None
result = _resolve_escort(db, "tenant-1", "vehicle-1", None)
assert result == (None, None, None)
def test_resolve_escort_with_explicit_id_returns_personnel():
db = MagicMock()
personnel = MagicMock()
personnel.id = "escort-1"
personnel.personnel_name = "王押"
personnel.phone_no = "13900000001"
db.query.return_value.filter.return_value.first.return_value = personnel
result = _resolve_escort(db, "tenant-1", "vehicle-1", "escort-1")
assert result == ("escort-1", "王押", "13900000001")
@@ -43,6 +43,7 @@ def test_apply_transport_arrange_fields_without_driver():
payload=payload,
vehicle_info={"license_plate": "粤A12345", "carrier_id": None},
driver_info=None,
escort_info=None,
carrier_name=None,
start_point="A",
end_point="B",
@@ -0,0 +1,115 @@
"""安排运输:押运员可选。"""
from __future__ import annotations
from types import SimpleNamespace
from app.api.pl.transport import _apply_transport_arrange_fields
from app.schemas.pl.plan import PlanTransportCreateBlock
from app.schemas.pl.transport import TransportArrange
def test_transport_arrange_schema_allows_escort_id():
payload = TransportArrange.model_validate(
{"vehicleId": "veh-1", "escortId": "escort-1"}
)
assert payload.escort_id == "escort-1"
assert payload.driver_id is None
def test_plan_transport_block_allows_escort_id():
block = PlanTransportCreateBlock.model_validate(
{"vehicleId": "veh-1", "escortId": "escort-9"}
)
assert block.escort_id == "escort-9"
def test_apply_transport_arrange_fields_sets_escort():
transport = SimpleNamespace(
vehicle_id=None,
license_plate=None,
driver_id=None,
driver_name=None,
driver_phone=None,
escort_id=None,
escort_name=None,
escort_phone=None,
carrier_id=None,
carrier_name=None,
transport_medium=None,
start_point=None,
end_point=None,
distance_km=None,
unit=None,
freight_price=None,
freight_amount=0,
freight_type="by_weight",
has_invoice=0,
remark=None,
update_by=None,
)
payload = TransportArrange.model_validate(
{"vehicleId": "veh-1", "freightType": "by_weight", "escortId": "e1"}
)
_apply_transport_arrange_fields(
transport,
payload=payload,
vehicle_info={"license_plate": "粤A12345", "carrier_id": None},
driver_info=None,
escort_info={"id": "e1", "name": "李押", "phone": "13900000000"},
carrier_name=None,
start_point="A",
end_point="B",
freight_amount=0,
user_id="u1",
)
assert transport.escort_id == "e1"
assert transport.escort_name == "李押"
assert transport.escort_phone == "13900000000"
def test_apply_transport_arrange_fields_clears_escort():
transport = SimpleNamespace(
vehicle_id="veh-old",
license_plate="旧牌",
driver_id=None,
driver_name=None,
driver_phone=None,
escort_id="old-e",
escort_name="旧押",
escort_phone="1",
carrier_id=None,
carrier_name=None,
transport_medium=None,
start_point=None,
end_point=None,
distance_km=None,
unit=None,
freight_price=None,
freight_amount=0,
freight_type="by_weight",
has_invoice=0,
remark=None,
update_by=None,
)
payload = TransportArrange.model_validate(
{"vehicleId": "veh-1", "freightType": "by_weight"}
)
_apply_transport_arrange_fields(
transport,
payload=payload,
vehicle_info={"license_plate": "粤A12345", "carrier_id": None},
driver_info=None,
escort_info=None,
carrier_name=None,
start_point="A",
end_point="B",
freight_amount=0,
user_id="u1",
)
assert transport.escort_id is None
assert transport.escort_name is None
assert transport.escort_phone is None