"""B08 거리이정표 표 합(PLAN 244-1) — 화면 없음 · 저장 안 함. ⚠ 짝 = `B08_Quantity_Milestone_Calc.ts`(같은 식) — 한쪽을 고치면 다른 쪽도 · 거울 시험 `resources/tester/test_244_1_b08_milestone.py`. 조작 중은 TS 짝이 바로 셈 · [저장] · 읽기 때 서버가 이 파일로 다시 셈. 표 한 줄 = 경로(업체) 구간 + (기준점 거침이면 기준점 → 시점 공통 구간) + (목적지 = 중점이면 시점 → 중점 = 중점 측점 km) · 도로 구분 셋(2차포장 · 1차포장 · 비포장)마다 합 · 포장 = 2차 + 1차 · 비포장 · 합계 = 포장 + 비포장(견본 「거리이정표」 시트 수식) · 끝수 = 소수 셋째 자리(반올림). """ from __future__ import annotations import math from typing import Any ROADS = ("2차포장", "1차포장", "비포장") KEYS = {"2차포장": "s2", "1차포장": "s1", "비포장": "un"} def r3(value: float) -> float: """소수 셋째 자리 반올림(0.5 올림 · TS `Math.round` 와 같음).""" return math.floor(value * 1000 + 0.5) / 1000 def add_legs(sums: dict[str, float], legs: list[dict[str, Any]] | None) -> None: for leg in legs or []: key = KEYS.get(leg.get("road")) if key: sums[key] += float(leg.get("km") or 0) def mid_km(data: dict[str, Any], mid_default_m: float | None) -> float: """시점 → 중점 km — 사용자 측점(없으면 기본 = 노선 ÷ 2) ÷ 1000.""" station = (data.get("site") or {}).get("mid_station_m") if station is None: station = mid_default_m return float(station or 0) / 1000 def compute_milestone(data: dict[str, Any], mid_default_m: float | None) -> list[dict[str, Any]]: """표 줄 — 경로 차례 · 경로 안 줄 차례.""" site = data.get("site") or {} base = data.get("base") or {} mid = {"road": site.get("mid_road") or "비포장", "km": mid_km(data, mid_default_m)} out: list[dict[str, Any]] = [] for route in data.get("routes") or []: for index, row in enumerate(route.get("rows") or []): sums = {"s2": 0.0, "s1": 0.0, "un": 0.0} add_legs(sums, route.get("legs")) if base.get("enabled") and route.get("via_base", True): add_legs(sums, base.get("legs")) if row.get("dest") == "mid": add_legs(sums, [mid]) paved = sums["s2"] + sums["s1"] out.append( { "route": route.get("id"), "index": index, "item": row.get("item") or "", "company": route.get("name") or "", "dest": row.get("dest") or "start", "s2": r3(sums["s2"]), "s1": r3(sums["s1"]), "un": r3(sums["un"]), "paved": r3(paved), "unpaved": r3(sums["un"]), "total": r3(paved + sums["un"]), "note": row.get("note") or "", } ) return out