From 9adc35473e6dfdf7c642a6777334cbe7c156a25c Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 16 Oct 2026 13:00:04 +0900 Subject: [PATCH] =?UTF-8?q?fix(=EC=A2=85=EB=8B=A8=EB=B3=B4=EA=B8=B0):=2034?= =?UTF-8?q?6-3=20=EB=8D=A7=20=EA=B3=84=ED=9A=8D=EA=B3=A0=20=EC=B4=88?= =?UTF-8?q?=EC=95=88=20=EC=9D=B4=EC=9D=8C=EB=A7=A4=20=E2=80=94=20=EB=85=B8?= =?UTF-8?q?=EC=84=A0=20=EC=A0=80=EC=9E=A5=20=EB=92=A4=20=EB=85=B8=EC=84=A0?= =?UTF-8?q?=20=EC=B4=88=EC=95=88=20=EC=B9=B8(DRAFT=5FROUTE=5FID=200=20?= =?UTF-8?q?=C2=B7=20sub7)=20=EA=B3=84=ED=9A=8D=EA=B3=A0=EB=A5=BC=20?= =?UTF-8?q?=EC=83=88=20=EB=85=B8=EC=84=A0=EC=9C=BC=EB=A1=9C=20=C2=B7=20?= =?UTF-8?q?=EC=97=86=EC=9C=BC=EB=A9=B4=20=EC=98=9B=20=EB=85=B8=EC=84=A0=20?= =?UTF-8?q?=EC=B9=B8=20=C2=B7=20=EB=91=90=20=EC=B9=B8=20=EB=8B=A4=20?= =?UTF-8?q?=EB=B9=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - design_save 의 DRAFT_ROUTE_ID = design_pipeline_page 값과 같음(합친 뒤 시험이 대조) - 시험: test_design_store_save 덧 하나 · 관련 52 통과 · typecheck 통과 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VmC34fsxxbweEG3RUjs3Mn --- A00_Common/design/design_save.ts | 10 ++++++++-- resources/tester/helper_design_store_save.cjs | 15 +++++++++++++++ resources/tester/test_design_store_save.py | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/A00_Common/design/design_save.ts b/A00_Common/design/design_save.ts index 0bf05bfba..a9ed7fc15 100644 --- a/A00_Common/design/design_save.ts +++ b/A00_Common/design/design_save.ts @@ -101,17 +101,23 @@ export function noticeDroppedEdits(saved: { dropped_edit_chainages?: number[] }) ); } +/** 노선 초안 동안의 계획고 초안 칸 — `design_pipeline_page` 의 `DRAFT_ROUTE_ID` 와 같은 값(sub7). */ +const DRAFT_ROUTE_ID = 0; + /** 계획고 초안(가게 하나)을 종단 정본에 쓴다. 없으면 아무 일도 하지 않는다. 노선이 바뀌었으면 - * 옛 노선 칸(`from`)의 초안을 새 노선(`routeId`)에 — 측점이 없는 자리는 서버가 버리고 알림(213-2). */ + * 노선 초안 칸(`DRAFT_ROUTE_ID`) · 없으면 옛 노선 칸(`from`)의 초안을 새 노선(`routeId`)에 · 두 칸 다 + * 비움 — 측점이 없는 자리는 서버가 버리고 알림(213-2). */ async function flushAlignmentDraft( projectId: string, routeId: number, from: number = routeId, ): Promise { - const draft = pendingAlignment(from); + const moved = from !== routeId; + const draft = (moved ? pendingAlignment(DRAFT_ROUTE_ID) : null) ?? pendingAlignment(from); if (!draft) return; noticeDroppedEdits(await saveProfileAlignment(projectId, routeId, draft)); markAlignmentSaved(from); + if (moved) markAlignmentSaved(DRAFT_ROUTE_ID); } /** 실패해도 다음 차례로 넘어가는 창구와 그 이름(보기가 준 일에도 같이 씌운다). */ diff --git a/resources/tester/helper_design_store_save.cjs b/resources/tester/helper_design_store_save.cjs index 69c680c36..419c6aa70 100644 --- a/resources/tester/helper_design_store_save.cjs +++ b/resources/tester/helper_design_store_save.cjs @@ -225,6 +225,21 @@ async function run() { { confirm: true }, ); out.routeConfirmCalls = [...calls]; + // ⑨ 노선 초안 동안 계획고 = 노선 0 칸(sub7 DRAFT_ROUTE_ID) — 그 칸이 새 노선에 나가고 두 칸 다 비움 + b05.replace({ station_offsets: { "30.000": 0.2 }, curve_radii: {} }); // 옛 노선(7) 초안 + useDesignStore(null, 0).set("alignmentDraft", { + station_offsets: { "35.000": 0.4 }, + curve_radii: {}, + }); + calls.length = 0; + await saveDesign({ + projectId: "p1", + routeId: () => 7, + cross: async (confirm) => calls.push(`cross:${confirm}`), + failed: () => calls.push("failed"), + }); + out.draftRouteCalls = calls.filter((c) => c.startsWith("alignment:")); + out.draftRouteLeft = { draft: edit.pendingAlignment(0), old: edit.pendingAlignment(7) }; routeBody = null; // ⑤ [초기화] — 초안 · 한 벌 모두 버림 diff --git a/resources/tester/test_design_store_save.py b/resources/tester/test_design_store_save.py index b868f21e4..59295fe34 100644 --- a/resources/tester/test_design_store_save.py +++ b/resources/tester/test_design_store_save.py @@ -126,3 +126,17 @@ def test_확정_중_노선이_바뀌면_다시_세우고_확정은_다시(out): calls = out["routeConfirmCalls"] assert calls[1] == "route" and calls[-2:] == ["rebuild", "overlay:off"] assert "done:true" not in calls and "cross:true" not in calls + + +def test_노선_초안_칸_계획고가_새_노선으로(out): + """346-3 덧 — 노선 초안 동안 계획고는 노선 0 칸(sub7) · 노선 저장 뒤 그 칸이 새 노선 9 로 · 0 · 7 칸 다 비움.""" + assert out["draftRouteCalls"] == ['alignment:9:{"35.000":0.4}'] + assert out["draftRouteLeft"] == {"draft": None, "old": None} + design = os.path.join(HERE, "..", "..", "A00_Common", "design") + with open(os.path.join(design, "design_pipeline_page.ts"), encoding="utf-8") as f: + pipeline = f.read() + with open(os.path.join(design, "design_save.ts"), encoding="utf-8") as f: + save = f.read() + assert "const DRAFT_ROUTE_ID = 0;" in save + if "export const DRAFT_ROUTE_ID" in pipeline: # 합친 뒤 — 두 값이 같아야 함 + assert "export const DRAFT_ROUTE_ID = 0;" in pipeline