feat(master_data): 관급 제조사별 최저가 채움 · 조달청 2차 받기 · 짝짓기 갈래 · 새 줄 380

- 제조사별로 값이 갈리면 같은 규격 최저가 + 비고에 제조사 (보류 394 채움)
- 조달청 분류 23개 더 받음 (원본 gz 보관) · 시멘트 · 조경석 · 주철관 · 이음관 · 골재 · 측구수로관 · 볼라드 · 맨홀 · 용접철망 · 돌망태 · 매트 짝짓기
- 조달청에만 있는 금속돌망태 372 · 토목용부직포 8 을 자재품목에 새 줄로 들임 (키대장 갱신)
- 다산 값 대조 기준 ±5% · 짝짓기 시험 11건 · 설계 문서 갱신

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PAdA5ThqmtVSsbzjusk1cJ
This commit is contained in:
2026-09-20 18:06:15 +09:00
co-authored by Claude Sonnet 5
parent ce38094e91
commit e44365365b
38 changed files with 2061 additions and 946 deletions
@@ -4,14 +4,45 @@
| 파일 | 오퍼레이션 | 분류명 | 줄 수 |
|---|---|---|---|
| MASCntrct_레미콘.json.gz | getMASCntrctPrdctInfoList | 레미콘 | 26,384 (totalCount 26,384) |
| ThptyUcntrct_레미콘.json.gz | getThptyUcntrctPrdctInfoList | 레미콘 | 128 (totalCount 128) |
| MASCntrct_아스팔트콘크리트.json.gz | getMASCntrctPrdctInfoList | 아스팔트콘크리트 | 17,949 (totalCount 17,949) |
| Ucntrct_아스팔트콘크리트.json.gz | getUcntrctPrdctInfoList | 아스팔트콘크리트 | 17 (totalCount 17) |
| ThptyUcntrct_아스팔트콘크리트.json.gz | getThptyUcntrctPrdctInfoList | 아스팔트콘크리트 | 13 (totalCount 13) |
| MASCntrct_봉강.json.gz | getMASCntrctPrdctInfoList | 봉강 | 1,039 (totalCount 1,039) |
| MASCntrct_H빔.json.gz | getMASCntrctPrdctInfoList | H빔 | 181 (totalCount 181) |
| MASCntrct_파형강관.json.gz | getMASCntrctPrdctInfoList | 파형강관 | 6,970 (totalCount 6,970) |
| ThptyUcntrct_파형강관.json.gz | getThptyUcntrctPrdctInfoList | 파형강관 | 1,573 (totalCount 1,573) |
| MASCntrct_콘크리트관.json.gz | getMASCntrctPrdctInfoList | 콘크리트관 | 504 (totalCount 504) |
| Ucntrct_콘크리트관.json.gz | getUcntrctPrdctInfoList | 콘크리트관 | 10 (totalCount 10) |
| MASCntrct_레미콘.json.gz | getMASCntrctPrdctInfoList | 레미콘 | 26,384 |
| ThptyUcntrct_레미콘.json.gz | getThptyUcntrctPrdctInfoList | 레미콘 | 128 |
| MASCntrct_아스팔트콘크리트.json.gz | getMASCntrctPrdctInfoList | 아스팔트콘크리트 | 17,949 |
| Ucntrct_아스팔트콘크리트.json.gz | getUcntrctPrdctInfoList | 아스팔트콘크리트 | 17 |
| ThptyUcntrct_아스팔트콘크리트.json.gz | getThptyUcntrctPrdctInfoList | 아스팔트콘크리트 | 13 |
| MASCntrct_봉강.json.gz | getMASCntrctPrdctInfoList | 봉강 | 1,039 |
| MASCntrct_H빔.json.gz | getMASCntrctPrdctInfoList | H빔 | 181 |
| MASCntrct_파형강관.json.gz | getMASCntrctPrdctInfoList | 파형강관 | 6,970 |
| ThptyUcntrct_파형강관.json.gz | getThptyUcntrctPrdctInfoList | 파형강관 | 1,573 |
| MASCntrct_콘크리트관.json.gz | getMASCntrctPrdctInfoList | 콘크리트관 | 504 |
| Ucntrct_콘크리트관.json.gz | getUcntrctPrdctInfoList | 콘크리트관 | 10 |
| MASCntrct_시멘트.json.gz | getMASCntrctPrdctInfoList | 시멘트 | 8 |
| MASCntrct_골재.json.gz | getMASCntrctPrdctInfoList | 골재 | 136 |
| MASCntrct_조경석.json.gz | getMASCntrctPrdctInfoList | 조경석 | 836 |
| Ucntrct_주철관.json.gz | getUcntrctPrdctInfoList | 주철관 | 167 |
| MASCntrct_파형강관이음관.json.gz | getMASCntrctPrdctInfoList | 파형강관이음관 | 2,373 |
| ThptyUcntrct_파형강관이음관.json.gz | getThptyUcntrctPrdctInfoList | 파형강관이음관 | 409 |
| MASCntrct_배수로.json.gz | getMASCntrctPrdctInfoList | 배수로 | 4,651 |
| ThptyUcntrct_배수로.json.gz | getThptyUcntrctPrdctInfoList | 배수로 | 6 |
| MASCntrct_블록.json.gz | getMASCntrctPrdctInfoList | 블록 | 23,540 |
| Ucntrct_블록.json.gz | getUcntrctPrdctInfoList | 블록 | 2 |
| ThptyUcntrct_블록.json.gz | getThptyUcntrctPrdctInfoList | 블록 | 731 |
| MASCntrct_돌망태.json.gz | getMASCntrctPrdctInfoList | 돌망태 | 844 |
| ThptyUcntrct_돌망태.json.gz | getThptyUcntrctPrdctInfoList | 돌망태 | 18 |
| MASCntrct_합성목재.json.gz | getMASCntrctPrdctInfoList | 합성목재 | 198 |
| MASCntrct_볼라드.json.gz | getMASCntrctPrdctInfoList | 볼라드 | 4,681 |
| MASCntrct_교량받침.json.gz | getMASCntrctPrdctInfoList | 교량받침 | 4,081 |
| ThptyUcntrct_교량받침.json.gz | getThptyUcntrctPrdctInfoList | 교량받침 | 5,211 |
| MASCntrct_용접철망.json.gz | getMASCntrctPrdctInfoList | 용접철망 | 700 |
| ThptyUcntrct_섬유.json.gz | getThptyUcntrctPrdctInfoList | 섬유 | 4 |
| MASCntrct_폴리에틸렌.json.gz | getMASCntrctPrdctInfoList | 폴리에틸렌 | 9,982 |
| ThptyUcntrct_폴리에틸렌.json.gz | getThptyUcntrctPrdctInfoList | 폴리에틸렌 | 1,835 |
| MASCntrct_맨홀.json.gz | getMASCntrctPrdctInfoList | 맨홀 | 11,495 |
| MASCntrct_매트.json.gz | getMASCntrctPrdctInfoList | 매트 | 4,087 |
| ThptyUcntrct_매트.json.gz | getThptyUcntrctPrdctInfoList | 매트 | 98 |
| MASCntrct_낙석.json.gz | getMASCntrctPrdctInfoList | 낙석 | 2,057 |
| ThptyUcntrct_그레이팅.json.gz | getThptyUcntrctPrdctInfoList | 그레이팅 | 114 |
| MASCntrct_벽돌.json.gz | getMASCntrctPrdctInfoList | 벽돌 | 370 |
| ThptyUcntrct_시트.json.gz | getThptyUcntrctPrdctInfoList | 시트 | 39 |
| MASCntrct_비료.json.gz | getMASCntrctPrdctInfoList | 비료 | 101 |
| MASCntrct_압륜.json.gz | getMASCntrctPrdctInfoList | 압륜 | 142 |
| ThptyUcntrct_부직포.json.gz | getThptyUcntrctPrdctInfoList | 부직포 | 8 (totalCount 8) |
+381 -1
View File
@@ -1,5 +1,5 @@
{
"다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 23981, "MO": 37, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 249, "CC": 336, "GC": 1104, "QC": 2060},
"다음": {"LB": 409, "EQ": 655, "RT": 20, "MN": 7000, "MT": 24361, "MO": 37, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 249, "CC": 336, "GC": 1104, "QC": 2060},
"폐기": {"MN": "재료_나라장터자재 — old 로 옮김 · 로직은 자재품목·품셈재료로 갈아 끼움"},
"키": {
"CC000001": {"원문번호": "공통 1-3-1 콘크리트 및 포장용 재료", "파일": "계수_건설품셈_01장_적용기준.json"},
@@ -27292,6 +27292,386 @@
"MT023978": {"원문번호": "M0005250036", "파일": "재료_자재품목.json"},
"MT023979": {"원문번호": "M0005250037", "파일": "재료_자재품목.json"},
"MT023980": {"원문번호": "M0005250038", "파일": "재료_자재품목.json"},
"MT023981": {"원문번호": "조달청 토목용부직포 50×2×t1.8~6mm", "파일": "재료_자재품목.json"},
"MT023982": {"원문번호": "조달청 토목용부직포 50×2×t4~9mm", "파일": "재료_자재품목.json"},
"MT023983": {"원문번호": "조달청 토목용부직포 50×2×t6~12mm", "파일": "재료_자재품목.json"},
"MT023984": {"원문번호": "조달청 토목용부직포 50×2×t1~5mm", "파일": "재료_자재품목.json"},
"MT023985": {"원문번호": "조달청 토목용부직포 50×2×t2~7mm", "파일": "재료_자재품목.json"},
"MT023986": {"원문번호": "조달청 토목용부직포 50×2×t3~8mm", "파일": "재료_자재품목.json"},
"MT023987": {"원문번호": "조달청 토목용부직포 50×2×t5~10mm", "파일": "재료_자재품목.json"},
"MT023988": {"원문번호": "조달청 토목용부직포 50×2×t5~11mm", "파일": "재료_자재품목.json"},
"MT023989": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ3.2mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT023990": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ4mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT023991": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ4mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT023992": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT023993": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선4종Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT023994": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT023995": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT023996": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT023997": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT023998": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT023999": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 육각보강매트리스형", "파일": "재료_자재품목.json"},
"MT024000": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024001": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선Φ3.2mm, 사각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024002": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선Φ3.2mm, 사각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024003": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선Φ3.2mm, 사각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024004": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024005": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024006": {"원문번호": "조달청 금속돌망태 L2000×W1000×H1000mm, 아연도금철선5종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024007": {"원문번호": "조달청 금속돌망태 L1000×W1000×H1000mm, 아연도금철선5종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024008": {"원문번호": "조달청 금속돌망태 L1500×W1000×H1000mm, 아연도금철선5종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024009": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024010": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 중첩육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024011": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024012": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선4종Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024013": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ4mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024014": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ4mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024015": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ4mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT024016": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선4종Φ3.2mm, 사각보강매트리스", "파일": "재료_자재품목.json"},
"MT024017": {"원문번호": "조달청 금속돌망태 1000×1000×300mm, 아연도금철선4종Φ3.2mm, 사각보강매트리스", "파일": "재료_자재품목.json"},
"MT024018": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT024019": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT024020": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ4mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024021": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ4mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024022": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024023": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024024": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024025": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선5종Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024026": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선Φ3.2mm, 사각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024027": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024028": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각개비온-상자형", "파일": "재료_자재품목.json"},
"MT024029": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024030": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024031": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온상자형, 아연도금철선, Φ2.7-3.4mm", "파일": "재료_자재품목.json"},
"MT024032": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온상자형, 아연도금철선, Φ2.7-3.4mm", "파일": "재료_자재품목.json"},
"MT024033": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온상자형, 아연도금철선, Φ2.7-3.4mm", "파일": "재료_자재품목.json"},
"MT024034": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024035": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선5종2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024036": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024037": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선5종2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024038": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024039": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024040": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024041": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024042": {"원문번호": "조달청 금속돌망태 (부품)450×950mm, 아연도금철선3종4.5mm, 타원형-뚜껑", "파일": "재료_자재품목.json"},
"MT024043": {"원문번호": "조달청 금속돌망태 450×950mm, 아연도금철선3종4.0mm, 타원형-몸통", "파일": "재료_자재품목.json"},
"MT024044": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온상자형-아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024045": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온상자형-아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024046": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온상자형-아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024047": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024048": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024049": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024050": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024051": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024052": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024053": {"원문번호": "조달청 금속돌망태 450×450mm, 아연도금철선3종Φ4.0mm, 원형몸통", "파일": "재료_자재품목.json"},
"MT024054": {"원문번호": "조달청 금속돌망태 450×450mm, 아연도금철선3종Φ4.0mm, 원형뚜껑", "파일": "재료_자재품목.json"},
"MT024055": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024056": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024057": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024058": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각상자형, 아연도금철선5종Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024059": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각상자형, 아연도금철선5종Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024060": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각상자형, 아연도금철선5종Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024061": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm외, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024062": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm외, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024063": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024064": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024065": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 육각개비온상자형-아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024066": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024067": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024068": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024069": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024070": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 슈퍼개비온, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024071": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 슈퍼개비온, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024072": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 슈퍼개비온, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024073": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024074": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024075": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024076": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 아연도금철선5종Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024077": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 아연도금철선5종Φ2.7mm, 육각상자형", "파일": "재료_자재품목.json"},
"MT024078": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024079": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024080": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024081": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024082": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024083": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각상자형, 아연도금철선4종Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024084": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각상자형, 아연도금철선4종Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024085": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm사각상자형, 아연도금철선4종Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024086": {"원문번호": "조달청 금속돌망태 육각개비온, 1500×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024087": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm외, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024088": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024089": {"원문번호": "조달청 금속돌망태 육각개비온, 2000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024090": {"원문번호": "조달청 금속돌망태 육각개비온, 1000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024091": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 육각보강매트리스형", "파일": "재료_자재품목.json"},
"MT024092": {"원문번호": "조달청 금속돌망태 1000×1000×400mm, 아연도금철선5종Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024093": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선5종/4종Φ2.7/3.2mm, 전면부사각테두리보강복합개비온", "파일": "재료_자재품목.json"},
"MT024094": {"원문번호": "조달청 금속돌망태 1500×1000×400mm, 아연도금철선5종/4종Φ2.7/3.2mm, 칸막이상단테두리보강복합매트리스개비온", "파일": "재료_자재품목.json"},
"MT024095": {"원문번호": "조달청 금속돌망태 사각-상자형, 아연도금철선4종Φ3.2mm, 1000×500×2000mm", "파일": "재료_자재품목.json"},
"MT024096": {"원문번호": "조달청 금속돌망태 사각-상자형, 아연도금철선4종Φ3.2mm, 1000×1000×1500mm", "파일": "재료_자재품목.json"},
"MT024097": {"원문번호": "조달청 금속돌망태 사각-상자형, 아연도금철선4종Φ3.2mm, 1000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024098": {"원문번호": "조달청 금속돌망태 사각-상자형, 아연도금철선4종Φ3.2mm, 1000×1000×2000mm", "파일": "재료_자재품목.json"},
"MT024099": {"원문번호": "조달청 금속돌망태 육각-상자형, 아연도금철선5종Φ2.7mm, 1000×1000×2000mm", "파일": "재료_자재품목.json"},
"MT024100": {"원문번호": "조달청 금속돌망태 육각-상자형, 아연도금철선5종Φ2.7mm, 1000×1000×1500mm", "파일": "재료_자재품목.json"},
"MT024101": {"원문번호": "조달청 금속돌망태 이불형-뚜껑, 아연도금철선3종Φ4.0, 500×1200mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024102": {"원문번호": "조달청 금속돌망태 원형-뚜껑, 아연도금철선3종Φ4.0, 450×450mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024103": {"원문번호": "조달청 금속돌망태 이불형-뚜껑, 아연도금철선3종Φ4.0, 400×1200mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024104": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024105": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024106": {"원문번호": "조달청 금속돌망태 육각-상자형, 아연도금철선Φ2.7mm, 2000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024107": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024108": {"원문번호": "조달청 금속돌망태 사각-상자형, 1500mm×1000mm×1000mm", "파일": "재료_자재품목.json"},
"MT024109": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선Φ3.2mm, 사각-상자형", "파일": "재료_자재품목.json"},
"MT024110": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 중첩형, 육각-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024111": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 중첩형, 육각-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024112": {"원문번호": "조달청 금속돌망태 H500mm, 알루미늄합금아연도금철선Φ2.7mm, 매트리스형", "파일": "재료_자재품목.json"},
"MT024113": {"원문번호": "조달청 금속돌망태 H300mm, 아연도철선4종Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024114": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 아연도금철선5종Φ2.7mm, 상자형", "파일": "재료_자재품목.json"},
"MT024115": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7mm, 상자형", "파일": "재료_자재품목.json"},
"MT024116": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선5종2.7mm, 육각보강매트리스형", "파일": "재료_자재품목.json"},
"MT024117": {"원문번호": "조달청 금속돌망태 이불형-몸통, 아연도금철선3종Φ4.0, 400×1200mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024118": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종/4종Φ2.7/3.2mm, 전면부사각테두리보강복합개비온", "파일": "재료_자재품목.json"},
"MT024119": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종/4종Φ2.7/3.2mm, 전면부사각테두리보강복합개비온", "파일": "재료_자재품목.json"},
"MT024120": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선5종/4종Φ2.7/3.2mm, 전면부사각테두리보강복합개비온", "파일": "재료_자재품목.json"},
"MT024121": {"원문번호": "조달청 금속돌망태 1000×1000×460mm, 아연도금철선4종Φ3.2mm, 사각전면테두리보강식생개비온", "파일": "재료_자재품목.json"},
"MT024122": {"원문번호": "조달청 금속돌망태 육각-상자형, 아연도금철선5종Φ2.7mm, 1000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024123": {"원문번호": "조달청 금속돌망태 이불형-몸통, 아연도금철선3종Φ4.0, 500×1200mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024124": {"원문번호": "조달청 금속돌망태 원형-몸통, 아연도금철선3종Φ4.0, 450×450mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024125": {"원문번호": "조달청 금속돌망태 육각-상자형, 아연도금철선Φ2.7mm, 1000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024126": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선Φ2.2mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024127": {"원문번호": "조달청 금속돌망태 육각-상자형, 아연도금철선Φ2.7mm, 1500×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024128": {"원문번호": "조달청 금속돌망태 사각-상자형, 1000mm×1000mm×1000mm", "파일": "재료_자재품목.json"},
"MT024129": {"원문번호": "조달청 금속돌망태 사각-상자형, 2000mm×1000mm×1000mm", "파일": "재료_자재품목.json"},
"MT024130": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024131": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024132": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 상자형, 아연도철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024133": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선Φ2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024134": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선Φ2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024135": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선Φ2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024136": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선Φ3.2mm, 사각-상자형", "파일": "재료_자재품목.json"},
"MT024137": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선Φ3.2mm, 사각-상자형", "파일": "재료_자재품목.json"},
"MT024138": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 중첩형, 육각-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024139": {"원문번호": "조달청 금속돌망태 H300mm, 알루미늄합금아연도금철선Φ2.7mm, 매트리스형", "파일": "재료_자재품목.json"},
"MT024140": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 아연도금철선5종Φ2.7mm, 상자형", "파일": "재료_자재품목.json"},
"MT024141": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 중첩육각매트리스형", "파일": "재료_자재품목.json"},
"MT024142": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온 아연도금5종 Φ2.7 MM", "파일": "재료_자재품목.json"},
"MT024143": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 육각개비온-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024144": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온, 상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024145": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온, 상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024146": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각-상자형, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024147": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 중첩육각매트리스형", "파일": "재료_자재품목.json"},
"MT024148": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온상자형-아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024149": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온상자형-아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024150": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7, 오각-상자형", "파일": "재료_자재품목.json"},
"MT024151": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종Φ2.7, 오각-상자형", "파일": "재료_자재품목.json"},
"MT024152": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 중첩육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024153": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 중첩육각매트리스형", "파일": "재료_자재품목.json"},
"MT024154": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온 아연도금5종 Φ2.7 MM", "파일": "재료_자재품목.json"},
"MT024155": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온 아연도금5종 Φ2.7 MM", "파일": "재료_자재품목.json"},
"MT024156": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024157": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 육각개비온-상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024158": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 상자형, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024159": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각-상자형, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024160": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각-상자형, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024161": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm 사각개비온상자형-아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024162": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 사각개비온상자형-아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024163": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.2mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024164": {"원문번호": "조달청 금속돌망태 H480mm, 아연도금철선5종Φ2.7mm, 오각매트리스형", "파일": "재료_자재품목.json"},
"MT024165": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024166": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024167": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024168": {"원문번호": "조달청 금속돌망태 450×450mm, 아연도금철선3종Φ4.0mm, 원형-몸통", "파일": "재료_자재품목.json"},
"MT024169": {"원문번호": "조달청 금속돌망태 450×450mm, 아연도금철선3종Φ4.0mm, 원형-뚜껑", "파일": "재료_자재품목.json"},
"MT024170": {"원문번호": "조달청 금속돌망태 1000×1000×2000mm, 아연도금철선5종2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024171": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온, 상자형, 아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024172": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024173": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 중첩육각식생매트리스개비온", "파일": "재료_자재품목.json"},
"MT024174": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 중첩육각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024175": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온상자형-아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024176": {"원문번호": "조달청 금속돌망태 #80-450×950mm, 타원형몸통-아연도금철선, Φ4.0mm", "파일": "재료_자재품목.json"},
"MT024177": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 육각개비온상자형, 아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024178": {"원문번호": "조달청 금속돌망태 원형450×450mm, 망눈150mm, 몸통, 아연도금철선3종Φ4.0", "파일": "재료_자재품목.json"},
"MT024179": {"원문번호": "조달청 금속돌망태 1000×1000×400mm, 아연도금철선5종Φ2.7mm, 육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024180": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선5종Φ2.7mm, 육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024181": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선5종Φ몸체2.7/테두리3.4/체결선2.2mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024182": {"원문번호": "조달청 금속돌망태 1000×2000×500mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024183": {"원문번호": "조달청 금속돌망태 DSS-11, 2000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024184": {"원문번호": "조달청 금속돌망태 DSS-10, 1500×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024185": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.2mm, 복합매트리스형", "파일": "재료_자재품목.json"},
"MT024186": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 아연도금철선5종2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024187": {"원문번호": "조달청 금속돌망태 사각-상자형, 아연도금철선Φ3.2, 1000×1000×2000mm", "파일": "재료_자재품목.json"},
"MT024188": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종2.7mm, 육각-상자형", "파일": "재료_자재품목.json"},
"MT024189": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 사각-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024190": {"원문번호": "조달청 금속돌망태 1000×1200×500mm, 아연도금철선4종Φ3.2mm, 라운드사각상자형", "파일": "재료_자재품목.json"},
"MT024191": {"원문번호": "조달청 금속돌망태 1000×1200×1000mm, 아연도금철선4종Φ3.2mm, 라운드사각상자형", "파일": "재료_자재품목.json"},
"MT024192": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선4종Φ3.2mm, 식생라운드사각상자형", "파일": "재료_자재품목.json"},
"MT024193": {"원문번호": "조달청 금속돌망태 1000×1500×500mm, 아연도금철선4종Φ3.2mm, 라운드사각상자형", "파일": "재료_자재품목.json"},
"MT024194": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온, 상자형, 아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024195": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024196": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, Φ3.2mm, 사각개비온형, 아연도금철선", "파일": "재료_자재품목.json"},
"MT024197": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, Φ2.7mm, 육각개비온형, 아연도금철선", "파일": "재료_자재품목.json"},
"MT024198": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, Φ2.7mm, 육각개비온형, 아연도금철선", "파일": "재료_자재품목.json"},
"MT024199": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, Φ2.7mm, 육각개비온형, 아연도금철선", "파일": "재료_자재품목.json"},
"MT024200": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 상자형-아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024201": {"원문번호": "조달청 금속돌망태 #80-450×950mm, 타원형금속돌망태, 뚜껑-아연도금철선, Φ4.0", "파일": "재료_자재품목.json"},
"MT024202": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온, 상자형-아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024203": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온, 상자형-아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024204": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선4종Φ3.2mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024205": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, Φ3.2, 사각개비온형-아연도금철선", "파일": "재료_자재품목.json"},
"MT024206": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, Φ3.2, 사각개비온형-아연도금철선", "파일": "재료_자재품목.json"},
"MT024207": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, Φ3.2, 사각개비온형-아연도금철선", "파일": "재료_자재품목.json"},
"MT024208": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ3.2mm, 상자형", "파일": "재료_자재품목.json"},
"MT024209": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 중첩육각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024210": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 아연도금철선5종", "파일": "재료_자재품목.json"},
"MT024211": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.2mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024212": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 중첩육각식생매트리스개비온", "파일": "재료_자재품목.json"},
"MT024213": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 중첩육각식생매트리스개비온", "파일": "재료_자재품목.json"},
"MT024214": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 중첩육각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024215": {"원문번호": "조달청 금속돌망태 #80-450×950mm, 타원형뚜껑-아연도금철선, Φ4.0mm", "파일": "재료_자재품목.json"},
"MT024216": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, 2.7-3.4mm", "파일": "재료_자재품목.json"},
"MT024217": {"원문번호": "조달청 금속돌망태 원형450×450mm, 망눈150mm, 뚜껑, 아연도금철선3종Φ4.0", "파일": "재료_자재품목.json"},
"MT024218": {"원문번호": "조달청 금속돌망태 1000×1000×300mm, 아연도금철선5종Φ2.7mm, 육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024219": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.2mm외, 복합매트리스형", "파일": "재료_자재품목.json"},
"MT024220": {"원문번호": "조달청 금속돌망태 DSS-09, 1000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024221": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7", "파일": "재료_자재품목.json"},
"MT024222": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, Φ3.2mm, 사각개비온형, 아연도금철선", "파일": "재료_자재품목.json"},
"MT024223": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, Φ3.2mm, 사각개비온형-아연도금철선", "파일": "재료_자재품목.json"},
"MT024224": {"원문번호": "조달청 금속돌망태 #80-450×950mm, 타원형금속돌망태, 몸통-아연도금철선, Φ4.0", "파일": "재료_자재품목.json"},
"MT024225": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온, 상자형-아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024226": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온, 상자형-아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024227": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 사각개비온, 상자형-아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024228": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온, 상자형, 아연도금철선, Φ3.2", "파일": "재료_자재품목.json"},
"MT024229": {"원문번호": "조달청 금속돌망태 오각-상자형, 아연도금철선5종Φ2.7mm, 2000×1000×500mm", "파일": "재료_자재품목.json"},
"MT024230": {"원문번호": "조달청 금속돌망태 H300mm, 알루미늄합금도금철선Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024231": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각-상자형, 아연도금5종철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024232": {"원문번호": "조달청 금속돌망태 1000×1000×300mm, 스테인리스/아연도금철선5종Φ4mm, 스톤매트리스/일반형", "파일": "재료_자재품목.json"},
"MT024233": {"원문번호": "조달청 금속돌망태 1000×2000×500mm, 아연도금철선4종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024234": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각-상자형, ", "파일": "재료_자재품목.json"},
"MT024235": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각-상자형, ", "파일": "재료_자재품목.json"},
"MT024236": {"원문번호": "조달청 금속돌망태 H300mm, 스테인리스/아연도금철선5종Φ4mm, , 스톤매트리스/일반형", "파일": "재료_자재품목.json"},
"MT024237": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ4.0mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024238": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, Φ3.2, 사각개비온형-아연도금철선", "파일": "재료_자재품목.json"},
"MT024239": {"원문번호": "조달청 금속돌망태 1000×1000×2000mm, 아연도금철선4종Φ3.2mm, 상자형", "파일": "재료_자재품목.json"},
"MT024240": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 아연도금철선4종Φ3.2mm, 상자형", "파일": "재료_자재품목.json"},
"MT024241": {"원문번호": "조달청 금속돌망태 오각-상자형, 아연도금철선5종Φ2.7mm, 2000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024242": {"원문번호": "조달청 금속돌망태 H280mm, 아연도금철선5종Φ2.7mm, 오각매트리스형", "파일": "재료_자재품목.json"},
"MT024243": {"원문번호": "조달청 금속돌망태 오각-상자형, 아연도금철선5종Φ2.7mm, 1500×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024244": {"원문번호": "조달청 금속돌망태 오각-상자형, 아연도금철선5종Φ2.7mm, 1000×1000×1000mm", "파일": "재료_자재품목.json"},
"MT024245": {"원문번호": "조달청 금속돌망태 H500mm, 알루미늄합금도금철선Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024246": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ4.0mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024247": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ4.0mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024248": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각-상자형, 아연도금5종철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024249": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ4mm, 사각전면보강형", "파일": "재료_자재품목.json"},
"MT024250": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 중첩육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024251": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ4mm, 스톤매트리스", "파일": "재료_자재품목.json"},
"MT024252": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024253": {"원문번호": "조달청 금속돌망태 1200×1000×500mm, 아연도금철선3종Φ4mm, 사각형뚜껑", "파일": "재료_자재품목.json"},
"MT024254": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024255": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024256": {"원문번호": "조달청 금속돌망태 1200×1000×600mm, 아연도금철선3종Φ4mm, 사각형몸통", "파일": "재료_자재품목.json"},
"MT024257": {"원문번호": "조달청 금속돌망태 1200×1000×500mm, 아연도금철선3종Φ4mm, 사각형몸통", "파일": "재료_자재품목.json"},
"MT024258": {"원문번호": "조달청 금속돌망태 1200×1000×400mm, 아연도금철선3종Φ4mm, 사각형뚜껑", "파일": "재료_자재품목.json"},
"MT024259": {"원문번호": "조달청 금속돌망태 H500mm, 알루미늄합금아연도금철선Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024260": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024261": {"원문번호": "조달청 금속돌망태 1000×2000×500mm, 아연도금철선5종Φ2.7mm, 육각개비온", "파일": "재료_자재품목.json"},
"MT024262": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 아연도금철선5종Φ2.7mm, 육각개비온", "파일": "재료_자재품목.json"},
"MT024263": {"원문번호": "조달청 금속돌망태 150×450×950mm, 타원형-뚜껑, 아연도금철선3종Φ4.0", "파일": "재료_자재품목.json"},
"MT024264": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각-상자형, 아연도금5종철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024265": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 아연도금철선4종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024266": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선4종Φ3.2mm, 사각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024267": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선4종Φ3.2mm, 사각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024268": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ4.0mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024269": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선4종Φ4.0mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024270": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선4종Φ4.0mm, 사각매트리스형", "파일": "재료_자재품목.json"},
"MT024271": {"원문번호": "조달청 금속돌망태 1500 ×1000×1000mm, 아연도금철선4종Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024272": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온, 상자형, 아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024273": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024274": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, , 사각개비온, 상자형, 아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024275": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온, 상자형, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024276": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온, 상자형, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024277": {"원문번호": "조달청 금속돌망태 #80-450×950mm, 타원형몸통, 아연도금철선, Φ4.0mm", "파일": "재료_자재품목.json"},
"MT024278": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온, 상자형, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024279": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024280": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024281": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 아연도금철선4종Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024282": {"원문번호": "조달청 금속돌망태 1000×1000×2000mm, 아연도금철선4종Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024283": {"원문번호": "조달청 금속돌망태 Φ450mm, 아연도금철선3종4.0mm, 원형-몸통", "파일": "재료_자재품목.json"},
"MT024284": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ4mm, 스톤매트리스/일반형", "파일": "재료_자재품목.json"},
"MT024285": {"원문번호": "조달청 금속돌망태 1000×1500×1000mm, 아연도금철선5종/4종Φ2.7/3.2mm, 전면부사각테두리보강복합개비온", "파일": "재료_자재품목.json"},
"MT024286": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024287": {"원문번호": "조달청 금속돌망태 1200×1000×600mm, 아연도금철선3종Φ4mm, 사각형뚜껑", "파일": "재료_자재품목.json"},
"MT024288": {"원문번호": "조달청 금속돌망태 1200×1000×400mm, 아연도금철선3종Φ4mm, 사각형몸통", "파일": "재료_자재품목.json"},
"MT024289": {"원문번호": "조달청 금속돌망태 950×950×450mm, 아연도금철선3종Φ4mm, 타원형뚜껑", "파일": "재료_자재품목.json"},
"MT024290": {"원문번호": "조달청 금속돌망태 950×1000×450mm, 아연도금철선3종Φ4mm, 타원형몸통", "파일": "재료_자재품목.json"},
"MT024291": {"원문번호": "조달청 금속돌망태 450×1000×450mm, 아연도금철선3종Φ4mm, 원형뚜껑", "파일": "재료_자재품목.json"},
"MT024292": {"원문번호": "조달청 금속돌망태 450×1000×450mm, 아연도금철선3종Φ4mm, 원형몸통", "파일": "재료_자재품목.json"},
"MT024293": {"원문번호": "조달청 금속돌망태 H300mm, 알루미늄합금아연도금철선Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024294": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온, 상자형, 아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024295": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 아연도금철선5종Φ2.7mm, 육각개비온", "파일": "재료_자재품목.json"},
"MT024296": {"원문번호": "조달청 금속돌망태 #80-450×950mm, 타원형뚜껑, 아연도금철선, Φ4.0mm", "파일": "재료_자재품목.json"},
"MT024297": {"원문번호": "조달청 금속돌망태 450×450×450mm, 아연도금철선3종Φ4mm, 원형몸통", "파일": "재료_자재품목.json"},
"MT024298": {"원문번호": "조달청 금속돌망태 450×450×450mm, 아연도금철선3종Φ4mm, 원형뚜껑", "파일": "재료_자재품목.json"},
"MT024299": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 육각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024300": {"원문번호": "조달청 금속돌망태 1000×2000×500mm, 아연도금철선5종Φ3.2mm, 사각개비온", "파일": "재료_자재품목.json"},
"MT024301": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 육각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024302": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024303": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024304": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024305": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024306": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온, 아연도금철선Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024307": {"원문번호": "조달청 금속돌망태 L1500×W1000×H1000mm, 사각개비온-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024308": {"원문번호": "조달청 금속돌망태 L1000×W1000×H1000mm, 사각개비온-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024309": {"원문번호": "조달청 금속돌망태 450×950mm, 망눈150mm, 타원형, 몸통, 아연도금철선3종Φ4.0, KSF4601", "파일": "재료_자재품목.json"},
"MT024310": {"원문번호": "조달청 금속돌망태 450×950mm, 망눈150mm, 타원형, 뚜껑, 아연도금철선3종Φ4.0, KSF4601", "파일": "재료_자재품목.json"},
"MT024311": {"원문번호": "조달청 금속돌망태 L2000×W1000×H1000mm, 사각개비온-상자형, 아연도금철선Φ3.2", "파일": "재료_자재품목.json"},
"MT024312": {"원문번호": "조달청 금속돌망태 L1000×W1000×H1000mm, 육각개비온-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024313": {"원문번호": "조달청 금속돌망태 L1500×W1000×H1000mm, 육각개비온-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024314": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 사각개비온, 상자형, 아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024315": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm 사각개비온, 상자형 -아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024316": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024317": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온, 상자형, 아연도금철선, Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024318": {"원문번호": "조달청 금속돌망태 150×450×950mm, 타원형-몸통, 아연도금철선3종Φ4.0", "파일": "재료_자재품목.json"},
"MT024319": {"원문번호": "조달청 금속돌망태 450×950mm, 아연도금철선3종Φ4.0mm, 타원형-몸통", "파일": "재료_자재품목.json"},
"MT024320": {"원문번호": "조달청 금속돌망태 450×950mm, 아연도금철선3종Φ4.0mm, 타원형-뚜껑", "파일": "재료_자재품목.json"},
"MT024321": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선Φ3.2mm, 사각상자형", "파일": "재료_자재품목.json"},
"MT024322": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종/4종Φ2.7/3.2mm, 칸막이상단테두리보강복합매트리스개비온", "파일": "재료_자재품목.json"},
"MT024323": {"원문번호": "조달청 금속돌망태 1000×2000×1000mm, 아연도금철선5종/4종Φ2.7/3.2mm, 전면부사각테두리보강복합개비온", "파일": "재료_자재품목.json"},
"MT024324": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 아연도금철선5종Φ2.7mm, 육각개비온", "파일": "재료_자재품목.json"},
"MT024325": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 육각매트리스개비온", "파일": "재료_자재품목.json"},
"MT024326": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온, 상자형, 아연도금철선, Φ2.7mm", "파일": "재료_자재품목.json"},
"MT024327": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 중첩형육각매트리스형", "파일": "재료_자재품목.json"},
"MT024328": {"원문번호": "조달청 금속돌망태 H300mm, 아연도금철선5종Φ2.7mm, 중첩형육각매트리스형", "파일": "재료_자재품목.json"},
"MT024329": {"원문번호": "조달청 금속돌망태 H400mm, 아연도금철선5종Φ2.7mm, 중첩형육각매트리스형", "파일": "재료_자재품목.json"},
"MT024330": {"원문번호": "조달청 금속돌망태 1000×1000×2000mm, 아연도금철선Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024331": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 아연도금철선Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024332": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024333": {"원문번호": "조달청 금속돌망태 아연도금철선3종Φ4.0, 원형-뚜껑, 450×450mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024334": {"원문번호": "조달청 금속돌망태 아연도금철선3종Φ4.0, 원형-몸통, 450×450mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024335": {"원문번호": "조달청 금속돌망태 아연도금철선3종Φ4.0, 타원형-뚜껑, 450×950mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024336": {"원문번호": "조달청 금속돌망태 1000×1000×300mm, 아연도금철선5종Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024337": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선5종Φ2.7mm, 육각매트리스형", "파일": "재료_자재품목.json"},
"MT024338": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 아연도금철선4종Φ3.2mm, 상자형", "파일": "재료_자재품목.json"},
"MT024339": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024340": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 육각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024341": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 사각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024342": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 육각개비온, 상자형", "파일": "재료_자재품목.json"},
"MT024343": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 사각개비온, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024344": {"원문번호": "조달청 금속돌망태 2000×1000×1000mm, 사각개비온, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024345": {"원문번호": "조달청 금속돌망태 1000×1000×1000mm, 사각개비온, 아연도금철선Φ3.2mm", "파일": "재료_자재품목.json"},
"MT024346": {"원문번호": "조달청 금속돌망태 450×450mm, 망눈150mm, 원형, 뚜껑, 아연도금철선3종Φ4.0, KSF4601", "파일": "재료_자재품목.json"},
"MT024347": {"원문번호": "조달청 금속돌망태 450×450mm, 망눈150mm, 원형, 몸통, 아연도금철선3종Φ4.0, KSF4601", "파일": "재료_자재품목.json"},
"MT024348": {"원문번호": "조달청 금속돌망태 L2000×W1000×H1000mm, 육각개비온-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024349": {"원문번호": "조달청 금속돌망태 아연도금철선3종Φ4.0, 타원형몸통, 450×950mm, 망눈150mm", "파일": "재료_자재품목.json"},
"MT024350": {"원문번호": "조달청 금속돌망태 1000×500×2000mm, 아연도금철선Φ3.2mm, 사각개비온상자형", "파일": "재료_자재품목.json"},
"MT024351": {"원문번호": "조달청 금속돌망태 1000×1000×2000mm, 육각개비온-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024352": {"원문번호": "조달청 금속돌망태 1000×1000×1500mm, 육각개비온-상자형, 아연도금철선Φ2.7", "파일": "재료_자재품목.json"},
"MT024353": {"원문번호": "조달청 금속돌망태 1000×1000×400mm, 아연도금철선5종Φ2.2mm, 복합매트리스형", "파일": "재료_자재품목.json"},
"MT024354": {"원문번호": "조달청 금속돌망태 2000×1000×500mm, 아연도금철선4종Φ3.2mm, 상자형", "파일": "재료_자재품목.json"},
"MT024355": {"원문번호": "조달청 금속돌망태 1500×1000×1000mm, 아연도금철선4종Φ3.2mm, 상자형", "파일": "재료_자재품목.json"},
"MT024356": {"원문번호": "조달청 금속돌망태 H500mm, 아연도금철선5종Φ2.7mm, 중첩형육각식생매트리스형", "파일": "재료_자재품목.json"},
"MT024357": {"원문번호": "조달청 금속돌망태 1000×1000×400mm, 아연도금철선5종Φ4mm, 스톤매트리스개비온", "파일": "재료_자재품목.json"},
"MT024358": {"원문번호": "조달청 금속돌망태 1000×1000×500mm, 아연도금철선4종Φ3.2mm, 식생사각상자형", "파일": "재료_자재품목.json"},
"MT024359": {"원문번호": "조달청 금속돌망태 1000×1000×300mm, 스테인리스/아연도금철선5종Φ4mm, 스톤매트리스", "파일": "재료_자재품목.json"},
"MT024360": {"원문번호": "조달청 금속돌망태 1000×1000×300mm, 아연도금철선5종Φ4mm, 스톤매트리스개비온", "파일": "재료_자재품목.json"},
"QC000001": {"원문번호": "공통 2-1-1 현장사무소 등의 규모(토목)", "파일": "소요량_건설품셈_02장_가설공사.json"},
"QC000002": {"원문번호": "공통 2-1-2 현장사무소 등의 규모(건축 및 기계설비)", "파일": "소요량_건설품셈_02장_가설공사.json"},
"QC000003": {"원문번호": "공통 2-1-2 시멘트 창고, 동력소 및 변전소 필요면적", "파일": "소요량_건설품셈_02장_가설공사.json"},
@@ -4,8 +4,9 @@
- **관급 단가는 조달청 종합쇼핑몰 API 3종에서 「분류명 부분 글자」로 받을 수 있음** — 레미콘·아스콘은 「조합공통품목」 줄이 지역별 관급 단가(다산소프트 관급 열과 같은 것). 인증키 = 기존 공공데이터포털 일반 인증키 하나(활용신청 끝남).
- 지난번 「시설공통자재 6,999줄」(`PriceInfoService`)에는 관급 자재가 없음 — 잘못 고른 API.
- **레미콘 2,095줄 중 2,028줄이 다산소프트 값과 똑같음**(97%). 아스콘은 짝은 서고 값은 기준일이 달라 다름. 철근·파형강관·흄관은 제조사별 값이 갈려 **채우지 않고 보류**.
- 정본 `재료_자재품목.json` 관급 열을 다산소프트 값 → 조달청 값으로 바꿈: 관급 열이 있던 4,552줄 중 **채움 3,045 · null 1,507**(다산 값 남기지 않음).
- **값 비교 기준 = 다산소프트 값 ±5% 안이면 「맞음」**(받는 시점이 달라 생기는 차이).
- **제조사별로 값이 갈리면 같은 규격의 가장 낮은 값**을 관급 열에 넣고 비고에 그 제조사(「관급: 조달청 다수공급자계약 <제조사> 최저 <날짜> · …」) — 줄·열은 안 늘림. 보류 394 → 0.
- 정본 `재료_자재품목.json` 관급 열: 옛 4,552줄 중 **채움 3,752 · null 800**(맞음 3,232 · 5% 넘게 다름 520 · 못 채움 800) + **조달청에서 새로 들인 줄 380**(모두 채움) = 4,932줄 중 **채움 4,132 · null 800**. 다산 값은 남기지 않음.
- 다시 돌리기 — `./venv/Scripts/python.exe resources/master_data/scripts/update_관급단가.py update`
## 조달청 API (공공데이터포털 15129471 `at/ShoppingMallPrdctInfoService`)
@@ -15,11 +16,12 @@
| `getMASCntrctPrdctInfoList` | 다수공급자계약(MAS) — 제조사·조합별 | 레미콘 · 아스팔트콘크리트 · 봉강 · H빔 · 파형강관 · 콘크리트관 | 26,384 · 17,949 · 1,039 · 181 · 6,970 · 504 |
| `getUcntrctPrdctInfoList` | 일반단가계약 | 아스팔트콘크리트 · 콘크리트관 | 17 · 10 |
| `getThptyUcntrctPrdctInfoList` | 3자단가계약 | 레미콘 · 아스팔트콘크리트 · 파형강관 | 128 · 13 · 1,573 |
| 2차 (세 오퍼레이션 섞임) | — | 시멘트 · 골재 · 조경석 · 주철관 · 파형강관이음관 · 배수로 · 블록 · 돌망태 · 합성목재 · 볼라드 · 교량받침 · 용접철망 · 섬유 · 폴리에틸렌 · 맨홀 · 매트 · 낙석 · 그레이팅 · 벽돌 · 시트 · 비료 · 압륜 · 부직포 | 파일 43개(원본 3MB) — 목록·줄 수는 `_meta.md` |
- 조건 = `inqryDiv=2` + `prdctClsfcNoNm=<글자>`**부분 글자 조회**(분류 통째가 아님). 「철근」은 암거블록·배수로가 섞여 옴 → 「봉강」(철근콘크리트용봉강) · H형강은 「H빔」 · 「형강」은 파형강관이 걸림.
- 응답 칸(쓰는 것) — `prdctSpecNm`(품명·규격) · `cntrctPrceAmt`(단가·VAT 포함) · `prdctSplyRgnNm`(공급지역) · `prdctDlvryCndtnNm`(인도조건) · `prdctMakrNm`(「조합공통품목」 = 조합 공통 관급단가) · `cntrctCorpNm`(계약 조합·업체) · `cntrctBgnDate`·`cntrctEndDate`(계약 기간) · `prdctUnit`.
- 갱신 주기 — 계약 기간 단위(레미콘 조합공통 2026-06-01~, 아스콘 2026-08-01~ 등) · 일별 조회 · 쪽당 999 · 인증키 일일 호출 한도 안.
- 없는 것(이번 조사에서 못 찾음) — 시멘트 지역별 관급 · 골재 · 조경석 · 벤치플륨 · 주철관 · 측구수로관 등 648줄(다산소프트 관급 열에는 있음) → 「짝짓기 아직 없음」으로 null.
- 이번에 찾음(2차) — 시멘트 · 골재 · 조경석 · 주철관 · 이음관 · 측구수로관 · 볼라드 · 맨홀 · 용접철망 · 돌망태 · 매트. 조달청에 같은 품명이 없어 못 이음 — 벤치플륨 · 무게수로관 · HI-VP(다산 이름 그대로는 분류 없음).
- 원본 보관 — `resources/knowledge/original/원가계산/자재단가/관급/<받은 날>/*.json.gz` + `_meta.md`(받은 칸만 남김 — 첨부·이미지 뺌).
## 짝짓기 방법
@@ -33,29 +35,31 @@
| 파형강관 | `파형강관(관급)` · 「D300×1.6T (1RS)」 | MAS·3자 파형강관 | 지름 + 두께 + RS |
| 흄관 | `흄 관(B형)(관급)` · 「Φ250mm」 | MAS·일반 콘크리트관 「보통관」 | 지름 |
- 2차 갈래(`update_관급단가_기타.py`) — 자재품목 규격의 숫자 조각(치수·종별)과 글자 조각(제품·산지)이 조달청 품명·규격에 모두 있을 때만 짝 · 이름 끝 「-지역」은 지역 · 지역이 아니면 제조사 · 주철관은 이름의 종별(2종·3종)도 맞아야.
- 지역 — 지명 낱말로 쪼개 약칭을 풀고(경기 → 경기도) 「시·군·구」·「전지역(구 나열)」·조합 이름을 뺀 뒤, 같은 묶음 → 겹침 0.5 이상 하나뿐일 때만 짝(동점은 못 채움). 이름에 조합이 붙은 줄(제주…레미콘(협))은 그 조합 줄만.
- 후보가 여럿이면 — 값이 하나(같은 값 여럿 포함)일 때만 채움. **제조사별로 값이 갈리면 null(보류)** — 고르는 기준 미정(다산 값은 H형강 26줄에서 최저값과 같았음 · 철근 8/81 · 파형강관 15/98).
- 후보가 여럿이면 — 값이 하나면 그 값 · **제조사별로 값이 갈리면 가장 낮은 값 + 비고에 그 제조사**(확정 · `pick()` 한 곳).
## 다산소프트 값과 맞대기 (사본에서 관급 열을 지우고 다시 채움 2026-09-20)
## 다산소프트 값과 맞대기 (±5% 안 = 맞음 — 사본에서 관급 열을 지우고 다시 채움 · 2026-09-20)
| 갈래 | 전체 | 짝 서고 채움 | 값 같음 | 값 다름 | 보류(제조사별 값 갈림) | 못 채움 |
| 갈래 | 전체 | 짝 서고 채움 | 맞음(±5%) | 5% 넘게 다름 | 보류 | 못 채움 |
|---|---|---|---|---|---|---|
| 레미콘 | 2,095 | 2,078 | **2,028** | 50 | 0 | 17 |
| 아스콘 | 1,430 | 966 | 0 | 966 | 162 | 302 |
| 철근 | 81 | 0 | 0 | 0 | 81 | 0 |
| H형강 | 57 | 1 | 0 | 1 | 26 | 30 |
| 파형강관 | 214 | 0 | 0 | 0 | 98 | 116 |
| 흄관 | 27 | 0 | 0 | 0 | 27 | 0 |
| 그 밖(벤치플륨 · 조경석 · 주철관 등) | 648 | 0 | 0 | 0 | 0 | 648 |
| **합계** | **4,552** | **3,045** | 2,028 | 1,017 | 394 | 1,113 |
| 레미콘 | 2,095 | 2,078 | **2,033** | 45 | 0 | 17 |
| 아스콘 | 1,430 | 1,128 | 855 | 273 | 0 | 302 |
| 철근 | 81 | 81 | **81** | 0 | 0 | 0 |
| H형강 | 57 | 27 | 26 | 1 | 0 | 30 |
| 파형강관 | 214 | 98 | 32 | 66 | 0 | 116 |
| 흄관 | 27 | 27 | 10 | 17 | 0 | 0 |
| 조경석 | 48 | 48 | **48** | 0 | 0 | 0 |
| 파형강관이음관 | 108 | 102 | 87 | 15 | 0 | 6 |
| 주철관 · 부속 | 116 | 116 | 34 | 82 | 0 | 0 |
| 측구수로관 | 23 | 17 | 8 | 9 | 0 | 6 |
| 시멘트 · 골재 · 볼라드 · 맨홀 · 용접철망 · 돌망태 · 매트 | 56 | 30 | 18 | 12 | 0 | 26 |
| 그 밖(벤치플륨 · 블록 · 폴리에틸렌 · 교량받침 · 합성목재 · 무게수로관 등) | 297 | 0 | 0 | 0 | 0 | 296 |
| **합계** | **4,552** | **3,752** | **3,232** | **520** | **0** | **800** |
(정본 null 1,507 = 보류 394 + 못 채움 1,113 — 「못 채움」 = 짝 자체가 안 선 줄 · 「보류」 = 짝은 서나 값이 갈려 채우지 않은 줄.)
- **레미콘 값 다름 50** — 광주·전남 25-30-180(다산 117,800 · 조달청 118,710) · 충남 25-33-150(130,800 · 131,000) 등 소수 규격 + 제주 세 조합(다산 119,130 · 조달청 125,940~126,000). 지역·규격은 같음 → **기준일 차이(다산 2026-07 · 조달청 계약 2026-06-01~)나 다산 원문 값 차이** — 이 조사로는 어느 쪽인지 못 가림.
- **아스콘 값 다름 966 전부** — 조달청 계약 시작이 **2026-08-01**(다산 「조달 26.7」보다 새 기준). 지역·배합·등급은 같음 → 기준일 차이. 비율 1.003~1.033.
- **철근** — 다산 값(SD400 D10 827,640 · D13~ 819,500)은 조달청 제조사별 값(5~8가지) 중 최저와 8/81만 같음 → 다산이 어느 제조사·조건을 골랐는지 원문에 없음 → 보류.
- **H형강** — 다산 1,228,830 = 동국제강(SS275) 값, 현대제철은 1,301,590 → 다산은 최저 제조사 값. 그러나 규칙으로 못박지 않음(보류 26). 못 채움 30 = 다산 규격 중 조달청 H빔에 없는 치수.
- **못 채움 까닭** — 지역 못 찾음(레미콘 16 · 아스콘 240: 조달청 지역 묶음이 다산과 다름) · 규격 없음(아스콘 62 · 레미콘 1) · 후보 없음(H형강 30 · 파형강관 116 — 「-거양」 제조사 줄·D 규격이 조달청 목록에 없음) · 짝짓기 아직 없음(648).
- 「5% 넘게 다름」 = 제조사별 최저값이 다산이 고른 제조사·조건 값보다 낮은 경우가 대부분(주철관 0.60~1.00 · 이음관 0.45~1.00 · 흄관·파형강관) + 아스콘 기준일 차이(조달청 계약 2026-08-01~ · 다산 「조달 26.7」).
- 레미콘 다름 45 — 광주·전남 25-30-180(다산 117,800 · 조달청 118,710) · 제주 세 조합(다산 119,130 · 조달청 125,940~126,000) — 지역·규격 같음 → 기준일 차이 또는 다산 원문 값.
- 못 채움 800 — 아스콘 302(지역 240 · 규격 62) · 그 밖 297(짝 규칙 없음 · 조달청에 같은 품명 없음) · 파형강관 116(「-거양」 규격이 조달청 목록에 없음) · H형강 30 · 돌망태·매트 20 · 레미콘 17 · 이음관 6 · 측구수로관 6 · 골재 6.
## 짝짓기 규칙 넓힘 (2차)
@@ -63,32 +67,36 @@
- 지역 묶음 — 다산 줄이 여러 시군 묶음(「강원도(동해,삼척,영월,…)」)이고 묶음 안 시군마다 조달청 시군 줄이 **모두** 있을 때만, 그 줄들 값이 하나면 채움(갈리면 보류 · 「제외」 묶음 · 시군 이름 붙은 글 · 조달청에 없는 시군은 그대로 못 채움). 30줄 채움 · 옛값 대비 0.999~1.071.
- 못 넓힌 것 — 아스콘 240(「경남(진주사천남해…」 시군 구분 없는 글 · 「서울,경기(…구 제외)」) · R3-H 순환 규격 62 · 레미콘 16(여수시 읍면 묶음).
## 제조사별 값 — 고르는 선택지 (관리자가 정함 · 지금은 보류 394)
## 제조사별 값 — 확정(사용자)
| 선택지 | 뜻 | 확인된 것 |
|---|---|---|
| 최저가 | 제조사·조합 값 중 가장 낮은 값 | H형강 26줄에서 다산 값과 같았음 · 철근은 8/81 · 파형강관 15/98 |
| 최신 계약 | 계약 시작일이 가장 늦은 줄 | 아직 대조 안 함 |
| 특정 제조사 고정 | 예: 동국제강 | 다산이 어느 곳을 골랐는지 원문에 없음 |
| 평균 | 제조사 값 평균 | 관급 단가 성격(조합 공통)과 안 맞음 |
- 같은 규격이 제조사·조합별로 값이 갈리면 **가장 낮은 값**을 관급 열에 · 비고에 그 제조사(「… 다수공급자계약 동국제강 최저 2026-09-20 · …」) — 제조사별로 줄·열을 늘리지 않음. 채운 줄 523(철근 81 · 파형강관 98 · 흄관 27 · H형강 26 · 아스콘 162 · 이음관 16 · 주철관 등).
- 고쳐 쓴 곳 = `update_관급단가.py``decide()` 한 곳(`pick()` 은 이미 최저를 돌려줌).
- 어느 쪽이든 `update_관급단가.py``pick()` 한 곳만 고침.
## 조달청에만 있는 품목 — 자재품목에 새 줄
- 자재품목에 같은 품목·규격 줄이 있으면 관급 열만 채우고(위 짝짓기) · **없으면 새 줄**: 키 = `_키대장` 다음 번호(MT023981~) · 물가지 네 열 null · 관급만 · 출처 「자재품목 조달청 <계약방식>」(검사 도구 출처 모양에 맞춤) · 비고 = 관급 비고 · 원문번호 = 「조달청 <품명> <규격>」(다시 돌려도 같은 줄을 갱신).
- 이름·규격·단위 = 조달청 표기 그대로(「품명, 제조사, 모델, 규격…」 에서 제조사·모델을 뺌) · 같은 품명·규격은 최저가.
- 이번에 들인 것 **380줄** — 금속돌망태 372(사각·육각 상자형·매트리스형 · 규격별) · 토목용부직포 8(두께별). 파형강관·흄관은 자재품목에 이미 다 있어 새 줄 없음(Φ800·1000·1200 포함).
- 품셈재료 못 이은 343 가운데 조달청에서 찾은 것 = 파형강관 · 흄관 · 부직포 · 돌망태 · 시멘트벽돌(자재품목에 이미 있음)뿐 — 연결(품셈재료 → 자재품목)은 화면에서 사람이 이음(이번에 안 건드림). 조달청 분류에서 못 찾음 = 유공관 · 폼타이 · 각재·합판 · 철선 · 못 · 종자 · VR관(소켓식) · 거푸집(1줄) · 낙석방지망(펜스만) · 벤토나이트·지오콤포지트·HDPE시트 등.
- 받아 두고 아직 안 쓴 분류(다음 후보) — 블록 · 교량받침 · 폴리에틸렌 · 합성목재 · 그레이팅 · 낙석 · 시트 · 비료 · 매트: 다산 규격과 조달청 규격이 달라 짝이 안 섬(원본만 보관). 받지 않은 분류 — 가드레일 · 표지판 · 목재덱 · 종자(0줄).
## 로직 일괄 시험 계산 (전후)
- 방법 — 로직 줄마다 입력 조합(최대 40)으로 `master_formula.run` 을 돌려 하나라도 통과하면 통과 · 아니면 멈춤.
- 관급 열 교체 전(다산소프트 값) **통과 1,024 · 멈춤 327** → 후(조달청 값) **통과 1,024 · 멈춤 327** — 변화 없음(멈춤 까닭 = 값 없음 285 · 맞는 줄 없음 25 · 지역 값 없음 16 · 칸 없음 1).
- 관급 열 교체 전(다산소프트 값) **통과 1,024 · 멈춤 327** → 후(조달청 값 · 최저 채움 · 새 줄 380 포함) **통과 1,024 · 멈춤 327** — 변화 없음(멈춤 까닭 = 값 없음 285 · 맞는 줄 없음 25 · 지역 값 없음 16 · 칸 없음 1 — 관급이 멈춤 까닭이 아님).
- check_master — 틀 0 · 본문 1(기존) · 로직 0.
## 갱신 절차
1. `update` — 받기(`fetch_all`) → 원본 보관(gz · `_meta.md`).
2. 짝짓기(`refill`) → 정본 관급 열·비고만 바꿈(`apply` · 다른 열·서식 그대로 · 줄 수 안 변함).
3. 바뀐 줄 목록 = `tmp/관급_바뀐줄.json`(옛값 · 새값 · 비고) — 검토 뒤 커밋.
4. 비고 형식 — 「관급: 조달청 <계약방식> <받은 날> · 계약 <시작>~ · <지역> · <인도조건> · <부가세>」 · 못 채운 줄 = 「관급: 조달청 값 못 채움 — <까닭> (<받은 날>)」.
1. `update` — 받기(`fetch_all` · 같은 날 받은 파일은 건너뜀 · 호출 5회 재시도) → 원본 보관(gz · `_meta.md`).
2. 짝짓기(`refill`) → 정본 관급 열·비고만 바꿈(`apply` · 다른 열·서식·줄바꿈 그대로).
3. 조달청에만 있는 품목 새 줄(`add_rows`) — 키대장 갱신 · 다시 돌려도 중복 없음.
4. 바뀐 줄 목록 = `tmp/관급_바뀐줄.json`(옛값 · 새값 · 비고) — 검토 뒤 커밋.
5. 비고 형식 — 「관급: 조달청 <계약방식>[ <제조사> 최저] <받은 날> · 계약 <시작>~ · <지역> · <인도조건> · <부가세>」 · 못 채운 줄 = 「관급: 조달청 값 못 채움 — <까닭> (<받은 날>)」.
## 남은 일
- 보류 갈래(철근·파형강관·흄관·H형강·아스콘 일부)는 **제조사 고르는 기준**(최저가 · 특정 조합 등)을 관리자가 정해야 채움.
- 못 찾은 지역·648줄 갈래는 조달청 다른 서비스(가격정보 `getPriceInfoListMrktCnstrctPc` 등) 조사 필요.
- 짝짓기 시험 = `resources/tester/test_masterdata_procure.py`(견본 응답 7건).
- 못 채움 800 — 아스콘 지역 240 · 규격 62 · 그 밖 297 · 파형강관 116 · H형강 30 · 그 밖 소수(위 표).
- 받아 둔 분류(블록 · 교량받침 · 폴리에틸렌 · 합성목재 · 그레이팅 · 낙석 · 시트 · 비료 · 매트)는 다산 규격과 조달청 규격 표기가 달라 짝 규칙을 더 만들어야 채움 — 또는 새 줄로 들임.
- 품셈재료 → 자재품목 연결(343 줄 미연결)은 화면에서 사람이 이음.
- 짝짓기 시험 = `resources/tester/test_masterdata_procure.py`(견본 응답 11건).
@@ -4,7 +4,7 @@
./venv/Scripts/python.exe resources/master_data/scripts/update_관급단가.py update
fetch 받기 → 원본 보관 (resources/knowledge/original/원가계산/자재단가/관급/<날짜>/ · gz + _meta.md)
test [날짜] 관급 열을 지우고 다시 채워 옛 값(다산소프트)과 맞댐 — 정본 안 덮음 · tmp/관급_대조.json
test [날짜] 관급 열을 지우고 다시 채워 옛 값(다산소프트)과 맞댐(±5% 안 = 맞음) — 정본 안 덮음 · tmp/관급_대조.json
apply [날짜] 정본 관급 열(관급 · 비고)만 받은 값으로 바꿈 · tmp/관급_바뀐줄.json
"""
@@ -12,6 +12,7 @@ import gzip
import json
import re
import sys
import time
import urllib.parse
from datetime import date
from pathlib import Path
@@ -21,6 +22,8 @@ PIPE = ROOT / "resources/knowledge/original/_pipeline"
RAW = ROOT / "resources/knowledge/original/원가계산/자재단가/관급"
sys.path.insert(0, str(PIPE))
import collect_cost_sources as cc # noqa: E402 (키 읽기 · fetch)
import master_keys as mk # noqa: E402 (새 줄 키)
import update_관급단가_기타 as misc # noqa: E402 (「그 밖」 갈래 짝짓기)
BASE = "https://apis.data.go.kr/1230000/at/ShoppingMallPrdctInfoService/"
MAS, UNIT, THPTY = (
@@ -41,6 +44,38 @@ JOBS = [ # 분류명은 부분 글자 조회 — 「철근」은 암거블록
(THPTY, "파형강관"),
(MAS, "콘크리트관"),
(UNIT, "콘크리트관"),
# 2차 — 다산소프트 「그 밖」 관급 · 품셈재료 중 조달청에 있는 것
(MAS, "시멘트"),
(MAS, "골재"),
(MAS, "조경석"),
(UNIT, "주철관"),
(MAS, "파형강관이음관"),
(THPTY, "파형강관이음관"),
(MAS, "배수로"),
(THPTY, "배수로"),
(MAS, "블록"),
(UNIT, "블록"),
(THPTY, "블록"),
(MAS, "돌망태"),
(THPTY, "돌망태"),
(MAS, "합성목재"),
(MAS, "볼라드"),
(MAS, "교량받침"),
(THPTY, "교량받침"),
(MAS, "용접철망"),
(THPTY, "섬유"),
(MAS, "폴리에틸렌"),
(THPTY, "폴리에틸렌"),
(MAS, "맨홀"),
(MAS, "매트"),
(THPTY, "매트"),
(MAS, "낙석"),
(THPTY, "그레이팅"),
(MAS, "벽돌"),
(THPTY, "시트"),
(MAS, "비료"),
(MAS, "압륜"),
(THPTY, "부직포"),
]
# 보관하는 칸 — 나머지(첨부·원산지·이미지·긴 설명)는 버림(원본이 수백 MB)
KEEP = (
@@ -53,10 +88,13 @@ KEEP = (
def call(op: str, key: str, **kw) -> dict:
q = "&".join(f"{k}={urllib.parse.quote(str(v))}" for k, v in kw.items())
url = f"{BASE}{op}?serviceKey={key}&type=json&{q}"
try:
return json.loads(cc.fetch(url, timeout=90).decode("utf-8", "replace"))["response"]
except Exception as e: # 오류 글에 받은 주소(키 포함)가 실려도 키는 가림
raise RuntimeError(f"{op} 호출 실패: {str(e).replace(key, '***')}") from None
for tries in range(5): # 큰 분류는 시간 초과가 잦음 — 다섯 번까지
try:
return json.loads(cc.fetch(url, timeout=90).decode("utf-8", "replace"))["response"]
except Exception as e: # 오류 글에 받은 주소(키 포함)가 실려도 키는 가림
if tries == 4:
raise RuntimeError(f"{op} 호출 실패: {str(e).replace(key, '***')}") from None
time.sleep(5)
def fetch_all() -> Path:
@@ -72,6 +110,11 @@ def fetch_all() -> Path:
"|---|---|---|---|",
]
for op, name in JOBS:
f = f"{op.removeprefix('get').removesuffix('PrdctInfoList')}_{name}.json.gz"
if (out / f).exists(): # 같은 날 이미 받은 것은 건너뜀(이어받기)
n = len(json.loads(gzip.decompress((out / f).read_bytes())))
lines.append(f"| {f} | {op} | {name} | {n:,} |")
continue
rows, page, total = [], 1, 1
while len(rows) < total:
r = call(op, key, inqryDiv=2, prdctClsfcNoNm=name, numOfRows=999, pageNo=page)
@@ -84,7 +127,6 @@ def fetch_all() -> Path:
break
rows += [{k: it.get(k) for k in KEEP} for it in items]
page += 1
f = f"{op.removeprefix('get').removesuffix('PrdctInfoList')}_{name}.json.gz"
(out / f).write_bytes(gzip.compress(json.dumps(rows, ensure_ascii=False).encode("utf-8")))
lines.append(f"| {f} | {op} | {name} | {len(rows):,} (totalCount {total:,}) |")
print(f, len(rows), total, flush=True)
@@ -216,6 +258,7 @@ class Matcher:
"""자재품목 줄 → 조달청 줄. 짝이 서면 (줄, 방식), 못 서면 (None, 까닭)."""
def __init__(self, raw: dict):
self.raw = raw
self.rmc = {}
for r in raw.get("MASCntrct_레미콘", []):
if r["prdctMakrNm"] == "조합공통품목":
@@ -335,7 +378,7 @@ class Matcher:
if dia and _dia(r["prdctSpecNm"]) == dia and "보통관" in r["prdctSpecNm"]
]
return pick(c)
return None, "이 갈래는 아직 짝짓기 없음"
return misc.find(row, self.raw, places, pick, PROVINCE)
FAMILY = (
@@ -349,13 +392,30 @@ FAMILY = (
def family(name: str) -> str:
return next((k for k, pat in FAMILY if re.match(pat, name)), "그 밖")
return next((k for k, pat in FAMILY if re.match(pat, name)), misc.label(name) or "그 밖")
def info(r: dict) -> dict:
return {
"방식": r["cntrctMthdNm"],
"품명": r["prdctSpecNm"],
"지역": r["prdctSplyRgnNm"],
"계약시작": r["cntrctBgnDate"],
"부가세": r["vatAplDivNm"],
"인도": r["prdctDlvryCndtnNm"],
"단위": r["prdctUnit"],
"제조사": r["cntrctCorpNm"] if r["prdctMakrNm"] == "조합공통품목" else r["prdctMakrNm"],
}
def refill(rows: list[dict], raw: dict) -> list[dict]:
"""조달 값(관급 열)이 있는 줄마다 조달청 값으로 다시 채운 결과."""
m, out = Matcher(raw), []
for x in rows:
if str(x.get("원문번호")).startswith(
"조달청 "
): # 조달청에서 새로 들인 줄은 아래 `add_rows` 몫
continue
if x["관급"] is None and not (x["비고"] or "").startswith(
"관급:"
): # 지난번에 못 채운 줄도 다시 시도
@@ -371,17 +431,7 @@ def refill(rows: list[dict], raw: dict) -> list[dict]:
"갈래": family(x["이름"]),
"새값": int(r["cntrctPrceAmt"]) if r else None,
"까닭": why,
"조달청": None
if not r
else {
"방식": r["cntrctMthdNm"],
"품명": r["prdctSpecNm"],
"지역": r["prdctSplyRgnNm"],
"계약시작": r["cntrctBgnDate"],
"부가세": r["vatAplDivNm"],
"인도": r["prdctDlvryCndtnNm"],
"단위": r["prdctUnit"],
},
"조달청": info(r) if r else None,
}
)
return out
@@ -397,7 +447,8 @@ def test(day: str | None = None) -> list[dict]:
tab: dict = {}
for r in res:
t = tab.setdefault(
r["갈래"], {"전체": 0, "": 0, "같음": 0, "다름": 0, "못채움": 0, "까닭": {}}
r["갈래"],
{"전체": 0, "": 0, "맞음": 0, "다름": 0, "최저채움": 0, "못채움": 0, "까닭": {}},
)
t["전체"] += 1
if r["새값"] is None:
@@ -405,7 +456,11 @@ def test(day: str | None = None) -> list[dict]:
t["까닭"][r["까닭"]] = t["까닭"].get(r["까닭"], 0) + 1
else:
t[""] += 1
t["같음" if r["새값"] == r["옛값"] else "다름"] += 1
ok = (
r["옛값"] and abs(r["새값"] / r["옛값"] - 1) <= 0.05
) # 받는 시점 차이는 ±5% 안이면 맞음
t["맞음" if ok else "다름"] += 1
t["최저채움"] += "최저" in r["까닭"]
for k, v in tab.items():
print(
k,
@@ -423,21 +478,75 @@ METHOD = {
def decide(x: dict, r: dict, day: str) -> tuple[int | None, str]:
"""(새 관급 값, 새 비고) — 값은 짝이 서고 후보 값이 하나일 때만(제조사별로 값이 갈리면 null · 고르는 기준 미정)."""
"""(새 관급 값, 새 비고) — 제조사별로 값이 갈리면 같은 규격의 가장 낮은 값 · 비고에 그 제조사."""
if r["새값"] is None:
return None, f"관급: 조달청 값 못 채움 — {r['까닭']} ({day})"
if "최저" in r["까닭"]:
return None, f"관급: 조달청 값 못 채움 — 제조사별로 값이 갈림 · 고르는 기준 미정 ({day})"
c = r["조달청"]
who = f" {c['제조사']} 최저" if "최저" in r["까닭"] else ""
return r["새값"], (
f"관급: 조달청 {METHOD.get(c['방식'], c['방식'])} {day} · 계약 {c['계약시작']}~ · {c['지역']} · {c['인도']} · {c['부가세']}"
f"관급: 조달청 {METHOD.get(c['방식'], c['방식'])}{who} {day} · 계약 {c['계약시작']}~ · {c['지역']} · {c['인도']} · {c['부가세']}"
)
def add_rows(lines: list[str], data: dict, raw: dict, day: str, changed: list) -> list[str]:
"""조달청에만 있는 품목 — 자재품목에 새 줄(관급만 · 물가지 네 열 null · 같은 품명·규격은 최저가). 이미 든 줄은 값·비고만 갈음."""
have = {x["원문번호"]: x for x in data[""] if str(x["원문번호"]).startswith("조달청 ")}
book, new = mk.load_book(), []
for num, (name, spec, rows) in misc.groups(raw).items():
r, how = pick(rows)
val, note = decide(
None, {"새값": int(r["cntrctPrceAmt"]), "까닭": how, "조달청": info(r)}, day
)
if num in have:
for i, line in enumerate(lines):
if f'"": "{have[num][""]}"' in line:
line = re.sub(
r'"관급": (?:null|-?[\d.]+)', lambda _: f'"관급": {val}', line, count=1
)
lines[i] = re.sub(
r'"비고": (?:null|"(?:[^"\\]|\\.)*")',
lambda _: f'"비고": {json.dumps(note, ensure_ascii=False)}',
line,
count=1,
)
break
continue
key = mk.issue(book, "MT", num, "재료_자재품목.json")
row = {
"": key, "원문번호": num, "구분": None, "상세구분": None, "이름": name, "규격": spec,
"단위": r["prdctUnit"], "물가자료": None, "유통물가": None, "물가정보": None,
"거래가격": None, "관급": val, "출처": f"자재품목 조달청 {r['cntrctMthdNm']}", "비고": note, "면수": None,
} # fmt: skip
new.append(
" { "
+ ", ".join(f'"{k}": {json.dumps(v, ensure_ascii=False)}' for k, v in row.items())
+ " }"
)
changed.append(
{
"": key,
"이름": name,
"규격": spec,
"갈래": "새 줄",
"옛값": None,
"새값": val,
"비고": note,
}
)
if new:
end = max(i for i, line in enumerate(lines) if line.strip() == "]")
lines[end - 1] += ","
lines[end:end] = [ln + "," for ln in new[:-1]] + new[-1:]
mk.save_book(mk.finish(book))
return lines
def apply(day: str | None = None) -> None:
"""정본 관급 열 · 비고만 바꿈 — 다산소프트 값은 하나도 안 남김(못 채운 줄 = null)."""
day = day or latest()
text = MASTER.read_bytes().decode("utf-8")
crlf = "\r\n" in text # 작업 폴더 줄바꿈(CRLF)을 그대로 지킴
text = text.replace("\r\n", "\n")
data = json.loads(text)
found = {r[""]: r for r in refill(data[""], load(day))}
changed, edits = [], {}
@@ -475,7 +584,9 @@ def apply(day: str | None = None) -> None:
assert n1 == n2 == 1, f"{m.group(1)} 줄 서식이 달라 멈춤"
lines[i] = line
assert not edits, f"정본에서 못 찾은 줄 {len(edits)}"
MASTER.write_bytes("\n".join(lines).encode("utf-8"))
lines = add_rows(lines, data, load(day), day, changed)
out = "\n".join(lines)
MASTER.write_bytes((out.replace("\n", "\r\n") if crlf else out).encode("utf-8"))
TMP.mkdir(exist_ok=True)
(TMP / "관급_바뀐줄.json").write_text(
json.dumps(changed, ensure_ascii=False, indent=1), encoding="utf-8"
@@ -0,0 +1,143 @@
"""관급 단가 — 「그 밖」 갈래 짝짓기(주철관 · 조경석 · 골재 · 시멘트 · 이음관 …) — `update_관급단가.py` 가 부름.
짝 = 자재품목 규격의 숫자 조각(치수·종별)이 조달청 품명·규격에 모두 있고, 글자 조각(제품·산지)도 모두 있을 때.
이름 쪽 글자는 점수만(같은 값이면 더 많이 맞는 줄 먼저). 지역이 이름에 있으면 그 지역 줄만. 여럿이면 가장 낮은 값(호출한 쪽 `pick`).
"""
import re
# (갈래, 이름 패턴, 받은 파일들) — 앞에서부터 처음 맞는 갈래
FAMILIES = (
("주철관", r"^(KP|타이튼)\s*주철직관", ["Ucntrct_주철관"]),
("주철관부속", r"^(이탈방지압륜|고무링,타이튼)", ["MASCntrct_압륜"]),
(
"파형강관이음관",
r"^파형강관(이음관|\s*커플링)",
["MASCntrct_파형강관이음관", "ThptyUcntrct_파형강관이음관"],
),
("조경석", r"^조경석", ["MASCntrct_조경석"]),
("골재", r"^도로용혼합골재", ["MASCntrct_골재"]),
("시멘트", r"^시멘트", ["MASCntrct_시멘트"]),
("수로관", r"^측구수로관", ["MASCntrct_배수로", "ThptyUcntrct_배수로"]),
(
"블록",
r"^(소형고압블록|생태옹벽블록|생태어소블록)",
["MASCntrct_블록", "Ucntrct_블록", "ThptyUcntrct_블록"],
),
("교량받침", r"^교량받침", ["MASCntrct_교량받침", "ThptyUcntrct_교량받침"]),
("합성목재", r"^합성목재", ["MASCntrct_합성목재"]),
("돌망태", r"(돌망태|개비온)", ["MASCntrct_돌망태", "ThptyUcntrct_돌망태"]),
("볼라드", r"^볼라드", ["MASCntrct_볼라드"]),
("매트", r"^(보행매트|고무매트)", ["MASCntrct_매트", "ThptyUcntrct_매트"]),
("용접철망", r"^와이어메쉬", ["MASCntrct_용접철망"]),
("맨홀", r"^주철맨홀", ["MASCntrct_맨홀"]),
("보강섬유", r"^콘크리트보강섬유", ["ThptyUcntrct_섬유"]),
(
"폴리에틸렌관",
r"^(PE직관|PE이중벽|VR관)",
["MASCntrct_폴리에틸렌", "ThptyUcntrct_폴리에틸렌"],
),
)
SKIP_WORDS = {"관급", "포장품", "", "각종"}
def label(name: str) -> str | None:
return next((k for k, pat, _ in FAMILIES if re.search(pat, name)), None)
def norm(t: str) -> str:
t = (t or "").lower().replace("", "mm").replace("", "m3").replace("", "kg")
t = re.sub(r"[φ∅øᴓф]", "d", t)
t = re.sub(r"(?<=\d)mm", "", t)
t = re.sub(r"(?<=[\d.])[×*x](?=[\d.d])", "x", t)
return re.sub(r"\s+", "", t).replace("", "")
def pieces(text: str) -> list[str]:
return [
p for p in (norm(x) for x in re.split(r"[,()/\\s]+", text or "")) if p not in SKIP_WORDS
]
def has(s: str, p: str) -> bool:
return re.search(rf"(?<![\d.]){re.escape(p)}(?![\d.])", s) is not None
def tail_of(name: str) -> str | None:
"""이름 끝의 「-지역」 또는 「-제조사」 · 「(충남지역」 · 「시멘트, 제주」."""
m = re.search(r"[\)\s]-([가-힣,·]+)$", name) or re.search(r"\(([가-힣]+)지역", name)
if m:
return m.group(1)
return "제주" if ", 제주" in name else None
def find(row: dict, raw: dict, places, pick, PROVINCE=frozenset()):
"""(줄, 방식) 또는 (None, 까닭) — `places` · `pick` 은 본 스크립트 것을 받음."""
n, spec = row["이름"], row["규격"]
fam = next(((k, f) for k, pat, f in FAMILIES if re.search(pat, n)), None)
if not fam:
return None, "이 갈래는 아직 짝짓기 없음"
rows = [r for f in fam[1] for r in raw.get(f, [])]
if not rows:
return None, "받은 원본 없음"
tail = tail_of(n)
reg = tail if tail and places(tail) & PROVINCE else None # 지역 이름이 아니면 제조사
maker = norm(tail) if tail and not reg else None
need = pieces(spec)
if fam[0] == "주철관": # 이름의 종별(2종 · 3종)도 맞아야
need += [p for p in pieces(n) if re.search(r"\d", p)]
if not pieces(spec):
return None, "규격 없음"
hits, seen_reg = [], False
for r in rows:
s = norm(r["prdctSpecNm"])
if not all(has(s, p) if re.search(r"\d", p) else p in s for p in need):
continue
if maker and maker not in norm(
r["prdctSpecNm"] + r["cntrctCorpNm"] + str(r["prdctMakrNm"])
):
continue
if reg:
want, have = places(reg), places(r["prdctSplyRgnNm"])
if "제주" in reg:
ok = "제주" in r["prdctSplyRgnNm"].replace("제주제외", "")
elif want:
ok = (
want <= have
or r["prdctSplyRgnNm"].startswith("전지역")
and "제주" not in r["prdctSplyRgnNm"]
)
else:
ok = True
if not ok:
seen_reg = True
continue
hits.append(r)
if not hits:
return None, "지역 못 찾음" if seen_reg else "규격 없음(원문 규격이 조달청에 없음)"
words = [p for p in pieces(n.replace(tail or "\0", "")) if not re.search(r"\d", p)]
score = lambda r: sum(w in norm(r["prdctSpecNm"]) for w in words) # noqa: E731
top = max(map(score, hits))
r, how = pick([r for r in hits if score(r) == top])
return r, how
# 조달청에만 있는 품목 — 자재품목에 새 줄로 들임 (갈래, 받은 파일들, 분류명)
NEW = (
("부직포", ["ThptyUcntrct_부직포"], None),
("돌망태", ["MASCntrct_돌망태", "ThptyUcntrct_돌망태"], {"금속돌망태"}),
)
def groups(raw: dict) -> dict:
"""{원문번호: (품명, 규격, 줄들)} — 「품명, 제조사, 모델, 규격…」 에서 제조사·모델을 뺀 같은 품명·규격끼리."""
out: dict = {}
for _, files, klass in NEW:
g: dict = {}
for f in files:
for r in raw.get(f, []):
p = [x.strip() for x in r["prdctSpecNm"].split(",")]
if len(p) >= 4 and (klass is None or r["prdctClsfcNoNm"] in klass):
g.setdefault((p[0], ", ".join(p[3:])), []).append(r)
out.update({f"조달청 {n} {s}": (n, s, rows) for (n, s), rows in g.items()})
return out
File diff suppressed because it is too large Load Diff
+64 -2
View File
@@ -41,6 +41,28 @@ RAW = {
raw_row("아스팔트콘크리트 조합공통품목, WC-2, 가열, 3등급", "경기도 수원시", 70000),
raw_row("순환 아스팔트콘크리트 조합공통품목, WC-2, 가열, 3등급", "경기도 수원시", 60000),
],
"MASCntrct_시멘트": [
raw_row("시멘트, 갑, 포틀랜드시멘트(1종), 포장40kg", "전지역(제주제외)", 5820, maker=""),
raw_row("시멘트, 갑, 포틀랜드시멘트(1종), 포장40kg", "제주", 6470, maker=""),
],
"MASCntrct_조경석": [
raw_row(
"조경석, 을산업, B-1, 300×400×500mm, R5이상~15미만, 보령성주석",
"충남",
29980,
maker="을산업",
),
raw_row(
"조경석, 병산업, C-1, 300×400×500mm, R5이상~15미만, 함양석",
"충남",
20000,
maker="병산업",
),
],
"Ucntrct_주철관": [
raw_row("수도용덕타일주철관, Φ80mm×6m, 2종, KP메커니컬/시멘트라이닝", "전지역", 148240),
raw_row("하수도용덕타일주철관, Φ80mm×6m, 3종, KP메커니컬/시멘트라이닝", "전지역", 118940),
],
"MASCntrct_봉강": [
raw_row("SD400, D10", "전지역(제주제외)", 827640, maker="가철강", cond="생산공장 상차도"),
raw_row("SD400, D10", "전지역(제주제외)", 830000, maker="나철강", cond="생산공장 상차도"),
@@ -77,9 +99,9 @@ def test_아스콘_순환_구분():
assert val == 60000
def test_제조사별_값_갈리면_보류():
def test_제조사별_값_갈리면_최저_제조사_비고():
_, (val, note) = fill(item("g", "이형철근(SD400)-관급", "HD=10mm 생산공장 상차도"))
assert val is None and "갈림" in note
assert val == 827640 and "가철강 최저" in note
def test_짝_없는_갈래는_안_채움():
@@ -98,3 +120,43 @@ def test_호출_오류에_키_안_찍힘(monkeypatch):
assert "SECRETKEY123" not in str(e) and "***" in str(e)
else:
raise AssertionError("예외가 나야 함")
def test_시멘트_제주는_제주_줄만():
_, (val, _) = fill(item("i", "시멘트 (관급)", "40kg入(포장품)"))
assert val == 5820
_, (val, _) = fill(item("j", "시멘트, 제주 (관급)", "40kg入(포장품)"))
assert val == 6470
def test_조경석_산지가_규격에_있으면_그_줄만():
spec = "300×400×500,R5이상~15미만,보령성주석(을산업)"
_, (val, _) = fill(item("k", "조경석(관급)", spec))
assert val == 29980 # 더 싼 병산업 줄이 아니라 산지·업체가 맞는 줄
def test_주철관_종별이_맞는_줄만():
_, (val, _) = fill(item("l", "KP 주철직관(2종)시멘트라이닝/관급", "D80mm×6m"))
assert val == 148240 # 3종(118,940)은 안 씀
def test_조달청에만_있는_품목은_같은_규격_최저가로_새_줄():
import update_관급단가_기타 as misc
def r(price, maker):
x = raw_row(
f"금속돌망태, {maker}, M-1, 1000×1000×1000mm, 사각상자형", "전지역", price, maker=maker
)
x["prdctClsfcNoNm"] = "금속돌망태"
return x
raw = {"MASCntrct_돌망태": [r(46800, ""), r(44000, "")]}
g = misc.groups(raw)
assert list(g) == ["조달청 금속돌망태 1000×1000×1000mm, 사각상자형"]
name, spec, rows = g["조달청 금속돌망태 1000×1000×1000mm, 사각상자형"]
val, note = up.decide(
None,
{"새값": 44000, "까닭": up.pick(rows)[1], "조달청": up.info(up.pick(rows)[0])},
"2026-09-20",
)
assert val == 44000 and "나 최저" in note