/** * POS 파일 온디맨드 다운로드 서버 액션 * * 클라이언트 컴포넌트에서 자재코드로 POS 파일을 다운로드할 수 있는 함수들을 제공합니다. */ 'use server'; import { getDcmtmIdByMaterialCode } from './get-dcmtm-id'; export interface DownloadPosOnDemandResult { success: boolean; downloadUrl?: string; fileName?: string; availableFiles?: Array<{ fileName: string; dcmtmId: string; projNo: string; posNo: string; posRevNo: string; fileSer: string; }>; error?: string; } /** * 자재코드로 POS 파일 다운로드 URL을 생성합니다. * * @param materialCode - 자재코드 (MATNR) * @param fileIndex - 여러 파일이 있을 경우 선택할 파일 인덱스 (기본값: 0) * @returns 다운로드 URL과 파일 정보 * * @example * ```typescript * const result = await getDownloadUrlByMaterialCode('SN2693A6410100001'); * if (result.success && result.downloadUrl) { * window.open(result.downloadUrl, '_blank'); * } * ``` */ export async function getDownloadUrlByMaterialCode( materialCode: string, fileIndex: number = 0 ): Promise { try { if (!materialCode || materialCode.trim() === '') { return { success: false, error: '자재코드가 제공되지 않았습니다.', }; } // 1. 자재코드로 DCMTM_ID 및 파일 정보 조회 const dcmtmResult = await getDcmtmIdByMaterialCode({ materialCode }); if (!dcmtmResult.success || !dcmtmResult.files || dcmtmResult.files.length === 0) { return { success: false, error: dcmtmResult.error || '해당 자재코드에 대한 POS 파일을 찾을 수 없습니다.', }; } // 파일 인덱스 범위 검증 if (fileIndex >= dcmtmResult.files.length) { return { success: false, error: `파일 인덱스가 범위를 벗어났습니다. 사용 가능한 파일 수: ${dcmtmResult.files.length}`, availableFiles: dcmtmResult.files.map(file => ({ fileName: file.fileName, dcmtmId: file.dcmtmId, projNo: file.projNo, posNo: file.posNo, posRevNo: file.posRevNo, fileSer: file.fileSer, })), }; } const selectedFile = dcmtmResult.files[fileIndex]; // 2. 다운로드 URL 생성 const downloadUrl = `/api/pos/download-on-demand?materialCode=${encodeURIComponent(materialCode)}&fileIndex=${fileIndex}`; return { success: true, downloadUrl, fileName: selectedFile.fileName, availableFiles: dcmtmResult.files.map(file => ({ fileName: file.fileName, dcmtmId: file.dcmtmId, projNo: file.projNo, posNo: file.posNo, posRevNo: file.posRevNo, fileSer: file.fileSer, })), }; } catch (error) { return { success: false, error: error instanceof Error ? error.message : '알 수 없는 오류가 발생했습니다.', }; } } /** * 여러 자재코드에 대한 POS 파일 다운로드 URL을 일괄 조회합니다. * * @param materialCodes - 자재코드 배열 * @returns 각 자재코드별 다운로드 정보 * * @example * ```typescript * const results = await getDownloadUrlsForMaterialCodes([ * 'SN2693A6410100001', * 'SN2693A6410100002' * ]); * * results.forEach(result => { * if (result.success) { * console.log(`${result.materialCode}: ${result.downloadUrl}`); * } * }); * ``` */ export async function getDownloadUrlsForMaterialCodes( materialCodes: string[] ): Promise> { const results = await Promise.all( materialCodes.map(async (materialCode) => { const result = await getDownloadUrlByMaterialCode(materialCode); return { materialCode, ...result, }; }) ); return results; } /** * 자재코드의 POS 파일 존재 여부를 확인합니다. * * @param materialCode - 자재코드 (MATNR) * @returns 파일 존재 여부와 파일 수 */ export async function checkPosFileExists( materialCode: string ): Promise<{ exists: boolean; fileCount: number; files?: Array<{ fileName: string; dcmtmId: string; projNo: string; posNo: string; posRevNo: string; fileSer: string; }>; error?: string; }> { try { const dcmtmResult = await getDcmtmIdByMaterialCode({ materialCode }); if (!dcmtmResult.success || !dcmtmResult.files) { return { exists: false, fileCount: 0, error: dcmtmResult.error, }; } return { exists: dcmtmResult.files.length > 0, fileCount: dcmtmResult.files.length, files: dcmtmResult.files.map(file => ({ fileName: file.fileName, dcmtmId: file.dcmtmId, projNo: file.projNo, posNo: file.posNo, posRevNo: file.posRevNo, fileSer: file.fileSer, })), }; } catch (error) { return { exists: false, fileCount: 0, error: error instanceof Error ? error.message : '알 수 없는 오류', }; } }