""" 陆运选线路 H5 页。 本文件职责:按完整线路列出各段成本与合计,提交所选下标。 样式对齐空运选线路页。禁止 URL userid;禁止本页查 TMS。 """ from __future__ import annotations import html from typing import Any from agent.channel.h5.air_route_page import _PAGE_CSS, _wrap from agent.schema.land_route_options import ( _money, group_land_routes, land_leg_fee_blocks_for_route, option_eta_bits, option_total, route_line, ) def expired_land_route_page() -> str: """token 过期页。""" return _wrap( "已过期", "

链接已过期

请回企微重新打开选线路卡片。

", ) def render_land_route_page(payload: dict[str, Any]) -> str: """渲染选线路页。payload 来自 token。""" quote = dict(payload.get("quote") or {}) wo = html.escape(str(payload.get("work_order_no") or "")) routes = group_land_routes(quote) rows = [_route_card(i, route, quote) for i, route in enumerate(routes)] body = ( "
" "
" f"

{wo}

" "

选择线路

" f"

共 {len(routes)} 条线路,每条按段报价。点选一条后确定。

" "
" "
" + "".join(rows) + "
" "" "
" "" ) return _wrap("选择线路", body) def render_land_route_ok() -> str: """选定成功。""" return _wrap( "已选定", "

已选定

请回企微查看价格明细。

", ) def _route_card(index: int, route: dict[str, Any], quote: dict[str, Any] | None = None) -> str: """一张线路:航线、各段路段+TMS 费目、合计。""" line = html.escape(route_line(route)) blocks = land_leg_fee_blocks_for_route(quote, route) etas = {i: d for i, (_, d) in enumerate(option_eta_bits(route), 1)} fee_bits: list[str] = [] items = "" if blocks: for i, (title, fees, eta) in enumerate(blocks, 1): items += ( f"
  • {html.escape(title)}" "
  • " ) for fee in fees: amount = _money(fee.get("amount"), str(fee.get("currency") or "").strip()) name = str(fee.get("name") or "").strip() if not name or not amount: continue items += ( f"
  • {html.escape(name)}" f"{html.escape(amount)}
  • " ) days = eta or etas.get(i) or "" if days: items += ( f"
  • 时效 {html.escape(days)}" "
  • " ) if items: fee_bits.append(f"") else: fee_bits.append("

    本线路未返回分段成本

    ") total = html.escape(option_total(route)) legs = list(route.get("legs") or []) tag = "中转" if len(legs) > 1 else "直达" tag_cls = "pill via" if len(legs) > 1 else "pill" return ( "" )