From c4d6ba3949ec5004bed287536631d1e691edefbc Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 00:53:06 +0900 Subject: [PATCH 01/10] =?UTF-8?q?fix(M01):=20=EC=9D=BC=EC=9C=84=EB=8C=80?= =?UTF-8?q?=EA=B0=80=20=EC=A1=B0=ED=95=A9=20=E2=80=94=20390px=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=8B=B4=EC=9D=80=20=EB=A1=9C=EC=A7=81=20=ED=91=9C?= =?UTF-8?q?=C2=B7=EB=AF=B8=EB=A6=AC=20=EB=B3=B4=EA=B8=B0=20=ED=91=9C?= =?UTF-8?q?=EA=B0=80=20=EB=84=98=EC=B9=98=EB=8D=98=20=EA=B2=83=EC=9D=84=20?= =?UTF-8?q?=EC=98=86=20=EC=8A=A4=ED=81=AC=EB=A1=A4=EB=A1=9C=20=C2=B7=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EA=B2=BD=EB=A1=9C=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT --- M01_MasterData/M01_MasterData_UI_Combo.ts | 2 +- .../M01_MasterData_UI_Combo_Preview.ts | 5 +++- resources/master_data/ref/_검증_조합_화면.md | 23 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 resources/master_data/ref/_검증_조합_화면.md diff --git a/M01_MasterData/M01_MasterData_UI_Combo.ts b/M01_MasterData/M01_MasterData_UI_Combo.ts index 791ffb66..d4bf0346 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo.ts +++ b/M01_MasterData/M01_MasterData_UI_Combo.ts @@ -190,7 +190,7 @@ export function mountM01Combo( return f.root; }; const preview = buildPreview(() => combo); - const table = el("div"); + const table = el("div", { className: "m01-master__grid-wrap" }); const drawTable = (): void => { const move = (i: number, d: number): void => { const j = i + d; diff --git a/M01_MasterData/M01_MasterData_UI_Combo_Preview.ts b/M01_MasterData/M01_MasterData_UI_Combo_Preview.ts index becb0cf1..3ac16a3c 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo_Preview.ts +++ b/M01_MasterData/M01_MasterData_UI_Combo_Preview.ts @@ -54,7 +54,10 @@ export function buildPreview(combo: () => Combo): PreviewHandle { /** 서버가 받을 꼴 — 원래 숫자·고르기 값으로 되돌림 */ const inputs = new Map(); const form = el("div", { className: "m01-logic__stack" }); - const out = el("div", { attrs: { "data-combo": "preview" } }); + const out = el("div", { + className: "m01-master__grid-wrap", + attrs: { "data-combo": "preview" }, + }); const rowOf = (cells: string[], note = "", bold = false): HTMLElement => el("tr", { className: bold ? "m01lab__subtotal" : "", diff --git a/resources/master_data/ref/_검증_조합_화면.md b/resources/master_data/ref/_검증_조합_화면.md new file mode 100644 index 00000000..8589d345 --- /dev/null +++ b/resources/master_data/ref/_검증_조합_화면.md @@ -0,0 +1,23 @@ +# 검증 — 일위대가 조합 화면(사용자 경로) + +ORCA · 13-4-1 + 12-4 + 12-17-1 + 9-16-1 로 견본 조합을 끝까지 씀. 흔적(UA000001 · 키 대장 · 조합 파일)은 되돌림. + +## 통과 + +- 새 조합 → 이름·구분·단위 → [로직 더하기]에서 구분 → 상세구분 → 찾기로 로직 셋을 하나씩 고름 → 차례 바꾸기(올리기) → 메모 → 저장 → 목록에서 다시 열기(차례·메모 그대로). +- 로직 하나 빼고 다른 것 더하기 → 저장 → 파일에 담은 로직 목록만 있음(수량 없음). +- 미리 보기 합계 = 담은 로직 시험 계산의 비목별 합 — 노무비 111,883.4227 · 재료비 2,656.8847 · 경비 4,110.5631 · 계 118,650.8705. +- 로직 이름을 누르면 그 단가산출 로직 상세로 감 · 컨테이너 제목을 다시 눌러 조합으로 돌아옴 · 지우기. + +## 고침 + +- 390px 에서 담은 로직 표·미리 보기 표가 옆으로 넘쳐 화면이 밀림 → 두 표를 옆 스크롤 상자에 담음(넘침 0). + +## 어색한 자리(남김) + +- 컨테이너를 처음 펼칠 때 화면 코드를 받느라 3~5초 걸림 — 빈 목록만 보임. +- [로직 더하기] 창은 「찾기」를 눌러야 목록이 뜸(자동 추천 없음 · 확정 사항) — 자료를 받는 동안(약 5초) 눌러도 빈 결과. +- 조합 파일이 바뀌면 서버가 다시 떠 저장 뒤 화면이 늦게 바뀜 — 저장 직후 목록으로 나가면 나중에 온 답이 상세를 다시 덮음(최신 응답만 채택 안 함). +- 「돌아오기」 = 컨테이너 제목을 접었다 펴야 함 · 그때 목록을 새로 받아 열어 둔 상세가 목록으로 바뀜(저장 안 한 고침은 사라짐). +- 로직 상세로 갈 때 저장 안 한 조합 고침을 묻지 않음. +- PLAN.md 에 4-3·4-4 줄이 이 창 판에 없어 체크·검증완료를 적지 못함. From e31d7c75e58ec825d7b3462e9622f8b9d4e2e82f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 00:54:43 +0900 Subject: [PATCH 02/10] =?UTF-8?q?knowledge(M01):=20=EB=B0=A4=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EB=A7=88=EA=B0=90=20=EC=88=98=EC=B9=98=20=E2=80=94?= =?UTF-8?q?=20=EC=8B=9C=ED=97=98=20190=20=ED=86=B5=EA=B3=BC=20=C2=B7=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=C2=B7=20=EC=A4=84=20=EC=88=98=20=ED=91=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- resources/master_data/ref/_마감_수치.md | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 resources/master_data/ref/_마감_수치.md diff --git a/resources/master_data/ref/_마감_수치.md b/resources/master_data/ref/_마감_수치.md new file mode 100644 index 00000000..09531a42 --- /dev/null +++ b/resources/master_data/ref/_마감_수치.md @@ -0,0 +1,31 @@ +# 밤 작업 마감 수치 (2026-09-22) + +읽기 전용 점검 · 코드·데이터 안 고침. 기준 = `dev` 2e14beec 받은 뒤 `sub_laptop_1`. + +## 시험 · 검사 + +| 항목 | 결과 | 앞 기록 대비 | +|---|---|---| +| `test_m01_*` + `test_masterdata_*` 통째 | 190 통과 · 실패 0 | — | +| `check_master` 틀 | 0건 | 같음 | +| `check_master` 로직 | 0건 | 같음 | +| `check_master` 조합 | 0건 | — | +| `check_master` 본문 | 2건 — 계수 CC000337(1-2-4 결손 18) · CC000074(8-4-8 결손 1) | 앞 기록 없음(이번이 첫 수치) | +| 일괄 시험 계산 | 통과 1,291 · 멈춤 63 | 같음 | +| 단위 경고 | 14건 | 같음 | + +## 파일별 줄 수 + +| 테이블 | 줄 수 | 앞 기록 대비 | +|---|---|---| +| 인력 | 378 | — | +| 자재품목 | 30,592 | 같음 | +| 유가전력 | 56 | — | +| 품셈재료 | 363 | — | +| 기계 | 654 | 같음 | +| 소요량 표 합 | 2,535 | — | +| 계수 표 합 | 495 | — | +| 소요량 + 계수 | 3,030 | 앞 기록 3,029 → **+1** | +| 로직 합 | 1,354 | 같음 | +| 조합 | 0 | — | +| 요율 · 환율 | 19 · 5 | — | From fb503d6b5ff3b074a12ed5bea82f6a3baacdaa2f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 00:59:19 +0900 Subject: [PATCH 03/10] =?UTF-8?q?fix(M01):=20=EC=9D=BC=EC=9C=84=EB=8C=80?= =?UTF-8?q?=EA=B0=80=20=EC=A1=B0=ED=95=A9=20=E2=80=94=20=EC=B2=AB=20?= =?UTF-8?q?=ED=8E=BC=EC=B9=A8=20=EB=B6=88=EB=9F=AC=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EC=A4=91=20=C2=B7=20=EB=8A=A6=EC=9D=80=20=EB=8B=B5=20=EB=B2=84?= =?UTF-8?q?=EB=A6=BC=20=C2=B7=20=EC=97=B4=EC=96=B4=20=EB=91=94=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EA=B8=B0=EC=96=B5=20=C2=B7=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=9D=B4=EB=8F=99=20=EC=A0=84=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT --- M01_MasterData/M01_MasterData_UI_Combo.ts | 58 ++++++++++++++++--- .../M01_MasterData_UI_Combo_Text.ts | 5 ++ resources/master_data/ref/_검증_조합_화면.md | 4 ++ 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/M01_MasterData/M01_MasterData_UI_Combo.ts b/M01_MasterData/M01_MasterData_UI_Combo.ts index d4bf0346..fa94820a 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo.ts +++ b/M01_MasterData/M01_MasterData_UI_Combo.ts @@ -65,21 +65,47 @@ export function mountM01Combo( let items: ComboSummary[] = []; let logics = new Map(); let pick = { sub: "", detail: "" }; + /** 화면을 바꾼 횟수 — 늦게 온 답은 이 값이 달라졌으면 버림 */ + let nav = 0; + /** 열어 둔 상세 — 다른 화면에 갔다 와도 그대로 돌아오게 기억 */ + let current: { combo: Combo; version: string } | null = null; + let logicsReady: Promise = Promise.resolve(); const filterHost = el("div"); side.comboHost.replaceChildren(filterHost); const view = el("div", { className: "m01-logic__editor" }); host.replaceChildren(view); - const load = async (): Promise => { + /** 목록만 받음 — 로직 이름표(1300여 개)는 따로 받아 목록을 붙잡지 않음 */ + const load = async (redraw = true): Promise => { + const my = nav; try { - const [combos, all] = await Promise.all([fetchCombos(), fetchLogics()]); - items = combos; - logics = new Map(all.map((x) => [x.키, x])); + items = await fetchCombos(); } catch (error) { showToast(error instanceof Error ? error.message : tc("Load_Failed"), "error"); } drawFilter(); - drawList(); + if (redraw && my === nav) drawList(); + }; + + const loadLogics = (): void => { + logicsReady = fetchLogics() + .then((all) => { + logics = new Map(all.map((x) => [x.키, x])); + }) + .catch((error) => + showToast(error instanceof Error ? error.message : tc("Load_Failed"), "error"), + ); + }; + + const show = async (): Promise => { + if (!logics.size) loadLogics(); + if (!items.length && !current) { + view.replaceChildren(el("p", { className: "m01-logic__muted", text: tc("Loading") })); + } + await load(false); + if (!current) drawList(); + await logicsReady; + if (current) draw(current.combo, current.version); }; /* --- 왼쪽 거름 --- */ @@ -124,6 +150,8 @@ export function mountM01Combo( }); const drawList = (): void => { + nav++; + current = null; const shown = items.filter( (x) => (!pick.sub || x.구분 === pick.sub) && (!pick.detail || x.상세구분 === pick.detail), ); @@ -169,7 +197,10 @@ export function mountM01Combo( const open = async (key: string): Promise => { try { + const my = ++nav; const one = await fetchCombo(key); + await logicsReady; + if (my !== nav) return; draw(one.combo, one.version); } catch (error) { showToast(error instanceof Error ? error.message : tc("Load_Failed"), "error"); @@ -178,6 +209,9 @@ export function mountM01Combo( /* --- 상세 --- */ const draw = (combo: Combo, version: string): void => { + nav++; + current = { combo, version }; + const saved = JSON.stringify(combo); const field = (label: string, name: "이름" | "구분" | "상세구분" | "단위" | "비고") => { const f = createInputField({ type: "text", label }); f.input.value = combo[name] ?? ""; @@ -208,7 +242,10 @@ export function mountM01Combo( text: info?.이름 ?? row.로직, attrs: { type: "button", title: tc("Open") }, }); - name.addEventListener("click", () => onOpenLogic(row.로직)); + name.addEventListener("click", async () => { + if (JSON.stringify(combo) !== saved && !(await showConfirmDialog(tc("LeaveAsk")))) return; + onOpenLogic(row.로직); + }); const btns = el("div", { className: "m01-logic__chips", children: [ @@ -274,11 +311,16 @@ export function mountM01Combo( variant: "filled", onClick: async () => { if (!combo.이름.trim()) return showToast(tc("NeedName"), "error"); + const my = nav; try { const key = combo.키 ? combo.키 : (await newCombo(combo)).key; if (combo.키) await editCombo(combo.키, version, combo); showToast(tc("Saved"), "success"); - await load(); + await load(false); + if (my !== nav) { + if (current?.combo === combo) current = null; // 저장 사이에 나감 — 옛 판본을 붙들지 않음 + return; + } await open(key); } catch (error) { showToast(reason(error), "error"); @@ -335,5 +377,5 @@ export function mountM01Combo( drawTable(); }; - return { show: load }; + return { show }; } diff --git a/M01_MasterData/M01_MasterData_UI_Combo_Text.ts b/M01_MasterData/M01_MasterData_UI_Combo_Text.ts index 60ca1532..4456b20f 100644 --- a/M01_MasterData/M01_MasterData_UI_Combo_Text.ts +++ b/M01_MasterData/M01_MasterData_UI_Combo_Text.ts @@ -18,6 +18,11 @@ const TEXT = { Saved: ["저장함", "Saved"], Deleted: ["지움", "Deleted"], Stale: ["그 사이 조합 파일이 바뀜 — 다시 열어 주세요", "The file changed — reopen it"], + Loading: ["불러오는 중…", "Loading…"], + LeaveAsk: [ + "저장 안 한 고침이 있음 — 로직 상세로 가면 이 화면에서는 그대로 두고 옮겨 감. 갈까요?", + "Unsaved edits — go to the logic anyway?", + ], NeedName: ["이름을 적어야 저장됨", "A name is required"], Load_Failed: ["불러오지 못함", "Load failed"], Head_Key: ["키", "Key"], diff --git a/resources/master_data/ref/_검증_조합_화면.md b/resources/master_data/ref/_검증_조합_화면.md index 8589d345..6b07023a 100644 --- a/resources/master_data/ref/_검증_조합_화면.md +++ b/resources/master_data/ref/_검증_조합_화면.md @@ -21,3 +21,7 @@ ORCA · 13-4-1 + 12-4 + 12-17-1 + 9-16-1 로 견본 조합을 끝까지 씀. 흔 - 「돌아오기」 = 컨테이너 제목을 접었다 펴야 함 · 그때 목록을 새로 받아 열어 둔 상세가 목록으로 바뀜(저장 안 한 고침은 사라짐). - 로직 상세로 갈 때 저장 안 한 조합 고침을 묻지 않음. - PLAN.md 에 4-3·4-4 줄이 이 창 판에 없어 체크·검증완료를 적지 못함. + +## 고친 뒤 + +- 넷 모두 고침 · ORCA 재확인: 펼치자마자 「불러오는 중」(0.1초) · 목록은 로직 이름표를 기다리지 않음 · 저장 직후 나가면 늦은 답 버림 · 다녀오면 열어 둔 상세(저장 안 한 고침 포함) 그대로 · 로직 상세로 갈 때 저장 안 한 고침이 있으면 확인창. From db76fa1878646bb2b8c8d4f2a2cf8ceb70bc67fb Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:07:01 +0900 Subject: [PATCH 04/10] =?UTF-8?q?knowledge(M01):=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B0=B8=EC=A1=B0=2020=EC=A4=84=20=EC=9D=B4=EA=B4=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=E2=80=94=20=EC=96=B4=EA=B8=8B=EB=82=A8=20?= =?UTF-8?q?0=20=C2=B7=20=EC=9E=A1=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=EA=B2=83=20=EC=85=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT --- resources/master_data/ref/_검증_변수참조.md | 30 +++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 resources/master_data/ref/_검증_변수참조.md diff --git a/resources/master_data/ref/_검증_변수참조.md b/resources/master_data/ref/_검증_변수참조.md new file mode 100644 index 00000000..a93721f2 --- /dev/null +++ b/resources/master_data/ref/_검증_변수참조.md @@ -0,0 +1,30 @@ +# 변수 참조 20줄 이관 검증 (읽기 전용) + +기준 — 옛 판 ded54566^ 대 지금 판 · 같은 마스터 자료에 각 판의 엔진으로 계산. + +## 어긋난 것 + +- 금액·고른 자재 어긋남 0. +- ③ 고르기 조건에 **수 입력**({횟수} 따위)을 넣어도 check_master 가 안 잡음 — 「입력·중간인지」만 봄 · 값이 문자 아니면 계산 때 멈춤. 지금 20줄은 모두 글 입력이라 해당 없음. +- 합판 · 박리제는 고르기 값이 1개뿐이라 「입력에 따라 다른 자재를 집는지」 못 잼(값 하나에서만 같음). +- GC000211 · GF000173 은 옛 판도 끝까지 계산이 멈춤(자재 후보 없음 · 단가 비어 있음) — 로직 계산으로는 못 견주고 줄 단위로만 견줌. + +## ① 옛 방식과 같은 자재를 집는가 + +- 바뀐 로직 14 · 줄 20(GC000031·037·062·068·127·207·211·224 · GF000159·160·173·187·196·207). +- 줄 단위: 줄마다 변수의 고르기 값을 전부 넣어 옛 요소 풀이와 새 요소 풀이의 단가·출처를 견줌 — 48 조합 전부 같음(멈춤 0). +- 로직 단위: 입력 한 개씩 모든 고르기 값(범위는 위끝·가운데)으로 옛·새 계산 141 벌 — 계·비목·줄 수량·단가 전부 같음(멈춤 69 벌도 옛·새 같은 까닭). + +## ② 변수가 비면 + +- GF000160 의 변수 5개(합판 · 각재 · 철선 · 못 · 박리제)마다 없음 · 빈 글 · 없는 이름 세 가지 — 15 벌 전부 멈춤(「입력 … 없음」 · 「고르기 밖」). 엉뚱한 줄을 집은 경우 0. + +## ③ check_master + +- 지금 판: 틀 0 · 로직 0 · 조합 0 (본문 2 · 단위 14 는 옛 판과 같음 — 로직 절 diff 없음). +- 모르는 이름 {없는변수} 를 조건에 넣으면 「입력·중간 아님」으로 잡힘. + +## ④ 남은 2줄 + +- VR관(GF000173): 자재품목 VR관 계열 35줄 가운데 이름 「VR관」 12 · 「VR관(관급)」 11 이 모두 단위 「본」 · 호표 줄은 「m」 → 단위가 다른 후보만이라 후보 0. 관경 800 · 1000 · 1200 규격은 있음. +- 커플링밴드(GF000176): 「Φ800mm」 규격은 파형강관 6줄(커플링밴드 관급 1 · 이음관-거양 5 — 거양 5 안에 접속티 포함) — 규격만으로는 접속티가 섞임. 다른 갈래 「커플링밴드(편형식·파형식) D800」 은 단위 「조」. From bbee6118e6dc92b2c22e0f3b9be6e6889cd2315f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:11:53 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EF=BB=BFknowledge(M01):=20=EB=B0=A4=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=9A=94=EC=95=BD=20=E2=80=94=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=95=84=EC=B9=A8=20=EB=B3=B4=EA=B3=A0?= =?UTF-8?q?=EC=9A=A9=20(=EC=9D=BC=EA=B0=90=2027)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8 --- resources/master_data/ref/_밤작업_요약.md | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 resources/master_data/ref/_밤작업_요약.md diff --git a/resources/master_data/ref/_밤작업_요약.md b/resources/master_data/ref/_밤작업_요약.md new file mode 100644 index 00000000..af1912c2 --- /dev/null +++ b/resources/master_data/ref/_밤작업_요약.md @@ -0,0 +1,45 @@ +# 밤 작업 요약 (2026-09-21 저녁 ~ 09-22 새벽) + +여섯 창이 한 일 · 사용자가 아침에 읽는 용도. 값·코드는 이 문서에서 안 고침. 근거 = `ref/` 검증 문서 이름. + +## ① 화면에서 달라진 것 + +- 단가산출 로직 상세 컨테이너 넷 — 기본정보(읽기 전용, 비고만 고침) · 호표 · 텍스트 수식 · 시험 계산. (`_검증_로직개선_사용자경로.md` · `_검증_테스트_컨테이너.md`) +- 호표 세 묶음 — 인력 · 자재 · 경비. 다른 로직을 부르는 줄은 「그 밖」 한 줄로 나옴. +- 텍스트 수식 두 칸 — 이름 식(글자로 된 식)과 값 식(숫자 식)이 줄마다 짝으로 나옴. 수량 0 인 줄이 사라지던 것 83줄을 고침. (`_검증_텍스트_수식.md` · `_검증_이름식.md`) +- 알약 모달 — 호표 줄을 누르면 뜨는 창. 고른 자재·표 줄을 강조. +- 일위대가 조합 컨테이너 — 로직 여러 개를 담고 미리 보기 합계를 봄. 수량·계산은 저장 안 됨. (`_검증_조합.md` · `_검증_조합_화면.md`) +- 이름 바뀜 — 자재 이름을 고르기 조건으로 잡는 방식으로 바뀜(변수 참조 20줄 이관). (`_검증_변수참조.md`) + +**눌러 볼 차례 (세 줄)** +1. 로직 화면에서 13-4-1 · 12-4 · 12-17-1 열어 컨테이너 넷과 호표 세 묶음을 훑음. +2. 호표 줄을 눌러 알약 모달이 뜨고 줄이 강조되는지 봄. +3. 조합 컨테이너에서 새 조합 → 로직 셋 담기 → 미리 보기 합계 → 저장 → 다시 열기. + +## ② 데이터가 채워진 정도 + +| 항목 | 전 → 후 | 남은 것 | +|---|---|---| +| 관급 값 채우기 | 355 → **112줄** 남음 | 소형고압블록 49 · 중온 아스콘 28 · KP 접합부속 17 · 그 밖 14 · 접속티 4(값 지우고 까닭 적음) — 모두 조달청에 같은 물건이 없거나 사람이 정할 것 | +| 옛 재료 줄 | 307 → **178줄** 남음 | 자재품목에 짝이 없는 것 139 · 지역 갈리는 것 17 · `{변수}` 든 것 22(변수 참조 20줄은 이관됨) | +| 변수 참조 | 20줄 이관 | 금액 어긋남 0 · 옛 판과 같은 자재를 집음 | +| 값 못 채운 것 | 관급 112 · 단가 비어 멈춘 로직(맨홀 · VR관 · 흄관) | 자료 쪽 몫 | + +근거: `_검증_관급_가까운줄.md` · `_남은_옛재료줄.md` · `_없는_재료.md`. + +## ③ 검증 수치 (`_마감_수치.md` · `_검증_3장_마감.md`) + +| 항목 | 결과 | +|---|---| +| 시험(`test_m01_*` + `test_masterdata_*`) | 190 통과 · 실패 0 | +| `check_master` 틀 · 로직 · 조합 | 0 · 0 · 0건 | +| `check_master` 본문 | 2건(계수 CC000337 · CC000074 결손) | +| 일괄 시험 계산 | 통과 1,291 · 멈춤 63(자료 비어서 멈춤 · 화면 탓 아님) | +| 단위 경고 | 14건 | +| 줄 수 | 로직 1,354 · 자재품목 30,592 · 기계 654 · 인력 378 · 품셈재료 363 · 소요량+계수 3,030 · 조합 0 | + +밤새 새로 밝힌 어긋남(고칠 것): 조합 `메모`·`이름` 칸이 글자 아닌 값도 저장됨(`_검증_조합.md`) · 3장 줄 이름 글자 2건(`_검증_3장_마감.md`). + +## ④ 사용자가 정할 것 + +PLAN 6장을 봄 — 다시 적지 않음. 관급 쪽 상세는 `_확정거리_관급.md`. From d3f48bce110438ff0f9eda78bcbc7a47e5322c05 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:14:30 +0900 Subject: [PATCH 06/10] =?UTF-8?q?knowledge(M01):=20=EB=B3=B8=EB=AC=B8=20?= =?UTF-8?q?=EB=8C=80=EC=A1=B0=20=EC=98=A4=ED=83=90=20=EB=91=98=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=E2=80=94=201-2-4=20=EB=AF=B8=EC=98=AC=EB=A6=BC=20?= =?UTF-8?q?=EB=92=B7=ED=95=AD=20=EC=A0=9C=EC=99=B8=20=C2=B7=20=EC=B9=B8=20?= =?UTF-8?q?=EC=95=88=20=EC=A4=84=EB=B0=94=EB=80=9C=20=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9D=BD=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CC000337 결손 18 = 1-2-4 5·6항 표 미올림 · CC000074 결손 51 = 원문 규격 5,150 줄바뀜 · 본문 대조 0건 Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- resources/master_data/ref/_마감_수치.md | 5 +++++ resources/master_data/scripts/check_master.py | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/resources/master_data/ref/_마감_수치.md b/resources/master_data/ref/_마감_수치.md index 09531a42..97e6e6ae 100644 --- a/resources/master_data/ref/_마감_수치.md +++ b/resources/master_data/ref/_마감_수치.md @@ -29,3 +29,8 @@ | 로직 합 | 1,354 | 같음 | | 조합 | 0 | — | | 요율 · 환율 | 19 · 5 | — | + +## 고친 뒤 (일감 26) + +- 본문 대조 0건 — 도구가 잘못 읽은 것 둘: ① CC000337 은 1-2-4 의 5항(발생재 공제율)·6항(강관배관 부자재율) 표가 아직 마스터에 없어 뜬 것(3항 표 47줄은 원문과 같음) → 검사가 5항 앞까지만 대조 ② CC000074 는 원문 규격 칸 「5,1
50」(PDF 줄바뀜 · 5,150)을 51 로 읽은 것 → 칸 안에서 줄바뀐 천 단위 수는 이어 붙여 읽음. +- CC000337 은 2026-09-21 08:26(8f5566e7)에 새로 생김 — 그 절에 표가 처음 생겨 대조 대상이 된 것 · CC000074 표는 밤 사이 안 바뀜(마지막 수정 09-20). diff --git a/resources/master_data/scripts/check_master.py b/resources/master_data/scripts/check_master.py index 8745073b..097e0b64 100644 --- a/resources/master_data/scripts/check_master.py +++ b/resources/master_data/scripts/check_master.py @@ -484,6 +484,8 @@ def _canon(token: str) -> str: def numbers_in(text: str) -> set[str]: + # 칸 안에서 줄바뀐 천 단위 수(「5,1
50」)는 이어 붙임 + text = re.sub(r"(?<=\d,\d)
(?=\d{2})", "", text) return {_canon(t) for _, line in md_lines(text) for t in _NUM.findall(line)} @@ -499,6 +501,10 @@ def _flat(value) -> set[str]: return set() +# 절 안에서 아직 표로 안 올린 뒷항의 머리 — 그 앞까지만 결손 대조(1-2-4 5항 발생재 공제율 · 6항 강관배관 부자재율) +UNBUILT = {"1-2-4": "5\\. 발생재의 처리"} + + def check_body(files: dict[str, dict]) -> list[str]: """표마다 허구 · 절마다 결손.""" out, by_section = [], {} @@ -530,6 +536,9 @@ def check_body(files: dict[str, dict]) -> list[str]: if md2 == md and ident2.startswith(ident + "-"): mine = mine | mine2 tables = tables + tables2 + cut = UNBUILT.get(ident) + if cut and cut in text: + text = text[: text.index(cut)] # 표로 안 올린 뒷항은 결손 대조에서 뺌 table_text = "\n".join(line for line in text.split("\n") if line.lstrip().startswith("|")) lack = numbers_in(table_text) - mine if lack: From 807124e80f153c954f717d4dcb50d377f7aef331 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:17:55 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=EF=BB=BFknowledge(M01):=20=EB=8B=A8?= =?UTF-8?q?=EA=B0=80=20=EB=B9=88=20=EB=A1=9C=EC=A7=81=2063=20=EA=B0=88?= =?UTF-8?q?=EB=9E=98=20=EC=A0=95=EB=A6=AC=20=E2=80=94=20=EA=B3=A0=EC=B9=A0?= =?UTF-8?q?=20=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=A4=84=200=20(=EC=9D=BC?= =?UTF-8?q?=EA=B0=90=2028)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8 --- resources/master_data/ref/_단가_빈로직.md | 104 ++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 resources/master_data/ref/_단가_빈로직.md diff --git a/resources/master_data/ref/_단가_빈로직.md b/resources/master_data/ref/_단가_빈로직.md new file mode 100644 index 00000000..1179ca1f --- /dev/null +++ b/resources/master_data/ref/_단가_빈로직.md @@ -0,0 +1,104 @@ +# 단가 빈 로직 — 왜 비고 무엇이 있어야 풀리나 (일감 28) + +일괄 시험 계산이 멈추는 63 로직 전부를 갈래로 나눔(읽기 전용 · 값 안 지어냄). 앞 = 통과 1,291 · 멈춤 63 → 뒤 = 같음(고칠 수 있는 줄 0). + +- 옛 「단가 빈 셋」 중 흄관(GF000174)은 이미 풀림 — 남은 것은 VR관(GF000173) · 맨홀(GF000181) 등. +- 갈래: **A** 자재품목에 그 재료가 없음 · **B** 값 칸이 비어 있음 · **C** 단위가 안 맞음 · **D** 후보는 있으나 사람이 골라야 함 · **E** 고르기 조건이 맞는 줄을 못 찾음. + +## 왜 안 고쳤나 + +- 고칠 수 있는 것 = 값이 뚜렷하고 같은 물건이 확실한 것뿐. 줄마다 확인한 결과 **A는 이름 든 자재품목 줄이 0**, C·D는 환산 근거(1본 길이·무게 등)나 규격 지정이 없어 지어 넣게 됨. +- VR관 · 사다리 · 집수정 · 돌망태 줄은 로직 파일 쪽 고침이라 이 일감 범위 밖(로직은 읽기만). + +## 갈래별 로직 줄 수 + +| 갈래 | 로직 수 | +|---|---| +| A | 40 | +| B | 3 | +| C | 10 | +| D | 6 | +| E | 4 | + +(합 63 = 멈춤 63) + +## A. 자재품목에 그 재료가 없음 — 재료 32개 + +| 재료 | 규격·단위 | 멈춘 로직 | 까닭 | 있어야 풀리는 것 | +|---|---|---|---|---| +| MP000048 JOINT FILLER | ㎡ | GF000197 JOINT FILLER, GF000208 암거이음받침 채움재(T=20㎜) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000055 스티로폴 | T=20㎜ ㎡ | GF000202 다웰바 설치 접속스라브부(D29m/m, L=500m/m) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000065 틈메우기돌 | ㎥ | GF000223 돌붙임(인력) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000070 깃발 | 개 | GF000081 유인헬기방제 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000076 피복제 | 화이버/펄프류 ㎏ | GC000145 초류종자 살포(기계살포) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000095 BASECHANNEL | 두께 2.0㎜ 이상 m | GC000001 철제조립식 가설건축물 손료 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000113 축중계(이동식) | 대 | GC000003 축중계 손료 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000129 보호막 | ㎡ | GC000061 비계주위 보호막 설치 및 해체 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000134 모래주머니 | 개 | GC000181 매트부설(육상) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000144 보조강재 | ㎏ | GC000559 철골 공장가공조립(기본철골공수) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000150 질석 | ㎏ | GC000573 철골 내화 피복뿜칠(질석계 습식) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000169 정배지 | ㎡ | GC000618 도배바름(초배 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000172 알루미늄핀 | 개 | GC000623 단열재 핀사용 붙이기 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000176 표준보강메시 | ㎡ | GC000628 외벽단열공법(타정 부착 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000177 고강도메시 | ㎡ | GC000629 외벽단열 하부 충격보강 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000202 IV전선 | 2.0㎜ m | GC000409 강관압입추진공 조명시설 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000211 테르밋용재 | 점화용 포 | GC000361 레일 테르밋 용접 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000218 철편(Grit) | ㎏ | GC000376 강교 제품 표면처리 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000235 슈 | 표준관입시험용 개 | GC000433 표준관입시험 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000239 베인 전용로드 | ø16×750 본 | GC000435 베인전단시험(Field Vane) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000241 표준사 | 평판재하시험용 ㎏ | GC000436 평판재하시험 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000242 단독콘 | 정재하시험용 개 | GC000438 정재하시험 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000250 Lagging Sheet | ㎡ | GC000901 플랜트 배관 보온(성형물) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000253 코크스 | ㎏ | GC000931 수차 설치(Kaplan, GC000935 수문 설치(Tainter Gate), GC000936 수문 설치(Roller Gate) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000269 세유 | 0∼3 ℓ | GC000932 수력 발전기 설치 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000290 Nozzle | 개 | GC000933 수문 제작(Tainter Gate), GC000934 수문 제작(Roller Gate), GC000938 Stop-Log 설치 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000293 세유 | ℓ | GC000939 수문 Hoist 설치, GC000986 Over Head Crane 설치, GC000993 플랜트 공사별 설치 소모자재(참고) | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000294 전기용접 | ㎏ | GC000940 Spiral Casing 설치 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000299 탄소봉 | 8ø×350㎜ 본 | GC000941 Steel Penstock 현장제관, GC000942 Steel Penstock 현장설치 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000310 Tar Epoxy | 2회 ℓ | GC000944 Roller Gate Guide Metal 설치 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000314 drill | 1/4" 개 | GC000947 Trash Rack 제작 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | +| MP000319 Tar Epoxy | 1회도장 ℓ | GC000950 Trash Rack 설치 | 자재품목에 같은 이름의 줄이 없음(이름 든 줄 0) | 그 재료를 자재품목에 채운 뒤 고르기 이음 | + +## B. 값 칸이 비어 있음 — 재료 1개 + +| 재료 | 규격·단위 | 멈춘 로직 | 까닭 | 있어야 풀리는 것 | +|---|---|---|---|---| +| MP000094 쉬즈관 | m | GC000230 PSC빔 쉬즈관 설치, GC000237 PSC BOX 쉬즈관 설치 | 자재품목 나선형쉬즈관 Φ60·75 는 있으나 값 칸이 모두 비어 있음 | 쉬즈관 값(물가지 등) · 규격 Φ 확정 | +| MT007751 카트리지(화약) 앵커 | 화약 개 | GC000646 벤토나이트방수 붙임 | 자재품목에 줄은 있으나(고르기 조건 대표) 값 칸 5개가 모두 비어 있음 | 카트리지 값(물가지 등) | + +## C. 단위가 안 맞음 — 재료 9개 + +| 재료 | 규격·단위 | 멈춘 로직 | 까닭 | 있어야 풀리는 것 | +|---|---|---|---|---| +| MP000012 사다리 | ∅19㎜ 아연도금 및 스테인레스 ton | GF000181 맨홀 | 자재품목 맨홀사다리는 「개」(MT009883 · 19,550) · 원문은 ton | 사다리 1개의 무게 — 있으면 ton 으로 환산 | +| MP000023 VR관(소켓식) | ∅800㎜ m | GF000173 VR관(소켓식) 부설 | 자재품목 VR관 D=800 은 「본」 단위(관급 222,060 · 일반 214,000) · 원문은 m | VR관 1본의 길이(원문 또는 제조사 규격) — 있으면 m 값으로 환산 | +| MP000052 스페이셔(몰탈 블록) | | GF000200 스페이셔 설치(몰탈 블록) | 원문에 단위가 없음 — 자재품목 스페이셔(EA)는 다른 물건(벽체·슬라브용 플라스틱) | 원문 단위와 몰탈 블록 스페이셔 값 | +| MP000060 콘크리트 표면 강화재(하드너) | | GF000209 콘크리트 표면 강화재(하드너) | 원문에 단위가 없고 자재품목에 하드너 없음 | 원문 단위와 하드너 값 | +| MP000066 철망태(사각형 돌망태) | ㎥ | GF000235 사각형 돌망태 | 자재품목 개비온은 「조」 · 원문 ㎥ | 개비온 1조 부피(규격 1.0×1.0×1.0 이면 1㎥ 로 볼 수 있으나 확정 필요) | +| MP000201 실리콘 | ㎏ | GC000752 제연댐퍼 설치 | 자재품목 실리콘은 ℓ · Ton · 개 — ㎏ 없음 | 실리콘 ℓ→㎏ 환산 비중 확정 | +| MP000209 버너 | 압접가열용 개 | GC000360 레일 가스압접 | 자재품목 버너는 개장로용 가스버너 등 다른 물건(단위 조·대) | 압접가열용 버너 값 | +| MP000216 철구(Shot ball) | ㎏ | GC000375 강교 소재 표면처리, GC000822 바탕만들기(블라스트 | 자재품목 철구류는 「본」 2줄뿐 · 원문 ㎏ | 철구 1본 무게 | +| MP000363 아스팔트싱글 | 336×1,000×3㎜ 매 | GC000654 아스팔트싱글 설치 | 자재품목 슁글은 ㎡ · 원문 「매」 | 슁글 1매 면적 | + +## D. 사람이 골라야 함 — 재료 5개 + +| 재료 | 규격·단위 | 멈춘 로직 | 까닭 | 있어야 풀리는 것 | +|---|---|---|---|---| +| MP000004 모래 | ㎥ | GF000183 용적배합 콘크리트 손비비기 | 울진 모래 줄이 없음(삼척·포항만) — `_지역_갈림_재료.md` | 울진 모래 값 또는 가까운 지역 확정 | +| MP000040 집수정 뚜껑 | 스틸그레이팅 개 | GF000180 집수정 | 자재품목에 스틸그레이팅(개)이 크기별로 있으나(MT006901~ · 200~900×1000) 집수정 뚜껑 크기를 원문이 밝히지 않음 | 뚜껑 크기(규격) 확정 뒤 고르기 조건에 규격 지정 | +| MP000082 에폭시 | kg | GC000337 낙석방지망 철망 및 와이어 설치 | 자재품목 주입용 에폭시 kg 2줄(60,000 · 20,000)뿐이라 포켓식 낙석방지망용과 같은 물건인지 못 가림 | 같은 용도의 에폭시 줄 지정 | +| MP000215 용접봉 | 강교 제작용 ㎏ | GC000374 강교 제작 기타재료 | 고르기(잡재료 › 용접·가스) 후보 12줄 — 강교 제작용 규격을 못 가림 | 사람이 용접봉 규격 하나 지정(대표) | +| MP000359 중유 | ℓ | GC000943 Roller Gate Guide Metal 제작, GC000948 Tainter Gate Anchorage 제관 | 중유는 받지 않기로 함(자재품목엔 박리제(중유) 1줄뿐) | 중유 값 또는 다른 유류로 대체 확정 | + +## E. 고르기 조건이 맞는 줄을 못 찾음 — 로직 4 + +| 로직 | 조건 | 까닭 | 있어야 풀리는 것 | +|---|---|---|---| +| GC000027 강관 조립말비계(이동식) 설치 및 해체 | {'구분': '거푸집·가설재', '상세구분': '동바리·비계'} | 가새 「조」 · 수평띠장 「개」 등 — 동바리·비계에 단위 「조」 줄 없음(개·EA·M·본·경간·㎡ 뿐) | 그 단위(조·㎝·본)의 줄 또는 단위 환산 근거 | +| GC000855 가스용 강관 나사식 접합 및 배관 | {'구분': '잡재료', '상세구분': '소모품'} | 스레트실테이프 단위 ㎝ — 잡재료 소모품에 ㎝ 줄 없음(테이프는 M·롤·개) | 그 단위(조·㎝·본)의 줄 또는 단위 환산 근거 | +| GC000859 직독식 가스미터 설치 | {'구분': '잡재료', '상세구분': '소모품'} | 같음(㎝ 단위 테이프) | 그 단위(조·㎝·본)의 줄 또는 단위 환산 근거 | +| GF000165 콘크리트 포장 거푸집 | {'구분': '거푸집·가설재', '상세구분': '거푸집'} | 철재 거푸집 「본」 · 핀폴 「개」 — 거푸집에 「본」 줄 없음 · 핀폴 자체 없음 | 그 단위(조·㎝·본)의 줄 또는 단위 환산 근거 | + +## 다음 + +- 값을 채우는 일은 `_없는_재료.md`(A) · 환산 근거 확정(C) · 사람이 고르기(D)가 먼저 — 그 뒤 `build_품셈재료_고르기.py` → `build_로직_재료_고르기.py` 다시 돌리면 자동으로 이어짐. From a674b92512ef1eceeeba2773f861c7569a2a354b Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:18:19 +0900 Subject: [PATCH 08/10] =?UTF-8?q?knowledge(M01):=20=EA=B3=84=EC=88=98=201-?= =?UTF-8?q?2-4=205=C2=B76=ED=95=AD=20=ED=91=9C=20=EC=85=8B=20=EC=98=AC?= =?UTF-8?q?=EB=A6=BC=20=E2=80=94=20=EB=B0=9C=EC=83=9D=EC=9E=AC=20=EA=B3=B5?= =?UTF-8?q?=EC=A0=9C=EC=9C=A8=20=C2=B7=20=EA=B0=95=EA=B4=80=EB=B0=B0?= =?UTF-8?q?=EA=B4=80=20=EB=B6=80=EC=9E=90=EC=9E=AC=EC=9C=A8(=EC=9D=BC?= =?UTF-8?q?=EB=B0=98=EC=97=85=EB=AC=B4=EC=9A=A9=C2=B7=EB=B3=91=EC=9B=90)?= =?UTF-8?q?=20=C2=B7=20=EB=B3=B8=EB=AC=B8=20=EB=8C=80=EC=A1=B0=20=EC=A0=88?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=EB=A1=9C=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CC000338~340 · 원문 수 그대로 · 쓰는 로직 없음(로직키 빈 목록) · 본문 대조 0건 Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- resources/master_data/_키대장.json | 5 +- resources/master_data/scripts/check_master.py | 7 -- .../계수_건설품셈_01장_적용기준.json | 106 ++++++++++++++++++ 3 files changed, 110 insertions(+), 8 deletions(-) diff --git a/resources/master_data/_키대장.json b/resources/master_data/_키대장.json index b1c37fea..1e5e5a84 100644 --- a/resources/master_data/_키대장.json +++ b/resources/master_data/_키대장.json @@ -1,5 +1,5 @@ { - "다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 30600, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 252, "CC": 338, "GC": 1104, "QC": 2060, "GX": 1}, + "다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 30600, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 252, "CC": 341, "GC": 1104, "QC": 2060, "GX": 1}, "폐기": {"MT000001": "자재품목 휘발유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000002": "자재품목 경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000003": "자재품목 선박용경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000004": "자재품목 중유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000005": "자재품목 등유 — 값이 비고 글뿐 · 유가 테이블로 감", "LB000399": "이름 「〃」 — 직종이 아니라 되풀이 기호 · 소요량 13-6-9 에서 윗줄 직종으로 바로잡음", "MN": "재료_나라장터자재 — old 로 옮김 · 로직은 자재품목·품셈재료로 갈아 끼움", "LB000372": "미확보 고급기능사 — 측량노임 항공사진고급기능사 옛이름으로 옮김", "LB000393": "미확보 리베팅공 — 건설노임 철골공 옛이름으로 옮김(2010 통합표 연번10)", "LB000405": "미확보 Belt Conveyor 설치공 — 품셈 13-10-1 주② 배분으로 다섯 직종에 나눔", "MT000006": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "MT000007": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "LB000368": "미확보 기술사 — 기술사(건설) 옛이름으로 옮김", "LB000369": "미확보 특급기술자 — 특급기술자(건설) 옛이름으로 옮김", "LB000370": "미확보 고급기술자 — 고급기술자(건설) 옛이름으로 옮김", "LB000361": "미확보 중급기술자 — 중급기술자(건설) 옛이름으로 옮김", "LB000364": "미확보 초급기술자 — 초급기술자(건설) 옛이름으로 옮김", "LB000365": "미확보 고급숙련기술자 — 고급숙련기술자(건설) 옛이름으로 옮김", "LB000366": "미확보 중급숙련기술자 — 중급숙련기술자(건설) 옛이름으로 옮김", "LB000367": "미확보 초급숙련기술자 — 초급숙련기술자(건설) 옛이름으로 옮김", "LB000389": "미확보 기계기사 — 초급기술자(기계·설비) 옛이름으로 옮김", "LB000388": "미확보 기계산업기사 — 초급숙련기술자(기계·설비) 옛이름으로 옮김", "MO000055": {"원문번호": "주택용저압:기본_200이하", "파일": "재료_유가전력.json"}, "MO000056": {"원문번호": "주택용저압:기본_201~400", "파일": "재료_유가전력.json"}, "MO000057": {"원문번호": "주택용저압:기본_400초과", "파일": "재료_유가전력.json"}, "MO000059": {"원문번호": "주택용저압:전력량_다음200", "파일": "재료_유가전력.json"}, "MO000060": {"원문번호": "주택용저압:전력량_400초과", "파일": "재료_유가전력.json"}, "MO000061": {"원문번호": "주택용저압:월간최저요금", "파일": "재료_유가전력.json"}, "MO000062": {"원문번호": "일반용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000063": {"원문번호": "일반용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000064": {"원문번호": "일반용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000065": {"원문번호": "일반용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000066": {"원문번호": "산업용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000067": {"원문번호": "산업용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000068": {"원문번호": "산업용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000069": {"원문번호": "산업용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000070": {"원문번호": "임시전력갑:기본요금적용", "파일": "재료_유가전력.json"}, "MO000071": {"원문번호": "임시전력갑:전력량요금적용", "파일": "재료_유가전력.json"}, "MO000072": {"원문번호": "임시전력갑:월간최저요금", "파일": "재료_유가전력.json"}}, "키": { "CC000001": {"원문번호": "공통 1-3-1 콘크리트 및 포장용 재료", "파일": "계수_건설품셈_01장_적용기준.json"}, @@ -339,6 +339,9 @@ "CC000335": {"원문번호": "기계설비 6-2-3 산업용 적산열량계 설치 계수", "파일": "계수_건설품셈_06장_측정기기공사.json"}, "CC000336": {"원문번호": "공통 8-1-3 6 조종원 시간 환산", "파일": "계수_건설품셈_08장_건설기계.json"}, "CC000337": {"원문번호": "공통 1-2-4 3 재료의 단위중량", "파일": "계수_건설품셈_01장_적용기준.json"}, + "CC000338": {"원문번호": "공통 1-2-4 5 발생재 공제율", "파일": "계수_건설품셈_01장_적용기준.json"}, + "CC000339": {"원문번호": "공통 1-2-4 6 가 강관배관 부자재율 일반업무용 건물", "파일": "계수_건설품셈_01장_적용기준.json"}, + "CC000340": {"원문번호": "공통 1-2-4 6 나 강관배관 부자재율 병원건물", "파일": "계수_건설품셈_01장_적용기준.json"}, "CF000001": {"원문번호": "1-1-3 일일 작업시간", "파일": "계수_산림품셈_01장_적용기준.json"}, "CF000002": {"원문번호": "1-2-1 소수 처리", "파일": "계수_산림품셈_01장_적용기준.json"}, "CF000003": {"원문번호": "1-2-1 총축적 계산 기준", "파일": "계수_산림품셈_01장_적용기준.json"}, diff --git a/resources/master_data/scripts/check_master.py b/resources/master_data/scripts/check_master.py index 097e0b64..6daf320f 100644 --- a/resources/master_data/scripts/check_master.py +++ b/resources/master_data/scripts/check_master.py @@ -501,10 +501,6 @@ def _flat(value) -> set[str]: return set() -# 절 안에서 아직 표로 안 올린 뒷항의 머리 — 그 앞까지만 결손 대조(1-2-4 5항 발생재 공제율 · 6항 강관배관 부자재율) -UNBUILT = {"1-2-4": "5\\. 발생재의 처리"} - - def check_body(files: dict[str, dict]) -> list[str]: """표마다 허구 · 절마다 결손.""" out, by_section = [], {} @@ -536,9 +532,6 @@ def check_body(files: dict[str, dict]) -> list[str]: if md2 == md and ident2.startswith(ident + "-"): mine = mine | mine2 tables = tables + tables2 - cut = UNBUILT.get(ident) - if cut and cut in text: - text = text[: text.index(cut)] # 표로 안 올린 뒷항은 결손 대조에서 뺌 table_text = "\n".join(line for line in text.split("\n") if line.lstrip().startswith("|")) lack = numbers_in(table_text) - mine if lack: diff --git a/resources/master_data/계수_건설품셈_01장_적용기준.json b/resources/master_data/계수_건설품셈_01장_적용기준.json index b70d7ca6..daa164f0 100644 --- a/resources/master_data/계수_건설품셈_01장_적용기준.json +++ b/resources/master_data/계수_건설품셈_01장_적용기준.json @@ -69,6 +69,112 @@ "본 표에 없는 품종에 대하여는 단위중량 시험에 의해 결정함을 원칙으로 하며, 필요시 (재료량이 소규모인 경우 등) 문헌에 의한 결과를 참고한다." ] }, + { + "키": "CC000338", "원문번호": "1-2-4", "구분": "건설품셈 공통", "상세구분": "01장 적용기준", + "이름": "발생재 공제율", + "기준": "기타발생재는 공제율이 %가 아니라 「발생량」 — 원문 그대로", + "출처": "건설품셈 공통 1-2-4 5", + "용도": {"공종": "발생재 공제", "대상": ["공제율"], "로직키": []}, + "조건": {"품명": "고르기"}, + "값칸": {"공제율": "%"}, + "줄": [ + {"품명": "사용고재(시멘트공대 및 공드람 제외)", "공제율": 90}, + {"품명": "강재스크랩(Scrap)", "공제율": 70}, + {"품명": "기타발생재", "공제율": "발생량"} + ], + "주": [ + "사용고재 등 발생재의 처리는 이 표에 의하여 그 대금을 설계 당시 미리 공제한다.", + "① 공제금액 계산 : 발생량×공제율×고재단가", + "② 기존시설물의 철거, 해체, 이설 등으로 인한 발생재는 ‘예정가격 작성기준 제17조’를 따른다." + ] + }, + { + "키": "CC000339", "원문번호": "1-2-4", "구분": "건설품셈 공통", "상세구분": "01장 적용기준", + "이름": "강관배관 부자재 산정요율 — 일반업무용 건물", + "기준": "강관금액에 대한 % — 일반탄소강관 기준", + "출처": "건설품셈 공통 1-2-4 6 가", + "용도": {"공종": "강관배관 부자재", "대상": ["관이음부속", "관지지물", "요율"], "로직키": []}, + "조건": {"배관": "고르기", "부위": "고르기", "건물규모": "고르기"}, + "값칸": {"관이음부속": "%", "관지지물": "%"}, + "줄": [ + {"배관": "냉온수배관", "부위": "기계실", "건물규모": "소", "관이음부속": 75, "관지지물": 30}, + {"배관": "냉온수배관", "부위": "기계실", "건물규모": "중", "관이음부속": 70, "관지지물": 15}, + {"배관": "냉온수배관", "부위": "기계실", "건물규모": "대", "관이음부속": 65, "관지지물": 15}, + {"배관": "냉온수배관", "부위": "옥내일반", "건물규모": "소", "관이음부속": 45, "관지지물": 40}, + {"배관": "냉온수배관", "부위": "옥내일반", "건물규모": "중", "관이음부속": 45, "관지지물": 25}, + {"배관": "냉온수배관", "부위": "옥내일반", "건물규모": "대", "관이음부속": 45, "관지지물": 25}, + {"배관": "냉각수배관", "부위": "기계실", "건물규모": "소", "관이음부속": 75, "관지지물": 7}, + {"배관": "냉각수배관", "부위": "기계실", "건물규모": "중", "관이음부속": 75, "관지지물": 7}, + {"배관": "냉각수배관", "부위": "기계실", "건물규모": "대", "관이음부속": 75, "관지지물": 7}, + {"배관": "냉각수배관", "부위": "옥내일반", "건물규모": "소", "관이음부속": 70, "관지지물": 9}, + {"배관": "냉각수배관", "부위": "옥내일반", "건물규모": "중", "관이음부속": 55, "관지지물": 9}, + {"배관": "냉각수배관", "부위": "옥내일반", "건물규모": "대", "관이음부속": 40, "관지지물": 9}, + {"배관": "증기배관", "부위": "기계실", "건물규모": "소", "관이음부속": 75, "관지지물": 30}, + {"배관": "증기배관", "부위": "기계실", "건물규모": "중", "관이음부속": 65, "관지지물": 30}, + {"배관": "증기배관", "부위": "기계실", "건물규모": "대", "관이음부속": 50, "관지지물": 30}, + {"배관": "증기배관", "부위": "옥내일반", "건물규모": "소", "관이음부속": 45, "관지지물": 30}, + {"배관": "증기배관", "부위": "옥내일반", "건물규모": "중", "관이음부속": 45, "관지지물": 30}, + {"배관": "증기배관", "부위": "옥내일반", "건물규모": "대", "관이음부속": 45, "관지지물": 30}, + {"배관": "급수·급탕배관", "부위": "기계실", "건물규모": "소", "관이음부속": 80, "관지지물": 15}, + {"배관": "급수·급탕배관", "부위": "기계실", "건물규모": "중", "관이음부속": 80, "관지지물": 15}, + {"배관": "급수·급탕배관", "부위": "기계실", "건물규모": "대", "관이음부속": 80, "관지지물": 15}, + {"배관": "급수·급탕배관", "부위": "옥내일반", "건물규모": "소", "관이음부속": 60, "관지지물": 15}, + {"배관": "급수·급탕배관", "부위": "옥내일반", "건물규모": "중", "관이음부속": 60, "관지지물": 15}, + {"배관": "급수·급탕배관", "부위": "옥내일반", "건물규모": "대", "관이음부속": 60, "관지지물": 15}, + {"배관": "보일러급유배관", "건물규모": "소", "관이음부속": 50, "관지지물": 15}, + {"배관": "보일러급유배관", "건물규모": "중", "관이음부속": 50, "관지지물": 15}, + {"배관": "보일러급유배관", "건물규모": "대", "관이음부속": 50, "관지지물": 15}, + {"배관": "통기배관", "건물규모": "소", "관이음부속": 30, "관지지물": 10}, + {"배관": "통기배관", "건물규모": "중", "관이음부속": 30, "관지지물": 10}, + {"배관": "통기배관", "건물규모": "대", "관이음부속": 30, "관지지물": 10}, + {"배관": "소화배관", "부위": "옥내소화전", "건물규모": "소", "관이음부속": 65, "관지지물": 10}, + {"배관": "소화배관", "부위": "옥내소화전", "건물규모": "중", "관이음부속": 55, "관지지물": 10}, + {"배관": "소화배관", "부위": "옥내소화전", "건물규모": "대", "관이음부속": 50, "관지지물": 10}, + {"배관": "소화배관", "부위": "스프링클러", "건물규모": "소", "관이음부속": 70, "관지지물": 15}, + {"배관": "소화배관", "부위": "스프링클러", "건물규모": "중", "관이음부속": 70, "관지지물": 15}, + {"배관": "소화배관", "부위": "스프링클러", "건물규모": "대", "관이음부속": 70, "관지지물": 15} + ], + "주": [ + "(강관금액에 대한 %)", + "① 상기요율은 일반업무용 건물의 배관재로 사용하는 일반탄소강관금액에 대한 관이음부속및 관지지물의 금액비율이다.", + "② 건물규모별 소, 중, 대는 다음과 같다. 소 : 연면적 5,000㎡이하의 건물 · 중 : 연면적 5,000㎡초과 30,000㎡미만의 건물 · 대 : 연면적 30,000㎡이상의 건물", + "③ 관이음부속류는 엘보, 티, reducer, 유니온, 소켓, 캡, 플러그, 니플, 부싱, 플랜지 등을 말한다.", + "④ 관이음부속류에는 각종 밸브장치, 증기트랩장치, By Pass관 장치 및 계량기 장치의 관이음부속과 각종 펌프토출측의 연결용 플랜지는 제외되었다.", + "⑤ 관지지물류는 클레비스행거, 보온용 클레비스행거, 파이프 클램프, 롤러행거, 행거볼트, U-볼트, 파이프 앵커, 턴버클, 나비밴드 등을 말한다.", + "⑥ 관지지물에는 단열지지대 및 관지지대가 제외되어 있으므로 별도 계상한다.", + "⑦ 증기배관의 관지지물에는 ⑥항 및 롤러, 새들, 보온재 보호판이 제외되어 있으므로 별도 계상한다.", + "⑧ 통기배관의 요율은 환상통기식이므로 각개 통기방식일 때는 별도 계상한다.", + "⑨ 상기부자재 산정요율 계산방식과 도면에 의한 물량산출 방식을 병행사용 한다." + ] + }, + { + "키": "CC000340", "원문번호": "1-2-4", "구분": "건설품셈 공통", "상세구분": "01장 적용기준", + "이름": "강관배관 부자재 산정요율 — 병원건물", + "기준": "강관금액에 대한 % — 일반 탄소 강관 기준", + "출처": "건설품셈 공통 1-2-4 6 나", + "용도": {"공종": "강관배관 부자재", "대상": ["관이음부속", "관지지물", "요율"], "로직키": []}, + "조건": {"배관": "고르기", "부위": "고르기"}, + "값칸": {"관이음부속": "%", "관지지물": "%"}, + "줄": [ + {"배관": "냉온수배관", "부위": "기계실", "관이음부속": 80, "관지지물": 50}, + {"배관": "냉온수배관", "부위": "옥내일반", "관이음부속": 40, "관지지물": 30}, + {"배관": "증기배관", "부위": "기계실", "관이음부속": 55, "관지지물": 20}, + {"배관": "급수·급탕배관", "부위": "기계실", "관이음부속": 70, "관지지물": 15}, + {"배관": "급수·급탕배관", "부위": "옥내일반", "관이음부속": 50, "관지지물": 40}, + {"배관": "통기관", "관이음부속": 30, "관지지물": 8}, + {"배관": "소화배관", "부위": "옥내소화전배관", "관이음부속": 45, "관지지물": 10}, + {"배관": "소화배관", "부위": "스프링클러배관", "관이음부속": 75, "관지지물": 20} + ], + "주": [ + "(강관금액에 대한 %)", + "① 상기 요율은 병원건물의 배관재로 사용하는 일반 탄소 강관금액에 대한 관이음부속 및 관지지물의 금액비율이다.", + "② 관이음 부속류는 엘보, 티, reducer, 유니온, 소켓, 캡, 플러그, 니플, 부싱, 플랜지 등을 말한다.", + "③ 관이음부속류에는 각종 밸브장치, 증기트랩장치, By Pass관 장치 및 계량기 장치의 관이음부속과 각종 펌프, 토출측의 연결용 플랜지는 제외되어 있다.", + "④ 관지지물에는 단열 지지대 및 공동구내 관지지대, 롤러스탠드 새들, 보온재보호판 등은 제외되어 있다.", + "⑤ 소화배관 요율에는 소화펌프의 토출측 밸브류 방진이음용 플랜지 유니온은 제외되어 있다.", + "⑥ 수직관은 2개 층마다 플랜지 또는 유니온을 적용하였다." + ] + }, { "키": "CC000001", "원문번호": "1-3-1", "구분": "건설품셈 공통", "상세구분": "01장 적용기준", "이름": "재료 할증 — 콘크리트 및 포장용 재료", From 8d3e5f82f573ab21e3e620aec4e4c9109c09321b Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:27:03 +0900 Subject: [PATCH 09/10] =?UTF-8?q?knowledge(=EB=A7=88=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=ED=99=94=EB=A9=B4):=20=ED=99=94=EB=A9=B4=20=EA=B8=80=20?= =?UTF-8?q?=EC=A0=90=EA=B2=80=20=E2=80=94=20=EC=9A=A9=EC=96=B4=20=EB=92=A4?= =?UTF-8?q?=EC=84=9E=EC=9E=84=C2=B7=EC=A3=BD=EC=9D=80=20=EA=B8=80=C2=B7?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=95=88=EB=82=B4=20=EB=B6=80=EC=A1=B1=20?= =?UTF-8?q?=EC=A0=81=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit M01 문구 파일 4개(Combo·Logic·LogicLab·LogicLab_New Text.ts)와 ui_template_locale_m1.ts 를 읽어 찾음(읽기 전용, 코드·데이터 안 고침). ① 용어 뒤섞임 — 「자재」(재료 아닌 한 자리) · 「단가산출 상세」 대 「호표」(같은 표를 화면마다 다른 말로) · 안 쓰는 M01_GroupTest 가 다른 제목으로 남음. ② API 라는 프로그래머 말이 남은 죽은 글(Edit_CopySoon). ③ 「결과단위」 붙여 쓴 한 자리(다른 곳은 「결과 단위」). ④ Pill_NoPick·Pill_NoValue 가 할 일을 안 알려 줌(다른 멈춤 글은 알려 줌). --- resources/master_data/ref/_검증_화면글.md | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 resources/master_data/ref/_검증_화면글.md diff --git a/resources/master_data/ref/_검증_화면글.md b/resources/master_data/ref/_검증_화면글.md new file mode 100644 index 00000000..7ebe361e --- /dev/null +++ b/resources/master_data/ref/_검증_화면글.md @@ -0,0 +1,37 @@ +# 화면 글 점검 — M01 마스터 화면 (2026-09-22) + +일감29 — 읽기 전용(코드 안 고침). `ui_template/ui_template_locale_m1.ts` 와 `M01_MasterData/*_Text.ts`(Combo·Logic·LogicLab·LogicLab_New) 4개, 그 밖 M01 화면 파일의 글자를 읽어 찾음. 「지금 글 → 고칠 글 · 어디」 만 적음 — 고치지 않음. + +## ① 용어 뒤섞임 + +| 지금 글 | 고칠 글 | 어디 | +|---|---|---| +| `M01_MasterData_UI_LogicLab_Text.ts` `G_material: "자재"` | `"재료"` | 로직개선시험 상세의 「인력·자재·경비」 갈래 이름 — 다른 곳은 전부 「재료」(`M01_GroupMaterial` · 호표 종류 「재료」 · 비목 「재료비」). 이 한 자리만 「자재」 | +| `M01_MasterData_UI_LogicLab_Text.ts` `Ho_Title: "단가산출 상세"` | 「호표」 또는 의도한 이름 확정 | 로직개선시험 화면의 호표 목록 제목. `M01_MasterData_UI_Logic_Text.ts` 의 같은 표(수량·단가·금액 줄)는 `Ho_Title: "호표"` — 같은 것을 화면마다 다른 말로 부름. 의도된 구분(원문 그대로 표 vs 다시 그린 상세)이면 그대로 두되 그 뜻을 아는 사람만 구분 가능 — 확정 필요 | +| `ui_template_locale_m1.ts` `M01_GroupTest: "단가산출 로직 테스트"` | 코드가 쓰는 실제 제목 「로직 개선 시험」 으로 맞추거나 죽은 글 지움 | 이 키를 쓰는 화면 코드가 없음(`M01_MasterData_UI_Side.ts` 는 로직개선시험 제목을 `Logic_Text.ts` 의 `Lab_Title`(「로직 개선 시험」)로 그림) — 안 쓰는 글이 다른 이름으로 남아 헷갈림 | + +## ② 프로그래머 말이 남은 곳 + +| 지금 글 | 고칠 글 | 어디 | +|---|---|---| +| `M01_MasterData_UI_Logic_Text.ts` `Edit_CopySoon: "복제 길(API)이 아직 없음 — 서버가 준비되면 여기서 바로 됨"` | 「아직 여기서 못 바꿈 — 곧 됨」 류로 「API」 빼기 | 로직 화면의 「본떠 만들기」 안내 글. 지금 이 키를 부르는 화면 코드가 없어(죽은 글) 당장 눈에 안 보이지만, 프로그래머 말(API)이 그대로 남아 있어 되살릴 때 그대로 나갈 위험 — 함께 `Edit_Copy`·`Edit_OwnOnly` 도 안 쓰임(로직 화면엔 「본떠 만들기」 버튼 자체가 없고, 그 기능은 로직개선시험 화면의 `Copy_Open`(같은 뜻 「본떠 만들기」)로만 있음) | + +「키」는 로직·표·자재 줄을 가리키는 이 시스템의 정식 낱말(화면·장부 문서 전체가 똑같이 씀)이라 프로그래머 말로 안 봄 — 고칠 것 아님. + +## ③ 오타·띄어쓰기·버튼 이름 불일치 + +| 지금 글 | 고칠 글 | 어디 | +|---|---|---| +| `M01_MasterData_UI_Logic_Text.ts` `Head_Unit: "결과단위"`(붙여 씀) | `"결과 단위"`(띄어 씀) | 로직 목록·상세의 「결과단위」 칸 머리글. `M01_MasterData_UI_Combo_Text.ts` `Col_Unit`·`M01_MasterData_UI_LogicLab_New_Text.ts` `ResultUnit` 은 모두 「결과 단위」(띄어 씀) — 이 한 자리만 붙여 씀 | + +그 밖 — 버튼 이름과 실제 동작을 일일이 맞대 봄(조합 「[새 조합]」↔`tc("New")`="새 조합" · 「[분석]」↔`tn("Analyze")`="분석" · 「위 고칠 곳」↔`tn("Problems")`="고칠 곳" 등) — 다 맞음, 어긋난 버튼 이름 못 찾음. 겹씀(double space)·빠진 조사도 4개 문구 파일 전수 훑어 못 찾음. + +## ④ 오류·멈춤 글이 할 일을 알려 주는지 + +- 잘 된 것 — `Logic_Text.ts` 의 `Stop_*`(멈춘 로직 안내)는 넷 다 「무엇이 비었다/여럿이다 → 무엇을 하라」 꼴(예: `Stop_NoRow`: 「넣은 값에 맞는 표 줄이 없습니다 — 값을 바꿔 보세요」). `M01_Stale`·`Combo_Text.ts Stale` 도 「무엇이 바뀜 — 다시 읽으라」 로 할 일을 알려 줌. +- 약한 것 — `LogicLab_Text.ts` `Pill_NoPick: "고르기 조건에 맞는 마스터 줄이 없음 — 단가를 못 찾음"` 은 사실만 말하고 무엇을 하라는 말이 없음(옆의 `Logic_Text.ts` `Stop_Spec`은 「위 「쓰이는 재료·기계」에서 하나를 골라 주세요」 처럼 할 일까지 적음) — 같이 맞추면 좋음. +- `Pill_NoValue: "관리자 값 미확보 — 마스터에 단가가 없음"` 도 사실만 — 「관리자가 채울 값」(엔진 오류 글이 쓰는 말) 정도로 누가 할 일인지 덧붙이면 나음. + +## 일감19·20·23 범위와 안 겹침 + +이번 점검은 화면 글(`*_Text.ts`·`ui_template_locale_m1.ts`)만 봄 — 로직 데이터·엔진 글(`master_formula.py` 의 `FormulaError` 메시지 등)은 안 봄(다른 일감 범위). From 7503c85a71eaa9b5806f1ab6802c30bbc59243e0 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 22 Sep 2026 01:28:37 +0900 Subject: [PATCH 10/10] auto: 2026-09-22 01:28 (ESD_LAPTOP) --- resources/master_data/ref/_검증_전체화면.md | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 resources/master_data/ref/_검증_전체화면.md diff --git a/resources/master_data/ref/_검증_전체화면.md b/resources/master_data/ref/_검증_전체화면.md new file mode 100644 index 00000000..1e99b08c --- /dev/null +++ b/resources/master_data/ref/_검증_전체화면.md @@ -0,0 +1,41 @@ +# 마스터 화면 전체 훑기 + +ORCA · 포트 8006/5179 · 넓은 화면 928px · 좁은 화면 390px(iframe). 고치지 않고 적기만 함. 열림 · 줄 수 · 거름 · 상세 · 뒤로 순. + +## 인력 +- 전체 378줄(8쪽). 구분 건설업 146 → 상태 공표 118(3쪽). 상세구분은 「건설업」에서 비활성(값 없음). +- 줄을 눌러도 상세로 안 넘어감(표 안에서 바로 고침) · 뒤로 갈 곳 없음 — 맞는 동작. +- 390px : 가로 넘침 0 · 표(1397px)는 안쪽 스크롤. + +## 재료 +- 자재품목 30,592(612쪽) · 유가·전력 56 · 품셈재료 363. 구분 기계·설비 606 → 상세 기계류 255. 유가·전력 유류 54 → 전국평균 3. +- 처음 펼치면 목록이 자동으로 안 열림(제목이 이전 화면 「인력 · 전체」 그대로) · 파일 줄을 눌러야 열림. 다시 펼치면 마지막 거름 복원. +- 자재품목 612쪽 — 쪽 이동만으로는 찾기 어려움(찾기 칸 필요). +- 390px : 넘침 0(재료만 스크롤폭 382 — 세로 스크롤바 8px). + +## 기계 +- 전체 654(14쪽) · 토공기계 80 → 불도저 10. 상세는 인력과 같이 표 안 고침. 390px 넘침 0(표 6628px 안쪽 스크롤). + +## 소요량 · 계수 +- 소요량 2,535(85쪽) → 산림품셈 476 → 02장 24줄 · 계수 498(17쪽) → 산림품셈 158 → 01장 59. +- 줄 클릭 → 표 상세(QF000001 · CF000001) · [← 표 목록]으로 같은 목록 복귀. 390px 넘침 0. +- 소요량 QF000001 구분이 「—」로 뜸(구분 비어 있음). + +## 환율 · 요율 +- 환율 5줄 · 요율 19줄, 거름 없음. 요율 표가 매우 넓음(7463px · 값 칸 여러 개) — 390px에서 안쪽 스크롤로만 봄. + +## 단가산출 로직 +- 1,354줄(46쪽) → 산림품셈 251 → 03장 10. 줄 → 상세(받을 값 · 호표 · 중간 값 · 덧줄 · 끝수 · 시험 계산) · [← 로직 목록] 복귀 목록 유지. 390px 넘침 0. + +## 로직 개선 시험 +- 목록·거름 같음(1,354 → 251 → 10). 상세 = 기본정보 · 단가산출 상세 · 인력 · 자재 · 경비 · 텍스트 수식 …, [← 로직 목록] 복귀. 390px 넘침 0. + +## 일위대가 조합 +- 「조합이 없음」 · 전체 0 · 구분·상세구분 비활성 — 목록·상세를 못 걸어 봄(만들기는 읽기 전용이라 안 함). 390px 넘침 0. + +## 어색한 자리 +1. 재료 처음 펼침에 목록이 안 열림. +2. 자재품목 612쪽 — 거름 없이는 못 찾음. +3. 넓은 표(요율 · 기계 · 재료)는 390px에서 안쪽 스크롤 — 열 줄이기 없음. +4. 일위대가 조합 빈 화면. +5. 시험 흔적 없음(값 안 바꿈).