diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp index 6cda045..3100b37 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp @@ -58,6 +58,15 @@ $(document).ready(function(){ $('.select2').select2(); fnc_datepick(); + // DOM 렌더링 완료 후 그리드 높이 계산 + setTimeout(function() { + fnc_calculateContentHeight("gridDiv", 10); + }, 100); + + $(window).resize(function() { + fnc_calculateContentHeight("gridDiv", 10); + }); + $("input").keyup(function(e){ if(e.keyCode == 13){ $("#page").val("1"); @@ -92,7 +101,9 @@ function fn_excelDownload(){ search_part_no: $("#search_part_no").val() || "", search_part_name: $("#search_part_name").val() || "", search_inspection_date: $("#search_inspection_date").val() || "", - search_writer: $("#search_writer").val() || "" + search_writer: $("#search_writer").val() || "", + search_defect_type: $("#search_defect_type").val() || "", + search_responsible_dept: $("#search_responsible_dept").val() || "" }; $.ajax({ @@ -243,9 +254,70 @@ var columns = [ } ]; -// 조회 +// 조회 (Total 합계 표시 포함) function fn_search(){ - _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/semiProductInspectionGridList.do", columns, true); + var formData = $("#form1").serializeObject(); + + $.ajax({ + url: "/quality/semiProductInspectionGridList.do", + type: "POST", + data: formData, + dataType: "json", + beforeSend: function(){ + _startLoading("Loading..."); + }, + complete: function(){ + _endLoading(); + }, + success: function(response) { + // 그리드 데이터 설정 + if(_tabulGrid){ + _tabulGrid.setData(response.RESULTLIST || []); + } else { + _tabulGrid = new Tabulator("#mainGrid", { + height: "100%", + layout: _tabul_layout_fitColumns, + columns: columns, + data: response.RESULTLIST || [], + selectable: true + }); + } + + // Total 합계 계산 + var totalReceiptQty = 0; // 총 입고수량 + var totalGoodQty = 0; // 총 양품수량 + var totalDefectiveQty = 0; // 총 불량수량 + var totalRegenerationQty = 0; // 총 재생수량 + var totalFinalGoodQty = 0; // 총 최종양품수량 + + if(response.RESULTLIST && response.RESULTLIST.length > 0) { + response.RESULTLIST.forEach(function(row) { + totalReceiptQty += parseFloat(row.RECEIPT_QTY || 0); + totalGoodQty += parseFloat(row.GOOD_QTY || 0); + totalDefectiveQty += parseFloat(row.DEFECTIVE_QTY || 0); + totalRegenerationQty += parseFloat(row.REGENERATION_QTY || 0); + totalFinalGoodQty += parseFloat(row.FINAL_GOOD_QTY || 0); + }); + } + + // 합계 표시 + $("#totalReceiptQty").text(Number(totalReceiptQty).toLocaleString()); + $("#totalGoodQty").text(Number(totalGoodQty).toLocaleString()); + $("#totalDefectiveQty").text(Number(totalDefectiveQty).toLocaleString()); + $("#totalRegenerationQty").text(Number(totalRegenerationQty).toLocaleString()); + $("#totalFinalGoodQty").text(Number(totalFinalGoodQty).toLocaleString()); + + // 페이징 HTML 업데이트 + if(response.PAGE_HTML){ + $(".table_paging_wrap").html(response.PAGE_HTML); + } + }, + error: function(xhr, status, error) { + _endLoading(); + alert("데이터 조회 중 오류가 발생했습니다."); + console.error("Error:", error); + } + }); } // 검사일 클릭 시 검사결과 확인/수정 팝업 @@ -370,9 +442,37 @@ function fn_registPopUp(){ + + + + + + + + + + + + +
+ + Total 총 입고수량: 0EA    + Total 총 양품수량: 0EA    + Total 총 불량수량: 0EA    + Total 총 재생수량: 0EA    + Total 총 최종양품수량: 0 + +
+ <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index fb551c6..2a7c9a5 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -644,6 +644,10 @@ public class QualityController { code_map.put("inspection_date", commonService.bizMakeOptionList("", (String)paramMap.get("search_inspection_date"), "quality.getSemiProductInspectionDateList")); // 검사자 드롭박스 code_map.put("writer", commonService.bizMakeOptionList("", (String)paramMap.get("search_writer"), "quality.getSemiProductWriterList")); + // 불량유형 드롭박스 + code_map.put("defect_type", commonService.bizMakeOptionList("", (String)paramMap.get("search_defect_type"), "quality.getSemiProductDefectTypeList")); + // 귀책부서 드롭박스 + code_map.put("responsible_dept", commonService.bizMakeOptionList("", (String)paramMap.get("search_responsible_dept"), "quality.getSemiProductResponsibleDeptList")); request.setAttribute("code_map", code_map); // 엑셀 다운로드 diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index 579c947..7010232 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -1496,17 +1496,17 @@ AND (T2.INSPECTOR IS NOT NULL OR T2.WRITER IS NOT NULL)) sub WHERE val IS NOT NULL AND val != '' ) AS WRITER_NAME - - , SUM(T.RECEIPT_QTY) AS RECEIPT_QTY - , SUM(T.GOOD_QTY) AS GOOD_QTY - , SUM(T.DEFECT_QTY) AS DEFECTIVE_QTY + + , SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END) AS RECEIPT_QTY + , SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.GOOD_QTY ELSE 0 END) AS GOOD_QTY + , SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' THEN T.DEFECT_QTY ELSE 0 END) AS DEFECTIVE_QTY , CASE - WHEN SUM(T.RECEIPT_QTY) > 0 - THEN ROUND(SUM(T.DEFECT_QTY) * 100.0 / SUM(T.RECEIPT_QTY), 2) + WHEN SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END) > 0 + THEN ROUND(SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' THEN T.DEFECT_QTY ELSE 0 END) * 100.0 / SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END), 2) ELSE 0 END AS DEFECT_RATE - , SUM(CASE WHEN T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS REGENERATION_QTY - , SUM(T.GOOD_QTY) + SUM(CASE WHEN T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS FINAL_GOOD_QTY + , SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' AND T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS REGENERATION_QTY + , SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.GOOD_QTY ELSE 0 END) + SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' AND T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS FINAL_GOOD_QTY FROM ( SELECT SPI.OBJID , COALESCE(SPI.MODEL_NAME, '') AS MODEL_NAME @@ -1547,6 +1547,14 @@ AND SPI.WRITER = #{search_writer} + + + AND UPPER(SPI.DEFECT_TYPE) LIKE UPPER('%' || #{search_defect_type} || '%') + + + + AND UPPER(SPI.RESPONSIBLE_DEPT) LIKE UPPER('%' || #{search_responsible_dept} || '%') + ) T GROUP BY T.INSPECTION_GROUP_ID ORDER BY MIN(T.INSPECTION_DATE) DESC, T.INSPECTION_GROUP_ID @@ -1655,6 +1663,24 @@ ORDER BY NAME + + + + + +