diff --git a/M01_MasterData/M01_MasterData_UI_Test_Pick.ts b/M01_MasterData/M01_MasterData_UI_Test_Pick.ts index c587668b..ccf07618 100644 --- a/M01_MasterData/M01_MasterData_UI_Test_Pick.ts +++ b/M01_MasterData/M01_MasterData_UI_Test_Pick.ts @@ -56,6 +56,22 @@ const label = (it: Brief): string => { return [`${it.이름 ?? ""} ${it.규격 ?? ""}`.trim(), ...prices].join(" · "); }; +const oldNames = (one: LogicOne, line: HoLine): string[] => { + const brief = one.prices[line.요소 as string] as { 이름?: string; 원문번호?: string } | null; + const names = [brief?.이름, brief?.원문번호, (line.이름 ?? "").split(/[\s(·]/)[0]]; + return [...new Set(names.filter((n): n is string => !!n))]; +}; + +/** 이름을 차례로 찾아 후보가 나오는 첫 결과 — 다 비면 마지막 결과 */ +async function firstFound(names: string[]): Promise>> { + let last = await searchPrice(names[0] ?? ""); + for (const name of names.slice(1)) { + if (last.items.length) break; + last = await searchPrice(name); + } + return last; +} + function pickRow(one: LogicOne, line: HoLine, i: number, swaps: Swaps, onChange: () => void) { const cond = typeof line.요소 === "object" ? (line.요소 as unknown as Record) : null; @@ -119,7 +135,7 @@ function pickRow(one: LogicOne, line: HoLine, i: number, swaps: Swaps, onChange: region: "울진", }) : line.종류 === "재료" - ? searchPrice(one.prices[line.요소 as string]?.이름 ?? (line.이름 ?? "").split(/[\s(·]/)[0]) // 옛 줄(고르기 조건 없음) — 품셈재료 이름 · 없으면 이름 첫 낱말 + ? firstFound(oldNames(one, line)) // 옛 줄(고르기 조건 없음) — 품셈재료 이름 → 원문번호 → 이름 첫 낱말 순으로 찾아 나온 첫 것 : searchElements(line.종류, line.이름 ?? ""); void found .then((r) => { diff --git a/resources/master_data/ref/_검증_테스트_컨테이너.md b/resources/master_data/ref/_검증_테스트_컨테이너.md new file mode 100644 index 00000000..3f7673d6 --- /dev/null +++ b/resources/master_data/ref/_검증_테스트_컨테이너.md @@ -0,0 +1,137 @@ +# 로직 테스트 컨테이너 검증 — 대상 로직 10개 × 방식 A·B·C + +ORCA 로 열기 → 기본 입력으로 계산 → 금액 대조. 입력 = 고르기 칸은 첫 값 · 수 칸은 범위 최솟값+1(없으면 5) · 자재지역 「울진」 · 아래 표 밖 값은 비고. 「같음」 = 세 방식 금액이 서로 같고 서버 계산(`/calc`)과도 같음. + +| 로직 | 공종 | A | B | C | 판정 | 비고 | +|---|---|---|---|---|---|---| +| GF000181 | 12-16 맨홀 | 멈춤 | 미측정 | 멈춤 | 자료 | 레미콘 규격 고른 뒤 「사다리」 단가 비어 있어 멈춤 · 방식 A·C 같은 까닭 | +| GF000177 | 날개벽 | 11,386,140.96 | 11,386,140.96 | 11,386,140.96 | 같음 | 레미콘 규격을 「쓰이는 재료·기계」에서 골라야 계산됨 | +| GF000173 | VR관(소켓식) 부설 | 멈춤 | 멈춤 | 멈춤 | 자료 | 「MP000023 VR관(소켓식)」 단가 비어 있음 | +| GF000174 | 흄관 부설 | 멈춤 | 멈춤 | 멈춤 | 자료 | 「MP000025 흄관」 단가 비어 있음 | +| GF000160 | 합판거푸집 | 122,364.53 | 122,364.53 | 122,364.53 | 같음 | | +| GF000182 | 펌프카 타설 | 13,455.71 | 13,455.71 | 13,455.71 | 같음 | B 가 하위 로직 줄(공구손료)을 빠뜨리던 것 고침 | +| GF000069 | 우드그래플 집재 | 24,198.18 | 24,198.18 | 24,198.18 | 같음 | 최대집재거리 50 · 집재재적 50 (5 는 표에 줄 없음) | +| GF000219 | 돌쌓기 메쌓기 | 85,378.10 | 85,378.10 | 85,378.10 | 같음 | 돌 「깬잡석」 (첫 값 「견치돌」 은 표에 줄 없음) | +| GF000119 | 노체포설 | 4,522.96 | 4,522.96 | 4,522.96 | 같음 | | +| GF000137 | 중기운반 트레일러 | 92,050.60 | 92,050.60 | 92,050.60 | 같음 | | + +## 요약 + +- 30칸 가운데 21칸 계산됨 · 서로 같음(로직 7개). 열림은 30칸 모두 됨. +- 멈춘 3개 로직(맨홀 · VR관 · 흄관)은 화면 탓이 아님 — 자료의 단가가 비어 있음. + +## 고친 것 (테스트 컨테이너 안) + +- B: 호표 줄보다 많이 풀린 하위 로직 줄이 안 보이던 것 · 합계 줄 추가. +- 옛 재료 줄(맨홀 레미콘): 이름 찾기가 0건이라 규격을 못 고르던 것 — 품셈재료 이름 → 원문번호 → 이름 첫 낱말 순으로 찾음. +- 멈춤 까닭 쉬운 말: 규격 여럿 · 단가 비어 있음. +- B: 고르기 칸을 첫 값으로 시작(C 와 같게). + +## 자료·서버 몫 (고치지 않음) + +- 맨홀 「MP000012 사다리」 · VR관 「MP000023」 · 흄관 「MP000025」 단가 비어 있음. +- 옛 재료 줄은 규격 여럿이면 기본으로 계산되지 않음 — 기본 규격이 있으면 열자마자 셈됨. + +## 입력 이름 설명 대기 목록 + +데이터에 입력 설명 칸이 생기면 채울 자리 — 로직 키 · 입력 이름 · 단위 · 종류(고르기 / 수). + +| 로직 키 | 공종 | 입력 이름 | 단위 | 종류 | +|---|---|---|---|---| +| GF000181 | 맨홀 | 구체콘크리트량 | ㎥ | 수 | +| GF000181 | 맨홀 | 버림콘크리트량 | ㎥ | 수 | +| GF000181 | 맨홀 | 원형거푸집_기초및슬라브면적 | ㎡ | 수 | +| GF000181 | 맨홀 | 원형거푸집_벽체면적 | ㎡ | 수 | +| GF000181 | 맨홀 | 거푸집면적 | ㎡ | 수 | +| GF000181 | 맨홀 | 철근량 | ton | 수 | +| GF000181 | 맨홀 | 사다리량 | ton | 수 | +| GF000181 | 맨홀 | 지역 | | 고르기 | +| GF000181 | 맨홀 | 합판 | | 고르기 | +| GF000181 | 맨홀 | 각재 | | 고르기 | +| GF000181 | 맨홀 | 철선 | | 고르기 | +| GF000181 | 맨홀 | 못 | | 고르기 | +| GF000181 | 맨홀 | 박리제 | | 고르기 | +| GF000181 | 맨홀 | 높이할증 | % | 수 | +| GF000181 | 맨홀 | 소형할증 | % | 수 | +| GF000181 | 맨홀 | 폼타이 | | 고르기 | +| GF000181 | 맨홀 | 소형가산 | % | 수 | +| GF000181 | 맨홀 | 결속선 | | 고르기 | +| GF000181 | 맨홀 | 자재지역 | | 수 | +| GF000177 | 날개벽 | 콘크리트량 | ㎥ | 수 | +| GF000177 | 날개벽 | 거푸집면적 | ㎡ | 수 | +| GF000177 | 날개벽 | 기초잡석량 | ㎥ | 수 | +| GF000177 | 날개벽 | 철근량 | ton | 수 | +| GF000177 | 날개벽 | 성토부 | | 고르기 | +| GF000177 | 날개벽 | 합판 | | 고르기 | +| GF000177 | 날개벽 | 각재 | | 고르기 | +| GF000177 | 날개벽 | 철선 | | 고르기 | +| GF000177 | 날개벽 | 못 | | 고르기 | +| GF000177 | 날개벽 | 박리제 | | 고르기 | +| GF000177 | 날개벽 | 높이할증 | % | 수 | +| GF000177 | 날개벽 | 소형할증 | % | 수 | +| GF000177 | 날개벽 | 폼타이 | | 고르기 | +| GF000177 | 날개벽 | 소형가산 | % | 수 | +| GF000177 | 날개벽 | 결속선 | | 고르기 | +| GF000177 | 날개벽 | 브레이커 | | 고르기 | +| GF000177 | 날개벽 | 지역 | | 고르기 | +| GF000177 | 날개벽 | 보정작업 | | 고르기 | +| GF000177 | 날개벽 | 자재지역 | | 수 | +| GF000173 | VR관(소켓식) 부설 | 관경 | ㎜ | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 기초콘크리트량 | ㎥/m | 수 | +| GF000173 | VR관(소켓식) 부설 | 거푸집면적 | ㎡/m | 수 | +| GF000173 | VR관(소켓식) 부설 | 지역 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 합판 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 각재 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 철선 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 못 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 박리제 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 높이할증 | % | 수 | +| GF000173 | VR관(소켓식) 부설 | 소형할증 | % | 수 | +| GF000173 | VR관(소켓식) 부설 | 폼타이 | | 고르기 | +| GF000173 | VR관(소켓식) 부설 | 자재지역 | | 수 | +| GF000174 | 흄관 부설 | 관경 | ㎜ | 고르기 | +| GF000174 | 흄관 부설 | 기초콘크리트량 | ㎥/m | 수 | +| GF000174 | 흄관 부설 | 거푸집면적 | ㎡/m | 수 | +| GF000174 | 흄관 부설 | 지역 | | 고르기 | +| GF000174 | 흄관 부설 | 합판 | | 고르기 | +| GF000174 | 흄관 부설 | 각재 | | 고르기 | +| GF000174 | 흄관 부설 | 철선 | | 고르기 | +| GF000174 | 흄관 부설 | 못 | | 고르기 | +| GF000174 | 흄관 부설 | 박리제 | | 고르기 | +| GF000174 | 흄관 부설 | 높이할증 | % | 수 | +| GF000174 | 흄관 부설 | 소형할증 | % | 수 | +| GF000174 | 흄관 부설 | 폼타이 | | 고르기 | +| GF000174 | 흄관 부설 | 자재지역 | | 수 | +| GF000160 | 합판거푸집 | 횟수 | | 고르기 | +| GF000160 | 합판거푸집 | 합판 | | 고르기 | +| GF000160 | 합판거푸집 | 각재 | | 고르기 | +| GF000160 | 합판거푸집 | 철선 | | 고르기 | +| GF000160 | 합판거푸집 | 못 | | 고르기 | +| GF000160 | 합판거푸집 | 박리제 | | 고르기 | +| GF000160 | 합판거푸집 | 높이할증 | % | 수 | +| GF000160 | 합판거푸집 | 소형할증 | % | 수 | +| GF000160 | 합판거푸집 | 폼타이 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 작업조 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 슬럼프 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 시설유형 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 현장조건 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 재세팅 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 진동기 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 타설방법 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 펌프차 | | 고르기 | +| GF000182 | 펌프카 타설(편성 · 일일 시공량) | 지역 | | 고르기 | +| GF000069 | 동력상하차기(우드그래플) 집재 | 최대집재거리 | m | 수 | +| GF000069 | 동력상하차기(우드그래플) 집재 | 집재재적 | ㎥/ha | 수 | +| GF000069 | 동력상하차기(우드그래플) 집재 | 원목길이 | m | 고르기 | +| GF000069 | 동력상하차기(우드그래플) 집재 | 잔존목 | | 고르기 | +| GF000069 | 동력상하차기(우드그래플) 집재 | 지역 | | 고르기 | +| GF000219 | 돌쌓기 메쌓기(인력) | 뒷길이 | ㎝ | 고르기 | +| GF000219 | 돌쌓기 메쌓기(인력) | 돌 | | 고르기 | +| GF000219 | 돌쌓기 메쌓기(인력) | 쌓기 | | 고르기 | +| GF000219 | 돌쌓기 메쌓기(인력) | 높이 | m | 수 | +| GF000219 | 돌쌓기 메쌓기(인력) | 초과증가율 | % | 수 | +| GF000119 | 노체포설(굴착기 0.7㎥ 무한궤도) | 지역 | | 고르기 | +| GF000119 | 노체포설(굴착기 0.7㎥ 무한궤도) | 보정작업 | | 고르기 | +| GF000137 | 중기운반 트레일러(20ton) | t2 | 분 | 수 | +| GF000137 | 중기운반 트레일러(20ton) | 지역 | | 고르기 | +| GF000137 | 중기운반 트레일러(20ton) | 운반수단 | | 고르기 |