From 69049251466a50fff10ecd2bbf578a0f98e00e0b Mon Sep 17 00:00:00 2001 From: Taehoon Date: Fri, 17 Apr 2026 15:50:21 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=97=91=EC=85=80=20=EB=82=B4=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EA=B8=B0/=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20?= =?UTF-8?q?=EC=8B=9C=20=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EC=9D=98=20=EB=AA=A8=EB=93=A0=20=ED=95=84=EB=93=9C(=EB=B9=84?= =?UTF-8?q?=EA=B3=A0,=20=EC=82=AC=EC=96=91,=20=EC=A1=B0=EC=A7=81=20?= =?UTF-8?q?=EB=93=B1)=20=ED=8F=AC=ED=95=A8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/excelHandler.ts | 89 ++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/src/core/excelHandler.ts b/src/core/excelHandler.ts index 618a77a..a3acb38 100644 --- a/src/core/excelHandler.ts +++ b/src/core/excelHandler.ts @@ -39,6 +39,7 @@ export interface HardwareAsset { 모니터링?: string; 비고?: string; 현사용조직?: string; + 이전사용조직?: string; } @@ -89,10 +90,12 @@ export interface MasterAssetData { const HW_TABS = ['개인PC', '서버', '스토리지', '전산비품']; const SW_TABS = ['구독SW', '영구SW']; -const HW_HEADERS = ['법인', '자산코드', '명칭', '위치', '관리자', 'IP주소', 'MACaddress', 'HW사양', 'OS', '구매일', '금액', '납품업체', '품의서명']; -const PC_HEADERS = ['법인', '자산코드', '사용자', '위치', 'CPU', 'GPU', 'RAM', 'SSD1', 'SSD2', 'HDD1', 'HDD2', '구매일', '금액', '납품업체', '품의서명']; -const SERVER_HEADERS = ['법인', '자산번호', '유형', '용도', '설치위치', '담당자(정)', '담당자(부)', 'IP 주소', '원격접속', '모델명', 'OS', 'CPU', 'RAM', 'GPU', 'Storage1', 'Storage2', 'Storage3', '모니터링', '비고']; -const STORAGE_HEADERS = ['법인', '유형', '자산코드', '명칭', '위치', '모델명', '용량', '담당자(정)', '담당자(부)', 'IP주소', 'MAC주소', '구매일', '금액', '납품업체', '품의서명']; +// 확장된 헤더 (상세 페이지의 모든 필드 포함) +const PC_HEADERS = ['법인', '자산코드', '사용자', '위치', 'CPU', 'GPU', 'RAM', 'SSD1', 'SSD2', 'HDD1', 'HDD2', 'IP주소', 'HW사양', '구매일', '금액', '납품업체', '품의서명', '비고']; +const SERVER_HEADERS = ['법인', '자산번호', '유형', '용도', '상세내용', '현사용조직', '이전사용조직', '설치위치', '담당자(정)', '담당자(부)', 'IP 주소', '원격접속', '서버ID', '서버PW', '모델명', 'OS', 'CPU', 'RAM', 'GPU', 'SSD1', 'SSD2', 'HDD1', '모니터링', '비고']; +const STORAGE_HEADERS = ['법인', '유형', '자산코드', '명칭', '위치', '모델명', '용량', '담당자(정)', '담당자(부)', 'IP주소', 'MAC주소', '구매일', '금액', '납품업체', '품의서명', '비고']; +const HW_HEADERS = ['법인', '자산코드', '명칭', '위치', '관리자', 'IP주소', 'MACaddress', 'HW사양', 'OS', '구매일', '금액', '납품업체', '품의서명', '비고']; + const SUB_SW_HEADERS = ['ID', '분야', '법인', '부서', '제품명', '구매일', '구독일', '금액', '수량', '계정명', '납품업체', '비고']; const PERM_SW_HEADERS = ['ID', '분야', '법인', '부서', '제품명', '구매일', '유지보수여부', '금액', '수량', '계정명', '납품업체', '비고']; const SW_USER_HEADERS = ['id', 'swId', '법인', '부서', '팀', '직위', '이름', '사용기간', '신청서명']; @@ -110,16 +113,24 @@ export function downloadTemplate() { if (tab === '개인PC') { hd = PC_HEADERS; - wscols = [{wch:15}, {wch:25}, {wch:15}, {wch:20}, {wch:20}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:25}]; + wscols = Array(hd.length).fill({wch: 15}); + wscols[1] = {wch: 25}; // 자산코드 + wscols[12] = {wch: 30}; // HW사양 } else if (tab === '서버') { hd = SERVER_HEADERS; - wscols = [{wch:15}, {wch:20}, {wch:15}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:30}]; + wscols = Array(hd.length).fill({wch: 15}); + wscols[3] = {wch: 25}; // 용도 + wscols[4] = {wch: 30}; // 상세내용 } else if (tab === '스토리지') { hd = STORAGE_HEADERS; - wscols = [{wch:15}, {wch:15}, {wch:25}, {wch:25}, {wch:20}, {wch:25}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}]; + wscols = Array(hd.length).fill({wch: 15}); + wscols[2] = {wch: 25}; // 자산코드 + wscols[3] = {wch: 25}; // 명칭 } else { hd = HW_HEADERS; - wscols = [{wch:15}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:40}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}]; + wscols = Array(hd.length).fill({wch: 15}); + wscols[2] = {wch: 25}; // 명칭 + wscols[7] = {wch: 30}; // HW사양 } const ws = XLSX.utils.aoa_to_sheet([hd]); @@ -159,27 +170,44 @@ export function exportToExcel(masterData: MasterAssetData) { if (tab === '개인PC') { wsData = [ PC_HEADERS, - ...targetAssets.map(a => [a.법인, a.자산코드, a.사용자, a.위치, a.CPU, a.GPU, a.RAM, a.SSD1, a.SSD2, a.HDD1, a.HDD2, a.구매일, a.금액, a.납품업체, a.품의서명]) + ...targetAssets.map(a => [ + a.법인, a.자산코드, a.사용자, a.위치, a.CPU, a.GPU, a.RAM, a.SSD1, a.SSD2, a.HDD1, a.HDD2, a.IP주소, a.HW사양, a.구매일, a.금액, a.납품업체, a.품의서명, a.비고 + ]) ]; - colsConfig = [{wch:15}, {wch:25}, {wch:15}, {wch:20}, {wch:20}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:25}]; + colsConfig = Array(PC_HEADERS.length).fill({wch: 15}); + colsConfig[1] = {wch: 25}; + colsConfig[12] = {wch: 30}; } else if (tab === '서버') { wsData = [ SERVER_HEADERS, - ...targetAssets.map(a => [a.법인, a.자산코드, a.storage유형 || '물리', a.용도 || '', a.위치, a.담당자_정 || '', a.담당자_부 || '', a.IP주소, a.원격접속 || '', a.모델명 || '', a.OS, a.CPU, a.RAM, a.GPU || '', a.SSD1 || '', a.SSD2 || '', a.HDD1 || '', a.모니터링 || '', a.비고 || '']) + ...targetAssets.map(a => [ + a.법인, a.자산코드, a.storage유형 || '물리', a.용도 || '', a.상세 || '', a.현사용조직 || '', a.이전사용조직 || '', a.위치, a.담당자_정 || '', a.담당자_부 || '', + a.IP주소, a.원격접속 || '', a.서버ID || '', a.서버PW || '', a.모델명 || '', a.OS, a.CPU, a.RAM, a.GPU || '', a.SSD1 || '', a.SSD2 || '', a.HDD1 || '', a.모니터링 || '', a.비고 || '' + ]) ]; - colsConfig = [{wch:15}, {wch:20}, {wch:15}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:30}]; + colsConfig = Array(SERVER_HEADERS.length).fill({wch: 15}); + colsConfig[3] = {wch: 25}; + colsConfig[4] = {wch: 30}; } else if (tab === '스토리지') { wsData = [ STORAGE_HEADERS, - ...targetAssets.map(a => [a.법인, a.storage유형, a.자산코드, a.명칭, a.위치, a.모델명, a.용량, a.담당자_정, a.담당자_부, a.IP주소, a.MACaddress, a.구매일, a.금액, a.납품업체, a.품의서명]) + ...targetAssets.map(a => [ + a.법인, a.storage유형, a.자산코드, a.명칭, a.위치, a.모델명, a.용량, a.담당자_정, a.담당자_부, a.IP주소, a.MACaddress, a.구매일, a.금액, a.납품업체, a.품의서명, a.비고 + ]) ]; - colsConfig = [{wch:15}, {wch:15}, {wch:25}, {wch:25}, {wch:20}, {wch:25}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}]; + colsConfig = Array(STORAGE_HEADERS.length).fill({wch: 15}); + colsConfig[2] = {wch: 25}; + colsConfig[3] = {wch: 25}; } else { wsData = [ HW_HEADERS, - ...targetAssets.map(a => [a.법인, a.자산코드, a.명칭, a.위치, a.관리자, a.IP주소, a.MACaddress, a.HW사양, a.OS, a.구매일, a.금액, a.납품업체, a.품의서명]) + ...targetAssets.map(a => [ + a.법인, a.자산코드, a.명칭, a.위치, a.관리자, a.IP주소, a.MACaddress, a.HW사양, a.OS, a.구매일, a.금액, a.납품업체, a.품의서명, a.비고 + ]) ]; - colsConfig = [{wch:15}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:40}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}]; + colsConfig = Array(HW_HEADERS.length).fill({wch: 15}); + colsConfig[2] = {wch: 25}; + colsConfig[7] = {wch: 30}; } const ws = XLSX.utils.aoa_to_sheet(wsData); @@ -253,11 +281,16 @@ export async function parseExcel(file: File): Promise { 명칭: '', 위치: row['위치'] || '', 사용자: row['사용자'] || '', - 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '', + 관리자: '', + IP주소: row['IP주소'] || '', + MACaddress: '', + HW사양: row['HW사양'] || '', + OS: row['OS'] || '', CPU: row['CPU'] || '', GPU: row['GPU'] || '', RAM: row['RAM'] || '', SSD1: row['SSD1'] || '', SSD2: row['SSD2'] || '', HDD1: row['HDD1'] || '', HDD2: row['HDD2'] || '', 구매일: row['구매일'] || '', 금액: row['금액'] ? String(row['금액']) : '', 납품업체: row['납품업체'] || '', 품의서명: row['품의서명'] || '', + 비고: row['비고'] || '' }); } else if (sheetName === '서버') { hwAssets.push({ @@ -266,14 +299,24 @@ export async function parseExcel(file: File): Promise { 법인: row['법인'] || '', 자산코드: row['자산번호'] || row['자산코드'] || '', 명칭: row['용도'] || row['명칭'] || '', - 용도: row['용도'] || '', 위치: row['설치위치'] || row['위치'] || '', + 용도: row['용도'] || '', + 상세: row['상세내용'] || row['상세'] || '', + 현사용조직: row['현사용조직'] || '', + 이전사용조직: row['이전사용조직'] || '', + 위치: row['설치위치'] || row['위치'] || '', 관리자: row['담당자(정)'] || '', 담당자_정: row['담당자(정)'] || '', 담당자_부: row['담당자(부)'] || '', - IP주소: row['IP 주소'] || row['IP주소'] || '', IP2: row['IP2'] || '', - 원격접속: row['원격접속'] || '', 서버ID: row['서버ID'] || '', 서버PW: row['서버PW'] || '', + IP주소: row['IP 주소'] || row['IP주소'] || '', + 원격접속: row['원격접속'] || '', + 서버ID: row['서버ID'] || '', + 서버PW: row['서버PW'] || '', 모델명: row['모델명'] || '', OS: row['OS'] || '', CPU: row['CPU'] || '', RAM: row['RAM'] || '', GPU: row['GPU'] || '', - SSD1: row['Storage1'] || row['SSD1'] || '', SSD2: row['Storage2'] || row['SSD2'] || '', HDD1: row['Storage3'] || row['HDD1'] || '', - 모니터링: row['모니터링'] || '', 비고: row['비고'] || '', storage유형: row['유형'] || '물리', + SSD1: row['SSD1'] || row['Storage1'] || '', + SSD2: row['SSD2'] || row['Storage2'] || '', + HDD1: row['HDD1'] || row['Storage3'] || '', + 모니터링: row['모니터링'] || '', + 비고: row['비고'] || '', + storage유형: row['유형'] || '물리', MACaddress: '', HW사양: '', 구매일: '', 금액: '', 납품업체: '', 품의서명: '', }); } else if (sheetName === '스토리지') { @@ -286,6 +329,7 @@ export async function parseExcel(file: File): Promise { 담당자_정: row['담당자(정)'] || '', 담당자_부: row['담당자(부)'] || '', 구매일: row['구매일'] || '', 금액: row['금액'] ? String(row['금액']) : '', 납품업체: row['납품업체'] || '', 품의서명: row['품의서명'] || '', + 비고: row['비고'] || '' }); } else { hwAssets.push({ @@ -296,6 +340,7 @@ export async function parseExcel(file: File): Promise { HW사양: row['HW사양'] || '', OS: row['OS'] || '', 구매일: row['구매일'] || '', 금액: row['금액'] ? String(row['금액']) : '', 납품업체: row['납품업체'] || '', 품의서명: row['품의서명'] || '', + 비고: row['비고'] || '' }); } });