From 2467b34bd0db5f4ff27b1f577b75936025da6e53 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 27 Mar 2026 14:15:47 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=9C=ED=92=88=EA=B5=AC=EB=B6=84=20contract?= =?UTF-8?q?=5Fmgmt=20->=20contract=5Fitem=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/contractMgmt/orderMgmtList.jsp | 2 +- .../contractMgmt/orderRegistFormPopup.jsp | 40 +++++++++++++------ src/com/pms/mapper/project.xml | 28 ++++++++----- .../SalesNcollectMgmtController.java | 9 ++++- .../service/ContractMgmtService.java | 32 +++++++++------ 5 files changed, 74 insertions(+), 37 deletions(-) diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index cf4522e..97903c1 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -827,7 +827,7 @@ function fn_openOrderConfirmPopup(contractObjId, currentStatus){ fn_search(); }); } else { - Swal.fire("수주확정 저장 중 오류가 발생했습니다."); + Swal.fire("수주확정 저장 중 오류가 발생했습니다.\n" + (data.message || "")); } }, error: function(){ diff --git a/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp b/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp index 5065589..419701b 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp @@ -169,7 +169,7 @@ // 품목이 없으면 메시지 표시 if($("#itemListBody tr.item-row").length == 0) { - $("#itemListBody").html('품목 추가 버튼을 클릭하여 품목을 등록하세요.'); + $("#itemListBody").html('품목 추가 버튼을 클릭하여 품목을 등록하세요.'); } } } @@ -254,6 +254,12 @@ var html = ''; html += '' + (i + 1) + ''; + // 제품구분 드롭다운 + html += ''; + html += ''; + html += ''; html += ''; html += ''; html += ''; @@ -281,6 +287,11 @@ $("#itemListBody").append(html); + // 제품구분 드롭다운 초기화 (견적요청에서 저장된 값으로 세팅) + var savedProduct = item.PRODUCT || ''; + fnc_getCodeListAppend("0000001", "PRODUCT_" + itemId, savedProduct); + $("#PRODUCT_" + itemId).select2({ width: '100%' }); + // 콤마 추가 (수량은 정수, 금액은 소수점 2자리) $("#" + itemId + " .item-quantity").val(addCommaInt(removeComma($("#" + itemId + " .item-quantity").val()))); $("#" + itemId + " .item-unit-price").val(addComma($("#" + itemId + " .item-unit-price").val())); @@ -351,6 +362,7 @@ var $row = $(this); items.push({ contractItemObjId: $row.find(".item-contract-item-objid").val(), // CONTRACT_ITEM의 OBJID + product: $row.find(".item-product").val(), // 제품구분 partObjId: $row.find(".item-part-objid").val(), partNo: $row.find(".item-part-no").val(), partName: $row.find(".item-part-name").val(), @@ -490,25 +502,27 @@
- - - - - - - - - - + + + + + + + + + + + + - + @@ -518,7 +532,7 @@ - diff --git a/src/com/pms/mapper/project.xml b/src/com/pms/mapper/project.xml index bac22cc..8160011 100644 --- a/src/com/pms/mapper/project.xml +++ b/src/com/pms/mapper/project.xml @@ -7420,7 +7420,7 @@ SELECT ,CONTRACT_OBJID ,CATEGORY_CD ,CUSTOMER_OBJID - ,PRODUCT + ,PRODUCT ,CUSTOMER_PROJECT_NAME ,STATUS_CD ,DUE_DATE @@ -7479,7 +7479,7 @@ SELECT ,#{objId} ,CATEGORY_CD ,CUSTOMER_OBJID - ,PRODUCT + ,COALESCE(#{product}, PRODUCT) ,CUSTOMER_PROJECT_NAME ,STATUS_CD ,DUE_DATE @@ -7529,8 +7529,8 @@ SELECT WHEN '판매' THEN 'S' ELSE 'T' END || '-' || - -- 제품구분 코드 (PRODUCT를 약어로 매핑) - CASE CODE_NAME(PRODUCT) + -- 제품구분 코드 (품목별 PRODUCT를 약어로 매핑, 없으면 마스터 PRODUCT) + CASE CODE_NAME(COALESCE(#{product}, PRODUCT)) WHEN 'Machine' THEN 'MC' WHEN 'A/S' THEN 'AS' WHEN 'D/S' THEN 'DS' @@ -7539,7 +7539,7 @@ SELECT WHEN 'A/C' THEN 'AC' WHEN 'W/M' THEN 'WM' WHEN '기타' THEN '기타' - ELSE REPLACE(CODE_NAME(PRODUCT), '/', '') + ELSE REPLACE(CODE_NAME(COALESCE(#{product}, PRODUCT)), '/', '') END || '-' || -- 날짜 (YYMMDD) TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-' || @@ -7559,7 +7559,7 @@ SELECT WHEN '판매' THEN 'S' ELSE 'T' END || '-' || - CASE CODE_NAME(PRODUCT) + CASE CODE_NAME(COALESCE(#{product}, PRODUCT)) WHEN 'Machine' THEN 'MC' WHEN 'A/S' THEN 'AS' WHEN 'D/S' THEN 'DS' @@ -7568,7 +7568,7 @@ SELECT WHEN 'A/C' THEN 'AC' WHEN 'W/M' THEN 'WM' WHEN '기타' THEN '기타' - ELSE REPLACE(CODE_NAME(PRODUCT), '/', '') + ELSE REPLACE(CODE_NAME(COALESCE(#{product}, PRODUCT)), '/', '') END || '-' || TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-%' ), @@ -7766,11 +7766,21 @@ SELECT MANUFACTURE_PLANT = #{manufacture_plant}, - QUANTITY = #{quantity} + QUANTITY = #{quantity}, + + + PRODUCT = #{product} WHERE CONTRACT_OBJID = #{objId} - AND PART_OBJID = #{part_objid} + + + AND CONTRACT_ITEM_OBJID = #{contract_item_objid} + + + AND PART_OBJID = #{part_objid} + + diff --git a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java index 93520cd..9679070 100644 --- a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java +++ b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java @@ -302,8 +302,15 @@ public class SalesNcollectMgmtController { contractParam.put("objId", contractObjId); Map contractInfo = commonService.selectOne("contractMgmt.getContractInfo", request, contractParam); - // PROJECT_MGMT에서 품번/품명/S/N/요청납기/고객요청사항/반납사유 조회 + // PROJECT_MGMT에서 품번/품명/S/N/요청납기/고객요청사항/반납사유/제품구분 조회 if(projectInfo != null) { + // 제품구분 (프로젝트에 저장된 품목별 제품구분 우선) + Object projProduct = projectInfo.get("product") != null ? projectInfo.get("product") : projectInfo.get("PRODUCT"); + Object projProductName = projectInfo.get("product_name") != null ? projectInfo.get("product_name") : projectInfo.get("PRODUCT_NAME"); + if(projProduct != null && !"".equals(projProduct.toString())) { + contractInfo.put("PRODUCT", projProduct); + contractInfo.put("PRODUCT_NAME", projProductName); + } // 품번 if(contractInfo.get("PART_NO") == null || "".equals(contractInfo.get("PART_NO"))) { contractInfo.put("PART_NO", projectInfo.get("part_no") != null ? projectInfo.get("part_no") : projectInfo.get("PART_NO")); diff --git a/src/com/pms/salesmgmt/service/ContractMgmtService.java b/src/com/pms/salesmgmt/service/ContractMgmtService.java index 62a4391..3b44642 100644 --- a/src/com/pms/salesmgmt/service/ContractMgmtService.java +++ b/src/com/pms/salesmgmt/service/ContractMgmtService.java @@ -2893,6 +2893,7 @@ private String encodeImageToBase64(String imagePath) { String orderTotalAmount = item.get("orderTotalAmount") != null ? item.get("orderTotalAmount").toString().replace(",", "") : "0"; itemMap.put("contractItemObjId", item.get("contractItemObjId") != null ? item.get("contractItemObjId").toString() : ""); + itemMap.put("product", item.get("product") != null ? item.get("product").toString() : ""); itemMap.put("orderQuantity", item.get("orderQuantity") != null ? item.get("orderQuantity").toString() : ""); itemMap.put("orderUnitPrice", item.get("orderUnitPrice") != null ? item.get("orderUnitPrice").toString() : ""); itemMap.put("orderSupplyPrice", orderSupplyPrice); @@ -2928,18 +2929,16 @@ private String encodeImageToBase64(String imagePath) { // 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영 resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); if(resultList != null) { - // 제품구분 확인 - Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap); - contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo); - String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : ""; - boolean isMachine = "0000928".equals(product_cd); - paramMap.put("contractObjId", contract_objid); List contractItemsRaw2 = sqlSession.selectList("contractMgmt.getContractItems", paramMap); List> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw2); if(contractItems != null && !contractItems.isEmpty()) { for(Map item : contractItems) { + // 품목별 제품구분 판단 + String itemProductCd = CommonUtils.checkNull(item.get("PRODUCT")); + boolean isMachine = "0000928".equals(itemProductCd); + Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY"); int itemQuantity = 1; try { @@ -2949,6 +2948,7 @@ private String encodeImageToBase64(String imagePath) { } Map updateParam = new HashMap(); updateParam.putAll(paramMap); + updateParam.put("contract_item_objid", String.valueOf(item.get("OBJID"))); updateParam.put("part_objid", item.get("PART_OBJID")); if(isMachine) { updateParam.remove("quantity"); @@ -2956,6 +2956,7 @@ private String encodeImageToBase64(String imagePath) { updateParam.put("quantity", String.valueOf(itemQuantity)); } updateParam.put("due_date", item.get("DUE_DATE")); + updateParam.put("product", itemProductCd); sqlSession.update("project.ModifyProjectByContract", updateParam); } } else { @@ -3005,13 +3006,7 @@ private String encodeImageToBase64(String imagePath) { Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap); contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo); - String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : ""; String category_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("CATEGORY_CD")) : ""; - boolean isMachine = "0000928".equals(product_cd); - - if(isMachine) { - System.out.println("[수주확정] 제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성"); - } // 품목별로 프로젝트 생성 또는 업데이트 paramMap.put("contractObjId", objId); @@ -3019,9 +3014,13 @@ private String encodeImageToBase64(String imagePath) { List> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw); if(contractItems != null && !contractItems.isEmpty()) { - System.out.println("[수주확정] 품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : "")); + System.out.println("[수주확정] 품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작"); for(Map item : contractItems) { + // 품목별 제품구분 판단 + String itemProductCd = CommonUtils.checkNull(item.get("PRODUCT")); + boolean isMachine = "0000928".equals(itemProductCd); + // 수량 가져오기 (소수점 형태 "2.00"도 처리) Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY"); int itemQuantity = 1; @@ -3034,6 +3033,10 @@ private String encodeImageToBase64(String imagePath) { // Machine인 경우 수량만큼 반복, 아니면 1번만 실행 int loopCount = (isMachine && !hasProject) ? itemQuantity : 1; + if(isMachine) { + System.out.println("[수주확정] 제품구분: Machine(0000928) - 품번: " + item.get("PART_NO") + ", 수량 " + itemQuantity + "만큼 프로젝트 생성"); + } + for(int q = 0; q < loopCount; q++) { if(!hasProject) { // 프로젝트가 없으면 모든 품목에 대해 생성 @@ -3047,6 +3050,8 @@ private String encodeImageToBase64(String imagePath) { projectParam.put("part_objid", item.get("PART_OBJID")); projectParam.put("part_no", item.get("PART_NO")); projectParam.put("part_name", item.get("PART_NAME")); + // 품목별 제품구분 전달 (PROJECT_NO 생성 및 PRODUCT 컬럼에 사용) + projectParam.put("product", itemProductCd); // Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량 projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity)); projectParam.put("due_date", item.get("DUE_DATE")); @@ -3070,6 +3075,7 @@ private String encodeImageToBase64(String imagePath) { // 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만) Map updateParam = new HashMap(); updateParam.putAll(paramMap); + updateParam.put("contract_item_objid", String.valueOf(item.get("OBJID"))); updateParam.put("part_objid", item.get("PART_OBJID")); // Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지) if(isMachine) {
No제품구분 * 품번 품명 S/N 수주수량 *수주단가 수주단가 수주공급가액 수주부가세 수주총액
+ 견적요청에 등록된 품목이 자동으로 표시됩니다.