From 7c14d33f97bce73ffe711adb43ba42086a63e2b2 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 8 Sep 2026 00:56:55 +0900 Subject: [PATCH] =?UTF-8?q?fix(B08):=20=EC=9A=B4=EB=B0=98=20=ED=91=9C?= =?UTF-8?q?=EA=B0=80=20=EC=98=81=EC=98=81=200=EC=A4=84=EC=9D=B4=20?= =?UTF-8?q?=EB=90=A0=20=EC=9E=90=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⑬ 운반 사슬 실증 중 발견. 정본에 저장되는 것은 유토곡선 한 벌(`mass_haul`)이고 배분은 그 안의 `haul_plan` 인데, 라우터가 바깥 껍데기를 그대로 넘기고 있었음. `blocks` 를 못 찾아 운반 표가 항상 빈 표가 됨. [확정] 전에는 어차피 빈 표라 화면에서 티가 안 나던 자리임. 검증은 사용자 프로젝트를 건드리지 않고 서버 계산 코드(Node 번들)를 시험 노선으로 직접 돌려 실제 배분을 받아 확인함. - 운반거리 표: 무대 3.90㎥/10m · 도자 7.80㎥/40m · 덤프 3,712.29㎥/288.12m - 인계: 무대 in_bill=false + 수량 그대로, 도자 FP-10-11 · 덤프 FP-10-12 - 검산: 합 3,723.99 vs hauled 3,724.00 (차 0.01 — 배분 자체의 반올림) - 장비 한계: 무대 20m · 도자 60m 이내 확인 저장 정본 모양을 그대로 넣은 시험 2건으로 못 박음. Co-Authored-By: Claude Opus 5 (1M context) --- B08_Quantity/B08_Quantity_Router_Earthwork.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/B08_Quantity/B08_Quantity_Router_Earthwork.py b/B08_Quantity/B08_Quantity_Router_Earthwork.py index f52240cf..a99b8f81 100644 --- a/B08_Quantity/B08_Quantity_Router_Earthwork.py +++ b/B08_Quantity/B08_Quantity_Router_Earthwork.py @@ -133,14 +133,22 @@ async def _project_settings(project_id: UUID) -> tuple[dict[str, Any], str | Non async def _stored_haul_plan(project_id: UUID, route_id: int) -> dict[str, Any] | None: - """정본에 남은 운반계획. [확정]을 아직 안 돌렸으면 없다.""" + """정본에 남은 **배분**(`mass_haul.haul_plan`). [확정]을 아직 안 돌렸으면 없다. + + ⚠ 정본에 저장되는 것은 유토곡선 한 벌(`mass_haul`)이고 **배분은 그 안의 `haul_plan`** 이다. + 바깥 껍데기를 그대로 넘기면 `blocks` 를 못 찾아 **운반 표가 영영 0줄**이 된다 — + [확정] 전에는 어차피 빈 표라 화면에서 티가 안 나던 자리다(2026-09-07 실증에서 잡음). + """ try: row = await run_with_connection(get_longitudinal_section, project_id, route_id) except Exception: logger.exception("B08 운반계획 조회 실패: route_id=%s", route_id) return None data = (row or {}).get("data") or {} - plan = data.get("mass_haul") if isinstance(data, dict) else None + mass_haul = data.get("mass_haul") if isinstance(data, dict) else None + if not isinstance(mass_haul, dict): + return None + plan = mass_haul.get("haul_plan") return plan if isinstance(plan, dict) and plan else None