From dbe761a303e0d2bd76128379f71ebcaea46aa163 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 8 Sep 2026 10:28:35 +0900 Subject: [PATCH] =?UTF-8?q?feat(B08):=20B=EA=B5=B0=20=EC=A4=84=EC=97=90=20?= =?UTF-8?q?=E3=80=8C=EC=96=B4=EB=94=94=EB=B6=80=ED=84=B0=20=EC=96=B4?= =?UTF-8?q?=EB=94=94=EA=B9=8C=EC=A7=80=E3=80=8D=EB=A5=BC=20=EC=8B=A4?= =?UTF-8?q?=EC=9D=8C=20=E2=80=94=20spans=20=EB=B0=9B=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 랩탑이 spans 를 넣어 줘서 B군 산출근거가 채워짐. 겹침을 지운 뒤의 구간이라 그 합이 곧 length_m 임. - station_from/to 에 처음 시작·끝 끝을 싣고 - 비고에 구간을 전부 적음 「구간 10~20m · 50~60m · 90~100m」 ⚠ 사이가 빈 것을 숨기지 않음 — 처음과 끝만 보면 10~100 을 통으로 오해함 - 겹친 경우는 그 설명이 뒤에 붙음 「구간 80~140m · 입력 구간 합 80m 에서 겹친 20m 를 뺀 값」 ⚠ 측점 표기(NO.4+0.0)는 만들지 않음 — 측점 간격을 아는 화면 몫이고, 두 벌로 짜면 간격이 바뀔 때 한쪽만 고쳐짐 시험 넷 — 구간이 비고에 적히고 측점이 실림 · 여럿이면 처음·끝을 싣고 전부는 비고에 · ⚠ 구간 합이 수량과 같음(갈리면 어딘가 틀림) · ⚠ spans 가 없어도 줄은 섬(옛 자료) 시험: 713 passed · 24 skipped (B05 코리도 1건 기존 깨짐, 무관). Co-Authored-By: Claude Opus 5 (1M context) --- B08_Quantity/B08_Quantity_Engine_Handoff.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/B08_Quantity/B08_Quantity_Engine_Handoff.py b/B08_Quantity/B08_Quantity_Engine_Handoff.py index 0da30a04..f26afd6d 100644 --- a/B08_Quantity/B08_Quantity_Engine_Handoff.py +++ b/B08_Quantity/B08_Quantity_Engine_Handoff.py @@ -941,9 +941,19 @@ def _length_rows( code = (found or {}).get("work_item_code") length = float(entry.get("length_m") or 0.0) raw = float(entry.get("raw_length_m") or length) - note = "" + # 구간 목록 — **겹침을 지운 뒤**의 것이라 그 합이 곧 `length_m` 이다 + # (80~120 과 100~140 은 80~140 한 줄로 합쳐져 온다, 2026-09-08 랩탑 창). + # ⚠ 표기(`NO.4+0.0`)는 만들지 않는다 — 측점 간격을 아는 화면 몫이다. + spans = [ + span + for span in (entry.get("spans") or []) + if span.get("start_m") is not None and span.get("end_m") is not None + ] + span_note = " · ".join(f"{s['start_m']:g}~{s['end_m']:g}m" for s in spans) + note = f"구간 {span_note}" if span_note else "" if abs(raw - length) > 1e-9: - note = f"입력 구간 합 {raw:g}m 에서 겹친 {raw - length:g}m 를 뺀 값" + 겹침 = f"입력 구간 합 {raw:g}m 에서 겹친 {raw - length:g}m 를 뺀 값" + note = f"{note} · {겹침}" if note else 겹침 # ⚠ 겹침 설명은 **비고**이지 막힌 사유가 아니다 — `blocked_reason` 에 넣으면 # 받는 쪽이 「막힌 줄」로 읽어 금액을 안 붙인다(2026-09-08 실측에서 그랬다). reason = "" @@ -965,8 +975,9 @@ def _length_rows( "ground_class": None, "haul_distance_m": None, "haul_equipment": None, - "station_from": None, - "station_to": None, + # 여러 구간이면 **처음과 끝**만 싣는다 — 사이 구간은 비고에 다 적혀 있다. + "station_from": spans[0]["start_m"] if spans else None, + "station_to": spans[-1]["end_m"] if spans else None, "excavation_method": None, "spec_detail": f"{entry.get('count')}개소", "composite_parts": None,