diff --git a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp index 548b403..e330907 100644 --- a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp @@ -443,6 +443,39 @@ var gridFn = { } } +// 품번 중복 검증 함수 (PART_BOM_REPORT 테이블에서 헤더 품번 중복 체크) +function fn_checkDuplicatePartNo(){ + var isDuplicate = false; + + // 헤더의 품번 가져오기 + var bomPartNo = $('#bom_part_no').val(); + if(!bomPartNo || bomPartNo.trim() == ""){ + return false; // 품번이 없으면 중복 아님 + } + + // 동기 AJAX로 DB에서 중복 체크 + $.ajax({ + url: "/partMng/checkDuplicatePartNo.do", + type: "POST", + data: { + partNo: bomPartNo.trim(), + bomReportObjid: $('#BOM_REPORT_OBJID').val() // 현재 수정 중인 BOM은 제외 + }, + dataType: "json", + async: false, // 동기 처리 + success: function(data){ + if(data && data.isDuplicate){ + isDuplicate = true; + } + }, + error: function(jqxhr, status, error){ + console.error("품번 중복 체크 오류:", error); + } + }); + + return isDuplicate; +} + function fn_save(){ var ids = grid.jqGrid("getDataIDs"); @@ -493,6 +526,13 @@ function fn_save(){ return; } + // 품번 중복 검증 (PART_BOM_REPORT 테이블 - 헤더 품번) + if(fn_checkDuplicatePartNo()){ + Swal.fire('입력한 품번이 이미 존재합니다. 다른 품번을 입력해주세요.'); + $('#bom_part_no').focus(); + return; + } + var existsDup = false; var ARR_APPLICATION_PROJECT_NO = new Array(); $(".APPLICATION_PROJECT_NO").each(function(){ @@ -863,7 +903,7 @@ function fn_save(){
-

PART 및 구조등록 Excel upload

+

PART 및 구조등록 Excel/CSV upload

@@ -1018,7 +1058,7 @@ function fn_save(){
-
   Excel uploadTemplate Download
+
   Excel/CSV upload
Drag & Drop 엑셀 템플릿
diff --git a/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp b/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp index 3993718..e25684b 100644 --- a/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp @@ -34,7 +34,15 @@ $(document).ready(function(){ }); $("#btnEdit").click(function(){ - fn_edit(); + fn_enableEdit(); + }); + + $("#btnSave").click(function(){ + fn_save(); + }); + + $("#btnCancel").click(function(){ + location.reload(); }); //설계변경 @@ -71,31 +79,8 @@ $(document).ready(function(){ $("input:radio[name='CHANGE_OPTION']").prop('disabled', true); $("input:radio[name='MANAGEMENT_FLAG']").prop('disabled', true); - $("select").attr("disabled",true); - - $('input').prop('readonly', true); - $('input').prop('disabled', true); - - $('#btnEdit').prop('readonly', false); - $('#btnEdit').prop('disabled', false); - - $('#btnChangeDesign').prop('readonly', false); - $('#btnChangeDesign').prop('disabled', false); - - $('#btnClose').prop('readonly', false); - $('#btnClose').prop('disabled', false); - - $('#OBJID').prop('readonly', false); - $('#STATUS').prop('readonly', false); - $('#IS_LAST').prop('readonly', false); - $('#ACTION_TYPE').prop('readonly', false); - $('#REVISION').prop('readonly', false); - - $('#OBJID').prop('disabled', false); - $('#STATUS').prop('disabled', false); - $('#IS_LAST').prop('disabled', false); - $('#ACTION_TYPE').prop('disabled', false); - $('#REVISION').prop('disabled', false); + // 초기 상태: 읽기 전용 모드 설정 + fn_setReadOnly(); window.resizeTo(800,690); @@ -303,6 +288,94 @@ function openImagePopUp(url){ window.open(url,"problemImgPopUp","width="+img_width+",height="+height+", menubars=no, scrollbars=yes'"); } +// 읽기 전용 모드 설정 +function fn_setReadOnly(){ + $("select").attr("disabled",true); + + // 버튼이 아닌 input만 비활성화 (중요: type별로 선택) + $('input[type="text"]').prop('readonly', true).prop('disabled', true); + $('input[type="hidden"]').prop('readonly', false).prop('disabled', false); + $('input[type="radio"]').prop('disabled', true); + $('input[type="checkbox"]').prop('disabled', true); + + // 모든 버튼은 명시적으로 활성화 + $('input[type="button"]').prop('disabled', false); + + // 저장/취소 버튼 숨김, 수정 버튼 표시 + $('#btnSave').hide(); + $('#btnCancel').hide(); + $('#btnEdit').show(); +} + +// 수정 모드 활성화 +function fn_enableEdit(){ + // 수정 가능한 필드만 활성화 + $('#PART_NAME').prop('readonly', false).prop('disabled', false); + $('#MATERIAL').prop('readonly', false).prop('disabled', false); + $('#HEAT_TREATMENT_HARDNESS').prop('readonly', false).prop('disabled', false); + $('#HEAT_TREATMENT_METHOD').prop('readonly', false).prop('disabled', false); + $('#SURFACE_TREATMENT').prop('readonly', false).prop('disabled', false); + $('#SUPPLY_CODE').prop('disabled', false); + $('#PART_TYPE').prop('disabled', false); + $('#REMARK').prop('readonly', false).prop('disabled', false); + + // 버튼 표시 변경 + $('#btnEdit').hide(); + $('#btnSave').show(); + $('#btnCancel').show(); +} + +// 저장 기능 +function fn_save(){ + if(!confirm("저장하시겠습니까?")){ + return; + } + + // 유효성 검사 + var partName = $('#PART_NAME').val(); + if(!partName || partName.trim() == ""){ + alert("품명을 입력해주세요."); + $('#PART_NAME').focus(); + return; + } + + // 저장할 데이터 준비 + var saveData = { + OBJID: $('#OBJID').val(), + PART_NAME: $('#PART_NAME').val(), + MATERIAL: $('#MATERIAL').val(), + HEAT_TREATMENT_HARDNESS: $('#HEAT_TREATMENT_HARDNESS').val(), + HEAT_TREATMENT_METHOD: $('#HEAT_TREATMENT_METHOD').val(), + SURFACE_TREATMENT: $('#SURFACE_TREATMENT').val(), + SUPPLY_CODE: $('#SUPPLY_CODE').val(), + PART_TYPE: $('#PART_TYPE').val(), + REMARK: $('#REMARK').val() + }; + + // 저장 요청 + $.ajax({ + url: "/partMng/updatePartDetail.do", + type: "POST", + data: saveData, + dataType: "json", + success: function(data){ + if(data.result == "success"){ + alert("저장되었습니다."); + // 부모 창 새로고침 + if(opener && opener.fn_search){ + opener.fn_search(); + } + location.reload(); + }else{ + alert("저장에 실패했습니다: " + (data.message || "")); + } + }, + error: function(jqxhr, status, error){ + alert("저장 중 오류가 발생했습니다: " + error); + } + }); +} + function fn_edit(){ if($("#ACTION_TYPE").val() == "changeDesign"){ @@ -416,7 +489,7 @@ function fn_edit(){ - + @@ -670,6 +743,8 @@ function fn_edit(){ + + <%-- --%> <%-- --%> <%-- --%> diff --git a/WebContent/WEB-INF/view/partMng/structureList.jsp b/WebContent/WEB-INF/view/partMng/structureList.jsp index f7c3d73..d6535f9 100644 --- a/WebContent/WEB-INF/view/partMng/structureList.jsp +++ b/WebContent/WEB-INF/view/partMng/structureList.jsp @@ -641,17 +641,19 @@ function saveexcelpop() { - ~ - + ~ + diff --git a/src/com/pms/controller/PartMngController.java b/src/com/pms/controller/PartMngController.java index 708fbf1..32a409e 100644 --- a/src/com/pms/controller/PartMngController.java +++ b/src/com/pms/controller/PartMngController.java @@ -455,6 +455,38 @@ public class PartMngController { return "/partMng/partMngDetailPopUp"; } + + /** + * PART Detail 수정 저장 + * @param request + * @param paramMap + * @return + */ + @RequestMapping("/partMng/updatePartDetail.do") + @ResponseBody + public Map updatePartDetail(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try{ + // 품목 정보 업데이트 + int result = partMngService.updatePartDetail(request, paramMap); + + if(result > 0){ + resultMap.put("result", "success"); + resultMap.put("message", "저장되었습니다."); + }else{ + resultMap.put("result", "fail"); + resultMap.put("message", "저장에 실패했습니다."); + } + + }catch(Exception e){ + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "저장 중 오류가 발생했습니다."); + } + + return resultMap; + } /** * PART Detail PopUp * @param request @@ -1717,6 +1749,45 @@ public class PartMngController { CommonUtils.setReqResult(request, "", "F", e, resultMap); } //return result; + return resultMap; + } + + /** + * 품번 중복 체크 (PART_BOM_REPORT 테이블) + * @param request + * @param paramMap + * @return + */ + @RequestMapping("/partMng/checkDuplicatePartNo.do") + @ResponseBody + public Map checkDuplicatePartNo(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try{ + String partNo = CommonUtils.checkNull(paramMap.get("partNo")); + String bomReportObjid = CommonUtils.checkNull(paramMap.get("bomReportObjid")); + + if(!"".equals(partNo)){ + paramMap.put("partNo", partNo.trim()); + paramMap.put("bomReportObjid", bomReportObjid); + + // DB에서 중복 체크 + int count = partMngService.checkDuplicatePartNo(request, paramMap); + + resultMap.put("isDuplicate", count > 0); + }else{ + resultMap.put("isDuplicate", false); + } + + resultMap.put("result", "success"); + + }catch(Exception e){ + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "품번 중복 체크 중 오류가 발생했습니다."); + resultMap.put("isDuplicate", false); + } + return resultMap; } diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index b94077d..80c8d15 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -2610,6 +2610,32 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.* AND T.OBJID = #{OBJID} + + + UPDATE PART_MNG + SET + PART_NAME = #{PART_NAME}, + MATERIAL = #{MATERIAL}, + HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS}, + HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD}, + SURFACE_TREATMENT = #{SURFACE_TREATMENT}, + SUPPLY_CODE = #{SUPPLY_CODE}, + PART_TYPE = #{PART_TYPE}, + REMARK = #{REMARK}, + EDIT_DATE = NOW() + WHERE OBJID = #{OBJID} + + + + +