From c70b746c686371a094e25b931fa894a6687d1698 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Wed, 17 Dec 2025 13:46:56 +0900 Subject: [PATCH] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pms/mapper/quality.xml | 3 + .../semiProductInspectionFormPopUp.jsp | 117 +++++++++++------- src/com/pms/mapper/quality.xml | 3 + src/com/pms/service/QualityService.java | 12 ++ 4 files changed, 91 insertions(+), 44 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml index 1028007..da1d3e4 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml @@ -1676,6 +1676,7 @@ , REG_DATE , DATA_TYPE , INSPECTION_GROUP_ID + , IS_LOCKED ) VALUES ( #{OBJID} , #{MODEL_NAME} @@ -1698,6 +1699,7 @@ , NOW() , #{DATA_TYPE} , #{INSPECTION_GROUP_ID} + , COALESCE(#{IS_LOCKED}, 'N') ) @@ -1720,6 +1722,7 @@ , INSPECTOR = #{INSPECTOR} , DISPOSITION_TYPE = #{DISPOSITION_TYPE} , REMARK = #{REMARK} + , IS_LOCKED = CASE WHEN IS_LOCKED = 'Y' THEN 'Y' ELSE COALESCE(#{IS_LOCKED}, 'N') END WHERE OBJID = #{OBJID} diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp index 4aac99e..e85da48 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp @@ -999,53 +999,71 @@ function fn_loadData(objid, inspectionGroupId){ } // ===================================================== -// 좌측 행 잠금: 선택된 양품 행을 수정 불가로 변경 (DB에 잠금 상태 저장) +// 좌측 행 저장+잠금: 선택된 양품 행을 DB에 저장하고 수정 불가로 변경 // ===================================================== function fn_saveSelectedLeft(){ + console.log("===== fn_saveSelectedLeft 호출됨 ====="); + if(!selectedLeftRowId){ - Swal.fire({ icon: 'warning', title: '알림', text: '잠금할 양품 정보를 선택해주세요.' }); + Swal.fire({ icon: 'warning', title: '알림', text: '저장할 양품 정보를 선택해주세요.' }); return; } // 선택된 좌측 행 var selectedRow = leftGrid.getSelectedRows()[0]; if(!selectedRow){ - Swal.fire({ icon: 'warning', title: '알림', text: '잠금할 양품 정보를 선택해주세요.' }); + Swal.fire({ icon: 'warning', title: '알림', text: '저장할 양품 정보를 선택해주세요.' }); return; } - var rowData = selectedRow.getData(); - var objId = rowData.OBJID; + var leftData = [selectedRow.getData()]; - // 아직 DB에 저장되지 않은 행은 잠금 불가 - if(!objId || String(objId).startsWith("NEW_")){ - Swal.fire({ icon: 'warning', title: '알림', text: '먼저 하단 저장 버튼을 눌러 DB에 저장한 후 잠금할 수 있습니다.' }); - return; - } + // DB에 저장 요청 (IS_LOCKED='Y'로 저장) + var paramData = { + leftData: JSON.stringify(leftData), + rightData: JSON.stringify([]), + INSPECTION_GROUP_ID: currentInspectionGroupId || "", + saveType: "left", + lockData: "Y" // 저장 시 잠금도 같이 + }; + + console.log("좌측 저장+잠금 요청:", paramData); - // DB에 잠금 요청 $.ajax({ - url: "/quality/lockSemiProductInspection.do", + url: "/quality/saveSemiProductInspection.do", type: "POST", - data: { objIds: JSON.stringify([objId]) }, + data: paramData, dataType: "json", success: function(result){ - if(result.result){ + console.log("좌측 저장+잠금 응답:", result); + if(result.result == true || result.result == "true"){ + // INSPECTION_GROUP_ID 업데이트 + if(result.inspectionGroupId){ + currentInspectionGroupId = result.inspectionGroupId; + console.log("INSPECTION_GROUP_ID 업데이트:", currentInspectionGroupId); + } // UI에서도 수정 불가 처리 selectedRow.update({ IS_SAVED: true, IS_LOCKED: 'Y' }); - Swal.fire({ icon: 'success', title: '완료', text: '양품 정보가 잠금 처리되었습니다.' }); + console.log("행 업데이트 완료: IS_SAVED=true, IS_LOCKED=Y"); + Swal.fire({ icon: 'success', title: '완료', text: '양품 정보가 저장 및 잠금 처리되었습니다.' }); + // 부모 창 새로고침 + if(window.opener && window.opener.fn_search){ + window.opener.fn_search(); + } } else { - Swal.fire({ icon: 'error', title: '오류', text: result.msg || '잠금 처리에 실패했습니다.' }); + console.log("좌측 저장 실패:", result.msg); + Swal.fire({ icon: 'error', title: '오류', text: result.msg || '저장에 실패했습니다.' }); } }, error: function(xhr, status, error){ - Swal.fire({ icon: 'error', title: '오류', text: '잠금 처리 중 오류가 발생했습니다.' }); + console.log("좌측 저장 AJAX 오류:", xhr.responseText, status, error); + Swal.fire({ icon: 'error', title: '오류', text: '저장 중 오류가 발생했습니다.' }); } }); } // ===================================================== -// 우측 행 잠금: 선택된 불량 행을 수정 불가로 변경 (DB에 잠금 상태 저장) +// 우측 행 저장+잠금: 선택된 불량 행을 DB에 저장하고 수정 불가로 변경 // ===================================================== function fn_saveSelectedRight(){ if(!selectedLeftRowId){ @@ -1057,51 +1075,62 @@ function fn_saveSelectedRight(){ var selectedRightRows = rightGrid.getSelectedRows(); if(selectedRightRows.length == 0){ - Swal.fire({ icon: 'warning', title: '알림', text: '잠금할 불량 정보를 선택해주세요.' }); + Swal.fire({ icon: 'warning', title: '알림', text: '저장할 불량 정보를 선택해주세요.' }); return; } - // DB에 저장된 행만 잠금 가능 - var objIdsToLock = []; - var unsavedCount = 0; + // 선택된 좌측 행 (부모 정보 참조용) + var selectedLeftRow = leftGrid.getSelectedRows()[0]; + var leftRowData = selectedLeftRow ? selectedLeftRow.getData() : {}; + + // 선택된 불량 데이터에 부모 정보 복사 + var rightData = []; selectedRightRows.forEach(function(row){ - var objId = row.getData().OBJID; - if(objId && !String(objId).startsWith("DEFECT_") && !String(objId).startsWith("NEW_")){ - objIdsToLock.push(objId); - } else { - unsavedCount++; - } + var defect = row.getData(); + defect.PARENT_ROW_ID = selectedLeftRowId; + defect.MODEL_NAME = leftRowData.MODEL_NAME || ''; + defect.PRODUCT_TYPE = leftRowData.PRODUCT_TYPE || ''; + defect.WORK_ORDER_NO = leftRowData.WORK_ORDER_NO || ''; + defect.PART_NO = leftRowData.PART_NO || ''; + defect.PART_NAME = leftRowData.PART_NAME || ''; + rightData.push(defect); }); - if(unsavedCount > 0){ - Swal.fire({ icon: 'warning', title: '알림', text: '아직 DB에 저장되지 않은 행이 ' + unsavedCount + '건 있습니다. 먼저 하단 저장 버튼을 눌러 저장해주세요.' }); - return; - } + // DB에 저장 요청 (IS_LOCKED='Y'로 저장) + var paramData = { + leftData: JSON.stringify([]), + rightData: JSON.stringify(rightData), + INSPECTION_GROUP_ID: currentInspectionGroupId || "", + saveType: "right", + lockData: "Y" // 저장 시 잠금도 같이 + }; - if(objIdsToLock.length == 0){ - Swal.fire({ icon: 'warning', title: '알림', text: '잠금할 행이 없습니다.' }); - return; - } - - // DB에 잠금 요청 $.ajax({ - url: "/quality/lockSemiProductInspection.do", + url: "/quality/saveSemiProductInspection.do", type: "POST", - data: { objIds: JSON.stringify(objIdsToLock) }, + data: paramData, dataType: "json", success: function(result){ - if(result.result){ + if(result.result == true || result.result == "true"){ + // INSPECTION_GROUP_ID 업데이트 + if(result.inspectionGroupId){ + currentInspectionGroupId = result.inspectionGroupId; + } // UI에서도 수정 불가 처리 selectedRightRows.forEach(function(row){ row.update({ IS_SAVED: true, IS_LOCKED: 'Y' }); }); - Swal.fire({ icon: 'success', title: '완료', text: '불량 정보 ' + objIdsToLock.length + '건이 잠금 처리되었습니다.' }); + Swal.fire({ icon: 'success', title: '완료', text: '불량 정보 ' + rightData.length + '건이 저장 및 잠금 처리되었습니다.' }); + // 부모 창 새로고침 + if(window.opener && window.opener.fn_search){ + window.opener.fn_search(); + } } else { - Swal.fire({ icon: 'error', title: '오류', text: result.msg || '잠금 처리에 실패했습니다.' }); + Swal.fire({ icon: 'error', title: '오류', text: result.msg || '저장에 실패했습니다.' }); } }, error: function(xhr, status, error){ - Swal.fire({ icon: 'error', title: '오류', text: '잠금 처리 중 오류가 발생했습니다.' }); + Swal.fire({ icon: 'error', title: '오류', text: '저장 중 오류가 발생했습니다.' }); } }); } diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index 1028007..da1d3e4 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -1676,6 +1676,7 @@ , REG_DATE , DATA_TYPE , INSPECTION_GROUP_ID + , IS_LOCKED ) VALUES ( #{OBJID} , #{MODEL_NAME} @@ -1698,6 +1699,7 @@ , NOW() , #{DATA_TYPE} , #{INSPECTION_GROUP_ID} + , COALESCE(#{IS_LOCKED}, 'N') ) @@ -1720,6 +1722,7 @@ , INSPECTOR = #{INSPECTOR} , DISPOSITION_TYPE = #{DISPOSITION_TYPE} , REMARK = #{REMARK} + , IS_LOCKED = CASE WHEN IS_LOCKED = 'Y' THEN 'Y' ELSE COALESCE(#{IS_LOCKED}, 'N') END WHERE OBJID = #{OBJID} diff --git a/src/com/pms/service/QualityService.java b/src/com/pms/service/QualityService.java index e3ab8af..d1c9fa3 100644 --- a/src/com/pms/service/QualityService.java +++ b/src/com/pms/service/QualityService.java @@ -1142,6 +1142,12 @@ public class QualityService extends BaseService{ String rightDataStr = CommonUtils.checkNull(paramMap.get("rightData")); String existingGroupId = CommonUtils.checkNull(paramMap.get("INSPECTION_GROUP_ID")); String saveType = CommonUtils.checkNull(paramMap.get("saveType"), "all"); // 저장 타입: left, right, all + String lockData = CommonUtils.checkNull(paramMap.get("lockData"), "N"); // 잠금 여부: Y, N + + System.out.println("=== saveSemiProductInspection ==="); + System.out.println("saveType: " + saveType); + System.out.println("lockData: " + lockData); + System.out.println("existingGroupId: " + existingGroupId); org.json.simple.parser.JSONParser parser = new org.json.simple.parser.JSONParser(); @@ -1200,6 +1206,9 @@ public class QualityService extends BaseService{ sqlParamMap.put("DISPOSITION_TYPE", ""); sqlParamMap.put("REMARK", ""); + // 잠금 여부 설정 + sqlParamMap.put("IS_LOCKED", lockData); + // UPSERT: UPDATE 시도 후 실패하면 INSERT int updateCnt = sqlSession.update("quality.updateSemiProductInspectionData", sqlParamMap); if(updateCnt == 0){ @@ -1290,6 +1299,9 @@ public class QualityService extends BaseService{ sqlParamMap.put("RECEIPT_QTY", "0"); sqlParamMap.put("GOOD_QTY", "0"); + // 잠금 여부 설정 + sqlParamMap.put("IS_LOCKED", lockData); + // UPSERT: UPDATE 시도 후 실패하면 INSERT int updateCnt = sqlSession.update("quality.updateSemiProductInspectionData", sqlParamMap); if(updateCnt == 0){