diff options
| author | joonhoekim <26rote@gmail.com> | 2025-10-30 10:35:26 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-10-30 10:35:26 +0900 |
| commit | 284f9f40d9494168f3e68eedd9af067c38362eea (patch) | |
| tree | ac26b3e9fab46b996c16bfa7a7add8f26ddb5042 /lib/pos/download-on-demand-action.ts | |
| parent | 88f13ab89d2250e52c3375b077328a933a5762ec (diff) | |
(김준회) refactor: POS: 온디맨드로 다운로드받도록 변경, 매핑로직에선 pos 관련 로직 제거
Diffstat (limited to 'lib/pos/download-on-demand-action.ts')
| -rw-r--r-- | lib/pos/download-on-demand-action.ts | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/lib/pos/download-on-demand-action.ts b/lib/pos/download-on-demand-action.ts new file mode 100644 index 00000000..568bae22 --- /dev/null +++ b/lib/pos/download-on-demand-action.ts @@ -0,0 +1,193 @@ +/** + * 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<DownloadPosOnDemandResult> { + 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<Array<DownloadPosOnDemandResult & { materialCode: string }>> { + 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 : '알 수 없는 오류', + }; + } +} + |
