feat(pl): optional escort selection on transport arrange
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
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
|
||||
Reference in new issue
Block a user