From dfb25da7083076206d137c7ee609e179e155a42a Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 27 Feb 2026 14:08:22 +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=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/salesMng/purchaseListFormPopUp.jsp | 161 +++++++++--------- src/com/pms/mapper/salesMng.xml | 8 +- 2 files changed, 86 insertions(+), 83 deletions(-) diff --git a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp index e42704c..8dbd86a 100644 --- a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp @@ -1082,107 +1082,110 @@ function fn_save() { // 견적요청서 생성 function fn_createQuotationRequest() { - // 체크된 행 가져오기 - var checkedRows = []; - $('.rowCheck:checked').each(function() { - var row = $(this).closest('.tabulator-row'); - var rowData = _tabulGrid.getRow(row.attr('data-row')).getData(); - checkedRows.push(rowData); - }); - - // 체크된 항목이 없으면 전체 데이터 사용 - if(checkedRows.length === 0) { - checkedRows = _tabulGrid.getData(); - } - - if(checkedRows.length === 0) { - Swal.fire({ - title: '알림', - text: '견적요청서를 생성할 데이터가 없습니다.', - icon: 'warning' - }); - return; - } - - // 공급업체/가공업체가 입력된 항목 분류 - var supplyItems = []; // 공급업체가 입력된 항목 - var processingItems = []; // 가공업체가 입력된 항목 - - 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({ - originalObjids: originalObjids, - vendorObjid: vendorPm, - partNo: item.PART_NO, - partName: item.PART_NAME - }); - } - - if(processingVendor && processingVendor !== '') { - processingItems.push({ - originalObjids: originalObjids, - vendorObjid: processingVendor, - partNo: item.PART_NO, - partName: item.PART_NAME + // 서버 API에서 견적요청서 생성 가능 항목 직접 조회 (메인 리스트와 동일한 패턴) + $.ajax({ + url: "/salesMng/getPurchaseListForQuotation.do", + type: "POST", + data: { SALES_REQUEST_MASTER_OBJID: salesRequestMasterObjid }, + dataType: "json", + success: function(response) { + if(response.resultFlag === "S" && response.list && response.list.length > 0) { + fn_processQuotationRequestFromServer(response.list); + } else { + Swal.fire({ + title: '알림', + text: '견적요청서를 생성할 대상이 없습니다.\n(이미 생성된 견적요청서이거나, 공급업체/가공업체가 입력된 항목이 필요합니다)', + icon: 'warning' + }); + } + }, + error: function(xhr, status, error) { + console.error("구매리스트 조회 오류:", error); + Swal.fire({ + title: '오류', + text: '구매리스트 조회 중 오류가 발생했습니다.', + icon: 'error' }); } }); - - if(supplyItems.length === 0 && processingItems.length === 0) { - Swal.fire({ - title: '알림', - text: '공급업체 또는 가공업체가 입력된 항목이 없습니다.\n업체를 먼저 입력해주세요.', - icon: 'warning' - }); - return; - } - - // 업체별로 그룹화 +} + +function fn_processQuotationRequestFromServer(purchaseList) { var supplyVendorGroups = {}; var processingVendorGroups = {}; - - supplyItems.forEach(function(item) { - if(!supplyVendorGroups[item.vendorObjid]) { - supplyVendorGroups[item.vendorObjid] = []; + + purchaseList.forEach(function(item) { + var vendorPm = (item.VENDOR_PM || item.vendor_pm || '').toString(); + var processingVendor = (item.PROCESSING_VENDOR || item.processing_vendor || '').toString(); + var originalObjids = (item.ORIGINAL_OBJIDS || item.original_objids || item.OBJID || item.objid || '').toString(); + var vendorName = (item.VENDOR_NAME || item.vendor_name || '').toString(); + var processingVendorName = (item.PROCESSING_VENDOR_NAME || item.processing_vendor_name || '').toString(); + var canCreateSupply = (item.CAN_CREATE_SUPPLY || item.can_create_supply || '').toString(); + var canCreateProcessing = (item.CAN_CREATE_PROCESSING || item.can_create_processing || '').toString(); + + if(vendorPm !== '' && canCreateSupply === 'Y') { + if(!supplyVendorGroups[vendorPm]) { + supplyVendorGroups[vendorPm] = { vendorName: vendorName, parts: [] }; + } + supplyVendorGroups[vendorPm].parts.push(originalObjids); } - supplyVendorGroups[item.vendorObjid].push(item.originalObjids); - }); - - processingItems.forEach(function(item) { - if(!processingVendorGroups[item.vendorObjid]) { - processingVendorGroups[item.vendorObjid] = []; + + if(processingVendor !== '' && canCreateProcessing === 'Y') { + if(!processingVendorGroups[processingVendor]) { + processingVendorGroups[processingVendor] = { vendorName: processingVendorName, parts: [] }; + } + processingVendorGroups[processingVendor].parts.push(originalObjids); } - processingVendorGroups[item.vendorObjid].push(item.originalObjids); }); - - // 생성할 견적요청서 목록 표시 + var supplyCount = Object.keys(supplyVendorGroups).length; var processingCount = Object.keys(processingVendorGroups).length; var totalCount = supplyCount + processingCount; - - var confirmMsg = '견적요청서를 생성하시겠습니까?\n\n'; + + if(totalCount === 0) { + Swal.fire({ + title: '알림', + text: '견적요청서를 생성할 대상이 없습니다.\n(이미 생성된 견적요청서이거나, 공급업체/가공업체가 입력된 항목이 필요합니다)', + icon: 'warning' + }); + return; + } + + var confirmHtml = '
'; if(supplyCount > 0) { - confirmMsg += '- 공급업체: ' + supplyCount + '개 업체\n'; + confirmHtml += '

공급업체: ' + supplyCount + '개 업체

'; + for(var vendorId in supplyVendorGroups) { + confirmHtml += '- ' + supplyVendorGroups[vendorId].vendorName + ' (' + supplyVendorGroups[vendorId].parts.length + '건)
'; + } } if(processingCount > 0) { - confirmMsg += '- 가공업체: ' + processingCount + '개 업체\n'; + confirmHtml += '

가공업체: ' + processingCount + '개 업체

'; + for(var vendorId in processingVendorGroups) { + confirmHtml += '- ' + processingVendorGroups[vendorId].vendorName + ' (' + processingVendorGroups[vendorId].parts.length + '건)
'; + } } - confirmMsg += '\n총 ' + totalCount + '개의 견적요청서가 생성됩니다.'; - + confirmHtml += '
'; + Swal.fire({ title: '견적요청서 생성', - text: confirmMsg, + html: '

' + totalCount + '개의 견적요청서가 생성됩니다.

' + confirmHtml, icon: 'question', showCancelButton: true, confirmButtonText: '생성', - cancelButtonText: '취소' + cancelButtonText: '취소', + width: '500px' }).then((result) => { if(result.isConfirmed) { - fn_executeCreateQuotationRequest(supplyVendorGroups, processingVendorGroups); + // 기존 fn_executeCreateQuotationRequest에 맞게 변환 + var supplyGroups = {}; + for(var vendorId in supplyVendorGroups) { + supplyGroups[vendorId] = supplyVendorGroups[vendorId].parts; + } + var processingGroups = {}; + for(var vendorId in processingVendorGroups) { + processingGroups[vendorId] = processingVendorGroups[vendorId].parts; + } + fn_executeCreateQuotationRequest(supplyGroups, processingGroups); } }); } diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 2545a63..b871d17 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -5499,14 +5499,14 @@ ORDER BY V.PATH2 CASE WHEN G.VENDOR_PM IS NOT NULL AND G.VENDOR_PM != '' AND NOT EXISTS ( SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID - WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID + WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = G.OBJID AND QRM.VENDOR_TYPE = 'SUPPLY' AND QRM.VENDOR_OBJID::VARCHAR = G.VENDOR_PM ) THEN 'Y' ELSE 'N' END AS CAN_CREATE_SUPPLY, CASE WHEN G.PROCESSING_VENDOR IS NOT NULL AND G.PROCESSING_VENDOR != '' AND NOT EXISTS ( SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID - WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID + WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = G.OBJID AND QRM.VENDOR_TYPE = 'PROCESSING' AND QRM.VENDOR_OBJID::VARCHAR = G.PROCESSING_VENDOR ) THEN 'Y' ELSE 'N' END AS CAN_CREATE_PROCESSING @@ -5515,7 +5515,7 @@ ORDER BY V.PATH2 (G.VENDOR_PM IS NOT NULL AND G.VENDOR_PM != '' AND NOT EXISTS ( SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID - WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID + WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = G.OBJID AND QRM.VENDOR_TYPE = 'SUPPLY' AND QRM.VENDOR_OBJID::VARCHAR = G.VENDOR_PM )) @@ -5523,7 +5523,7 @@ ORDER BY V.PATH2 (G.PROCESSING_VENDOR IS NOT NULL AND G.PROCESSING_VENDOR != '' AND NOT EXISTS ( SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID - WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID + WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = G.OBJID AND QRM.VENDOR_TYPE = 'PROCESSING' AND QRM.VENDOR_OBJID::VARCHAR = G.PROCESSING_VENDOR ))