diff --git a/docs/raw/요구_1009_2/분석_정함.md b/docs/raw/요구_1009_2/분석_정함.md new file mode 100644 index 000000000..3f39cf849 --- /dev/null +++ b/docs/raw/요구_1009_2/분석_정함.md @@ -0,0 +1,58 @@ +# 10-9 둘째 요구 분석 · 정함 + +근거 — `사용자요구_1009_2.md` · `사용자요구_1009_2_추가.md` · 조사 A(M02 모달) · B(M02 자재) · C(사전조합) · D(제잡비 단위) · E(B06 화면 모달) · F(B06 형상 조작) · G(B07 · B08 · B09 · CAD) · H(B09 호표 네 탭) — 파일:줄은 조사 문서에. +사용자 지시 — 「신규 계획서 진행」(구체 지시 = 승인 · 갈래는 브레인이 정하고 알림) · 화면 검증은 사용자(코더는 고친 코드만 — 시험 · typecheck · build) · 메인 폴더는 끝에 한 번 합침. + +## 장 · 창 + +| 장 | 내용 | 요구 | 창 | +|---|---|---|---| +| 147 | 공용 모달 머리 단추 · 큰 창 크기 · M02 수량산출 · 입력 · 참조 창 | A1 · A2 · A3 · E2 · E7 | sub4 | +| 148 | M02 자재목록 — 연동 줄 [옵션] · 신규 자재 · 품번 · 세 칸 | A4 · B1 · B2 · B3 | sub5 | +| 149 | M02 사전조합 폴더 · 분류 · 「일위대가화」 · % 덧줄 표기 | C1 · C2 · A5 · D1 | sub3 | +| 150 | B06 [상세] 창 · 열 수 | E1 · E4 · E5 · E6 · E7 | sub2 | +| 151 | B06 치수 글 두 줄 · 사면 이동 패널 | E3 · F4 | sub1 | +| 152 | B06 도수로 절토 · 도수로 고름 · 노면공 강조 · 연동 흙막이 높이 | F1 · F2 · F3 · F5 | sub7 | +| 153 | B07 횡단 배치 칸 · IP 글 색 · CAD 휠 줌 | G1 · G2 · G6 | sub6 | +| 154 | B08 미연결 구조물 줄 · 바로 연결 | G3 | sub8 | +| 155 | B09 표 글자 · 일위대가표 꼴 · 호표 네 탭 갈래 뒤집기 · 산근 텍스트 수식 · 149 의 B09 쪽 | G4 · G5 · H1~H4 · A5 · D1(B09) | 데스크탑 보조 | + +모델 = 모두 Opus 5.5 high. + +## 정함 (브레인 · 사용자가 바꿀 수 있음) + +- 147 — 공용 모달 곁값 `actions`(머리 [닫기] 왼쪽 · 넘긴 창만 바뀜 · 공용 일괄 아님) + 큰 창 곁값(96vw × 94vh · 연결창 · [상세]) · 범위 = 연결창 아래 단추 넷(안내 글은 아래 남김 · 편집 화면 숨김 그대로) · 글 묻는 창([확인]만 머리 · [취소] 지움) · M02 입력 · 수량산출 · 참조 창(아래 [닫기] 지움 · [확인] 머리) · 「손입력」 → 「수기 입력」 · 짧은 글 「손」 → 「수기」 · [면적산출에서 잇기] · goArea 걷어 냄 · 「고른 칸 … [확인]」 · 「면적산출 시트 — …」 지움 · [연결 풀기] 누르면 그 단추 꺼짐. +- 148 — 단가산출이 낸 자재 줄 누름 = 그 로직 [옵션] 모달(읽기 전용 화면은 보기만) · 직접 넣은 줄 = 지금 그대로 · 신규 자재 = 개인 층에서만 · 개인 자재 = 개인 층 파일 하나(마스터 자재 꼴) · 「별도 관리」 = 따로 저장 + 고르기 목록에 보임(고치기 · 지우기 화면은 다음) · 품번 = `PM` + 6자리 · 서버가 모든 사람 통틀어 한 줄 번호 · 입력 = 품명 · 단위 필수 · 규격 · 단가 선택(단가 비면 「단가 없음」) · [신규 자재] = 147 `actions` · 세 칸 = 자재구분(일반 · 관급 · 사급) · 별도계상(별도계상 · 직접계산) · 운반비(포함 · 미포함) 드롭다운 · 처음 값 빈 「—」 · 직접 넣은 줄 = 줄 덧칸 · 로직이 낸 줄 = 로직 줄 `자재표시` 덧칸 · 금액 영향 없음 · 마스터 · M01 안 고침 · B08 · B09 엮지 않음(사본에 같이 실리기만). +- 149 — 사전조합 나무 = 분류 폴더 고정(구조물군 7 › 공통 + 종류 · 빈 폴더도 · 문서 수 · 문서 든 폴더만 펼침 · 미분류 맨 뒤 · 문서 옮김 = 분류 바꿈) · 폴더 오른쪽 클릭 [여기에 새 사전조합](그 분류로 생성) · 목록표 분류 칸 채움 · 고르기 창에서 사전조합(일위조합) 항목은 새 분류로 보이고 거름(단가산출 로직 항목은 품셈 분류 그대로) · 옛 자료 이관 없음(사용자가 상세 머리에서 고름) · 「단가승격」 → 「일위대가화」 화면 글 전부 · 저장 키 `승격` 그대로 · % 덧줄 = 표기만(규격 「노무비의 n%」 · 수량 = 율 · 단위 %) · M02 하위 행 · M01 시험계산 표 · B09 산근 같은 도우미 · 금액 식 덧줄(기계손료 등)은 「식」 그대로 · 마스터 안 고침. +- 150 — 열 수 기본 3(저장값 없을 때) · 칸 왼쪽 라벨 · [상세] = 투명 막 지움(밖 누르면 공용 닫기) · 큰 창(147) · 그림 위 크게 → 글 → 표 · 스크롤 없음 · 글 = B07 횡단도 수량표 바로 위 여러 줄(B07 엔진이 읽음 · 메모 아님) · 표 줄 누름 = 그림 그 항목 강조(키는 [상세] 안에서 · `Design_Pick` 내보낸 함수만 씀 · 그 파일은 sub1 몫). +- 151 — 치수 글 두 줄(사면길이 · 수평 / 높이 · 구배) · 사면 이동 = 노견째 평행이동(노견 0.5 고정 · 늘어난 폭은 차도) · 파이썬 · TS 짝 + 거울 · [◀ ▶] 지움 → 이동 패널(B06 공용 조정창 꼴 · 십자 단추 · 방향키 · 걸음 0.1 m). +- 152 — 도수로 띠 = 절토 · 수평 조각까지(B06 · 3D) · 3° 규칙은 배관 · 흙막이만(박스 · 세월교 본체 끝은 안 넓힘) · 도수로 띠 고름 · 강조 = 118-1 관 고름 꼴(좌측 상자 연결) · 노면공 고름 = 범위 카드 빨간 테두리 대신 카드 안 포장층 강조 · 범위 카드 눌러 노면공 열리는 길 끊음(B06) · 연동 흙막이 = 본 흙막이 높이 물려받음 · 연동 풀면 좌측 「이 측점 높이」 ±0.1 줄로 따로 · `UI_Page_Structures_Panel.ts`(699줄) 떼기 먼저. +- 153 — 배치 칸 = 「횡단도」 묶음 맨 아래 · 공용 입력칸 · 작은 단추 [이 장] [모든 장] · IP 글 색 = 출력에서 실제 색부터 잼(코드는 IP 기호와 같은 파랑) — 다르게 나오면 IP 기호 색에 맞춤 · 이미 같으면 노선 중심선 색 · CAD 휠 = 늘 줌(커서 중심 · 트랙패드 두 손가락 이동 없어짐) · CAD 빌드. +- 154 — 조합 없는 시설도 집계표 줄(값 빈칸 · 「미연결」) · 줄 누름 → 공용 고르기 모달 → 바로 저장(새 서버 길 · 그 칸만) · B05/B06 에 저장 안 한 조작이 있으면 막고 먼저 저장 알림 · 저장 뒤 B08 다시 셈. +- 155 — 공용 표 기본 글자 12 → 14px · 열 폭 같은 비율(B05 노선 추천 표도 같이 커짐) · 일위대가표 = 제목 볼드 → 하위 줄 들여쓰기 + 「ㄴ」(공용 표 줄 꼴 곁값 · 2단) · **호표 갈래 = 145 정함을 뒤집음**(사용자 뜻 · M02 구분 짝 · 엑셀 대가 꼴과 같음): 일위대가목록 = 구조물 조합 이름 + 사전조합 + 일위대가화 줄 · 단가산출 줄은 일위대가 항목이 아니라 산근 · 일위대가표 = 그 항목들 하위 줄 · 금액(품셈 블록 기계 줄 빈칸 고침) · 비고 「산근 n호표」 · 산근목록 = 단가산출 줄 + 사전조합 안 줄 + 일위대가화 줄 하위 로직(엑셀 꼴 · 자재 · 노무 줄은 안 넣음) · 산근 = 엑셀 꼴 한 칸 텍스트 수식(값이 든 식 + 중간값 「Q = 식 = 값」 · B09 단가로 서버가 지음 · 엔진 `master_text` 낮은 부품 재사용) · 숨은 흠 셋 같이(산근 수량 배로 두 번 나눔 · 기계 변수 줄 빈칸 · 경유 자재 키 불일치) · 산근은 서버 단독(로직 기준 단가 = 서버 · 자재 단가 고침은 [저장] 뒤 반영) · 149 의 B09 쪽(「일위대가화」 글 · % 덧줄 `_extras`)도 여기서(sub3 도우미 받아 씀) · 엑셀 검산 시험 그대로 통과 · 사본 견본 시험 여덟 · 화면 글 시험 하나는 새 갈래로 고침. + +## ⬜ 사용자 (PLAN 146 에 줄) + +- 제잡비 밑수 — 지금 굴착기 운전사 노무비까지 밑수에 들어감 · 실무는 인력 줄 노무비만(견본 10 ㎡당 23,372원 차이 · 추정) · 단가산출 로직이라 사용자와 함께 고침. + +## 요구 밖 흠 (안 고침 · 알림만) + +- 물넘이 포장 띠가 사면 끝 뒤 원지반이 계속 내려가면 원지반 따라 ±20 m 까지 내려갈 수 있음(추정 · 조사 F). + +## 파일 겹침 (같은 파일 · 다른 자리 — 늦게 올리는 쪽이 받아 합침) + +| 파일 | 창 · 자리 | +|---|---| +| `ui_template/ui_template_modal.ts` · `.css` | sub4 만(147-1) — sub5 · sub2 는 받아 씀 | +| `ui_template/ui_template_item_picker*.ts` · `.css` | sub4(147-2 단추 · 크기) · sub8(154 `_project` 파일만) | +| `M02_MasterTemplete_Labor_Detail.ts`(683줄) | sub4(147-4 goArea 걷음) · sub5(148 [자재 추가] 단추 만들기를 `M02_Material_Pick.ts` 로 덜고 손잡이) — 700 넘지 않게 | +| `M02_MasterTemplete_Labor_Text.ts` | sub4(147) · sub5(148) · sub3(149) — 각자 글 덩이 따로 | +| `M02_MasterTemplete_Labor_LogicMats.ts` | sub5 만(148-1 · 148-4) | +| `M02_MasterTemplete_Labor_Rows.ts`(631줄) | sub5(148-4 칸 셋 — 칸 부품은 새 파일) · sub3(149-4 `subRows` 표기) | +| `M02_Labor_Doc.py` | sub5(148 `clean`) · sub3(149-4 `run_line`) | +| `B09_Estimation/*`(Labor_Source · Sangeun · Calc_Labor 짝 · UI_Tabs_*) | 데스크탑 보조 만(155 · 149 의 B09 쪽 포함) — sub3 은 B09 안 고침 · % 도우미 이름만 알림 | +| `B06_Section_UI_Cross_Design_Pick.ts` | sub1 만(151) — sub2 는 내보낸 함수만 씀 | +| `B06_Section_UI_Cross_View.ts`(675줄) | sub7(152-3 배선) · sub1(151-3 패널 붙임 한 줄) | +| `B06_Section_UI_Section_View.ts` | sub2(150-1 열 기본 한 줄) · sub7(152-4 포장층 강조) | +| `B06_Section_UI_Style_Cross_Areas.css` | sub7(152-3 · 152-4) · sub2(150-4 강조 — 되도록 [상세] CSS 에) | +| `ui_template/ui_template_data_table.ts` · `.css` | 155(글자 · 줄 꼴) — sub8 은 받아 씀 | diff --git a/docs/raw/요구_1009_2/사용자요구_1009_2.md b/docs/raw/요구_1009_2/사용자요구_1009_2.md new file mode 100644 index 000000000..c4695f90c --- /dev/null +++ b/docs/raw/요구_1009_2/사용자요구_1009_2.md @@ -0,0 +1,50 @@ +# 사용자 요구 (2026-10-09 둘째 · 원문 그대로) + +계획서 = `PLAN.md` 147장부터 · 분석 = 같은 폴더 `분석_정함.md` · 조사 = 같은 폴더 `조사_*.md`. +사용자 지시 = 「신규 계획서 진행」 · 화면 검증은 사용자(코더는 고친 코드만). + +``` +M02 마스터 템플릿 + - 구조물 조합의 일위대가, 자재목록 조합의 수량산출 입력을 하면 나오는 모달창에서 손입력은 > 수기 입력으로 변경하고 면적산출에서 잇기 버튼은 필요없없음. + - 구조물 조합의 일위대가, 자재목록 조합의 수량산출 입력을 하면 나오는 모달창에서 닫기 버튼이 2개 존재, 하단의 닫기버튼은 삭제하고 확인버튼은 상단 닫기버튼 좌측에 배치 + - 구조물 조합의 일위대가, 자재목록 조합의 수량산출 입력을 하면 엑셀 상단에 고른칸 XX - 확인과 그 밑에 면적산출 시트 - XX 같은 설명은 삭제. + - 구조물 조합의 일위대가에서 자재 추가에서 리스트에 없는 항목을 선정할 필요가 있음. 이때 자재추가 모달창에서 닫기 버튼 좌측에 신규 자재 버튼을 추가하고 넣을수 있는 기능 부여, 생성된 자재는 개인별 자재 목록으로 별도 관리하여야 함. + - 구조물 조합의 일위대가에서 신규 자재추가에서 품번은 자동생성, + - 구조물 조합의 일위대가에서 자재목록에는 2개의 형태가 있는데 하나는 상단 단가산출에 의해 자동 결정되어 자재목록화 된 리스트와 사용자가 별도로 추가한 항목이 있음. 단가산출에 연동된 자재목록은 행을 선택하였을때 단가산출의 옵션버튼을 눌렀을때와 같게 모달창을 띄어주고 개별로 넣은 자재목록은 현재를 유지 + - 단가승격이라는 용어를 일위대가화로 변경 + - 구조물 조합의 일위대가에서 자재목록에 사용자에게 받아야 할 정보가 있음. 자재구분(일반, 관급, 사급), 별도계상(별도계상/직접계산), 운반비 포함(포함, 미포함) 열이 존재하여야하며 이는 구조물 조합 내부에서 자재를 구분할때 사용함. 마스터데이터를 손대면 안됨. 반영은 테이블의 해당열들을 넣고 드롭다운메뉴에서 선택 + - 일위대가 사전조합에서 폴더구조가 없음. 확인, + - (기요청사항_확인안됨)일위대가 사전조합 항목의 경우 구분과 상세구분은 산림과 건설품셈이 아님, 산림과 건설품셈을 가져와서 조합한 항목임으로 다른 구분과 상세구분이 필요함. + + +M02 마스터 템플릿 확인 + - 구조물조합의 일위대가에서 큰돌싹기 찰쌓기의 세부 항목에서 제잡비를 1식으로 표현되어 있음. 원문을 보면 %값으로 표현하는게 맞는 것 같은데 계산값은 맞는것같은데 단위 표현이 틀리지않나 생각됨. 유사한 단가산출 로직에도 해당 내용이 있을 수 있으니 같이 확인 후 개선 + +B06 횡단 + - 횡단도 레이아웃 가로 개수 설정에서 숫자의 기본값을 3으로 변경해주고 좌측에 라벨이름 추가 + - 모달창에서 닫기와 확인 관리 화면에서 고치기 버튼들은 우측 상단으로 이동 + - 보라색 선 성분에 대한 정보를 보여줄때 2행 구조로 변경해줘. 좌측 테이블로 넘어가네 + - 돌붙임/도수로에서 원지반으로 들어가는 형상의 경우 절토가 생길텐데 이때도 도수로 형상이 있어야함. + - 돌붙임/도수로의 횡단도의 구조물 선택과 하이라이트 기능 구현 + - 횡단도의 상세버튼으로 보이는 모달창은 스크롤을 원하지 않으니 횡단도를 가려도 되니 상세화면의 위에 더크게 그려줘. 그리고 넣어주는 텍스트는 메모값이 아니라 실제로 B07에서 표 상단에 보여줘야할 내용이야. + - 횡단도의 상세버튼으로 보이는 화면은 테이블의 해당 항목을 누르면 그림영역에서 표현이 되게 해줘. + - 횡단도의 상세버튼으로 보이는 모달창 외 다른 영역선택하면 닫히게 하기 + - 구조물 조합 연결창의 크기를 키울것(횡단도 상세 버튼 모달창도 구조물 조합 연결창 크기로 변경) + - 노면공의 하이라이트 기능이 다른 컨테이너 하이라이트와 연동되어 이상하게 지정되고 있음. 노면공의 구조물만 횡단도 하이라이트를 취소하고 횡단도들의 구조물을 하이라이트 된것처럼 표현해줘. + - 보라색의 사면이동은 노견도 같이 이동되어야하고 키보드로도 이동되게 반영, 버튼은 삭제하고 대신 이동 패널 추가, 공통양식 있음 + - 연동 흙막이류들은 기본값이 본 흙막이와 동일한 높이값을 가지게 변경. 단, 연동해제시 높이 변화도 개별 동작되게 + +B07 +횡단도의 배치를 변경하는 인터페이스는 횡단도 컨테이너 내부로 옮기고 심플하게 표현할것. 그리고 버튼과 라벨은 양식 적용 +평면도에서 IP의 텍스트 색상은 기준 형상 색상과 동일하게 + +B08 + - 구조물 조합이 연결이 안된 구조물 집계표에서 표현해주고 값이 없는 정보들이니 구조물조합을 바로 연결할 수 있게 반영 + +B09 + - B08과 B09에 사용하고 있는 테이블 양식에서 텍스트의 크기가 너무 작음 + - 일위대가표 탭의 제목은 볼드체 선정, 하위 내용은 들여쓰기와 트리처럼 ㄴ표기로로 레벨 표현 양식화 + +공통프로그램 +캐드 프로그램에서 줌인아웃은 마우스 중간 스크롤로 +``` diff --git a/docs/raw/요구_1009_2/사용자요구_1009_2_추가.md b/docs/raw/요구_1009_2/사용자요구_1009_2_추가.md new file mode 100644 index 000000000..c6bd558c7 --- /dev/null +++ b/docs/raw/요구_1009_2/사용자요구_1009_2_추가.md @@ -0,0 +1,10 @@ +# 사용자 요구 추가 (2026-10-09 둘째 · 원문 그대로) + +사용자 지시 = 「추가 계획서 검토 필요 · B09 의 내용 중 … 이 내용 추가 검토」 · 조사 = 같은 폴더 `조사_H_B09호표.md`. + +``` + - 일위대가목록표 : 구조물과 연결된 구조물 조합의 일위대가 항목의 이름이 들어와야함. 일위대가화 한 항목은 일위대가목록표의 항목이 됨. + - 일위대가표 : 일위대가 목록표의 항목들의 하위 세부사항과 해당 금액들이 들어와야함. + - 단가산출근거목록표는 일위대가표의 세부항목들을 나열한 표, + - 단가산출근거는 단가산출근거목록표의 하나하나의 항목을 산출된 계산을 풀어서 텍스트 수식으로 보여준 줘야함. +``` diff --git a/docs/raw/요구_1009_2/조사_A_M02모달.md b/docs/raw/요구_1009_2/조사_A_M02모달.md new file mode 100644 index 000000000..6c3968e8f --- /dev/null +++ b/docs/raw/요구_1009_2/조사_A_M02모달.md @@ -0,0 +1,100 @@ +# 조사 A — M02 수량산출 모달 · 로직 자재 줄 · 일위대가화 (10-9 둘째 · 읽기 전용 조사 에이전트) + +파일 = `M02_MasterTemplete/` 아래 · 머리 `M02_MasterTemplete_` 생략 · 「추정」 = 코드로 확인 못 한 판단 · 지난 기록 = 43-1(수량산출 모달) · 103-1(로직 자재) · 134-1 · 134-2(`docs/raw/plans/2026-10-09_plan_134-145_M02_B05_B06_B07_B08_B09.md:7-12`) · 142-1(연결 창 = M02 카드). + +## 0. 수량산출 모달이 열리는 자리 · 같이 바뀌는 화면 +- 모달 = `Labor_QtyModal.ts` 한 벌(`openQtyModal` :50-175) · 부르는 곳 = `Labor_Detail.ts` `openQtyFor`(:306-335) 하나 — 로직 줄 수량산출 칸 단추(`openQty` :443-452 · 칸 `Labor_Rows.ts:122-148`) · 사용자 자재 줄 누름(`openMat` :455-458 · `Labor_Rows.ts:614`). +- `mountLaborDetail` 을 쓰는 곳 넷 → A1~A5 모두 같이 바뀜: + +| 화면 | 자리 | 갈래 | +|---|---|---| +| M02 일위대가 상세 | `UI_Main.ts:419-433` | 고침 · [면적산출에서 잇기] 있음(`goArea` :426-432) | +| M02 구조물 조합 일위대가 카드 | `ItemCards.ts:311-324` ← `Structure.ts:234` | 고침 · 잇기 단추 없음(`goArea: null` :322) | +| B05/B06 구조물 조합 연결 창(142-1) | `ui_template/ui_template_item_picker_detail.ts:316` → 같은 카드 | 읽기만(쓰는 길 없음 `ItemCards.ts:327`) · 수량 모달 = 사용자 자재 줄에서만 · [확인] 없음 | +| 사전조합 서고 상세 · 일위조합 [수정] 모달 | `UI_Main.ts:421`(mode) · `Labor_RefEdit.ts:64-72` | 수기 입력만(`handOnly` · 시트 · 자재목록 없음) | + +- B08 구조물도 모달(`B08_Quantity/B08_Quantity_UI_Drawing.ts:86-91`) = 일위대가 카드 안 씀(`labor` 안 넘김) → 영향 없음. 면적산출 상세 「칸 지정」 모달(`AreaLink.ts` · [잇기] [풀기])은 다른 모달 — 대상 아님. + +## A1. 「손 입력」 → 「수기 입력」 · [면적산출에서 잇기] 지움 +- 현재: 머리 줄 = 「지금 수량」 · 지금 값 · 「손 입력」 칸 · 단위 · [연결 풀기] · [면적산출에서 잇기](`Labor_QtyModal.ts:141-158`) · 칸 이름 = `In_QtyHand`(`Labor_Text.ts:134` → 모달 :150 · aria :78) · 잇기 = `In_QtyGoArea`(:135) 단추 `go`(`Labor_QtyModal.ts:95-104`) — `goArea` 있을 때만(상세만). +- 같은 뜻 다른 글: 지금 수량 「손 5 ㎥」(`Labor_Hand` :73 → `qtyShort` `Labor_Rows.ts:116` · 표 칸 · 모달 지금 값) · 칸 단추 title 「누르면 손 입력 · 엑셀에서 고르기」(`Labor_QtyPick` :74 → `Labor_Rows.ts:134`) · 알림 「손 입력 수량을 수로 적음」(`In_QtyNeed` :136) · `qtyText`(`Labor_Rows.ts:93` · 화면에선 안 씀 · 시험만) · 카드 도움말 두 줄(`CardHelp.ts:66,75`). +- 고칠 자리: `Labor_Text.ts:134` 「수기 입력」 · :136 · :74 · (⬜1 이면 :73 「수기」 · `CardHelp.ts:66,75`) / 잇기 지움 = `Labor_QtyModal.ts:16,43-44,95-104,156` · 끈 걷기 `Labor_Detail.ts:57(GoArea),82-83,321` · `UI_Main.ts:426-432` · `ItemCards.ts:322` · `Labor_RefEdit.ts:69` · `Labor_Input.ts:19-20`(타입) · `Labor_Text.ts:135` — 옵션째 걷음(TS 남는 칸 검사로 부르는 셋 같이). +- 안 바꿈: 자료 키 `수량출처: "손"` · 문서 `수량: {손}`(서버 `M02_Labor_Doc` 짝) · B09 「손입력」(`ui_template/ui_template_locale_b2.ts:976-978` · 다른 화면). +- 재사용: 없음(글 바꿈 · 지움만). +- 시험: `test_m02_labor_values.py:187,191`(「손 5 ㎥」 · 「수량 손 입력 3 ㎡」 — 글 바꾸면 기대 고침) · `test_m02_area_panel.py:99-112`(모달 부품 · 통과 예상) / 새 = 모달에 `goArea` · `In_QtyGoArea` 없음 · `In_QtyHand` 「수기 입력」(A2 · A3 와 한 소스 검사). +- 위험: ui_checks 43-1 · 51-6 · 51-11 은 `data-labor-qty` · 「닫기」 글로 찾음(손 글 무관). +- 크기: 작음. +- ⬜ 물음 1: 「손」 짧은 글(표 칸 · 모달 지금 값 「손 5 ㎥」 · 칸 title · 도움말)도 「수기」로 — 추천 바꿈(한 모달 안 「손」 · 「수기」 섞임 막음). + +## A2. 아래 [닫기] 지움 · [확인] = 머리 [닫기] 왼쪽 +- 현재: 머리 = 공용 겉틀 h3 + [닫기](`ui_template/ui_template_modal.ts:30-36` · `space-between` `ui_template_modal.css:29-34`) · 아래 줄 = 읽기만 [닫기] / 고침 [닫기] [확인](`Labor_QtyModal.ts:163-171` · `m02-labin__foot`) → 닫기 둘(읽기만인 연결 창도 둘). 머리 [닫기] = `beforeClose`(시트 정리 :57) · 아래 [닫기] = `finish`(:59-62) — 하는 일 같음. +- 공용 겉틀에 머리 단추 자리 없음 — `ModalOptions`(:10-18) = 제목 · 닫기 글 · mount · class · beforeClose 뿐. +- 선례: B05 노선 추천(77-3)이 몸 안 단추 묶음으로 머리 [닫기]를 손으로 갈아 끼움(`B05_Profile/B05_Profile_UI_RouteEdit_Recommend.ts:292-297` · 선택자 `.ui-modal__top > button`). +- 고칠 자리: ① `ui_template_modal.ts:30-36` 머리줄 h3 와 [닫기] 사이 빈 단추 자리 하나(닫기는 머리 직속 그대로 → B05 선택자 안 깨짐) · `mount` 셋째 인자로 넘김(:13 · :46) · `ui_template_modal.css` 자리 꼴 한 벌(`margin-left: auto` · 간격) — 안 쓰는 모달은 지금 그대로 ② `Labor_QtyModal.ts:163-171` 아래 줄 지움 · 고침이면 [확인](filled)을 그 자리에 · 읽기만 = 머리 [닫기]만. +- 재사용: `createButton`(filled · ghost) · 같은 자리를 쓸 요구 = 같은 묶음 「자재 추가 모달 [신규 자재] = 닫기 좌측」(`M02_Material_Pick.ts:30-34` · 같은 `openModal` · 이 조사 밖) · B06 「닫기 · 확인 · 고치기 우측 상단」(사용자요구_1009_2 B06 둘째 줄 · 추정). +- 시험: 새 = 겉틀 순서(h3 → 자리 → 닫기) · 수량 모달 `m02-labin__foot` 없음 · [확인] 이 머리 자리 · 읽기만이면 [확인] 없음(소스 검사) / 돌릴 것 = `test_modal_top_and_add_word.py`(겉틀 CSS) · `test_b05_routeedit_chrome_modal.py` · `test_cad_host_tabs.py` · `helper_130_b07_plan_manage.cjs`(openModal 흉내 · 둘째 인자까지 · 영향 없음). +- 위험: 공용 겉틀 = 25곳이 씀(B01 · B05 · B06 상세 · B07 · B08 · M01 · M02 · 공용) — 더함만 · 기본 그대로 · 긴 제목(「수량산출 — GF000219 …」) + 단추 둘 = 좁은 폭에서 줄바꿈(추정 · 화면 확인 거리) · 다른 창이 같은 겉틀을 고치면 겹침(공용 폴더 · git sync 로 풂) · [옵션] 넣을 값 모달(`Labor_Input.ts:22-37`)도 머리 [닫기] + 아래 [취소] [확인] · 읽기만 = [닫기] 둘 — 요구 밖 · 그대로(A4 로 자주 열리니 사용자 확인 거리). +- 크기: 작음. +- ⬜ 물음 2: 머리 단추 자리 — ① 공용 겉틀 한 칸(수량 모달 · [신규 자재] · B06 이 같이 씀) ② 수량 모달만 B05 처럼 손으로 끼움 — 추천 ①. + +## A3. 시트 위 설명 두 줄 지움 +- 현재: 머리 줄 아래 — 상태 줄 `state`(`Labor_QtyModal.ts:68-71,159` · 칸 고르면 「고른 칸 B6 — [확인]을 누르면 이음」 `Labor_CellPending` :121 · [연결 풀기] 누르면 「연결 풀기 — [확인]을 누르면 풂」 `Labor_UnlinkPending` :91 · 손 값 치면 비움 :128-130) → 그 밑 안내 「면적산출 시트 — 칸을 누르면 그 칸을 고름 · 손 입력이 있으면 손이 앞섬」(`Labor_SheetHint` `Labor_Text.ts:82-85` · `m02-cellpick__hint` `Labor_QtyModal.ts:160-162`) → 시트. +- 고칠 자리: `Labor_QtyModal.ts` 상태 줄 · 안내 줄 지움(:68-71 · :91 · :121 · :128-130 · :159 · :162 앞 요소) · `Labor_Text.ts:80-85` 글 셋 지움 · `AreaPanel.css:56` 선택자 `.m02-cellpick__hint` 지움(쓰는 곳 이 모달뿐) · 머리 주석(:4-7) 맞춤 · 고름 상태 `pending` 은 그대로([확인] 때 씀). +- 남는 표시: 고른 칸 = 읽기만 시트의 고른 칸 테두리(`AreaCellPick.ts:88-91` `onSelect` · 추정 — 화면 확인 거리) · 연결 풀기 = 알림 사라짐 → [연결 풀기] 누르면 단추 끔(한 줄 · 추정 권장). +- 남김: 시트 안 「면적산출을 읽는 중…」 · 못 읽음(`AreaCellPick.ts:55,102-107`) · 계산 전 「계산이 끝난 뒤 고름」(`Labor_QtyModal.ts:124-127`) — 설명 아닌 상태 글. +- 시험: `test_m02_area_panel.py:99-112`(`pending = { kind: "unlink" };` 남음 → 통과) / 새 = `Labor_SheetHint` · `Labor_CellPending` · `data-labor-qty-state` 없음(A2 시험에 같이). +- 위험: ui_checks 43-1(:82 `data-labor-qty-state` 읽음) — 옛 화면 점검 · 화면 확인은 사용자. +- 크기: 작음. + +## A4. 로직 자재 줄 누름 = 그 로직 [옵션] 모달 · 사용자 자재 줄 = 그대로 +- 현재 가름(칸 · 키): + - 자동 줄(로직 자재 103-1) = 문서에 안 남음 · 서버 calc `줄[].재료`(`M02_Labor_Doc.py:448` `logic_mats` · 꼴 `M02_Labor_LogicMats_Model.ts:18-32`) · 바꾼 품목만 `담은로직[].고름 {호표 차례: MT키}`(`Labor_Api.ts:134-135`) · 화면 = `Labor_LogicMats.ts` `logicMatRows`(:33-43 · 담은로직 차례 `r` 앎) · 줄 `tr.m02-labrow__logic-mat` · `data-labor-logic-mat="{로직}|{차례}"`(:107-109) · 줄 누름 없음 · [바꾸기] [기본]만(:66-106 · 고칠 때만 `on`) · 사용자 줄 앞에 붙음(`Labor_Rows.ts:627-630`). + - 사용자 줄 = 문서 `자재[] {코드, 이름, 규격, 단위, 수량}`(`Labor_Api.ts:139-145`) · `data-labor-mat="{코드}"`(`Labor_Rows.ts:566-569`) · 줄 누름 = 수량산출 모달(:614 ← `Labor_Detail.ts:234` `open: openMat`) · 같은 품목 막기(`Labor_Detail.ts:500-509` `insideKeys`). +- [옵션] 모달 = `Labor_Detail.ts` `openRow(i)`(:403-427 → `Labor_Input.ts` `openLaborInput` :73-191 · 넣을 값 · 켜쌓기율 · 메모 · 읽기만이면 보기) · 단추 = `Labor_Rows.ts:451-453`. +- 고칠 자리: `Labor_LogicMats.ts:20-25` 손잡이에 `open(row)` · `swap` · `reset` 은 고칠 때만 · 끝 칸 = swap 있을 때만(머리 칸 수 `matTable` `remove` 와 짝 `Labor_Rows.ts:595,625`) · `matRow`(:107) 에 `is-open`(기존 손가락 · hover `Labor.css:16-22`) + 줄 누름 `open(r)` / `Labor_Detail.ts:227-232` = 고침 `{open: openRow, swap, reset}` · 읽기만 `{open: openRow}`(로직 줄 읽기만 [옵션] 보기 :214 와 같음) · 사용자 줄 그대로 · (선택) `CardHelp.ts:65` 아래 한 줄 「로직 자재 줄 누름 — 그 로직 넣을 값 창」. +- 그대로: 보기 갈래(`Labor_View.ts:97` · 면적산출 오른쪽 패널 · 손잡이 없음) · 일위조합(SC) · 옛 SP 참조 줄 = 로직 자재 없음(`Labor_LogicMats.ts:40`). +- 연결 창(142-1): 읽기만 → 로직 자재 줄 누름 = 읽기만 [옵션] 모달(값 보기) · 같이 바뀜. +- 재사용: `openRow` · `.m02-labrow__row.is-open` CSS 그대로. +- 시험: `test_m02_card_shell.py:126-149`(로직 줄 `{ open: pick, option: openRow, ref: openRef }` 그대로 → 통과) · `test_m02_labor_logic_mats.py`(셈 · 고름 · 무관) / 새 = 로직 자재 줄 누름 = `openRow` 를 고침 · 읽기만 둘 다 넘김 · 사용자 줄 `openMat` 그대로 · 끝 칸은 swap 있을 때만(소스 검사). +- 위험: `Labor_Detail.ts` 683줄(이 요구는 줄 수 그대로 · A1 이 3줄 줄임) · 같은 묶음 다른 요구(자재구분 · 별도계상 · 운반비 열 · [신규 자재])가 같은 표(`Labor_Rows.ts` 631 · `Labor_LogicMats.ts` · `Labor_Detail.ts`)를 고침 → 겹침 · 700줄. +- 크기: 작음. + +## A5. 「단가승격」 → 「일위대가화」 +- 화면 글 세 곳: + +| 자리 | 지금 | 보이는 곳 | +|---|---|---| +| `Labor_Text.ts:93` `Kind_Promote` | 「단가승격」 / Promoted | 로직 줄 구분 드롭다운(`Labor_Rows.ts:58-72`) · 구분 글(`kindOf` :46-55 · 보기 갈래 · 연결 창 · 옛 SP 참조 줄) | +| `B09_Estimation/B09_Estimation_UI_Tabs_Sangeun.ts:53` | 「산근 = … 「단가승격」 로직 줄 …」 | B09 단가산출근거 표 머리 안내 | +| `B09_Estimation/B09_Estimation_Sangeun.py:50` `EMPTY` | 「… 단가승격 줄 없음 — 연결 없음」 | B09 산근 빈 표 알림(`sg_notes` → `B09_Estimation_UI_Tabs_Sangeun.ts:31,121`) | + +- 없음: 로케일(`ui_template/ui_template_locale_*.ts`) · M01 · 도움말(Grep) · B05 · B06 「승격」 = 다른 뜻(변화점 · confirmed 승격) — 안 바꿈. +- 주석 · 시험 이름: M02 약 30줄 · B09 7줄 · 시험 · ui_checks 다수 — 기록 글 · 그대로(고치는 파일 주석만 맞춤 · 추정 권장). +- 저장 키 `승격` 판단 = 그대로(⬜3): + - 화면에 안 보임 · 읽고 쓰는 곳 = 서버 정리 `M02_Labor_Doc.py:128`(모르는 칸 버림) · 옛 SP 펼침 `M02_Labor_Ref.py:193` · 화면 `Labor_Api.ts:137,175` · `Labor_Detail.ts:374-377` · `Labor_Rows.ts:49,389` · B09 `B09_Estimation_Sangeun.py:99` · `B09_Estimation_Labor_Source.py:184`. + - 바꾸면: 위 여덟 곳 + 옛 키 함께 읽기 + 이관 · 시험 `test_m02_labor_promote_flag.py`(17곳) · `test_145_1_b09_sangeun.py`(11) · `test_145_2_b09_labor_calc.py`(3) · 옛 키를 안 읽으면 서버 `clean` 이 버림 → 저장 한 번에 표시 사라짐 · B09 산근 빠짐(조용한 자료 손실). + - 실측(읽기만): 이 PC `storage/` · `resources/` 에 `"승격"` 저장 0 · 옛 SP 참조 줄은 읽을 때 `승격: true` 로 펼침(`M02_Labor_Ref.py:163-195`) · 데스크탑 storage 는 못 봄(추정 — 있을 수 있음). + - 안쪽 이름 `promote` · `Kind_Promote` · `setPromote` · `kind_of()=="promote"` · 옛 파일 `resources/master_template/promote/SP-000001.json` `종류: "단가승격"`(화면 안 보임 · 134-2 「파일 안 고침」) = 그대로. +- 고칠 자리: 위 표 세 줄(영어 「Promoted」 = 그대로 또는 「Unit-price item」 · 선택). +- 시험: B09 시험은 `sg.EMPTY` 이름으로 비교(`test_145_1_b09_sangeun.py:132,142`) → 통과 · 「단가승격」 글 단정 시험 없음 / 새 = 화면 글 세 곳에 「단가승격」 없음 · 「일위대가화」 있음(`test_m02_labor_promote_flag.py` 에 하나). +- 위험: ui_checks 50-3 · 51-x(옛 승격 단계 · 134-2 뒤 이미 안 맞음) · 분석 · 계획 문서 글은 브레인 몫. +- 크기: 작음. +- ⬜ 물음 3: 저장 키 — ① `승격` 그대로(화면 글만) ② `일위대가화` 로 바꿈 + 옛 키 읽기 + 이관 — 추천 ①. + +## 고칠 파일 목록 +| 파일 | 요구 | 줄 수 지금 → 뒤(대략) | 700 위험 | +|---|---|---|---| +| `Labor_QtyModal.ts` | A1 · A2 · A3 | 175 → 150 | | +| `Labor_Text.ts` | A1 · A3 · A5 | 161 → 154 | | +| `Labor_Detail.ts` | A1(끈 걷기) · A4 | 683 → 680 | ⚠ 같은 묶음 [신규 자재] · 자재 구분 열과 겹치면 넘김 | +| `Labor_LogicMats.ts` | A4 | 144 → 150 | | +| `Labor_Input.ts` | A1(타입) | 191 → 188 | | +| `UI_Main.ts` | A1(끈 걷기) | 666 → 659 | ⚠ 이미 큼 | +| `ItemCards.ts` · `Labor_RefEdit.ts` | A1(`goArea: null` 한 줄) | 568 · 108 → −1 | | +| `CardHelp.ts` | A1(⬜1) · A4(선택) | 118 → 119 | | +| `AreaPanel.css` | A3 | 88 → 87 | | +| `ui_template/ui_template_modal.ts` · `.css` | A2(⬜2 ①) | 52 · 40 → 57 · 46 | | +| `B09_Estimation/B09_Estimation_UI_Tabs_Sangeun.ts` · `B09_Estimation_Sangeun.py` | A5(글 한 줄씩) | 141 · 377 → 그대로 | | +| `Labor_Rows.ts` | A5(주석만 · 선택) | 631 → 631 | ⚠ 같은 묶음 자재 열 요구와 겹침 | +| `resources/tester/test_m02_labor_values.py` | A1(⬜1 · 기대 글 둘) | 194 | | +| 새 시험(예 `resources/tester/test_m02_qty_modal_head.py`) · `test_m02_labor_promote_flag.py` 한 개 더 | A1~A4 소스 검사 · A5 | 새 | | diff --git a/docs/raw/요구_1009_2/조사_B_M02자재.md b/docs/raw/요구_1009_2/조사_B_M02자재.md new file mode 100644 index 000000000..884b9b22e --- /dev/null +++ b/docs/raw/요구_1009_2/조사_B_M02자재.md @@ -0,0 +1,81 @@ +# 조사 B — M02 일위대가 자재 · 신규 자재 · 품번 · 자재목록 세 칸 (10-9 둘째 · 읽기 전용 조사 에이전트) + +파일 = `M02_MasterTemplete/` 아래 · 머리 `M02_MasterTemplete_` 생략 · 「추정」 = 코드로 확인 못 한 판단 · 원문 = `사용자요구_1009_2.md:11,12,15` · 지난 기록 = 103-1(로직 자재 · 고름) · 134-1(줄 덧칸 `승격` 꼴) · 142(사본 굳힘) · 143-4(B08 사본 자재) · 144-3 · 145(B09 관급 · 별도) · `요구_1009/조사_F_원가산출엑셀.md:119`(관급 · 별도계상 = 자재 줄 사용자 표시 추천 ①). + +## B1. 자재 추가 모달 [신규 자재] · 개인별 자재 목록 +- 현재: + - 모달 = `M02_Material_Pick.ts:29-77`(공용 `openModal` · 제목줄 = 제목 + [닫기] 하나 `ui_template/ui_template_modal.ts:30-35` · 찾기 칸 + 목록 · 고르면 `done` 뒤 닫음) · 부르는 곳 하나 = 일위대가 상세 `Labor_Detail.ts:495-513`(카드 · 사전조합엔 단추 없음 `:635` · ui_checks 49-6). + - 목록 원천 = M01 `searchMaterials`(`M01_MasterData/M01_MasterData_Api_Fetch.ts:180-188`) → `GET /api/m01/pick?kind=price`(`M01_MasterData_Router.py:211-213`) → `M01_MasterData_Store.py:456,471-493` = `resources/master_data/재료_자재품목.json`(30,711줄 · 낱말 모두 이름 · 규격 · 옛이름에 들거나 키와 같음 · 50개까지). + - 고르면 = 로직 자재 품목 · 같은 코드 막음(`Labor_Detail.ts:500-509`) → 줄 `{코드, 이름, 규격, 단위, 수량: null}`(:510) · 품번 칸 이름 = `코드`(머리 「코드」 `Labor_Text.ts:109` · `Labor_Rows.ts:570,618`). + - 서버 = `clean`(`M02_Labor_Doc.py:131-150`) — `MT` 아니거나 M01 에 없으면 400 「M01 자재품목에 없는 코드」 · 이름 · 규격 · 단위는 M01 것으로 다시 씀 · 셈 = `material_price(whole, 코드)`(`:365-380,416-423` · `whole` = M01 적재본) → 목록 밖 자재를 담을 길 자체가 없음. + - 개인 층 = `storage/{회사}/{사용자}/templates/`(`M02_Template_Layers.py:82-86`) · 개인별 자료 = 집계표 · 도면 · 면적 · 일위대가 · 사전조합(SC-)뿐 — 개인 「자재」 자료 없음 · 옛 찌꺼기 `storage/1/10/templates/material/item*.json`(옛 재료산출 통합문서 · `SM-`) · `자재조합.json`(빈 장부) = 쓰는 코드 없음(이름 겹침만 피함). + - 서버 길 선례 = 층 권한 `_root`(`Router_Items.py:143-156` · `M02_Layer_Access.py:61-94` 개인 = 본인 · 맡은 회사 관리자) + `_call` = `store.at(층 폴더)`(`:159-164`) · 키를 서버가 주는 새로 만들기 = `POST /layers/{layer}/library/{kind}`(`M02_Labor_Router.py:81-103` → `M02_Labor_Ref.py:235-251`). +- 고칠 자리: + - 새 `M02_Material_Own.py`(~100줄): 층 뿌리 한 파일 `개인자재.json`(종류 폴더 밖 = `구조물집계표조합.json` 꼴 `M02_Template_Layers.py:37` → 양식 목록 · 프로젝트 복사 · 층 복사에 안 섞임 `:134-153,326-368`) · 꼴 = M01 자재 줄과 같게 `{그룹: 재료, 원문: 개인, 줄: [{키, 이름, 규격, 단위, 값}]}`(사본 `단가.json` 에 그대로 넣으면 `mf.Master` 가 읽음) · 목록 · 만들기(이름 · 단위 빈 = 400 · 값 = 수 ≥ 0 또는 빈 · 같은 이름 + 규격 + 단위 = 409 · 키 = B2 · `store._LOCK` · 원자 쓰기) · 단가 한 줄(`material_price` 꼴 — 기준단가 = 값 · 가격 다섯 빈 · 기준칸 없음) · 사본 묶음 · 복사 때 옮기기. + - `M02_Labor_Router.py` 끝에 `GET · POST /layers/{layer}/materials` — 개인 층만(회사 · 마스터 = 빈 목록 · 400) · 권한 `_root(…, write)` 한 벌. + - `M02_Labor_Doc.py:131-150` — `MT` 아니면 지금 층(`store.root()` · 개인 층일 때만) 개인 목록에서 찾음 · 이름 · 규격 · 단위 = 목록 것 · 없으면 지금 400 그대로 / `:416-423` 셈 = M01 에 없는 코드는 개인 목록 값(사본 셈은 `단가.json` 개인 줄이 `whole` 안이라 손 안 댐 — `resources/master_data/scripts/master_material.py:255-259` 비 MT 갈래 = 줄 「값」). + - 사본 굳힘 `M02_Item_Source.py:153-159` — 개인 층 항목이면 문서 자재의 개인 코드 줄을 `단가.json` 에 한 파일(예 `재료_개인자재.json`)로 더함(`prices.collect` 는 M01 에 없는 키를 조용히 버림 `M02_Item_Prices.py:73-77`) → 사본 셈 · B08 `_folder_units`(`B08_Quantity/B08_Quantity_Router_Material.py:55-61,76-86` 묶음 줄을 키로) · B09 `combo`(`B09_Estimation/B09_Estimation_Labor_Source.py:240,257`)가 이름 · 규격 · 단위 · 값을 찾음 · 원본 목록이 바뀌어도 사본 그대로. + - 층 사이 복사 `Store.py:563-577`(`refs.carry` 옆 · 붙여넣기 · 함께 가져오기가 다 지나는 `copy_from` `:438-464`) — 원본 개인 층에 개인 코드가 있으면 대상 개인 층 = 대상 목록에 같은 키로 더함 · 회사 · 마스터 = 400(⬜1 ① 때). + - [개인에 저장] `M02_Item_Personal.py:92-97` — 사본 `단가.json` 개인 줄을 내 목록에 같은 키로 더한 뒤 `copy_from`(남의 개인 층 항목 사본이면 이것 없이는 `clean` 400). + - 화면 `M02_Material_Pick.ts` — `pickMaterial(done, own?)` · `own`(개인 층 · 고칠 수 있음 · owner = `laborAt` 규칙 `Labor_Api.ts:222-226`)이면 목록 = 개인 자재(앞 · 「개인」 표 · 같은 낱말 규칙으로 화면에서 거름) + M01 찾기 · 제목줄 [닫기] 앞 [신규 자재] · 누르면 입력 칸(품명 = 찾기 글 처음 값 · 규격 · 단위 · 단가 · 품번 「저장 때 자동」) + [저장] → POST → 답 줄로 `done` · 닫음 / `Labor_Detail.ts:499` 부를 때 `own` 만 넘김. +- 재사용: 제목줄 단추 끼우기 = B05 꼴(`B05_Profile/B05_Profile_UI_RouteEdit_Recommend.ts:293-297` · 공용 모달 안 고침 · 제목줄 `space-between`(`ui_template_modal.css:29-34`)이라 끼운 단추에 왼쪽 자동 여백 없으면 가운데로 감) · `createInputField` · 단위 = `createUnitPick`(`DataFlow/M02_DF_UnitPick.ts:103` · 단위표준) · 길 = `call`(`Api_Fetch.ts:37`) · 키 다시 잡기 = `refs.create`(`M02_Labor_Ref.py:242-251`) · 사본 굳힘 = `참조사본`(`M02_Item_Source.py:91-99`) · 층 사이 옮기기 = `refs.carry`(`M02_Labor_Ref.py:313-342`) · 모든 개인 층 훑기 = `layers.layer_files`(`M02_Template_Layers.py:274-282`). +- 시험: 있는 것 = `test_m02_labor_doc.py:57`(없는 자재 코드 400 그대로여야) · `test_m02_item_labor.py:133`(사본 = 문서 · 알약 · 자재 단가) · `test_item_copy_complete.py:144,461`(단가 묶음 닫힘 · 개인에 저장 일위대가) · `test_m02_labor_copy.py`(층 사이 복사) · `test_143_4_b08_snapshot_materials.py` · `test_145_2_b09_labor_calc.py` · ui_checks 49-6 / 새 = `test_m02_material_own.py`(새 자재 키 꼴 · 두 사람 안 겹침 · 남의 개인 403 · 회사 층 400 · 빈 이름 · 단위 400 · 같은 자재 409 · clean 이 개인 코드 받음 · 회사 층 문서엔 400 · 층 셈 기준단가 = 값 · 사본 `단가.json` 개인 줄 · 사본 셈 = 층 셈 · B08 이름 · [개인에 저장] 같은 키 · 회사로 붙여넣기 400 · 임시 storage = `test_m02_labor_ref.py:30-39` 꼴). +- 위험: `clean` 이 층 폴더 파일을 읽게 됨(층 밖 호출 · 시험 = `store.root()` 기본 마스터 → 개인 자재 없음 · 그대로) · B09 수요(`B09_Estimation_Prices.py:143-151`)는 M01 적재본 MT · MO 만 → 개인 자재 = 「연결 없음」(빈칸 규칙 · 넣는 것은 B09 몫) · 고치기 · 지우기 없음(⬜2) — 지우기가 생기면 쓰는 곳 409(`refs.refuse_used` 꼴) · storage 공유 junction(시험은 임시 storage) · `Labor_Detail.ts` 683줄. +- 크기: 큼(서버 새 파일 + clean · 셈 · 사본 · 층 복사 · 개인에 저장 다섯 자리 + 모달). +- ⬜ 물음 1: 신규 자재 쓰는 층 — ① 개인 층 일위대가에서만([신규 자재] · 개인 자재 목록 = 개인 층에서만 · 회사 · 마스터 = M01 만) ② 층마다 자기 자재 목록(회사 · 마스터에도 · 읽기 = 사전조합 위 층 규칙 `refs.readable` `M02_Labor_Ref.py:96-105`) — 추천 ①. +- ⬜ 물음 2: 「별도 관리」 범위 — ① 따로 저장 + 고르기 목록에 보임(고치기 · 지우기 화면은 뒤) ② 개인 자재 목록 화면(고치기 · 지우기 · 쓰는 곳 409) — 추천 ①. +- ⬜ 물음 3: 입력 칸 — ① 품명 · 단위(필수) · 규격 · 단가 하나(선택 · 빈 = 「단가 없음」 붉음 · 가격 다섯 칸 「—」) ② 가격 다섯 칸(물가자료 · 유통물가 · 물가정보 · 거래가격 · 관급) 가운데 고른 칸에 적음 — 추천 ①. + +## B2. 신규 자재 품번 자동 +- 현재: 마스터 품번 = 테이블ID 2자 + 6자리(`MT000008`~`MT030718` · 대장 `resources/master_data/_키대장.json` 다음 MT 30719 · 지운 키 다시 안 씀 `resources/master_data/_틀.md:30-33` · `scripts/master_keys.py:16-35`) · M02 층 키 = 머리 + 붙임표 + 6자리 층마다 셈(`SC-000001` `M02_Labor_Ref.py:235-239` · `SD-` `Store.py:52-53`). +- 겹침: 층마다 셈이면 사람마다 같은 번호 · 한 프로젝트에 여러 사람 개인 층 항목 사본이 들어옴(`M02_Project_Items_Router.py:104-121` owner 아무나 · 같은 회사) → B08 자재 모음(`B08_Quantity_Router_Material.py:67-68,76-86`) · B09 수요 · 대비표 사용자 값(`B09_Estimation_Store.py:7`)이 코드 하나로 모음 → 다른 자재가 한 줄로 섞임. +- 고칠 자리: `M02_Material_Own.py` 만들기 안 — 모든 개인 자재 파일(`storage/*/*/templates/개인자재.json`) 가장 큰 번호 + 1 · `store._LOCK` 안 · 화면은 번호를 안 보냄(서버 것이 이김). +- 재사용: `layers.layer_files` 훑기 꼴 · `refs.next_key` 「가장 큰 번호 + 1」 꼴. +- 시험: B1 새 시험 안(두 사람 · 두 회사 번호 안 겹침 · 화면이 보낸 키 무시). +- 위험: 머리 `PM` = 마스터 테이블ID 아님(`master_keys.TABLES` 안 고침 · `Master.get` 은 앞 두 자로 색인 `master_formula.py:289,307` → 사본 셈 그대로) · 지우기가 생기면 가장 큰 번호를 지운 뒤 다시 쓰일 수 있음 → 그때 대장(`다음`) 필요. +- 크기: 작음(B1 에 딸림). +- ⬜ 물음 4: 품번 꼴 — ① `PM` + 6자리 전체 일련(`PM000001` · 마스터 `MT` 꼴과 같은 모양 · 사람 사이 안 겹침) ② `PM-` + 개인마다 일련(`SC-` 꼴 · B08 · B09 에서 섞일 수 있음) — 추천 ①. + +## B3. 자재목록 세 칸(자재구분 · 별도계상 · 운반비) +- 현재: + - 표 = `matTable`(`Labor_Rows.ts:545-631`) 칸 = 코드 · 이름 · 규격 · 수량산출 · 단위 · 가격 다섯(`:540`) · 기준단가/반영 · [삭제] · 로직 자재 줄 = `Labor_LogicMats.ts:45-144`(같은 칸 · [바꾸기] · [기본] · 문서에 안 남음 = calc 답 `줄[].재료` `M02_Labor_Doc.py:448-479`) · 같은 부품 = 상세 · 카드(`ItemCards.ts:311-324`) · 보기 갈래(`Labor_View.ts:96-99` 손잡이 없음) · B05/B06 고르기 모달(읽기 전용). + - 줄 저장 = 사용자 자재 `{코드, 이름, 규격, 단위, 수량}`(`Labor_Api.ts:139-145,177-183` · 서버 `M02_Labor_Doc.py:144-150` 다섯 칸만 — 모르는 칸 버림) · 덧칸 선례 = 로직 줄 `고름 {호표 차례: MT키}`(`:118,127,174-193` · 화면 `Labor_Api.ts:174`) · `승격`(134-1 · `:128` · 화면 `:175` · 참만 남김). + - M01 `관급` = 조달 단가 값 칸(구분 칸 아님 · 마스터 안 고침). +- 고칠 자리: + - 저장 꼴 — 사용자 자재 줄 덧칸 `자재구분`(일반 · 관급 · 사급) · `별도계상`(별도계상 · 직접계산) · `운반비`(포함 · 미포함) / 로직 자재 = 로직 줄 덧칸 `자재표시 {호표 차례: {세 칸}}`(`고름` 꼴 · [바꾸기]로 품목이 바뀌어도 차례 그대로). + - 서버 `M02_Labor_Doc.py:144-150` 세 칸 허용 값만 남김(그 밖 버림 · `승격` 꼴) · `:119-130` `자재표시` = 차례가 그 로직 재료 줄인 것 · 허용 값만(틀리면 버림 — 로직이 바뀌어도 저장이 안 막힘) · 머리 글 `:3-5` 문서 꼴 적음 · 금액 무관(셈 · 짝 `settle` 안 건드림). + - 화면 `Labor_Api.ts:124-145` 타입 · `:165-183` normalize 통과. + - 새 `M02_Labor_MatMarks.ts`(세 칸 정의 · 드롭다운 칸 · 글 칸 — `kindPick` 꼴 `Labor_Rows.ts:58-72` `createSelectField({compact})` · 줄 누름과 따로) → `Labor_Rows.ts:566-626` 칸 셋 · 머리 셋(단위 뒤 · 가격 앞 — 추정) · `RowHandlers`(:201-216)에 `mark?` / `Labor_LogicMats.ts:20-25,107-142` 칸 셋 · `mark` 손잡이. + - `Labor_Detail.ts:227-236` 손잡이 둘(화면 캐시만 · 다시 셈 없음 · `setPromote` `:374-378` 꼴). + - `Labor_Text.ts` 머리 · 선택지 글 · `Labor.css:202-214` 좁은 고르기 칸 규칙을 새 칸에 · 좁은 화면 `data-label`(`Labor.css:365-420` 언저리). + - 사본 · B08 · B09 = 고칠 것 없음 — `build_source` 가 층 문서를 날것으로 담아(`M02_Item_Source.py:142-148`) 세 칸이 사본 `일위대가.json` `줄.자재[]` · `줄.담은로직[].자재표시` 에 같이 실림 · 사본 셈 `with_values`(`M02_Item_Prices.py:268-286`)도 줄을 펼쳐 둠 · calc 답 `자재`(B08 `_folder_units` · B09 `combo` 가 읽는 것)엔 안 실림. + - B09 145 이음(한 줄): B09 관급 · 별도 표시 = 프로젝트 자재 키마다 하나(`B09_Estimation_Store.py:7,87-88` `supply` · 대가 안 0원 `B09_Estimation_Calc_Labor.py:44-45` · 자재대 · 관급자재대 `B09_Estimation_Calc_Bill.py:85-94`) · M02 세 칸 = 구조물 줄마다 → 사본에서 처음 값으로 읽을 수는 있음(관급 → 관급 · 별도계상 → 별도) · 같은 자재가 구조물마다 다르면 하나로 못 접음 · 엮는 작업 안 함. +- 재사용: `kindPick`(드롭다운 칸) · `_picks` 검사 꼴(차례 = 재료 줄) · 134-1 덧칸 길 통째(clean → normalize → 저장 왕복). +- 시험: 있는 것 = `test_m02_labor_promote_flag.py`(134-1 · 시험 다섯 꼴 그대로 본뜸) · `test_m02_labor_doc.py` · `test_m02_labor_logic_mats.py` · `test_m02_labor_calc_mirror.py`(금액 무관이면 그대로 통과) · `test_m02_card_shell.py`(카드 소스 검사) · `test_m02_item_labor.py:133` · `helper_m02_labor_normalize.cjs` · ui_checks `43-3_자재가격.js:52`(머리 글) · `44-6_일위대가_표.js` / 새 = `test_m02_labor_mat_marks.py`(clean 허용 값만 · 로직 자재 차례 재료 줄만 · 기준합 · 반영합 그대로 · 저장 왕복 · 화면 normalize 통과 · 사본 `일위대가.json` 에 실림). +- 위험: 표 칸 13 → 16 — 카드 갈래 좁음(표 감싸개 가로 스크롤) · `Labor_Rows.ts` 631줄 · `Labor_Detail.ts` 683줄(700 위험 — 칸 부품은 새 파일로) · 같은 묶음 `조사_A_M02모달.md` A4(로직 자재 줄 누름 = [옵션] 모달 · `Labor_LogicMats.ts` · `Labor_Detail.ts:227-232`)와 같은 자리 — 드롭다운 누름은 줄 누름과 따로(`stopPropagation`) · 프로젝트에서 세 칸을 바꾸는 길 없음(원본 층 값 · 필요하면 `입력값.json` 꼴 프로젝트 파일 — 추정 B09 몫). +- 크기: 중간. +- ⬜ 물음 5: 처음 값 — ① 빈 값(「—」 · 고를 때까지 안 적음) ② 일반 · 직접계산 · 포함 — 추천 ①(기본값은 사용자 협의 · 임의 확정 금지). +- ⬜ 물음 6: 금액 — ① 표시만(일위대가 금액 그대로 · B09 가 대가 안 0원으로 셈) ② 관급 · 별도계상 줄은 M02 반영합에서 뺌(짝 셈 `settle` `M02_Labor_Doc.py:340-362` ↔ `Labor_Calc.ts` + 거울 시험) — 추천 ①(원문 「구분할 때 사용」). + +## 고칠 파일 목록 +| 파일 | 요구 | 줄(지금 → 추정) | 700 위험 | +|---|---|---|---| +| 새 `M02_Material_Own.py` | B1 · B2 | 0 → ~100 | | +| `M02_Labor_Router.py` | B1(길 둘) | 103 → ~130 | | +| `M02_Labor_Doc.py` | B1(clean · 셈) · B3(clean) | 511 → ~550 | | +| `M02_Item_Source.py` | B1(사본 단가 묶음) | 160 → ~170 | | +| `M02_Item_Personal.py` | B1(개인에 저장) | 113 → ~120 | | +| `M02_MasterTemplete_Store.py` | B1(층 복사 `_server`) | 640 → ~648 | △ 가까움 | +| `M02_Material_Pick.ts` | B1(목록 · [신규 자재] · 입력 칸) | 77 → ~170 | | +| `Labor_Detail.ts` | B1(`own` 넘김) · B3(손잡이 둘) | 683 → ~695 | ⚠ A1 · A4 와 겹치면 넘김 — [자재 추가] 단추 만들기(:495-513)를 `M02_Material_Pick.ts` 로 덜어냄 | +| `Labor_Api.ts` | B3(타입 · normalize) | 268 → ~280 | | +| `Labor_Rows.ts` | B3(칸 셋 · 머리 · 손잡이) | 631 → ~645 | ⚠ 칸 부품은 새 파일 | +| 새 `M02_Labor_MatMarks.ts` | B3(칸 정의 · 드롭다운) | 0 → ~60 | | +| `Labor_LogicMats.ts` | B3(칸 셋 · 손잡이) | 144 → ~160 | A4 와 같은 파일 | +| `Labor_Text.ts` | B3(글) | 161 → ~170 | A1 · A3 · A5 와 같은 파일 | +| `Labor.css` | B3(좁은 칸) | 499 → ~510 | | +| `Structure.css` | B1(모달 단추 · 입력 칸 · 「개인」 표) | 296 → ~310 | | +| `CardHelp.ts` | B1 · B3(도움말 줄 · 선택) | 118 → ~120 | | +| 새 시험 `test_m02_material_own.py` · `test_m02_labor_mat_marks.py` | B1 · B2 · B3 | — | | + +안 고침: 공용 `ui_template_modal.ts`(B05 꼴로 끼움) · M01 파일 · `resources/master_data`(마스터 안 고침) · `master_keys.py` · B08 · B09(엮지 않음) · `Labor_View.ts`(손잡이 없으면 글) · `Labor_Calc.ts`(⬜6 ① 이면). diff --git a/docs/raw/요구_1009_2/조사_C_M02사전조합.md b/docs/raw/요구_1009_2/조사_C_M02사전조합.md new file mode 100644 index 000000000..1ea6d6c60 --- /dev/null +++ b/docs/raw/요구_1009_2/조사_C_M02사전조합.md @@ -0,0 +1,68 @@ +# 조사 C — M02 일위대가 사전조합 폴더 · 새 분류 (10-9 둘째 · 읽기 전용 조사 에이전트) + +파일 = `M02_MasterTemplete/` 아래 · 머리 `M02_MasterTemplete_` 생략 · 「추정」 = 코드 · 자료로 확인 못 한 판단 · 기준 = 랩탑 메인 HEAD 09b3b50ef · 지난 기록 = 134-3 · 134-5(`docs/raw/plans/2026-10-09_plan_134-145_M02_B05_B06_B07_B08_B09.md:6-20` · 조사 A 2 · 4절 · 분석_정함 134). + +## 0. 134 가 실제로 바꾼 것(diff 요약) +- 134-3 `66efaf283` — 제목 「일위대가 사전조합」 · 층 단추 따로(`UI_Page.ts:180-207` preScope · setPre = replaceState · preBar) · 명시 owner(`Api_Fetch.ts:74` `owned`) · 고름에 owner · canWrite(`UI_Main`) · 나무 = 그 층 문서 줄을 구분 › 상세구분 값으로 묶음(`UI_Side_Precombo.ts:82-100` `groupRows` · `:135-166` draw). +- 134-4 `2640fb4c6` — 기본 층 개인(`Layer.ts:64-65` `defaultRoot` · `UI_Page.ts:189`). +- 134-5 `484c92892` — 상세 머리 드롭다운 원천 = 구조물정의(`UI_Side_Precombo.ts:27-35` `precomboClasses` → `Labor_Detail.ts:562-606`) · 읽을 때 옛 「품셈」 값 = 빈 글(`M02_Labor_Ref.py:150-160` `filled`) · 새 문서 빈 값(`Library_List.ts:184-190`). +- 안 바꾼 것: 분류 목록을 나무 폴더로 그리기 · 폴더 안에서 만들기 · 옮기기 · 생성 때 분류 고르기 · 고르기 창 거름. +- 시험 = 새 분류 값이 든 가짜 줄로 묶음만 확인(`resources/tester/test_m02_precombo_scope.py:43-56`) · 실제 자료(전부 옛 값)로 보이는 모양은 안 봄 · 화면 검증 = 사용자 몫이라 실제 화면을 본 창 없음. + +## C1. 사전조합 폴더 구조가 안 보임 +- 현재: 나무 = 고른 층 목록(`UI_Side_Precombo.ts:183`)의 사전조합 줄을 그 값으로만 묶음 · 줄 0 = 「사전조합 없음」 글만(`:137-140`) · 빈 구분 = 「미분류」 폴더 하나 · 문서는 그 바로 아래(`:88-89` · `:141-149`) · 분류 목록(`precomboClasses`)은 나무에 안 씀(상세 드롭다운만). +- 자료(층마다 · 읽을 때 `filled` 뒤): + +| 층 | 파일 | 파일 값 | 화면 | +|---|---|---|---| +| 마스터 | `resources/master_template/precombo/SC-000001.json` 「테스트 사전조합」 | 구분 칸 없음 | 미분류 | +| 개인 1/10 | `storage/1/10/templates/precombo/SC-000001.json` 「2026_메쌓기」 | 건설품셈 공통 / 07장 돌공사 | 미분류 | +| 개인 1/10 | `storage/1/10/templates/precombo/SC-000002.json` 「ㅇㅈㅇ」 | 산림품셈 / 03장 작업장 관리 | 미분류 | +| 회사 1 · 3 · 개인 1/1 · 1/3 · 3/14 · 3/15 | precombo 폴더 없음 | — | 「사전조합 없음」 | + +- 원인: + - ① 폴더를 문서 값에서만 만듦 — 문서 없는 분류는 폴더 없음(공용 나무는 빈 폴더 `folder: true` 를 그림 `ui_template/ui_template_tree.ts:27-28,131 · 메뉴 칸 :26` · 안 씀). + - ② 있는 문서 3개가 모두 옛 품셈 · 빈 값 → 서버가 빈 글로(`M02_Labor_Ref.py:153-160` → 목록 줄 `summary` `:254-267` · `Router_Layers.py:284`) → 어느 층이든 「미분류」 하나 또는 「사전조합 없음」 · 실제 두 줄을 시험 헬퍼(Node)로 묶은 결과 = 미분류 › (SC-000001 · SC-000002) 하나뿐. + - ③ 폴더 안에서 만들기 · 옮기기 없음 — 새 문서 = 목록표(켜진 층 단추 다시 누름 · 숨은 길) [생성] → 늘 미분류 · 분류 바꿈 = 문서 열어 머리 드롭다운뿐. +- 고칠 자리(가장 작은 변경 · `UI_Side_Precombo.ts` 한 파일): + - `:82-100` `groupRows(rows, unsorted, classes = [])` — 분류 목록으로 자리 먼저 깜(군 차례 A~G · 상세 = 공통 + 종류 차례 · 빈 묶음) → 문서 넣음 → 목록 밖 지금 값(구조물정의가 바뀐 옛 값) 뒤에 · 미분류 맨 뒤(문서 있을 때만). + - `:135-166` draw — 분류 있으면 「없음」 조기 반환 안 함 · 빈 폴더 = `folder()`(`:126-133` 이미 `folder: true`) · 수 = 그 폴더 문서 수(지금 `children.length` = 하위 폴더 수가 됨) · 처음 펼침 = 문서 있는 폴더만 · 손으로 펴고 접은 것 기억(`closed` 대신 바꾼 것 집합). + - `:176-190` refresh — 분류 목록 한 번 받음(`fetchStructureDef` → `precomboClasses` 약속 보관 · 못 받으면 지금 모양) · `listTemplates` 와 함께 기다림. + - 화면(고친 뒤): 「A 횡단배수 ▸ … G 노면공 ▸ · 미분류 ▾ 2」 · 펼치면 「공통 · 배관 · BOX암거 …」 폴더 · 상세 머리에서 분류 고르고 [저장] → 그 폴더로 옮겨 보임(저장 → `onSaved` → `side.refresh` → 사전조합 나무 다시 그림 `UI_Main.ts:597` · 이미 이어져 있음). +- 재사용: `precomboClasses`(`:27-35`) · `fetchStructureDef`(`StructOptions/M02_SO_Api.ts:18` · 로그인 누구나 읽기) · 공용 빈 폴더 · `groupRows` 틀. +- 시험: `test_m02_precombo_scope.py` 새 경우(분류 + 줄 → 빈 분류 폴더도 차례대로 · 목록 밖 값 뒤 · 미분류 맨 뒤 · 수 = 문서 수) · `helper_m02_precombo_scope.cjs` 가 `classes` 넘김 · 옛 경우(분류 없음) 그대로 · `test_m02_precombo_class.py` 그대로. +- 위험: 폴더 수 = 군 7 + 하위 48(E 15) — 처음 접힘이면 7줄 · 꺼진 종류(B · F)도 폴더(134-5 규칙) · 「호환(기타)」 없음 · 구조물정의 판이 바뀌면 옛 이름은 목록 밖 폴더로(안 사라짐) · ui_checks 51-x 는 옛 단계(안 돌림). +- 크기: 작음(30줄 안팎 + 시험). +- ⬜ 물음 1: 폴더 = ① 분류 뼈대 고정 폴더(구조물군 › 공통 + 종류 · 빈 폴더도 · 옮김 = 분류 바꿈) ② 구조물 조합 같은 탐색기(사용자가 폴더 만듦 · 이름 · 끌어 옮김 · 서버 폴더 목록 · 나무 길 새로 · 옛 27-2b 나무 `git show ab84c763b^:M02_MasterTemplete/M02_MasterTemplete_Labor_Tree.ts`) — 추천 ①(C2 의 새 구분 · 상세구분이 곧 폴더 · 작음). +- ⬜ 물음 2: 폴더 오른쪽 클릭 [여기에 새 사전조합](그 구분 · 상세구분으로 생성 → 상세 엶 · `newLibrary` `Api_Fetch.ts:151` · 이름 창 = `Library_List.ts:145-173` `nameDialog` 내보내 씀 · 쓸 수 있는 층만 `scope.canWrite` · 공용 나무 `menu` 칸) — 추천 넣음(20줄 안팎 · 안 넣으면 새 문서는 늘 미분류에 쌓임). + +## C2. 사전조합 구분 · 상세구분 = 품셈 아닌 새 분류(기요청 · 확인 안 됨) +- 현재: 새 분류(구조물군 A~G › 공통 + 종류)는 코드에 있음 — 보이는 곳 = 사전조합 상세 머리 드롭다운 하나(`Labor_Detail.ts:562-606` · 정보 칸 `:625`) · 옛 문서는 「—」 · 펼쳐야 선택지 보임 · 못 고치는 층(마스터 = 시스템 관리자만 · 회사 = 회사 관리자만)은 드롭다운 잠김 → 선택지도 안 펼쳐짐(`:566-567`). +- 사용자가 구분 · 상세구분을 보는 자리: + +| 자리 | 지금 보이는 것 | +|---|---| +| 좌측 나무 | 「미분류」 하나 · 새 분류 폴더 없음(C1) | +| 목록표 구분 · 상세구분 칸(`Library_List.ts:110-113`) | 빈칸(읽을 때 옛 값 = 빈) | +| 상세 머리 드롭다운 | 「—」 · 펼치면 새 분류 | +| [로직 추가] 고르기 창 거름 — 구조물 조합 일위대가 · 사전조합 상세 둘 다(`Labor_Pick.ts:58-59,161-180,219-228`) | 단가산출 로직 품셈 분류(건설품셈 공통 · 산림품셈 › 장 · `/logic-lib/subs`) + 사전조합 값(지금 모두 빈 → 더해지는 것 없음 `:165`) · 일위조합 줄 작은 글 = 키만(`:116-118`) | +| 일위대가 표 구분 칸(`Labor_Rows.ts:384-393`) | 단가산출 줄 = 품셈 책 작은 글(로직 출처라 맞음) · 사전조합 줄 = 「일위조합」 | + +- 원인: 새 분류를 고른 문서 0개(파일 3개 모두 옛 값 · 생성 = 빈 값) + 분류가 나무 · 목록표에 안 그려짐 → 화면 어디에도 새 분류 이름이 안 보임 · 고르기 창 거름엔 품셈 분류만 남아 「사전조합도 산림 · 건설품셈」 으로 보임(추정 — 사용자가 본 자리 확인 못 함). +- 고칠 자리: C1 뼈대가 곧 새 분류 표시(따로 고칠 것 없음) · ⬜ 물음 2 를 넣으면 생성 때부터 새 분류 · 서버 · 상세 드롭다운 그대로. +- 옛 자료 이관: 필요 없음 — 코드로 파일 안 고침(규칙) · 읽을 때 이미 미분류(`filled`) · 품셈 장 → 구조물군 자동 짝 안 함(판단은 설계자 몫 · 「2026_메쌓기」 → 돌쌓기(메) 같은 짐작 금지) · 사용자가 상세 머리에서 골라 [저장] → 파일이 새 값으로 굳음(`M02_Labor_Ref.py:145`) · 대상 3개(마스터 1 = 시스템 관리자 · 개인 1/10 의 2) · 데스크탑 storage 는 따로라 모름(추정). +- 재사용: C1 그대로. +- 시험: C1 시험이 분류 원천까지 봄 · 고르기 창을 고치면(물음 3 ②) `Labor_Pick` 거름 Node 시험 새로. +- 위험: 분류를 고른 뒤 고르기 창 한 드롭다운에 품셈 분류와 새 분류가 섞임 — 거름은 맞게 걸러짐. +- 크기: 0(C1 에 딸림) · 고르기 창 따로 하면 작음. +- ⬜ 물음 3: 고르기 창 거름 — ① 그대로(사전조합 분류는 문서에 값이 생기면 같은 드롭다운 뒤에 붙음) ② 구분 태그(단가산출 · 일위조합)에 따라 거름 원천을 품셈 · 새 분류로 바꿈 — 추천 ①. + +## 고칠 파일 목록 + +| 파일 | 지금 줄 | 무엇 | 700 위험 | +|---|---|---|---| +| `M02_MasterTemplete/M02_MasterTemplete_UI_Side_Precombo.ts` | 198 | 분류 뼈대 · 수 · 처음 접힘 · (물음 2) 폴더 메뉴 | 없음(≈ 250) | +| `M02_MasterTemplete/M02_MasterTemplete_Library_List.ts` | 276 | (물음 2) `nameDialog` 내보냄 | 없음 | +| `M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts` | 161 | (물음 2) 메뉴 글 하나 | 없음 | +| `resources/tester/test_m02_precombo_scope.py` · `helper_m02_precombo_scope.cjs` | 88 · 54 | 뼈대 시험 | — | +| 안 고침 — `Labor_Detail.ts` · `M02_Labor_Ref.py` · 마스터 · 개인 자료 | 683 · 508 | — | `Labor_Detail.ts` 683 = 손대면 700 위험 | diff --git a/docs/raw/요구_1009_2/조사_D_제잡비단위.md b/docs/raw/요구_1009_2/조사_D_제잡비단위.md new file mode 100644 index 000000000..ade36bd0e --- /dev/null +++ b/docs/raw/요구_1009_2/조사_D_제잡비단위.md @@ -0,0 +1,87 @@ +# 조사 D — 일위대가 세부 항목 제잡비 「1식」 → % 표기 · 같은 꼴 % 줄 (10-9 둘째 · 읽기 전용 조사 에이전트) + +파일 = 저장소 루트 기준 · M02 파일 머리 `M02_MasterTemplete_` 생략 · 「추정」 = 코드 · 자료로 확인 못 한 판단 · 원문 요구 = `사용자요구_1009_2.md:21` · 견본 값 = 엔진을 읽기만 돌린 값(직경 60 · 빈 입력 = 자동값) · 마스터(`resources/master_data` 로직 · 표 · 엔진)는 안 고치는 안. + +## D1. 큰돌쌓기 찰쌓기 제잡비 — 금액은 맞고 표기만 「1식」 +- 현재(정의): 로직 GF000227 `resources/master_data/로직_산림품셈_13장_구조물.json:1136-1215` · 제잡비 = 덧줄 `{이름, 식, 비목, 출처}` 넷뿐(:1206-1213 · 단위 · 수량 칸 없음 · 틀 `resources/master_data/_틀.md:194,203`) · 식 = 「노무비 × 찾기(QF000444, 제잡비 비율, 직경, 단).수량 ÷ 100」 · 비율 표 QF000444 「제잡비 비율」 줄 단위는 「%」(`resources/master_data/소요량_산림품셈_13장_구조물.json:751-756` · 윗단 9 · 아랫단 3 · 단 = 물빼기파이프 중간값 로직 :1172). +- 현재(「식 · 1」 이 나는 곳 = 엔진): `resources/master_data/scripts/master_formula.py:638-658` — 덧줄마다 줄을 만들며 단위 「식」 고정(:651) · 수량 1(:652) · 단가 = 금액(:653-654) · 식이 비율인지 안 봄 → 로직 정의 · 화면 코드 아님. +- 현재(M02 펼침 서버): `M02_Labor_Router.py:47-56` → `M02_Labor_Doc.calc`(:383-425) → `run_line`(:428-445 · `mf.run` + 켜쌓기율 `layered` :210-229) → 엔진 `줄` 그대로 실음. +- 현재(M02 화면): 담은 로직 줄 누름 = 하위 행 `Labor_Rows.ts` `subRows`(:268-321) — 이름 = 엔진 `이름`(+ `출처` 괄호 :282) · 수량 = 엔진 `수량`(:283) · 단위 = 엔진 `단위`(:284) · 규격 칸 없음 · 금액 = `비목` + `금액` 위 기준 / 아래 × 위 줄 수량 ÷ 배(:285,308-316). 같은 부품 = 구조물 조합 상세 · 카드(B08 `B08_Quantity_UI_Drawing.ts:117` → `ItemCards` → `Labor_Detail`) · 면적산출 보기(`Labor_View.ts`). +- 견본: 설치 = 노무비 959,175.67 × 9 % = 86,325.81 · 설치 안 함 = × 3 % = 28,775.27 → 화면 지금 「제잡비 │ 1 │ 식 │ 경비 86,326」. +- 원문: 산림품셈 13-6-2 표 「제잡비 비율 │ │ % │ 9(9) … / 3(3) …」 · 주③ 「제잡비는 콘크리트 버켓 손료, 다짐기계 손료 비용이며 노무비의 합계액에 위 표의 비율을 곱한 금액을 상한으로 하여 계상한다. 또한 물빼기 파이프를 설치한 경우는 윗단의 값 …」(`resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md:55-56,62`) · 같은 꼴 13-6-1 1 %(:29,35) · 13-7-1 · 13-7-2(`13-07_큰돌붙이기.md:29,35,54,61`) · 13-2-3 6 %(`13-02_채집_및_세척.md:53,68`) · 9-20-1 9 %(`제09장_토공/9-20_뿌리다듬기_및_적재.md:35,40`) — 모두 단위 「%」. 지식DB `technical_info` 엔 제잡비 표기 근거 없음. +- 실무(기번3 `resources/knowledge/original/실무문서/2024년 간선임도(기번3-울진.대흥)(공통)/1. 설계원본/01 내역자료/2024년 간선임도사업(기번3).xlsx`): + - 일위대가표 칸 = 명칭 · 규격 · 수량 · 단위 · 합계/노무비/재료비/경비 단가 · 금액(r3-4) · % 줄 = 「공구손료 │ 인건비의 % │ 2 │ % │ 단가 13,037.6(= 밑수) │ 금액 260.7」(r18 · r27) · 「공구손료 및 잡재료 │ 노무비의 % │ 2 │ %」(r235). + - 중기사용료 = 「잡품 │ 주연료의 % │ 16 │ %」(r10) · 「잡재료비 │ 재료비의 % │ 23 │ %」(r106). + - 단가산출근거 = 머리 글 「잡재료비(바라선,전색재료등)(재료비의 5%)」 + 줄 「4,097.5 * 5 % = 204.8」(r19-21) · 「공구손료 : 15,069.6 * 2 % = 301.3」(r3100-3102). + - 영월 `…/05. 동부청 영월/내역서/2024년 임도시설사업2차(산불진화_기번6)-영월.xlsx` 큰돌메쌓기 산근 = 「공구손료 : 56,668.1 * 1 % = 566.6」(단가산출근거 r1905-1951). + - 「식 · 1」 로 적은 % 줄 = 없음 · 「제잡비」 낱말 = 훑은 6권(기번3 · 영월 · 봉화 · 거창 · 소광 · 계류보전) 모두 없음(「공구손료」 로 적음). + - 실무 꼴 = 규격 「○○의 %」 · 단위 「%」 · 수량 n · 단가 = 밑수 · 금액 = 밑수 × n ÷ 100. +- 원인: 엔진이 덧줄을 「돈 한 덩이」 줄로만 세움(`master_formula.py:651-654`) · 표의 「%」 는 식 안 수로만 쓰이고 줄까지 안 옴 · M02 · M01 화면이 그 수량 · 단위를 그대로 그림. 금액 셈은 원문대로. +- 고칠 자리(마스터 안 고침 · 금액 그대로 · 계산 자리 ③ 서버 단독): + - `M02_Labor_Doc.py` 도우미 하나 — 덧줄 식 나무가 「X × Y ÷ 100」 이면 Y 를 엔진 env(`mf.run` 답 `중간`)로 셈한 `율` + 밑수 글 `규격` 을 그 줄 덧칸으로 · 규격 = X 가 비목 합 이름 「노무비의 %」 · 인력 줄 합(LB 키만) 「인건비의 %」(B09 대가와 같은 말) · `줄.'이름'` 「이름의 %」 · 중간값 이름 「주재료비의 %」 · 그 밖 복합 = 빈 글 · 단위 「식」 · 수량 1 · 금액은 안 건드림 · `run_line`(:437-445)에서 부름(덧줄 줄 = 엔진 줄 중 호표 수 뒤 — `logic_mats` :456-459 · B09 `B09_Estimation_Labor_Source.py:100-103` 과 같은 가정) · 흐름 로직은 건너뜀. + - `Labor_Rows.ts` `subRows`(:281-286) — `율` 있으면 이름 「제잡비 (노무비의 %)」 · 수량 = 율 · 단위 「%」 · 금액 칸 그대로 · 타입 = `줄?: LogicLine[]`(`Labor_Calc.ts:39` ← M01 `CalcLine` `M01_MasterData/M01_MasterData_UI_Logic_Api.ts:82-95`)에 `율?` · `규격?`. + - 엔진 갈래를 뺀 까닭: `master_formula.py:648-658` 한 곳이면 M01 · M02 다 되나 `resources/master_data` 안(사용자와 함께만) · 880줄(700 넘음). +- 덧칸으로 두는 까닭: 옛 단가승격 `_promote`(`M02_Labor_Ref.py:392-400`)가 줄 수량 · 금액을 배로 나누고 `layered` 가 켜쌓기율로 곱함 → 수량 칸에 율을 넣으면 9 % 가 0.9 % · 8.1 % 로 바뀜 · 덧칸 `율` 은 그대로(지금 「1 식」 이 「0.1 식」 · 「0.9 식」 로 보일 흠도 사라짐 · 켜쌓기 대상 GC000260 · GC000261 은 덧줄 없어 지금은 안 드러남). +- 확인(읽기만 돌림): 「X × Y ÷ 100」 599 줄 중 Y 가 비목 합 · 줄 · 덧줄을 쓰는 줄 0 → 마지막 env 로 셈해도 정확 · 시험입력으로 도는 로직의 율 556 줄 모두 셈 됨(못 돈 50 줄 = 설계 입력이 있어야 도는 로직) · GF000227 설치 9 · 안 함 3 · GF000226 1 · GF000213 6 · GC000198 2(인건비) · GC000206 9(인건비) · GC000267 잡재료비 22(재료비) · 기계손료 = 「식」 그대로. +- 시험: 새 `resources/tester/test_<절>_pct_extra.py` — `run_line` GF000227 두 갈래 율 9 · 3 · 규격 「노무비의 %」 · 금액 전과 같음 · GC000198 「인건비의 %」 2 · GC000267 기계손료 율 없음 · B09 산근 줄(D3) / 다시 돌림 = `test_m02_labor_doc.py` · `test_m02_labor_layer.py` · `test_m02_labor_ref.py` · `test_m02_labor_logic_mats.py` · `test_145_1_b09_sangeun.py` · `test_145_2_b09_labor_calc.py` · `test_145_5_b09_summary.py` · `npm run typecheck`. +- 위험: 저장본 `계산값`(`M02_Labor_Doc.py:502-511`)엔 덧칸 없는 옛 줄 — 화면은 열 때마다 새 calc 로 그림(`Labor_Detail.ts:252-254`) · 저장본은 합(금액)만 씀 → 옮길 자료 없음 · 같은 묶음 조사 B(B3 자재표 칸 · clean)가 `Labor_Rows.ts`(631 → ~645) · `M02_Labor_Doc.py`(511 → ~550)를 고침 — 다른 함수 · 합쳐 ~650 · ~575. +- 크기: 작음. + +## D2. 같은 꼴 — 마스터 덧줄 645 줄(로직 562) 전수 +- 모두 지금 「식 · 1」(M01 시험계산 표 · M02 하위 행 · B09 산근) · B09 대가 탭만 이미 %. +- 「X × Y ÷ 100」 599 줄 = % 줄 → D1 도우미로 한꺼번에: 밑수 인건비(인력 줄 합) 407 · 노무비 85 · 재료비 54 · 중간값(주재료비 · 드릴경비 · 브레이커경비 · 가공노무비 · 인력비) 34 · 복합 16(규격 빈칸) · 호표 줄 3. +- 남는 46 줄 = 금액 식 43(기계손료 30 · 예취기 · 분무기 · 양수기 · 드론 · 동력분무기 · 파쇄기 · 집게 · 브레이커 손료 · 도료 · 희석재 · 소모성경비 — 비율 아님 → 「1식」 맞음) + 조건부 % 3(「만약(…, 노무비 × n ÷ 100, 0)」 GF000159 정착기구손료 · GF000177 성토부할증 · GC000111 리퍼 기계경비 → 「식」 그대로 · 풀려면 만약 안까지). +- 마스터 템플릿 일위대가가 담은 % 줄 = 6(아래 표 ★). +- M01: 「읽는 식」 은 이미 「… / 100」 → 「… %」(`resources/master_data/_화면_계약.md:62`) · 시험계산 표만 「1 식」(`M01_MasterData/M01_MasterData_UI_Logic_Calc.ts:242` ← `M01_MasterData/M01_MasterData_Store.py:556-561` 엔진 줄 그대로). + +## D3. B08 · B09 사본 · B09 일위대가표 · 산근 탭 +- 사본(`M02_Item_Snapshot`): 일위대가 문서 · `단가.json` · 입력값 · 고른자재 · 면적만 둠 · 줄은 셈 때마다 `M02_Item_Prices.calc`(:289-317) → `M02_Labor_Doc.calc` → `run_line` → D1 고침이 사본 · B08 카드에 그대로 · 저장된 줄 없음. +- B09 일위대가표(대가): 이미 실무 꼴 — 덧줄 → `pct` · 규격 「노무비의 %」 · 단위 「%」 · 수량 = 금액 ÷ 밑수 × 100(`B09_Estimation/B09_Estimation_Labor_Source.py:124-133` · `_base_of` :291-299 · `_engine_bases` :276-288) · 단가 = 밑수 · 금액 = ROUNDDOWN(밑수 × % ÷ 100, 1)(`B09_Estimation/B09_Estimation_Calc_Labor.py:93-103`) → 안 바꿈 · 중간값 · 복합 밑수 덧줄은 대가에서 빈칸(:128-130 · 따로). +- B09 중기사용료: 이미 「잡품 │ 주연료의 % │ %」(`B09_Estimation/B09_Estimation_Calc_Base.py:230`). +- B09 산근: 「식 · 1」 + 규격 = 식 원문 글(「찾기(QF000444, …)」 가 그대로 보임 · `B09_Estimation/B09_Estimation_Sangeun.py:316-337` · :321-322 · 화면 `B09_Estimation/B09_Estimation_UI_Tabs_Sangeun.ts:85-108`) → 고칠 자리: 같은 도우미로 X(밑수) · Y(율)를 산근 env 로 셈 → 규격 「노무비의 %」 · 수량 = 율 · 단위 「%」 · 단가 = 밑수(대가 탭과 같은 꼴) · 줄 금액 = 지금처럼 식 전체 셈 ROUNDDOWN 1 · `kind: extra` 그대로 → 집계(145-5)는 % 줄을 뺌(`B09_Estimation/B09_Estimation_Summary.py:133-153`) · 산근 줄 `price` 를 읽는 곳 = 산근 탭뿐(`price_of` 는 블록 합 :72-77) · 금액 그대로 · 「X × Y ÷ 100」 아닌 줄은 지금 그대로. +- 금액: M02 · B08 · B09 모두 안 바뀜(덧칸 · 표기만). + +## 곁 발견(D1 밖 · 안 고침) +- 제잡비 밑수: 엔진 「노무비」 = 노무비 비목 합 → 굴착기 줄 운전사 노무비(견본 259,688.92)까지 듦 · 실무는 인력 줄 노무비만 밑수(영월 큰돌메쌓기 56,668.1 = 작업반장 + 특별인부 + 보통인부 · 굴삭기 노무비 19,606.4 뺌 r1916-1939 · 기번3 「인부임 소계 15,069.6 × 2 %」 r3092-3102 · 일위대가표 r16-18 크레인 노무비 뺌) → 설치 9 % 견본 86,325.81 대 62,953.81(10㎡당 23,372 차이) · 원문 「노무비의 합계액」 해석 갈림(추정) · 대상 = 13-6-1~3 · 13-7-1~2 · 13-2-3 의 「노무비 ×」 제잡비 · 마스터 로직 몫(사용자와 함께). +- B09 산근 인건비 꼴 % 밑수 = 식 속 LB 키를 사본 `단가.json` 노임으로 셈(`Sangeun.py:333`) · B09 대가 밑수 = B09 노무비목록표 단가(`Calc_Labor.py:57-67`) → 두 탭 % 금액이 다를 수 있음(추정). + +## ⬜ 물음 +- ⬜ 물음 1: M01 시험계산 표(「1 식」)도 — ① 같이(라우터 `post_calc` `M01_MasterData/M01_MasterData_Router.py:230-237` 에서 같은 도우미를 늦게 불러 덧칸 · 화면 :242 한 줄 · M01 → M02 늦은 부름 선례 `M01_MasterData_Store_Cache.py:226` · `M01_MasterData_Store.py` 700줄은 안 건드림) ② M02 · B09 만 — 추천 ①. +- ⬜ 물음 2: 곁 발견 제잡비 밑수 — ① 이번엔 표기만 · 밑수는 PLAN 에 사용자 확인 거리로 ② 지금 같이 정함(마스터 로직 6줄) — 추천 ①. + +## 같은 꼴 로직 목록 +| 로직 | 줄 이름 | 지금 단위 · 수량 | 고친 뒤 규격 · 수량 · 단위 | 원문 표기 | +|---|---|---|---|---| +| GF000227 큰돌쌓기 찰쌓기 | 제잡비 | 식 · 1 | 노무비의 % · 9(설치) / 3 · % | 13-6-2 「제잡비 비율 % 9(9) / 3(3)」 · 주③ 노무비 합계액 × 비율(상한) | +| GF000226 큰돌쌓기 메쌓기 ★ | 제잡비 | 식 · 1 | 노무비의 % · 1 · % | 13-6-1 「% 1(1)」 · 주③ | +| GF000228 친환경 큰돌쌓기 | 제잡비 | 식 · 1 | 노무비의 % · 9 / 3 · % | 13-6-3 「% 9(9) / 3(3)」 · 주③ | +| GF000229 큰돌붙이기 메붙이기 | 제잡비 | 식 · 1 | 노무비의 % · 1 · % | 13-7-1 「제 잡비 비율 % 1(1)」 · 주③ | +| GF000230 큰돌붙이기 찰붙이기 | 제잡비 | 식 · 1 | 노무비의 % · 11 · 11 · 12 / 3 · % | 13-7-2 「% 11(11) · 12(11) / 3」 · 주③ | +| GF000213 큰돌 채집(기계) ★ | 제잡비 | 식 · 1 | 노무비의 % · 6 · % | 13-2-3 「제 잡비 비율 % 6」 · 주⑤ | +| GF000128 뿌리다듬기 | 제잡비 | 식 · 1 | 노무비의 % · 9 · % | 9-20-1 「제잡비율 % 9」 · 주③ | +| GC000198 레디믹스트콘크리트 타설 ★ | 공구손료 및 경장비 | 식 · 1 | 인건비의 % · 2 · % | 건설 공통 6-1-1 주④ 「인력품의 2%」(`…/제06장_철근콘크리트공사/6-01_콘크리트.md:48`) | +| GC000206 철근 현장가공 ★ | 공구손료 및 경장비 | 식 · 1 | 인건비의 % · 9 · % | 6-2-2 주② 「인력품의 9%」(`6-02_철근.md:56`) | +| GC000207 철근 현장조립 ★ | 공구손료 및 경장비 | 식 · 1 | 인건비의 % · 2 · % | 6-2-3 주③ 「인력품의 2%」(`6-02_철근.md:79`) | +| GC000214 유로폼 설치 및 해체 ★ | 공구손료 및 경장비 | 식 · 1 | 인건비의 % · 3 · % | 6-3-3 주③ 「인력품의 3%」(`6-03_거푸집.md:199`) | +| GF000327 · GF000235 · GF000245(13장 · 아래 꼴 수에 듦) | 잡재료 · 잡재료 · 공구손료 및 경장비 | 식 · 1 | 재료비의 % · 빈칸(복합) · 인력비의 % | 13-10-2 주⑨ · 13-11-4 · 13-16-1 주⑦ | +| 그 밖 인건비 꼴 403 | 공구손료 및 경장비 322 · 공구손료 및 잡재료비 18 · 공구손료 12 · 부속장비 10 · 소모자재 손료 10 … | 식 · 1 | 인건비의 % · n · % | 「…의 기계경비는 인력품의 n%로 계상」(예 `…/제07장_돌공사/7-04_석재판_붙임.md:33`) | +| 그 밖 노무비 꼴 78 | 공구손료 및 경장비 62 · 잡재료비 · 기구손료 · 공장관리비 … | 식 · 1 | 노무비의 % · n · % | 「노무비의 n%」 | +| 재료비 꼴 54 | 잡품 25 · 잡재료비 11 · 잡재료 4 · 설치비 4 … | 식 · 1 | 재료비의 % · n · % | 「재료비의 n%」 · 기계 잡품 = 실무 「주연료의 %」 | +| 중간값 꼴 34 | 잡재료 및 소모재료 16 · 소모자재(크롤러드릴) 7 · 소모자재(대형브레이커) 3 · 소모재료(치즐) 2 … | 식 · 1 | 주재료비 · 드릴경비 · 브레이커경비의 % · n · % | 「주재료비의 n%」 · 「기계경비의 n%」 | +| 복합 꼴 16 | 잡재료 3 · 유압식 리퍼 2 · 소모자재 2 · 부자재(GF000210) … | 식 · 1 | 빈칸 · n · % | 「… n%」 | +| 호표 줄 꼴 3 | 잡품(GF000002 · GF000056 · GF000076) | 식 · 1 | 휘발유(체인톱)의 % · n · % | 산림 2-1-1 주⑤ 잡품 비율 | +| 금액 식 43 | 기계손료 30 · 손료류 10 · 도료 · 희석재 · 소모성경비 | 식 · 1 | 그대로 식 · 1 | 손료계수 × 가격 등(비율 아님) | +| 조건부 % 3 | 정착기구손료 · 성토부할증 · 리퍼 기계경비 | 식 · 1 | 그대로 식 · 1 | 「(조건이면) 노무비의 n%」 | + +★ = 마스터 템플릿 일위대가(`resources/master_template/labor/item1 · item1_2 · item3_2 · item3_3.json`)가 담은 로직. + +## 고칠 파일 목록 +| 파일 | 할 일 | 줄(지금 → 추정) | 700 위험 | +|---|---|---|---| +| `M02_MasterTemplete/M02_Labor_Doc.py` | 덧줄 % 도우미(`율` · `규격` 덧칸) · `run_line` 에서 부름 | 511 → ~535 | 조사 B 와 합쳐 ~575 | +| `M02_MasterTemplete/M02_MasterTemplete_Labor_Rows.ts` | `subRows` 표기(이름 괄호 규격 · 수량 = 율 · 단위 %) | 631 → ~636 | 조사 B 와 합쳐 ~650 | +| `M01_MasterData/M01_MasterData_UI_Logic_Api.ts` | `CalcLine` 에 `율?` · `규격?`(M02 하위 행도 이 타입) | 그대로 +2 | | +| `B09_Estimation/B09_Estimation_Sangeun.py` | `_extras` 규격 · 수량 · 단위 · 단가(밑수) · 금액 그대로 | 377 → ~387 | | +| `M01_MasterData/M01_MasterData_Router.py` · `M01_MasterData/M01_MasterData_UI_Logic_Calc.ts` | (⬜1 ① 이면) `post_calc` 덧칸 · 표 :242 표기 | 322 → ~330 · 307 → ~310 | | +| 새 `resources/tester/test_<절>_pct_extra.py` | M02 · B09 % 줄 시험 | 0 → ~50 | | +| 안 고침 | `resources/master_data/**`(로직 · 표 · 엔진) · `B09_Estimation_Labor_Source.py` · `B09_Estimation_Calc_Labor.py` · `B09_Estimation_Calc_Base.py`(이미 % 꼴) · 저장 자료 | | | diff --git a/docs/raw/요구_1009_2/조사_E_B06화면모달.md b/docs/raw/요구_1009_2/조사_E_B06화면모달.md new file mode 100644 index 000000000..6f74fd5c8 --- /dev/null +++ b/docs/raw/요구_1009_2/조사_E_B06화면모달.md @@ -0,0 +1,119 @@ +# 조사 E — B06 화면 · 모달(가로 개수 · 단추 자리 · 선 치수 2행 · [상세] 크게 · 표 ↔ 그림 · 밖 누름 · 연결창 크기) (10-9 둘째 · 읽기 전용 조사 에이전트) + +약칭: B6 = `B06_Section\B06_Section_` · SV `UI_Section_View.ts`(566) · CO `UI_Section_Columns.ts` · DT `UI_Cross_Detail.ts`(260) · DTC `UI_Style_Cross_Detail.css` · DP `UI_Cross_Design_Pick.ts`(358) · CT `UI_Style_Cross_Controls.css` · AR `UI_Style_Cross_Areas.css` · CV `UI_Cross_View.ts`(675 · 이번엔 안 만짐) / MD `ui_template\ui_template_modal.ts` · MDC `ui_template\ui_template_modal.css` · PK `ui_template\ui_template_item_picker.ts` · PKC `…_item_picker.css` · ASK `…_item_picker_ask.ts` / EC `B07_DesignDetail\B07_DesignDetail_Engine_Cad.py`(613) · ET `…_Engine_Cad_Table.py` · ES `…_Engine_Cad_Sheet.py` / T `resources\tester\` · 「추정」 = 화면 실측 · 실행으로 확인 못 한 판단. + +## E1. 횡단도 가로 개수 — 기본 3 · 왼쪽 라벨 +- 현재: 138-3 열 수 칸 = 고정 알림 줄 오른쪽 끝 숫자 칸(SV:126-144 · 공용 `createInputField` compact · 1~6) · 보이는 이름 없음 — 툴팁 「한 줄 카드 수(1~6)」만(SV:135 · `ui_template\ui_template_locale_b2.ts`:476) · 값 = 보기 설정 pref `cross-columns`(`A00_Common\b_page_state.ts`:100 · 브라우저 + 계정). +- ⚠ 흠(Node 로 돌려 확인): 저장값 없으면 `readStateRaw` = null → `clampCrossColumns(null)` = **1**(`Number(null)` = 0 → 1~6 으로 묶임 · CO:15-20) → 처음 여는 사용자는 1열 · 기본 3 은 undefined · 빈 글일 때만 · 시험은 undefined 만 넣어 못 잡음(T`helper_138_cross_columns.cjs`:19 · T`test_138_cross_columns.py`:28-29). +- 고칠 자리: CO:17 null 도 「못 읽음」 → 3(한 줄) · SV:127-133 `label` 곁값 = 왼쪽 라벨(글 = 기존 글쇠 `B06_Cross_Columns` 글을 「가로 개수」로 고쳐 씀 · 새 글쇠 안 만듦) · 툴팁 그대로 · B6`UI_Style_Cross.css`:149-153 칸을 가로로 눕힘(라벨 nowrap · 입력 4.5em · 오류 칸 숨김 · 폭 auto). +- 재사용: `createInputField({label})`(`ui_template\ui_template_elements.ts`:62-127 · 기본 세로 `ui_template_elements_styles.ts`:86) · 가로 눕힘 선례 `.b06-profile__field-row`(B6`UI_Style.css`:65-96). +- 시험: helper_138 clamp 목록에 null → 3 · test_138 기대값 한 칸. +- 위험: 사용자가 직접 고친 저장값은 그대로(지우기 없음) · 라벨만큼 알림 글 칸 폭 줆. +- 크기: 작음. + +## E2. 모달 [닫기] · [확인] · [관리 화면에서 고치기] → 오른쪽 위 +- 공용 겉틀: MD:20-52 머리 = 제목 h3 + [닫기] 하나(MD:30-36 · MDC:29-34 space-between) → 머리 단추 칸 · 곁값 없음 · 선례 = B05 노선 추천이 머리 [닫기]를 자기 [적용] · [닫기] 묶음으로 갈아 끼움(`B05_Profile\B05_Profile_UI_RouteEdit_Recommend.ts`:159-161 · 176-179 · 293-297 · 77-3). +- B05/B06 에서 뜨는 창 전수: + +| 창 | 지금 아래 단추 | 파일:줄 | +|---|---|---| +| 구조물 조합 고르기(연결창) | 안내 글 + [개인용으로 복사] [관리 화면에서 고치기] [해제] [적용] | PK:148-151 · 311-321 · 357 · PKC:231-235 · 261-266 | +| 고르기 안 글 묻는 창(개인에 저장 · 나무 오른쪽 클릭 새 항목) | [취소] [확인 / 만들기] + 머리 [닫기] | ASK:76-93 ← `ui_template_item_picker_detail.ts`:262-275 · PK:284-295 | +| 고르기 일위대가 카드(읽기 전용)에서 여는 M02 창 셋(입력 · 수량산출 · 참조) | 읽기 전용 = 아래 [닫기](머리 [닫기]와 둘) · 편집 = [취소] [확인] | `M02_MasterTemplete\M02_MasterTemplete_Labor_Input.ts`:22-37 · `_Labor_QtyModal.ts`:162-171 · `_Labor_RefEdit.ts`:101-104 ← `_Labor_Detail.ts`:313-319 · 406-412 · 434-437 | +| 횡단 [상세] | 머리 [닫기]만 — 고칠 것 없음 | DT:172-176 | +| 노선 편집 · 노선 추천 | 이미 머리 — 그대로 | `B05_Profile_UI_RouteEdit_Chrome.ts`:49-90 · 추천:293-297 | + +- 확인 창 `showConfirmDialog`(`ui_template_elements.ts`:317-345 · 머리 없는 작은 물음 · [취소] [확인])은 범위 밖(추정). +- 고칠 자리: MD 곁값 `actions`(머리 [닫기] 왼쪽 · 넘긴 창만 바뀜) + MDC 한 줄(제목 margin-right auto) · PK = 단추 넷 → `actions`(편집 화면 숨김 PK:330 · 340 그대로 · 안내 글은 아래 남김) · ASK = [확인]만 머리 · [취소] 지움(머리 [닫기] = 취소) · M02 창 셋 = 아래 [닫기] 지움 · [확인] 머리. +- 공용 일괄이면: MD 부르는 파일 23(B01 지식챗 · B05 추천 · B06 상세 · B07 평면도 관리 · B08 구조물도 · M01 둘 · M02 12 · 시트 조건 · 설명서 · 고르기 둘) · 몸 아래 [확인]류 단추 창 열 곳 넘음(M02 나무 · 서고 · 도면 · 시트 조건 등 · 추정) → 곁값(opt-in) 추천. +- 시험: 새 소스 시험(곁값 → 머리에 단추 · 안 넘기면 지금 꼴 · 고르기 머리 단추 넷 · ASK [취소] 없음) · T`test_modal_top_and_add_word.py` · T`test_item_picker_detail.py` 통과 확인. +- 위험: 고르기 [수정] 편집 화면에서 머리 단추 숨김이 빠지면 편집 중 [적용] 눌림 · 노선 추천 갈아 끼우기와 두 길 공존(옮김은 뒤로) · **M02 요구 「수량산출 창 닫기 둘 · 확인은 상단 닫기 좌측」과 같은 파일**(MD · Labor 셋) — 한 창이 한 번에. +- 크기: 작음~중간. +- ⬜ 물음: 범위 — ① B05/B06 에서 뜨는 창(고르기 · 글 묻는 창 · M02 카드 창 셋 = M02 요구와 한 벌) ② 공용 모달 전부 일괄 → 추천 ①. + +## E3. 보라 선 치수 → 2행 +- 현재(137-2): 고른 조각 치수 한 줄 「사면길이 3.61m · 수평 3.00m · 높이 2.00m · 1:1.50」 + 「· 노견 +0.3m」(DP:208-215 · 347-355) · 칸 `span.b06-cross-card__line-dims`(DP:319-323) + [◀ ▶](DP:324-342) · 줌 막대 맨 앞(CV:662-663) · 막대 = 그래프 오른쪽 위 고정(CT:214-224) · 칸 `white-space: nowrap`(CT:227-234) → 왼쪽으로만 늘어 면적표(absolute top 8 · left 58 · AR:14-26)를 덮음. +- 고칠 자리: DP `pieceLabel` 두 줄(1줄 = 길이 · 구배 · 2줄 = 수평 · 높이 · 노견은 2줄 끝 · 줄바꿈 글자) · CT 글 칸 `white-space: pre-line` · 오른쪽 맞춤 · 막대 세로 가운데. +- 재사용: 칸 · 막대 · 자리 그대로. +- 시험: T`test_137_design_pick.py`:60-61 기대 글 두 줄로 · :86 · :102 그대로. +- 위험: 3열 400 px 카드는 두 줄도 표에 닿을 수 있음(표 오른쪽 끝 ≈ 280 px · 줌 66 px · ◀▶ 44 px — 추정) · ◀▶ 는 다른 요구(「버튼 삭제 · 이동 패널」)가 지움 = 같은 칸 · DP 같은 파일. +- 크기: 작음. +- ⬜ 물음: 2행 뜻 — ① 치수 글 두 줄 · 단추 옆 그대로 ② 1줄 = 단추 · 2줄 = 치수(단추 아래) → 추천 ①(폭 반). + +## E4. [상세] 모달 — 스크롤 없이 크게 · 글 = B07 표 위 글 +- 현재(138-4): 자리 = 카드 안 가리는 쪽 · 폭 360~720 px · 높이 = 남는 화면(DT:65-108 `place`) · 넘치면 창 스크롤(DTC:22-26) · 몸 = 글 칸(맨 위 · 「구조물 메모 — 이 측점에 남길 글」 DT:179-184) → 카드 SVG 복제(DT:185-186 · 194-199 · 폭 100% 높이 auto DTC:55-59) → 수량표(DT:187-189 · 217). +- 글 길: 세션 초안 `structure-notes`(DT:37-63 · `b_page_state.ts`:109) → [저장] patch(B6`UI_Page_Persist.ts`:394) → `structure_note` 2000자(B6`Schema.py`:201) → 재계산에도 남음(B6`Router_Design.py`:155-156) → **B07 · B08 · B09 아무도 안 읽음(grep 0) = 지금은 메모일 뿐**. +- B07 지금: 한 블록 = 단면 → 8 mm → 수량표(제목행 「No.x」 한 칸 · EC:556-567 · ET:181-182) · 장 배치 · 단건 모두 같은 함수에 설계가 실려 옴(ES:157-182 ← `B07_DesignDetail_Router_Support.py`:362-384 · 단건 :537-562) → 글은 와 있으나 안 그림. +- 고칠 자리(화면): DT `place` · 투명 막 지움(E6) → 가운데 큰 창(E7) · 몸 순서 = 그림(위 · 남는 높이 채움 · SVG 100% × 100% · viewBox 그대로라 비율 유지) → 글 칸(표 바로 위 · 이름 「B07 횡단도 표 위 글」) → 수량표(아래 고정) · 창 넘침 없음. +- 고칠 자리(B07): `build_cross_drawing`(EC:488-) 설계 `structure_note` 줄마다 Text(표 왼쪽 맞춤 · 글자 2.0 mm · 표를 줄 수만큼 내림) · 헬퍼 = ET(328줄)에 두고 EC 는 부르기만 · id = uuid5 `{도면}:note:{n}`(값 칸 id `:qtable:` 과 안 겹침) · `section_block_size`(ES:60-94 · :92-93) 같은 규칙 · 테두리 · `cross_placements.frame` 은 저절로 감쌈. +- 재사용: `_text_entity`(EC:151-182) · 글 저장 길 그대로 · B06 수량표 POST 그대로(B6`Router_CrossTable.py`). +- 시험: 새 B07 시험(글 두 줄 → Text 둘 · 표 윗변 내려감 · 블록 높이 같은 만큼 · 글 없으면 지금과 같음) · T`test_b07_cross_sheet_pad.py` · `test_140_b07_cross_grid.py` · `test_b07_cross_overlay_extent.py` · `test_138_cross_detail.py` 통과 확인. +- 위험: B07 확정 장 = 저장본 그대로 — 글 고친 뒤 확정 풀어야 보임 · 줄바꿈 = 사용자가 친 대로(표 폭 108 mm 넘는 줄은 넘침 · ponytail 한계) · 4×4 칸에서 블록이 커지면 이웃과 겹칠 수 있음(배치로 고침) · [초기화]는 초기값에 글이 없어 지움(추정) · EC 613줄 · 「상세화면의 위에 더 크게」 = 그림을 창 맨 위에 크게로 읽음(추정). +- 크기: 중간(화면 작음 + B07 엔진 작음). +- ⬜ 물음: B07 글 자리 — ① 표 바로 위 글 줄(여러 줄 · 표 왼쪽 맞춤) ② 표 제목행 「No.x」 오른쪽 한 줄 → 추천 ①. + +## E5. [상세] 표 항목 누름 → 그림 강조 +- 짝 키: 지금 없음 — 표 칸에 키 꼬리표 없음(DT:121-144 · 키는 `layout` 에 있음 B6`Router_CrossTable.py`:44-60) · 그림 = 카드 SVG 복제(이벤트 없음 · 클래스만 남음). +- 그림 쪽 재료: + +| 표 칸(키) | 그림 요소(복제 안) | 강조 꼴 | +|---|---|---| +| 깍기 토사 · 암석(cut_soil · cut_rock) · 쌓기(embankment) | `g.b06-chart__area--cut_soil · --cut_rock · --fill`(늘 깔림 · 평소 투명 B6`UI_Cross_Areas.ts`:223-226 · CV:409-420) | 있음 `.is-active`(AR:104-134) | +| 사토장(spoil_fill) | `polyline.b06-chart__spoil-fill`(B6`UI_Cross_SpoilFill.ts`:72-75) | 새로 | +| 면고르기 · 지장목 · 파종 · 살포 · 층따기(사면 길이) | 보라 판정 선 `b06-chart__design-hit`(DP:304-317) + 구역 cut/fill(DP:61-93) — 판정 선에 구역 꼬리표 없음 · 층따기는 성토 사면으로 대신(추정) | 있음 `.is-active`(AR:150-162) | +| 측구 토사 · 암석 | 측구 조각 — 구역 판정이 측구를 cut 에 섞음(DP:79-82) | 측구 표시 한 칸 더 | +| 노면다짐 | road 구역 판정 선(값은 늘 빈칸) | 있음 | +| 지반고 · 계획고 · 성토고 · 절토고 | 중심 십자 `g.b06-chart__center`(B6`UI_Cross_View_Frame.ts`:42) | 새로 | +| 편책 · 제근 · 표토제거 | 없음 — 늘 빈칸(`B07_DesignDetail_Engine_Cross_Quantity.py`:26-31) | 누름 없음 | + +- 고칠 자리: DT `buildQuantityTable` 값 칸 · 이름 칸 `data-key` · 키 → 선택자 짝 표(상수 하나) · 표 누름 위임 → 복제 안 `.is-active` 갈아 끼움 · paint 때 카드에서 묻어 온 `.is-active` 지우고 고른 키 다시 · DP:310 판정 선에 `data-zone` · `data-side`(+ 측구 · 구조물 트림) 꼬리표 · DTC 고른 칸 · 새 강조 둘. +- 재사용: 면적 띠 · 판정 선 강조 CSS · 구역 함수(137-2). +- 시험: T`helper_137_design_pick.cjs` 에 판정 선 꼬리표 확인 · 새 짝 표 시험(키 22 모두 짝 또는 「없음」 명시). +- 위험: 사면 칸 값(파이썬 `station_slope`)과 TS 구역 조각이 같은 면인지 미확인(추정) · 구조물 트림 선 = fill 구역(꼬리표로 뺌) · 구조물에 가린 조각은 판정 선 없음 → 일부 안 보임. +- 크기: 작음~중간. + +## E6. 모달 밖 누르면 닫힘 +- 현재: [상세] 막 = 투명 + `pointer-events: none`(DTC:16-20 · DT:176) → 공용 「막 누름 = 닫기」(MD:44 · 막 자체를 누를 때만)가 안 걸림 · 닫기 = [닫기] · Esc 뿐. +- 고칠 자리: E4 「횡단도 가려도 됨」 → DT `backdropClass` · DTC 투명 막 규칙 지움 = 공용 막(어둡게 · 누르면 `beforeClose` 정리 뒤 닫힘) — 새 코드 없음. +- 대안: 투명 막 유지 + 문서 pointerdown(캡처)로 밖이면 닫음(누름은 아래 카드로 통과) · 공용 장부 `enterMenu`(`ui_template\ui_template_context_menu.ts`:42-80) 재사용. +- 시험: 소스 시험 한 줄(투명 막 없음 · 공용 막). +- 위험: 공용 막은 밖 누름이 닫기만(아래 카드 고름 안 됨) · E7 크기면 밖 = 가장자리 띠뿐. +- 크기: 작음. + +## E7. 구조물 조합 연결창 크게 · [상세]도 같은 크기 +- 현재: 연결창 = 고르기 `dialogClass: "ui-item-picker"`(PK:345-348) · 폭 min(1320 px, 96vw) · `--modal-max` 94vh · 몸 높이 min(80vh, 800 px)(PKC:3-10) → 1080p 에서 1320 × 800(몸) · 공용 기본 min(720 px, 92vw) · 높이 max 80vh(MDC:13-27) · [상세] 360~720 px(DT:67-69). +- 공용 크기 곁값: 없음 — 창마다 CSS · `--modal-max` 변수만 공용. +- 고칠 자리: MDC 공용 칸 하나 `.ui-modal.ui-modal--wide`(폭 96vw · 높이 = `--modal-max` 94vh 고정 · 몸 flex 1 · min-height 0) → PK · DT `dialogClass` 에 덧붙임(MD 안 고침) · PKC:3-10 폭 · 몸 높이 지움. +- 재사용: `--modal-max` 위 고정 거리 규칙(MDC:13-19). +- 시험: T`test_modal_top_and_add_word.py`:34-37(`.ui-modal.ui-item-picker` 안 94vh 단정) → 공용 칸으로 고침 · 두 창 같은 클래스 소스 시험. +- 위험: 고르기 [수정] 편집 화면(CAD · 시트)도 같이 커짐(좋음 · 추정) · 좁은 폭 규칙(PKC:238-245) 그대로 · B08 이 고르기를 부르게 되면(이번 B08 요구) 같은 크기. +- 크기: 작음. +- ⬜ 물음: 크기 — ① 화면 거의 꽉(96vw × 94vh) ② 상한만 올림(예 1600 × 900 px) → 추천 ①. + +## 고칠 파일 목록 +| 파일 | 줄 | 요구 | 비고 | +|---|---|---|---| +| CO `UI_Section_Columns.ts` | 43 | E1 | | +| SV `UI_Section_View.ts` | 566 | E1 | 다른 조사(노면공 하이라이트 · selectMark)와 같은 파일 | +| B6`UI_Style_Cross.css` | 612 | E1 | | +| `ui_template\ui_template_locale_b2.ts` | 1049 | E1(글쇠 글만 · 줄 안 늚) | ⚠ 이미 700 넘음 — 줄 늘리지 않음 | +| MD `ui_template_modal.ts` | 52 | E2 | M02 조사(닫기 둘 · 확인 상단)와 겹침 | +| MDC `ui_template_modal.css` | 40 | E2 · E7 ● | | +| PK `ui_template_item_picker.ts` | 363 | E2 · E7 ● | | +| PKC `ui_template_item_picker.css` | 286 | E2 · E7 ● | | +| ASK `ui_template_item_picker_ask.ts` | 97 | E2 | | +| M02 `_Labor_Input.ts` · `_Labor_QtyModal.ts` · `_Labor_RefEdit.ts` · `_Labor.css` | 191 · 175 · 108 · 499 | E2 | M02 요구와 한 벌 | +| DP `UI_Cross_Design_Pick.ts` | 358 | E3 · E5 ● | 다른 요구(◀▶ 지움 · 이동 패널)와 같은 칸 | +| CT `UI_Style_Cross_Controls.css` | 446 | E3 | | +| DT `UI_Cross_Detail.ts` | 260 | E4 · E5 · E6 · E7 ● | place 지움 −40 · 짝 표 +40 → 비슷 | +| DTC `UI_Style_Cross_Detail.css` | 89 | E4 · E5 · E6 ● | | +| AR `UI_Style_Cross_Areas.css` | 504 | E5(새 강조 둘 — DTC 에 둬도 됨) | | +| EC `Engine_Cad.py` | 613 | E4 | ⚠ 613 — 부르기 몇 줄만 · 헬퍼는 ET | +| ET `Engine_Cad_Table.py` | 328 | E4 | | +| ES `Engine_Cad_Sheet.py` | 210 | E4 | B07 배치 요구와 같은 파일(추정) | +| T `helper_138_cross_columns.cjs` · `test_138_cross_columns.py` | 25 · 46 | E1 | | +| T `test_137_design_pick.py` · `helper_137_design_pick.cjs` | 110 · 318 | E3 · E5 ● | | +| T `test_modal_top_and_add_word.py` | 74 | E7 | | +| T 새 시험 | — | E2 · E4(B07) · E5 | | + +- 묶음(추천): E7 → E6 → E4 → E5 = DT · DTC 한 창 · E2 = 공용 겉틀이라 M02 쪽과 한 창 · E1 · E3 따로. diff --git a/docs/raw/요구_1009_2/조사_F_B06형상조작.md b/docs/raw/요구_1009_2/조사_F_B06형상조작.md new file mode 100644 index 000000000..d5b6aa86d --- /dev/null +++ b/docs/raw/요구_1009_2/조사_F_B06형상조작.md @@ -0,0 +1,104 @@ +# 조사 F — B06 횡단 형상 조작(도수로 절토 띠 · 띠 고름 · 노면공 강조 · 사면 이동 패널 · 연동 흙막이 높이) (10-9 둘째 · 읽기 전용 조사 에이전트) + +약칭 `B06_Section/B06_Section_` + CV `UI_Cross_View.ts` · DP `UI_Cross_Design_Pick.ts` · WH `UI_Cross_Wall_Hatch.ts` · CU `UI_Cross_Culvert.ts` · EX `UI_Cross_Culvert_Extra.ts` · TI `UI_Cross_Culvert_Tiers.ts` · BS `UI_Cross_Culvert_Basin.ts` · CG `UI_Cross_Culvert_Geom.ts` · K `UI_Cross_Culvert_Const.ts` · WI `UI_Cross_Culvert_Wire.ts` · BG `UI_Cross_Body_Guard.ts` · BX `UI_Cross_Box_Geom.ts` · BO `UI_Cross_Box.ts` · FG `UI_Cross_Ford_Geom.ts` · FO `UI_Cross_Ford.ts` · FV `UI_Cross_Ford_Pavement.ts` · FP `UI_Cross_Ford_Panel.ts` · PB `UI_Cross_Panel_Base.ts` · SP `UI_Cross_Structure_Panel.ts` · VP `UI_Cross_View_Panels.ts` · VS `UI_Cross_View_Structure.ts` · DL `UI_Cross_Design_Line.ts` · DS `UI_Cross_Design_Surface.ts` · SV `UI_Section_View.ts` · SPN `UI_Page_Structures_Panel.ts` · SPK `UI_Page_Structure_Pick.ts` · STC `UI_Page_Station_Controls.ts` · LS `UI_Page_Link_Session.ts` · PO `UI_Page_Pipe_Options.ts` · DSY `UI_Page_Design_Sync.ts` · AD `UI_Adjust_Dock.ts` · SL `Structure_Layouts.ts` · PG `Engine_Design_Geometry.py` · PD `Engine_Design.py` · CSA `UI_Style_Cross_Areas.css` · CSC `UI_Style_Cross.css` / GT `common_util/common_util_cross_design_geometry.ts` · CD `common_util/common_util_cross_design.ts` · DVC `A00_Common/design/design_view_cross.ts` · SEL `A00_Common/design/design_selection.ts` · CH `B05_Profile/B05_Profile_UI_Corridor_Structures_Chute.ts` · T `resources/tester/` + +## 0. 코드 지도 + +| 요구 | 손댈 층 | 계산 자리(5장) | 저장 | +|---|---|---|---| +| F1 절토 띠 | 띠 그림(WH · CU · CH) | TS 한 벌(B06 카드 · B07 덧그림 `B07_DesignDetail_Cross_Overlay.ts:507-511` · 3D) · 서버 · 파이썬 짝 없음 | 없음(그림만 · B08 돌붙임 = 손 면적 `B08_Quantity_Router_Summary.py:225-252`) | +| F2 띠 고름 | 고름 · 강조(CU 타입 · WH · CV · SP · AD · SPN) | 화면만 | 고름 칸(`structure-pick`)만 | +| F3 노면공 강조 | SV · DS · CSA (+ SPN · DVC) | 화면만 | 없음 | +| F4 사면 이동 | DP + PB 패널 (+ GT ↔ PG · CD ↔ PD) | UI = 화면 · (가) 뜻 바꿈 = ① 짝 + 거울 시험 · [저장] 서버 재계산(139-6) 그대로 | `shoulder_extend_{left,right}_m` 그대로 | +| F5 연동 높이 | WI · SP · AD | ② TS → 서버 Node(SL:102-140 이 같은 `computeCardCulvert`) · 짝 없음 | 풀린 카드 `revet_adjust.h`(139-2 길) | + +## F1. 돌붙임/도수로 — 원지반으로 들어가는(절토) 유출에도 띠 +- 현재: 띠 = 공용 `appendChuteBand`(WH:357-415 · 단면 `chuteBandOutline` WH:322-353 — 윗면 = 선 · 땅 쪽으로 두께). 부르는 곳 넷 모두 **성토 조각만** 넘김 — 관 · 흙막이 CU:114-120(L117 `kind !== "cut"`) · 박스 BO:160-168 · 세월교 FO:134-142 · 3D CH:23-33(L29 같은 거름). 물넘이 포장 FV:185 = 설계선이 노견에서 내려가는 동안만(FV:193-211). +- 까닭: 139-4 · 139-5 로 묻힌 유출 끝 = 3° 내림 절토선 `kind: "cut"`(EX:381-405 · 못 만나면 수평공간 뒤 복합경사 `bermCut` EX:59 · 402 · 관 유출 `cutBerm(0)` TI:97). 띠 거름은 「절토선 안 그림(08-24)」 시절 90-2 그대로(추정) → 절토 조각에 띠 빠짐. 박스 · 세월교 **본체 끝**(흙막이 없는 쪽)은 3° 규칙 밖 — 묻히면 바로 복합경사 `cutLine`(BX:175-189 · 성토 조각만 L187 · 세월교 BS:324-341 → FG:269-283) → 띠 자리 자체 없음. +- 근거(지식DB): 「유출구로부터 원지반까지 도수로 · 물받이」(`resources/knowledge/technical_info/01_임도/02_상세설계/횡단배수관_암거.md:25` · `배수시설_배치.md:74`) — 3° 절토 수로 = 유출구 → 원지반 물길(추정). +- 고칠 자리(그림만): WH 에 띠 조각 고름 도우미 하나 — 성토 조각 + **내림 · 수평** 절토 조각(끝 표고 ≤ 시작) · 오르막 복합경사 조각 뺌 → CU:117 · CH:29 두 곳이 씀 · 띠 툴팁(WH:376 「성토사면 따라」)을 절토 조각이면 「3도 절토선 따라」. +- 재사용: `chuteBandOutline`(법선이 늘 아래 — 절토 조각도 땅 안쪽) · 3° 판정 꼴 `cutLineTip`(CU:106-111 끝 < 시작). +- 시험: T test_90_chute_band(모양 그대로) · test_139_4_buried_outlet · test_135_3_chute_solid(헬퍼 거름 `helper_135_3_chute_solid.cjs`:128 · 153 · 184 맞춤) · test_136_chute_form_cache · test_52_3_structure_spec_ford_pavement(물넘이 띠 그대로) · 새 시험(139-4 픽스처 묻힌 유출 → 띠 = 3° 선 아래 두께 · 오르막 = 띠 없음 · 3D 같은 조각). +- 위험: 3D 띠가 절토 홈 바닥 아래로 감(지형 망과 겹침 추정) · 연동 카드엔 그대로 안 그림(CU:114). +- 크기: 작음((나)면 중간). +- ⬜ 박스 · 세월교 본체 끝(흙막이 없는 쪽)이 묻힌 경우: (가) 이번엔 3° 선이 이미 있는 배관 · 흙막이 유출만 / (나) 3° 한 규칙을 본체 끝에도 넓혀(BX:177-189 · FG:269-283 · 3D 실루엣 `B05_Profile_UI_Corridor_Station_Structure.ts:192-214` cutLine 갈래 같이) 띠까지 — 추천 (가). + +## F2. 돌붙임/도수로 — 횡단도 고름 · 강조 +- 현재 고름 길(137-3 페이지 하나): 보라 선(DP — 가림 = 벽 · 본체 폴리곤 DP:21-27 · 판정 선은 구조물 판정면 아래 DP:301-315) · 벽 · 관(`RevetPick` CU:60 · 판정면 CU:346-385 · 강조 setter CU:387-392 · 페이지 고름 STC:187 · 257-276) · 세월교 · 박스 본체(`FordPick` · `BoxPick` → `UI_Cross_View_Bodies.ts`) · 면적. +- 까닭: 띠는 **그림만**(90-2) — WH:357-415 가 폴리곤 · 돌만 그리고 누름 · 강조 setter 없음 · `RevetPick` 에 띠 키 없음 · 보라 선이 아니라 DP 도 안 잡음 · 좌측 「도수로/돌붙임」 상자(`chute_add` — `A00_Common/design/design_structure_guard.ts:149-157` · 물넘이 `chute` — `design_structure_ford_pavement.ts:28-35`)와 짝 없음(SPN:619-623 `keyOf` null · AD:158-171 은 body · pipe 만) · 3D 넘김 밖(SPK:27). +- 고칠 자리(화면만 · 118-1 관 고름 꼴): ⓐ CU:60 `RevetPick` 에 "chute" ⓑ WH 에 띠 고름 도우미 — 그린 띠(`b06-chart__culvert-pitching`)마다 투명 판정면(벽 판정면 아래 · 설계선 판정 위 · 굵은 투명 테두리로 여유) · 강조 setter 반환 → CV:574 뒤 한 번(관 · 박스 · 세월교 · 물넘이 넷 다 같은 함수가 그려 한 곳 · B07 은 CV 를 안 거쳐 판정면 안 들어감) · `toggleRevet("chute")`(CV:231) · `setRevetActive` 감쌈(CV:489-494 독립 벽 꼴) ⓒ SP:499 · 502 「pipe」 옆에 「chute」(창 없음 · `data-side`) ⓓ AD:158 에 side "chute" → 보이는 명세의 `chute_add` · `chute` 상자 강조 · 스크롤 ⓔ SPN:619-631 `keyOf` chute_add · chute → "chute" · `pickBox` 의 `target.culvert` 조건을 「띠 있는 측점」으로 ⓕ (선택) SPK:27 · 66-73 3D 띠 → B06 고름 ⓖ CSA:379 옆 `.is-active`. +- 재사용: 118-1 관 고름 한 벌(판정면 · setter · 좌측 상자 강조 · 상자 고침 → 고름) · `revetOffset.select`(같은 측점 본체 고름 풂 107-1 STC:272-276) · 「고름 하나만」(CV:231-258). +- 시험: T test_118_pipe_pick(꼴 본뜸 · 통과) · test_137_design_pick · test_b05_b06_selection_single · test_54_29_pick_same_panel · 새 시험(띠 누름 → chute 고름 · is-active · 선 · 벽 · 면적 풂 · 좌측 상자 강조 · 상자 고침 → 띠 강조). +- 위험: SPN 699줄 — 한 줄도 넘음 → `wireStructureSelection`(SPN:565-699) 떼기 먼저 · CV 675줄(F4 와 합쳐 ~685) · 띠 0.3 m 가 작은 배율에서 몇 px(추정) · 박스 · 세월교 측점이 이웃 관 연장 안이면 `ownerChainageOf`(SPN:577-583)가 관 폼을 엶(추정 — chute 는 자기 측점으로). +- 크기: 중간. + +## F3. 노면공 강조 — 카드 테두리 대신 카드 안 포장층 강조 +- 현재: 노면공(G군 `pavement_concrete` · `gravel_surfacing`)을 목록 · 알약에서 고르면 ① 가장 가까운 카드 고름(SPN:198-209 `focusChainage`) + ② 범위 안 카드 **전부 테두리** `--span`(SV:233-251 · 352 · 532-537 · CSC:215-218 — 고름과 같은 빨강 · 106-1). 반대로 ③ 범위 안 아무 카드나 누르면 관이 없는 한 `resolveSelection` ③ 「측점을 덮는 구조물」(SEL:93-94)이 노면공을 폼 · 목록에 열고(SPN:527-538) 알약도 켬(DVC:385-402 `selectMark(mark,false)` · 137-4). +- 원문 풀이(추정): 「다른 컨테이너 하이라이트와 연동되어 이상하게」 = ②(시설 하나에 카드 여럿이 고른 것처럼 빨강) · ③(다른 카드 누름이 노면공을 켬). 「횡단도들의 구조물을 하이라이트 된 것처럼」 = 범위 안 카드마다 노면공의 그림인 **포장층**(DS:71-107 · `section.pavement` 88)을 벽처럼 강조 — 연동 벽 강조(연장 안 모든 카드 · SV:222-231)와 같은 꼴. +- 고칠 자리(화면만 · 포장 제원 짝 `common_util_structure_pavement` 안 만짐): ⓐ DS:94 포장층에 범위 표식(entry 시작 · 끝 data) ⓑ SV — 받은 종류 목록 보관(L544 `types`) · 고른 구조물이 G군이면 `--span` 끄고 범위 카드 포장층 `is-active`(L246-251 · 352 두 자리) · 다른 구간형(옹벽 · 독립 흙막이 · 사토장)은 `--span` 그대로 ⓒ CSA 에 `.b06-chart__pavement.is-active`(무늬가 inline fill — DS:103 · 테두리 · 겹 채움으로) ⓓ (⬜ 이면) ③ 끊기 — SEL:93-94 「덮는 구조물」에서만 노면공 뺌(① id 길 = 목록 고름은 그대로 · 종류 판정 `markTypes` SPN:163 group "G" 를 SPN:532 가 넘김) · 덮는 것 없으면 DVC:401-402 알약 · 강조 풂. ①(가까운 카드 고름 = 폼 여는 길)은 그대로. +- 재사용: 106-1 범위 판정 `inSpan`(SV:239-245) · 연동 벽 강조 꼴 · 구조물 강조색. +- 시험: T test_106_span_highlight_wording(`--span` 두 자리 단정 고침) · test_b05_b06_selection_single · test_b06_structure_pavement_mirror(무변 확인) · 새 시험(G군 → `--span` 없음 · 범위 카드 포장층 is-active · 옹벽은 `--span` 그대로 · ⓓ 면 카드 누름 → 노면공 안 열림). +- 위험: 한 측점 노면공 둘(겹침) → 범위 표식으로 하나만 · SPN 699줄(ⓓ · F2 와 같은 떼기). +- 크기: 작음(ⓓ 넣으면 중간). +- ⬜ 카드 누름이 덮는 노면공을 폼 · 목록 · 알약에 여는 길(③)도 끊을지 — 추천 끊음(B06 만 · 노면공은 목록 · 알약으로 고름). + +## F4. 보라 사면 이동 — 노견 같이 · 방향키 · 단추 → 이동 패널 +- 현재(139-6): 고른 보라 조각 쪽 값 `shoulder_extend_*` 하나 = **노견 확장** — 노견 끝 · 측구 · 사면 · 구조물만 바깥으로 · 차도 · 포장 그대로(GT:211-218 ↔ PG:141-148 · 판정은 옮기기 전). 조작 = 치수 라벨 안 [◀ ▶](DP:323-344 · 걸음 0.1 · 0 아래 금지 DP:243-257) → CV:584-596 → DSY:62-69(세션 · 캐시 · 전 측점 브라우저 재계산) → [저장] 서버 재계산. 키보드 없음. +- 「노견도 같이」 풀이(추정): 노견 = 좌우 0.5 m 고정 · 확폭은 차도에만(09-12 사용자 DL:226-228 · 차도 틱 · 노견 틱 DL:229-234). 지금은 노견 틱만 나가 라벨 「노견 좌 0.60」(DL:239-260) — 노견이 **늘어남** → 원문 = 노견 0.5 째 평행이동 · 늘어난 폭은 차도. +- 고칠 자리: ⓐ UI(화면만) — DP:323-344 [◀ ▶] 지움 · 이동 패널(공통양식 PB: `buildPanelShell` PB:56 · `makeRow("이동")` PB:31 · `dpadButton` ◀ ↺ ▶ PB:44 · `bindArrowKeys` ←→ PB:248 · 꼴 = FP:67-190) · 고름 생기면 보임 · ↺ = 그 쪽 0 · ✕ = 고름 풂 · `shiftedExtend`(DP:252) 그대로 · DP 반환에 패널 → CV:663-664 에 붙임. ⓑ (가)면 ① 짝 — GT:215-218 ↔ PG:145-148 에 차도 반폭도 같은 값만큼 · 확폭 출력은 쉬프트 뺌(CD:521-522 ↔ PD:447-448) → 차도 끝(CD:538-547 ↔ PD:466-476) · 포장층(DS:78)이 따라감 · DL:248-260 라벨 「노폭 (규격 + 이동)」 · 치수 글 「노견 +x」(DP:354) → 「이동 +x」 · 키 이름 그대로(저장 호환). +- 재사용: PB 템플릿 · `.b06-structure-panel`(자리 · 색 `UI_Style_Cross_Controls.css`:5-) · 139-6 세션 · 저장 길 그대로. +- 시험: T test_139_6_line_shift(단추 단정 → 패널 · 방향키) · test_b06_cross_design_mirror((가) 차도 끝 단정 추가) · test_139_6_save_redesign · test_139_6_pipe_fit(노견 끝 그대로라 무변 추정) · test_87_widening_runs · test_b06_curve_widening · 새 시험(패널 ◀▶ · ←→ · ↺ · 0 멈춤). +- 위험: 한 번 누름 = 전 측점 재계산(DSY:68) — 방향키 반복이 겹침 → 반복 무시 · 최신만(5장 `designRequestSeq` 꼴 · 추정) · (가) 사토장 시작점이 차도 끝을 씀(PD:343 ↔ CD:409 — 사토장 측점 면적 바뀜) · 3D 포장(`B05_Profile_UI_Corridor_Station.ts:246`)도 넓어짐. +- 크기: 중간((가) 짝 포함). +- ⬜ 「노견도 같이 이동」: (가) 노견 0.5 고정 평행이동 · 늘어난 폭 = 차도(노폭 · 포장층 따라감) / (나) 지금 노견 확장 그대로 · UI 만 패널 — 추천 (가). + +## F5. 연동 흙막이 높이 기본 = 본 흙막이 · 풀면 높이 따로 +- 현재: 연동 카드 = 소유 측점 적용 4축을 물려받음(WI:408-415 · `ownerAppliedAdjusts` WI:594-610). 높이 h 는 **손으로 넣었을 때만** 실림(빈 칸 = null · CG:229-232) · `bodyAbsolute`(BG:204-214)는 x 만 → 옆 카드가 자기 측점에서 높이를 다시 셈: 세월교 · 박스 흙막이 = 본체 끝 높이 자리(CG:151-160)가 옆 측점엔 본체 없어 null(BG:47-97) → `revetWallSpec` 마지막 값 근입 0.5 m(K:139-142). 관 보호공 = 관경 + 0.5 같음(139-1) · 139-6 역산 높이(소유만)는 안 따라감 · 다단 = 1.5 같음. +- 실측(73-4 픽스처 · 박스 352.14 흙막이 높이 칸 비움 · 읽기 전용 Node): 소유 2.0 m ↔ 옆 340 · 360 = **0.5 m** · 칸 3.5 를 넣은 원본은 3.5 같음. 세월교 · 박스 흙막이 높이 칸은 일부러 빈 칸(= 자동 · `A00_Common/design/design_structure_guard.ts:88-94` 79-7 · 관만 139-1 채움) → 새 흙막이는 기본이 이 상태. +- 풀 때: 139-2 굳힘(LS:128-170 · STC:534-548)이 **그 카드에 그려진 높이**(LS:166)를 굳힘 → 지금은 0.5 가 굳음. 푼 뒤 높이 고칠 자리 없음 — 기준벽 높이 줄은 다단만(SP:553) · 좌측 폼 높이 칸 = 소유 측점 값(PO:125-148 `owner.chainage_m`) → 「개별 동작」 안 됨. +- 뜻(추정): 본 흙막이 = 소유 측점 벽(관 보호공 유입 · 유출 · 세월교 · 박스 흙막이 · 독립) · 연동 흙막이류 = 연장(전 · 후)으로 옆 카드에 선 벽 + 다단(「연동 해제」 = 카드 · 좌측 [연동] 단추). 집수정 · 날개벽은 옆 카드에 안 섬. +- 고칠 자리: ⓐ WI:594-610 물려줄 h 가 빈 값이면 소유 측점이 **그린 순수 높이**(소유 layout 벽 높이 + 근입 · 다단도) → 옆 카드 · B07 · 서버 면적(SL) · 139-2 굳힘이 같은 값 ⓑ SP:553 기준벽 높이 줄을 「풀린 연동 카드」(deps `linkState()` linked false)에도 · AD:52-65 칸 받는 줄에 높이 줄(`--height`) · `rowsFor` 날개벽 칸(AD:69-74)도 — 조작은 이미 그 카드로 감(VP:89-100 `adjustTarget` · VS:105-112). +- 재사용: 139-2 굳힘 · `adjustTarget` · 다단 높이 줄(±0.1 · SP:246-262) · 3D 는 이미 소유 단면 스윕(`B05_Profile_UI_Corridor_Structures_Path.ts:196-216`)이라 그대로. +- 시험: T test_139_2_link_freeze(h 2.3 그대로) · test_73_4_body_guard · test_revet_link_level.mjs · test_revet_span_source · 새 시험(73-4 픽스처 칸 비움 → 옆 340 · 360 순수 높이 = 소유 2.0 · 풀린 카드 ±0.1 → 그 측점만 · 소유 그대로). +- 위험: 옆 측점 벽 몸 성토 면적 · B08 토적 바뀜(SL 면적 행 · 옛 프로젝트 포함) · 옆 지형이 달라 벽이 뜨거나 묻힘(floatGap 경고) · 좌측 칸에 높이 둘(폼 = 본 흙막이 · 줄 = 이 측점) — 이름표로 가름. +- 크기: 작음. +- ⬜ 풀린 카드 높이 고치는 자리: (가) 좌측 칸에 「이 측점 높이」 ±0.1 줄(사본 줄) · 폼 칸은 본 흙막이 / (나) 폼 높이 칸이 고른 카드 따라 갈림 — 추천 (가). + +## 고칠 파일 목록 + +| 파일 | 줄 | 요구 | 무엇 | 700 | +|---|---|---|---|---| +| WH `UI_Cross_Wall_Hatch.ts` | 416 | F1 · F2 겹침 | 띠 조각 고름 도우미 · 띠 판정면 · 강조 도우미 · 툴팁 | ~450 | +| CU `UI_Cross_Culvert.ts` | 393 | F1 · F2 겹침 | L117 거름 → 도우미 · L60 `RevetPick` chute | | +| CH `B05_Profile/B05_Profile_UI_Corridor_Structures_Chute.ts` | 54 | F1 | L29 거름 → 도우미 | | +| CV `UI_Cross_View.ts` | 675 | F2 · F4 겹침 | 띠 고름 배선 · setRevetActive 감쌈 · 패널 붙임 | ⚠ ~685 | +| SP `UI_Cross_Structure_Panel.ts` | 639 | F2 · F5 겹침 | L499 · 502 chute 창 없음 · L553 풀린 카드 높이 줄 | ~645 | +| AD `UI_Adjust_Dock.ts` | 281 | F2 · F5 겹침 | side chute 상자 강조 · 칸 받는 줄에 높이 줄 | | +| SPN `UI_Page_Structures_Panel.ts` | 699 | F2 · F3(⬜) 겹침 | keyOf · pickBox · ③ 노면공 뺌 | ⚠⚠ 한 줄도 넘음 → L565-699 떼기 먼저 | +| SPK `UI_Page_Structure_Pick.ts` | 104 | F2(선택) | REVET_KEYS chute | | +| CSA `UI_Style_Cross_Areas.css` | 504 | F2 · F3 겹침 | 띠 · 포장층 is-active | | +| SV `UI_Section_View.ts` | 566 | F3 | G군이면 포장층 강조 · 종류 보관 | ~580 | +| DS `UI_Cross_Design_Surface.ts` | 108 | F3 | 포장층 범위 표식 | | +| DVC `A00_Common/design/design_view_cross.ts` | 684 | F3(⬜) | 덮는 것 없으면 알약 · 강조 풂 | ⚠ 근접 | +| SEL `A00_Common/design/design_selection.ts` | 185 | F3(⬜) | ③ 덮는 구조물에서 뺄 것 받는 인자 | | +| DP `UI_Cross_Design_Pick.ts` | 358 | F4 | [◀ ▶] 지움 · 이동 패널 · 반환 | ~370 | +| GT `common_util/common_util_cross_design_geometry.ts` ↔ PG `Engine_Design_Geometry.py` | 499 · 456 | F4(가) 짝 | 차도 반폭에도 쉬프트 | | +| CD `common_util/common_util_cross_design.ts` ↔ PD `Engine_Design.py` | 601 · 550 | F4(가) 짝 | 확폭 출력에서 쉬프트 뺌 | | +| DL `UI_Cross_Design_Line.ts` | 263 | F4(가) | 노폭 라벨 「+ 이동」 | | +| WI `UI_Cross_Culvert_Wire.ts` | 653 | F5 | 물려줄 h = 소유 그린 높이 | ~661 | +| (F1 ⬜나만) BX · FG · `B05_Profile_UI_Corridor_Station_Structure.ts` | 250 · 356 · — | F1 | 본체 끝 3° 한 규칙 | | +| 새 시험 T | — | F1~F5 | 요구마다 하나(+ 기존 고침 위 절) | | + +- 재사용만(무변): PB `UI_Cross_Panel_Base.ts` · FP · VP · VS · LS · STC · SL. + +## 차례 +1. SPN `wireStructureSelection` 떼기(줄 수만 · F2 · F3 ⬜ 앞). +2. F5(WI 한 곳 · 작음) · F1(작음) — 겹침 없음. +3. F2 — F1 과 같은 WH · CU 라 한 창이 이어서 · SP · AD 는 F5 와 다른 자리(늦게 올리는 쪽이 받아 합침). +4. F3. +5. F4 — ⬜ 답 뒤((가)면 짝 + 거울 · CV 는 한 줄). + +## 찾은 흠(요구 밖) +- (추정) 물넘이 포장 띠 `outletFillLine`(FV:193-211 · 3D CH:36-54)이 사면 끝 뒤 원지반이 계속 내려가면 원지반 샘플 따라 끝(±20 m)까지 감 — 설계선에 원지반 샘플이 섞임 · test_52_3 픽스처엔 원지반 점 없음. +- 박스 · 세월교 흙막이 높이 칸이 빈 프로젝트는 지금도 연동 옆 측점 벽 0.5 m 가 서버 면적 · B07 그림에 들어가 있음(F5 실측). +- `B05_Profile/B05_Profile_UI_Structures_Panel.ts` 699 · SPN 699 · DVC 684 · CV 675 — 다음 고침 전 나눔 필요. diff --git a/docs/raw/요구_1009_2/조사_G_B07B08B09CAD.md b/docs/raw/요구_1009_2/조사_G_B07B08B09CAD.md new file mode 100644 index 000000000..109ffac27 --- /dev/null +++ b/docs/raw/요구_1009_2/조사_G_B07B08B09CAD.md @@ -0,0 +1,103 @@ +# 조사 G — B07 횡단 배치 칸 · IP 글 색 · B08 미연결 표시 · 공용 표 글자 · B09 일위대가표 나무 · CAD 휠 줌 (10-9 둘째 · 읽기 전용 조사 에이전트) + +경로 = 프로젝트 루트 기준(`B07/` = `B07_DesignDetail/B07_DesignDetail_` · `CAD/` = `B07_DesignDetail/openwebcad/src/` · `B08/` = `B08_Quantity/B08_Quantity_` · `B09/` = `B09_Estimation/B09_Estimation_` · `ui/` = `ui_template/ui_template_`) · 「추정」 = 코드로 확인 못 한 판단 · 서버 · 브라우저 안 띄움(화면 실측 없음). + +## G1. B07 횡단 장 배치 칸 → 「횡단도」 컨테이너 안 · 간단히 · 단추 · 라벨 양식 +- 현재: 배치 칸 = 좌측 목록 아래 정보 칸(`b07-info`) 맨 끝 — 횡단 *장*을 열 때만 `updateInfoPanel` → `appendCrossLayout`(`B07/UI_Page.ts:139-150 · 153-184`)이 배치를 받아 `buildCrossLayoutControls`(`B07/UI_Panels.ts:175-225`)를 붙임 · 꼴 = 「배치 열 [4] × 행 [4] [적용] [모든 장 기본]」 — 맨 `` 글 · 맨 `` · 페이지 단추 class `b07-plan-tools__button`(`B07/UI_Style.css:429-437`) · 줄 `.b07-info__layout`(:229-240) → 공용 양식 아님. +- 「횡단도 컨테이너」 = 좌측 접는 묶음 「횡단도 n」(`B07/UI_Panels.ts:133-150` · `data-kind="cross"` · 2열 격자 `B07/UI_Style.css:52-63` · 제목 · 표준도 줄 전체 폭 :84-87) — 사용자 말 「계획평면도 컨테이너」와 같은 뜻(추정) · 선례 = 평면도 묶음 맨 아래 [평면도 관리](`B07/UI_PlanKinds.ts:255-281`). +- 덤 흠: 장 확정 뒤 정보 칸을 새로 그려(`B07/UI_Page.ts:398-405`) 배치 칸이 사라짐(늦게 붙이는 쪽이 `panel.isConnected` 거짓으로 빠짐 :162) — 옮기면 함께 풀림. +- 고칠 자리: `buildDrawingSidePanel`(`B07/UI_Panels.ts:43-49`)에 횡단 도구 자리 인자 하나 → 횡단 묶음 끝(:146-149 뒤)에 붙임 · `buildCrossLayoutControls` 를 공용 부품으로 — 칸 = `createInputField({ label, type: "number", compact: true, min: 1, max: 10 })`(`ui/elements.ts:87-127` · 라벨 `ui-field__label`) 둘 · 단추 = `createButton({ variant: "ghost", size: "sm" })`(:43-57) · `B07/UI_Page.ts` = 그 자리를 들고 도면을 열 때마다 값만 바꿈(`appendCrossLayout` 의 `panel` → 자리 · 장 아니면 기본값 · [이 장] 꺼짐) · CSS = 줄 전체 폭(`grid-column: 1 / -1`) · 라벨 · 칸 한 줄 · `.b07-info__layout` 지움. +- 재사용: `createInputField` · `createButton` · 라벨 · 칸 한 줄 꼴(B06 `b06-profile__field-row` `B06_Section/B06_Section_UI_Style.css:65-109` — 오류 칸 접기 · 좁은 폭 줄바꿈) · 서버 길 그대로(`fetchCrossLayout` · `saveCrossLayout` `B07/Api_Fetch.ts:178-195`) · 다시 세우기 `reopenCrossSheet`(`B07/UI_Page.ts:88-89 · 566-572`). +- 시험: 화면 시험 없음(`test_140_b07_cross_grid.py` = 서버만) → 새 시험(`helper_130_b07_plan_manage.cjs` 가짜 DOM 꼴 — 횡단 묶음 안 배치 줄 · `ui-btn` · `ui-field__label` · 장 아님 = [이 장] 꺼짐) · typecheck. +- 위험: 좌측 폭 182 px 까지 줄어듦(`B07/UI_Style.css:52-58` 주석) → 줄바꿈 허용 · 묶음 접으면 안 보임(공용 `attachCollapsible`) · B06 새 요구 「가로 개수 라벨」과 같은 한 줄 꼴로 맞춤. +- 크기: 작음(약 40줄). +- ⬜ 1-1 단추 — (가) [이 장] [모든 장] 작은 단추 둘(지금 뜻 그대로) (나) [적용] 하나 + 「모든 장」 체크(`ui/checkbox.ts`) — 추천 (가). + +## G2. 평면도 IP 글 색 = 기준 형상 색 +- 현재: IP 조각 한 색 `#4d7dff`(`B07/Engine_Cad_PlanKinds.py:138`) — 교각 파선(:313) · 원(:316) · 글(조각 색 :246 → 글 후보 `color` :263-280 → `B07/Engine_Cad_PlanLabels.py:112-123` · 먼 글 지시선 :125-135 도 같은 색) 모두 같음 · 층엔 색 없음(`B07/Engine_Cad.py:222-223` · CAD 도 층 색으로 안 칠함 · 테마 보정 `paintColor` 는 선 · 글 같은 규칙 `CAD/theme.ts:97-124`) · 60장 첫 판부터 같은 파랑(git `138e80c79`). +- 둘레 색: 중심선 `#ff4d4d`(:133) · R 글 `#4d7dff`(:139) · IP 표 = 선 빨강 · 글 파랑(`B07/Engine_Cad_IpTable.py:27-28` · 사용자 예시 `docs/raw/요구_1008_2/IP표_예시.png`). +- 판단: 「기준 형상」이 IP 기호(파선 · 원)면 이미 같음 → 사용자가 본 차이 = 다른 뜻 · 평면도 기준선 = 노선 중심선(빨강)일 가능성 큼(추정). +- 고칠 자리: 글 색만 — `_piece_entities` `text()`(:263-280)의 `"color"` 를 조각별 글 색 표(예 `ip` → 중심선 색)로 한두 줄 / 기호까지 = `_COLORS["ip"]`(:138) 한 줄. +- 재사용: `_COLORS` 표 · `place_labels` · `label_entities` 그대로. +- 시험: 색 단정 없음(`test_141_b07_plan_labels.py` · `test_b07_plan_kinds.py`) → 단정 하나 더(IP 글 `textColor` = 중심선 색 · 원 · 파선 그대로). +- 위험: 확정 장 = 저장본이라 옛 색(장 [수정] 뒤 새 색) · 서버 단독(백엔드 재시작) · R 글은 파랑 그대로. +- 크기: 아주 작음. +- ⬜ 2-1 「기준 형상」 — (가) 노선 중심선 빨강(IP 글 · 지시선만) (나) IP 교각선 · 원(지금도 같음 — 고칠 것 없음 · 사용자 화면 사진으로 확인) — 추천 (가). + +## G3. B08 구조물 집계표 — 조합 미연결 시설 표시 · 바로 연결 +- 현재(143-1): 사본 있는 것만 — 서버 `pipe_summary` 가 칸마다 사본 없으면 안 셈(`B08/Summary_Sheet.py:46-48` → `unlinked` 시설 모음) · 화면 `linkedOnly`(`B08/Summary_Data.ts:40-57`)로 구조물 · 관 지점을 거름(`B08/UI_Summary.ts:211-216`) → 미연결 시설은 줄째 빠지고 알림 한 줄만(「조합 사본 없는 시설 n곳 — B05 · B06 좌측 패널에서 조합 연결 · [저장]」 `B08/Router_Summary.py:591-596`) · 줄 누름 = 구조물도 모달(사본 없으면 「사본 없음」 `B08/UI_Drawing.ts:76-79`). +- 연결 자리(정본): 구조물 = `B05_Profile/route/structures.json` 의 `summary_item` · `group_items{그룹 id}` / 관 · 박스 · 세월교 = `B04_PreProcess/drainage/edits/pipe_points.json` 같은 칸 → 사본 = 저장 뒤 서버 `safe_sync`(`B05_Profile/B05_Profile_Structures_Router.py:285-287` · `B04_PreProcess/B04_PreProcess_Router_Basins.py:448-453`) → `linked_snapshots`(`M02_MasterTemplete/M02_Item_Snapshot.py:417`) = B08 · B09 원천. +- 고르기 모달: 공용 `openItemPicker({ current, canCopy, projectId, structureId })` → `{ action: "apply", item }`(`ui/item_picker.ts:41-53 · 119`) · B05/B06 은 결과를 폼 초안에만 둠(`B05_Profile/B05_Profile_UI_Structures_Groups.ts:263-310`) · B08 에서 여는 길 없음 · 한 칸만 쓰는 서버 길 없음(구조물 PUT = 목록 통째 + 판번호 `B05_Profile_Structures_Router.py:266-300` · 관 PUT = 관 목록 통째 + 세부유역 다시 셈 `B04_PreProcess_Router_Basins.py:424-457`). +- 고칠 자리: + - ① 응답 `unlinked` = [{주인 id · 종류 · 측점 · 칸[{사본 id · 이름(본체 · 그룹) · 연결 여부}]}] — `pipe_summary` 가 이미 도는 `items`(`fill.collect_items` 본체 + 그룹마다 한 건 · 그룹 이름 `M02_MasterTemplete/M02_Table_Fill.py:146-171`)와 `sheet.unlinked` · `others`(`B08/Router_Summary.py:487-499 · 591-592`)로 · 몸은 `B08/Summary_Sheet.py` · Router 는 한두 줄. + - ② 화면: 미연결 시설 측점도 줄(값 빈칸 · 측점 칸 「· 미연결」 또는 G5 `rowClass` 줄 꼴) — `B08/UI_Summary.ts:155-160 · 211-217` · 알림 글 바꿈(`B08/Router_Summary.py:595`). + - ③ 줄 누름 모달 맨 위 「조합 연결」 칸 — 미연결 칸마다 [선택](`createButton` sm) → `openItemPicker({ current: null, canCopy: true, projectId, structureId: 사본 id })`(누를 때 `import()` · 지금 카드와 같은 꼴) → 저장 → 모달 · 표 다시 — `B08/UI_Drawing.ts:99-132`(132줄) 또는 새 `B08/UI_Link.ts`. + - ④ 서버 새 길 `PUT /api/projects/{id}/items/{사본 id}/link` {summary_item | null · facility} — 그 한 칸만 씀(구조물 = `load_structures` → `save_structures` 판번호 `B05_Profile/B05_Profile_Structures_Repository.py:50 · 99-136` / 관 = 노선 지문 그대로 덮어쓰기 `append_pipe_points_file` 꼴 `common_util/common_util_drainage_pipes.py:461-486`) → `safe_sync` → {snapshot_failed} — 자리 `M02_MasterTemplete/M02_Project_Items_Router.py:97-186`(`/{id}/items/{folder}/…` 무리) · 몸 `M02_MasterTemplete/M02_Item_Copy.py` · 앞 `projectItems().link`(`ui/item_picker_project.ts:113-142`). + - ⑤ B05/B06 세션 초안(`readPendingStructures` `B05_Profile/B05_Profile_Api_Structures.ts:306-324` · `readPendingPipes` `B05_Profile/B05_Profile_Api_Pipes_Draft.ts:22-36`)이 있으면 그쪽 [저장]이 목록 통째로 덮어 연결이 사라짐(`A00_Common/design/design_save.ts:31-38 · 90-93`) → 막고 알림 또는 초안에도 얹음(⬜ 3-2). +- 재사용: `openItemPicker`(새 항목 · 개인 복사 · 사본 [수정] 그대로) · `safe_sync` · `linked_snapshots` · `collect_items` 그룹 이름 · 공용 모달 · 「연결 없음 → 그 줄로」 꼴(`B09/UI_Tabs.ts:135-163`). +- 시험: `test_143_1_b08_linked_snapshots.py:153-159`(알림 글 · `unlinked` 칸) · `test_61_1_b08_summary_table.py` · 새 시험(임시 storage — 구조물 본체 · 그룹 · 관 지점 link → 파일 그 칸만 바뀜 · 판번호 +1 · 노선 지문 그대로 · 사본 폴더 생김 · 같은 측점 박스 + 관 = facility 로 가름) · typecheck. +- 위험: 같은 측점 박스 · 관은 사본 id 같음(`pipe@측점` `B08/Router_Summary.py:477-482`) → facility 꼭 받음 · id 없는 옛 구조물(`#n` `M02_Table_Fill.py:120`)은 못 이음 · 정의 그룹이 다 필요한 칸은 아님(유입 없는 관의 유입 칸 등) → 「미연결」 판정 = 셈한 칸 기준(`sheet.unlinked`) · 모달은 칸 전부 + 연결 여부 · 표 다시 그리기를 `renderStructureSummary` 다시 부르기로 하면 옵션 듣기가 겹침(`B08/UI_Options.ts:73-79`) → 탭 다시 열기 길(`B08/UI_Page.ts:79`) · 연결은 설계 지문 밖이라 B06 이후 STALE 안 됨(`B05_Profile_Structures_Repository.py:139-168`) · B07 도면은 조합 무관 그대로. +- 크기: 중간~큼(서버 약 60줄 · 화면 약 100줄). +- ⬜ 3-1 「바로 연결」 길 — (가) B08 모달에서 골라 즉시 저장(새 서버 길) (나) B05/B06 으로 옮겨 그 구조물 고른 채 [선택] 열기(저장은 그쪽 [저장]) — 추천 (가). +- ⬜ 3-2 B05/B06 세션 초안이 있을 때 — (가) 막고 「먼저 B05 · B06 [저장]」 (나) 초안에도 같은 연결 얹음 — 추천 (가). + +## G4. B08 · B09 표 글자 너무 작음 +- 현재: 공용 많은 자료 표 글 = `--text-caption` 12px(`ui/data_table.css:33` · 토큰 `ui/theme.css:100`) · 줄 높이 24px(:7) · 열 폭 = 페이지가 준 px(기본 숫자 84 · 글 96 `ui/data_table.ts:73-75` → `` · 고정 열 `left` · 표 폭 모두 이 값 :177-192). +- 쓰는 곳: B08 구조물 집계표 · 자재 셋 · 토적 · 토공집계표 · 운반(`B08/UI_Summary.ts` · `B08/UI_Material.ts` · `B08/UI_Earthwork.ts` · `B08/UI_Earthwork_Sheets.ts`) · B09 탭 전부(`B09/UI_Shell.ts:193-207`) · 그 밖 하나 = B05 노선 추천 모달 후보 표(`B05_Profile/B05_Profile_UI_RouteEdit_Recommend_Profile.ts:132-143` · HTML 글) · B08 수리 탭은 자기 표(14px `B08/UI_Hydro.css:26 · 66 · 74`) — 범위 밖. +- 폭: B08 집계표 열 폭 = 12px 글 기준 짐작(한글 12 · 그 밖 7 + 16 · 44~100 `B08/Summary_Data.ts:151-156`) · 나머지 고정 px(`B08/UI_Material.ts:131-217` · `B08/UI_Earthwork_Sheets.ts:19-74` · B09 `money` 96 · `qty` 76 `B09/UI_Tabs.ts:101-118`) → 글만 키우면 말줄임(…) 늘어남. +- 고칠 자리(공용 한 곳): CSS 글 `--text-body-sm` 14px(:102) · 줄 높이 28px · `colWidth` 에 글 비 14/12 곱 한 줄(열 · 고정 열 · 표 폭 함께 늘고 페이지 폭 값 · `widthOf` 그대로) — 줄 높이는 그린 줄을 재서 맞춤(`ui/data_table.ts:246-251`)이라 가상 그리기 그대로. +- B08 · B09 만 키우는 길: 공용에 변수(`font-size: var(--dt-font, var(--text-caption))` · 폭 비 `--dt-scale` 을 인라인 `calc`) + `B08/UI_Page.css` · `B09/UI_Page.css` 가 켬 — 인라인 `left:0px` 글이 바뀌어 `test_ui_data_table.py` 단정 고침. +- 재사용: 테마 토큰 · 수리 탭 14px 와 같은 크기. +- 시험: `test_ui_data_table.py`(폭 단정 없음 · `left:0px` 그대로) · `test_120_b08_drain_summary.py:264-269`(`widthOf` 12px 단위 그대로 — 곱은 공용) · `test_121_b08_material_sheets.py:238-262` 그대로 · 새 단정(비 곱 · CSS 14px). +- 위험: 표가 넓어져 가로 스크롤 늘어남(B09 원가 · B08 집계표) · 머리 줄바꿈 칸(`B08/UI_Page.css:35-40` · `B09/UI_Page.css:28-32`) 높아짐 · 표 위 안내 글(12px)은 그대로. +- 크기: 작음. +- ⬜ 4-1 범위 — (가) 공용 기본 14px(B05 노선 추천 모달 표도 커짐) (나) B08 · B09 만(공용 변수 + 두 페이지 CSS) — 추천 (가). + +## G5. B09 일위대가표 탭 — 제목 볼드 · 하위 들여쓰기 · 「ㄴ」 나무 +- 현재(`B09/UI_Tabs_Labor.ts:57-126`): 블록마다 줄 = 제목 「제 n 호표 이름」(:63-69) · 품셈 인용(:71-74) · 줄(:75-94) · 「합 계」(:95-103) — 들여쓰기를 앞 빈칸 두 개로 넣었으나 공용 표 칸이 `white-space: nowrap`(`ui/data_table.css:54`)이라 빈칸이 접혀 안 보임 · 볼드 = 합계 줄(tfoot)만(:130-135) — 본문 줄 꼴을 바꾸는 길 없음(줄 class = 번갈아 · 누름 · 강조뿐 `ui/data_table.ts:157-161`). +- 레벨 자료: 블록 = 한 단 목록(`B09/Labor_Source.py` · 줄 `kind` = labor · material · machine · daega · sangeun · pct · blank) · 겹 대가 = 줄 `kind: daega` 가 다른 블록을 부름(누르면 그 블록 :92-93) — 줄 안 하위 줄 자료 없음 → 나무 = 「제목 → 줄」 2단(겹 대가를 펼쳐야 3단). +- 공용 나무 표기 없음(「ㄴ」 · 「└」 grep 0 · `ui/tree.ts` 는 고르기 나무 — 표 아님). +- 고칠 자리: 공용 표 옵션 `rowClass?(줄) → class`(`ui/data_table.ts:39-60` 옵션 · `rowHtml` :124-162 에 class 하나 · `renderDataTableHtml` :200) + 공용 CSS `tr.is-title td` 볼드 / B09 = `TabTable.rowClass`(`B09/UI_Tabs.ts:75-88`) · `createDataTable` 로 넘김(`B09/UI_Shell.ts:193-206`) · 줄 · 인용 글 = 줄바꿈 없는 빈칸(U+00A0 · 안 접힘) 둘 + 「ㄴ 」 + 이름 · 제목 · 합계 = `is-title`. +- 재사용: 공용 표 · 빈칸 규칙 그대로 · 같은 꼴을 산근 풀이표에 나중에(`B09/UI_Tabs_Sangeun.ts:76 · 84 · 95 · 113` — 같은 빈칸 접힘). +- 시험: 대가 탭 화면 시험 없음(`test_145_2_b09_labor_calc.py` = 셈) → 새 시험(`buildDaegaBlocks` node — 제목 줄 class · 줄 · 인용 「ㄴ」) · `test_ui_data_table.py` 에 `rowClass` 한 경우(안 주면 지금 글 그대로) · typecheck. +- 위험: 공용 표 옵션 하나 늘음(안 주면 같은 HTML) · 줄 키 · 이동(link) 그대로 · G3 가 같은 옵션을 씀(미연결 줄) · 추가 요구(`사용자요구_1009_2_추가.md` — 일위대가표 내용 재편 · 조사 H)와 같은 파일 → H 뒤에 얹거나 같은 창. +- 크기: 작음. +- ⬜ 5-1 레벨 — (가) 2단(제목 · 합계 볼드 · 그 아래 줄 · 인용 「ㄴ」) (나) 겹 대가 줄 밑에 부른 블록 줄을 한 단 더 펼침(읽기만 · 금액은 부모 줄만) — 추천 (가). + +## G6. CAD 줌 = 마우스 휠 +- 현재(`CAD/inputController/input-controller.ts:277-304`): 휠 = ① Ctrl+휠(트랙패드 핀치) 줌(:287-290) ② 「마우스 휠 아님」 판정이면 팬(:293-296) ③ 그 밖 줌(커서 자리 고정 · 한 칸 10 % `CAD/drawControllers/screenCanvas.drawController.ts:113-142` · `CAD/App.consts.ts:145-160`) · 판정 `isMouseWheel`(:647-657) = 줄 · 쪽 단위이거나 가로 델타 0 + 세로 델타가 100 · 120 의 배수(8-29 「트랙패드 두 손가락 팬」 git `26a2f39dd`) · 가운데 단추 끌기 = 팬(:306-310) · 상태막대 안내 「휠: 줌」(`CAD/components/StatusBar.tsx:76`) · 확대 막대 ⛶ + -(`CAD/components/ViewControls.tsx` → `CAD/commands/commands.view.ts:10-29` 화면 가운데 고정). +- 판단: 사용자 휠이 줌 대신 팬으로 먹힘 — 한 칸 델타가 100 · 120 배수가 아니면 트랙패드로 오판(브라우저 · Orca 확대 ≠ 100 % 면 Chrome 델타 = 100 ÷ 확대율 · 예 90 % → 111.1 · Windows 휠 줄 수 ≠ 3 · 고해상도 · 부드러운 휠)(추정 · 사용자 기기 미확인). +- 쓰는 곳: CAD 앱 한 벌(`/b07-cad`) = B07 본 화면 · 평면도 관리 모달(bare) · M02 도면 미리보기(`M02_MasterTemplete/M02_MasterTemplete_Drawing.ts` → M02 카드 · B05/B06 조합 고르기 카드 · B08 구조물도 모달) — 함께 바뀜 · B06 횡단 카드 SVG 줌(`A00_Common/b_svg_zoom_pan.ts` · 휠 줌 안 묶음 = 사용자 확정)은 CAD 아님 · 범위 밖. +- 고칠 자리: 판정 지움 — Ctrl 없는 휠 = 늘 줌(트랙패드 두 손가락도 줌 · 팬 = 가운데 단추 끌기 · 보기 전용 왼쪽 끌기) · 휠 결정(줌 · 핀치)을 새 작은 파일 `CAD/inputController/input-wheel.ts`(순수 함수)로 떼어 시험 · input-controller 줄 줄임 · 빌드 `npm --prefix B07_DesignDetail/openwebcad run build`. +- 재사용: `zoomScreen`(커서 고정 · 델타 비례) · `WHEEL_LINE_PX` · `WHEEL_PAGE_PX`(줄 · 쪽 단위 환산) 그대로. +- 시험: 휠 시험 없음 → 새 vitest `input-wheel.test.ts`(델타 100 · 111.1 · 90.9 · 4 · 줄 단위 3 = 모두 줌 · 부호 · ctrl = 핀치 지수) · CAD 빌드. +- 위험: 트랙패드 사용자는 두 손가락 팬 잃음(가운데 단추 없음 → 확대 막대 · 보기 전용 끌기 · PAN 안내 `CAD/commands/commands.view.ts:81`) · 미리보기 카드 위 휠 = 줌이라 모달 스크롤이 카드 위에서 멈춤(지금도 팬으로 먹혀 같음) · 빌드 뒤 옛 화면 남으면 탭 새로. +- 크기: 작음. +- ⬜ 6-1 트랙패드 — (가) 휠 = 늘 줌(판정 지움) (나) 판정 넓힘(가로 델타 0 · |세로| ≥ 50 이면 휠 · 트랙패드 팬 남김) — 추천 (가). + +## 고칠 파일 목록 +| 파일 | 요구 | 지금 줄 | ⚠ | +|---|---|---|---| +| `B07/UI_Panels.ts` | G1 | 314 | | +| `B07/UI_Page.ts` | G1 | 579 | | +| `B07/UI_Style.css` | G1 | 454 | | +| `B07/Engine_Cad_PlanKinds.py` | G2 | 637 | ⚠ 700 가까움(+2줄) | +| `B08/Router_Summary.py` | G3 | 633 | ⚠ 700 가까움 — 몸은 `Summary_Sheet.py` | +| `B08/Summary_Sheet.py` | G3 | 78 | | +| `B08/UI_Summary.ts` | G3 | 251 | | +| `B08/Summary_Data.ts` | G3 · (G4 나) | 167 | | +| `B08/UI_Drawing.ts` 또는 새 `B08/UI_Link.ts` | G3 | 132 | | +| `M02_MasterTemplete/M02_Project_Items_Router.py` | G3 | 186 | | +| `M02_MasterTemplete/M02_Item_Copy.py` | G3 | 344 | | +| `common_util/common_util_drainage_pipes.py` | G3 | 569 | | +| `ui/item_picker_project.ts` | G3 | 281 | | +| `ui/data_table.ts` | G4 · G5 (G3 줄 꼴) 겹침 | 284 | | +| `ui/data_table.css` | G4 · G5 겹침 | 167 | | +| `B08/UI_Page.css` · `B09/UI_Page.css` | G4 (나)만 | 57 · 32 | | +| `B09/UI_Tabs_Labor.ts` | G5 (조사 H 겹침) | 126 | | +| `B09/UI_Tabs.ts` · `B09/UI_Shell.ts` | G5 | 164 · 291 | | +| `CAD/inputController/input-controller.ts` | G6 | 657 | ⚠ 700 가까움 — 떼어 내 줄어듦 | +| 새 `CAD/inputController/input-wheel.ts` + `.test.ts` | G6 | — | | +| 시험 새 · 고침 | G1 새 · G2 `test_141` · G3 `test_143_1` · `test_61_1` + 새 · G4 `test_ui_data_table` · G5 새 · G6 vitest | | | + +창 나눔(제안): A = G1 · G2 · G6(B07 · CAD 빌드 · 백엔드 재시작) / B = G4 · G5(공용 표 두 파일 겹침 → 한 창 · B09 조사 H 와 순서 맞춤) / C = G3(B08 + M02 서버 길 · `rowClass` 쓰면 B 뒤). diff --git a/docs/raw/요구_1009_2/조사_H_B09호표.md b/docs/raw/요구_1009_2/조사_H_B09호표.md new file mode 100644 index 000000000..2502dfdb4 --- /dev/null +++ b/docs/raw/요구_1009_2/조사_H_B09호표.md @@ -0,0 +1,96 @@ +# 조사 H — B09 호표 넷(일위대가목록 · 일위대가표 · 산근목록 · 산근) 원천 다시 짜기 (10-9 둘째 · 읽기 전용 조사 에이전트) + +파일 = `B09_Estimation/` 아래 · 머리 `B09_Estimation_` 생략 · 기준 = 랩탑 메인 HEAD 09b3b50ef · 원문 = `사용자요구_1009_2_추가.md` · 엑셀 = `resources/knowledge/original/실무문서/2024년 간선임도(기번3-울진.대흥)(공통)/1. 설계원본/01 내역자료/2024년 간선임도사업(기번3).xlsx`(openpyxl 읽기 전용 · 셀 = `탭!셀`) · 실측 = `storage/1/3/2a505e36-…`(연결된 사본 6 · 읽기 스크립트만 · 쓰기 없음) · 「추정」 = 코드 · 자료로 확인 못 한 판단 · 지난 기록 = 145-1 · 145-2(`docs/raw/plans/2026-10-09_plan_134-145_*.md:119-130`) · `요구_1009/분석_정함.md` 144 · 145 · `조사_F_원가산출엑셀.md` 6절 · 부록 A4 · A5. + +## 0. 한 줄 결론 +- 145 정함(「산근 = 단가승격 줄 · 대가 품셈 = 승격 아닌 줄」)이 사용자 뜻과 거꾸로 — 사용자 = 「일위대가화 줄 = 대가 호표 · 단가산출 줄 = 산근」(M02 구분 이름과 같은 짝 · 엑셀 대가17 꼴과 같음) → 원천 갈래 두 곳(`Labor_Source.line_of` · `Sangeun.rows_of`) 뒤집음 + 뒤집으면 번지는 숨은 흠 셋(산근 줄 ÷ 배 · 기계 변수 줄 빈칸 · MO 자재 키) 함께 고침 · 산근 글(H4) = 엔진 글 부품(`master_text`) 재사용 + B09 굳힌 단가로 새로 지음. + +## H1. 일위대가목록표 = 구조물 조합 이름 + 일위대가화 항목 +- 현재: 목록 = 대가 블록 한 줄씩(`UI_Tabs_Labor.ts:35-55` ← `Calc_Labor.py:163-177` ← `Labor_Source.daega_inputs` :312-331) · 블록 꼴 셋 — 조합(연결된 사본 하나 · 이름 = manifest 원본 이름 = 경로 이은 글 :266 · 규격 = 같은 경로 › :267) · 사전조합(SC 참조 = 겹 대가 :199-230) · 품셈(**승격 아닌** 로직 줄마다 :187-197 → `poomsem` :87-116) · 승격 줄 · 옛 SP 참조 = 산근 줄(:174-186) · 차례 = 조합 → 사전조합 → 품셈(:329). +- 실측(2a505e36): 대가 20 = 조합 4 · 사전조합 1 · 품셈 15(메쌓기 · 큰돌 채집 · 터파기 · 되메우기 · 교목식재 …) · 산근 1(옛 SP 「돌쌓기 메쌓기(인력)」) · 조합 4 · 사전조합 1 합계 모두 빈칸 · 사본 11개 어디에도 `승격: true` 없음(134-1 뒤 새로 받은 사본 없음). +- 엑셀: 일위대가목록표 A 호표 · B 명칭 · C 규격 · D 단위 · E 합계 · F 노무비 · G 재료비 · H 경비 · I 비고(J 숨은 메타 `COD|B01180`) · 34줄(조합 21 · 품셈 13) · 값 = 블록 합계 줄 그대로(E20 `=일위대가표!F142` · F20 `=일위대가표!H142`) · 예 A20 「제 17호표」 B20 「돌기슭막이(찰쌓기,기초무,구입)」 C20 「H=1.5 L3=45cm」 D20 m · E20 124,594(F~H 96,868 · 11,309 · 16,417). +- 어긋남: ① 단가산출 줄이 「품셈」 대가로 목록에 올라옴(사용자 = 산근 · 목록 밖) ② 일위대가화 줄이 산근으로 감(사용자 = 목록 항목) ③ 조합 이름 = 사용자 뜻과 같음 · 규격 칸이 같은 경로를 되풀이(엑셀 = 규격 따로 · 작음). +- 고칠 자리: `Labor_Source.py:157-197` `line_of` 갈래 뒤집음 — `승격 true` → `poomsem` 블록(`kind: daega`) · 승격 아닌 로직 줄 → `kind: sangeun`(키 = `sangeun_ref` 그대로) · 옛 SP 참조(:174-179) → SP 첫 줄로 `poomsem`(옛 단가승격 = 일위대가화) · 사전조합 = 지금 그대로(⬜1) · 머리글 :1-14 · 일위대가화 블록 이름 = 줄 별칭 › 알약 이름 › 로직 이름(같은 호표에 여럿이면 처음 것 · 추정) · 블록 `kind` 글 「품셈」 그대로(엑셀 꼴) · 차례 = 조합 → 사전조합 → 일위대가화. +- 함께 고칠 흠(뒤집으면 모든 단가산출 줄로 번짐): + - (a) 산근 줄 수량 = `수량 ÷ 배`(:163 · :178 · :186)인데 산근 단가는 이미 1 단위(`Sangeun.py:258` ÷ 배) → 배 ≠ 1 로직(원/100개 · 원/10㎡)에서 금액이 1/배 — 산근 줄 = 수량 그대로 · 대가 줄만 ÷ 배(지금은 승격 줄 · 옛 SP 에만 숨은 흠 · 145-2 한 바퀴 시험은 배 1 로직이라 못 잡음). + - (b) `poomsem` 기계 줄 판정 = 따옴표 원문번호 글 맞춤(`MACHINE` :42 · :143-154) → `로직(GC000270, 기계=기계…)` · `기계=굴착기`(중간 이름) 줄 = 빈칸 → 실측 품셈 블록 빈칸의 뿌리 → `Sangeun._logic_line` 규칙(입력 「기계」 · EQ 잡기 `_captured` :155-174)으로 · 기계 아닌 하위 로직 줄(:145-152 빈칸 · ponytail) → `sangeun` 줄(하위 로직 + 인자 값 키 · :309-310 꼴). +- 재사용: `Sangeun.sangeun_key` · `_env` · `_captured` · `_logic_line` 판정(한 함수로 떼어 둘이 씀 · 추정) · `Builder.put` 같은 꼴 하나(:80-84) 그대로. +- 시험: `test_145_2_b09_labor_calc.py` 견본 사본 셋 고침(:269-299 꼴 「품셈 ×4」 · 승격 줄 = sangeun 단정 / :302-318 조합 줄 = 대가 블록 단정 / :368-414 승격 줄 = 산근 단정 — 석공 25.6 값은 그대로) · 새 = 일위대가화 = 대가 블록 · 단가산출 = 산근 줄 · 배 100 로직 산근 줄 수량 = 손 수량 · 기계 변수 줄 = machine. +- 위험: 대가 번호 바뀜(품셈 15 빠짐 → 내역 비고 「대가 n」 · 줄 키 `st:…#대가n` 바뀜 — 사용자 값은 자재 · 요율 칸뿐이라 안 끊김 `Store.py:77-101`) · 145 정함 뒤집음(새 계획서에 한 줄). +- 크기: 중간. +- ⬜ 물음 1: 사전조합(SC) 줄 — ① 대가 호표(겹 · 지금 그대로 · M02 구분 「일위조합」 · 엑셀 대가21 콘크리트비빔 꼴) ② 산근 — 추천 ①. + +## H2. 일위대가표 = 목록 항목의 하위 세부 + 금액 +- 현재: `UI_Tabs_Labor.ts:57-126` 블록마다 머리(제 n 호표 · 이름) · 품셈 인용 · 줄(명칭 · 규격 · 수량 · 단위 · 합계/노무/재료/경비 단가 · 금액) · 합계 — 값 = `Calc_Labor`(파이썬 · TS 짝 · 거울) · 비고 = `ref_no || why`(:90) · `ref_no` = 대가 줄만 「대가n」(`Calc_Labor.py:159-161` · `.ts:148-149`) · 산근 · 노무 · 자재 · 중기 줄 비고 빈칸. +- 엑셀: 일위대가표 A 명칭 · B 규격 · C 수량 · D 단위 · E/F 합계 · G/H 노무 · I/J 재료 · K/L 경비(단가 · 금액) · M 비고. + - 대가17(132~142줄) = 파쇄암 별도계상 「별산자재 25」 · 찰쌓기(켜쌓기) 1.57 「대가 6호표」 · 고임돌채집 0.24 「산근 10호표」 · 뒷채움 0.56 「산근 6호표」 · 막자갈채집 0.56 「산근 7호표」 · P.V.C PIPE 0.65 「자재 9」 · 콘크리트비빔 채움재 0.31 「산근 30호표」 · 모르터바르기 0.014 「대가 1호표」 · 합계. + - 대가6 찰쌓기(42~48) = 「건설표준품셈 7-1-2(찰쌓기)」 인용 · 석공 0.072 「노무 3」 · 보통인부 0.036 「노무 6」 · 굴삭기+부착용 집게(0.6m3) 0.27 「중기 20」 · 대가21(166~175) = 시멘트 · 모래 · 자갈 별도계상 · 콘크리트공 · 보통인부 · 콘크리트믹서사용 「산근 4호표」. + - 식 예: G136 `=단가산출근거목록표!F13` · H136 `=IF(C136=0,0,ROUNDDOWN(G136*C136,1))` · H142 `=ROUNDDOWN(SUMIF(P134:P141,O142,H134:H141),0)`. +- 어긋남: 꼴 · 칸은 맞음 · 내용만 H1 따라 바뀜(조합 줄 = 일위대가화 → 대가 n · 단가산출 → 산근 n · 자재) · 금액 빈칸 = 품셈 블록 빈 줄 탓(실측 조합 4 모두 빈칸 → 산근 풀이로 돌리면 13 중 12 값 · 남은 1 = H4 MO 키 흠 · 조합 합계도 그 흠만 빼면 값 · 추정) · 비고 「산근 n」 · 「노무 n」 없음. +- 고칠 자리: `Calc_Labor.py:159-161` · `.ts:148-149` 짝 — 산근 줄에도 `ref_no`(「산근n」 = 받은 산근 목록 줄 `no` · `Sangeun.py:353`) · `UI_Tabs_Labor.ts:90` 비고 · 산근 줄 누름 = 풀이 탭 `sg`(:32 지금 `sg_list` · 추정 권장) · 안내 글 :52 · :123. +- 재사용: 공용 표 그대로 · 노무 · 자재 · 중기 비고 번호 = 바탕 목록 `no`(`Calc_Base.py:109 · 299`). +- 시험: 거울 `test_145_2` :188-194(ref_no 두 짝 같이) · 엑셀 대가 검산 :107-134(대가1 109,259 · 2 16,001 · 9 52,943 · 14 101,522) = 합성 블록이라 그대로. +- 위험: 같은 파일 = 조사 G5(제목 볼드 · 「ㄴ」 나무 · 공용 표 `rowClass`) → 한 창 · H 먼저. +- 크기: 작음. + +## H3. 단가산출근거목록표 = 일위대가표 세부 항목 나열 +- 현재: `UI_Tabs_Sangeun.ts:33-57`(호표 · 명칭 · 규격(입력값) · 단위 · 합계 · 노무 · 재료 · 경비 · 「쓰는 구조물 n」) ← `Sangeun.collect` :341-366 ← `rows_of` :84-120 = **승격 줄**(:99) + 옛 SP 참조(:107-116)만 · 하위 산근(돈 로직 부르기 :307-314) 포함 · 같은 로직 + 같은 입력값(+ 켜쌓기율 · 고름) = 하나(:60-69) · 번호 = 사본 차례 첫 등장. +- 엑셀: 단가산출근거목록표 칸 = 일위대가목록표와 같음 · 46줄 = 대가가 쓰는 14 + 내역이 바로 쓰는 33(토공 · 운반 — 조합 밖 · 145 = 빈칸 「연결 없음」) · 산근 → 산근 있음(산근30 → 산근4) · 값 = 산근 총계(E9 `=단가산출근거!C354`) · 예 A9 「제 6호표」 B9 뒷채움 C9 「150m/m 내외」 D9 m3 · E9 8,328(6,878 · 538 · 912). +- 어긋남: 원천이 거꾸로(승격 줄 → 단가산출 줄) · 사전조합 안 로직 줄 · 일위대가화 줄의 하위 로직 빠짐. +- 고칠 자리: `Sangeun.py:84-120` `rows_of` — 원천 = 조합 사본의 승격 아닌 로직 줄(:99 조건 뒤집음) + 사전조합 `참조사본` 안 로직 줄(입력값 = 그 문서 값 · 옛 SP 길 :107-116 꼴 재사용) + 일위대가화 줄의 기계 아닌 하위 로직(`Solver` 에 「하위만 등록」 갈래 · `_logic_line` :307-310 재사용 · 일위대가화 줄 자체는 산근 아님) · 옛 SP = 산근 아님 · 키 = `Labor_Source` 산근 줄 키와 같은 `sangeun_key` · 머리글 :1-21 · `EMPTY` :50 · 안내 `UI_Tabs_Sangeun.ts:52-54`(「단가승격」 글 = 조사 A5 겹침) · 번호 = 일위대가표 첫 등장 차례(추정 권장). +- 재사용: `Solver` · `collect` · `price_of` 그대로 · 대가 쪽 이음 = 키(`Router.py:66-68` 그대로). +- 시험: `test_145_1_b09_sangeun.py` 다섯 고침(:55 승격 줄만 · :77 중기 · :107 같은 로직 · :129 「승격 없는 사본 = 빈 표」 · :145 단가 없음 — 승격 ↔ 단가산출 뒤집음) · 새 = 사전조합 안 줄 = 산근 · 일위대가화 하위 로직 = 산근 · 일위대가화 줄 자체 = 산근 아님. +- 위험: 산근 = 서버 단독(145-1) → 단가산출 줄이 모두 산근이 되면 조작 중 즉시 다시 셈 몫 줄어듦(자재 적용 단가 고침 → 조합 · 내역 금액은 [저장] 뒤 · 지금 산근 탭 안내 「[저장] 뒤 반영」이 일위대가표 · 내역까지 넓어짐) · 산근 수 늘어남(실측 1 → 13). +- 크기: 작음(H1 과 한 묶음). +- ⬜ 물음 2: 목록 범위 — ① 단가산출 줄(일위대가화 아닌 로직 줄) + 하위 산근만(엑셀 꼴 · 노무 · 자재 · 중기 줄은 각 목록표) ② 일위대가표 세부 줄 전부(자재 · 노무 · 중기 줄도) — 추천 ①. + +## H4. 단가산출근거 = 항목마다 계산을 푼 텍스트 수식 +- 현재: `UI_Tabs_Sangeun.ts:66-141` = 표 꼴(공종 · 산출내역 · 규격/까닭 · 수량 · 단위 · 단가 · 합계 · 노무 · 재료 · 경비 — 중기 = 노 · 재 · 경 세 줄 :88) · 식 글 없음 · 서버 `Sangeun.Solver` 줄 = 수 · 키만(`_line` :253-289 · `_logic_line` :291-314 · `_extras` :316-337) · 입력 · 중간(Q) 값은 셈에만(`_env` :139-152 · Q ROUND 2). +- 엑셀(단가산출근거 A 공종(출처 표) · B 산출내역(글) · C 합계 · D 노무 · E 재료 · F 경비 · 숨은 Z~AQ 연두 입력): + - 6호표 뒷채움(285~354): B286 「뒷채움 150m/m 내외 / m3」 · B289 「 건설표준품셈 3-4-2 기초다짐 및 뒷채움 적용 」 · A299 「노무 6」 B299 「 보통인부: 0.018 * 165,545 = 2,979.8」 · A308 「중기 2L」 B308 「 노무비: 55,700 * 0.07 = 3,899.0」 · B310 「 재료비: 7,695 * 0.07 = 538.6」 · B302 · B315 「소계」 · B318 「계」 · A354 「총 계」 C354 8,328. + - 7호표 막자갈채집(355~424): B372 「 q (버킷용량) = 0.7 , f (체적환산계수) = 1/1.125 = 0.89」 · B380 「 Q (시간당작업량) = 3600*q*K*f*E/Cm = 21.59 m3/hr 」 · A382 「중기 6L」 B382 「 노 무 비 : 55,700 / Q * 2 = 5,159.7」 · B412 「Q1 (시간당작업량) = 60 * q1 * f * E / Cm = 17.18 m3/hr 」. + - 29호표 유로폼: B1938 「 패널(유로폼) : 31,500 * 0.89 / 10 = 2,803.5」 · B1942 「 부자재(웨지핀, 플랫타이, 강관파이프, 훅) : 2,866.5 * 24 % = 687.9」 / 30호표: A1997 「산근 4호표」 B1997 「 콘크리트믹서사용 : 7,528 * 1 = 7,528.0」. + - 식 글 예: B380 `=" Q (시간당작업량) = "&Z380&"*q*K*f*E/Cm = "&AL380&" m3/hr "` · B299 `=" 보통인부: "&Z299&" * "&TEXT(I299,…)&" = "&TEXT(C299,"#,##0.0")` · D299 `=IF(H299=0,0,ROUNDDOWN(J299*H299,1))` · D354 `=ROUNDDOWN(SUMIF(N287:N318,M354,D287:D318),0)` — 글 = 값 칸을 이어 붙인 것 · 셈은 옆 칸. +- 엔진이 글을 낼 수 있나 = 있음: + - `resources/master_data/scripts/master_text.py`(「사람이 읽는 식 줄」 :1-15) · `lines()`(:493-613) = 줄마다 `글`(값 꼴 「단가 * 수량식 = 금액」 · 표 찾기 · 중간 이름은 수로) · `이름글`(이름 꼴 「석공노임 * 메쌓기인력.석공 * (1 + 증가율 %) = 석공비」) · 비목 묶음 소계 · 끝수 한 마디 · 낮은 부품 `render`(:65 값 꼴 · 「/ 100」 → %) · `named` · `_names`(:86 · :483) · `fmt` · `fmt_money` · `fmt_price`(:36-62). + - 길 = `POST …/text`(`M01_MasterData/M01_MasterData_Router.py:240-247` → `M01_MasterData_Store.text` :573-584) · 화면 = M01 로직 실험실 「텍스트 수식」(`M01_MasterData_UI_LogicLab_Formula.ts` · 이름 꼴 · 값 꼴 두 칸 짝) · M02 DataFlow 「식 보기」(`M02_MasterTemplete/DataFlow/M02_DF_FormulaView.ts` · 흐름 로직용 · 마스터 흐름 로직 0개라 무관) · M02 일위대가 입력 모달 = 입력값만(`M02_MasterTemplete_Labor_Input.ts:1-5`) · B09 = 없음. + - 로직 정의 글: `로직_*.json` 1,469줄 = 입력(이름 · 설명 387/3,502 · 단위 · 고르기 · 출처) · 중간(이름 · 식 3,166 · 출처 1,269 · 설명 없음) · 호표(종류 · 요소 · 이름 · 단위 · 수량 식 · 비목) · 덧줄(식) · 결과단위 · 출처 — 식은 다 글로 남음. + - `lines()` 를 그대로 못 쓰는 까닭: 단가 = 엔진(M01 · 사본) 값이 글에 박힘(B09 = 굳힌 단가) · 중간 줄 없음(「1 / Q」 → 「1 / 4.6」 으로 녹음) · 끝수 = 원 정수 표시(엑셀 = 줄 ROUNDDOWN 1) · ÷ 배 · 켜쌓기율 꼬리 없음. +- 시안(실측 사본 GF000218 규격 150 · B09 단가 · 읽기 스크립트): 「보통인부 : 172,068 * 0.022 = 3,785.4」 · 「굴착기(무한궤도) 0.2㎥ 노무비 : 59,020 * 0.087 = 5,134.7」 · 총계 18,064 / GF000213 중간 「비율 = 큰돌채집주속계산용수_규격.적용 % * 1 = 0.75」 · 줄 「2.6 * 0.75」 — 글 속 수 = 지금 산근 줄 값과 같음. +- 고칠 자리: + - 서버 `Sangeun.py` — 블록 `head` 글(「이름 / 단위」 · 출처 · 입력 「이름 : 값 단위」 · 중간 「이름 = 이름식 = 값」) + 줄 `text`(`_line` · `_logic_line` 「이름 : B09 단가 * 수량식(값 꼴)[ / 배][ * 율 %] = 금액」 · 중기 = 노 · 재 · 경 셋 · 하위 산근 = 「산근 n 단가 * 수량」 · `_extras` = 식 값 꼴(B09 비목 합) = 금액) · 비목 묶음 소계(엑셀 단원 꼴) · 계 · 총계 — 서버 단독 그대로(화면은 받은 그대로 `UI_Shell.ts:110`). + - 화면 `UI_Tabs_Sangeun.ts:66-141` `buildSg` — 열 = 공종(「노무 n」 · 「중기 n」 · 「자재 n」 · 「산근 n호표」) · 산출내역(글 · 넓은 칸) · 합계 · 노무비 · 재료비 · 경비(엑셀 A~F) · 줄 = 머리 → 입력 · 중간 → 줄 → 소계 → 계 → 총계. + - 함께 고칠 흠: 산근 자재 키 = 자리표시 글 그대로(`_line` :278-280 · 「MO:경유:전국평균」) → 대비표 키(MO000002)와 안 맞아 빈칸(실측 「MG 굴착기 작업」 1곳) → `whole.get(글)` 의 「키」로. +- 재사용: `m01.mtx`(`M01_MasterData_Store.py:26` 이 이미 적재 · `render` · `_names` · `fmt*` · `mc.aliases` · `mc.names`) · `Sangeun._env`(중간 값 · Q ROUND 2) · 공용 표. +- 시험: 새(장 번호 꼴) = 글 끝 수 = 금액 칸 수 · Q 로직 중간 줄 · 배 100 로직 꼬리 「/ 100」 · 덧줄 「%」 · MO 키 자재 줄 값 · 엑셀 6호표 꼴 대조(순수 셈 · `test_145_1:93-104` 곁) · 화면 문자열 시험 `test_145_1:172-179` 고침. +- 위험: 공용 표 칸 = 한 줄 · `nowrap` · 말줄임(`ui_template/ui_template_data_table.css:53-54` · 줄 높이 고정 창) → 긴 식 잘림 → 칸 넓게(~520px · 추정) · 이름 꼴 별칭이 길고 낯섦(「기초다짐및뒷채움기계_보통인부.수량」) → 중간 줄만 이름 꼴 · 호표 줄은 값 꼴 · 중간 설명(「시간당작업량」) 원천 없음. +- 크기: 중간~큼. +- ⬜ 물음 3: 글 꼴 — ① 엑셀 꼴 한 칸(호표 줄 = 값 꼴 · 중간 = 「Q = 이름식 = 값」 · 입력 = 「이름 : 값」) ② M01 「텍스트 수식」 두 칸(이름 꼴 · 값 꼴 짝) — 추천 ①. + +## H5. 사슬 영향 — 네 탭 원천을 바꾸면 + +| 자리 | 바뀜 | 시험 | +|---|---|---| +| 일위대가목록 · 일위대가표 | 품셈(단가산출 줄) 빠짐 · 일위대가화 들어옴 · 대가 번호 바뀜 · 조합 줄 = 대가 n · 산근 n · 자재 | 145-2 견본 셋 고침 · 엑셀 대가 검산 · 거울 = 합성 블록이라 그대로 | +| 산근목록 · 산근 | 원천 뒤집음 · 개수 늘어남 · 글 생김 | 145-1 다섯 + 화면 문자열 하나 고침 · 6호표 8,328 셈 그대로 | +| 설계내역서 | 구조물 줄 단가 = 조합 블록 합계(`daega_owners` 이음 · `Calc_Bill.py:110-131` 그대로) · 값만 바뀜(지금 빈칸 → 값) · 비고 · 줄 키 「#대가n」 번호 | 145-3 합성 → 그대로 | +| 총괄 · 원가계산서 | 내역 비목 합 따라 값만 | 145-4 엑셀 비목 합 입력 → 총공사비 1,201,879,000 그대로 | +| 집계표 넷 | `hopyo_lines`(`Summary.py:158-160`) = 산근 + 대가 블록 키 합침 → 전개 길만 조합 → 산근 → 자원 · 합 같은 꼴(추정) | 145-5 합성 → 그대로 · 145-2 한 바퀴 석공 25.6 = 같은 값(꼴 단정만 고침) | +| 화면 짝 셈 | 산근 = 서버 단독 · 대가 = 짝 → 조작 중 즉시 몫 줄어듦(H3 위험) | - | +| B08 · M02 | 안 바뀜(M02 = 화면 글 「일위대가화」 조사 A5 · 저장 키 `승격` 그대로) | - | + +- 엑셀 검산 시험(1,201,879,000 · 대가 넷 · 6호표 8,328 · 집계표 · 내역 G9 등) = 모두 합성 입력이라 안 깨짐 · 깨지는 것 = 사본 견본 시험 8(145-1 다섯 · 145-2 셋) + 화면 문자열 하나. + +## 고칠 파일 목록 + +| 파일 | 요구 | 줄 수(지금 → 예상) | 700 | +|---|---|---|---| +| `Labor_Source.py` | H1 · H2 | 331 → ~330(글 맞춤 판정 지우고 Sangeun 판정 씀) | 안전 | +| `Sangeun.py` | H1 · H3 · H4 | 377 → ~480(글 짓기를 떼면 새 파일 하나) | 안전 | +| `Calc_Labor.py` · `Calc_Labor.ts`(짝) | H2 | 198 · 185 → +2 씩 | 안전 | +| `UI_Tabs_Labor.ts` | H2(+ G5 겹침) | 126 → ~130 | 안전 | +| `UI_Tabs_Sangeun.ts` | H3 · H4 | 141 → ~150 | 안전 | +| `resources/tester/test_145_1_b09_sangeun.py` · `test_145_2_b09_labor_calc.py` + 새 시험 | H1~H4 | 179 · 414 | 안전 | + +- 안 고침: `Router.py`(차례 바탕 → 산근 → 대가 → 내역 → 총괄 그대로) · `Summary.py` · `Calc_Bill.*` · `Bill_Items.py` · `Linked.py` · `UI_Shell.ts` · M02 · `resources/master_data`(엔진 글 부품은 읽어 씀). +- 겹침: 조사 A5(「단가승격」 글 — `UI_Tabs_Sangeun.ts:53` · `Sangeun.py:50`) · 조사 G5(`UI_Tabs_Labor.ts` · 공용 표 `rowClass`) → B09 한 창 · H 먼저.