From 7d39f90a0eff7a5e1adbe62fd5bea2a366cbd3f5 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 11:31:09 +0900 Subject: [PATCH] =?UTF-8?q?feat(M01):=20=EB=8B=A8=EA=B0=80=EC=82=B0?= =?UTF-8?q?=EC=B6=9C=20=EB=A1=9C=EC=A7=81=20=EC=83=81=EC=84=B8=20=EC=B0=A8?= =?UTF-8?q?=EB=A1=80=20=C2=B7=20=EC=98=A4=EB=A5=B8=EC=AA=BD=20=ED=9D=90?= =?UTF-8?q?=EB=A6=84=EB=8F=84/=EC=9B=90=EB=AC=B8=20=EB=91=90=20=ED=8C=A8?= =?UTF-8?q?=EB=84=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 좌측 차례 = 기본정보 › 시험 계산 › 단가산출 상세 › 텍스트 수식 - 오른쪽 패널 둘(흐름도 · 원문) — 하나만 열림 · 둘 다 접기 · 머리 토글 단추 · 열린 패널 계정 취향(m01-logic-panel) - 흐름도 패널 접힘을 부르는 쪽이 정하는 길(folded · onFold · fold) - 원문 패널 = 출처 글로 품셈 본문 절을 찾아 보임(GET /api/m01/logic/source) · 못 찾으면 「원문 연결 없음」 + 출처 - 시험 test_m01_logic_source.py · 화면 시나리오 ui_checks/44-4_로직상세_패널.js Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NPJGtfXo6GMbcpiboQC4uK --- A00_Common/b_page_state.ts | 2 + M01_MasterData/M01_MasterData_Router.py | 6 + M01_MasterData/M01_MasterData_Store_Make.py | 73 +++++++ M01_MasterData/M01_MasterData_UI_LogicLab.ts | 16 +- .../M01_MasterData_UI_LogicLab_Detail.ts | 8 +- .../M01_MasterData_UI_LogicLab_Flow.ts | 8 + .../M01_MasterData_UI_LogicLab_Side.css | 54 +++++ .../M01_MasterData_UI_LogicLab_Side.ts | 191 ++++++++++++++++++ M02_MasterTemplete/DataFlow/M02_DF_Panel.ts | 15 +- resources/tester/test_m01_logic_source.py | 55 +++++ .../tester/ui_checks/44-4_로직상세_패널.js | 103 ++++++++++ 11 files changed, 520 insertions(+), 11 deletions(-) create mode 100644 M01_MasterData/M01_MasterData_UI_LogicLab_Side.css create mode 100644 M01_MasterData/M01_MasterData_UI_LogicLab_Side.ts create mode 100644 resources/tester/test_m01_logic_source.py create mode 100644 resources/tester/ui_checks/44-4_로직상세_패널.js diff --git a/A00_Common/b_page_state.ts b/A00_Common/b_page_state.ts index 2c411ffe8..37d5c757f 100644 --- a/A00_Common/b_page_state.ts +++ b/A00_Common/b_page_state.ts @@ -64,6 +64,8 @@ export const STATE_REGISTRY = { "m02-combo-panel-width": { bucket: "pref", scope: "global" }, /** M02 면적산출 카드 미리보기 아래 알약 줄 보임(기본 숨김 · 상세는 늘 보임) */ "m02-card-pills": { bucket: "pref", scope: "global" }, + /** M01 단가산출 로직 상세 오른쪽 — 열린 패널 하나(flow · source · none) */ + "m01-logic-panel": { bucket: "pref", scope: "global" }, /** B05 계획노선 편집 창 — 보던 화면(회전 · 가운데 · 배율). 프로젝트마다 따로 */ "routeedit-view": { bucket: "pref", scope: "project" }, /** B05 계획노선 편집 창 — 시점 · 종점 · 교각점 고정. [저장] 대상이 아니라 draft 에 안 둠 */ diff --git a/M01_MasterData/M01_MasterData_Router.py b/M01_MasterData/M01_MasterData_Router.py index f487a6d78..5b0aaa349 100644 --- a/M01_MasterData/M01_MasterData_Router.py +++ b/M01_MasterData/M01_MasterData_Router.py @@ -190,6 +190,12 @@ def get_logic(key: str) -> dict: return _call(store.logic, key) +@router.get("/logic/source") +def get_logic_source(src: str) -> dict: + """로직 원문 — 출처 글로 찾은 품셈 본문 절(읽기만).""" + return _call(make.source, src) + + @router.get("/logic/auto") def get_logic_auto(key: str) -> dict: """견본 입력 — 마스터 보기용 자동값(프로젝트 기본값 아님) · 흐름 로직은 설계 예시값.""" diff --git a/M01_MasterData/M01_MasterData_Store_Make.py b/M01_MasterData/M01_MasterData_Store_Make.py index 76dc319d9..c5ab2df45 100644 --- a/M01_MasterData/M01_MasterData_Store_Make.py +++ b/M01_MasterData/M01_MasterData_Store_Make.py @@ -103,6 +103,79 @@ def sections(book: str, division: str = "", chapter: str = "", q: str = "", limi return {"total": len(hits), "sections": hits[: min(max(limit, 1), 1000)]} +# ── 로직 원문(출처 글 → 품셈 본문 절) ────────────────────────────────── +_NUMBER = re.compile(r"(? list[dict]: + """md 줄 → 화면 조각 — 제목 {h} · 표 {table} · 글 {p} · 주석 줄은 뺌.""" + out: list[dict] = [] + for line in lines: + text = line.strip() + if not text or text.startswith("