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:
@@ -94,6 +94,16 @@ interface ShipmentApiData {
|
|||||||
created_at?: string;
|
created_at?: string;
|
||||||
updated_at?: string;
|
updated_at?: string;
|
||||||
items?: ShipmentItemApiData[];
|
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;
|
status_label?: string;
|
||||||
priority_label?: string;
|
priority_label?: string;
|
||||||
delivery_method_label?: string;
|
delivery_method_label?: string;
|
||||||
@@ -149,7 +159,7 @@ function transformApiToListItem(data: ShipmentApiData): ShipmentItem {
|
|||||||
canShip: data.can_ship,
|
canShip: data.can_ship,
|
||||||
depositConfirmed: data.deposit_confirmed,
|
depositConfirmed: data.deposit_confirmed,
|
||||||
invoiceIssued: data.invoice_issued,
|
invoiceIssued: data.invoice_issued,
|
||||||
deliveryTime: data.expected_arrival,
|
deliveryTime: data.vehicle_dispatches?.[0]?.arrival_datetime || data.expected_arrival,
|
||||||
// 수신/작성자/출고일 매핑
|
// 수신/작성자/출고일 매핑
|
||||||
receiver: data.receiver || '',
|
receiver: data.receiver || '',
|
||||||
receiverAddress: data.order_info?.delivery_address || data.delivery_address || '',
|
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,
|
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,
|
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,
|
addressDetail: (data as unknown as Record<string, unknown>).address_detail as string | undefined,
|
||||||
// 배차 정보 - 기존 단일 필드에서 구성 (다중 행 API 준비 전까지)
|
// 배차 정보 - vehicle_dispatches 테이블에서 조회, 없으면 레거시 단일 필드 fallback
|
||||||
vehicleDispatches: data.vehicle_no || data.logistics_company || data.driver_contact
|
vehicleDispatches: data.vehicle_dispatches && data.vehicle_dispatches.length > 0
|
||||||
? [{
|
? data.vehicle_dispatches.map((vd) => ({
|
||||||
id: `vd-${data.id}`,
|
id: String(vd.id),
|
||||||
logisticsCompany: data.logistics_company || '-',
|
logisticsCompany: vd.logistics_company || '-',
|
||||||
arrivalDateTime: data.confirmed_arrival || data.expected_arrival || '-',
|
arrivalDateTime: vd.arrival_datetime || '-',
|
||||||
tonnage: data.vehicle_tonnage || '-',
|
tonnage: vd.tonnage || '-',
|
||||||
vehicleNo: data.vehicle_no || '-',
|
vehicleNo: vd.vehicle_no || '-',
|
||||||
driverContact: data.driver_contact || '-',
|
driverContact: vd.driver_contact || '-',
|
||||||
remarks: '',
|
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: [],
|
productGroups: [],
|
||||||
otherParts: [],
|
otherParts: [],
|
||||||
@@ -265,7 +285,7 @@ function transformApiToStatsByStatus(data: ShipmentApiStatsByStatusResponse): Sh
|
|||||||
function transformCreateFormToApi(
|
function transformCreateFormToApi(
|
||||||
data: ShipmentCreateFormData
|
data: ShipmentCreateFormData
|
||||||
): Record<string, unknown> {
|
): Record<string, unknown> {
|
||||||
return {
|
const result: Record<string, unknown> = {
|
||||||
lot_no: data.lotNo,
|
lot_no: data.lotNo,
|
||||||
scheduled_date: data.scheduledDate,
|
scheduled_date: data.scheduledDate,
|
||||||
priority: data.priority,
|
priority: data.priority,
|
||||||
@@ -276,6 +296,20 @@ function transformCreateFormToApi(
|
|||||||
loading_manager: data.loadingManager,
|
loading_manager: data.loadingManager,
|
||||||
remarks: data.remarks,
|
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 변환 (수정용) =====
|
// ===== Frontend → API 변환 (수정용) =====
|
||||||
@@ -287,6 +321,17 @@ function transformEditFormToApi(
|
|||||||
if (data.scheduledDate !== undefined) result.scheduled_date = data.scheduledDate;
|
if (data.scheduledDate !== undefined) result.scheduled_date = data.scheduledDate;
|
||||||
if (data.priority !== undefined) result.priority = data.priority;
|
if (data.priority !== undefined) result.priority = data.priority;
|
||||||
if (data.deliveryMethod !== undefined) result.delivery_method = data.deliveryMethod;
|
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.loadingManager !== undefined) result.loading_manager = data.loadingManager;
|
||||||
if (data.logisticsCompany !== undefined) result.logistics_company = data.logisticsCompany;
|
if (data.logisticsCompany !== undefined) result.logistics_company = data.logisticsCompany;
|
||||||
if (data.vehicleTonnage !== undefined) result.vehicle_tonnage = data.vehicleTonnage;
|
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.driverContact !== undefined) result.driver_contact = data.driverContact;
|
||||||
if (data.expectedArrival !== undefined) result.expected_arrival = data.expectedArrival;
|
if (data.expectedArrival !== undefined) result.expected_arrival = data.expectedArrival;
|
||||||
if (data.confirmedArrival !== undefined) result.confirmed_arrival = data.confirmedArrival;
|
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.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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user