From 89f8af2ad4bd5bac4da19ddf12f16e23dafde3c1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:36:31 +0900 Subject: [PATCH 1/7] =?UTF-8?q?chore(M01):=20=ED=98=84=EC=9E=A5=20?= =?UTF-8?q?=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20GX000002=20=EC=B1=84?= =?UTF-8?q?=EC=9B=80=EC=9E=AC=20=C2=B7=20GX000003=20=EB=8F=8C=EC=8C=93?= =?UTF-8?q?=EA=B8=B0=20=EB=A9=94=EC=8C=93=EA=B8=B0=20=E2=80=94=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=ED=8F=B4=EB=8D=94=20=ED=99=94=EB=A9=B4=20=ED=8E=B8?= =?UTF-8?q?=EC=A7=91(=EC=82=AC=EC=9A=A9=EC=9E=90=20=ED=8E=B8=EC=A7=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YAxqrz1iadqdygC6bE3pic --- resources/master_data/_키대장.json | 4 ++- resources/master_data/로직_자체.json | 42 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/resources/master_data/_키대장.json b/resources/master_data/_키대장.json index da881e552..bade8a4aa 100644 --- a/resources/master_data/_키대장.json +++ b/resources/master_data/_키대장.json @@ -1,5 +1,5 @@ { - "다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 30719, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 331, "CC": 341, "GC": 1140, "QC": 2060, "GX": 2, "UA": 38}, + "다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 30719, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 331, "CC": 341, "GC": 1140, "QC": 2060, "GX": 4, "UA": 38}, "폐기": {"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"}, @@ -2629,6 +2629,8 @@ "GF000329": {"원문번호": "13-11-2 타원형 돌망태", "파일": "로직_산림품셈_13장_구조물.json"}, "GF000330": {"원문번호": "13-15-1 목재 껍질벗기기", "파일": "로직_산림품셈_13장_구조물.json"}, "GX000001": {"원문번호": "13-4-1 돌쌓기 메쌓기(인력)", "파일": "로직_자체.json"}, + "GX000002": {"원문번호": "12-34-4 암거이음받침 채움재(T=20㎜)", "파일": "로직_자체.json"}, + "GX000003": {"원문번호": "13-4-1 돌쌓기 메쌓기(인력) (2)", "파일": "로직_자체.json"}, "LB000001": {"원문번호": "1001", "파일": "인력.json"}, "LB000002": {"원문번호": "1002", "파일": "인력.json"}, "LB000003": {"원문번호": "1003", "파일": "인력.json"}, diff --git a/resources/master_data/로직_자체.json b/resources/master_data/로직_자체.json index 767ef13bd..87528c301 100644 --- a/resources/master_data/로직_자체.json +++ b/resources/master_data/로직_자체.json @@ -28,6 +28,48 @@ "덧줄": [], "끝수": null, "시험입력": { "높이": 4.0, "돌": "깬잡석" } + }, + { + "키": "GX000002", + "원문번호": "12-34-4", + "구분": "자체", + "상세구분": "12장 철근콘크리트", + "이름": "암거이음받침 채움재(T=20㎜)", + "결과단위": "원/㎡", + "출처": "산림품셈 12-34-4", + "소유": "현장", + "비고": "해석: 원문 재료비 「JOINT FILLER」 뿐 — ㎡당 1㎡ · 설치 품 원문 없음 · GF000208 를 본뜸", + "입력": [], + "중간": [], + "호표": [{ "종류": "재료", "요소": { "구분": "도료·방수·접착", "상세구분": "방수·실링", "검색어": "JOINT FILLER" }, "이름": "JOINT FILLER(T=20㎜)", "단위": "㎡", "수량": "1", "비목": "재료비" }], + "덧줄": [], + "끝수": null + }, + { + "키": "GX000003", + "원문번호": "13-4-1", + "구분": "자체", + "상세구분": "13장 구조물", + "이름": "돌쌓기 메쌓기(인력)", + "결과단위": "원/㎡", + "출처": "산림품셈 13-4-1", + "소유": "현장", + "비고": "고르기 첫 값 = 원문에 있는 조합(뒷길이 25 · 깬잡석 · 골쌓기) · 「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」 · GF000219 를 본뜸", + "입력": [ + { "이름": "뒷길이", "설명": "쌓을 돌의 뒤쪽 길이", "단위": "㎝", "고르기": [25, 30, 35, 45, 55, 60, 75] }, + { "이름": "돌", "설명": "쌓을 돌 종류", "고르기": ["깬잡석", "견치돌", "깬돌", "호박돌 및 야면석"] }, + { "이름": "쌓기", "설명": "돌을 어긋나게 쌓는지 줄 맞춰 쌓는지", "고르기": ["골쌓기", "켜쌓기"] }, + { "이름": "높이", "설명": "쌓는 벽 높이", "단위": "m" }, + { "이름": "초과증가율", "설명": "기준 높이를 넘어 더 드는 품 비율", "단위": "%", "범위": [80, 100] } + ], + "중간": [{ "이름": "증가율", "식": "만약(높이 <= 3, 0, 만약(높이 <= 7.5, 찾기(QF000422, 높이=높이).증가율, 초과증가율))", "출처": "산림품셈 13-4-1 주③" }], + "호표": [ + { "종류": "인력", "요소": "LB000033", "이름": "석공", "단위": "인", "수량": "찾기(QF000421, 뒷길이=뒷길이, 돌=돌, 쌓기=쌓기).석공 * (1 + 증가율 / 100)", "비목": "노무비" }, + { "종류": "인력", "요소": "LB000002", "이름": "보통인부", "단위": "인", "수량": "찾기(QF000421, 뒷길이=뒷길이, 돌=돌, 쌓기=쌓기).보통인부 * (1 + 증가율 / 100)", "비목": "노무비" } + ], + "덧줄": [], + "끝수": null, + "시험입력": { "높이": 4.0, "돌": "깬잡석" } } ] } From 87f2d04fa7aaf05e9e97472411d0e08fad325c66 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:49:45 +0900 Subject: [PATCH 2/7] =?UTF-8?q?chore(M01):=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EA=B8=B0=20=EC=8B=9C=ED=97=98=ED=8C=90=20?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=A0=9C=EC=96=B4=20=EC=A0=90=EA=B2=80=20?= =?UTF-8?q?=E2=80=94=20=EC=8B=9C=EB=82=98=EB=A6=AC=EC=98=A4=20=EC=97=AC?= =?UTF-8?q?=EC=84=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YAxqrz1iadqdygC6bE3pic --- docs/raw/M01_쉬운단가/로직판_관계제어_점검.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/raw/M01_쉬운단가/로직판_관계제어_점검.md diff --git a/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md b/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md new file mode 100644 index 000000000..94c353e78 --- /dev/null +++ b/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md @@ -0,0 +1,63 @@ +# 35-3 점검 — 로직 만들기(시험)에서 「표끼리의 관계」를 초등학생이 제어할 수 있나 (sub6 · 확인만) + +- 대상: 내 포트 8008 · 5181 → M01 → 단가산출 로직 → 「로직 만들기(시험)」. git-sync 로 dev 최신(105 커밋)을 받은 뒤 서버를 다시 띄움. 판정 직전 세션 SYSTEM_ADMIN 확인. +- 시험 로직: 돌쌓기 메쌓기(인력) — 표준 GF000219 은 읽기만이라, 이미 있는 현장 사본 GX000001(같은 식)을 열어 메모리에서만 고침. **저장 · 복사 편집 · 삭제는 안 누름**. 끝에 「실행 취소」 10번으로 모두 되돌린 것 확인. 서버 로직 수 그대로 · git 깨끗. 덤프트럭 시간당 작업량 GF000133 · 그것을 부르는 골재운반 모래 GF000134 는 읽기만. +- 사진: `tmp/로직판_관계_사진/` (r01 표준 열기 · r02 현장 사본 · r03 문턱만 바꿈 → 금액 멈춤 · r04 표 칸까지 고침 → 할증 걸림 · r05 격자 · r06 비율 더하기 · r07 격자 칠하기 · r08 로직 부름). +- 걸음 = 고칠 화면이 열린 뒤 누름 수(칸에 글 넣기 1 번 = 1). 들어가기는 M01 → 단가산출 로직 → 로직 만들기(시험) → 로직 고름 = 3 누름. 표준이면 「복사 편집」 1 더(누르는 순간 서버에 현장 사본이 써짐 · 저장 단추를 거치지 않음). + +## 한 줄 결론 + +**이미 있는 관계의 「값 칸」을 바꾸는 일(문턱 숫자 · 할증율 · 조건을 고정값으로)은 고르기 하나 · 숫자 하나로 되고 식은 안 씀. 그러나 관계 자체를 더하고 · 지우고 · 다른 표나 다른 결과 칸으로 잇는 일은 화면에 단추가 없어 거의 안 됨.** 품셈에 없는 관계(새 입력값 · 새 조건 · 새 표)는 만들 수 없고, 「+ 비율」 한 갈래만 있음. 초등학생 판정은 바꾸기 = 중, 더하기 · 지우기 · 다시 잇기 = 불가. + +## 시나리오 표 + +| # | 할 일 | 됨 | 걸음 | 지나간 화면 | 막힌 곳 | 모를 낱말 | 식을 쓰나 | 초등 | 까닭 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| S1① | 높이 할증 문턱 3m → 2.5m | 일부 | 3 (문턱 칸 1 + 원문 표 칸 「3~4」→「2.5~4」 2) | 산출근거 ③ 계산 · 원문 표 | 문턱만 바꾸면 2.5~3m 에서 증가율 표에 맞는 줄이 없어 금액이 「—」로 멈춤. 표 칸 고침은 「미리 보기 — 저장은 결정 뒤」라 저장되는 것은 문턱뿐. 멈출 때 위 알림은 「서버와 이어지지 않음」(실제 까닭은 「표 QF000422 에 높이 2.7 인 줄이 없음」) | 조건 목록 · 「위에서 처음 맞는 줄의 값을 씀」 · 그 외 · 해당 없음 | 아니요 | 하 | 칸은 쉬우나 문턱과 표 범위가 엮인 것이 안 보이고, 깨진 뒤 까닭이 엉뚱함 | +| S1② | 높이 할증을 석공에만 · 보통인부는 빼기 | 됨(꼼수) | 1 (계산 3 율 칸 「계산 · 증가율」→「고정값」 · 0 이 저절로) | ③ 계산 | 「할증 빼기」 단추는 없음 — 율 0% 로 둠. 계산 3 은 남음 | 바탕 · 율 · 「% 를 더 얹음」 · 계산 · 증가율 | 아니요 | 중 | 문장 「표 조회 3 · 보통인부 에 계산 · 증가율 = 30 % 를 더 얹음」을 읽어야 고를 칸을 찾음 | +| S1③ | 증가율 표 대신 고정 30% | 됨(일부) | 4 (계산 2 · 3 율 칸 → 고정값 → 30 · 두 번) | ③ 계산 | 높이와 상관없이 늘 30%(3m 아래도). 「3m 넘을 때만 30%」는 계산 1 둘째 줄 「표에서 찾은 값」을 숫자로 못 바꿔 안 됨. 안 쓰게 된 계산 1 · 표 조회 1 을 지울 길 없음 | 고정값 · 율 | 아니요 | 중 | 율 칸 둘을 따로 바꿔야 함을 스스로 알아야 함 | +| S2① | 조건 칸 「돌」 입력값 → 고정 「깬돌」 | 됨 | 4 (표 조회 2 「돌」 고르기 → 고정값 → 「깬돌」 글 · 표 조회 3 에 또) | ② 표 조회 | 같은 표를 석공 · 보통인부 두 번 조회 — 한쪽만 바꾸면 석공은 깬돌 · 보통인부는 깬잡석 품으로 섞여 계산됨(실측 121,863원 · 경고 없음). 예시값 뒷길이 25 에는 깬돌 줄이 없어 「—」. 원문 표 칸 역할 알약도 「고정」으로 바뀌지만 어느 조회 것인지 안 보임 | 표 조회 · 무관(조건에서 뺌) · 고정값 | 아니요(글 「깬돌」은 손으로 적음) | 중 | 고르기는 쉬우나 같은 조건이 두 곳에 있음 · 오타면 해당 없음 | +| S2② | 쓰는 표 바꾸기(메쌓기 → 찰쌓기 표) | 안 됨 | — | ② 표 조회 | 표 이름은 글자 조각 — 누를 곳 없음. 바꾸는 함수(`setLookupTable` · `M01_LB_Blocks.ts:627`)는 있으나 화면에 안 붙음 | — | — | 불가 | 화면에 길 없음 | +| S2③ | 결과 칸 바꾸기(석공 → 보통인부 칸) | 안 됨(꼼수 하나) | 원문 칸 알약 1 → 「결과 칸 바꾸기는 아직 안 됨」 | 원문 · ② 표 조회 | 「인 줄의 석공」은 글자 조각. 알약은 조건 → 고정 → 결과로 돌고, 결과 칸을 조건으로 돌리면 「「석공」 을(를) 조건으로 쓰려면 같은 이름 입력값이 있어야 함」. 꼼수: 계산 2 바탕을 「표 조회 3 · 보통인부」로 고르면 석공 줄이 보통인부 품을 씀(고르기 목록에 있음 · 실측 안 함) | 결과 · 바탕 | 아니요 | 불가 | 표 조회의 결과 칸을 고르는 곳이 없음 | +| S3① | 새 입력값 「경사」(완 / 급) · 「급이면 석공 품 10% 더함」 | 안 됨 | — | ① 입력값 · ③ 계산 | 입력값 더하기 · 지우기 단추 없음(① 은 단위 · 범위만 고침 · 선택 목록 낱말도 못 고침). 계산 더하기 없음. 단계 안내(새로 만들기)에서만 숫자 입력값을 「입력값으로 받음」으로 만들 수 있음 — 선택(완/급) 꼴 아님 · 모든 결과 칸에 같이 걸림 | — | — | 불가 | 화면에 길 없음 | +| S3② | 품셈에 없는 작은 표 만들어 잇기 | 안 됨 | — | 원문 | 표 만들기 화면 없음(이 판 · 옛 M01 표 화면 모두). 원문 표 칸 고침은 미리 보기만 · 줄 더하기도 없음 | — | — | 불가 | 표는 품셈 원문에서만 옴 | +| S3③ | 새 항목 「잡재료 = 노무비의 2%」 | 일부 | 2 (「+ 비율」 · 2 입력 · 바탕 노무비는 기본) | ④ 항목 연결 | 2,437원 더해짐. 그러나 이름 칸 없음(일위대가표에 이름 빈 「1 식」) · 넣을 자리 고르기 없음 → 경비로 들어감(잡재료는 재료비여야). 단계 안내에서는 이름 · 넣을 자리 있음 | 비율 · 노무 줄의 합 | 아니요 | 중 | 덧붙임 한 갈래만 · 이름 · 자리 못 정함 | +| S4 | 관계 지우기(할증 · 표 조회 · 입력값) | 안 됨 | — | ② ③ ① | 할증 · 표 조회 · 입력값 · 계산 모두 지움 단추 없음(할증은 율 0 꼼수). 항목 「지움」은 1 누름 · 안 물음 — 보통인부를 지워도 그 줄이 쓰던 표 조회 3 · 계산 3 이 화면에 남고 알림 없음. 「실행 취소」 10번으로 표 칸 고침까지 다 되돌아옴(확인) · 로직 삭제는 쓰는 곳 검사 뒤 물음 | — | 아니요 | 불가 (항목만 상) | 관계를 지우는 길이 없음 | +| S5 | 관계 한눈에 보기 | 일부 | 0 (보기 바꿈 1) | 문장 · 격자 · 원문 | **문장 보기**: ① → ⑤ 차례 · 「표 조회 2 메쌓기(인력) 에서 뒷길이 이 입력값 · 뒷길이 … 인 줄의 석공」 → 「계산 2 석공 수량 표 조회 2 · 석공 에 계산 · 증가율 = 30 % 를 더 얹음」 → 「【노무】 석공 이 계산 2 = 0.195 인 = 52,437 원」 — 번호를 거꾸로 따라가면 길이 보이나 선 · 화살표 없음. **격자 보기**: 줄을 누르면 그 줄이 쓰는 줄 하나만 칠함(석공 → 계산 2 · 표 조회 · 입력값까지 안 이어짐) · 값 칸이 오른쪽에 잘려 고정값(30 · 깬돌)이 안 보임 · 표 이름 대신 QF000421. **원문**: 「이 표를 쓰는 로직 1 개」 · 주③ 「계산에 쓰임」 · 칸 역할 알약 | 표 조회 1 · 2 · 3 번호 · 바탕 · QF 번호 | 아니요 | 중 | 읽을 수는 있으나 한 장 그림이 아님 | +| S6 | 로직끼리 관계(작업량 로직 → 받는 로직) | 보기 일부 · 바꾸기 안 됨 | 0 | 산출근거 | 골재운반 모래(GF000134) 에 「계산 1 작업량 = 60 · 골재운반 덤프트럭 시간당 작업량」 글자만. 넘기는 값(qt=qt · f=f · E=E · Cm=Cm) 안 보임 · 눌러서 그 로직 열기 없음 · 고르기 목록에 「다른 로직」 없음. GF000133 쪽에 「이 로직을 쓰는 로직」 목록 없음(표에만 있음 · 실제는 GF000134 · 135 · 136 셋). 계산 2 문장이 「1 = 1 ÷ 작업량 = 60」으로 읽기 어색 | qt · f · E · Cm(기호 그대로) | 아니요 | 하 | 보이기만 하고 따라가기 · 바꾸기 길 없음 | + +## 안 되는 것이 왜 안 되나 (코드 근거) + +1. 블록 모형이 「있는 관계 고치기」 세 함수뿐 — `setCond`(조건 칸 출처) · `setLookupTable`(쓰는 표 · 화면에 안 붙음) · `setCalc`(계산 조각 · 틀) — `M01_LB_Blocks.ts:604-645`. 표 조회 · 계산 · 입력값을 **더하거나 지우는 함수가 없음**. 고침은 원래 식 글의 그 자리만 갈아끼우는 방식이라 새 자리를 만들 수 없음. +2. 화면 쪽도 같은 범위 — 문장 보기는 항목 카드만 더하기 · 지우기(`M01_LB_Steps.ts:172` `addCard` · `:249` `removeCard`) · 격자 보기는 `setCond` · `setCalc` 만(`M01_LB_Grid.ts:369-412`) · 계산 틀(할증 → 값 등)은 못 바꿈. +3. 값 고르기 목록 = 입력값 · 표 조회 · 다른 계산 · 고정값(숫자)만(`M01_LB_Steps_Cell.ts:235-275`). 「다른 로직」 · 「글 고정값」은 목록에 없어 로직 부름 줄은 글자 조각으로만 보임. +4. 표 조회의 결과 칸 바꾸기는 「아직 안 됨」으로 막아 둠(`M01_LB_Entry.ts:86` · `:437`). +5. 표 칸 고침은 정함 5대로 메모리 사본 · 저장 안 함 — 그래서 S1① 처럼 관계와 표 범위를 함께 바꿔야 하는 일은 저장 뒤 깨짐. +6. 새 입력값 · 새 표 · 조건 「급이면」 같은 품셈에 없는 관계는 단계 안내(새로 만들기)에만 일부(숫자 입력값 · 품셈 절의 다른 표로 할증 조건 목록) — 고치는 화면에는 길이 없음. +7. 「+ 비율」 카드에는 이름 · 넣을 자리 칸이 없음(단계 안내의 덧줄은 있음) — 같은 뜻의 두 길이 서로 다름. + +## 지금 화면(옛 단가산출)에서는 + +공통: 표준 로직은 못 고침 → 「본떠 만들기」로 자체 사본을 만든 뒤 편집기에서 식 글을 고침(34-1B 실측 + 코드). 거의 다 되지만 모두 **식을 써야 함 → 초등 하**. + +| # | 옛 화면 | 어떻게 | +| --- | --- | --- | +| S1① | 됨 · 식 | 중간 값 식 `만약(높이 <= 3, 0, …)` 의 3 → 2.5 (표 범위 문제는 같음) | +| S1② | 됨 · 식 | 보통인부 수량 식 끝 `* (1 + 증가율 / 100)` 지움 | +| S1③ | 됨 · 식 | 수량 식을 `… * 1.3` 으로 · 또는 중간 값 증가율 = 30 | +| S2① | 됨 · 식 | `찾기(QF000421, …, 돌=돌, …)` → `돌='깬돌'` (두 줄 다) | +| S2② | 됨 · 식 | 식 안 QF 번호 고침 · 또는 「표」 단추(수량 칸을 통째로 바꿈) | +| S2③ | 됨 · 식 | 식 끝 `.석공` → `.보통인부` | +| S3① | 됨 · 식 | 설계에서 받을 값 「줄 추가」(이름 경사 · 고르기 「완, 급」) + 수량 식에 `* 만약(경사 == '급', 1.1, 1)` | +| S3② | 안 됨 | 표 만들기 없음 · `만약` 식으로 흉내만 | +| S3③ | 됨 · 식 조금 | 덧줄 「줄 추가」 · 이름 잡재료 · 식 `노무비 * 0.02` · 비목 재료비 | +| S4 | 됨 · 안 물음 | 칸마다 × — 쓰는 곳 검사 없음 · 저장 때 엔진 검사(422)로만 걸림 | +| S5 | 일부 | 텍스트 수식(이름 식 · 값 식 두 칸) · 알약 누르면 표 창 | +| S6 | 됨 · 식 | 중간 값 `로직(GF000133, qt=qt, f=f, E=E, Cm=Cm)` 글 고침 · 알약 「로직」 누르면 그 로직을 엶 | + +## 덧붙여 본 것 + +- 계산이 멈추면 위 알림이 「서버와 이어지지 않음 — 잠시 뒤 다시 해 주세요」 — 서버는 `ok:true` 와 줄마다 까닭(「표 QF000422(13-4-1)에 높이 2.7 인 줄이 없음」)을 줌. 원문 표 위의 「해당 없음 — 예시값에 맞는 줄이 없음」만 맞는 말. +- 칸 고침은 글을 넣고 칸을 떠나야(Enter · 다른 곳 누름) 반영됨. +- 고친 뒤 처음 값으로 다 되돌리면 「닫기」가 묻지 않고 닫힘(맞는 동작) · 「저장 안 함」 표시는 그대로 남아 있었음. +- 원문 칸 역할 알약은 조건 → 고정 → 결과로 돌기만 하고 무엇이 바뀌는지 미리 말하지 않음. From 89220e3d3fee10c54ec1465fdf0fa8e335a64879 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:57:09 +0900 Subject: [PATCH 3/7] =?UTF-8?q?chore(M01):=20=EC=8B=9C=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=8B=9C=ED=97=98=ED=8C=90=20=EC=A0=95?= =?UTF-8?q?=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01YAxqrz1iadqdygC6bE3pic --- docs/raw/M01_쉬운단가/시트로직_정함.md | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/raw/M01_쉬운단가/시트로직_정함.md diff --git a/docs/raw/M01_쉬운단가/시트로직_정함.md b/docs/raw/M01_쉬운단가/시트로직_정함.md new file mode 100644 index 000000000..a3f21d53f --- /dev/null +++ b/docs/raw/M01_쉬운단가/시트로직_정함.md @@ -0,0 +1,38 @@ +# 시트 로직 시험판 — 정함 (PLAN 35-5 · 브레인 · 10-01 오후) + +사용자 허락(그대로): 「일단 이해한대로 시험판을 만들어보자. 완전히 새로운 품셈을 사용자가 만들려면 기존에 있는 정보를 가져올수도 있지만 새로 만들기도 되어야하면 그럴려면 저장이 되어야할것같아. 일단은 시험판이니까 임시폴더 내부에 저장하고 이상하면 한번에 삭제하는거야.」 +제안서 = https://claude.ai/artifact/4iCAGPhE9maauGNTkXg5he · 근거 = 같은 폴더 `로직판_관계제어_점검.md`(지금 시험판은 관계 더하기 · 지우기 · 다시 잇기 · 새 표가 안 됨) · `로직판_엑셀로직_지도.md` 2 · 3절(우리 스프레드시트 엔진 · 서버 Node 다시 셈). + +## 목적 + +사용자가 코딩 · 브레인 없이, 품셈에 묶이지 않고 단가산출 로직을 새로 만들고 · 기존 정보(품셈 표 · 노임 · 자재 · 장비 · 기존 로직)를 가져오고 · 관계를 더하고 · 바꾸고 · 지움. 관계 = 진짜 엑셀 수식 · 입출력 칸 = 알약. + +## 정함 + +1. **로직 한 벌 = 통합문서 하나**(우리 스프레드시트 Workbook) · **상자 하나 = 시트 하나** · **알약 = 이름 붙은 칸**(입력 알약 · 출력 알약). +2. **선 = 입력 알약 칸에 다른 시트 칸 참조 수식을 저절로 씀**(`='표 · 메쌓기'!E7`) — 엔진이 시트 사이 참조를 이미 셈 · 선을 지우면 그 수식을 지움 · 순환은 엔진 `#CYCLE!` + 그을 때 막음. +3. 상자 종류 — 입력값 · 고정값 · 표 · 계산 · 항목 · 다른 로직 · 결과. 모든 상자 아래 판은 같은 시트 편집기 + 종류별 손잡이. +4. **바깥 값 넣기** — 품셈 표 줄 · 노임 · 자재 · 장비 단가 · 기존 로직 결과는 시트에 「바깥 값」 칸으로 넣음: 화면은 열 때 API 로 받아 넣고, 저장 때 서버가 마스터에서 다시 넣은 뒤 셈(브라우저 값 안 받아 적음). 품셈 표는 사본으로 들고 있지 않음(열 때 · 저장 때 마스터에서 새로). +5. **계산 = 우리 스프레드시트 엔진 한 벌** — 화면은 브라우저, 저장은 서버가 같은 TS 엔진을 Node 로(`common_util/common_util_spreadsheet.py` 길 · 계산 자리 ②). 지금 로직 1,469개(파이썬 엔진)는 안 건드림. +6. **저장 = 임시 폴더** `M01_MasterData/SheetLogic/_data/` (폴더 안 `.gitignore` 로 git 밖) · 키 = `SL-0001` 꼴(자체 번호 · `_키대장.json` 안 씀) · 사용자 표도 여기. 폴더 `SheetLogic/` 를 지우면 코드 · 자료가 한 번에 사라짐. +7. **폴더 밖** — 단추 한 곳(LogicLab.ts 가져오기 한 줄 + 부르기 한 줄 · 「로직 만들기(시험)」 옆 「시트 로직(시험)」) · 서버 등록 한 줄(main.py). 기존 서버 · 엔진 · 마스터 파일 · EasyCalc · LogicBuilder 파일은 안 고침(가져다 쓰기만). +8. **화면** — 위 가로 다이어그램 띠(입력값 → 표 → 계산 → 항목 → 결과 · 단계마다 세로 쌓기 · 자리는 저절로 · 상자 양옆에 입력 · 출력 알약 · 출력 알약을 끌어 입력 자리에 놓으면 선) · 아래 왼쪽 = 고른 상자의 시트 판 · 아래 오른쪽 = 결과(합계 · 노무비 · 재료비 · 경비 · 일위대가표 · 예시값). +9. **가져오기** — 기존 로직을 시트 로직으로 바꿔 가져옴(LogicBuilder Blocks 로 읽고 엑셀 수식으로: 만약 → IF · 최소/최대 → MIN/MAX · 올림/버림/반올림 → ROUNDUP/ROUNDDOWN/ROUND · 표 찾기 → 표 상자 + XLOOKUP 또는 INDEX/MATCH) · 시험 로직 6개(GF000208 · GF000219 · GF000025 · GF000249 · GF000133 · GC000051)는 바꾼 값 = 지금 /calc 값이어야 함. +10. **용어** — 시트 로직 · 상자 · 선 · 입력 알약 · 출력 알약 · 입력값 · 고정값 · 표 · 계산 · 항목(노무 · 재료 · 장비 · 일위대가 · 비율) · 다른 로직 · 결과 · 예시값 · 품셈 표 / 내 표 · 노무비 · 재료비 · 경비. + +## 파일 · 창 (모두 `M01_MasterData/SheetLogic/` · 파일마다 700줄 안) + +| 파일 | 창 | 하는 일 | +| --- | --- | --- | +| `M01_SL_Model.ts` · `M01_SL_Eval.ts` | sub7 | 타입(먼저 올림) · 상자 더하기 / 지우기(시트 만들기 · 지우기) · 선 잇기 / 끊기(참조 수식 쓰기 · 지우기) · 알약 정하기 · 검사(순환 · 빈 입력) · 화면 계산(바깥 값 넣기 → 엔진 → 출력 알약 · 결과 읽기) | +| `M01_SL_Router.py` · `M01_SL_Api.ts` · `.gitignore` | sub4 | `_data` 목록 · 열기 · 저장 · 지우기 · 저장 때 바깥 값 다시 넣고 Node 로 셈 · 바깥 값 한 번에 받기(표 · 노임 · 자재 · 장비 · 기존 로직 결과) · 등록 한 줄 | +| `M01_SL_Diagram.ts` + css | sub8 | 위 가로 띠 · 상자 · 알약 · 선(끌어 잇기 · 고르기 · 지우기) · 「+」 상자 더하기 · 이어진 선 진하게 | +| `M01_SL_Panel.ts` + css | sub2 | 아래 시트 판(우리 스프레드시트 편집기 넣기) · 칸 → 입력 / 출력 알약 정하기 · 칸 위 알약 표시 · 틀 단추(할증 · 나누기 · 만약 · 표에서 찾기 — 진짜 수식을 넣어 줌) | +| `M01_SL_Table.ts` + css | sub3 | 표 상자 손잡이 — 품셈 표 고르기(절 · 이름 찾기) → 시트에 넣기 · 내 표(빈 표 · 엑셀 붙여넣기) · 조건 칸 / 결과 칸 알약 · 「표에서 찾기」 수식 돕기 | +| `M01_SL_Item.ts` · `M01_SL_Result.ts` + css | sub5 | 항목 상자 손잡이(노무 · 재료 · 장비 · 일위대가 고르기 → 단가 바깥 값 · 수량 알약 · 노무비 / 재료비 / 경비 출력) · 결과 칸(합계 · 비목 · 일위대가표 · 예시값) | +| `M01_SL_Import.ts` | sub6 | 기존 로직 → 시트 로직(정함 9) · 6개 같은 값 시험 | +| `M01_SL_Entry.ts` + css | sub1 | 단추 · 큰 창 · 시작 화면(내 시트 로직 · 새로 · 기존 로직 가져오기) · 세 칸 틀 · 저장 · 지우기 · 실행 취소 · 저장 안 함 물음 · 잇기 · 끝 검증 | + +## 끝 검증 (sub1 · 사용자처럼) + +관계 제어 점검 여섯이 모두 되어야 함 — S1 할증 문턱 · 석공에만 · 고정 30% · S2 조건을 고정값으로 · 쓰는 표 바꾸기 · 결과 칸 바꾸기 · S3 새 입력값 「경사」 + 「급이면 10%」 · 내 표 만들어 잇기 · 새 항목 · S4 관계 지우기 · S5 한눈에 보기 · S6 로직끼리 잇기 + 완전히 새 로직 하나(품셈 없이) 만들어 저장 → 다시 열기 → 지우기 · 기존 로직 6개 가져와 값 같음 · 저장 때 서버 값 = 화면 값. From cb093eb21a5afbf40a1b3f55e31549155b7eba26 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:58:11 +0900 Subject: [PATCH 4/7] auto: 2026-10-01 12:58 (ESD_LAPTOP) --- docs/raw/M01_쉬운단가/로직판_관계제어_점검.md | 63 +++++++++++++++++++ docs/raw/M01_쉬운단가/시트로직_정함.md | 38 +++++++++++ 2 files changed, 101 insertions(+) create mode 100644 docs/raw/M01_쉬운단가/로직판_관계제어_점검.md create mode 100644 docs/raw/M01_쉬운단가/시트로직_정함.md diff --git a/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md b/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md new file mode 100644 index 000000000..94c353e78 --- /dev/null +++ b/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md @@ -0,0 +1,63 @@ +# 35-3 점검 — 로직 만들기(시험)에서 「표끼리의 관계」를 초등학생이 제어할 수 있나 (sub6 · 확인만) + +- 대상: 내 포트 8008 · 5181 → M01 → 단가산출 로직 → 「로직 만들기(시험)」. git-sync 로 dev 최신(105 커밋)을 받은 뒤 서버를 다시 띄움. 판정 직전 세션 SYSTEM_ADMIN 확인. +- 시험 로직: 돌쌓기 메쌓기(인력) — 표준 GF000219 은 읽기만이라, 이미 있는 현장 사본 GX000001(같은 식)을 열어 메모리에서만 고침. **저장 · 복사 편집 · 삭제는 안 누름**. 끝에 「실행 취소」 10번으로 모두 되돌린 것 확인. 서버 로직 수 그대로 · git 깨끗. 덤프트럭 시간당 작업량 GF000133 · 그것을 부르는 골재운반 모래 GF000134 는 읽기만. +- 사진: `tmp/로직판_관계_사진/` (r01 표준 열기 · r02 현장 사본 · r03 문턱만 바꿈 → 금액 멈춤 · r04 표 칸까지 고침 → 할증 걸림 · r05 격자 · r06 비율 더하기 · r07 격자 칠하기 · r08 로직 부름). +- 걸음 = 고칠 화면이 열린 뒤 누름 수(칸에 글 넣기 1 번 = 1). 들어가기는 M01 → 단가산출 로직 → 로직 만들기(시험) → 로직 고름 = 3 누름. 표준이면 「복사 편집」 1 더(누르는 순간 서버에 현장 사본이 써짐 · 저장 단추를 거치지 않음). + +## 한 줄 결론 + +**이미 있는 관계의 「값 칸」을 바꾸는 일(문턱 숫자 · 할증율 · 조건을 고정값으로)은 고르기 하나 · 숫자 하나로 되고 식은 안 씀. 그러나 관계 자체를 더하고 · 지우고 · 다른 표나 다른 결과 칸으로 잇는 일은 화면에 단추가 없어 거의 안 됨.** 품셈에 없는 관계(새 입력값 · 새 조건 · 새 표)는 만들 수 없고, 「+ 비율」 한 갈래만 있음. 초등학생 판정은 바꾸기 = 중, 더하기 · 지우기 · 다시 잇기 = 불가. + +## 시나리오 표 + +| # | 할 일 | 됨 | 걸음 | 지나간 화면 | 막힌 곳 | 모를 낱말 | 식을 쓰나 | 초등 | 까닭 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| S1① | 높이 할증 문턱 3m → 2.5m | 일부 | 3 (문턱 칸 1 + 원문 표 칸 「3~4」→「2.5~4」 2) | 산출근거 ③ 계산 · 원문 표 | 문턱만 바꾸면 2.5~3m 에서 증가율 표에 맞는 줄이 없어 금액이 「—」로 멈춤. 표 칸 고침은 「미리 보기 — 저장은 결정 뒤」라 저장되는 것은 문턱뿐. 멈출 때 위 알림은 「서버와 이어지지 않음」(실제 까닭은 「표 QF000422 에 높이 2.7 인 줄이 없음」) | 조건 목록 · 「위에서 처음 맞는 줄의 값을 씀」 · 그 외 · 해당 없음 | 아니요 | 하 | 칸은 쉬우나 문턱과 표 범위가 엮인 것이 안 보이고, 깨진 뒤 까닭이 엉뚱함 | +| S1② | 높이 할증을 석공에만 · 보통인부는 빼기 | 됨(꼼수) | 1 (계산 3 율 칸 「계산 · 증가율」→「고정값」 · 0 이 저절로) | ③ 계산 | 「할증 빼기」 단추는 없음 — 율 0% 로 둠. 계산 3 은 남음 | 바탕 · 율 · 「% 를 더 얹음」 · 계산 · 증가율 | 아니요 | 중 | 문장 「표 조회 3 · 보통인부 에 계산 · 증가율 = 30 % 를 더 얹음」을 읽어야 고를 칸을 찾음 | +| S1③ | 증가율 표 대신 고정 30% | 됨(일부) | 4 (계산 2 · 3 율 칸 → 고정값 → 30 · 두 번) | ③ 계산 | 높이와 상관없이 늘 30%(3m 아래도). 「3m 넘을 때만 30%」는 계산 1 둘째 줄 「표에서 찾은 값」을 숫자로 못 바꿔 안 됨. 안 쓰게 된 계산 1 · 표 조회 1 을 지울 길 없음 | 고정값 · 율 | 아니요 | 중 | 율 칸 둘을 따로 바꿔야 함을 스스로 알아야 함 | +| S2① | 조건 칸 「돌」 입력값 → 고정 「깬돌」 | 됨 | 4 (표 조회 2 「돌」 고르기 → 고정값 → 「깬돌」 글 · 표 조회 3 에 또) | ② 표 조회 | 같은 표를 석공 · 보통인부 두 번 조회 — 한쪽만 바꾸면 석공은 깬돌 · 보통인부는 깬잡석 품으로 섞여 계산됨(실측 121,863원 · 경고 없음). 예시값 뒷길이 25 에는 깬돌 줄이 없어 「—」. 원문 표 칸 역할 알약도 「고정」으로 바뀌지만 어느 조회 것인지 안 보임 | 표 조회 · 무관(조건에서 뺌) · 고정값 | 아니요(글 「깬돌」은 손으로 적음) | 중 | 고르기는 쉬우나 같은 조건이 두 곳에 있음 · 오타면 해당 없음 | +| S2② | 쓰는 표 바꾸기(메쌓기 → 찰쌓기 표) | 안 됨 | — | ② 표 조회 | 표 이름은 글자 조각 — 누를 곳 없음. 바꾸는 함수(`setLookupTable` · `M01_LB_Blocks.ts:627`)는 있으나 화면에 안 붙음 | — | — | 불가 | 화면에 길 없음 | +| S2③ | 결과 칸 바꾸기(석공 → 보통인부 칸) | 안 됨(꼼수 하나) | 원문 칸 알약 1 → 「결과 칸 바꾸기는 아직 안 됨」 | 원문 · ② 표 조회 | 「인 줄의 석공」은 글자 조각. 알약은 조건 → 고정 → 결과로 돌고, 결과 칸을 조건으로 돌리면 「「석공」 을(를) 조건으로 쓰려면 같은 이름 입력값이 있어야 함」. 꼼수: 계산 2 바탕을 「표 조회 3 · 보통인부」로 고르면 석공 줄이 보통인부 품을 씀(고르기 목록에 있음 · 실측 안 함) | 결과 · 바탕 | 아니요 | 불가 | 표 조회의 결과 칸을 고르는 곳이 없음 | +| S3① | 새 입력값 「경사」(완 / 급) · 「급이면 석공 품 10% 더함」 | 안 됨 | — | ① 입력값 · ③ 계산 | 입력값 더하기 · 지우기 단추 없음(① 은 단위 · 범위만 고침 · 선택 목록 낱말도 못 고침). 계산 더하기 없음. 단계 안내(새로 만들기)에서만 숫자 입력값을 「입력값으로 받음」으로 만들 수 있음 — 선택(완/급) 꼴 아님 · 모든 결과 칸에 같이 걸림 | — | — | 불가 | 화면에 길 없음 | +| S3② | 품셈에 없는 작은 표 만들어 잇기 | 안 됨 | — | 원문 | 표 만들기 화면 없음(이 판 · 옛 M01 표 화면 모두). 원문 표 칸 고침은 미리 보기만 · 줄 더하기도 없음 | — | — | 불가 | 표는 품셈 원문에서만 옴 | +| S3③ | 새 항목 「잡재료 = 노무비의 2%」 | 일부 | 2 (「+ 비율」 · 2 입력 · 바탕 노무비는 기본) | ④ 항목 연결 | 2,437원 더해짐. 그러나 이름 칸 없음(일위대가표에 이름 빈 「1 식」) · 넣을 자리 고르기 없음 → 경비로 들어감(잡재료는 재료비여야). 단계 안내에서는 이름 · 넣을 자리 있음 | 비율 · 노무 줄의 합 | 아니요 | 중 | 덧붙임 한 갈래만 · 이름 · 자리 못 정함 | +| S4 | 관계 지우기(할증 · 표 조회 · 입력값) | 안 됨 | — | ② ③ ① | 할증 · 표 조회 · 입력값 · 계산 모두 지움 단추 없음(할증은 율 0 꼼수). 항목 「지움」은 1 누름 · 안 물음 — 보통인부를 지워도 그 줄이 쓰던 표 조회 3 · 계산 3 이 화면에 남고 알림 없음. 「실행 취소」 10번으로 표 칸 고침까지 다 되돌아옴(확인) · 로직 삭제는 쓰는 곳 검사 뒤 물음 | — | 아니요 | 불가 (항목만 상) | 관계를 지우는 길이 없음 | +| S5 | 관계 한눈에 보기 | 일부 | 0 (보기 바꿈 1) | 문장 · 격자 · 원문 | **문장 보기**: ① → ⑤ 차례 · 「표 조회 2 메쌓기(인력) 에서 뒷길이 이 입력값 · 뒷길이 … 인 줄의 석공」 → 「계산 2 석공 수량 표 조회 2 · 석공 에 계산 · 증가율 = 30 % 를 더 얹음」 → 「【노무】 석공 이 계산 2 = 0.195 인 = 52,437 원」 — 번호를 거꾸로 따라가면 길이 보이나 선 · 화살표 없음. **격자 보기**: 줄을 누르면 그 줄이 쓰는 줄 하나만 칠함(석공 → 계산 2 · 표 조회 · 입력값까지 안 이어짐) · 값 칸이 오른쪽에 잘려 고정값(30 · 깬돌)이 안 보임 · 표 이름 대신 QF000421. **원문**: 「이 표를 쓰는 로직 1 개」 · 주③ 「계산에 쓰임」 · 칸 역할 알약 | 표 조회 1 · 2 · 3 번호 · 바탕 · QF 번호 | 아니요 | 중 | 읽을 수는 있으나 한 장 그림이 아님 | +| S6 | 로직끼리 관계(작업량 로직 → 받는 로직) | 보기 일부 · 바꾸기 안 됨 | 0 | 산출근거 | 골재운반 모래(GF000134) 에 「계산 1 작업량 = 60 · 골재운반 덤프트럭 시간당 작업량」 글자만. 넘기는 값(qt=qt · f=f · E=E · Cm=Cm) 안 보임 · 눌러서 그 로직 열기 없음 · 고르기 목록에 「다른 로직」 없음. GF000133 쪽에 「이 로직을 쓰는 로직」 목록 없음(표에만 있음 · 실제는 GF000134 · 135 · 136 셋). 계산 2 문장이 「1 = 1 ÷ 작업량 = 60」으로 읽기 어색 | qt · f · E · Cm(기호 그대로) | 아니요 | 하 | 보이기만 하고 따라가기 · 바꾸기 길 없음 | + +## 안 되는 것이 왜 안 되나 (코드 근거) + +1. 블록 모형이 「있는 관계 고치기」 세 함수뿐 — `setCond`(조건 칸 출처) · `setLookupTable`(쓰는 표 · 화면에 안 붙음) · `setCalc`(계산 조각 · 틀) — `M01_LB_Blocks.ts:604-645`. 표 조회 · 계산 · 입력값을 **더하거나 지우는 함수가 없음**. 고침은 원래 식 글의 그 자리만 갈아끼우는 방식이라 새 자리를 만들 수 없음. +2. 화면 쪽도 같은 범위 — 문장 보기는 항목 카드만 더하기 · 지우기(`M01_LB_Steps.ts:172` `addCard` · `:249` `removeCard`) · 격자 보기는 `setCond` · `setCalc` 만(`M01_LB_Grid.ts:369-412`) · 계산 틀(할증 → 값 등)은 못 바꿈. +3. 값 고르기 목록 = 입력값 · 표 조회 · 다른 계산 · 고정값(숫자)만(`M01_LB_Steps_Cell.ts:235-275`). 「다른 로직」 · 「글 고정값」은 목록에 없어 로직 부름 줄은 글자 조각으로만 보임. +4. 표 조회의 결과 칸 바꾸기는 「아직 안 됨」으로 막아 둠(`M01_LB_Entry.ts:86` · `:437`). +5. 표 칸 고침은 정함 5대로 메모리 사본 · 저장 안 함 — 그래서 S1① 처럼 관계와 표 범위를 함께 바꿔야 하는 일은 저장 뒤 깨짐. +6. 새 입력값 · 새 표 · 조건 「급이면」 같은 품셈에 없는 관계는 단계 안내(새로 만들기)에만 일부(숫자 입력값 · 품셈 절의 다른 표로 할증 조건 목록) — 고치는 화면에는 길이 없음. +7. 「+ 비율」 카드에는 이름 · 넣을 자리 칸이 없음(단계 안내의 덧줄은 있음) — 같은 뜻의 두 길이 서로 다름. + +## 지금 화면(옛 단가산출)에서는 + +공통: 표준 로직은 못 고침 → 「본떠 만들기」로 자체 사본을 만든 뒤 편집기에서 식 글을 고침(34-1B 실측 + 코드). 거의 다 되지만 모두 **식을 써야 함 → 초등 하**. + +| # | 옛 화면 | 어떻게 | +| --- | --- | --- | +| S1① | 됨 · 식 | 중간 값 식 `만약(높이 <= 3, 0, …)` 의 3 → 2.5 (표 범위 문제는 같음) | +| S1② | 됨 · 식 | 보통인부 수량 식 끝 `* (1 + 증가율 / 100)` 지움 | +| S1③ | 됨 · 식 | 수량 식을 `… * 1.3` 으로 · 또는 중간 값 증가율 = 30 | +| S2① | 됨 · 식 | `찾기(QF000421, …, 돌=돌, …)` → `돌='깬돌'` (두 줄 다) | +| S2② | 됨 · 식 | 식 안 QF 번호 고침 · 또는 「표」 단추(수량 칸을 통째로 바꿈) | +| S2③ | 됨 · 식 | 식 끝 `.석공` → `.보통인부` | +| S3① | 됨 · 식 | 설계에서 받을 값 「줄 추가」(이름 경사 · 고르기 「완, 급」) + 수량 식에 `* 만약(경사 == '급', 1.1, 1)` | +| S3② | 안 됨 | 표 만들기 없음 · `만약` 식으로 흉내만 | +| S3③ | 됨 · 식 조금 | 덧줄 「줄 추가」 · 이름 잡재료 · 식 `노무비 * 0.02` · 비목 재료비 | +| S4 | 됨 · 안 물음 | 칸마다 × — 쓰는 곳 검사 없음 · 저장 때 엔진 검사(422)로만 걸림 | +| S5 | 일부 | 텍스트 수식(이름 식 · 값 식 두 칸) · 알약 누르면 표 창 | +| S6 | 됨 · 식 | 중간 값 `로직(GF000133, qt=qt, f=f, E=E, Cm=Cm)` 글 고침 · 알약 「로직」 누르면 그 로직을 엶 | + +## 덧붙여 본 것 + +- 계산이 멈추면 위 알림이 「서버와 이어지지 않음 — 잠시 뒤 다시 해 주세요」 — 서버는 `ok:true` 와 줄마다 까닭(「표 QF000422(13-4-1)에 높이 2.7 인 줄이 없음」)을 줌. 원문 표 위의 「해당 없음 — 예시값에 맞는 줄이 없음」만 맞는 말. +- 칸 고침은 글을 넣고 칸을 떠나야(Enter · 다른 곳 누름) 반영됨. +- 고친 뒤 처음 값으로 다 되돌리면 「닫기」가 묻지 않고 닫힘(맞는 동작) · 「저장 안 함」 표시는 그대로 남아 있었음. +- 원문 칸 역할 알약은 조건 → 고정 → 결과로 돌기만 하고 무엇이 바뀌는지 미리 말하지 않음. diff --git a/docs/raw/M01_쉬운단가/시트로직_정함.md b/docs/raw/M01_쉬운단가/시트로직_정함.md new file mode 100644 index 000000000..a3f21d53f --- /dev/null +++ b/docs/raw/M01_쉬운단가/시트로직_정함.md @@ -0,0 +1,38 @@ +# 시트 로직 시험판 — 정함 (PLAN 35-5 · 브레인 · 10-01 오후) + +사용자 허락(그대로): 「일단 이해한대로 시험판을 만들어보자. 완전히 새로운 품셈을 사용자가 만들려면 기존에 있는 정보를 가져올수도 있지만 새로 만들기도 되어야하면 그럴려면 저장이 되어야할것같아. 일단은 시험판이니까 임시폴더 내부에 저장하고 이상하면 한번에 삭제하는거야.」 +제안서 = https://claude.ai/artifact/4iCAGPhE9maauGNTkXg5he · 근거 = 같은 폴더 `로직판_관계제어_점검.md`(지금 시험판은 관계 더하기 · 지우기 · 다시 잇기 · 새 표가 안 됨) · `로직판_엑셀로직_지도.md` 2 · 3절(우리 스프레드시트 엔진 · 서버 Node 다시 셈). + +## 목적 + +사용자가 코딩 · 브레인 없이, 품셈에 묶이지 않고 단가산출 로직을 새로 만들고 · 기존 정보(품셈 표 · 노임 · 자재 · 장비 · 기존 로직)를 가져오고 · 관계를 더하고 · 바꾸고 · 지움. 관계 = 진짜 엑셀 수식 · 입출력 칸 = 알약. + +## 정함 + +1. **로직 한 벌 = 통합문서 하나**(우리 스프레드시트 Workbook) · **상자 하나 = 시트 하나** · **알약 = 이름 붙은 칸**(입력 알약 · 출력 알약). +2. **선 = 입력 알약 칸에 다른 시트 칸 참조 수식을 저절로 씀**(`='표 · 메쌓기'!E7`) — 엔진이 시트 사이 참조를 이미 셈 · 선을 지우면 그 수식을 지움 · 순환은 엔진 `#CYCLE!` + 그을 때 막음. +3. 상자 종류 — 입력값 · 고정값 · 표 · 계산 · 항목 · 다른 로직 · 결과. 모든 상자 아래 판은 같은 시트 편집기 + 종류별 손잡이. +4. **바깥 값 넣기** — 품셈 표 줄 · 노임 · 자재 · 장비 단가 · 기존 로직 결과는 시트에 「바깥 값」 칸으로 넣음: 화면은 열 때 API 로 받아 넣고, 저장 때 서버가 마스터에서 다시 넣은 뒤 셈(브라우저 값 안 받아 적음). 품셈 표는 사본으로 들고 있지 않음(열 때 · 저장 때 마스터에서 새로). +5. **계산 = 우리 스프레드시트 엔진 한 벌** — 화면은 브라우저, 저장은 서버가 같은 TS 엔진을 Node 로(`common_util/common_util_spreadsheet.py` 길 · 계산 자리 ②). 지금 로직 1,469개(파이썬 엔진)는 안 건드림. +6. **저장 = 임시 폴더** `M01_MasterData/SheetLogic/_data/` (폴더 안 `.gitignore` 로 git 밖) · 키 = `SL-0001` 꼴(자체 번호 · `_키대장.json` 안 씀) · 사용자 표도 여기. 폴더 `SheetLogic/` 를 지우면 코드 · 자료가 한 번에 사라짐. +7. **폴더 밖** — 단추 한 곳(LogicLab.ts 가져오기 한 줄 + 부르기 한 줄 · 「로직 만들기(시험)」 옆 「시트 로직(시험)」) · 서버 등록 한 줄(main.py). 기존 서버 · 엔진 · 마스터 파일 · EasyCalc · LogicBuilder 파일은 안 고침(가져다 쓰기만). +8. **화면** — 위 가로 다이어그램 띠(입력값 → 표 → 계산 → 항목 → 결과 · 단계마다 세로 쌓기 · 자리는 저절로 · 상자 양옆에 입력 · 출력 알약 · 출력 알약을 끌어 입력 자리에 놓으면 선) · 아래 왼쪽 = 고른 상자의 시트 판 · 아래 오른쪽 = 결과(합계 · 노무비 · 재료비 · 경비 · 일위대가표 · 예시값). +9. **가져오기** — 기존 로직을 시트 로직으로 바꿔 가져옴(LogicBuilder Blocks 로 읽고 엑셀 수식으로: 만약 → IF · 최소/최대 → MIN/MAX · 올림/버림/반올림 → ROUNDUP/ROUNDDOWN/ROUND · 표 찾기 → 표 상자 + XLOOKUP 또는 INDEX/MATCH) · 시험 로직 6개(GF000208 · GF000219 · GF000025 · GF000249 · GF000133 · GC000051)는 바꾼 값 = 지금 /calc 값이어야 함. +10. **용어** — 시트 로직 · 상자 · 선 · 입력 알약 · 출력 알약 · 입력값 · 고정값 · 표 · 계산 · 항목(노무 · 재료 · 장비 · 일위대가 · 비율) · 다른 로직 · 결과 · 예시값 · 품셈 표 / 내 표 · 노무비 · 재료비 · 경비. + +## 파일 · 창 (모두 `M01_MasterData/SheetLogic/` · 파일마다 700줄 안) + +| 파일 | 창 | 하는 일 | +| --- | --- | --- | +| `M01_SL_Model.ts` · `M01_SL_Eval.ts` | sub7 | 타입(먼저 올림) · 상자 더하기 / 지우기(시트 만들기 · 지우기) · 선 잇기 / 끊기(참조 수식 쓰기 · 지우기) · 알약 정하기 · 검사(순환 · 빈 입력) · 화면 계산(바깥 값 넣기 → 엔진 → 출력 알약 · 결과 읽기) | +| `M01_SL_Router.py` · `M01_SL_Api.ts` · `.gitignore` | sub4 | `_data` 목록 · 열기 · 저장 · 지우기 · 저장 때 바깥 값 다시 넣고 Node 로 셈 · 바깥 값 한 번에 받기(표 · 노임 · 자재 · 장비 · 기존 로직 결과) · 등록 한 줄 | +| `M01_SL_Diagram.ts` + css | sub8 | 위 가로 띠 · 상자 · 알약 · 선(끌어 잇기 · 고르기 · 지우기) · 「+」 상자 더하기 · 이어진 선 진하게 | +| `M01_SL_Panel.ts` + css | sub2 | 아래 시트 판(우리 스프레드시트 편집기 넣기) · 칸 → 입력 / 출력 알약 정하기 · 칸 위 알약 표시 · 틀 단추(할증 · 나누기 · 만약 · 표에서 찾기 — 진짜 수식을 넣어 줌) | +| `M01_SL_Table.ts` + css | sub3 | 표 상자 손잡이 — 품셈 표 고르기(절 · 이름 찾기) → 시트에 넣기 · 내 표(빈 표 · 엑셀 붙여넣기) · 조건 칸 / 결과 칸 알약 · 「표에서 찾기」 수식 돕기 | +| `M01_SL_Item.ts` · `M01_SL_Result.ts` + css | sub5 | 항목 상자 손잡이(노무 · 재료 · 장비 · 일위대가 고르기 → 단가 바깥 값 · 수량 알약 · 노무비 / 재료비 / 경비 출력) · 결과 칸(합계 · 비목 · 일위대가표 · 예시값) | +| `M01_SL_Import.ts` | sub6 | 기존 로직 → 시트 로직(정함 9) · 6개 같은 값 시험 | +| `M01_SL_Entry.ts` + css | sub1 | 단추 · 큰 창 · 시작 화면(내 시트 로직 · 새로 · 기존 로직 가져오기) · 세 칸 틀 · 저장 · 지우기 · 실행 취소 · 저장 안 함 물음 · 잇기 · 끝 검증 | + +## 끝 검증 (sub1 · 사용자처럼) + +관계 제어 점검 여섯이 모두 되어야 함 — S1 할증 문턱 · 석공에만 · 고정 30% · S2 조건을 고정값으로 · 쓰는 표 바꾸기 · 결과 칸 바꾸기 · S3 새 입력값 「경사」 + 「급이면 10%」 · 내 표 만들어 잇기 · 새 항목 · S4 관계 지우기 · S5 한눈에 보기 · S6 로직끼리 잇기 + 완전히 새 로직 하나(품셈 없이) 만들어 저장 → 다시 열기 → 지우기 · 기존 로직 6개 가져와 값 같음 · 저장 때 서버 값 = 화면 값. From eac31f872a65e95399798df48e176d7b5dfe9145 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:58:43 +0900 Subject: [PATCH 5/7] =?UTF-8?q?chore(M01):=20=EC=8B=9C=ED=8A=B8=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A0=95=ED=95=A8=20=C2=B7=20=EA=B4=80=EA=B3=84?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=20=EC=A0=90=EA=B2=80=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=E2=80=94=20=EA=B3=B5=EC=9C=A0=20docs=20=EC=82=AC=EB=B3=B8=20?= =?UTF-8?q?=EB=8B=B4=EC=9D=8C(=EC=9B=90=EA=B2=A9=EA=B3=BC=20=EA=B0=99?= =?UTF-8?q?=EC=9D=80=20=EB=82=B4=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016PSXsvyDxjNmufteN5bqmt --- docs/raw/M01_쉬운단가/로직판_관계제어_점검.md | 63 +++++++++++++++++++ docs/raw/M01_쉬운단가/시트로직_정함.md | 38 +++++++++++ 2 files changed, 101 insertions(+) create mode 100644 docs/raw/M01_쉬운단가/로직판_관계제어_점검.md create mode 100644 docs/raw/M01_쉬운단가/시트로직_정함.md diff --git a/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md b/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md new file mode 100644 index 000000000..94c353e78 --- /dev/null +++ b/docs/raw/M01_쉬운단가/로직판_관계제어_점검.md @@ -0,0 +1,63 @@ +# 35-3 점검 — 로직 만들기(시험)에서 「표끼리의 관계」를 초등학생이 제어할 수 있나 (sub6 · 확인만) + +- 대상: 내 포트 8008 · 5181 → M01 → 단가산출 로직 → 「로직 만들기(시험)」. git-sync 로 dev 최신(105 커밋)을 받은 뒤 서버를 다시 띄움. 판정 직전 세션 SYSTEM_ADMIN 확인. +- 시험 로직: 돌쌓기 메쌓기(인력) — 표준 GF000219 은 읽기만이라, 이미 있는 현장 사본 GX000001(같은 식)을 열어 메모리에서만 고침. **저장 · 복사 편집 · 삭제는 안 누름**. 끝에 「실행 취소」 10번으로 모두 되돌린 것 확인. 서버 로직 수 그대로 · git 깨끗. 덤프트럭 시간당 작업량 GF000133 · 그것을 부르는 골재운반 모래 GF000134 는 읽기만. +- 사진: `tmp/로직판_관계_사진/` (r01 표준 열기 · r02 현장 사본 · r03 문턱만 바꿈 → 금액 멈춤 · r04 표 칸까지 고침 → 할증 걸림 · r05 격자 · r06 비율 더하기 · r07 격자 칠하기 · r08 로직 부름). +- 걸음 = 고칠 화면이 열린 뒤 누름 수(칸에 글 넣기 1 번 = 1). 들어가기는 M01 → 단가산출 로직 → 로직 만들기(시험) → 로직 고름 = 3 누름. 표준이면 「복사 편집」 1 더(누르는 순간 서버에 현장 사본이 써짐 · 저장 단추를 거치지 않음). + +## 한 줄 결론 + +**이미 있는 관계의 「값 칸」을 바꾸는 일(문턱 숫자 · 할증율 · 조건을 고정값으로)은 고르기 하나 · 숫자 하나로 되고 식은 안 씀. 그러나 관계 자체를 더하고 · 지우고 · 다른 표나 다른 결과 칸으로 잇는 일은 화면에 단추가 없어 거의 안 됨.** 품셈에 없는 관계(새 입력값 · 새 조건 · 새 표)는 만들 수 없고, 「+ 비율」 한 갈래만 있음. 초등학생 판정은 바꾸기 = 중, 더하기 · 지우기 · 다시 잇기 = 불가. + +## 시나리오 표 + +| # | 할 일 | 됨 | 걸음 | 지나간 화면 | 막힌 곳 | 모를 낱말 | 식을 쓰나 | 초등 | 까닭 | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| S1① | 높이 할증 문턱 3m → 2.5m | 일부 | 3 (문턱 칸 1 + 원문 표 칸 「3~4」→「2.5~4」 2) | 산출근거 ③ 계산 · 원문 표 | 문턱만 바꾸면 2.5~3m 에서 증가율 표에 맞는 줄이 없어 금액이 「—」로 멈춤. 표 칸 고침은 「미리 보기 — 저장은 결정 뒤」라 저장되는 것은 문턱뿐. 멈출 때 위 알림은 「서버와 이어지지 않음」(실제 까닭은 「표 QF000422 에 높이 2.7 인 줄이 없음」) | 조건 목록 · 「위에서 처음 맞는 줄의 값을 씀」 · 그 외 · 해당 없음 | 아니요 | 하 | 칸은 쉬우나 문턱과 표 범위가 엮인 것이 안 보이고, 깨진 뒤 까닭이 엉뚱함 | +| S1② | 높이 할증을 석공에만 · 보통인부는 빼기 | 됨(꼼수) | 1 (계산 3 율 칸 「계산 · 증가율」→「고정값」 · 0 이 저절로) | ③ 계산 | 「할증 빼기」 단추는 없음 — 율 0% 로 둠. 계산 3 은 남음 | 바탕 · 율 · 「% 를 더 얹음」 · 계산 · 증가율 | 아니요 | 중 | 문장 「표 조회 3 · 보통인부 에 계산 · 증가율 = 30 % 를 더 얹음」을 읽어야 고를 칸을 찾음 | +| S1③ | 증가율 표 대신 고정 30% | 됨(일부) | 4 (계산 2 · 3 율 칸 → 고정값 → 30 · 두 번) | ③ 계산 | 높이와 상관없이 늘 30%(3m 아래도). 「3m 넘을 때만 30%」는 계산 1 둘째 줄 「표에서 찾은 값」을 숫자로 못 바꿔 안 됨. 안 쓰게 된 계산 1 · 표 조회 1 을 지울 길 없음 | 고정값 · 율 | 아니요 | 중 | 율 칸 둘을 따로 바꿔야 함을 스스로 알아야 함 | +| S2① | 조건 칸 「돌」 입력값 → 고정 「깬돌」 | 됨 | 4 (표 조회 2 「돌」 고르기 → 고정값 → 「깬돌」 글 · 표 조회 3 에 또) | ② 표 조회 | 같은 표를 석공 · 보통인부 두 번 조회 — 한쪽만 바꾸면 석공은 깬돌 · 보통인부는 깬잡석 품으로 섞여 계산됨(실측 121,863원 · 경고 없음). 예시값 뒷길이 25 에는 깬돌 줄이 없어 「—」. 원문 표 칸 역할 알약도 「고정」으로 바뀌지만 어느 조회 것인지 안 보임 | 표 조회 · 무관(조건에서 뺌) · 고정값 | 아니요(글 「깬돌」은 손으로 적음) | 중 | 고르기는 쉬우나 같은 조건이 두 곳에 있음 · 오타면 해당 없음 | +| S2② | 쓰는 표 바꾸기(메쌓기 → 찰쌓기 표) | 안 됨 | — | ② 표 조회 | 표 이름은 글자 조각 — 누를 곳 없음. 바꾸는 함수(`setLookupTable` · `M01_LB_Blocks.ts:627`)는 있으나 화면에 안 붙음 | — | — | 불가 | 화면에 길 없음 | +| S2③ | 결과 칸 바꾸기(석공 → 보통인부 칸) | 안 됨(꼼수 하나) | 원문 칸 알약 1 → 「결과 칸 바꾸기는 아직 안 됨」 | 원문 · ② 표 조회 | 「인 줄의 석공」은 글자 조각. 알약은 조건 → 고정 → 결과로 돌고, 결과 칸을 조건으로 돌리면 「「석공」 을(를) 조건으로 쓰려면 같은 이름 입력값이 있어야 함」. 꼼수: 계산 2 바탕을 「표 조회 3 · 보통인부」로 고르면 석공 줄이 보통인부 품을 씀(고르기 목록에 있음 · 실측 안 함) | 결과 · 바탕 | 아니요 | 불가 | 표 조회의 결과 칸을 고르는 곳이 없음 | +| S3① | 새 입력값 「경사」(완 / 급) · 「급이면 석공 품 10% 더함」 | 안 됨 | — | ① 입력값 · ③ 계산 | 입력값 더하기 · 지우기 단추 없음(① 은 단위 · 범위만 고침 · 선택 목록 낱말도 못 고침). 계산 더하기 없음. 단계 안내(새로 만들기)에서만 숫자 입력값을 「입력값으로 받음」으로 만들 수 있음 — 선택(완/급) 꼴 아님 · 모든 결과 칸에 같이 걸림 | — | — | 불가 | 화면에 길 없음 | +| S3② | 품셈에 없는 작은 표 만들어 잇기 | 안 됨 | — | 원문 | 표 만들기 화면 없음(이 판 · 옛 M01 표 화면 모두). 원문 표 칸 고침은 미리 보기만 · 줄 더하기도 없음 | — | — | 불가 | 표는 품셈 원문에서만 옴 | +| S3③ | 새 항목 「잡재료 = 노무비의 2%」 | 일부 | 2 (「+ 비율」 · 2 입력 · 바탕 노무비는 기본) | ④ 항목 연결 | 2,437원 더해짐. 그러나 이름 칸 없음(일위대가표에 이름 빈 「1 식」) · 넣을 자리 고르기 없음 → 경비로 들어감(잡재료는 재료비여야). 단계 안내에서는 이름 · 넣을 자리 있음 | 비율 · 노무 줄의 합 | 아니요 | 중 | 덧붙임 한 갈래만 · 이름 · 자리 못 정함 | +| S4 | 관계 지우기(할증 · 표 조회 · 입력값) | 안 됨 | — | ② ③ ① | 할증 · 표 조회 · 입력값 · 계산 모두 지움 단추 없음(할증은 율 0 꼼수). 항목 「지움」은 1 누름 · 안 물음 — 보통인부를 지워도 그 줄이 쓰던 표 조회 3 · 계산 3 이 화면에 남고 알림 없음. 「실행 취소」 10번으로 표 칸 고침까지 다 되돌아옴(확인) · 로직 삭제는 쓰는 곳 검사 뒤 물음 | — | 아니요 | 불가 (항목만 상) | 관계를 지우는 길이 없음 | +| S5 | 관계 한눈에 보기 | 일부 | 0 (보기 바꿈 1) | 문장 · 격자 · 원문 | **문장 보기**: ① → ⑤ 차례 · 「표 조회 2 메쌓기(인력) 에서 뒷길이 이 입력값 · 뒷길이 … 인 줄의 석공」 → 「계산 2 석공 수량 표 조회 2 · 석공 에 계산 · 증가율 = 30 % 를 더 얹음」 → 「【노무】 석공 이 계산 2 = 0.195 인 = 52,437 원」 — 번호를 거꾸로 따라가면 길이 보이나 선 · 화살표 없음. **격자 보기**: 줄을 누르면 그 줄이 쓰는 줄 하나만 칠함(석공 → 계산 2 · 표 조회 · 입력값까지 안 이어짐) · 값 칸이 오른쪽에 잘려 고정값(30 · 깬돌)이 안 보임 · 표 이름 대신 QF000421. **원문**: 「이 표를 쓰는 로직 1 개」 · 주③ 「계산에 쓰임」 · 칸 역할 알약 | 표 조회 1 · 2 · 3 번호 · 바탕 · QF 번호 | 아니요 | 중 | 읽을 수는 있으나 한 장 그림이 아님 | +| S6 | 로직끼리 관계(작업량 로직 → 받는 로직) | 보기 일부 · 바꾸기 안 됨 | 0 | 산출근거 | 골재운반 모래(GF000134) 에 「계산 1 작업량 = 60 · 골재운반 덤프트럭 시간당 작업량」 글자만. 넘기는 값(qt=qt · f=f · E=E · Cm=Cm) 안 보임 · 눌러서 그 로직 열기 없음 · 고르기 목록에 「다른 로직」 없음. GF000133 쪽에 「이 로직을 쓰는 로직」 목록 없음(표에만 있음 · 실제는 GF000134 · 135 · 136 셋). 계산 2 문장이 「1 = 1 ÷ 작업량 = 60」으로 읽기 어색 | qt · f · E · Cm(기호 그대로) | 아니요 | 하 | 보이기만 하고 따라가기 · 바꾸기 길 없음 | + +## 안 되는 것이 왜 안 되나 (코드 근거) + +1. 블록 모형이 「있는 관계 고치기」 세 함수뿐 — `setCond`(조건 칸 출처) · `setLookupTable`(쓰는 표 · 화면에 안 붙음) · `setCalc`(계산 조각 · 틀) — `M01_LB_Blocks.ts:604-645`. 표 조회 · 계산 · 입력값을 **더하거나 지우는 함수가 없음**. 고침은 원래 식 글의 그 자리만 갈아끼우는 방식이라 새 자리를 만들 수 없음. +2. 화면 쪽도 같은 범위 — 문장 보기는 항목 카드만 더하기 · 지우기(`M01_LB_Steps.ts:172` `addCard` · `:249` `removeCard`) · 격자 보기는 `setCond` · `setCalc` 만(`M01_LB_Grid.ts:369-412`) · 계산 틀(할증 → 값 등)은 못 바꿈. +3. 값 고르기 목록 = 입력값 · 표 조회 · 다른 계산 · 고정값(숫자)만(`M01_LB_Steps_Cell.ts:235-275`). 「다른 로직」 · 「글 고정값」은 목록에 없어 로직 부름 줄은 글자 조각으로만 보임. +4. 표 조회의 결과 칸 바꾸기는 「아직 안 됨」으로 막아 둠(`M01_LB_Entry.ts:86` · `:437`). +5. 표 칸 고침은 정함 5대로 메모리 사본 · 저장 안 함 — 그래서 S1① 처럼 관계와 표 범위를 함께 바꿔야 하는 일은 저장 뒤 깨짐. +6. 새 입력값 · 새 표 · 조건 「급이면」 같은 품셈에 없는 관계는 단계 안내(새로 만들기)에만 일부(숫자 입력값 · 품셈 절의 다른 표로 할증 조건 목록) — 고치는 화면에는 길이 없음. +7. 「+ 비율」 카드에는 이름 · 넣을 자리 칸이 없음(단계 안내의 덧줄은 있음) — 같은 뜻의 두 길이 서로 다름. + +## 지금 화면(옛 단가산출)에서는 + +공통: 표준 로직은 못 고침 → 「본떠 만들기」로 자체 사본을 만든 뒤 편집기에서 식 글을 고침(34-1B 실측 + 코드). 거의 다 되지만 모두 **식을 써야 함 → 초등 하**. + +| # | 옛 화면 | 어떻게 | +| --- | --- | --- | +| S1① | 됨 · 식 | 중간 값 식 `만약(높이 <= 3, 0, …)` 의 3 → 2.5 (표 범위 문제는 같음) | +| S1② | 됨 · 식 | 보통인부 수량 식 끝 `* (1 + 증가율 / 100)` 지움 | +| S1③ | 됨 · 식 | 수량 식을 `… * 1.3` 으로 · 또는 중간 값 증가율 = 30 | +| S2① | 됨 · 식 | `찾기(QF000421, …, 돌=돌, …)` → `돌='깬돌'` (두 줄 다) | +| S2② | 됨 · 식 | 식 안 QF 번호 고침 · 또는 「표」 단추(수량 칸을 통째로 바꿈) | +| S2③ | 됨 · 식 | 식 끝 `.석공` → `.보통인부` | +| S3① | 됨 · 식 | 설계에서 받을 값 「줄 추가」(이름 경사 · 고르기 「완, 급」) + 수량 식에 `* 만약(경사 == '급', 1.1, 1)` | +| S3② | 안 됨 | 표 만들기 없음 · `만약` 식으로 흉내만 | +| S3③ | 됨 · 식 조금 | 덧줄 「줄 추가」 · 이름 잡재료 · 식 `노무비 * 0.02` · 비목 재료비 | +| S4 | 됨 · 안 물음 | 칸마다 × — 쓰는 곳 검사 없음 · 저장 때 엔진 검사(422)로만 걸림 | +| S5 | 일부 | 텍스트 수식(이름 식 · 값 식 두 칸) · 알약 누르면 표 창 | +| S6 | 됨 · 식 | 중간 값 `로직(GF000133, qt=qt, f=f, E=E, Cm=Cm)` 글 고침 · 알약 「로직」 누르면 그 로직을 엶 | + +## 덧붙여 본 것 + +- 계산이 멈추면 위 알림이 「서버와 이어지지 않음 — 잠시 뒤 다시 해 주세요」 — 서버는 `ok:true` 와 줄마다 까닭(「표 QF000422(13-4-1)에 높이 2.7 인 줄이 없음」)을 줌. 원문 표 위의 「해당 없음 — 예시값에 맞는 줄이 없음」만 맞는 말. +- 칸 고침은 글을 넣고 칸을 떠나야(Enter · 다른 곳 누름) 반영됨. +- 고친 뒤 처음 값으로 다 되돌리면 「닫기」가 묻지 않고 닫힘(맞는 동작) · 「저장 안 함」 표시는 그대로 남아 있었음. +- 원문 칸 역할 알약은 조건 → 고정 → 결과로 돌기만 하고 무엇이 바뀌는지 미리 말하지 않음. diff --git a/docs/raw/M01_쉬운단가/시트로직_정함.md b/docs/raw/M01_쉬운단가/시트로직_정함.md new file mode 100644 index 000000000..a3f21d53f --- /dev/null +++ b/docs/raw/M01_쉬운단가/시트로직_정함.md @@ -0,0 +1,38 @@ +# 시트 로직 시험판 — 정함 (PLAN 35-5 · 브레인 · 10-01 오후) + +사용자 허락(그대로): 「일단 이해한대로 시험판을 만들어보자. 완전히 새로운 품셈을 사용자가 만들려면 기존에 있는 정보를 가져올수도 있지만 새로 만들기도 되어야하면 그럴려면 저장이 되어야할것같아. 일단은 시험판이니까 임시폴더 내부에 저장하고 이상하면 한번에 삭제하는거야.」 +제안서 = https://claude.ai/artifact/4iCAGPhE9maauGNTkXg5he · 근거 = 같은 폴더 `로직판_관계제어_점검.md`(지금 시험판은 관계 더하기 · 지우기 · 다시 잇기 · 새 표가 안 됨) · `로직판_엑셀로직_지도.md` 2 · 3절(우리 스프레드시트 엔진 · 서버 Node 다시 셈). + +## 목적 + +사용자가 코딩 · 브레인 없이, 품셈에 묶이지 않고 단가산출 로직을 새로 만들고 · 기존 정보(품셈 표 · 노임 · 자재 · 장비 · 기존 로직)를 가져오고 · 관계를 더하고 · 바꾸고 · 지움. 관계 = 진짜 엑셀 수식 · 입출력 칸 = 알약. + +## 정함 + +1. **로직 한 벌 = 통합문서 하나**(우리 스프레드시트 Workbook) · **상자 하나 = 시트 하나** · **알약 = 이름 붙은 칸**(입력 알약 · 출력 알약). +2. **선 = 입력 알약 칸에 다른 시트 칸 참조 수식을 저절로 씀**(`='표 · 메쌓기'!E7`) — 엔진이 시트 사이 참조를 이미 셈 · 선을 지우면 그 수식을 지움 · 순환은 엔진 `#CYCLE!` + 그을 때 막음. +3. 상자 종류 — 입력값 · 고정값 · 표 · 계산 · 항목 · 다른 로직 · 결과. 모든 상자 아래 판은 같은 시트 편집기 + 종류별 손잡이. +4. **바깥 값 넣기** — 품셈 표 줄 · 노임 · 자재 · 장비 단가 · 기존 로직 결과는 시트에 「바깥 값」 칸으로 넣음: 화면은 열 때 API 로 받아 넣고, 저장 때 서버가 마스터에서 다시 넣은 뒤 셈(브라우저 값 안 받아 적음). 품셈 표는 사본으로 들고 있지 않음(열 때 · 저장 때 마스터에서 새로). +5. **계산 = 우리 스프레드시트 엔진 한 벌** — 화면은 브라우저, 저장은 서버가 같은 TS 엔진을 Node 로(`common_util/common_util_spreadsheet.py` 길 · 계산 자리 ②). 지금 로직 1,469개(파이썬 엔진)는 안 건드림. +6. **저장 = 임시 폴더** `M01_MasterData/SheetLogic/_data/` (폴더 안 `.gitignore` 로 git 밖) · 키 = `SL-0001` 꼴(자체 번호 · `_키대장.json` 안 씀) · 사용자 표도 여기. 폴더 `SheetLogic/` 를 지우면 코드 · 자료가 한 번에 사라짐. +7. **폴더 밖** — 단추 한 곳(LogicLab.ts 가져오기 한 줄 + 부르기 한 줄 · 「로직 만들기(시험)」 옆 「시트 로직(시험)」) · 서버 등록 한 줄(main.py). 기존 서버 · 엔진 · 마스터 파일 · EasyCalc · LogicBuilder 파일은 안 고침(가져다 쓰기만). +8. **화면** — 위 가로 다이어그램 띠(입력값 → 표 → 계산 → 항목 → 결과 · 단계마다 세로 쌓기 · 자리는 저절로 · 상자 양옆에 입력 · 출력 알약 · 출력 알약을 끌어 입력 자리에 놓으면 선) · 아래 왼쪽 = 고른 상자의 시트 판 · 아래 오른쪽 = 결과(합계 · 노무비 · 재료비 · 경비 · 일위대가표 · 예시값). +9. **가져오기** — 기존 로직을 시트 로직으로 바꿔 가져옴(LogicBuilder Blocks 로 읽고 엑셀 수식으로: 만약 → IF · 최소/최대 → MIN/MAX · 올림/버림/반올림 → ROUNDUP/ROUNDDOWN/ROUND · 표 찾기 → 표 상자 + XLOOKUP 또는 INDEX/MATCH) · 시험 로직 6개(GF000208 · GF000219 · GF000025 · GF000249 · GF000133 · GC000051)는 바꾼 값 = 지금 /calc 값이어야 함. +10. **용어** — 시트 로직 · 상자 · 선 · 입력 알약 · 출력 알약 · 입력값 · 고정값 · 표 · 계산 · 항목(노무 · 재료 · 장비 · 일위대가 · 비율) · 다른 로직 · 결과 · 예시값 · 품셈 표 / 내 표 · 노무비 · 재료비 · 경비. + +## 파일 · 창 (모두 `M01_MasterData/SheetLogic/` · 파일마다 700줄 안) + +| 파일 | 창 | 하는 일 | +| --- | --- | --- | +| `M01_SL_Model.ts` · `M01_SL_Eval.ts` | sub7 | 타입(먼저 올림) · 상자 더하기 / 지우기(시트 만들기 · 지우기) · 선 잇기 / 끊기(참조 수식 쓰기 · 지우기) · 알약 정하기 · 검사(순환 · 빈 입력) · 화면 계산(바깥 값 넣기 → 엔진 → 출력 알약 · 결과 읽기) | +| `M01_SL_Router.py` · `M01_SL_Api.ts` · `.gitignore` | sub4 | `_data` 목록 · 열기 · 저장 · 지우기 · 저장 때 바깥 값 다시 넣고 Node 로 셈 · 바깥 값 한 번에 받기(표 · 노임 · 자재 · 장비 · 기존 로직 결과) · 등록 한 줄 | +| `M01_SL_Diagram.ts` + css | sub8 | 위 가로 띠 · 상자 · 알약 · 선(끌어 잇기 · 고르기 · 지우기) · 「+」 상자 더하기 · 이어진 선 진하게 | +| `M01_SL_Panel.ts` + css | sub2 | 아래 시트 판(우리 스프레드시트 편집기 넣기) · 칸 → 입력 / 출력 알약 정하기 · 칸 위 알약 표시 · 틀 단추(할증 · 나누기 · 만약 · 표에서 찾기 — 진짜 수식을 넣어 줌) | +| `M01_SL_Table.ts` + css | sub3 | 표 상자 손잡이 — 품셈 표 고르기(절 · 이름 찾기) → 시트에 넣기 · 내 표(빈 표 · 엑셀 붙여넣기) · 조건 칸 / 결과 칸 알약 · 「표에서 찾기」 수식 돕기 | +| `M01_SL_Item.ts` · `M01_SL_Result.ts` + css | sub5 | 항목 상자 손잡이(노무 · 재료 · 장비 · 일위대가 고르기 → 단가 바깥 값 · 수량 알약 · 노무비 / 재료비 / 경비 출력) · 결과 칸(합계 · 비목 · 일위대가표 · 예시값) | +| `M01_SL_Import.ts` | sub6 | 기존 로직 → 시트 로직(정함 9) · 6개 같은 값 시험 | +| `M01_SL_Entry.ts` + css | sub1 | 단추 · 큰 창 · 시작 화면(내 시트 로직 · 새로 · 기존 로직 가져오기) · 세 칸 틀 · 저장 · 지우기 · 실행 취소 · 저장 안 함 물음 · 잇기 · 끝 검증 | + +## 끝 검증 (sub1 · 사용자처럼) + +관계 제어 점검 여섯이 모두 되어야 함 — S1 할증 문턱 · 석공에만 · 고정 30% · S2 조건을 고정값으로 · 쓰는 표 바꾸기 · 결과 칸 바꾸기 · S3 새 입력값 「경사」 + 「급이면 10%」 · 내 표 만들어 잇기 · 새 항목 · S4 관계 지우기 · S5 한눈에 보기 · S6 로직끼리 잇기 + 완전히 새 로직 하나(품셈 없이) 만들어 저장 → 다시 열기 → 지우기 · 기존 로직 6개 가져와 값 같음 · 저장 때 서버 값 = 화면 값. From ddaff8a6b8c98aab11ffcdfc51528b0d5b8975a9 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:59:19 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat(m01-sl):=20=EC=8B=9C=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20Model=20=C2=B7=20Eval=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=C2=B7=20=ED=95=A8=EC=88=98=20=EB=A8=B8=EB=A6=AC=20=EC=98=AC?= =?UTF-8?q?=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SheetLogic · SlNode · SlPill · SlEdge · SlOutside · SlKind · SlEnd · SlUserTable · SlValue · SlOutsideValue · SlEvalResult newLogic · addNode · removeNode · connect · disconnect · setPill · removePill · outsideCells · applyOutside · evalLogic · checkLogic (속은 준비 중) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VBToTCGk5dqDKeXCEP3vhk --- M01_MasterData/SheetLogic/M01_SL_Eval.ts | 49 ++++++++ M01_MasterData/SheetLogic/M01_SL_Model.ts | 133 ++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 M01_MasterData/SheetLogic/M01_SL_Eval.ts create mode 100644 M01_MasterData/SheetLogic/M01_SL_Model.ts diff --git a/M01_MasterData/SheetLogic/M01_SL_Eval.ts b/M01_MasterData/SheetLogic/M01_SL_Eval.ts new file mode 100644 index 000000000..00dec78e7 --- /dev/null +++ b/M01_MasterData/SheetLogic/M01_SL_Eval.ts @@ -0,0 +1,49 @@ +/* ============================================================================= + * M01_SL_Eval.ts + * 시트 로직 화면 계산 — 바깥 값 넣기 → 우리 스프레드시트 엔진(브라우저) → 출력 알약 · 결과 읽기 · 검사 + * 저장 때는 서버가 같은 엔진을 Node 로(정함 5) · DOM 없음 + * ========================================================================== */ + +import type { SheetLogic, SlOutside } from "./M01_SL_Model"; + +/** 알약 값 — 수 · 글 · 참거짓 · 빈 칸 */ +export type SlValue = number | string | boolean | null; + +/** 바깥 값 하나 — 표는 칸 덩어리(cell 이 왼위) */ +export interface SlOutsideValue { + node: string; + cell: string; + value: SlValue | SlValue[][]; +} + +export interface SlEvalResult { + /** 상자 id → 출력 알약 이름 → 값 */ + pills: Record>; + result: { 노무비: number | null; 재료비: number | null; 경비: number | null; 계: number | null }; + /** 쉬운 말 */ + errors: string[]; +} + +const notReady = (): never => { + throw new Error("준비 중"); +}; + +/** 바깥 값 칸 목록 — 화면 · 서버가 이 칸에 값을 넣음 */ +export function outsideCells(_sl: SheetLogic): SlOutside[] { + return notReady(); +} + +/** 바깥 값 넣기 — 새 시트 로직(받은 것은 안 바꿈) */ +export function applyOutside(_sl: SheetLogic, _values: SlOutsideValue[]): SheetLogic { + return notReady(); +} + +/** 화면 계산 */ +export function evalLogic(_sl: SheetLogic): SlEvalResult { + return notReady(); +} + +/** 검사 — 빈 입력 알약 · 순환 · 오류 칸(쉬운 말 목록) */ +export function checkLogic(_sl: SheetLogic): string[] { + return notReady(); +} diff --git a/M01_MasterData/SheetLogic/M01_SL_Model.ts b/M01_MasterData/SheetLogic/M01_SL_Model.ts new file mode 100644 index 000000000..dc6d86f02 --- /dev/null +++ b/M01_MasterData/SheetLogic/M01_SL_Model.ts @@ -0,0 +1,133 @@ +/* ============================================================================= + * M01_SL_Model.ts + * 시트 로직 Model — 로직 한 벌 = 통합문서 하나 · 상자 하나 = 시트 하나 · 알약 = 이름 붙은 칸 + * 선 = 받는 입력 알약 칸에 「'시트 이름'!칸」 참조 수식 · DOM 없음 + * 모양은 `docs/raw/M01_쉬운단가/시트로직_정함.md` 정함 1~5 그대로 + * ========================================================================== */ + +import type { Workbook } from "../../A00_Common/spreadsheet/spreadsheet_types"; + +/** 상자 종류 — 입력값 · 고정값 · 표 · 계산 · 항목 · 다른 로직 · 결과 */ +export type SlKind = "input" | "const" | "table" | "calc" | "item" | "logic" | "result"; + +/** 알약 = 이름 붙은 칸 */ +export interface SlPill { + name: string; + /** 「B3」 */ + cell: string; + unit?: string; + /** 바깥 값 칸 — 열 때 · 저장 때 마스터에서 넣음 */ + outside?: boolean; +} + +/** 상자 = 시트 하나 */ +export interface SlNode { + id: string; + kind: SlKind; + name: string; + sheetId: string; + pillsIn: SlPill[]; + pillsOut: SlPill[]; + /** 표 키 · 요소 · 기존 로직 키 · 내 표 id */ + ref?: string; + /** 띠 단계 — 0 입력값 · 1 표 · 2 계산 · 3 항목 · 4 결과 */ + stage: number; +} + +/** 선 — 출력 알약 → 입력 알약 */ +export interface SlEdge { + id: string; + from: { node: string; pill: string }; + to: { node: string; pill: string }; +} + +/** 바깥 값 칸 */ +export interface SlOutside { + node: string; + cell: string; + kind: "table" | "price" | "logic"; + ref: string; +} + +/** 내 표 — 품셈에 없는 표(사용자가 만듦) */ +export interface SlUserTable { + id: string; + name: string; + cols: string[]; + rows: (number | string | null)[][]; +} + +export interface SheetLogic { + key: string | null; + name: string; + resultUnit: string; + workbook: Workbook; + nodes: SlNode[]; + edges: SlEdge[]; + userTables?: SlUserTable[]; +} + +/** 알약 한쪽 끝 */ +export interface SlEnd { + node: string; + pill: string; +} + +const notReady = (): never => { + throw new Error("준비 중"); +}; + +/** 빈 시트 로직 */ +export function newLogic(_name?: string, _resultUnit?: string): SheetLogic { + return notReady(); +} + +/** 상자 더하기 — 그 종류 틀(칸 A 이름 · B 값 · C 설명)로 시트를 만듦 */ +export function addNode( + _sl: SheetLogic, + _kind: SlKind, + _name: string, +): { sl: SheetLogic; node: SlNode } { + return notReady(); +} + +/** 상자 지우기 — 시트 · 이어진 선 · 받던 참조 수식을 함께 지움 */ +export function removeNode(_sl: SheetLogic, _node: string): SheetLogic { + return notReady(); +} + +/** 선 잇기 — 받는 알약 칸에 참조 수식 · 순환 · 없는 알약이면 막고 까닭(쉬운 말) */ +export function connect( + _sl: SheetLogic, + _from: SlEnd, + _to: SlEnd, +): { sl: SheetLogic; why: string | null } { + return notReady(); +} + +/** 선 끊기 — 그 참조를 받는 칸 수식에서 뺌 */ +export function disconnect(_sl: SheetLogic, _edge: string): SheetLogic { + return notReady(); +} + +/** 알약 정하기 — 같은 칸이나 같은 이름이 있으면 바꿈 */ +export function setPill( + _sl: SheetLogic, + _node: string, + _cell: string, + _dir: "in" | "out", + _name: string, + _extra?: Pick, +): SheetLogic { + return notReady(); +} + +/** 알약 빼기 — 이어진 선도 끊음 */ +export function removePill( + _sl: SheetLogic, + _node: string, + _dir: "in" | "out", + _name: string, +): SheetLogic { + return notReady(); +} From f5ba585f5f7c5cdef4898fd44bbfe6db4fe01dee Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 12:59:34 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat(m01-sl):=20=EC=8B=9C=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20Api=20=ED=83=80=EC=9E=85=20=C2=B7=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=A8=B8=EB=A6=AC=20=C2=B7=20=5Fdata=20?= =?UTF-8?q?=EB=A5=BC=20git=20=EB=B0=96=EC=9C=BC=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SlOutside(표 · 노임 · 자재 · 장비 · 로직) · SlOutsideAt · SlOutsideValue · SlLogic · SlListItem · SlSaved - slList · slGet · slSave · slDelete · slOutside · slPlain 머리(몸은 다음 커밋) - SheetLogic/.gitignore — _data/ Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01KmELpdXFDRZHhfbGuRhSmL --- M01_MasterData/SheetLogic/.gitignore | 1 + M01_MasterData/SheetLogic/M01_SL_Api.ts | 108 ++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 M01_MasterData/SheetLogic/.gitignore create mode 100644 M01_MasterData/SheetLogic/M01_SL_Api.ts diff --git a/M01_MasterData/SheetLogic/.gitignore b/M01_MasterData/SheetLogic/.gitignore new file mode 100644 index 000000000..c10c784e3 --- /dev/null +++ b/M01_MasterData/SheetLogic/.gitignore @@ -0,0 +1 @@ +_data/ diff --git a/M01_MasterData/SheetLogic/M01_SL_Api.ts b/M01_MasterData/SheetLogic/M01_SL_Api.ts new file mode 100644 index 000000000..26b5b84df --- /dev/null +++ b/M01_MasterData/SheetLogic/M01_SL_Api.ts @@ -0,0 +1,108 @@ +/* ============================================================================= + * M01_SL_Api.ts + * 시트 로직 Api — 목록 · 열기 · 저장(서버가 바깥 값을 다시 넣고 같은 엔진으로 다시 셈) · 지우기 · + * 바깥 값 한 번에 받기(품셈 표 · 노임 · 자재 · 장비 · 기존 로직 결과) + * 서버 = `M01_SL_Router.py`(`/api/m01/sl/*`) · 정함 `docs/raw/M01_쉬운단가/시트로직_정함.md` 4 · 5 · 6 + * ========================================================================== */ + +import type { Workbook } from "../../A00_Common/spreadsheet/spreadsheet_types"; + +/** 바깥 값 하나 — 값은 열 때 · 저장 때 마스터에서 새로(표는 사본으로 들고 있지 않음) + * · 표 = 품셈 표 통째(머리 줄 + 줄 · 범위 조건 · 값은 「이름·아래」 「이름·위」 두 칸) + * · 노임 · 자재 = 그 줄의 단가(`/calc` 와 같은 셈 · 준용 · 낮은 값) + * · 장비 = 기계경비 로직 부름 글(EasyCalc `machineElement` 의 element) + 넘길 입력값 → 한 시간 값 + * · 로직 = 기존 로직 결과(`/calc` · 돈 로직은 `field` 비목 · 기본 계) */ +export type SlOutside = + | { id: string; kind: "표"; table: string } + | { id: string; kind: "노임"; key: string } + | { id: string; kind: "자재"; key: string } + | { + id: string; + kind: "장비"; + element: string; + inputs: Record; + field?: SlField; + } + | { + id: string; + kind: "로직"; + key: string; + inputs: Record; + field?: SlField; + }; +export type SlField = "노무비" | "재료비" | "경비" | "계"; + +/** 바깥 값이 들어갈 자리 — 시트 id · 칸(표는 이 칸을 왼쪽 위로 펼침) */ +export interface SlOutsideAt { + item: SlOutside; + sheet: string; + cell: string; +} + +/** 바깥 값 답 — 표는 `rows`(머리 줄 포함) · 그 밖은 `value` · 못 구하면 ok false + 쉬운 말 */ +export interface SlOutsideValue { + id: string; + ok: boolean; + value?: number | null; + rows?: (string | number | null)[][]; + name?: string; + unit?: string; + reason?: string; +} + +/** 시트 로직 한 벌 = 통합문서 하나(상자 = 시트) + 바깥 값 자리 */ +export interface SlLogic { + /** 새 로직 null · 저장하면 서버가 `SL-0001` 꼴로 줌 */ + key: string | null; + 이름: string; + 결과단위: string; + book: Workbook; + outside: SlOutsideAt[]; + /** 다른 창이 더하는 칸(상자 · 알약 · 선 …)은 그대로 저장 · 돌려줌 */ + [extra: string]: unknown; +} + +/** 목록 한 줄 */ +export interface SlListItem { + key: string; + 이름: string; + 결과단위: string; + /** 마지막 저장 때(ISO) */ + saved: string; +} + +/** 저장 답 — `logic.book.계산값` 은 서버가 다시 셈한 값 · `values` 는 넣은 바깥 값 */ +export interface SlSaved { + key: string; + logic: SlLogic; + values: SlOutsideValue[]; +} + +const notReady = (): never => { + throw new Error("준비 중"); +}; + +export async function slList(): Promise { + return notReady(); +} + +export async function slGet(_key: string): Promise { + return notReady(); +} + +export async function slSave(_logic: SlLogic): Promise { + return notReady(); +} + +export async function slDelete(_key: string): Promise { + return notReady(); +} + +export async function slOutside(_items: SlOutside[]): Promise { + return notReady(); +} + +/** 실패 → 쉬운 말(EasyCalc `plainError` 그대로) */ +export function slPlain(_e: unknown): string { + return notReady(); +}