feat: [shipment] 배차정보 다중 행 API 연동 — actions.ts transform 함수 수정

- ShipmentApiData에 vehicle_dispatches 타입 추가
- transformApiToDetail: vehicle_dispatches 배열 매핑 (레거시 단일필드 fallback 유지)
- transformCreateFormToApi/transformEditFormToApi: vehicleDispatches → vehicle_dispatches 변환 추가
- transformApiToListItem: 첫 번째 배차의 arrival_datetime 반영
This commit is contained in:
2026-03-04 10:35:43 +09:00
parent bedfd1f559
commit 83a23701a7

View File

@@ -94,6 +94,16 @@ interface ShipmentApiData {
created_at?: string;
updated_at?: string;
items?: ShipmentItemApiData[];
vehicle_dispatches?: Array<{
id: number;
seq: number;
logistics_company?: string;
arrival_datetime?: string;
tonnage?: string;
vehicle_no?: string;
driver_contact?: string;
remarks?: string;
}>;
status_label?: string;
priority_label?: string;
delivery_method_label?: string;
@@ -149,7 +159,7 @@ function transformApiToListItem(data: ShipmentApiData): ShipmentItem {
canShip: data.can_ship,
depositConfirmed: data.deposit_confirmed,
invoiceIssued: data.invoice_issued,
deliveryTime: data.expected_arrival,
deliveryTime: data.vehicle_dispatches?.[0]?.arrival_datetime || data.expected_arrival,
// 수신/작성자/출고일 매핑
receiver: data.receiver || '',
receiverAddress: data.order_info?.delivery_address || data.delivery_address || '',
@@ -202,18 +212,28 @@ function transformApiToDetail(data: ShipmentApiData): ShipmentDetail {
zipCode: (data as unknown as Record<string, unknown>).zip_code as string | undefined,
address: (data as unknown as Record<string, unknown>).address as string | undefined,
addressDetail: (data as unknown as Record<string, unknown>).address_detail as string | undefined,
// 배차 정보 - 기존 단일 필드에서 구성 (다중 행 API 준비 전까지)
vehicleDispatches: data.vehicle_no || data.logistics_company || data.driver_contact
? [{
id: `vd-${data.id}`,
logisticsCompany: data.logistics_company || '-',
arrivalDateTime: data.confirmed_arrival || data.expected_arrival || '-',
tonnage: data.vehicle_tonnage || '-',
vehicleNo: data.vehicle_no || '-',
driverContact: data.driver_contact || '-',
remarks: '',
}]
: [],
// 배차 정보 - vehicle_dispatches 테이블에서 조회, 없으면 레거시 단일 필드 fallback
vehicleDispatches: data.vehicle_dispatches && data.vehicle_dispatches.length > 0
? data.vehicle_dispatches.map((vd) => ({
id: String(vd.id),
logisticsCompany: vd.logistics_company || '-',
arrivalDateTime: vd.arrival_datetime || '-',
tonnage: vd.tonnage || '-',
vehicleNo: vd.vehicle_no || '-',
driverContact: vd.driver_contact || '-',
remarks: vd.remarks || '',
}))
: (data.vehicle_no || data.logistics_company || data.driver_contact
? [{
id: `vd-legacy-${data.id}`,
logisticsCompany: data.logistics_company || '-',
arrivalDateTime: data.confirmed_arrival || data.expected_arrival || '-',
tonnage: data.vehicle_tonnage || '-',
vehicleNo: data.vehicle_no || '-',
driverContact: data.driver_contact || '-',
remarks: '',
}]
: []),
// 제품내용 (그룹핑) - 프론트엔드에서 그룹핑 처리
productGroups: [],
otherParts: [],
@@ -265,7 +285,7 @@ function transformApiToStatsByStatus(data: ShipmentApiStatsByStatusResponse): Sh
function transformCreateFormToApi(
data: ShipmentCreateFormData
): Record<string, unknown> {
return {
const result: Record<string, unknown> = {
lot_no: data.lotNo,
scheduled_date: data.scheduledDate,
priority: data.priority,
@@ -276,6 +296,20 @@ function transformCreateFormToApi(
loading_manager: data.loadingManager,
remarks: data.remarks,
};
if (data.vehicleDispatches && data.vehicleDispatches.length > 0) {
result.vehicle_dispatches = data.vehicleDispatches.map((vd, idx) => ({
seq: idx + 1,
logistics_company: vd.logisticsCompany || null,
arrival_datetime: vd.arrivalDateTime || null,
tonnage: vd.tonnage || null,
vehicle_no: vd.vehicleNo || null,
driver_contact: vd.driverContact || null,
remarks: vd.remarks || null,
}));
}
return result;
}
// ===== Frontend → API 변환 (수정용) =====
@@ -287,6 +321,17 @@ function transformEditFormToApi(
if (data.scheduledDate !== undefined) result.scheduled_date = data.scheduledDate;
if (data.priority !== undefined) result.priority = data.priority;
if (data.deliveryMethod !== undefined) result.delivery_method = data.deliveryMethod;
if (data.receiver !== undefined) result.receiver = data.receiver;
if (data.receiverContact !== undefined) result.receiver_contact = data.receiverContact;
// 주소: zipCode + address + addressDetail → delivery_address로 결합
if (data.address !== undefined || data.zipCode !== undefined || data.addressDetail !== undefined) {
const parts = [
data.zipCode ? `[${data.zipCode}]` : '',
data.address || '',
data.addressDetail || '',
].filter(Boolean);
result.delivery_address = parts.join(' ');
}
if (data.loadingManager !== undefined) result.loading_manager = data.loadingManager;
if (data.logisticsCompany !== undefined) result.logistics_company = data.logisticsCompany;
if (data.vehicleTonnage !== undefined) result.vehicle_tonnage = data.vehicleTonnage;
@@ -296,8 +341,21 @@ function transformEditFormToApi(
if (data.driverContact !== undefined) result.driver_contact = data.driverContact;
if (data.expectedArrival !== undefined) result.expected_arrival = data.expectedArrival;
if (data.confirmedArrival !== undefined) result.confirmed_arrival = data.confirmedArrival;
if (data.changeReason !== undefined) result.change_reason = data.changeReason;
if (data.remarks !== undefined) result.remarks = data.remarks;
if (data.vehicleDispatches) {
result.vehicle_dispatches = data.vehicleDispatches.map((vd, idx) => ({
seq: idx + 1,
logistics_company: vd.logisticsCompany || null,
arrival_datetime: vd.arrivalDateTime || null,
tonnage: vd.tonnage || null,
vehicle_no: vd.vehicleNo || null,
driver_contact: vd.driverContact || null,
remarks: vd.remarks || null,
}));
}
return result;
}