From 122ba638a6f0526291991608820dd5fbcd73e3dc Mon Sep 17 00:00:00 2001 From: leeheejin Date: Mon, 29 Dec 2025 11:06:39 +0900 Subject: [PATCH] =?UTF-8?q?=EC=97=91=EC=85=80=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pms/mapper/quality.xml | 178 +++++++--------- .../view/quality/processInspectionList.jsp | 126 ++++++++++++ .../quality/semiProductInspectionList.jsp | 193 ++++++++---------- src/com/pms/controller/QualityController.java | 14 +- src/com/pms/mapper/quality.xml | 178 +++++++--------- 5 files changed, 370 insertions(+), 319 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml index d1f2eaa..6f35fbf 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml @@ -1358,30 +1358,32 @@ DELETE FROM PROCESS_INSPECTION_DETAIL WHERE MASTER_OBJID = #{MASTER_OBJID} - + - + diff --git a/WebContent/WEB-INF/view/quality/processInspectionList.jsp b/WebContent/WEB-INF/view/quality/processInspectionList.jsp index b4df8e9..758201f 100644 --- a/WebContent/WEB-INF/view/quality/processInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/processInspectionList.jsp @@ -83,6 +83,11 @@ $(document).ready(function(){ fn_registPopUp(); }); + // 엑셀 다운로드 + $("#btnExcel").click(function(){ + fn_excelDownload(); + }); + fn_search(); }); @@ -169,6 +174,126 @@ function fn_openAttachFilePopUp(objId) { fn_watchPopupClose(popup, objId, 'ATTACH_FILE_CNT', 'PROCESS_INSPECTION_FILE'); } +// 엑셀 다운로드 (전체 데이터 풀어서 - ExcelJS) +function fn_excelDownload(){ + var params = { + search_project_no: $("#search_project_no").val() || "", + productType: $("#productType").val() || "", + search_part_no: $("#search_part_no").val() || "", + search_part_name: $("#search_part_name").val() || "", + search_inspection_date_from: $("#search_inspection_date_from").val() || "", + search_inspection_date_to: $("#search_inspection_date_to").val() || "", + search_inspector: $("#search_inspector").val() || "", + search_inspection_result: $("#search_inspection_result").val() || "" + }; + + $.ajax({ + url: "/quality/getProcessInspectionListForExcel.do", + type: "POST", + data: params, + dataType: "json", + success: function(result){ + console.log("엑셀 데이터:", result); + if(result && result.list && result.list.length > 0){ + fn_createExcelFile(result.list); + } else { + Swal.fire("다운로드할 데이터가 없습니다."); + } + }, + error: function(xhr, status, error){ + console.error("엑셀 데이터 조회 실패:", error); + console.error("상태:", status); + console.error("응답:", xhr.responseText); + Swal.fire("엑셀 데이터 조회 중 오류가 발생했습니다."); + } + }); +} + +// ExcelJS로 엑셀 파일 생성 (전체 풀어서) +async function fn_createExcelFile(data){ + try { + var pageTitle = "공정검사관리"; + const workbook = new ExcelJS.Workbook(); + const worksheet = workbook.addWorksheet(pageTitle); + + // 헤더 설정 (모든 컬럼 포함: 제품구분, 공정명, 부서, 작업자, 디테일비고, 조치현황) + var headers = ["No", "검사일", "검사자", "제품구분", "공정명", "프로젝트번호", "품번", "품명", + "검사수량", "불량수량", "불량율(%)", "작업환경상태", "측정기", "부서", "작업자", "디테일비고", "조치현황", "검사결과"]; + + // 열 너비 설정 + var colWidths = [6, 12, 12, 15, 12, 18, 18, 22, 12, 12, 10, 14, 10, 12, 12, 15, 12, 10]; + colWidths.forEach(function(width, idx){ + worksheet.getColumn(idx + 1).width = width; + }); + + // 헤더 행 추가 + var headerRow = worksheet.addRow(headers); + + // 헤더 스타일 (노란색 배경) + headerRow.eachCell(function(cell){ + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FFFFFF00' } // 노란색 + }; + cell.font = { bold: true }; + cell.alignment = { vertical: 'middle', horizontal: 'center' }; + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + }); + + // 데이터 추가 (모든 컬럼 포함) + data.forEach(function(item, index){ + var row = worksheet.addRow([ + index + 1, + item.inspection_date || item.INSPECTION_DATE || "", + item.inspector_name || item.INSPECTOR_NAME || "", + item.product_type || item.PRODUCT_TYPE || "", + item.process_name || item.PROCESS_NAME || "", + item.project_no || item.PROJECT_NO || "", + item.part_no || item.PART_NO || "", + item.part_name || item.PART_NAME || "", + item.inspection_qty || item.INSPECTION_QTY || 0, + item.defect_qty || item.DEFECT_QTY || 0, + item.defect_rate || item.DEFECT_RATE || 0, + item.work_env_status || item.WORK_ENV_STATUS || "", + item.measuring_device || item.MEASURING_DEVICE || "", + item.dept_name || item.DEPT_NAME || "", + item.user_name || item.USER_NAME || "", + item.detail_remark || item.DETAIL_REMARK || "", + item.action_status || item.ACTION_STATUS || "", + item.inspection_result || item.INSPECTION_RESULT || "" + ]); + + // 데이터 행 스타일 + row.eachCell(function(cell){ + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + }); + }); + + // 파일명 생성 + var today = new Date(); + var dateStr = today.getFullYear() + ("0" + (today.getMonth()+1)).slice(-2) + ("0" + today.getDate()).slice(-2); + var fileName = pageTitle + "_" + dateStr + ".xlsx"; + + // 다운로드 + const buffer = await workbook.xlsx.writeBuffer(); + saveAs(new Blob([buffer]), fileName); + } catch(e) { + console.error("엑셀 생성 오류:", e); + Swal.fire("엑셀 파일 생성 중 오류가 발생했습니다."); + } +} + @@ -187,6 +312,7 @@ function fn_openAttachFilePopUp(objId) {
+
diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp index 28171ce..6cda045 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp @@ -84,9 +84,8 @@ $(document).ready(function(){ fn_search(); }); -// 엑셀 다운로드 (원본 데이터 - 외 N건 풀어서) +// 엑셀 다운로드 (전체 데이터 풀어서 - ExcelJS) function fn_excelDownload(){ - // 서버에서 원본 데이터 가져오기 var params = { search_model_name: $("#search_model_name").val() || "", search_work_order_no: $("#search_work_order_no").val() || "", @@ -102,132 +101,110 @@ function fn_excelDownload(){ data: params, dataType: "json", success: function(result){ + console.log("엑셀 데이터:", result); if(result && result.list && result.list.length > 0){ - createExcelFile(result.list); + fn_createExcelFile(result.list); } else { Swal.fire("다운로드할 데이터가 없습니다."); } }, error: function(xhr, status, error){ console.error("엑셀 데이터 조회 실패:", error); + console.error("상태:", status); + console.error("응답:", xhr.responseText); Swal.fire("엑셀 데이터 조회 중 오류가 발생했습니다."); } }); } -// ExcelJS로 원본 데이터 엑셀 파일 생성 (공통 스타일 적용) -async function createExcelFile(data){ - var pageTitle = "반제품검사관리"; - const workbook = new ExcelJS.Workbook(); - const worksheet = workbook.addWorksheet(pageTitle); - - // 헤더 설정 (컬럼 순서 변경: 검사일, 검사자를 앞으로) - var headers = ["No", "검사일", "검사자", "품명(모델명)", "작업지시번호", "부품품번", "부품명", - "입고수량 합계", "양품수량 합계", "불량수량 합계", "불량율(%)", "재생수량 합계", "최종양품수량 합계", - "불량유형", "불량원인", "귀책부서", "처리현황", "처리결과", "비고"]; - - // 열 너비 설정 - var colWidths = [6, 12, 12, 25, 18, 20, 25, 15, 15, 15, 12, 15, 18, 15, 15, 12, 12, 12, 20]; - colWidths.forEach(function(width, idx){ - worksheet.getColumn(idx + 1).width = width; - }); - - // 제목 행 추가 - worksheet.mergeCells('A1:S1'); - var titleCell = worksheet.getCell('A1'); - titleCell.value = pageTitle; - titleCell.font = { size: 16, bold: true }; - titleCell.alignment = { vertical: 'middle', horizontal: 'center' }; - worksheet.getRow(1).height = 30; - - // 빈 행 추가 - worksheet.addRow([]); - - // 헤더 행 추가 (3행) - var headerRow = worksheet.addRow(headers); - - // 헤더 스타일 (공통 스타일: 파란색 배경, 흰색 글자) - headerRow.eachCell(function(cell){ - cell.fill = { - type: 'pattern', - pattern: 'solid', - fgColor: { argb: 'FF4472C4' } // 파란색 - }; - cell.font = { - color: { argb: 'FFFFFFFF' }, // 흰색 글자 - bold: true - }; - cell.alignment = { - vertical: 'middle', - horizontal: 'center', - wrapText: true - }; - cell.border = { - top: { style: 'thin' }, - left: { style: 'thin' }, - bottom: { style: 'thin' }, - right: { style: 'thin' } - }; - }); - headerRow.height = 25; - - // 데이터 추가 (컬럼 순서 변경: 검사일, 검사자를 앞으로) - data.forEach(function(item, index){ - var row = worksheet.addRow([ - index + 1, - item.inspection_date || item.INSPECTION_DATE || "", - item.writer_name || item.WRITER_NAME || "", - item.model_name || item.MODEL_NAME || "", - item.work_order_no || item.WORK_ORDER_NO || "", - item.part_no || item.PART_NO || "", - item.part_name || item.PART_NAME || "", - item.receipt_qty || item.RECEIPT_QTY || 0, - item.good_qty || item.GOOD_QTY || 0, - item.defect_qty || item.DEFECT_QTY || 0, - item.defect_rate || item.DEFECT_RATE || 0, - item.regeneration_qty || item.REGENERATION_QTY || 0, - item.final_good_qty || item.FINAL_GOOD_QTY || 0, - item.defect_type || item.DEFECT_TYPE || "", - item.defect_cause || item.DEFECT_CAUSE || "", - item.responsible_dept || item.RESPONSIBLE_DEPT || "", - item.process_status || item.PROCESS_STATUS || "", - item.disposition_type || item.DISPOSITION_TYPE || "", - item.remark || item.REMARK || "" - ]); +// ExcelJS로 엑셀 파일 생성 (전체 풀어서) +async function fn_createExcelFile(data){ + try { + var pageTitle = "반제품검사관리"; + const workbook = new ExcelJS.Workbook(); + const worksheet = workbook.addWorksheet(pageTitle); - // 데이터 행 스타일 (테두리) - row.eachCell(function(cell, colNumber){ + // 헤더 설정 (DATA_TYPE, PRODUCT_TYPE, INSPECTION_GROUP_ID 추가) + var headers = ["No", "검사일", "검사자", "품명(모델명)", "제품구분", "작업지시번호", "부품품번", "부품명", + "입고수량", "양품수량", "불량수량", "불량율(%)", "재생수량", "최종양품수량", + "불량유형", "불량원인", "귀책부서", "처리현황", "처리결과", "비고", "데이터타입", "검사그룹ID"]; + + // 열 너비 설정 + var colWidths = [6, 12, 12, 20, 12, 15, 18, 20, 12, 12, 12, 10, 12, 14, 12, 12, 10, 10, 10, 15, 10, 15]; + colWidths.forEach(function(width, idx){ + worksheet.getColumn(idx + 1).width = width; + }); + + // 헤더 행 추가 + var headerRow = worksheet.addRow(headers); + + // 헤더 스타일 (노란색 배경) + headerRow.eachCell(function(cell){ + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FFFFFF00' } // 노란색 + }; + cell.font = { bold: true }; + cell.alignment = { vertical: 'middle', horizontal: 'center' }; cell.border = { top: { style: 'thin' }, left: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } }; - // 숫자 컬럼 오른쪽 정렬 (8~13번 컬럼: 수량, 불량율) - if(colNumber >= 8 && colNumber <= 13){ - cell.alignment = { horizontal: 'right' }; - // 숫자에 천단위 구분자 (불량율 제외) - if(colNumber !== 11 && typeof cell.value === 'number'){ - cell.numFmt = '#,##0'; - } - } else if(colNumber === 1 || colNumber === 2 || colNumber === 3){ - cell.alignment = { horizontal: 'center' }; - } }); - }); - - // 파일명 생성 - var date = new Date(); - var currentDate = date.getFullYear() + - ("0" + (date.getMonth() + 1)).slice(-2) + - ("0" + date.getDate()).slice(-2) + "_" + - ("0" + date.getHours()).slice(-2) + - ("0" + date.getMinutes()).slice(-2); - var fileName = pageTitle + "_" + currentDate + ".xlsx"; - - // 다운로드 - const buffer = await workbook.xlsx.writeBuffer(); - saveAs(new Blob([buffer]), fileName); + + // 데이터 추가 (DATA_TYPE, PRODUCT_TYPE, INSPECTION_GROUP_ID 추가) + data.forEach(function(item, index){ + var row = worksheet.addRow([ + index + 1, + item.inspection_date || item.INSPECTION_DATE || "", + item.writer_name || item.WRITER_NAME || "", + item.model_name || item.MODEL_NAME || "", + item.product_type || item.PRODUCT_TYPE || "", + item.work_order_no || item.WORK_ORDER_NO || "", + item.part_no || item.PART_NO || "", + item.part_name || item.PART_NAME || "", + item.receipt_qty || item.RECEIPT_QTY || 0, + item.good_qty || item.GOOD_QTY || 0, + item.defect_qty || item.DEFECT_QTY || 0, + item.defect_rate || item.DEFECT_RATE || 0, + item.regeneration_qty || item.REGENERATION_QTY || 0, + item.final_good_qty || item.FINAL_GOOD_QTY || 0, + item.defect_type || item.DEFECT_TYPE || "", + item.defect_cause || item.DEFECT_CAUSE || "", + item.responsible_dept || item.RESPONSIBLE_DEPT || "", + item.process_status || item.PROCESS_STATUS || "", + item.disposition_type || item.DISPOSITION_TYPE || "", + item.remark || item.REMARK || "", + item.data_type || item.DATA_TYPE || "", + item.inspection_group_id || item.INSPECTION_GROUP_ID || "" + ]); + + // 데이터 행 스타일 + row.eachCell(function(cell){ + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + }); + }); + + // 파일명 생성 + var today = new Date(); + var dateStr = today.getFullYear() + ("0" + (today.getMonth()+1)).slice(-2) + ("0" + today.getDate()).slice(-2); + var fileName = pageTitle + "_" + dateStr + ".xlsx"; + + // 다운로드 + const buffer = await workbook.xlsx.writeBuffer(); + saveAs(new Blob([buffer]), fileName); + } catch(e) { + console.error("엑셀 생성 오류:", e); + Swal.fire("엑셀 파일 생성 중 오류가 발생했습니다."); + } } // 컬럼: 검사일, 검사자, 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종양품수량 합계 diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index 0b1b72f..3d07d0c 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -597,7 +597,7 @@ public class QualityController { } /** - * 공정검사 엑셀 다운로드 + * 공정검사 엑셀 다운로드 (JSP 방식) */ @RequestMapping("/quality/processInspectionExcelDownload.do") public String processInspectionExcelDownload(HttpServletRequest request, @RequestParam Map paramMap){ @@ -606,6 +606,18 @@ public class QualityController { return "/quality/processInspectionExcel"; } + /** + * 공정검사 엑셀 데이터 조회 (AJAX JSON) - 전체 풀어서 다운로드 + */ + @ResponseBody + @RequestMapping("/quality/getProcessInspectionListForExcel.do") + public Map getProcessInspectionListForExcel(HttpServletRequest request, @RequestParam Map paramMap){ + Map result = new HashMap(); + List list = service.getProcessInspectionListForExcel(paramMap); + result.put("list", list); + return result; + } + // ===================================================== // 반제품검사 관리 // ===================================================== diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index d1f2eaa..6f35fbf 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -1358,30 +1358,32 @@ DELETE FROM PROCESS_INSPECTION_DETAIL WHERE MASTER_OBJID = #{MASTER_OBJID} - + - +