diff --git a/resources/master_data/ref/_분석_알약_상세줄.md b/resources/master_data/ref/_분석_알약_상세줄.md new file mode 100644 index 00000000..3cbf3f50 --- /dev/null +++ b/resources/master_data/ref/_분석_알약_상세줄.md @@ -0,0 +1,73 @@ +# 분석 — 단가산출 상세 줄을 「알약 + 사칙연산」으로 + +코드 하나도 안 고침. 읽고 짚어 보기만 함. + +바라는 모습 — 줄이 표 칸 안에 묶여 있지 않고 「[석공 노임] × [표 QF000421] × (1 + [증가율]) = 52,437.06」처럼 +알약과 연산기호로 죽 이어짐. 알약을 누르면 지금처럼 모달로 그 자료를 보임(모달 자체는 없애지 않고, 모달을 여는 자리만 표 밖 줄로 뺌). + +## 1. 지금 줄이 무엇으로 그려지는지 + +세 컨테이너가 관계됨 — 이름은 같지만 그리는 법이 서로 다름. + +| 컨테이너 | 파일 | 그리는 법 | +|---|---|---| +| 단가산출 상세(호표 표) | `M01_MasterData_UI_LogicLab_Detail.ts`(`hoBox`·`groupTable`·`lineRow`) | 비목별 표 — 칸 다섯(이름·단위·수량·단가·금액). 「수량」 칸은 식 글자가 아니라 `item.수량` 을 판 태그(「표」·「입력」…)+포맷된 값 하나로만 보임. **줄을 누르면 모달**(`openMaterialModal`)이 뜸 | +| 텍스트 수식 | `M01_MasterData_UI_LogicLab_Formula.ts` | 표가 아니라 두 칸짜리 줄 목록 — 왼쪽 = 이름 식(`line.이름글`) · 오른쪽 = `line.이름 : line.글`(값 식). 서버가 이미 **다 조립한 문장 하나**를 그대로 찍음. 줄을 눌러도 모달은 안 뜨고 밝기만 바뀜(`is-pin`) | +| 호표 줄 모달 | `M01_MasterData_UI_LogicLab_Modal.ts` | 상세 표 줄을 누르면 뜸 — 그 줄의 raw 식(`item.수량`, 별칭 안 씌운 원문)을 **클라이언트가 다시** 훑어(`relatedFinds` in `M01_MasterData_UI_Logic_Note.ts`) 찾기(...) 호출·요소 참조를 뽑아 알약 목록(`pillBar`)으로 늘어놓음. 알약을 누르면 표/단가 자료가 아래 펼쳐짐 | + +서버가 주는 값의 모양(`resources/master_data/scripts/master_text.py`, `POST /text`) — + +- 줄 하나 = `{이름, 글, 이름글, 짝, 금액, 까닭?}`. **`글`·`이름글` 둘 다 완성된 문자열 하나**(`_draw`/`named` 가 식 나무를 재귀로 내려가며 문자열을 이어 붙임) — 토큰(알약이 될 조각, 연산기호)으로 나뉘어 있지 않음. +- `이름글` 이 이미 요청과 거의 같은 문장을 만듦 — 실제 예(13-4-1 석공비, PLAN 에서 검증된 값) `석공노임 * 메쌓기인력.석공 * (1 + 증가율 %) = 석공비` / `글` 은 `268,908 * 0.15 * (1 + 0 %) = 40,336.2`. 요청한 보기(`[석공 노임] × [표 QF000421] × (1 + [증가율]) = 52,437.06`)와 짜임이 같음 — **`석공노임`이 알약(단가) · `메쌓기인력`이 알약(표, `.석공`은 붙는 칸이름이라 그대로 글자) · `증가율`은 그냥 입력값(알약 아님)**. +- 알약 후보를 가려내는 자료는 이미 있음 — `master_copy.aliases(row, master)` 가 로직 한 줄마다 「찾기(...)·로직(...) 부르기 한 덩이 = 별칭 이름 하나」인 목록(밑이름·참조·값칸·결과단위 포함)을 만들고, `master_text.py` 는 이걸로 원문 식을 별칭 이름으로 갈아 끼운 뒤(`mc.mask`) 그 나무를 걷어 `이름글`을 만듦. **즉 "이 이름이 알약인지 아닌지, 알약이면 표인지 로직인지"는 서버가 이미 알고 있음 — 화면에 안 넘겨 줄 뿐.** + +## 2. 서버가 더 줘야 하는 것 + +**지금 텍스트 수식(`글`·`이름글`)만으로는 안 됨** — 둘 다 이미 문자열로 다 붙은 뒤라 알약 자리·글자 자리를 다시 가르기 어려움(정규식으로 이름을 되짚어 찾는 건 같은 이름이 여러 번 나오거나 다른 값과 이름이 겹칠 때 깨짐). + +모자란 건 "토큰 배열" — 서버가 `이름글`을 만들 때 쓰는 식 나무 순회(`master_text._draw`/`named`/`_bin`/`_side`)를 문자열 이어 붙이기 대신 **조각 목록**으로 뱉게 고쳐야 함. 조각 하나는 대략 — + +``` +{ 종류: "알약-표" | "알약-단가" | "알약-로직" | "글자", 보임: "석공노임", 참조?: "LB0031" } +{ 종류: "글자", 보임: "*" } … +``` + +- `종류` 는 이미 아는 정보로 매길 수 있음 — 나무 마디가 `ref`(요소 키, `LB`/`EQ`/`MT`/`MP`/`MO` 로 시작)면 단가 알약, `name` 인데 그 이름이 `aliases()` 별칭 목록에 있으면 그 별칭의 `종류`(찾기/로직)를 그대로 씀, 그 밖 `name`(입력·중간 값)과 숫자·문자 리터럴은 그냥 글자. +- 괄호·연산기호(`*`, `+`, `%`, 만약 골라진 가지 표시)는 지금 `_bin`/`_side` 가 이미 계산해 붙이는 자리 그대로 "글자" 조각으로 넣으면 됨 — **정밀도·괄호 규칙(`_PREC`·`_RIGHT_TIGHT`)은 그대로 재사용**, 새로 안 만들어도 됨. +- 값(`글` 쪽 알약 라벨에 보일 실제 값)도 같은 순회에서 `_value()`/`fmt()` 를 그대로 쓰면 됨. + +즉 **새 계산은 없음** — 이미 있는 나무 순회를 "문자열 이어 붙이기"에서 "조각 목록 쌓기"로 바꾸는 것 하나. 계산 함수(`master_formula.evaluate`/`run`)는 안 건드림. + +다른 길 — 화면(TS)이 raw 식(`item.수량`)을 직접 다시 파싱해서 토큰을 만드는 방법도 있음(모달이 지금 `relatedFinds` 로 하는 것과 비슷한 정규식 확장). 하지만 이러면 **연산자 우선순위·괄호 붙이는 규칙(`_PREC`/`_RIGHT_TIGHT`)을 TS 에도 따로 베껴야** 함 — 서버 쪽 규칙이 바뀌면 화면이 슬쩍 어긋날 위험이 있어, 굳이 계산기를 두 벌 만드는 셈. **서버가 조각을 주는 쪽이 더 안전함.** + +## 3. 어려운 자리 + +1. **식이 길거나 괄호가 겹칠 때** — 모달은 세로 공간이 넉넉해 문제없지만, 표 줄 안(또는 표를 대신하는 한 줄)에 다 넣으면 알약+글자가 한 줄에 여러 개 몰려 줄바꿈이 잦아짐. 알약 컴포넌트(`m01lab__pill-row`)는 이미 `flex-wrap: wrap` 이라 줄바꿈 자체는 됨 — 다만 표 `