"use client"; import React from "react"; /* ------------------------------------------------------------------ */ /* Types */ /* ------------------------------------------------------------------ */ export interface ProcessStep { no: number; name: string; code: string; status: "completed" | "in_progress" | "waiting" | "acceptable"; inputQty: number; goodQty: number; defectQty: number; planQty: number; availableQty: number; } interface ProcessDetailModalProps { open: boolean; onClose: () => void; workInstructionNo: string; totalQty: number; steps: ProcessStep[]; } /* ------------------------------------------------------------------ */ /* Component */ /* ------------------------------------------------------------------ */ export function ProcessDetailModal({ open, onClose, workInstructionNo, totalQty, steps, }: ProcessDetailModalProps) { if (!open) return null; const completedCount = steps.filter((s) => s.status === "completed").length; const overallPct = steps.length > 0 ? Math.round((completedCount / steps.length) * 100) : 0; return (
{/* Header */}

공정 순서 상세

{workInstructionNo}

{/* Summary bar */}
작업지시 총량 {totalQty.toLocaleString()} EA
{completedCount}/{steps.length} 공정
{/* Steps */}
{steps.map((s) => { const borderColor = s.status === "completed" ? "border-green-400 bg-green-50" : s.status === "in_progress" ? "border-blue-400 bg-blue-50" : s.status === "acceptable" ? "border-amber-400 bg-amber-50" : "border-gray-200 bg-gray-50"; const dotColor = s.status === "completed" ? "bg-green-500" : s.status === "in_progress" ? "bg-blue-500" : s.status === "acceptable" ? "bg-amber-500" : "bg-gray-400"; const badge = s.status === "completed" ? ( 완료 ) : s.status === "in_progress" ? ( 진행중 ) : s.status === "acceptable" ? ( 접수가능 ) : ( 대기 ); const barColor = s.status === "completed" ? "bg-green-500" : s.status === "in_progress" ? "bg-blue-500" : s.status === "acceptable" ? "bg-amber-500" : "bg-gray-300"; const barTextColor = s.status === "completed" ? "text-green-600" : s.status === "in_progress" ? "text-blue-600" : s.status === "acceptable" ? "text-amber-600" : "text-gray-400"; const pct = s.planQty > 0 ? Math.round((s.inputQty / s.planQty) * 100) : 0; const unaccept = s.planQty - s.inputQty; return (
{/* Header */}
{s.no}
{s.name} {badge}
{s.code}
{/* Progress bar */}
{pct}%
{/* Qty grid */}
지시
{s.planQty.toLocaleString()}
접수
{s.inputQty.toLocaleString()}
양품
{s.goodQty.toLocaleString()}
{s.status === "completed" || s.status === "in_progress" ? (
불량
{s.defectQty.toLocaleString()}
) : (
미접수
{Math.max(0, unaccept).toLocaleString()}
)}
{/* Additional accept qty */} {s.status === "in_progress" && s.availableQty > 0 && (
추가접수가능 {s.availableQty.toLocaleString()}
)} {s.status === "acceptable" && s.availableQty > 0 && (
접수가능 {s.availableQty.toLocaleString()}
)}
); })}
{/* Footer */}
); }