|
@@ -225,28 +225,32 @@ def _apply_vehicle_snapshot_to_plan_transport(
|
|
|
transport: Optional[PlTransport],
|
|
transport: Optional[PlTransport],
|
|
|
vehicle: PlVehicle,
|
|
vehicle: PlVehicle,
|
|
|
driver_id: Optional[str],
|
|
driver_id: Optional[str],
|
|
|
|
|
+ escort_id: Optional[str] = None,
|
|
|
) -> None:
|
|
) -> None:
|
|
|
snapshot = build_transport_resource_snapshot(
|
|
snapshot = build_transport_resource_snapshot(
|
|
|
db,
|
|
db,
|
|
|
tenant_no,
|
|
tenant_no,
|
|
|
vehicle.id,
|
|
vehicle.id,
|
|
|
selected_driver_id=driver_id,
|
|
selected_driver_id=driver_id,
|
|
|
|
|
+ selected_escort_id=escort_id,
|
|
|
)
|
|
)
|
|
|
apply_resource_snapshot_json(plan=plan, transport=transport, snapshot=snapshot)
|
|
apply_resource_snapshot_json(plan=plan, transport=transport, snapshot=snapshot)
|
|
|
|
|
|
|
|
|
|
|
|
|
-def _resolve_driver(
|
|
|
|
|
|
|
+def _resolve_personnel_by_vehicle_role(
|
|
|
db: Session,
|
|
db: Session,
|
|
|
tenant_no: str,
|
|
tenant_no: str,
|
|
|
vehicle_id: str,
|
|
vehicle_id: str,
|
|
|
- driver_id: Optional[str],
|
|
|
|
|
|
|
+ personnel_id: Optional[str],
|
|
|
|
|
+ *,
|
|
|
|
|
+ role: str,
|
|
|
) -> tuple[Optional[str], Optional[str], Optional[str]]:
|
|
) -> tuple[Optional[str], Optional[str], Optional[str]]:
|
|
|
- """解析司机:显式选择优先,否则取车辆关联司机;均无则允许为空。"""
|
|
|
|
|
- if driver_id:
|
|
|
|
|
|
|
+ """解析驾押人员:显式选择优先,否则取车辆关联该角色;均无则允许为空。"""
|
|
|
|
|
+ if personnel_id:
|
|
|
personnel = (
|
|
personnel = (
|
|
|
db.query(PlPersonnel)
|
|
db.query(PlPersonnel)
|
|
|
.filter(
|
|
.filter(
|
|
|
- PlPersonnel.id == driver_id,
|
|
|
|
|
|
|
+ PlPersonnel.id == personnel_id,
|
|
|
PlPersonnel.tenant_no == tenant_no,
|
|
PlPersonnel.tenant_no == tenant_no,
|
|
|
PlPersonnel.del_flag == 0,
|
|
PlPersonnel.del_flag == 0,
|
|
|
)
|
|
)
|
|
@@ -261,7 +265,7 @@ def _resolve_driver(
|
|
|
PlVehiclePersonnel.vehicle_id == vehicle_id,
|
|
PlVehiclePersonnel.vehicle_id == vehicle_id,
|
|
|
PlVehiclePersonnel.tenant_no == tenant_no,
|
|
PlVehiclePersonnel.tenant_no == tenant_no,
|
|
|
PlVehiclePersonnel.del_flag == 0,
|
|
PlVehiclePersonnel.del_flag == 0,
|
|
|
- PlVehiclePersonnel.role == "driver",
|
|
|
|
|
|
|
+ PlVehiclePersonnel.role == role,
|
|
|
)
|
|
)
|
|
|
.order_by(PlVehiclePersonnel.is_default.desc(), PlVehiclePersonnel.order_num.asc())
|
|
.order_by(PlVehiclePersonnel.is_default.desc(), PlVehiclePersonnel.order_num.asc())
|
|
|
.first()
|
|
.first()
|
|
@@ -281,6 +285,30 @@ def _resolve_driver(
|
|
|
return None, None, None
|
|
return None, None, None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+def _resolve_driver(
|
|
|
|
|
+ db: Session,
|
|
|
|
|
+ tenant_no: str,
|
|
|
|
|
+ vehicle_id: str,
|
|
|
|
|
+ driver_id: Optional[str],
|
|
|
|
|
+) -> tuple[Optional[str], Optional[str], Optional[str]]:
|
|
|
|
|
+ """解析司机:显式选择优先,否则取车辆关联司机;均无则允许为空。"""
|
|
|
|
|
+ return _resolve_personnel_by_vehicle_role(
|
|
|
|
|
+ db, tenant_no, vehicle_id, driver_id, role="driver"
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _resolve_escort(
|
|
|
|
|
+ db: Session,
|
|
|
|
|
+ tenant_no: str,
|
|
|
|
|
+ vehicle_id: str,
|
|
|
|
|
+ escort_id: Optional[str],
|
|
|
|
|
+) -> tuple[Optional[str], Optional[str], Optional[str]]:
|
|
|
|
|
+ """解析押运员:显式选择优先,否则取车辆关联押运;均无则允许为空。"""
|
|
|
|
|
+ return _resolve_personnel_by_vehicle_role(
|
|
|
|
|
+ db, tenant_no, vehicle_id, escort_id, role="escort"
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def _calc_freight_amount(
|
|
def _calc_freight_amount(
|
|
|
freight_type: str,
|
|
freight_type: str,
|
|
|
products: list[PlPlanProduct],
|
|
products: list[PlPlanProduct],
|
|
@@ -732,6 +760,9 @@ def _resolve_transport_context(
|
|
|
Optional[str],
|
|
Optional[str],
|
|
|
Optional[str],
|
|
Optional[str],
|
|
|
Optional[str],
|
|
Optional[str],
|
|
|
|
|
+ Optional[str],
|
|
|
|
|
+ Optional[str],
|
|
|
|
|
+ Optional[str],
|
|
|
Decimal,
|
|
Decimal,
|
|
|
Optional[Decimal],
|
|
Optional[Decimal],
|
|
|
]:
|
|
]:
|
|
@@ -750,6 +781,9 @@ def _resolve_transport_context(
|
|
|
driver_id, driver_name, driver_phone = _resolve_driver(
|
|
driver_id, driver_name, driver_phone = _resolve_driver(
|
|
|
db, tenant_no, transport_payload.vehicle_id, transport_payload.driver_id
|
|
db, tenant_no, transport_payload.vehicle_id, transport_payload.driver_id
|
|
|
)
|
|
)
|
|
|
|
|
+ escort_id, escort_name, escort_phone = _resolve_escort(
|
|
|
|
|
+ db, tenant_no, transport_payload.vehicle_id, transport_payload.escort_id
|
|
|
|
|
+ )
|
|
|
carrier_id = transport_payload.carrier_id or vehicle.carrier_id
|
|
carrier_id = transport_payload.carrier_id or vehicle.carrier_id
|
|
|
carrier_name = vehicle.carrier_name
|
|
carrier_name = vehicle.carrier_name
|
|
|
if carrier_id:
|
|
if carrier_id:
|
|
@@ -777,6 +811,9 @@ def _resolve_transport_context(
|
|
|
driver_id,
|
|
driver_id,
|
|
|
driver_name,
|
|
driver_name,
|
|
|
driver_phone,
|
|
driver_phone,
|
|
|
|
|
+ escort_id,
|
|
|
|
|
+ escort_name,
|
|
|
|
|
+ escort_phone,
|
|
|
carrier_id,
|
|
carrier_id,
|
|
|
carrier_name,
|
|
carrier_name,
|
|
|
freight_amount,
|
|
freight_amount,
|
|
@@ -791,6 +828,9 @@ def _apply_payload_to_transport_row(
|
|
|
driver_id: Optional[str],
|
|
driver_id: Optional[str],
|
|
|
driver_name: Optional[str],
|
|
driver_name: Optional[str],
|
|
|
driver_phone: Optional[str],
|
|
driver_phone: Optional[str],
|
|
|
|
|
+ escort_id: Optional[str],
|
|
|
|
|
+ escort_name: Optional[str],
|
|
|
|
|
+ escort_phone: Optional[str],
|
|
|
carrier_id: Optional[str],
|
|
carrier_id: Optional[str],
|
|
|
carrier_name: Optional[str],
|
|
carrier_name: Optional[str],
|
|
|
plan: PlPlan,
|
|
plan: PlPlan,
|
|
@@ -804,6 +844,9 @@ def _apply_payload_to_transport_row(
|
|
|
transport.driver_id = driver_id
|
|
transport.driver_id = driver_id
|
|
|
transport.driver_name = driver_name
|
|
transport.driver_name = driver_name
|
|
|
transport.driver_phone = driver_phone
|
|
transport.driver_phone = driver_phone
|
|
|
|
|
+ transport.escort_id = escort_id
|
|
|
|
|
+ transport.escort_name = escort_name
|
|
|
|
|
+ transport.escort_phone = escort_phone
|
|
|
transport.carrier_id = carrier_id
|
|
transport.carrier_id = carrier_id
|
|
|
transport.carrier_name = carrier_name
|
|
transport.carrier_name = carrier_name
|
|
|
transport.start_point = plan.pickup_address
|
|
transport.start_point = plan.pickup_address
|
|
@@ -837,6 +880,9 @@ def upsert_draft_transport_for_plan(
|
|
|
driver_id,
|
|
driver_id,
|
|
|
driver_name,
|
|
driver_name,
|
|
|
driver_phone,
|
|
driver_phone,
|
|
|
|
|
+ escort_id,
|
|
|
|
|
+ escort_name,
|
|
|
|
|
+ escort_phone,
|
|
|
carrier_id,
|
|
carrier_id,
|
|
|
carrier_name,
|
|
carrier_name,
|
|
|
freight_amount,
|
|
freight_amount,
|
|
@@ -868,6 +914,9 @@ def upsert_draft_transport_for_plan(
|
|
|
driver_id=driver_id,
|
|
driver_id=driver_id,
|
|
|
driver_name=driver_name,
|
|
driver_name=driver_name,
|
|
|
driver_phone=driver_phone,
|
|
driver_phone=driver_phone,
|
|
|
|
|
+ escort_id=escort_id,
|
|
|
|
|
+ escort_name=escort_name,
|
|
|
|
|
+ escort_phone=escort_phone,
|
|
|
carrier_id=carrier_id,
|
|
carrier_id=carrier_id,
|
|
|
carrier_name=carrier_name,
|
|
carrier_name=carrier_name,
|
|
|
plan=plan,
|
|
plan=plan,
|
|
@@ -910,6 +959,9 @@ def upsert_draft_transport_for_plan(
|
|
|
driver_id=driver_id,
|
|
driver_id=driver_id,
|
|
|
driver_name=driver_name,
|
|
driver_name=driver_name,
|
|
|
driver_phone=driver_phone,
|
|
driver_phone=driver_phone,
|
|
|
|
|
+ escort_id=escort_id,
|
|
|
|
|
+ escort_name=escort_name,
|
|
|
|
|
+ escort_phone=escort_phone,
|
|
|
carrier_id=carrier_id,
|
|
carrier_id=carrier_id,
|
|
|
carrier_name=carrier_name,
|
|
carrier_name=carrier_name,
|
|
|
plan=plan,
|
|
plan=plan,
|
|
@@ -923,6 +975,9 @@ def upsert_draft_transport_for_plan(
|
|
|
plan.license_plate = vehicle.license_plate
|
|
plan.license_plate = vehicle.license_plate
|
|
|
plan.driver_id = driver_id
|
|
plan.driver_id = driver_id
|
|
|
plan.driver_name = driver_name
|
|
plan.driver_name = driver_name
|
|
|
|
|
+ plan.escort_id = escort_id
|
|
|
|
|
+ plan.escort_name = escort_name
|
|
|
|
|
+ plan.escort_phone = escort_phone
|
|
|
_apply_vehicle_snapshot_to_plan_transport(
|
|
_apply_vehicle_snapshot_to_plan_transport(
|
|
|
db,
|
|
db,
|
|
|
tenant_no=tenant_no,
|
|
tenant_no=tenant_no,
|
|
@@ -930,6 +985,7 @@ def upsert_draft_transport_for_plan(
|
|
|
transport=transport,
|
|
transport=transport,
|
|
|
vehicle=vehicle,
|
|
vehicle=vehicle,
|
|
|
driver_id=driver_id,
|
|
driver_id=driver_id,
|
|
|
|
|
+ escort_id=escort_id,
|
|
|
)
|
|
)
|
|
|
plan.freight_amount = freight_amount or 0
|
|
plan.freight_amount = freight_amount or 0
|
|
|
if plan.transport_id:
|
|
if plan.transport_id:
|
|
@@ -979,6 +1035,9 @@ def clear_draft_transport_for_plan(
|
|
|
plan.license_plate = None
|
|
plan.license_plate = None
|
|
|
plan.driver_id = None
|
|
plan.driver_id = None
|
|
|
plan.driver_name = None
|
|
plan.driver_name = None
|
|
|
|
|
+ plan.escort_id = None
|
|
|
|
|
+ plan.escort_name = None
|
|
|
|
|
+ plan.escort_phone = None
|
|
|
clear_resource_snapshot(plan=plan, transport=transport)
|
|
clear_resource_snapshot(plan=plan, transport=transport)
|
|
|
plan.freight_amount = 0
|
|
plan.freight_amount = 0
|
|
|
if plan.transport_status != "arranged":
|
|
if plan.transport_status != "arranged":
|
|
@@ -1057,6 +1116,9 @@ def create_transport_for_plan(
|
|
|
driver_id, driver_name, driver_phone = _resolve_driver(
|
|
driver_id, driver_name, driver_phone = _resolve_driver(
|
|
|
db, tenant_no, transport_payload.vehicle_id, transport_payload.driver_id
|
|
db, tenant_no, transport_payload.vehicle_id, transport_payload.driver_id
|
|
|
)
|
|
)
|
|
|
|
|
+ escort_id, escort_name, escort_phone = _resolve_escort(
|
|
|
|
|
+ db, tenant_no, transport_payload.vehicle_id, transport_payload.escort_id
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
carrier_name = vehicle.carrier_name
|
|
carrier_name = vehicle.carrier_name
|
|
|
carrier_id = transport_payload.carrier_id or vehicle.carrier_id
|
|
carrier_id = transport_payload.carrier_id or vehicle.carrier_id
|
|
@@ -1091,6 +1153,9 @@ def create_transport_for_plan(
|
|
|
driver_id=driver_id,
|
|
driver_id=driver_id,
|
|
|
driver_name=driver_name,
|
|
driver_name=driver_name,
|
|
|
driver_phone=driver_phone,
|
|
driver_phone=driver_phone,
|
|
|
|
|
+ escort_id=escort_id,
|
|
|
|
|
+ escort_name=escort_name,
|
|
|
|
|
+ escort_phone=escort_phone,
|
|
|
carrier_id=carrier_id,
|
|
carrier_id=carrier_id,
|
|
|
carrier_name=carrier_name,
|
|
carrier_name=carrier_name,
|
|
|
start_point=plan.pickup_address,
|
|
start_point=plan.pickup_address,
|
|
@@ -1127,6 +1192,9 @@ def create_transport_for_plan(
|
|
|
plan.license_plate = vehicle.license_plate
|
|
plan.license_plate = vehicle.license_plate
|
|
|
plan.driver_id = driver_id
|
|
plan.driver_id = driver_id
|
|
|
plan.driver_name = driver_name
|
|
plan.driver_name = driver_name
|
|
|
|
|
+ plan.escort_id = escort_id
|
|
|
|
|
+ plan.escort_name = escort_name
|
|
|
|
|
+ plan.escort_phone = escort_phone
|
|
|
_apply_vehicle_snapshot_to_plan_transport(
|
|
_apply_vehicle_snapshot_to_plan_transport(
|
|
|
db,
|
|
db,
|
|
|
tenant_no=tenant_no,
|
|
tenant_no=tenant_no,
|
|
@@ -1134,6 +1202,7 @@ def create_transport_for_plan(
|
|
|
transport=transport,
|
|
transport=transport,
|
|
|
vehicle=vehicle,
|
|
vehicle=vehicle,
|
|
|
driver_id=driver_id,
|
|
driver_id=driver_id,
|
|
|
|
|
+ escort_id=escort_id,
|
|
|
)
|
|
)
|
|
|
plan.transport_status = "arranged"
|
|
plan.transport_status = "arranged"
|
|
|
plan.follow_status = "arranged"
|
|
plan.follow_status = "arranged"
|