From 89d4d1d4e763e5b82c0404329d68ad1079feb536 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 24 Feb 2026 09:50:26 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=9A=94=EC=B2=AD=EC=84=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20=EB=8F=99=EC=9D=BC=20?= =?UTF-8?q?=ED=92=88=EB=B2=88=20=EA=B7=B8=EB=A3=B9=ED=95=91=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getPurchaseListForQuotationFromMBom: CTE로 동일 품번 GROUP BY 적용 - getGroupedSalesRequestPartInfo 신규: ORIGINAL_OBJIDS 기반 합산 조회 - createQuotationRequest: 그룹핑된 데이터로 견적요청서 상세 생성 - purchaseListFormPopUp.jsp, salesRequestMngRegList.jsp: ORIGINAL_OBJIDS 전달 - insertProposalPartFromMBom/Processing: MATERIAL_YN 컬럼 추가 - SalesMngService: RAW_MATERIAL_NO 기반 MATERIAL_YN 판별 로직 Co-authored-by: Cursor --- .../view/salesMng/purchaseListFormPopUp.jsp | 9 +- .../view/salesMng/salesRequestMngRegList.jsp | 9 +- src/com/pms/mapper/salesMng.xml | 151 ++++++++++++------ .../salesmgmt/service/SalesMngService.java | 55 ++++--- 4 files changed, 134 insertions(+), 90 deletions(-) diff --git a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp index 9636055..9690de4 100644 --- a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp @@ -1061,10 +1061,11 @@ function fn_createQuotationRequest() { checkedRows.forEach(function(item) { var vendorPm = item.VENDOR_PM || ''; var processingVendor = item.PROCESSING_VENDOR || ''; + var originalObjids = item.ORIGINAL_OBJIDS || item.OBJID; if(vendorPm && vendorPm !== '') { supplyItems.push({ - objid: item.OBJID, + originalObjids: originalObjids, vendorObjid: vendorPm, partNo: item.PART_NO, partName: item.PART_NAME @@ -1073,7 +1074,7 @@ function fn_createQuotationRequest() { if(processingVendor && processingVendor !== '') { processingItems.push({ - objid: item.OBJID, + originalObjids: originalObjids, vendorObjid: processingVendor, partNo: item.PART_NO, partName: item.PART_NAME @@ -1098,14 +1099,14 @@ function fn_createQuotationRequest() { if(!supplyVendorGroups[item.vendorObjid]) { supplyVendorGroups[item.vendorObjid] = []; } - supplyVendorGroups[item.vendorObjid].push(item.objid); + supplyVendorGroups[item.vendorObjid].push(item.originalObjids); }); processingItems.forEach(function(item) { if(!processingVendorGroups[item.vendorObjid]) { processingVendorGroups[item.vendorObjid] = []; } - processingVendorGroups[item.vendorObjid].push(item.objid); + processingVendorGroups[item.vendorObjid].push(item.originalObjids); }); // 생성할 견적요청서 목록 표시 diff --git a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp index b933c9f..6ef76f4 100644 --- a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp +++ b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp @@ -893,14 +893,12 @@ function fn_processQuotationRequestCreation(salesRequestObjid, purchaseList) { // 대소문자 모두 처리 (서버에서 소문자로 반환될 수 있음) var vendorPm = fnc_checkNull(item.VENDOR_PM || item.vendor_pm); var processingVendor = fnc_checkNull(item.PROCESSING_VENDOR || item.processing_vendor); - var objid = fnc_checkNull(item.OBJID || item.objid); + var originalObjids = fnc_checkNull(item.ORIGINAL_OBJIDS || item.original_objids || item.OBJID || item.objid); var vendorName = fnc_checkNull(item.VENDOR_NAME || item.vendor_name); var processingVendorName = fnc_checkNull(item.PROCESSING_VENDOR_NAME || item.processing_vendor_name); - // 견적요청서 생성 가능 여부 플래그 var canCreateSupply = fnc_checkNull(item.CAN_CREATE_SUPPLY || item.can_create_supply); var canCreateProcessing = fnc_checkNull(item.CAN_CREATE_PROCESSING || item.can_create_processing); - // 공급업체 견적요청서 생성 가능한 경우 if(vendorPm !== '' && canCreateSupply === 'Y') { if(!supplyVendorGroups[vendorPm]) { supplyVendorGroups[vendorPm] = { @@ -908,10 +906,9 @@ function fn_processQuotationRequestCreation(salesRequestObjid, purchaseList) { parts: [] }; } - supplyVendorGroups[vendorPm].parts.push(objid); + supplyVendorGroups[vendorPm].parts.push(originalObjids); } - // 가공업체 견적요청서 생성 가능한 경우 if(processingVendor !== '' && canCreateProcessing === 'Y') { if(!processingVendorGroups[processingVendor]) { processingVendorGroups[processingVendor] = { @@ -919,7 +916,7 @@ function fn_processQuotationRequestCreation(salesRequestObjid, purchaseList) { parts: [] }; } - processingVendorGroups[processingVendor].parts.push(objid); + processingVendorGroups[processingVendor].parts.push(originalObjids); } }); diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 41c86ce..917ec11 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -4956,6 +4956,35 @@ ORDER BY V.PATH2 WHERE MD.OBJID = #{OBJID} + + + @@ -5301,71 +5330,89 @@ ORDER BY V.PATH2 WHERE MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID} - + diff --git a/src/com/pms/salesmgmt/service/SalesMngService.java b/src/com/pms/salesmgmt/service/SalesMngService.java index b55c19e..c39f1b5 100644 --- a/src/com/pms/salesmgmt/service/SalesMngService.java +++ b/src/com/pms/salesmgmt/service/SalesMngService.java @@ -11,6 +11,7 @@ package com.pms.salesmgmt.service; import java.io.FileInputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; @@ -2382,54 +2383,52 @@ public class SalesMngService { sqlSession.insert("salesMng.insertQuotationRequestMaster", quotationMaster); // 4. 선택된 품목들로 견적요청서 상세 생성 - List partObjids = new ArrayList(); + // PART_OBJIDS: 각 항목이 ORIGINAL_OBJIDS (콤마구분 MBOM_DETAIL.OBJID) 형태 + List partOriginalObjidsList = new ArrayList(); if(partObjidsJson != null && !partObjidsJson.isEmpty()) { org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper(); - partObjids = mapper.readValue(partObjidsJson, List.class); + partOriginalObjidsList = mapper.readValue(partObjidsJson, List.class); } - for(String partObjid : partObjids) { - // 구매리스트 품목 정보 조회 + for(String originalObjids : partOriginalObjidsList) { + // ORIGINAL_OBJIDS를 개별 OBJID 리스트로 분리하여 그룹핑 조회 + List objidList = Arrays.asList(originalObjids.split(",")); + Map partParam = new HashMap(); - partParam.put("OBJID", partObjid); - Map partInfo = (Map)sqlSession.selectOne("salesMng.getSalesRequestPartInfo", partParam); + partParam.put("OBJID_LIST", objidList); + Map partInfo = (Map)sqlSession.selectOne("salesMng.getGroupedSalesRequestPartInfo", partParam); if(partInfo != null) { Map detailParam = new HashMap(); detailParam.put("OBJID", CommonUtils.createObjId()); detailParam.put("QUOTATION_REQUEST_MASTER_OBJID", quotationMasterObjid); - detailParam.put("SALES_REQUEST_PART_OBJID", partObjid); // MBOM_DETAIL.OBJID + detailParam.put("SALES_REQUEST_PART_OBJID", partInfo.get("OBJID")); detailParam.put("PART_OBJID", partInfo.get("PART_OBJID")); - // 업체유형에 따라 다른 정보 저장 (단가는 0으로, 견적 수신 후 입력) if("PROCESSING".equals(vendorType)) { - // 가공업체: 품번, 품명, 제작수량 detailParam.put("PART_NO", partInfo.get("PART_NO")); detailParam.put("PART_NAME", partInfo.get("PART_NAME")); detailParam.put("RAW_MATERIAL", ""); detailParam.put("SIZE", ""); detailParam.put("QTY", partInfo.get("PRODUCTION_QTY")); - } else { - // 공급업체: 소재품번 유무에 따라 분기 - String rawMaterialNo = CommonUtils.checkNull(partInfo.get("RAW_MATERIAL_NO")); - - if(!rawMaterialNo.isEmpty()) { - // 소재품번이 있는 경우: 소재품번, 소재재질, 규격, 발주수량 - detailParam.put("PART_NO", partInfo.get("RAW_MATERIAL_NO")); - detailParam.put("PART_NAME", partInfo.get("RAW_MATERIAL")); - detailParam.put("RAW_MATERIAL", partInfo.get("RAW_MATERIAL")); - detailParam.put("SIZE", partInfo.get("SIZE")); - detailParam.put("QTY", partInfo.get("PO_QTY")); } else { - // 소재품번이 없는 경우: 부품품번, 부품명, 제작수량 - detailParam.put("PART_NO", partInfo.get("PART_NO")); - detailParam.put("PART_NAME", partInfo.get("PART_NAME")); - detailParam.put("RAW_MATERIAL", ""); - detailParam.put("SIZE", ""); - detailParam.put("QTY", partInfo.get("PRODUCTION_QTY")); + String rawMaterialNo = CommonUtils.checkNull(partInfo.get("RAW_MATERIAL_NO")); + + if(!rawMaterialNo.isEmpty()) { + detailParam.put("PART_NO", partInfo.get("RAW_MATERIAL_NO")); + detailParam.put("PART_NAME", partInfo.get("RAW_MATERIAL")); + detailParam.put("RAW_MATERIAL", partInfo.get("RAW_MATERIAL")); + detailParam.put("SIZE", partInfo.get("SIZE")); + detailParam.put("QTY", partInfo.get("PO_QTY")); + } else { + detailParam.put("PART_NO", partInfo.get("PART_NO")); + detailParam.put("PART_NAME", partInfo.get("PART_NAME")); + detailParam.put("RAW_MATERIAL", ""); + detailParam.put("SIZE", ""); + detailParam.put("QTY", partInfo.get("PRODUCTION_QTY")); + } } - } - detailParam.put("UNIT_PRICE", 0); // 단가는 견적 수신 후 입력 + detailParam.put("UNIT_PRICE", 0); detailParam.put("REMARK", ""); sqlSession.insert("salesMng.insertQuotationRequestDetail", detailParam);