(null);
const [isLoading, setIsLoading] = useState(true);
const [isStatusUpdating, setIsStatusUpdating] = useState(false);
+ const [updatingItemId, setUpdatingItemId] = useState(null);
// API에서 데이터 로드
const loadData = useCallback(async () => {
@@ -242,6 +257,49 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) {
}
}, [order, orderId]);
+ // 품목 상태 변경 핸들러
+ const handleItemStatusChange = useCallback(async (itemId: number, newStatus: WorkOrderItemStatus) => {
+ if (!order) return;
+
+ setUpdatingItemId(itemId);
+ try {
+ const result = await updateWorkOrderItemStatus(orderId, itemId, newStatus);
+ if (result.success) {
+ // 로컬 상태 업데이트 (품목 + 작업지시 상태)
+ setOrder(prev => {
+ if (!prev) return prev;
+ return {
+ ...prev,
+ status: result.workOrderStatus || prev.status,
+ items: prev.items.map(item =>
+ item.id === itemId ? { ...item, status: newStatus } : item
+ ),
+ };
+ });
+
+ const statusLabels: Record = {
+ waiting: '대기',
+ in_progress: '작업중',
+ completed: '완료',
+ };
+ toast.success(`품목 상태가 '${statusLabels[newStatus]}'(으)로 변경되었습니다.`);
+
+ // 작업지시 상태가 변경된 경우 추가 알림
+ if (result.workOrderStatusChanged && result.workOrderStatus) {
+ const workOrderStatusLabel = WORK_ORDER_STATUS_LABELS[result.workOrderStatus as keyof typeof WORK_ORDER_STATUS_LABELS] || result.workOrderStatus;
+ toast.info(`작업지시 상태가 '${workOrderStatusLabel}'(으)로 자동 변경되었습니다.`);
+ }
+ } else {
+ toast.error(result.error || '품목 상태 변경에 실패했습니다.');
+ }
+ } catch (error) {
+ console.error('[WorkOrderDetail] handleItemStatusChange error:', error);
+ toast.error('품목 상태 변경 중 오류가 발생했습니다.');
+ } finally {
+ setUpdatingItemId(null);
+ }
+ }, [order, orderId]);
+
// 로딩 상태
if (isLoading) {
return (
@@ -377,7 +435,11 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) {
{/* 공정 진행 */}
-
+
{/* 작업 품목 */}
@@ -408,14 +470,32 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) {
{item.quantity}
{item.status === 'waiting' && (
-