팔란티어테크놀로지스코리아
인턴·신입근거: 핵심 부품을 제때 공급하기 위해 글로벌 공급망을 어떻게 분석하고 유연하게 조정할 것인가?
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 FDE 가 “병원의 병상부터 공장의 생산 현장에 이르기까지” 고객의 현실 속으로 들어간다고 쓰고, 풀어야 할 문제의 예로 “핵심 부품을 제때 공급하기 위해 글로벌 공급망을 어떻게 분석하고 유연하게 조정할 것인가?” 를 듭니다. 주요업무는 “각 고객의 실제 환경에 최적화된 맞춤형 애플리케이션, LLM 워크플로, 상용 솔루션 구축하기” 와 실무 현장의 사용자부터 임원진까지 이해관계자와 일하는 것이고, 신입도 “고객과의 첫 대화부터” 출시까지 맡는다고 밝힙니다. 핵심 부품이 제때 오지 않아 생산 현장이 멈추는 장면을 데모용으로 고객사 조선소의 블록 조립에 옮기면, 입력은 ERP 내려받기·구매팀 엑셀·야드 대장처럼 고객사가 이미 쓰는 파일이고 화면을 보는 사람은 공정관리·구매 담당자라는 현장 사용자입니다. 이 포트폴리오는 표기가 다른 세 기록을 한 부품으로 잇고 착수일 순 배분으로 착수 가능 여부를 계산하는 구현을 보여줍니다. 조선 생산관리나 공급망 관리의 도메인 전문성은 주장하지 않습니다.
공고는 엔지니어를 고객 현장에 직접 배치하고, 각 고객의 실제 환경에 맞춘 애플리케이션과 LLM 워크플로를 만들며, 신입도 고객과의 첫 대화부터 출시까지 맡는다고 씁니다. 이 편의 입력은 고객사가 이미 쓰는 ERP 내려받기, 구매팀 엑셀, 야드 입고 대장이고, 산출물은 그 고객의 공정관리·구매 담당자가 매일 여는 관리자 페이지입니다.
공고가 FDE 가 풀 문제의 예로 든 두 질문 가운데 하나가 핵심 부품을 제때 공급하기 위해 공급망을 분석하고 조정하는 일이고, FDE 가 들어가는 현장으로 공장의 생산 현장을 듭니다. 이 편은 그 문제를 블록 조립 착수일 앞에서 부품별로 계산하는 화면으로 줄였고, 조선소는 데모를 위해 고른 업종입니다.
주요업무에 기존의 통념을 뛰어넘는 대규모 데이터 문제 해결이 있고, 우대 역량으로 기술 직군과 비기술 직군이 함께 일하는 팀에서 성과를 내는 태도를 듭니다. 이 편의 어려움은 같은 부품을 ERP·공급사·야드가 서로 다른 코드로 적고 납기를 손으로 옮겨 적는 데서 오고, 그 판정을 공정관리 담당자와 구매 담당자가 같은 화면에서 읽습니다. 판정 엔진은 Python, 화면은 TypeScript 로 씁니다.
팔란티어 코리아 Commercial 부문의 신입 FDSE 가 고객사 조선소에 들어가 처음 만드는 애플리케이션을 가정합니다. 조립을 앞둔 블록에 들어갈 의장품(밸브·배관처럼 공급사에서 사 오는 부품)은 ERP 자재코드로, 발주는 공급사 품번으로, 입고는 야드 대장에 따로 쌓여 있어서, 블록 하나에 부품이 다 오는지 보려면 세 기록을 한 부품으로 이어야 합니다. 이 관리자 페이지는 ERP 블록 일정과 블록 BOM 내려받기, 구매팀의 품번 대응표, 미입고 발주 목록, 야드 입고 대장을 받아 표기가 다른 품번과 날짜를 맞추고, 같은 부품을 쓰는 블록을 착수일 순으로 세워 입고분과 납기 안 발주분을 앞 블록부터 나눕니다. 공정관리 담당자와 구매 담당자는 앞으로 2주 안에 착수하는 블록마다 착수할 수 있는지, 걸렸다면 어느 부품이 몇 개 모자라는지를 같은 화면에서 봅니다.
고객사 조선소에서 블록별 조립 착수 일정을 짜는 공정관리 담당자와 부품 발주를 쫓는 구매 담당자. 지금은 ERP 발주 화면, 공급사 납기 회신 메일, 야드 입고 대장을 따로 열어 블록마다 부품이 다 오는지 맞춰 보느라, 착수 직전에야 빠진 부품을 알고 두 사람이 같은 화면을 보며 착수 순서를 바꿀지 정한다
세 기록이 같은 부품을 서로 다른 이름으로 부릅니다. 블록 BOM 은 ERP 자재코드를, 발주서는 공급사 품번을, 야드 대장은 담당자가 손으로 적은 자재코드를 쓰고, 납기는 구매 담당자가 공급사 회신 메일을 보고 제각각의 표기로 옮겨 적습니다. 블록 하나만 보면 부품이 충분해 보여도 같은 부품을 먼저 쓰는 블록이 입고분을 가져가면 모자라고, 대장에 같은 전표가 두 줄로 적히면 있는 줄 알았던 부품이 없습니다. 품번과 날짜를 맞추고 착수일 순으로 나누면, 공정관리 담당자는 착수 일주일 전에 걸릴 블록을 알고 구매 담당자는 어느 공급사의 어느 발주를 먼저 재촉할지 압니다.
고객사에서 받은 다섯 파일(ERP 블록 일정과 블록 BOM 내려받기, 품번 대응표, 미입고 발주 목록, 야드 입고 대장)을 올리면 관리자 페이지가 앞으로 2주 안에 착수하는 블록마다 판정을 띄웁니다. 걸린 블록을 펼치면 부품마다 필요 수량, 야드 입고, 착수일까지 올 발주, 앞 블록 몫, 모자란 개수가 나오고, 공정관리 담당자와 구매 담당자는 그 화면을 같이 보며 착수 순서를 바꿀지와 어느 발주를 재촉할지 정합니다.
블록 착수일을 옮기면 같은 부품을 쓰는 블록들의 배분을 다시 계산해 바뀌는 판정을 미리 보여주고, 옮긴 착수일은 버튼 하나로 원래대로 돌립니다. 착수일 당일 납기, 같은 날 착수하는 두 블록, 대장에 두 번 적힌 입고 전표처럼 한 개 차이로 판정이 바뀌는 사례 36건이 pytest 로 매번 돕니다.
공급사 회신 메일을 넣으면 Claude Sonnet 4.5 가 발주별 납기·분납 문장을 고르고 규칙이 그 문장에서 날짜와 수량을 다시 읽어, 발주 목록의 promised_date 와 어긋난 발주를 구매 담당자에게 보여줍니다. 매일 올린 파일과 판정을 DuckDB 에 쌓아 어제와 판정이 바뀐 블록이 맨 위에 뜹니다.
공정관리 담당자가 다섯 파일을 올리면 2주 안 착수 블록 10개가 다섯 판정으로 나뉘고, 걸린 블록을 펼치면 부품마다 필요 수량, 야드 입고, 착수일까지 올 발주, 앞 블록이 먼저 쓰는 양, 모자란 개수가 나옵니다. 구매 담당자는 같은 줄에서 재촉할 발주번호와 공급사를 읽습니다.
공급사 품번이 BFV200-10K·SP 4410 처럼 대응표와 다르게 적혀도 같은 부품으로 잇고, 대장에 두 줄로 적힌 입고 전표 YR-1006-012 는 한 번만 셉니다. 착수일 당일 납기는 착수 전 입고로 넣고, 같은 날 착수하는 두 블록은 block_id 순으로 나누며, 회신이 없어 promised_date 가 null 인 발주는 착수일까지 오는 양에서 뺍니다.
열 이름이 바뀐 엑셀, 자재코드에 글자가 섞인 대장 줄, 수량 칸에 'EA' 가 붙은 발주 같은 깨진 입력 30종을 넣어도 화면이 멈추지 않고, 읽지 못한 줄은 판정 대신 확인 칸에 파일 이름과 줄 번호로 뜹니다.
한 개 차이로 판정이 바뀌는 사례 36건으로 판정 일치를 냅니다. 단, 정답과 데이터를 모두 제가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 결과는 더미데이터 자가채점이며, 착수 직전에 빠진 부품을 아는 일이 실제로 줄었는지는 고객사의 실제 ERP·발주·입고 기록과 공정관리 담당자의 판단이 있어야 측정됩니다. 이 포트폴리오는 그 측정을 바로 돌릴 수 있는 상태로 만듭니다.
착수 판정 테스트 36건의 정답은 제가 배분 규칙을 손으로 따라가 매긴 값이라, 통과는 코드가 제 규칙을 그대로 옮겼다는 확인입니다. 고객사 블록이 이 판정대로 착수했거나 멈췄는지는 고객사의 실제 기록이 있어야 압니다.
세 블록은 한 개 차이로 판정이 걸려 있습니다. 입고 전표 YR-1006-012 의 이중 기입을 거르지 않으면 앵커 볼트 입고가 200개가 되어 H3107-B04 가 착수 가능으로 바뀌고, 공급사 품번의 하이픈·공백을 지우지 않으면 PO-2609-0318 이 빠져 H3105-E21 이 발주 수량 부족으로 바뀝니다. 회신이 없어 promised_date 가 null 인 PO-2609-0331 을 착수 전 입고로 세면 H3105-E22 가 착수 가능으로 바뀝니다.
미입고 발주 목록이 이미 입고된 수량을 빼고 내려왔다고 가정합니다. ERP 의 입고 처리가 늦어 같은 수량이 발주 잔량과 야드 대장에 함께 남아 있으면 공급을 겹쳐 세게 되므로, 실제 현장에서는 발주번호와 입고 전표를 잇는 확인부터 합니다.
배분 순서는 착수일 순 하나로 고정했습니다. 현장에서는 도크 일정이 급한 블록에 부품을 먼저 돌리기도 해서, 어느 블록을 먼저 채울지는 공정관리 담당자가 정하고 이 화면은 2주차의 착수 순서 바꿔 보기로 그 결과만 계산합니다.
실제 블록 BOM 은 블록당 수백 줄이고 단위(EA·SET·M)가 섞여 있습니다. 이 편은 공급사에서 사 오는 의장품만 같은 단위로 받는다고 보고, 단위 환산과 전체 BOM 적재는 도입 단계 과제로 둡니다.
다섯 파일로 착수 가능 여부를 계산하는 구현까지가 범위이고, 고객사 조선소의 실제 공정 운영이나 팔란티어 제품을 써 본 경험은 주장하지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 ERP 공정 계획에서 내려받은 블록별 조립 착수일을 본뜬 더미입니다. 판정 기준일(10월 13일) 다음 날부터 14일 안에 착수하는 블록만 담았고, 같은 날 착수하는 블록이 있습니다.
| block_id | ship_no | assembly_start |
|---|---|---|
| H3105-F11 | H3105 | 2026-10-14 |
| H3107-D03 | H3107 | 2026-10-15 |
| H3105-E21 | H3105 | 2026-10-16 |
| H3105-E22 | H3105 | 2026-10-18 |
| H3107-B04 | H3107 | 2026-10-20 |
아래 JSON Schema 에 맞는 블록 착수 일정 행을 더 만들어 주세요. {"type":"object","properties":{"block_id":{"type":"string","description":"호선 번호와 블록 번호를 이은 ERP 블록 코드입니다"},"ship_no":{"type":"string"},"assembly_start":{"type":"string","format":"date","description":"ERP 공정 계획의 조립 착수일입니다"}},"required":["block_id","ship_no","assembly_start"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 날 착수하는 블록 두 개, (2) 판정 기준일 다음 날 착수하는 블록, (3) 판정 기준일로부터 정확히 14일째 착수하는 블록. block_id 는 호선 번호(H3105 처럼)와 블록 번호를 하이픈으로 잇고 ship_no 와 앞부분이 같아야 합니다. block_bom 행을 같은 block_id 로 함께 만드세요. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"block_id":{"type":"string","description":"호선 번호와 블록 번호를 이은 ERP 블록 코드입니다"},"ship_no":{"type":"string"},"assembly_start":{"type":"string","format":"date","description":"ERP 공정 계획의 조립 착수일입니다"}},"required":["block_id","ship_no","assembly_start"]}ERP 블록 BOM 내려받기에서 공급사에서 사 오는 의장품 줄만 남긴 더미입니다. part_no 는 ERP 자재코드 그대로이고 qty 는 그 블록 조립에 필요한 개수입니다.
| block_id | part_no | part_name | qty |
|---|---|---|---|
| H3105-F11 | 3305-0150 | 게이트 밸브 DN150 | 4 |
| H3107-D03 | 7731-0024 | 앵커 볼트 M24 | 150 |
| H3105-E21 | 4410-0200 | 버터플라이 밸브 DN200 | 8 |
| H3105-E21 | 5520-4410 | 배관 스풀 SP-4410 | 10 |
| H3105-E22 | 5520-4410 | 배관 스풀 SP-4410 | 6 |
아래 JSON Schema 에 맞는 블록 BOM 행을 더 만들어 주세요. {"type":"object","properties":{"block_id":{"type":"string"},"part_no":{"type":"string","description":"ERP 자재코드 그대로입니다(0000-0000)"},"part_name":{"type":"string"},"qty":{"type":"integer","minimum":1,"description":"그 블록 조립에 필요한 개수입니다"}},"required":["block_id","part_no","part_name","qty"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 part_no 를 착수일이 다른 블록 두세 개가 함께 쓰는 줄, (2) part_code_map 에 없는 part_no, (3) 입고분만으로 딱 맞게 채워지는 qty. part_no 는 0000-0000 꼴로 쓰세요. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"block_id":{"type":"string"},"part_no":{"type":"string","description":"ERP 자재코드 그대로입니다(0000-0000)"},"part_name":{"type":"string"},"qty":{"type":"integer","minimum":1,"description":"그 블록 조립에 필요한 개수입니다"}},"required":["block_id","part_no","part_name","qty"]}구매팀이 엑셀로 관리하는 ERP 자재코드와 공급사 품번 대응표를 본뜬 더미입니다. 한 자재코드를 두 공급사에서 사는 줄이 있고, BOM 에 나오는 자재코드가 빠져 있기도 합니다.
| part_no | supplier | supplier_part_no |
|---|---|---|
| 4410-0200 | A밸브 | BFV-200-10K |
| 4410-0125 | A밸브 | BFV-125-10K |
| 4410-0250 | A밸브 | BFV-250-10K |
| 5520-4410 | B배관 | SP-4410 |
| 7731-0024 | C볼트 | AB-M24-300 |
아래 JSON Schema 에 맞는 품번 대응표 행을 더 만들어 주세요. {"type":"object","properties":{"part_no":{"type":"string","description":"ERP 자재코드입니다"},"supplier":{"type":"string"},"supplier_part_no":{"type":"string","description":"그 공급사가 쓰는 품번입니다"}},"required":["part_no","supplier","supplier_part_no"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 한 part_no 에 공급사가 다른 줄 두 개, (2) BOM 의 자재코드와 한 자리만 다른 이웃 코드, (3) 발주가 하나도 없는 공급사 품번. supplier_part_no 는 하이픈을 넣은 정식 표기로 쓰세요. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"part_no":{"type":"string","description":"ERP 자재코드입니다"},"supplier":{"type":"string"},"supplier_part_no":{"type":"string","description":"그 공급사가 쓰는 품번입니다"}},"required":["part_no","supplier","supplier_part_no"]}ERP 미입고 발주 잔량 내려받기를 본뜬 더미입니다. supplier_part_no 는 발주서에 적힌 그대로라 하이픈·공백이 대응표와 다르고, promised_date 는 구매 담당자가 공급사 회신 메일을 보고 '10/21'·'10월 14일'·'2026-10-19' 처럼 제각각 적은 값입니다. 회신이 없으면 null 입니다.
| po_id | supplier | supplier_part_no | qty | promised_date |
|---|---|---|---|---|
| PO-2609-0318 | A밸브 | BFV200-10K | 6 | 10/21 |
| PO-2609-0331 | B배관 | SP 4410 | 10 | — |
| PO-2610-0102 | C볼트 | AB-M24-300 | 120 | 2026-10-14 |
| PO-2610-0115 | D파스너 | M24X300HDG | 80 | 10월 14일 |
| PO-2610-0127 | E밸브 | GV-150-10K | 6 | 10/20 |
아래 JSON Schema 에 맞는 미입고 발주 행을 더 만들어 주세요. {"type":"object","properties":{"po_id":{"type":"string"},"supplier":{"type":"string"},"supplier_part_no":{"type":"string","description":"발주서에 적힌 공급사 품번 그대로입니다"},"qty":{"type":"integer","minimum":1,"description":"아직 들어오지 않은 발주 잔량입니다"},"promised_date":{"type":["string","null"],"description":"구매 담당자가 공급사 회신 메일을 보고 적은 납기입니다. 'YYYY-MM-DD'·'MM/DD'·'M월 D일' 이 섞여 있고, 회신이 없으면 null 입니다"}},"required":["po_id","supplier","supplier_part_no","qty","promised_date"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 대응표 품번에서 하이픈이나 공백이 빠지거나 더해진 supplier_part_no, (2) promised_date 가 null 인 발주, (3) promised_date 가 블록 착수일과 같은 날인 발주, (4) 대응표의 품번과 끝 한 글자만 다른 다른 부품의 발주. promised_date 는 'YYYY-MM-DD'·'MM/DD'·'M월 D일' 을 섞어 쓰세요. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"po_id":{"type":"string"},"supplier":{"type":"string"},"supplier_part_no":{"type":"string","description":"발주서에 적힌 공급사 품번 그대로입니다"},"qty":{"type":"integer","minimum":1,"description":"아직 들어오지 않은 발주 잔량입니다"},"promised_date":{"type":["string","null"],"description":"구매 담당자가 공급사 회신 메일을 보고 적은 납기입니다. 'YYYY-MM-DD'·'MM/DD'·'M월 D일' 이 섞여 있고, 회신이 없으면 null 입니다"}},"required":["po_id","supplier","supplier_part_no","qty","promised_date"]}야드 자재 담당과 반장이 손으로 적는 입고 대장을 본뜬 더미입니다. 아직 블록에 내주지 않은 입고분만 담고, part_no 를 '77310024'·'7731 0024' 처럼 적기도 하며, 한 입고 전표를 두 사람이 따로 적은 이중 기입이 있습니다.
| slip_no | part_no | qty | received_at | recorded_by |
|---|---|---|---|---|
| YR-1002-006 | 8840-0310 | 10 | 2026-10-02 | 자재 담당 |
| YR-1006-012 | 7731-0024 | 80 | 2026-10-06 | 야드 반장 |
| YR-1006-012 | 77310024 | 80 | 10/06 | 자재 담당 |
| YR-1007-019 | 5520-4410 | 12 | 2026-10-07 | 야드 반장 |
| YR-1008-031 | 4410-0200 | 2 | 2026-10-08 | 자재 담당 |
아래 JSON Schema 에 맞는 입고 대장 행을 더 만들어 주세요. {"type":"object","properties":{"slip_no":{"type":"string","description":"입고 전표 번호입니다"},"part_no":{"type":"string","description":"대장에 손으로 적은 ERP 자재코드라 하이픈·공백이 제각각입니다"},"qty":{"type":"integer","minimum":1},"received_at":{"type":"string","description":"입고일입니다. 'YYYY-MM-DD' 와 'MM/DD' 가 섞여 있습니다"},"recorded_by":{"type":"string","enum":["야드 반장","자재 담당"]}},"required":["slip_no","part_no","qty","received_at","recorded_by"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) slip_no 가 같고 recorded_by 만 다른 이중 기입, (2) 하이픈 없이 숫자만 적거나 공백을 넣은 part_no, (3) received_at 을 'MM/DD' 로 적은 줄, (4) 판정 창 블록이 쓰지 않는 부품의 입고. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"slip_no":{"type":"string","description":"입고 전표 번호입니다"},"part_no":{"type":"string","description":"대장에 손으로 적은 ERP 자재코드라 하이픈·공백이 제각각입니다"},"qty":{"type":"integer","minimum":1},"received_at":{"type":"string","description":"입고일입니다. 'YYYY-MM-DD' 와 'MM/DD' 가 섞여 있습니다"},"recorded_by":{"type":"string","enum":["야드 반장","자재 담당"]}},"required":["slip_no","part_no","qty","received_at","recorded_by"]}| Python | 판정 엔진의 언어입니다. pandas·openpyxl 로 다섯 파일을 읽어 자재코드·공급사 품번·날짜 표기를 맞추고, 부품마다 블록을 착수일 순으로 세워 입고분과 납기 안 발주분을 나눕니다. FastAPI 로 판정 API 를 엽니다. |
| TypeScript/JavaScript | 관리자 페이지의 언어입니다. 2주 착수 띠, 판정 묶음, 부품별 배분 펼침과 2주차의 착수일 옮겨 보기를 씁니다. |
| 프론트엔드 프레임워크 | React 로 착수 띠와 판정 표를 그리고, 착수일을 옮기면 판정 API 를 다시 불러 바뀐 블록만 다시 그립니다. |
| 데이터 구조 | 부품마다 (착수일, block_id) 로 정렬한 수요 목록과 공급 합계를 두고 앞 블록부터 빼는 배분, 정규화한 공급사 품번을 키로 한 발주 사전을 씁니다. |
| 스토리지 시스템 | 3주차에 DuckDB 에 날짜별로 올린 다섯 파일과 판정을 쌓아, 어제와 판정이 바뀐 블록을 SQL 로 뽑습니다. |
| LLM 워크플로 | 3주차에 공급사 회신 메일(.eml)을 읽어 발주별 납기·분납 문장을 고르고, 규칙이 원문에서 날짜·수량을 다시 읽은 값만 발주 목록 납기와 견주는 흐름입니다. |
| Claude | Claude Sonnet 4.5 가 회신 메일 문장을 미입고 발주 줄에 짝짓습니다. |
| 비즈니스 한국어·영어 | 국내 공급사의 한국어 회신과 해외 공급사의 영어 회신('ETA Oct 21, partial 4 pcs')을 같은 규칙으로 읽고, 화면 문구와 판정 사유는 현장 담당자가 읽는 한국어로 씁니다. |
✓ pass → 공정관리 담당자와 구매 담당자가 이 화면 하나로 2주 착수 계획을 같이 보면 1주차로 완결입니다. 더 키우려면 착수일을 옮겨 보며 배분을 다시 계산하는 화면과 한 개 차이 사례 36건 테스트로 갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 공급사 회신 메일에서 납기를 뽑아 발주 목록과 대조하고, 매일 판정을 쌓아 하루 사이 바뀐 블록을 보여주는 단계로 갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · block_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
착수일 전에 부품이 다 들어옴착수 가능납기가 착수일보다 늦음납기 지연먼저 착수하는 블록이 부품을 가져감앞 블록이 먼저 씀발주 수량이 모자람발주 부족발주와 짝지어지지 않는 부품발주 미연결2주 안에 착수하는 블록 하나에 블록 착수 판정 하나와 부품별 배분 수치를 남기고, 그 근거(다섯 파일의 행 값과 합계)를 싣는 형식입니다.
{"type":"object","properties":{"block_id":{"type":"string"},"ship_no":{"type":"string"},"assembly_start":{"type":"string","format":"date"},"as_of_date":{"type":"string","description":"판정 기준일입니다. 다음 날부터 14일 안에 착수하는 블록을 판정합니다"},"verdict":{"type":"string","enum":["착수일 전에 부품이 다 들어옴","납기가 착수일보다 늦음","먼저 착수하는 블록이 부품을 가져감","발주 수량이 모자람","발주와 짝지어지지 않는 부품"],"description":"parts 의 part_verdict 가운데 발주와 짝지어지지 않는 부품, 발주 수량이 모자람, 납기가 착수일보다 늦음, 먼저 착수하는 블록이 부품을 가져감 순으로 앞선 하나입니다. 모든 부품이 걸리지 않으면 착수일 전에 부품이 다 들어옴입니다"},"also_found":{"type":"array","items":{"type":"string","enum":["납기가 착수일보다 늦음","먼저 착수하는 블록이 부품을 가져감","발주 수량이 모자람","발주와 짝지어지지 않는 부품"]}},"parts":{"type":"array","items":{"type":"object","properties":{"part_no":{"type":"string"},"part_name":{"type":"string"},"part_verdict":{"type":"string","enum":["착수일 전에 부품이 다 들어옴","납기가 착수일보다 늦음","먼저 착수하는 블록이 부품을 가져감","발주 수량이 모자람","발주와 짝지어지지 않는 부품"]},"need_qty":{"type":"integer","minimum":1,"description":"block_bom.qty 입니다"},"on_hand_qty":{"type":"integer","minimum":0,"description":"정적 계산값입니다. part_no 를 숫자만 남겨 맞춘 yard_receipts 가운데 received_at 이 as_of_date 이하인 줄의 qty 합계이고, 같은 slip_no 줄은 한 번만 셉니다"},"po_by_start_qty":{"type":"integer","minimum":0,"description":"정적 계산값입니다. part_code_map 으로 짝지은 purchase_orders 가운데 promised_date 를 날짜로 읽은 값이 assembly_start 이하인 발주의 qty 합계입니다. promised_date 가 null 이면 더하지 않습니다"},"po_total_qty":{"type":"integer","minimum":0,"description":"정적 계산값입니다. promised_date 와 상관없이 짝지은 purchase_orders 의 qty 합계입니다"},"earlier_need_qty":{"type":"integer","minimum":0,"description":"정적 계산값입니다. 같은 part_no 를 쓰는 판정 창 안 블록을 assembly_start 순(같은 날이면 block_id 순)으로 세웠을 때 이 블록보다 앞선 블록들의 qty 합계입니다"},"short_qty":{"type":["integer","null"],"minimum":1,"description":"정적 계산값입니다. earlier_need_qty + need_qty 에서 쓸 수 있는 양을 뺀 개수이고, 쓸 수 있는 양은 발주 수량이 모자람이면 on_hand_qty + po_total_qty, 납기가 착수일보다 늦음과 먼저 착수하는 블록이 부품을 가져감이면 on_hand_qty + po_by_start_qty 입니다. 나머지 판정이면 null 입니다"}},"required":["part_no","part_name","part_verdict","need_qty","on_hand_qty","po_by_start_qty","po_total_qty","earlier_need_qty","short_qty"]}},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["block_schedule","block_bom","part_code_map","purchase_orders","yard_receipts"]},"row":{"type":["string","null"],"description":"block_schedule 은 block_id, block_bom 은 block_id|part_no, part_code_map 은 part_no|supplier_part_no, purchase_orders 는 po_id, yard_receipts 는 slip_no 입니다. agg 항목이면 null 입니다"},"field":{"type":"string"},"value":{"type":["string","integer","null"]},"agg":{"type":"string","enum":["count","sum","avg","min","max"]}},"required":["table","row","field","value"]}},"notes":{"type":"array","items":{"type":"string"},"description":"판정에 들지 않았지만 공정관리·구매 담당자가 알아야 할 사실입니다"},"summary":{"type":"string"}},"required":["block_id","ship_no","assembly_start","as_of_date","verdict","also_found","parts","evidence","notes","summary"]}[
{
"block_id": "H3105-E21",
"ship_no": "H3105",
"assembly_start": "2026-10-16",
"as_of_date": "2026-10-13",
"verdict": "납기가 착수일보다 늦음",
"also_found": [],
"parts": [
{
"part_no": "4410-0200",
"part_name": "버터플라이 밸브 DN200",
"part_verdict": "납기가 착수일보다 늦음",
"need_qty": 8,
"on_hand_qty": 2,
"po_by_start_qty": 0,
"po_total_qty": 6,
"earlier_need_qty": 0,
"short_qty": 6
},
{
"part_no": "5520-4410",
"part_name": "배관 스풀 SP-4410",
"part_verdict": "착수일 전에 부품이 다 들어옴",
"need_qty": 10,
"on_hand_qty": 12,
"po_by_start_qty": 0,
"po_total_qty": 10,
"earlier_need_qty": 0,
"short_qty": null
}
],
"evidence": [
{
"table": "block_schedule",
"row": "H3105-E21",
"field": "assembly_start",
"value": "2026-10-16"
},
{
"table": "block_bom",
"row": "H3105-E21|4410-0200",
"field": "qty",
"value": 8
},
{
"table": "part_code_map",
"row": "4410-0200|BFV-200-10K",
"field": "supplier_part_no",
"value": "BFV-200-10K"
},
{
"table": "purchase_orders",
"row": "PO-2609-0318",
"field": "supplier_part_no",
"value": "BFV200-10K"
},
{
"table": "purchase_orders",
"row": "PO-2609-0318",
"field": "qty",
"value": 6
},
{
"table": "purchase_orders",
"row": "PO-2609-0318",
"field": "promised_date",
"value": "10/21"
},
{
"table": "yard_receipts",
"row": "YR-1008-031",
"field": "qty",
"value": 2
},
{
"table": "block_bom",
"row": "H3105-E21|5520-4410",
"field": "qty",
"value": 10
},
{
"table": "yard_receipts",
"row": "YR-1007-019",
"field": "qty",
"value": 12
}
],
"notes": [
"발주서의 BFV200-10K 는 하이픈을 지우면 대응표의 BFV-200-10K 와 같아 4410-0200 의 발주로 짝짓습니다.",
"배관 스풀 5520-4410 은 야드 입고 12개로 이 블록 몫 10개를 채웁니다."
],
"summary": "10월 16일 착수하는 H3105-E21 은 버터플라이 밸브 DN200 이 8개 필요한데 야드에 2개뿐이고, 남은 6개는 A밸브 회신 납기가 10월 21일입니다."
},
{
"block_id": "H3105-E22",
"ship_no": "H3105",
"assembly_start": "2026-10-18",
"as_of_date": "2026-10-13",
"verdict": "먼저 착수하는 블록이 부품을 가져감",
"also_found": [],
"parts": [
{
"part_no": "5520-4410",
"part_name": "배관 스풀 SP-4410",
"part_verdict": "먼저 착수하는 블록이 부품을 가져감",
"need_qty": 6,
"on_hand_qty": 12,
"po_by_start_qty": 0,
"po_total_qty": 10,
"earlier_need_qty": 10,
"short_qty": 4
}
],
"evidence": [
{
"table": "block_schedule",
"row": "H3105-E22",
"field": "assembly_start",
"value": "2026-10-18"
},
{
"table": "block_schedule",
"row": "H3105-E21",
"field": "assembly_start",
"value": "2026-10-16"
},
{
"table": "block_bom",
"row": "H3105-E22|5520-4410",
"field": "qty",
"value": 6
},
{
"table": "block_bom",
"row": "H3105-E21|5520-4410",
"field": "qty",
"value": 10
},
{
"table": "yard_receipts",
"row": "YR-1007-019",
"field": "qty",
"value": 12
},
{
"table": "part_code_map",
"row": "5520-4410|SP-4410",
"field": "supplier_part_no",
"value": "SP-4410"
},
{
"table": "purchase_orders",
"row": "PO-2609-0331",
"field": "supplier_part_no",
"value": "SP 4410"
},
{
"table": "purchase_orders",
"row": "PO-2609-0331",
"field": "qty",
"value": 10
},
{
"table": "purchase_orders",
"row": "PO-2609-0331",
"field": "promised_date",
"value": null
}
],
"notes": [
"PO-2609-0331 은 B배관 회신이 없어 promised_date 가 null 이라 착수일까지 오는 양에 넣지 않았습니다. 구매 담당자가 납기를 받으면 다시 판정합니다."
],
"summary": "야드의 배관 스풀 12개 가운데 10개를 10월 16일 착수하는 H3105-E21 이 먼저 써서, 10월 18일 착수하는 H3105-E22 는 6개 중 4개가 모자랍니다."
},
{
"block_id": "H3107-B04",
"ship_no": "H3107",
"assembly_start": "2026-10-20",
"as_of_date": "2026-10-13",
"verdict": "발주 수량이 모자람",
"also_found": [],
"parts": [
{
"part_no": "7731-0024",
"part_name": "앵커 볼트 M24",
"part_verdict": "발주 수량이 모자람",
"need_qty": 250,
"on_hand_qty": 120,
"po_by_start_qty": 200,
"po_total_qty": 200,
"earlier_need_qty": 150,
"short_qty": 80
}
],
"evidence": [
{
"table": "block_schedule",
"row": "H3107-B04",
"field": "assembly_start",
"value": "2026-10-20"
},
{
"table": "block_schedule",
"row": "H3107-D03",
"field": "assembly_start",
"value": "2026-10-15"
},
{
"table": "block_bom",
"row": "H3107-B04|7731-0024",
"field": "qty",
"value": 250
},
{
"table": "block_bom",
"row": "H3107-D03|7731-0024",
"field": "qty",
"value": 150
},
{
"table": "yard_receipts",
"row": "YR-1006-012",
"field": "qty",
"value": 80
},
{
"table": "yard_receipts",
"row": "YR-1006-012",
"field": "part_no",
"value": "77310024"
},
{
"table": "yard_receipts",
"row": "YR-1009-027",
"field": "qty",
"value": 40
},
{
"table": "purchase_orders",
"row": "PO-2610-0102",
"field": "qty",
"value": 120
},
{
"table": "purchase_orders",
"row": "PO-2610-0115",
"field": "qty",
"value": 80
},
{
"table": "purchase_orders",
"row": "PO-2610-0115",
"field": "supplier_part_no",
"value": "M24X300HDG"
},
{
"table": "yard_receipts",
"row": null,
"field": "qty",
"value": 120,
"agg": "sum"
},
{
"table": "purchase_orders",
"row": null,
"field": "qty",
"value": 200,
"agg": "sum"
}
],
"notes": [
"입고 전표 YR-1006-012 는 야드 반장과 자재 담당이 따로 적어 대장에 두 줄이지만 80개로 한 번만 셉니다.",
"앵커 볼트는 C볼트와 D파스너 두 곳에서 사므로 두 공급사 품번의 발주를 더했습니다."
],
"summary": "앵커 볼트 M24 는 10월 15일 H3107-D03 의 150개와 10월 20일 H3107-B04 의 250개를 합쳐 400개가 필요한데, 야드 입고 120개와 발주 200개를 더해도 80개가 모자랍니다."
},
{
"block_id": "H3107-B05",
"ship_no": "H3107",
"assembly_start": "2026-10-22",
"as_of_date": "2026-10-13",
"verdict": "발주와 짝지어지지 않는 부품",
"also_found": [],
"parts": [
{
"part_no": "6120-0815",
"part_name": "케이블 트레이 브래킷",
"part_verdict": "발주와 짝지어지지 않는 부품",
"need_qty": 24,
"on_hand_qty": 0,
"po_by_start_qty": 0,
"po_total_qty": 0,
"earlier_need_qty": 0,
"short_qty": null
},
{
"part_no": "4410-0125",
"part_name": "버터플라이 밸브 DN125",
"part_verdict": "착수일 전에 부품이 다 들어옴",
"need_qty": 4,
"on_hand_qty": 0,
"po_by_start_qty": 6,
"po_total_qty": 6,
"earlier_need_qty": 0,
"short_qty": null
}
],
"evidence": [
{
"table": "block_bom",
"row": "H3107-B05|6120-0815",
"field": "part_no",
"value": "6120-0815"
},
{
"table": "block_bom",
"row": "H3107-B05|6120-0815",
"field": "qty",
"value": 24
},
{
"table": "part_code_map",
"row": null,
"field": "part_no",
"value": 0,
"agg": "count"
},
{
"table": "yard_receipts",
"row": null,
"field": "qty",
"value": 0,
"agg": "count"
},
{
"table": "part_code_map",
"row": "6120-0820|CTB-820",
"field": "part_no",
"value": "6120-0820"
},
{
"table": "block_bom",
"row": "H3107-B05|4410-0125",
"field": "qty",
"value": 4
},
{
"table": "purchase_orders",
"row": "PO-2610-0140",
"field": "qty",
"value": 6
},
{
"table": "purchase_orders",
"row": "PO-2610-0140",
"field": "promised_date",
"value": "2026-10-19"
}
],
"notes": [
"대응표에는 6120-0815 가 없고 이웃 코드 6120-0820(CTB-820) 만 있습니다. 오기인지 새 부품인지는 구매 담당자가 정합니다.",
"버터플라이 밸브 DN125 는 10월 19일 납기 6개로 이 블록 몫 4개를 채웁니다."
],
"summary": "10월 22일 착수하는 H3107-B05 의 케이블 트레이 브래킷 6120-0815 는 품번 대응표에 없고 야드 입고 기록도 없어, 24개를 누가 언제 보내는지 알 수 없습니다."
},
{
"block_id": "H3107-B06",
"ship_no": "H3107",
"assembly_start": "2026-10-22",
"as_of_date": "2026-10-13",
"verdict": "발주 수량이 모자람",
"also_found": [],
"parts": [
{
"part_no": "4410-0125",
"part_name": "버터플라이 밸브 DN125",
"part_verdict": "발주 수량이 모자람",
"need_qty": 4,
"on_hand_qty": 0,
"po_by_start_qty": 6,
"po_total_qty": 6,
"earlier_need_qty": 4,
"short_qty": 2
}
],
"evidence": [
{
"table": "block_schedule",
"row": "H3107-B06",
"field": "assembly_start",
"value": "2026-10-22"
},
{
"table": "block_schedule",
"row": "H3107-B05",
"field": "assembly_start",
"value": "2026-10-22"
},
{
"table": "block_bom",
"row": "H3107-B06|4410-0125",
"field": "qty",
"value": 4
},
{
"table": "block_bom",
"row": "H3107-B05|4410-0125",
"field": "qty",
"value": 4
},
{
"table": "purchase_orders",
"row": "PO-2610-0140",
"field": "qty",
"value": 6
},
{
"table": "yard_receipts",
"row": null,
"field": "qty",
"value": 0,
"agg": "count"
}
],
"notes": [
"같은 날 착수하는 H3107-B05 를 block_id 순으로 앞에 세웠습니다. 착수 순서를 바꾸면 모자라는 쪽이 B05 로 넘어갑니다."
],
"summary": "10월 22일 같은 날 착수하는 H3107-B05 와 H3107-B06 이 버터플라이 밸브 DN125 를 4개씩 쓰는데 발주가 6개뿐이라 H3107-B06 몫에서 2개가 모자랍니다."
},
{
"block_id": "H3107-D02",
"ship_no": "H3107",
"assembly_start": "2026-10-27",
"as_of_date": "2026-10-13",
"verdict": "착수일 전에 부품이 다 들어옴",
"also_found": [],
"parts": [
{
"part_no": "8840-0310",
"part_name": "전선관 글랜드",
"part_verdict": "착수일 전에 부품이 다 들어옴",
"need_qty": 10,
"on_hand_qty": 10,
"po_by_start_qty": 0,
"po_total_qty": 0,
"earlier_need_qty": 0,
"short_qty": null
}
],
"evidence": [
{
"table": "block_bom",
"row": "H3107-D02|8840-0310",
"field": "qty",
"value": 10
},
{
"table": "part_code_map",
"row": "8840-0310|CG-310-A",
"field": "supplier_part_no",
"value": "CG-310-A"
},
{
"table": "purchase_orders",
"row": "PO-2610-0152",
"field": "supplier_part_no",
"value": "CG-310-B"
},
{
"table": "yard_receipts",
"row": "YR-1002-006",
"field": "qty",
"value": 10
},
{
"table": "yard_receipts",
"row": "YR-1002-006",
"field": "received_at",
"value": "2026-10-02"
}
],
"notes": [
"대응표 품번 CG-310-A 로 잡힌 발주는 없고, F전장의 PO-2610-0152(CG-310-B)는 다른 품번이라 더하지 않습니다. 야드 입고분으로 착수합니다."
],
"summary": "10월 27일 착수하는 H3107-D02 의 전선관 글랜드는 발주는 없지만 10월 2일 입고된 10개가 필요 10개를 채웁니다."
},
{
"block_id": "H3105-F12",
"ship_no": "H3105",
"assembly_start": "2026-10-21",
"as_of_date": "2026-10-13",
"verdict": "착수일 전에 부품이 다 들어옴",
"also_found": [],
"parts": [
{
"part_no": "2210-0065",
"part_name": "체크 밸브 DN65",
"part_verdict": "착수일 전에 부품이 다 들어옴",
"need_qty": 6,
"on_hand_qty": 0,
"po_by_start_qty": 6,
"po_total_qty": 6,
"earlier_need_qty": 0,
"short_qty": null
}
],
"evidence": [
{
"table": "block_schedule",
"row": "H3105-F12",
"field": "assembly_start",
"value": "2026-10-21"
},
{
"table": "block_bom",
"row": "H3105-F12|2210-0065",
"field": "qty",
"value": 6
},
{
"table": "part_code_map",
"row": "2210-0065|CKV-065-16K",
"field": "supplier_part_no",
"value": "CKV-065-16K"
},
{
"table": "purchase_orders",
"row": "PO-2610-0133",
"field": "supplier_part_no",
"value": "CKV065-16K"
},
{
"table": "purchase_orders",
"row": "PO-2610-0133",
"field": "promised_date",
"value": "10월 21일"
},
{
"table": "purchase_orders",
"row": "PO-2610-0133",
"field": "qty",
"value": 6
}
],
"notes": [
"납기가 착수일과 같은 10월 21일이라 착수 전 입고로 셉니다. 당일 오전 하역이 늦으면 착수가 밀릴 수 있어 공정관리 담당자가 시각을 확인합니다."
],
"summary": "10월 21일 착수하는 H3105-F12 의 체크 밸브 DN65 6개는 E밸브 회신 납기가 같은 날이라 착수일 전에 다 들어오는 것으로 봅니다."
},
{
"block_id": "H3105-E23",
"ship_no": "H3105",
"assembly_start": "2026-10-24",
"as_of_date": "2026-10-13",
"verdict": "착수일 전에 부품이 다 들어옴",
"also_found": [],
"parts": [
{
"part_no": "3305-0150",
"part_name": "게이트 밸브 DN150",
"part_verdict": "착수일 전에 부품이 다 들어옴",
"need_qty": 6,
"on_hand_qty": 4,
"po_by_start_qty": 6,
"po_total_qty": 6,
"earlier_need_qty": 4,
"short_qty": null
}
],
"evidence": [
{
"table": "block_schedule",
"row": "H3105-E23",
"field": "assembly_start",
"value": "2026-10-24"
},
{
"table": "block_schedule",
"row": "H3105-F11",
"field": "assembly_start",
"value": "2026-10-14"
},
{
"table": "block_bom",
"row": "H3105-E23|3305-0150",
"field": "qty",
"value": 6
},
{
"table": "block_bom",
"row": "H3105-F11|3305-0150",
"field": "qty",
"value": 4
},
{
"table": "yard_receipts",
"row": "YR-1010-044",
"field": "qty",
"value": 4
},
{
"table": "purchase_orders",
"row": "PO-2610-0127",
"field": "qty",
"value": 6
},
{
"table": "purchase_orders",
"row": "PO-2610-0127",
"field": "promised_date",
"value": "10/20"
}
],
"notes": [
"야드 입고 4개는 10월 14일 착수하는 H3105-F11 이 먼저 쓰고, 10월 20일 납기 6개가 이 블록 몫을 꼭 채웁니다. 한 개라도 늦거나 덜 오면 판정이 바뀝니다."
],
"summary": "게이트 밸브 DN150 은 앞 블록 몫 4개와 H3105-E23 몫 6개를 합친 10개가 야드 입고 4개와 10월 20일 납기 6개로 착수일 전에 다 들어옵니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 와 parts[].part_verdict 가 착수일 전에 부품이 다 들어옴·납기가 착수일보다 늦음·먼저 착수하는 블록이 부품을 가져감·발주 수량이 모자람·발주와 짝지어지지 않는 부품 다섯 값 중 하나인지, also_found 가 착수일 전에 부품이 다 들어옴을 뺀 네 값 중 하나인지 확인합니다. 2. 필수 필드 block_id·ship_no·assembly_start·as_of_date·verdict·also_found·parts·evidence·notes·summary 와 parts 항목의 part_no·part_name·part_verdict·need_qty·on_hand_qty·po_by_start_qty·po_total_qty·earlier_need_qty·short_qty 가 모두 존재하는지 확인합니다. 3. need_qty 가 1 이상, on_hand_qty·po_by_start_qty·po_total_qty·earlier_need_qty 가 0 이상, short_qty 가 null 이 아니면 1 이상인지 확인합니다. 4. 품번 잇기: block_bom.part_no·part_code_map.part_no·yard_receipts.part_no 는 숫자만 남겨 같은 자재코드로 보고, part_code_map.supplier_part_no 와 purchase_orders.supplier_part_no 는 하이픈과 공백을 지우고 대문자로 맞춰 짝짓습니다. 한 자재코드에 대응표 줄이 둘이면 두 공급사 품번의 발주를 모두 더합니다. 7731-0024 는 AB-M24-300 과 M24X300-HDG 두 품번의 PO-2610-0102·PO-2610-0115 를 더해 po_total_qty 가 200 인지 다시 계산합니다. 5. 날짜 읽기: promised_date 와 received_at 의 '10/21'·'10월 21일' 처럼 연도가 없는 표기는 as_of_date 의 연도로 읽습니다. promised_date 가 null 인 발주는 po_total_qty 에만 더하고 po_by_start_qty 에는 더하지 않습니다. 6. 수량 재계산: on_hand_qty 는 received_at 이 as_of_date 이하인 입고 줄의 qty 합계이고 같은 slip_no 는 한 번만 셉니다. po_by_start_qty 는 promised_date 가 assembly_start 이하인 발주 qty 합계, po_total_qty 는 짝지은 발주 qty 전체 합계입니다. earlier_need_qty 는 같은 part_no 를 쓰는 판정 창 안 블록을 assembly_start 순, 같은 날이면 block_id 순으로 세웠을 때 이 블록보다 앞선 블록들의 qty 합계입니다. YR-1006-012 는 대장에 두 줄이지만 80개로 한 번만 세어 7731-0024 의 on_hand_qty 가 120 인지 다시 계산합니다. 7. 발주와 짝지어지지 않는 부품: part_no 가 part_code_map 에 없거나 짝지은 supplier_part_no 의 발주가 하나도 없고, yard_receipts 에도 그 part_no 입고가 없으면 걸립니다. 대응표에 없는 6120-0815 를 쓰는 H3107-B05 가 걸리고, 대응표 품번 CG-310-A 의 발주는 없지만 야드에 10개가 있는 8840-0310 의 H3107-D02 는 걸리지 않습니다. 8. 발주 수량이 모자람: on_hand_qty + po_total_qty 가 earlier_need_qty + need_qty 보다 작으면 걸리고, short_qty 가 그 차인지 다시 계산합니다. H3107-B04 는 120 + 200 = 320 이 150 + 250 = 400 보다 80 작아 걸립니다. 같은 날 착수하는 H3107-B05 를 block_id 순으로 앞에 세운 H3107-B06 은 0 + 6 이 4 + 4 보다 2 작아 걸리고, H3107-B05 의 4410-0125 는 0 + 6 이 0 + 4 이상이라 걸리지 않습니다. 9. 납기가 착수일보다 늦음: on_hand_qty + po_by_start_qty 가 need_qty 보다 작고 on_hand_qty + po_total_qty 는 need_qty 이상이면 걸리고, short_qty 는 earlier_need_qty + need_qty − (on_hand_qty + po_by_start_qty) 입니다. H3105-E21 의 4410-0200 은 입고 2개에 10월 21일 납기 발주 6개가 착수일 10월 16일 뒤라 2 가 8 보다 작아 short_qty 가 6 입니다. 납기가 착수일과 같은 10월 21일인 PO-2610-0133 을 더한 H3105-F12 는 걸리지 않습니다. 10. 먼저 착수하는 블록이 부품을 가져감: on_hand_qty + po_by_start_qty 가 need_qty 이상인데 earlier_need_qty + need_qty 보다 작으면 걸리고, short_qty 가 그 차인지 다시 계산합니다. H3105-E22 의 5520-4410 은 입고 12개가 필요 6개보다 많지만 앞선 H3105-E21 이 10개를 먼저 써 4개가 모자랍니다. 입고 4개와 10월 20일 납기 6개로 앞 블록 몫 4개와 필요 6개를 꼭 채우는 H3105-E23 은 걸리지 않습니다. 11. 부품마다 위 순서(짝지어지지 않음, 발주 수량 부족, 납기 늦음, 앞 블록 선점)로 앞선 하나가 part_verdict 이고, 블록 verdict 는 parts 가운데 같은 순서로 앞선 판정, also_found 는 나머지 부품의 걸린 판정입니다. 이 순서로 정해졌는지 다시 계산합니다. 12. evidence 의 table·field 가 다섯 데이터셋에 실재하는 컬럼인지 대조합니다. 13. agg 가 없는 evidence 의 value 가 그 row 의 그 컬럼 값과 같은지 확인합니다. agg 가 sum 인 value 는 그 부품에 해당하는 줄의 qty 합계이고, count 인 value 는 해당 줄 수입니다. 14. summary 가 존댓말로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. 걸린 블록의 착수 순서를 바꿀지, 다른 블록 몫을 돌릴지는 공정관리 담당자가 정합니다. 화면은 배분 결과만 보여줍니다. 2. 납기가 늦은 발주를 재촉할지, 다른 공급사에 추가 발주할지는 구매 담당자가 정합니다. 3. 6120-0815 와 6120-0820 처럼 대응표에 없는 자재코드가 오기인지 새 부품인지는 구매 담당자가 대응표를 보고 정합니다. 4. promised_date 가 null 인 발주는 구매 담당자가 공급사에 회신을 다시 받습니다. [평가 러너 · 2주차] 1. 착수일 당일 납기, 같은 날 착수하는 두 블록, 대장에 두 번 적힌 입고 전표처럼 한 개 차이로 판정이 바뀌는 사례 36건에서 블록 verdict 와 부품별 short_qty 가 손으로 낸 정답과 같은 건수를 셉니다. [판정식에 더한 정의 · 오너 확인 항목] 1. 판정 창은 as_of_date 다음 날부터 14일 안에 착수하는 블록이고, 그 밖 블록의 수요는 배분에 넣지 않습니다. 2. 같은 날 착수하는 블록은 block_id 순으로 배분합니다. 3. 입고 대장의 같은 slip_no 줄은 한 번만 셉니다. 카드 판정식의 yard_receipts.qty 합계에 더한 정제 규칙입니다. 4. purchase_orders 는 ERP 미입고 잔량이라 야드 입고분과 겹치지 않는다고 봅니다. 5. short_qty 는 세 판정 모두 앞 블록 몫을 포함한 같은 식으로 셉니다. 납기 늦음 판정 자체는 카드대로 그 블록 need_qty 와 견줍니다.
근거: 핵심 부품을 제때 공급하기 위해 글로벌 공급망을 어떻게 분석하고 유연하게 조정할 것인가?