- 메인 탭 「거리이정표」 · 하위 탭 [거리이정표] 표 + 경로 탭(이름 = 업체 이름) · [+ 추가] · [삭제] - 경로 탭 = 구간 km(더블클릭) · 도로 구분 ▾ · 표 줄(항목 · 목적지 · 비고) · 경로 그림 하나 - 좌측 패널 카드 = 공사지(중점 측점 · 기본 노선 ÷ 2) · 기준점(있음 · 이름 · 주소 · 방위) - 표 합 = 파이썬 · TS 짝(거울 시험) · 정본 = storage B08_Quantity/milestone · [저장] 한 줄에서 PUT Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01STqEqztUthVFBmEP18wBSz
74 lines
3.0 KiB
Python
74 lines
3.0 KiB
Python
"""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
|