코드021
경력근거: 고객과 가까운 현장에서 업무 프로세스와 문제를 파악하고, 이를 기술적으로 설계·구현하여 실제 운영까지 연결하는
※ 실제 산출물이 아닌 AI 예측 시안입니다.
코드021 은 자체 제조실행시스템인 FlowOne MES 를 만들어 제조 고객사에 세우는 회사이고, 공고는 FDE 를 '고객과 가까운 현장에서 업무 프로세스와 문제를 파악하고, 이를 기술적으로 설계·구현하여 실제 운영까지 연결하는' 엔지니어로 적었습니다. MES 를 현장에 붙이는 첫 달에 가장 먼저 무너지는 것이 실적 입력이라, '고객의 업무 환경과 비즈니스 프로세스 분석' 과 '신속한 프로토타입과 PoC를 통한 해결 방안 검증' 이 실제로는 실적과 표준 공정표를 맞춰 보는 작업으로 시작합니다. 제품마다 공정 순서가 다르고 그 순서는 고객사 라우팅에 들어 있어, 계약한 현장에 가야 이 규칙을 세울 수 있습니다. 이 포트폴리오는 실적 행을 작업지시 단위로 묶어 순서와 시간을 규칙으로 따지는 기술을 보여줍니다. 인쇄 공정 기술이나 제조 품질 관리 전문성은 주장하지 않습니다. 설비나 품질 관리 이론을 물으면 배운 적 없다고 먼저 답하겠습니다. 고객 현장에 들어가 앉는 자리라, 아는 척한 답은 첫 주에 그대로 드러납니다.
담당 업무 첫 두 줄이 '고객의 업무 환경과 비즈니스 프로세스 분석' 과 '고객 요구사항을 기술 요구사항과 개발 과제로 구체화' 입니다. 제조 현장에서 '실적이 자꾸 비어서 못 믿겠다' 는 말을 어느 공정 순서와 몇 분이라는 규칙으로 바꾸는 일이 그 구체화입니다.
'신속한 프로토타입과 PoC를 통한 해결 방안 검증' 뒤에 '고객 환경에 솔루션 배포 및 운영 안정화 지원' 과 '장애와 기술적 문제의 원인 분석 및 해결' 이 이어집니다. 실적을 하루치씩 돌려 보고 어긋난 것부터 내는 도구는 그 검증 단계에 바로 놓입니다.
우대사항이 'ERP, WMS, CRM, 백오피스 등 업무 시스템 개발 경험' 을 들고, 업무에는 '기존 시스템, 데이터베이스 및 외부 API 연동' 과 '현장 피드백을 바탕으로 제품과 업무 프로세스 개선' 이 있습니다. 코드021 이 자체 MES 인 FlowOne 을 제조 고객사에 세우는 회사라, 현장 단말이 올린 실적과 제품별 표준 공정표를 잇는 이 도구가 그 연동의 첫 칸입니다.
현장 단말이 올린 하루치 작업 실적을 작업지시와 공정 단위로 묶어 제품별 표준 공정표와 맞춥니다. 표준 공정표가 그 공정 앞에 두라고 적은 공정이 같은 작업지시의 실적에 있는지 보고(있는지까지만 보고 시각 순서는 보지 않습니다), 교대가 나뉘어 여러 번 올라온 실적은 시작과 종료 시각을 합쳐 분으로 재며, 자정을 넘긴 야간 작업도 이어 셉니다. 표준 공정표에 아예 없는 공정 코드로 올라온 실적은 따로 사유를 답니다. 판정에 쓴 실적 분과 표준 분, 앞에 와야 할 공정 이름을 함께 실어 현장 반장이 어느 작업지시를 다시 볼지 바로 봅니다.
고객 제조 현장에 들어가 MES 를 세우는 코드021 FDE 엔지니어
실적이 못 미더운 이유는 작업자가 게을러서가 아니라, 단말에서 공정을 건너뛰고 찍어도 아무도 그날 막아 주지 않기 때문입니다. 실적과 표준 공정표를 작업지시마다 맞춰 보면 그날 안에 되물을 공정이 사유별로 나옵니다.
작업 실적 파일과 제품별 표준 공정표를 넣으면 작업지시와 공정마다 공정대로임·앞 공정을 건너뜀·표준 시간을 크게 넘김·라우팅에 없는 공정 중 하나를 판정하고, 실적 분과 표준 분, 앞에 와야 할 공정을 붙여 작업지시별로 묶은 확인 목록을 터미널과 Markdown 파일로 내는 CLI 가 도는 완결품입니다. 실적 파일은 단말에서 내려받은 표를 받아 넣는 것으로 두고, MES 데이터베이스 직접 연동은 3주차로 미룹니다.
여러 날치 판정을 합쳐 공정별·작업자별로 어긋난 횟수를 세고, 두 날 이상 같은 사유로 걸린 공정을 단말 입력 화면 손질 후보로 냅니다.
어긋난 실적을 작업지시별로 나눠 현장 반장에게 보낼 확인 요청 문서를 조립하고, 실적 분이 표준 분과 계속 벌어지는 공정은 표준 시간 재조정 후보로 함께 냅니다.
터미널에 작업 날짜와 고객사를 주고 한 번 돌리면 작업지시 92건의 판정이 사유 묶음으로 내려옵니다. 묶음마다 합친 실적 분과 표준 분, 앞에 와야 할 공정 이름이 함께 붙어 나오는 것을 시연합니다.
공정 묶음 80건에 손으로 정답 사유를 달아 두고 판정을 돌려 사유별 일치율을 냅니다. 실적과 표준 공정표가 둘 다 합성 더미라, 이 숫자는 성능이 아니라 데모 조건에서 규칙이 도는지를 보는 값입니다.
입력 30종을 먼저 망가뜨려 놓고 시작합니다 — 종료 시각이 빠진 실적, 표준 시간이 비어 있는 공정, 자정을 넘긴 야간 교대 실적. 그 30종에서도 사유별 건수가 그대로 나오고 터미널 출력이 흐트러지지 않아야 통과입니다.
고객사가 표준 시간 허용 배수를 두 배 대신 한 배 반으로 쓰겠다고 하면 어떤 묶음이 새로 걸리고 어떤 묶음이 풀리는지를 회귀 케이스로 남깁니다.
이 항목의 숫자는 작성자가 만든 실적과 표준 공정표를 상대로 잰 값이고 현장 정확도와는 다릅니다. 불량이 어느 공정에서 났는지 짚는 시간이 줄었는지는 FlowOne MES 를 세운 현장의 실 실적을 며칠치 넣어 봐야 압니다. 여기까지 만들어 두면 그 며칠치를 받는 즉시 돌릴 수 있습니다.
실적 행과 표준 공정표를 모두 작성자가 만들었습니다. 그래서 사유별 일치율은 규칙이 제가 정한 규칙대로 돈다는 확인일 뿐, 현장 실적 앞에서 얼마나 맞히는지는 아직 모릅니다. 코드021 이 FlowOne MES 를 세운 현장의 실 실적이 올라와야 그 숫자가 나옵니다.
더미가 깨끗하면 규칙이 늘 맞으므로, 종료 시각이 빠진 실적과 표준 시간이 비어 있는 공정, 라우팅에 없는 공정 코드, 자정을 넘긴 교대 실적을 일부러 넣어 두었습니다.
이 포트폴리오는 실적 행을 작업지시 단위로 묶어 순서와 시간을 규칙으로 따지는 기술을 보여줍니다. 인쇄 공정 기술이나 제조 품질 관리 전문성은 주장하지 않습니다. 판정은 공정 조회와 분 합계가 정하고 클로드는 확인 요청 문구만 씁니다.
앞 공정을 건너뛰었다는 판정이 작업을 건너뛰었다는 뜻은 아닙니다. 외주로 돌린 공정이나 단말 고장으로 늦게 올라온 실적도 같은 모양이 되므로, 어느 쪽인지는 현장 반장이 정합니다.
앞 공정 확인은 그 공정의 실적이 같은 작업지시에 올라와 있는지까지만 봅니다. 인쇄가 CTP 출력보다 먼저 끝나도록 시각이 뒤바뀐 실적은 지금 가르지 못합니다. 단말 시계가 설비마다 몇 분씩 어긋나 있어 시각으로 순서를 판정하면 거짓 위반이 쌓이기 때문이고, 현장에서 시계 동기화를 확인한 뒤 3주차에 순번 대조를 얹습니다.
작업 실적과 표준 공정표는 고객사 사내망 안에서만 도는 자료입니다. 따라서 이 CLI 는 사내망 안에서 도는 것을 기본으로 잡고, 외부 모델에는 작업지시 번호와 공정 이름, 분 수치까지만 건넵니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
현장 단말이 올린 하루치 작업 실적입니다. 실적 번호와 작업지시, 제품 코드, 공정 코드와 이름, 실적 수량, 시작·종료 시각, 작업자를 한 행에 둡니다. 한 공정이 교대로 나뉘면 같은 작업지시에 실적 행이 두 번 올라오고, 야간 작업은 종료 시각이 다음 날로 넘어갑니다. 아직 끝나지 않았거나 단말에서 종료를 안 찍은 행은 종료 시각이 비어 있습니다. 표준 공정표에 없는 공정 코드로 올라온 실적도 섞어 두어 사유가 갈리게 둡니다.
| report_no | order_no | item_code | process_code | process_name | qty_done | started_at | finished_at | worker_id |
|---|---|---|---|---|---|---|---|---|
| WR-001 | WO-44120 | ITM-BX-220 | PRESS | 인쇄 | 1,200 | 2026-09-21T08:30 | 2026-09-21T10:50 | OP-07 |
| WR-002 | WO-44155 | ITM-BX-220 | CTP | CTP 출력 | 600 | 2026-09-21T07:10 | 2026-09-21T07:48 | OP-03 |
| WR-003 | WO-44155 | ITM-BX-220 | PRESS | 인쇄 | 600 | 2026-09-21T08:05 | 2026-09-21T10:30 | OP-07 |
| WR-004 | WO-44155 | ITM-BX-220 | COAT | 코팅 | 600 | 2026-09-21T11:00 | 2026-09-21T14:00 | OP-11 |
| WR-005 | WO-44155 | ITM-BX-220 | COAT | 코팅 | 600 | 2026-09-21T22:10 | 2026-09-22T00:22 | OP-19 |
아래 JSON Schema 를 그대로 만족하는 작업 실적 행을 400개 더 만들어 주세요. 작업지시를 아흔쯤 두고 작업지시마다 실적을 2~6행 답니다. 한 작업지시의 실적은 같은 제품 코드를 쓰고 시작 시각이 대체로 공정 순서대로 늦어집니다. 스무 행에 한 번꼴로 같은 작업지시·같은 공정을 주간과 야간으로 나눠 두 행에 올리고, 야간 행은 종료 시각을 다음 날로 넘기세요. 서른 행에 한 번꼴로 finished_at 을 비우고, 표준 공정표에 없는 공정 코드도 몇 행 넣습니다. 형식을 일부러 깨뜨린 파일도 5건 만들되 시각에 '2026-09-21 14:35' 처럼 다른 구분자를 쓰거나 수량을 '1,200' 문자열로 적는 식으로 만드세요. 판정 결과나 사유는 넣지 마세요.
{"type": "object", "properties": {"report_no": {"type": "string"}, "order_no": {"type": "string"}, "item_code": {"type": "string"}, "process_code": {"type": "string"}, "process_name": {"type": "string"}, "qty_done": {"type": "integer"}, "started_at": {"type": "string"}, "finished_at": {"type": ["string", "null"]}, "worker_id": {"type": "string"}}, "required": ["report_no", "order_no", "item_code", "process_code", "process_name", "qty_done", "started_at", "finished_at", "worker_id"]}{"type": "object", "properties": {"report_no": {"type": "string"}, "order_no": {"type": "string"}, "item_code": {"type": "string"}, "process_code": {"type": "string"}, "process_name": {"type": "string"}, "qty_done": {"type": "integer"}, "started_at": {"type": "string"}, "finished_at": {"type": ["string", "null"]}, "worker_id": {"type": "string"}}, "required": ["report_no", "order_no", "item_code", "process_code", "process_name", "qty_done", "started_at", "finished_at", "worker_id"]}고객사가 관리하는 제품별 표준 공정표입니다. 라우팅 번호와 제품 코드, 제품 이름, 공정 코드와 이름, 순번, 표준 시간, 앞 공정을 한 행에 둡니다. 첫 공정은 앞 공정 칸이 비어 있고, 새로 넣은 공정은 표준 시간이 아직 정해지지 않아 비어 있기도 합니다. 실적에 나오는 공정 중 이 표에 아예 없는 것도 두어 사유가 갈리게 둡니다.
| routing_no | item_code | item_name | process_code | process_name | seq_no | standard_minutes | prev_process |
|---|---|---|---|---|---|---|---|
| RM-001 | ITM-BX-220 | 화장품 낱개 박스 | CTP | CTP 출력 | 10 | 40 | — |
| RM-002 | ITM-BX-220 | 화장품 낱개 박스 | PRESS | 인쇄 | 20 | 150 | CTP |
| RM-003 | ITM-BX-220 | 화장품 낱개 박스 | COAT | 코팅 | 30 | 120 | PRESS |
| RM-004 | ITM-BX-220 | 화장품 낱개 박스 | DIECUT | 톰슨 | 40 | 90 | COAT |
| RM-005 | ITM-BX-220 | 화장품 낱개 박스 | CUT | 재단 | 50 | 45 | DIECUT |
아래 JSON Schema 를 그대로 만족하는 표준 공정 행을 150개 더 만들어 주세요. 제품을 스물쯤 두고 제품마다 공정을 4~7개 답니다. 순번은 10씩 올리고 앞 공정은 바로 앞 순번의 공정 코드로 두되 첫 공정만 비웁니다. 표준 시간은 20에서 240 사이 정수로 두고 열 행에 한 번꼴로 비웁니다. 공정 코드는 인쇄·그래픽 현장에서 쓰는 영문 약어로 쓰고, 실적에 나오는 공정 중 일부는 일부러 넣지 마세요. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"routing_no": {"type": "string"}, "item_code": {"type": "string"}, "item_name": {"type": "string"}, "process_code": {"type": "string"}, "process_name": {"type": "string"}, "seq_no": {"type": "integer"}, "standard_minutes": {"type": ["integer", "null"]}, "prev_process": {"type": ["string", "null"]}}, "required": ["routing_no", "item_code", "item_name", "process_code", "process_name", "seq_no", "standard_minutes", "prev_process"]}{"type": "object", "properties": {"routing_no": {"type": "string"}, "item_code": {"type": "string"}, "item_name": {"type": "string"}, "process_code": {"type": "string"}, "process_name": {"type": "string"}, "seq_no": {"type": "integer"}, "standard_minutes": {"type": ["integer", "null"]}, "prev_process": {"type": ["string", "null"]}}, "required": ["routing_no", "item_code", "item_name", "process_code", "process_name", "seq_no", "standard_minutes", "prev_process"]}| Python | 실적 행을 작업지시와 공정으로 묶고 분 단위 시간을 합쳐 네 사유로 가르는 판정 규칙과 CLI 를 맡습니다. |
| Java | FlowOne MES 가 Java 로 도는 현장에서 판정 결과를 그대로 읽도록 출력 규격을 JSON 한 벌로 고정합니다. |
| TypeScript | 현장 반장이 확인 결과를 눌러 처리하는 화면을 3주차에 붙일 때 씁니다. |
| Next.js | 그 확인 화면을 사내망 안에서 바로 띄우는 웹 앱으로 만듭니다. |
| REST API | 판정 결과를 MES 쪽에서 가져가도록 작업지시 단위 조회 엔드포인트를 둡니다. |
| 데이터베이스 | 여러 날치 판정을 쌓아 공정별·작업자별로 어긋난 횟수를 2주차에 집계합니다. |
| 업무 자동화 | 하루치 실적이 올라오면 판정을 돌려 확인 목록을 아침에 내놓는 일정 작업을 둡니다. |
| Docker | 판정 실행기를 이미지 한 벌로 묶어 고객사 서버에서 같은 결과가 나오게 합니다. |
| AWS | 2주차부터 판정 배치와 결과 파일 보관을 AWS 로 배포해 운영합니다. |
✗ fail → 라우팅에 없는 공정이 절반을 넘으면 고객사 표준 공정표가 아직 MES 에 다 안 올라온 것으로 봅니다. 판정보다 라우팅 등록을 앞세우고, 등록이 끝난 제품부터 다시 돕니다.
✓ pass → 2주차 공정별 집계로 넘어갑니다.
✗ fail → 날마다 다른 공정만 걸리면 손질 후보를 내지 않고 작업지시별로 둡니다.
✓ pass → 3주차 확인 요청 문서와 표준 시간 손질로 넘어갑니다.
작업지시 하나의 공정 하나가 표준 공정표대로 돌았는지 정합니다. 네 사유 중 하나를 싣고 합친 실적 분과 표준 분, 허용 분, 앞에 와야 할 공정을 함께 담아 확인 목록과 요청 문서가 그대로 읽습니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "order_no": {"type": "string"}, "item_code": {"type": "string"}, "process_code": {"type": "string"}, "process_name": {"type": "string"}, "routing_no": {"type": ["string", "null"]}, "seq_no": {"type": ["integer", "null"]}, "report_nos": {"type": "array", "items": {"type": "string"}}, "verdict": {"type": "string", "enum": ["공정대로임", "앞 공정을 건너뜀", "표준 시간을 크게 넘김", "라우팅에 없는 공정"]}, "actual_minutes": {"type": ["integer", "null"], "description": "그 order_no·process_code 실적 행들의 started_at 부터 finished_at 까지 분을 더한 값입니다. 자정을 넘긴 야간 실적도 이어 셉니다. finished_at 이 비어 있는 행이 하나라도 있으면 null 입니다"}, "standard_minutes": {"type": ["integer", "null"], "description": "그 item_code·process_code 의 routing_master.standard_minutes 입니다. 라우팅에 공정이 없거나 값이 비어 있으면 null 입니다"}, "allowed_minutes": {"type": ["integer", "null"], "description": "standard_minutes 의 두 배입니다. standard_minutes 가 null 이면 null 입니다"}, "prev_process": {"type": ["string", "null"], "description": "그 공정의 routing_master.prev_process 입니다. 첫 공정이거나 라우팅에 공정이 없으면 null 입니다"}, "evidence": {"type": "array", "items": {"type": "object", "properties": {"table": {"type": "string", "enum": ["work_reports", "routing_master"]}, "field": {"type": "string"}, "agg": {"type": ["string", "null"]}, "value": {}}, "required": ["table", "field", "value"]}}, "summary": {"type": "string"}, "hedge": {"type": ["string", "null"]}}, "required": ["verdict_no", "order_no", "item_code", "process_code", "report_nos", "verdict", "evidence", "summary"]}[
{
"verdict_no": "MV-001",
"order_no": "WO-44120",
"item_code": "ITM-BX-220",
"process_code": "PRESS",
"process_name": "인쇄",
"routing_no": "RM-002",
"seq_no": 20,
"report_nos": [
"WR-001"
],
"verdict": "앞 공정을 건너뜀",
"actual_minutes": 140,
"standard_minutes": 150,
"allowed_minutes": 300,
"prev_process": "CTP",
"evidence": [
{
"table": "routing_master",
"field": "prev_process",
"agg": null,
"value": "CTP"
},
{
"table": "work_reports",
"field": "process_code",
"agg": null,
"value": "PRESS"
},
{
"table": "work_reports",
"field": "report_no",
"agg": "count",
"value": 1
}
],
"summary": "인쇄 실적만 한 건 올라왔고 앞에 와야 할 CTP 출력 실적이 이 작업지시에 없습니다.",
"hedge": "CTP 를 외주로 돌린 작업지시일 수 있어, 어느 쪽인지는 현장 반장이 정합니다."
},
{
"verdict_no": "MV-002",
"order_no": "WO-44155",
"item_code": "ITM-BX-220",
"process_code": "COAT",
"process_name": "코팅",
"routing_no": "RM-003",
"seq_no": 30,
"report_nos": [
"WR-004",
"WR-005"
],
"verdict": "표준 시간을 크게 넘김",
"actual_minutes": 312,
"standard_minutes": 120,
"allowed_minutes": 240,
"prev_process": "PRESS",
"evidence": [
{
"table": "work_reports",
"field": "started_at",
"agg": null,
"value": "2026-09-21T11:00"
},
{
"table": "work_reports",
"field": "finished_at",
"agg": null,
"value": "2026-09-21T14:00"
},
{
"table": "work_reports",
"field": "started_at",
"agg": null,
"value": "2026-09-21T22:10"
},
{
"table": "work_reports",
"field": "finished_at",
"agg": null,
"value": "2026-09-22T00:22"
},
{
"table": "routing_master",
"field": "standard_minutes",
"agg": null,
"value": 120
},
{
"table": "work_reports",
"field": "report_no",
"agg": "count",
"value": 2
}
],
"summary": "코팅이 주간과 야간 두 번에 나뉘어 312분 걸렸는데 표준이 120분이라 허용 240분을 72분 넘습니다.",
"hedge": null
},
{
"verdict_no": "MV-003",
"order_no": "WO-44188",
"item_code": "ITM-BX-220",
"process_code": "EMBOSS",
"process_name": "형압",
"routing_no": null,
"seq_no": null,
"report_nos": [
"WR-006"
],
"verdict": "라우팅에 없는 공정",
"actual_minutes": 75,
"standard_minutes": null,
"allowed_minutes": null,
"prev_process": null,
"evidence": [
{
"table": "work_reports",
"field": "process_code",
"agg": null,
"value": "EMBOSS"
},
{
"table": "routing_master",
"field": "process_code",
"agg": "count",
"value": 6
},
{
"table": "work_reports",
"field": "item_code",
"agg": null,
"value": "ITM-BX-220"
}
],
"summary": "형압 실적이 75분 올라왔는데 이 제품 라우팅 여섯 공정 어디에도 형압이 서 있지 않습니다.",
"hedge": "급한 주문이라 라우팅을 고치지 않고 돌린 것일 수 있으므로, 반려가 아니라 라우팅에 더할 공정 후보로 넘깁니다."
},
{
"verdict_no": "MV-004",
"order_no": "WO-44210",
"item_code": "ITM-LF-105",
"process_code": "CUT",
"process_name": "재단",
"routing_no": "RM-010",
"seq_no": 40,
"report_nos": [
"WR-011"
],
"verdict": "공정대로임",
"actual_minutes": 58,
"standard_minutes": 45,
"allowed_minutes": 90,
"prev_process": "FOLD",
"evidence": [
{
"table": "work_reports",
"field": "started_at",
"agg": null,
"value": "2026-09-21T10:40"
},
{
"table": "work_reports",
"field": "finished_at",
"agg": null,
"value": "2026-09-21T11:38"
},
{
"table": "routing_master",
"field": "standard_minutes",
"agg": null,
"value": 45
},
{
"table": "routing_master",
"field": "prev_process",
"agg": null,
"value": "FOLD"
}
],
"summary": "앞 공정인 접지 실적이 먼저 올라와 있고 재단이 58분 걸려 허용 90분 안에 듭니다.",
"hedge": null
},
{
"verdict_no": "MV-005",
"order_no": "WO-44210",
"item_code": "ITM-LF-105",
"process_code": "PACK",
"process_name": "포장",
"routing_no": "RM-011",
"seq_no": 50,
"report_nos": [
"WR-012"
],
"verdict": "공정대로임",
"actual_minutes": 52,
"standard_minutes": null,
"allowed_minutes": null,
"prev_process": "CUT",
"evidence": [
{
"table": "routing_master",
"field": "standard_minutes",
"agg": null,
"value": null
},
{
"table": "work_reports",
"field": "started_at",
"agg": null,
"value": "2026-09-21T13:00"
},
{
"table": "routing_master",
"field": "prev_process",
"agg": null,
"value": "CUT"
}
],
"summary": "앞 공정인 재단 실적이 올라와 있어 순서는 맞고 포장은 52분 걸렸습니다.",
"hedge": "이 공정은 표준 시간이 비어 있어 시간 검사를 걸지 않았습니다. 그 값을 라우팅에 채우면 판정이 바뀔 수 있습니다."
},
{
"verdict_no": "MV-006",
"order_no": "WO-44188",
"item_code": "ITM-BX-220",
"process_code": "PRESS",
"process_name": "인쇄",
"routing_no": "RM-002",
"seq_no": 20,
"report_nos": [
"WR-013"
],
"verdict": "공정대로임",
"actual_minutes": null,
"standard_minutes": 150,
"allowed_minutes": 300,
"prev_process": "CTP",
"evidence": [
{
"table": "work_reports",
"field": "finished_at",
"agg": null,
"value": null
},
{
"table": "routing_master",
"field": "prev_process",
"agg": null,
"value": "CTP"
},
{
"table": "work_reports",
"field": "started_at",
"agg": null,
"value": "2026-09-21T15:00"
}
],
"summary": "앞 공정인 CTP 출력 실적이 같은 작업지시에 올라와 있어 순서는 맞습니다.",
"hedge": "종료 시각이 비어 있어 시간 검사를 걸지 않았습니다. 단말에서 종료를 안 찍었는지 아직 도는 중인지는 현장에서 확인합니다."
},
{
"verdict_no": "MV-007",
"order_no": "WO-44155",
"item_code": "ITM-BX-220",
"process_code": "CTP",
"process_name": "CTP 출력",
"routing_no": "RM-001",
"seq_no": 10,
"report_nos": [
"WR-002"
],
"verdict": "공정대로임",
"actual_minutes": 38,
"standard_minutes": 40,
"allowed_minutes": 80,
"prev_process": null,
"evidence": [
{
"table": "work_reports",
"field": "started_at",
"agg": null,
"value": "2026-09-21T07:10"
},
{
"table": "work_reports",
"field": "finished_at",
"agg": null,
"value": "2026-09-21T07:48"
},
{
"table": "routing_master",
"field": "standard_minutes",
"agg": null,
"value": 40
}
],
"summary": "라우팅 첫 공정이라 앞에 올 실적이 없고 38분 걸려 허용 80분 안에 듭니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 네 값 중 하나인지 확인합니다. 2. verdict_no·order_no·item_code·process_code·report_nos·verdict·evidence·summary 가 모두 채워졌는지 확인합니다. 3. actual_minutes 가 그 order_no·process_code 실적 행들의 started_at 부터 finished_at 까지 분을 더한 값과 같은지 다시 계산합니다. 자정을 넘긴 야간 실적도 이어 세고, finished_at 이 비어 있는 행이 하나라도 있으면 null 인지 봅니다. 4. allowed_minutes 가 standard_minutes 의 두 배와 같은지 다시 계산합니다. standard_minutes 가 null 이면 allowed_minutes 도 null 인지 봅니다. 5. actual_minutes 가 0 이상 1440 이하, seq_no 가 10 이상 999 이하인지 범위를 봅니다. 6. report_nos 가 그 order_no·process_code 실적 행의 report_no 를 빠짐없이 담았는지 대조합니다. 7. 그 item_code 에 그 process_code 의 routing_master 행이 없으면 verdict 가 라우팅에 없는 공정이고 routing_no·seq_no·standard_minutes·prev_process 가 모두 null 인지 확인합니다. 8. prev_process 가 있는데 그 값과 같은 process_code 실적이 같은 order_no 에 없으면 verdict 가 앞 공정을 건너뜀인지 확인합니다. 있기만 하면 통과이고 두 실적의 시각 앞뒤는 보지 않습니다 — 단말 시계가 설비마다 어긋나 있어 지금 단계에서는 순서를 가르지 않습니다. 9. actual_minutes 가 allowed_minutes 보다 크면 verdict 가 표준 시간을 크게 넘김인지 확인합니다. 10. verdict 가 공정대로임이면 위 세 검사에 하나도 걸리지 않는지 다시 봅니다. 11. 판정 차례는 라우팅에 없는 공정, 앞 공정을 건너뜀, 표준 시간을 크게 넘김 순으로 먼저 걸리는 갈래를 씁니다. 다만 standard_minutes 가 비어 있거나 finished_at 이 비어 있으면 시간 비교를 돌리지 않습니다. WO-44210 의 포장과 WO-44188 의 인쇄가 그런 묶음입니다. 12. routing_no 가 있으면 routing_master 에 실재하는 행 번호이고 그 행의 item_code·process_code 가 실적과 같은지 대조합니다. 13. evidence 의 field 이름이 두 데이터셋에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 15. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 1. 손으로 정답을 단 공정 묶음 80건에 판정을 돌려 사유별 일치율을 냅니다. 2. 공정별·작업자별로 어긋난 횟수를 세어 두 날 이상 되풀이되는 공정을 추립니다. [수동 검증 · 사람이 봅니다] 1. 외주로 돌린 공정인지 단말 입력이 빠진 것인지 현장 반장이 정합니다. 2. 표준 시간이 비어 있던 공정의 값을 고객사에서 받아 라우팅에 채웁니다.
근거: 고객과 가까운 현장에서 업무 프로세스와 문제를 파악하고, 이를 기술적으로 설계·구현하여 실제 운영까지 연결하는