'use client'; /** * 배차차량 상세 페이지 * 3개 섹션: 기본정보, 배차정보, 배송비정보 */ import { useState, useCallback, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { IntegratedDetailTemplate } from '@/components/templates/IntegratedDetailTemplate'; import { vehicleDispatchConfig } from './vehicleDispatchConfig'; import { getVehicleDispatchById } from './actions'; import { VEHICLE_DISPATCH_STATUS_LABELS, VEHICLE_DISPATCH_STATUS_STYLES, FREIGHT_COST_LABELS, FREIGHT_COST_STYLES, } from './types'; import type { VehicleDispatchDetail as VehicleDispatchDetailType } from './types'; import { formatNumber as formatAmount } from '@/lib/utils/amount'; interface VehicleDispatchDetailProps { id: string; } export function VehicleDispatchDetail({ id }: VehicleDispatchDetailProps) { const router = useRouter(); // API 데이터 상태 const [detail, setDetail] = useState(null); const [isLoading, setIsLoading] = useState(true); const [_error, setError] = useState(null); // API 데이터 로드 const loadData = useCallback(async () => { setIsLoading(true); setError(null); try { const result = await getVehicleDispatchById(id); if (result.success && result.data) { setDetail(result.data); } else { setError(result.error || '배차차량 정보를 찾을 수 없습니다.'); } } catch (err) { console.error('[VehicleDispatchDetail] loadData error:', err); setError('데이터를 불러오는 중 오류가 발생했습니다.'); } finally { setIsLoading(false); } }, [id]); useEffect(() => { loadData(); }, [loadData]); const handleEdit = useCallback(() => { router.push(`/ko/outbound/vehicle-dispatches/${id}?mode=edit`); }, [id, router]); // 정보 필드 렌더링 헬퍼 const renderInfoField = (label: string, value: React.ReactNode, className?: string) => (
{label}
{value || '-'}
); // 컨텐츠 렌더링 const renderViewContent = useCallback((_data: Record) => { if (!detail) return null; return (
{/* 카드 1: 기본 정보 */} 기본 정보
{renderInfoField('배차번호', detail.dispatchNo)} {renderInfoField('로트번호', detail.lotNo || detail.shipmentNo)} {renderInfoField('현장명', detail.siteName)} {renderInfoField('수주처', detail.orderCustomer)} {renderInfoField( '운임비용', {FREIGHT_COST_LABELS[detail.freightCostType]} )} {renderInfoField( '상태', {VEHICLE_DISPATCH_STATUS_LABELS[detail.status]} )} {renderInfoField('작성자', detail.writer)}
{/* 카드 2: 배차 정보 */} 배차 정보
{renderInfoField('물류업체', detail.logisticsCompany)} {renderInfoField('입차일시', detail.arrivalDateTime)} {renderInfoField('구분', detail.tonnage)} {renderInfoField('차량번호', detail.vehicleNo)} {renderInfoField('기사연락처', detail.driverContact)} {renderInfoField('비고', detail.remarks)}
{/* 카드 3: 배송비 정보 */} 배송비 정보
{renderInfoField('공급가액', `${formatAmount(detail.supplyAmount)}원`)} {renderInfoField('부가세', `${formatAmount(detail.vat)}원`)} {renderInfoField( '합계', {formatAmount(detail.totalAmount)}원 )}
); }, [detail]); return ( | undefined} itemId={id} isLoading={isLoading} onEdit={handleEdit} renderView={renderViewContent} /> ); }