From 42bb799b73e4b3d2820722d82808f6557d832a2b Mon Sep 17 00:00:00 2001 From: Johngreen Date: Thu, 30 Oct 2025 14:49:20 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=B4=84=EB=A6=AC=EC=8A=A4=ED=8A=B8>?= =?UTF-8?q?=EC=9D=B4=EB=B4=84=EB=93=B1=EB=A1=9D=20csv=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EC=8B=9C=20=ED=95=AD=EB=AA=A9=EC=88=98=EB=9F=89=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../partMng/openBomReportExcelImportPopUp.jsp | 196 ++++++++---------- .../WEB-INF/view/partMng/structureList.jsp | 15 +- src/com/pms/service/PartMngService.java | 106 ++++------ 3 files changed, 144 insertions(+), 173 deletions(-) diff --git a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp index 0428bf8..635e0c9 100644 --- a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp @@ -434,17 +434,8 @@ var gridFn = { ,datatype : "json" ,postData:{"targetObjId":"${objid}","docType":"PART_EXCEL_IMPORT","OBJID":"${CONTRACT_OBJID}"} ,loadComplete : function(data) { - // CSV 파일에서만 LEVEL 값을 PARENT_PART_NO 컬럼에 표시 - if(data && data.rows) { - for(var i = 0; i < data.rows.length; i++) { - var row = data.rows[i]; - // CSV 파일이고 LEVEL 값이 있는 경우 - if(row.IS_CSV === 'Y' && row.LEVEL && row.LEVEL !== '') { - // LEVEL 값을 PARENT_PART_NO 컬럼에 표시 (화면용) - grid.jqGrid('setCell', row.id, 'PARENT_PART_NO', row.LEVEL); - } - } - } + // CSV 파일: 모품번을 그대로 표시 (수정 불필요) + // PARENT_PART_NO 컬럼에 이미 모품번이 들어있음 gridFn.footerSummary(); } ,gridComplete : function() { @@ -516,108 +507,103 @@ function fn_checkDuplicatePartNo(){ function fn_save(){ var ids = grid.jqGrid("getDataIDs"); + // 필수 필드 검증 (제품구분, 품번, 품명) + if(!fnc_valitate("form1")){ + return; + } + + // 품번 중복 검증 (PART_BOM_REPORT 테이블 - 헤더 품번) + if(fn_checkDuplicatePartNo()){ + Swal.fire('입력한 품번이 이미 존재합니다. 다른 품번을 입력해주세요.'); + $('#bom_part_no').focus(); + return; + } + + // 그리드에 데이터가 있는 경우에만 검증 수행 if(ids!=""){ - if(fnc_valitate("form1")){ + var valid = true; + var existPart = true; + var part = ""; + if (fnc_isEmpty(${bomInfo.OBJID})) { + var partNo1 = ""; - var valid = true; - var existPart = true; - var part = ""; - if (fnc_isEmpty(${bomInfo.OBJID})) { - var partNo1 = ""; - - gridFn.closeEdit(); - $.each(grid.getRowData(), function(i, d) { - if (i == 0) { - partNo1 = d["PART_NO"]; - } - var partType = d["PART_TYPE"]; - var partNo = d["PART_NO"]; - - if (partType == '0001788') { - if (!fn_existPartNo(partNo)) { - existPart = false; - part = partNo; - return false; // Exit the loop - } - } - - if(!fnc_isEmpty(d["NOTE"])){ - valid = false; - } - }); - gridFn.opennEdit(); - - var project_no = $("#project_name").find("option:selected").text(); - if (partNo1.indexOf(project_no) < 0) { - valid = false; - } - } - - if (!existPart) { - Swal.fire(part+'품번에 해당하는 구매품표준이 없습니다. 확인해 주세요.'); - return; - } - - if (!valid) { - Swal.fire('1레벨 품번에 프로젝트번호가 없습니다. 확인해 주세요.'); - 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(){ - for(var i=0; i { + // 검색 플래그 초기화 후 목록 새로고침 + isSearching = false; + fn_search(); + }); }, error: function(jqxhr, status, error){ + Swal.fire('삭제 중 오류가 발생했습니다.'); + // 에러 시에도 플래그 초기화 + isSearching = false; } }); } diff --git a/src/com/pms/service/PartMngService.java b/src/com/pms/service/PartMngService.java index d495923..86fbf9b 100644 --- a/src/com/pms/service/PartMngService.java +++ b/src/com/pms/service/PartMngService.java @@ -3232,48 +3232,25 @@ public class PartMngService extends BaseService { AtomicInteger emptyColCnt = new AtomicInteger(0); String noteMsg = ""; - int colIndex = 0; - - // 각 컬럼 파싱 (CSV: 수준, 품번, 품명, 수량, ...) - String level = getCsvValue(values, colIndex++, emptyColCnt); // 0: 수준 - String partNo = getCsvValue(values, colIndex++, emptyColCnt); // 1: 품번 - String partName = getCsvValue(values, colIndex++, emptyColCnt); // 2: 품명 - String qty = getCsvValue(values, colIndex++, emptyColCnt); // 3: 수량 - String itemQty = getCsvValue(values, colIndex++, emptyColCnt); // 4: 항목수량 - String material = getCsvValue(values, colIndex++, emptyColCnt); // 5: 재료 - String heatTreatmentHardness = getCsvValue(values, colIndex++, emptyColCnt); // 6: 열처리경도 - String heatTreatmentMethod = getCsvValue(values, colIndex++, emptyColCnt); // 7: 열처리방법 - String surfaceTreatment = getCsvValue(values, colIndex++, emptyColCnt); // 8: 표면처리 - String supplier = getCsvValue(values, colIndex++, emptyColCnt); // 9: 공급업체 - String partType = getCsvValue(values, colIndex++, emptyColCnt); // 10: 범주이름 - - // 수준으로부터 부모 품번 찾기 - String parentPartNo = ""; - if (!StringUtils.isBlank(level)) { - // 숫자만 있는 경우 (1, 2, 3, 4 등) - try { - int currentDepth = Integer.parseInt(level); - - // 현재 깊이의 품번 저장 (다음 행에서 참조할 수 있도록) - if (!StringUtils.isBlank(partNo)) { - currentDepthPartNoMap.put(currentDepth, partNo); - } - - // 부모 찾기: 바로 이전 깊이의 최신 품번 - if (currentDepth > 1) { - int parentDepth = currentDepth - 1; - if (currentDepthPartNoMap.containsKey(parentDepth)) { - parentPartNo = currentDepthPartNoMap.get(parentDepth); - } - } - } catch (NumberFormatException e) { - // 숫자가 아닌 경우 (1.1, 1.4.1 등) - 기존 로직 사용 - String parentLevel = getParentLevel(level); - if (!StringUtils.isBlank(parentLevel) && levelToPartNoMap.containsKey(parentLevel)) { - parentPartNo = levelToPartNoMap.get(parentLevel); - } - } - } + int colIndex = 0; + + // 각 컬럼 파싱 (CSV: 상태, 모품번, 품번, 품명, 수량, 항목수량, ...) + String level = getCsvValue(values, colIndex++, emptyColCnt); // 0: 상태(수준) + String parentPartNo = getCsvValue(values, colIndex++, emptyColCnt); // 1: 모품번 + String partNo = getCsvValue(values, colIndex++, emptyColCnt); // 2: 품번 + String partName = getCsvValue(values, colIndex++, emptyColCnt); // 3: 품명 + String qty = getCsvValue(values, colIndex++, emptyColCnt); // 4: 수량 + String itemQty = getCsvValue(values, colIndex++, emptyColCnt); // 5: 항목수량 + String material = getCsvValue(values, colIndex++, emptyColCnt); // 6: 재료 + String heatTreatmentHardness = getCsvValue(values, colIndex++, emptyColCnt); // 7: 열처리경도 + String heatTreatmentMethod = getCsvValue(values, colIndex++, emptyColCnt); // 8: 열처리방법 + String surfaceTreatment = getCsvValue(values, colIndex++, emptyColCnt); // 9: 표면처리 + String supplier = getCsvValue(values, colIndex++, emptyColCnt); // 10: 공급업체 + String partType = getCsvValue(values, colIndex++, emptyColCnt); // 11: 범주이름 + + // CSV에서 모품번을 직접 제공하므로 별도 처리 불필요 + // level은 상태(수준) 값으로 사용됨 + // parentPartNo는 이미 1번 컬럼에서 읽음 // 유효성 검증 if(!StringUtils.isBlank(parentPartNo) && rowIndex > 2) { @@ -4446,28 +4423,29 @@ public class PartMngService extends BaseService { insertMap.put("OBJID", CommonUtils.createObjId()); insertMap.put("BOM_REPORT_OBJID", objid); insertMap.put("PARENT_PART_NO", PARENT_PART_NO); - insertMap.put("PART_NO", PART_NO); - insertMap.put("PART_NAME", CommonUtils.checkNull((String)insertMap.get("PART_NAME"))); - insertMap.put("QTY", CommonUtils.checkNull((String)insertMap.get("QTY"))); - insertMap.put("UNIT", CommonUtils.checkNull((String)insertMap.get("UNIT"))); - insertMap.put("SPEC", CommonUtils.checkNull((String)insertMap.get("SPEC"))); - insertMap.put("MATERIAL", CommonUtils.checkNull((String)insertMap.get("MATERIAL"))); - insertMap.put("THICKNESS", CommonUtils.checkNull((String)insertMap.get("THICKNESS"))); - insertMap.put("WIDTH", CommonUtils.checkNull((String)insertMap.get("WIDTH"))); - insertMap.put("HEIGHT", CommonUtils.checkNull((String)insertMap.get("HEIGHT"))); - insertMap.put("OUT_DIAMETER", CommonUtils.checkNull((String)insertMap.get("OUT_DIAMETER"))); - insertMap.put("IN_DIAMETER", CommonUtils.checkNull((String)insertMap.get("IN_DIAMETER"))); - insertMap.put("LENGTH", CommonUtils.checkNull((String)insertMap.get("LENGTH"))); - insertMap.put("PART_TYPE", CommonUtils.checkNull((String)insertMap.get("PART_TYPE"))); - insertMap.put("REMARK", CommonUtils.checkNull((String)insertMap.get("REMARK"))); - insertMap.put("SUPPLY_CODE", CommonUtils.checkNull((String)insertMap.get("SUPPLY_CODE"))); - insertMap.put("MAKER", CommonUtils.checkNull((String)insertMap.get("MAKER"))); - insertMap.put("POST_PROCESSING", CommonUtils.checkNull((String)insertMap.get("POST_PROCESSING"))); - insertMap.put("HEAT_TREATMENT_HARDNESS", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_HARDNESS"))); - insertMap.put("HEAT_TREATMENT_METHOD", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_METHOD"))); - insertMap.put("SURFACE_TREATMENT", CommonUtils.checkNull((String)insertMap.get("SURFACE_TREATMENT"))); - insertMap.put("STATUS", "deploy"); // 엑셀 업로드 시 deploy 상태로 저장 - insertMap.put("WRITER", CommonUtils.checkNull((String)paramMap.get("CONNECTUSERID"))); + insertMap.put("PART_NO", PART_NO); + insertMap.put("PART_NAME", CommonUtils.checkNull((String)insertMap.get("PART_NAME"))); + insertMap.put("QTY", CommonUtils.checkNull((String)insertMap.get("QTY"))); + insertMap.put("ITEM_QTY", CommonUtils.checkNull((String)insertMap.get("ITEM_QTY"))); // 항목수량 추가 + insertMap.put("UNIT", CommonUtils.checkNull((String)insertMap.get("UNIT"))); + insertMap.put("SPEC", CommonUtils.checkNull((String)insertMap.get("SPEC"))); + insertMap.put("MATERIAL", CommonUtils.checkNull((String)insertMap.get("MATERIAL"))); + insertMap.put("THICKNESS", CommonUtils.checkNull((String)insertMap.get("THICKNESS"))); + insertMap.put("WIDTH", CommonUtils.checkNull((String)insertMap.get("WIDTH"))); + insertMap.put("HEIGHT", CommonUtils.checkNull((String)insertMap.get("HEIGHT"))); + insertMap.put("OUT_DIAMETER", CommonUtils.checkNull((String)insertMap.get("OUT_DIAMETER"))); + insertMap.put("IN_DIAMETER", CommonUtils.checkNull((String)insertMap.get("IN_DIAMETER"))); + insertMap.put("LENGTH", CommonUtils.checkNull((String)insertMap.get("LENGTH"))); + insertMap.put("PART_TYPE", CommonUtils.checkNull((String)insertMap.get("PART_TYPE"))); + insertMap.put("REMARK", CommonUtils.checkNull((String)insertMap.get("REMARK"))); + insertMap.put("SUPPLY_CODE", CommonUtils.checkNull((String)insertMap.get("SUPPLY_CODE"))); + insertMap.put("MAKER", CommonUtils.checkNull((String)insertMap.get("MAKER"))); + insertMap.put("POST_PROCESSING", CommonUtils.checkNull((String)insertMap.get("POST_PROCESSING"))); + insertMap.put("HEAT_TREATMENT_HARDNESS", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_HARDNESS"))); + insertMap.put("HEAT_TREATMENT_METHOD", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_METHOD"))); + insertMap.put("SURFACE_TREATMENT", CommonUtils.checkNull((String)insertMap.get("SURFACE_TREATMENT"))); + insertMap.put("STATUS", "deploy"); // 엑셀 업로드 시 deploy 상태로 저장 + insertMap.put("WRITER", CommonUtils.checkNull((String)paramMap.get("CONNECTUSERID"))); insertMap.put("CONTRACT_OBJID", CommonUtils.checkNull((String)paramMap.get("CONTRACT_OBJID"))); insertMap.put("PRODUCT_MGMT_OBJID", CommonUtils.checkNull((String)paramMap.get("product_mgmt_objid")));