From abbb8263ef72144e54b9faf94fb91dd58ea3302e Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 9 Jan 2026 16:28:17 +0900 Subject: [PATCH 1/4] =?UTF-8?q?cs=EA=B4=80=EB=A6=AC=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/view/quality/customerCsList.jsp | 84 ++++++++++++++++--- src/com/pms/controller/QualityController.java | 9 ++ src/com/pms/mapper/quality.xml | 12 +++ src/com/pms/service/QualityService.java | 52 ++++++++++++ 4 files changed, 147 insertions(+), 10 deletions(-) diff --git a/WebContent/WEB-INF/view/quality/customerCsList.jsp b/WebContent/WEB-INF/view/quality/customerCsList.jsp index ec3775b..2662b1b 100644 --- a/WebContent/WEB-INF/view/quality/customerCsList.jsp +++ b/WebContent/WEB-INF/view/quality/customerCsList.jsp @@ -59,6 +59,11 @@ $(document).ready(function(){ fn_registActionPopUp(); }); + // 삭제 + $("#btnDelete").click(function(){ + fn_delete(); + }); + fn_search(); }); @@ -239,6 +244,67 @@ function fn_FileRegist(objId, docType, docTypeName){ fn_centerPopup(popup_width, popup_height, url); } + +// 삭제 +function fn_delete(){ + var selected = _tabulGrid.getSelectedData(); + if(selected.length == 0){ + Swal.fire("삭제할 데이터를 선택해주세요."); + return; + } + + // 선택된 OBJID 목록 추출 + var objIds = []; + for(var i = 0; i < selected.length; i++){ + objIds.push(selected[i].OBJID); + } + + Swal.fire({ + title: '삭제 확인', + text: selected.length + '건의 데이터를 삭제하시겠습니까?', + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#d33', + cancelButtonColor: '#3085d6', + confirmButtonText: '삭제', + cancelButtonText: '취소' + }).then((result) => { + if(result.isConfirmed){ + $.ajax({ + url: "/quality/deleteCustomerCs.do", + type: "POST", + data: { + objIds: JSON.stringify(objIds) + }, + dataType: "json", + success: function(response){ + if(response.result){ + Swal.fire({ + icon: 'success', + title: '삭제 완료', + text: response.msg + }).then(function(){ + fn_search(); + }); + } else { + Swal.fire({ + icon: 'error', + title: '삭제 실패', + text: response.msg + }); + } + }, + error: function(xhr, status, error){ + Swal.fire({ + icon: 'error', + title: '오류', + text: '삭제 중 오류가 발생했습니다.' + }); + } + }); + } + }); +} @@ -257,6 +323,7 @@ function fn_FileRegist(objId, docType, docTypeName){
+
@@ -284,25 +351,22 @@ function fn_FileRegist(objId, docType, docTypeName){ --> - + - + - + + - @@ -312,7 +376,7 @@ function fn_FileRegist(objId, docType, docTypeName){ - diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index ab9efce..59e6636 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -840,6 +840,15 @@ public class QualityController { return service.saveCustomerCsAction(request, paramMap); } + /** + * 고객 CS 삭제 + */ + @ResponseBody + @RequestMapping("/quality/deleteCustomerCs.do") + public Map deleteCustomerCs(HttpServletRequest request, @RequestParam Map paramMap){ + return service.deleteCustomerCs(paramMap); + } + // ===================================================== // ECR 관리 // ===================================================== diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index abf423f..1688de3 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -2092,6 +2092,18 @@ WHERE OBJID = #{OBJID} + + + DELETE FROM CUSTOMER_CS WHERE OBJID = #{OBJID} + + + + + DELETE FROM ATTACH_FILE_INFO + WHERE TARGET_OBJID = #{OBJID} + AND DOC_TYPE IN ('CUSTOMER_CS_IMAGE', 'CUSTOMER_CS_ACTION') + + diff --git a/src/com/pms/service/QualityService.java b/src/com/pms/service/QualityService.java index 000c524..0c7dd6d 100644 --- a/src/com/pms/service/QualityService.java +++ b/src/com/pms/service/QualityService.java @@ -1605,6 +1605,58 @@ public class QualityService extends BaseService{ return resultMap; } + /** + * 고객 CS 삭제 + */ + public Map deleteCustomerCs(Map paramMap){ + Map resultMap = new HashMap(); + SqlSession sqlSession = null; + + try{ + sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + + String objIdsJson = CommonUtils.checkNull(paramMap.get("objIds")); + + if(!objIdsJson.equals("") && !objIdsJson.equals("[]")){ + org.json.simple.parser.JSONParser parser = new org.json.simple.parser.JSONParser(); + org.json.simple.JSONArray objIdArr = (org.json.simple.JSONArray) parser.parse(objIdsJson); + + int deletedCount = 0; + for(int i = 0; i < objIdArr.size(); i++){ + String objId = CommonUtils.checkNull(objIdArr.get(i)); + if(!objId.equals("")){ + Map deleteParam = new HashMap(); + deleteParam.put("OBJID", objId); + + // 첨부파일 삭제 (이미지, 조치첨부) + sqlSession.delete("quality.deleteCustomerCsAttachFiles", deleteParam); + + // 고객 CS 데이터 삭제 + int cnt = sqlSession.delete("quality.deleteCustomerCs", deleteParam); + if(cnt > 0) deletedCount++; + } + } + + sqlSession.commit(); + resultMap.put("result", true); + resultMap.put("msg", deletedCount + "건이 삭제되었습니다."); + } else { + resultMap.put("result", false); + resultMap.put("msg", "삭제할 데이터가 없습니다."); + } + + }catch(Exception e){ + resultMap.put("result", false); + resultMap.put("msg", "삭제 중 오류가 발생했습니다."); + if(sqlSession != null) sqlSession.rollback(); + e.printStackTrace(); + }finally{ + if(sqlSession != null) sqlSession.close(); + } + + return resultMap; + } + // ===================================================== // ECR 관리 // ===================================================== -- 2.49.1 From f8733a55f1cf27a444366a5d7764db8fd1ab6982 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 9 Jan 2026 16:46:11 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=ED=92=88=EC=A7=88=EA=B4=80=EB=A6=AC=5F?= =?UTF-8?q?=EA=B3=B5=EC=A0=95=EA=B2=80=EC=82=AC=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=EA=B3=B5=EC=A0=95=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/quality/processInspectionList.jsp | 30 ++++++++++++------- src/com/pms/controller/QualityController.java | 6 ++-- src/com/pms/mapper/quality.xml | 10 +++++++ 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/WebContent/WEB-INF/view/quality/processInspectionList.jsp b/WebContent/WEB-INF/view/quality/processInspectionList.jsp index 758201f..00ee121 100644 --- a/WebContent/WEB-INF/view/quality/processInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/processInspectionList.jsp @@ -142,15 +142,16 @@ function fn_search(){ } // 검색조건 초기화 -function fn_reset(){ - $("#search_inspection_date_from").val(""); - $("#search_inspection_date_to").val(""); - $("#search_inspector").val(""); - $("#search_project_no").val(""); - $("#search_part_no").val(""); - $("#search_part_name").val(""); - $("#search_inspection_result").val(""); -} +// function fn_reset(){ +// $("#search_inspection_date_from").val(""); +// $("#search_inspection_date_to").val(""); +// $("#search_inspector").val(""); +// $("#search_project_no").val(""); +// $("#search_part_no").val(""); +// $("#search_part_name").val(""); +// $("#search_inspection_result").val(""); +// $("#search_process_cd").val("").trigger("change"); +// } // 공정검사 등록 팝업 function fn_registPopUp(){ @@ -184,7 +185,8 @@ function fn_excelDownload(){ 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() || "" + search_inspection_result: $("#search_inspection_result").val() || "", + search_process_cd: $("#search_process_cd").val() || "" }; $.ajax({ @@ -390,6 +392,14 @@ async function fn_createExcelFile(data){ + + + + + diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index 59e6636..fb551c6 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -524,8 +524,10 @@ public class QualityController { code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("search_project_no"), "common.getProjectNameList")); // 검사자 목록 code_map.put("inspector_id", commonService.bizMakeOptionList("", (String)paramMap.get("search_inspector"), "common.getUserselect")); - //제품구분 - code_map.put("product_cd", commonService.bizMakeOptionList("0000001", (String)paramMap.get("productType"),"common.getCodeselect")); + // 제품구분 + code_map.put("product_cd", commonService.bizMakeOptionList("0000001", (String)paramMap.get("productType"),"common.getCodeselect")); + // 진행공정 목록 + code_map.put("process_cd", commonService.bizMakeOptionList("0001870", (String)paramMap.get("search_process_cd"),"common.getCodeselect")); } catch(Exception e) { e.printStackTrace(); } diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index 1688de3..579c947 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -1208,6 +1208,12 @@ AND (SELECT CASE WHEN COUNT(CASE WHEN PID.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) = #{search_inspection_result} + /* 진행공정 */ + + AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID + WHERE PID.MASTER_OBJID = PIM.OBJID + AND PID.PROCESS_CD = #{search_process_cd}) + ORDER BY PIM.REG_DATE DESC @@ -1411,6 +1417,10 @@ AND PID.INSPECTION_RESULT = #{search_inspection_result} + /* 진행공정 */ + + AND PID.PROCESS_CD = #{search_process_cd} + ORDER BY PIM.INSPECTION_DATE DESC, PIM.REG_DATE DESC, PID.REG_DATE -- 2.49.1 From 0a29c2dd8005001dbfd9d391540da59ec91d8b7e Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 9 Jan 2026 16:50:42 +0900 Subject: [PATCH 3/4] select2 --- .../view/quality/processInspectionList.jsp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/WebContent/WEB-INF/view/quality/processInspectionList.jsp b/WebContent/WEB-INF/view/quality/processInspectionList.jsp index 00ee121..7cb6c00 100644 --- a/WebContent/WEB-INF/view/quality/processInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/processInspectionList.jsp @@ -141,18 +141,6 @@ function fn_search(){ _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/processInspectionGridList.do", columns, true); } -// 검색조건 초기화 -// function fn_reset(){ -// $("#search_inspection_date_from").val(""); -// $("#search_inspection_date_to").val(""); -// $("#search_inspector").val(""); -// $("#search_project_no").val(""); -// $("#search_part_no").val(""); -// $("#search_part_name").val(""); -// $("#search_inspection_result").val(""); -// $("#search_process_cd").val("").trigger("change"); -// } - // 공정검사 등록 팝업 function fn_registPopUp(){ var popup_width = 1500; @@ -353,7 +341,7 @@ async function fn_createExcelFile(data){ - @@ -362,7 +350,7 @@ async function fn_createExcelFile(data){ - @@ -386,7 +374,7 @@ async function fn_createExcelFile(data){ - -- 2.49.1 From cdb6c0a3fc3168d49f9526631ceaddea683713c4 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 9 Jan 2026 17:32:20 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=9E=85=EA=B3=A0=EC=88=98=EB=9F=89,=20?= =?UTF-8?q?=EC=96=91=ED=92=88,=20=EB=B6=88=EB=9F=89=EC=88=98=EB=9F=89=20?= =?UTF-8?q?=EB=93=B1=20=ED=91=9C=EC=8B=9C,=20=EA=B2=80=EC=83=89=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality/semiProductInspectionList.jsp | 106 +++++++++++++++++- src/com/pms/controller/QualityController.java | 4 + src/com/pms/mapper/quality.xml | 42 +++++-- 3 files changed, 141 insertions(+), 11 deletions(-) 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 + + + + + +