From e017520b6096dd2ad63421f7d5bb8c67e96c0994 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Fri, 13 Mar 2026 17:36:06 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=EC=98=81=EC=97=85=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=86=8C=EC=88=98=EC=A0=90=202=EC=9E=90?= =?UTF-8?q?=EB=A6=AC=20=ED=91=9C=EC=8B=9C=20=EB=B0=8F=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=20=EC=A0=95=ED=99=95=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 견적/주문서/판매관리 전 페이지 금액 필드 소수점 2자리 + 천단위 콤마 표시 - parseInt → parseFloat, Math.round 제거로 소수점 계산 정확성 확보 - estimateTemplate1 fn_save() 소수점 제거 버그 수정 (/[^0-9]/g → /[^0-9.]/g) - contractMgmt.xml, salesNcollectMgmt.xml VARCHAR→NUMERIC CAST 시 REPLACE 안전 처리 - EST_TOTAL_AMOUNT_KRW 환율 변경 시 동적 재계산 (SQL 쿼리 수정) Made-with: Cursor --- .../view/contractMgmt/estimateTemplate1.jsp | 30 +++++------ .../view/contractMgmt/estimateTemplate2.jsp | 22 ++++---- .../view/contractMgmt/orderFormView.jsp | 2 +- .../view/contractMgmt/orderMgmtList.jsp | 10 ++-- .../contractMgmt/orderRegistFormPopup.jsp | 18 +++---- .../salesmgmt/salesMgmt/revenueMgmtList.jsp | 16 +++--- .../salesmgmt/salesMgmt/salesMgmtList.jsp | 18 +++---- .../salesMgmt/transactionStatementForm.jsp | 8 +-- src/com/pms/salesmgmt/mapper/contractMgmt.xml | 28 +++++----- .../salesmgmt/mapper/salesNcollectMgmt.xml | 53 +++++++++++-------- 10 files changed, 109 insertions(+), 96 deletions(-) diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateTemplate1.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateTemplate1.jsp index c415e67..afaf3e8 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateTemplate1.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateTemplate1.jsp @@ -369,13 +369,13 @@ $(function(){ fn_calculateTotal(); // 합계 재계산 }); - // 단가 입력 완료 시 콤마 자동 추가 + // 단가 입력 완료 시 포맷 적용 $(document).on("blur", ".item-price", function(){ var val = $(this).val().replace(/,/g, ""); if(!isNaN(val) && val !== "") { - $(this).val(addComma(val)); + $(this).val(Number(val).toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 2})); } - fn_calculateTotal(); // blur 시에도 합계 재계산 + fn_calculateTotal(); }); // 단가 입력 시 숫자만 입력 가능하도록 제한 및 실시간 콤마 처리 @@ -384,8 +384,8 @@ $(function(){ var originalVal = $(this).val(); var commasBefore = (originalVal.substring(0, cursorPos).match(/,/g) || []).length; - // 콤마 제거 후 숫자가 아닌 문자 제거 - var val = originalVal.replace(/,/g, "").replace(/[^0-9]/g, ""); + // 콤마 제거 후 숫자와 소수점 외 문자 제거 + var val = originalVal.replace(/,/g, "").replace(/[^0-9.]/g, ""); // 값 설정 (빈 문자열 포함) if(val !== "") { @@ -468,7 +468,7 @@ function fn_calculateAmount(row) { var qty = row.find(".item-qty").val().replace(/,/g, "") || "0"; var price = row.find(".item-price").val().replace(/,/g, "") || "0"; - var amount = parseInt(qty) * parseInt(price); + var amount = parseFloat(qty) * parseFloat(price); if(!isNaN(amount)) { var currencySymbol = getCurrencySymbol(); row.find(".item-amount").val(currencySymbol + addComma(amount)); @@ -482,9 +482,9 @@ function fn_calculateTotal() { // 품목 행만 순회 (계 행, 원화환산 행, 비고 행, 참조사항 행, 회사명 행 제외) $("#itemsTableBody tr").not(".total-row, .total-krw-row, .remarks-row, .notes-row, .footer-row").each(function(){ var amount = $(this).find(".item-amount").val() || "0"; - // 모든 비숫자 문자 제거 (통화 기호, 콤마 등) - amount = amount.replace(/[^0-9]/g, ""); - var numAmount = parseInt(amount) || 0; + // 모든 비숫자 문자 제거 (통화 기호, 콤마 등, 소수점은 유지) + amount = amount.replace(/[^0-9.]/g, ""); + var numAmount = parseFloat(amount) || 0; total += numAmount; }); @@ -499,13 +499,13 @@ function fn_calculateTotal() { // 원화환산 공급가액 계산 function fn_calculateTotalKRW(total) { var totalKRW = total * g_exchangeRate; - $("#totalAmountKRW").text("₩" + addComma(Math.round(totalKRW))); + $("#totalAmountKRW").text("₩" + addComma(totalKRW)); } -// 콤마 추가 +// 금액 포맷 (소수점 2자리 + 천단위 콤마) function addComma(num) { - var regexp = /\B(?=(\d{3})+(?!\d))/g; - return num.toString().replace(regexp, ','); + if(num === '' || num === null || num === undefined) return ''; + return Number(num).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } // 통화 기호 반환 @@ -1262,8 +1262,8 @@ function fn_save() { specification: row.find(".item-spec").val() || "", quantity: quantity.replace(/[^0-9]/g, ""), // 숫자만 추출 unit: row.find(".item-unit").val() || "", - unit_price: unitPrice.replace(/[^0-9]/g, ""), // 숫자만 추출 - amount: amount.replace(/[^0-9]/g, ""), // 숫자만 추출 + unit_price: unitPrice.replace(/[^0-9.]/g, ""), + amount: amount.replace(/[^0-9.]/g, ""), note: row.find(".item-note").val() || "" }); }); diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateTemplate2.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateTemplate2.jsp index 0532eeb..c3dd8a7 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateTemplate2.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateTemplate2.jsp @@ -403,11 +403,11 @@ $(function(){ } } - // 숫자만 입력 가능하도록 제한 (unit_price, subtotal) + // 숫자와 소수점만 입력 가능하도록 제한 (unit_price, subtotal) $(document).on("keypress", ".item-price, .subtotal-amount", function(e) { - // 숫자(0-9), 백스페이스, 삭제, 탭, 엔터, 콤마만 허용 var charCode = (e.which) ? e.which : e.keyCode; - if (charCode != 8 && charCode != 9 && charCode != 13 && charCode != 44 && + // 숫자(0-9), 백스페이스, 삭제, 탭, 엔터, 콤마, 소수점(46) 허용 + if (charCode != 8 && charCode != 9 && charCode != 13 && charCode != 44 && charCode != 46 && (charCode < 48 || charCode > 57)) { e.preventDefault(); return false; @@ -508,7 +508,7 @@ function fn_calculateAmount(row) { var qty = row.find(".item-qty").val() || "1"; var price = row.find(".item-price").val().replace(/,/g, "") || "0"; - var amount = parseInt(qty) * parseInt(price); + var amount = parseFloat(qty) * parseFloat(price); if(!isNaN(amount)) { row.find(".item-amount").val(addComma(amount)); } @@ -520,7 +520,7 @@ function fn_calculateSubtotal(tbody) { tbody.find("tr:not(.category-row):not(.subtotal-row)").each(function() { var amount = $(this).find(".item-amount").val(); if(amount) { - var numAmount = parseInt(amount.replace(/,/g, "").replace(/-/g, "")); + var numAmount = parseFloat(amount.replace(/,/g, "").replace(/-/g, "")); if(!isNaN(numAmount)) { total += numAmount; } @@ -530,10 +530,10 @@ function fn_calculateSubtotal(tbody) { tbody.find(".subtotal-amount").val(addComma(total)); } -// 콤마 추가 +// 금액 포맷 (소수점 2자리 + 천단위 콤마) function addComma(num) { - var regexp = /\B(?=(\d{3})+(?!\d))/g; - return num.toString().replace(regexp, ','); + if(num === '' || num === null || num === undefined) return ''; + return Number(num).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } // 카테고리 추가 @@ -709,7 +709,7 @@ function fn_calculateTotal() { // 초음파 CNC Machine의 AMOUNT 값 추가 var cncAmount = $(".category-section[data-category='cnc_machine'] .item-amount").val(); if(cncAmount && cncAmount !== "") { - var numVal = parseInt(cncAmount.replace(/,/g, "")); + var numVal = parseFloat(cncAmount.replace(/,/g, "")); if(!isNaN(numVal)) { total += numVal; } @@ -719,7 +719,7 @@ function fn_calculateTotal() { $(".subtotal-amount").each(function() { var val = $(this).val(); if(val && val !== "" && val !== "-") { - var numVal = parseInt(val.replace(/,/g, "")); + var numVal = parseFloat(val.replace(/,/g, "")); if(!isNaN(numVal)) { total += numVal; } @@ -1000,7 +1000,7 @@ function fn_save() { // 원화 환산 (TOTAL_AMOUNT_KRW) var totalAmountKrw = ""; if(totalAmount && totalAmount !== "" && !isNaN(totalAmount)) { - totalAmountKrw = Math.round(parseFloat(totalAmount) * exchangeRate).toString(); + totalAmountKrw = (parseFloat(totalAmount) * exchangeRate).toFixed(2); } var formData = { diff --git a/WebContent/WEB-INF/view/contractMgmt/orderFormView.jsp b/WebContent/WEB-INF/view/contractMgmt/orderFormView.jsp index 22b6df1..cf21f4c 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderFormView.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderFormView.jsp @@ -374,7 +374,7 @@ function fn_renderOrderForm(info, items){ } function fn_fmt(n){ - return Number(n).toLocaleString(); + return Number(n).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index cac118e..6496295 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -250,7 +250,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 12. 부가세 @@ -266,7 +266,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 13. 총액 @@ -282,7 +282,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 14. 원화총액 @@ -290,7 +290,7 @@ var columns = [ formatter: function(cell) { var value = cell.getValue(); if(!value || value === '' || value === '0') return ''; - return '₩' + Number(value).toLocaleString(); + return '₩' + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 15. 주문서첨부 @@ -421,7 +421,7 @@ function fn_calculateTotalFromGrid(){ } console.log("✅ [주문서관리] 표시된 데이터 합계:", totalAmountKRW); - $("#totalAmount").text(Number(totalAmountKRW).toLocaleString()); + $("#totalAmount").text(Number(totalAmountKRW).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); } function _fnc_datepick(){ diff --git a/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp b/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp index ab33f75..ffaeed8 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp @@ -53,7 +53,7 @@ // 숫자 입력 필드에 콤마 자동 추가 및 금액 계산 $(document).on("keyup", "input:text[numberOnly]", function() { - $(this).val(addComma($(this).val().replace(/[^0-9]/g, ""))); + $(this).val(addComma($(this).val().replace(/[^0-9.]/g, ""))); var itemId = $(this).closest("tr").attr("id"); if(itemId) { @@ -95,10 +95,10 @@ fn_loadContractItems(); }); - // 콤마 추가 함수 + // 금액 포맷 (소수점 2자리 + 천단위 콤마) function addComma(data) { - if(!data) return ''; - return data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + if(!data && data !== 0) return ''; + return Number(data).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } // 콤마 제거 함수 @@ -148,15 +148,15 @@ // 부가세 입력 가능 (기본값: 공급가액 × 10%) // 공급가액 + 부가세 = 총액 (자동) function fn_calculateItemAmount(itemId) { - var quantity = parseInt(removeComma($("#" + itemId + " .item-quantity").val())) || 0; - var unitPrice = parseInt(removeComma($("#" + itemId + " .item-unit-price").val())) || 0; + var quantity = parseFloat(removeComma($("#" + itemId + " .item-quantity").val())) || 0; + var unitPrice = parseFloat(removeComma($("#" + itemId + " .item-unit-price").val())) || 0; // 공급가액 계산 var supplyPrice = quantity * unitPrice; $("#" + itemId + " .item-supply-price").val(addComma(supplyPrice)); // 부가세 자동 계산 (공급가액의 10%) - var vat = Math.round(supplyPrice * 0.1); + var vat = supplyPrice * 0.1; $("#" + itemId + " .item-vat").val(addComma(vat)); // 총액 계산 @@ -166,8 +166,8 @@ // 부가세 직접 입력 시 총액만 재계산 function fn_calculateTotalFromVat(itemId) { - var supplyPrice = parseInt(removeComma($("#" + itemId + " .item-supply-price").val())) || 0; - var vat = parseInt(removeComma($("#" + itemId + " .item-vat").val())) || 0; + var supplyPrice = parseFloat(removeComma($("#" + itemId + " .item-supply-price").val())) || 0; + var vat = parseFloat(removeComma($("#" + itemId + " .item-vat").val())) || 0; // 총액 계산 var totalAmount = supplyPrice + vat; diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp index 57441a3..b443c64 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp @@ -453,7 +453,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 11. 공급가액 (환종에 따라 표기) @@ -469,7 +469,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 12. 부가세 (환종에 따라 표기) @@ -485,7 +485,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 13. 총액 (환종에 따라 표기) @@ -501,7 +501,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 14. 원화총액 @@ -509,7 +509,7 @@ var columns = [ formatter: function(cell) { var value = cell.getValue(); if(!value || value === '' || value === '0') return ''; - return '₩' + Number(value).toLocaleString(); + return '₩' + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 15. 출하일 @@ -629,9 +629,9 @@ function fn_search(){ var vat = totals.total_vat || totals.TOTAL_VAT || 0; var amount = totals.total_amount || totals.TOTAL_AMOUNT || 0; - $("#totalSupplyPrice").text(Number(supplyPrice).toLocaleString()); - $("#totalVat").text(Number(vat).toLocaleString()); - $("#totalAmount").text(Number(amount).toLocaleString()); + $("#totalSupplyPrice").text(Number(supplyPrice).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); + $("#totalVat").text(Number(vat).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); + $("#totalAmount").text(Number(amount).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); } else { $("#totalSupplyPrice").text("0"); $("#totalVat").text("0"); diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp index 8981b1c..e270271 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp @@ -358,7 +358,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 13. 판매공급가액 @@ -374,7 +374,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 14. 부가세 @@ -390,7 +390,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 15. 판매총액 @@ -406,7 +406,7 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - return currencySymbol + Number(value).toLocaleString(); + return currencySymbol + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 16. 판매원화총액 @@ -414,7 +414,7 @@ var columns = [ formatter: function(cell) { var value = cell.getValue(); if(!value || value === '' || value === '0') return ''; - return '₩' + Number(value).toLocaleString(); + return '₩' + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 17. 잔량원화총액 @@ -422,7 +422,7 @@ var columns = [ formatter: function(cell) { var value = cell.getValue(); if(!value || value === '' || value === '0') return ''; - return '₩' + Number(value).toLocaleString(); + return '₩' + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 18. 수주상태 @@ -554,9 +554,9 @@ function fn_search(){ } // 합계 표시 - $("#totalSalesAmountKRW").text(Number(totalSalesAmountKRW).toLocaleString()); - $("#shippedAmountKRW").text(Number(shippedAmountKRW).toLocaleString()); - $("#notShippedAmountKRW").text(Number(notShippedAmountKRW).toLocaleString()); + $("#totalSalesAmountKRW").text(Number(totalSalesAmountKRW).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); + $("#shippedAmountKRW").text(Number(shippedAmountKRW).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); + $("#notShippedAmountKRW").text(Number(notShippedAmountKRW).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); // 페이징 HTML 업데이트 if(response.PAGE_HTML){ diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/transactionStatementForm.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/transactionStatementForm.jsp index 85e6228..49be94e 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/transactionStatementForm.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/transactionStatementForm.jsp @@ -709,7 +709,7 @@ function fn_loadSavedStatement(projectObjid, gridData) { row.append($("").text(quantity)); row.append($("").text(fn_num(item.isprice || item.ISPRICE || 0))); row.append($("").text(fn_num(supply))); - row.append($("").text(fn_num(Math.round(vat)))); + row.append($("").text(fn_num(vat))); tbody.append(row); } @@ -725,11 +725,11 @@ function fn_loadSavedStatement(projectObjid, gridData) { // 합계 업데이트 $("#totalQuantity").text(totalQuantity); $("#totalSupplyPrice").text(fn_num(totalSupply)); - $("#totalVat").text(fn_num(Math.round(totalVat))); + $("#totalVat").text(fn_num(totalVat)); var total = totalSupply + totalVat; $("#totalText").text(fn_numberToKorean(Math.round(total))); - $("#totalNum").text(fn_num(Math.round(total))); + $("#totalNum").text(fn_num(total)); // contenteditable 셀 변경 시 합계 자동 업데이트 fn_attachCellListeners(); @@ -963,7 +963,7 @@ function fn_recalculateTotal() { } function fn_num(n) { - return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return Number(n).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } // 숫자를 한글로 변환하는 함수 diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index ced9410..7153949 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -579,28 +579,32 @@ -- 최근 차수 견적서 합계 정보 ,(SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT ,CASE - WHEN T.EXCHANGE_RATE IS NOT NULL AND T.EXCHANGE_RATE != '' AND CAST(T.EXCHANGE_RATE AS NUMERIC) != 0 + WHEN T.EXCHANGE_RATE IS NOT NULL AND T.EXCHANGE_RATE != '' + AND REPLACE(T.EXCHANGE_RATE, ',', '') ~ '^\d+\.?\d*$' + AND CAST(REPLACE(T.EXCHANGE_RATE, ',', '') AS NUMERIC) != 0 THEN ROUND( - CAST(COALESCE((SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0') AS NUMERIC) - * CAST(T.EXCHANGE_RATE AS NUMERIC), 2 + CAST(REPLACE(COALESCE((SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0'), ',', '') AS NUMERIC) + * CAST(REPLACE(T.EXCHANGE_RATE, ',', '') AS NUMERIC), 2 ) - ELSE CAST(COALESCE((SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0') AS NUMERIC) + ELSE CAST(REPLACE(COALESCE((SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0'), ',', '') AS NUMERIC) END AS EST_TOTAL_AMOUNT_KRW -- 견적수량 (ESTIMATE_TEMPLATE_ITEM의 수량 합계) - ,(SELECT COALESCE(SUM(CAST(QUANTITY AS NUMERIC)), 0) FROM ESTIMATE_TEMPLATE_ITEM WHERE TEMPLATE_OBJID = (SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1)) AS ESTIMATE_QUANTITY + ,(SELECT COALESCE(SUM(CAST(REPLACE(QUANTITY, ',', '') AS NUMERIC)), 0) FROM ESTIMATE_TEMPLATE_ITEM WHERE TEMPLATE_OBJID = (SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1)) AS ESTIMATE_QUANTITY -- 수주 합계 정보 (CONTRACT_MGMT 테이블에 저장된 값 사용) ,T.ORDER_SUPPLY_PRICE AS ORDER_SUPPLY_PRICE_SUM ,T.ORDER_VAT AS ORDER_VAT_SUM ,T.ORDER_TOTAL_AMOUNT AS ORDER_TOTAL_AMOUNT_SUM -- 수주수량 (CONTRACT_MGMT의 QUANTITY 또는 CONTRACT_ITEM 합계) ,COALESCE( - NULLIF(T.QUANTITY, '')::NUMERIC, - (SELECT COALESCE(SUM(CAST(ORDER_QUANTITY AS NUMERIC)), 0) FROM CONTRACT_ITEM WHERE CONTRACT_OBJID = T.OBJID AND STATUS = 'ACTIVE') + NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::NUMERIC, + (SELECT COALESCE(SUM(CAST(REPLACE(ORDER_QUANTITY, ',', '') AS NUMERIC)), 0) FROM CONTRACT_ITEM WHERE CONTRACT_OBJID = T.OBJID AND STATUS = 'ACTIVE') ) AS ORDER_QUANTITY - ,CASE - WHEN T.ORDER_TOTAL_AMOUNT IS NOT NULL AND T.ORDER_TOTAL_AMOUNT != '' + ,CASE + WHEN T.ORDER_TOTAL_AMOUNT IS NOT NULL AND T.ORDER_TOTAL_AMOUNT != '' AND T.EXCHANGE_RATE IS NOT NULL AND T.EXCHANGE_RATE != '' - THEN CAST(T.ORDER_TOTAL_AMOUNT AS NUMERIC) * CAST(T.EXCHANGE_RATE AS NUMERIC) + AND REPLACE(T.ORDER_TOTAL_AMOUNT, ',', '') ~ '^\d+\.?\d*$' + AND REPLACE(T.EXCHANGE_RATE, ',', '') ~ '^\d+\.?\d*$' + THEN CAST(REPLACE(T.ORDER_TOTAL_AMOUNT, ',', '') AS NUMERIC) * CAST(REPLACE(T.EXCHANGE_RATE, ',', '') AS NUMERIC) ELSE 0 END AS ORDER_TOTAL_AMOUNT_KRW -- 품목 정보 요약 @@ -5732,7 +5736,7 @@ WHERE SELECT ETI.PART_OBJID, PM.PART_NO, - CAST(COALESCE(NULLIF(ETI.UNIT_PRICE, ''), '0') AS NUMERIC) AS CURRENT_PRICE + CAST(REPLACE(COALESCE(NULLIF(ETI.UNIT_PRICE, ''), '0'), ',', '') AS NUMERIC) AS CURRENT_PRICE FROM ESTIMATE_TEMPLATE ET INNER JOIN ESTIMATE_TEMPLATE_ITEM ETI ON ET.OBJID = ETI.TEMPLATE_OBJID LEFT JOIN PART_MNG PM ON ETI.PART_OBJID = PM.OBJID @@ -5747,7 +5751,7 @@ WHERE SELECT CI.PART_OBJID, COALESCE(PM.PART_NO, CI.PART_NO) AS PART_NO, - MAX(CAST(COALESCE(NULLIF(ETI.UNIT_PRICE, ''), '0') AS NUMERIC)) AS PREV_MAX_PRICE + MAX(CAST(REPLACE(COALESCE(NULLIF(ETI.UNIT_PRICE, ''), '0'), ',', '') AS NUMERIC)) AS PREV_MAX_PRICE FROM CONTRACT_MGMT CM INNER JOIN CONTRACT_ITEM CI ON CM.OBJID = CI.CONTRACT_OBJID AND CI.STATUS = 'ACTIVE' LEFT JOIN PART_MNG PM ON CI.PART_OBJID = PM.OBJID diff --git a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index b9b5571..b66e833 100644 --- a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -860,7 +860,7 @@ AND CIS.SERIAL_NO IS NOT NULL), SR.serial_no ) AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) AS ORDER_QUANTITY, -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT COALESCE( (SELECT CI.DUE_DATE @@ -897,12 +897,15 @@ COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, -- 잔량 계산: 수주수량 - sales_registration.sales_quantity - COALESCE(T.QUANTITY::numeric, 0) - COALESCE(SR.sales_quantity, 0) AS REMAINING_QUANTITY, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) - COALESCE(SR.sales_quantity, 0) AS REMAINING_QUANTITY, -- 잔량원화총액 계산: 잔량 * 판매단가 - (COALESCE(T.QUANTITY::numeric, 0) - COALESCE(SR.sales_quantity, 0)) * COALESCE(SR.sales_unit_price, 0) AS REMAINING_AMOUNT_KRW, + (COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) - COALESCE(SR.sales_quantity, 0)) * COALESCE(SR.sales_unit_price, 0) AS REMAINING_AMOUNT_KRW, COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, CODE_NAME(COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, - COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, + COALESCE(SR.sales_exchange_rate, + CASE WHEN REPLACE(COALESCE(T.CONTRACT_PRICE_CURRENCY, ''), ',', '') ~ '^\d+\.?\d*$' + THEN REPLACE(T.CONTRACT_PRICE_CURRENCY, ',', '')::numeric ELSE 0 END, + 0) AS SALES_EXCHANGE_RATE, COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, -- 출하일 (분할출하 포함): 엑셀 다운로드용 COALESCE( @@ -928,10 +931,10 @@ CASE WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) = 0 THEN '미판매' - WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(T.QUANTITY::numeric, 0) + WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) THEN '완판' WHEN COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) > 0 - AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(T.QUANTITY::numeric, 0) + AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) THEN '분할판매' ELSE '' END AS SALES_STATUS, @@ -1085,13 +1088,13 @@ - OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(T.QUANTITY::numeric, 0) - AND COALESCE(T.QUANTITY::numeric, 0) > 0) + OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) + AND COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) > 0) OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) > 0 - AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(T.QUANTITY::numeric, 0)) + AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0)) @@ -1276,13 +1279,13 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC - OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(T.QUANTITY::numeric, 0) - AND COALESCE(T.QUANTITY::numeric, 0) > 0) + OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) >= COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) + AND COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) > 0) OR (COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) > 0 - AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(T.QUANTITY::numeric, 0)) + AND COALESCE((SELECT SUM(sales_quantity) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0) COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0)) @@ -1566,7 +1569,7 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC AND CIS.SERIAL_NO IS NOT NULL), SR.serial_no ) AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) AS ORDER_QUANTITY, -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT COALESCE( (SELECT CI.DUE_DATE @@ -1598,7 +1601,7 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, -- 주문수량 (PROJECT_MGMT에서 가져오기) - 잔량 계산용 - COALESCE(T.QUANTITY::NUMERIC, 0) AS ORDER_QUANTITY, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::NUMERIC, 0) AS ORDER_QUANTITY, -- 판매수량 (sales_registration에서 가져오기) - 이미 판매한 수량 COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, @@ -1609,7 +1612,10 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY) AS SALES_CURRENCY, CODE_NAME(COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, - COALESCE(NULLIF(SR.sales_exchange_rate, 0), NULLIF(CM.EXCHANGE_RATE, '')::numeric, 0) AS SALES_EXCHANGE_RATE, + COALESCE(NULLIF(SR.sales_exchange_rate, 0), + CASE WHEN REPLACE(COALESCE(CM.EXCHANGE_RATE, ''), ',', '') ~ '^\d+\.?\d*$' + THEN REPLACE(CM.EXCHANGE_RATE, ',', '')::numeric ELSE 0 END, + 0) AS SALES_EXCHANGE_RATE, COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, @@ -1649,7 +1655,8 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC -- 환종 정보 CM.CONTRACT_CURRENCY AS SALES_CURRENCY, CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME, - COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE, + COALESCE(CASE WHEN REPLACE(COALESCE(CM.EXCHANGE_RATE, ''), ',', '') ~ '^\d+\.?\d*$' + THEN REPLACE(CM.EXCHANGE_RATE, ',', '')::NUMERIC ELSE 0 END, 0) AS SALES_EXCHANGE_RATE, -- 출하일 기본값: 오늘 날짜 TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD') AS SHIPPING_DATE, @@ -1696,7 +1703,8 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC -- 환종 정보 CM.CONTRACT_CURRENCY AS SALES_CURRENCY, CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME, - COALESCE(NULLIF(CM.EXCHANGE_RATE, '')::NUMERIC, 0) AS SALES_EXCHANGE_RATE, + COALESCE(CASE WHEN REPLACE(COALESCE(CM.EXCHANGE_RATE, ''), ',', '') ~ '^\d+\.?\d*$' + THEN REPLACE(CM.EXCHANGE_RATE, ',', '')::NUMERIC ELSE 0 END, 0) AS SALES_EXCHANGE_RATE, -- 출하일 기본값: 오늘 날짜 TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD') AS SHIPPING_DATE, @@ -2202,7 +2210,7 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC COALESCE(T.PART_NO, '') AS PART_NO, COALESCE(T.PART_NAME, '') AS PART_NAME, T.PART_OBJID, - COALESCE(T.QUANTITY::NUMERIC, 0) AS QUANTITY, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::NUMERIC, 0) AS QUANTITY, CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE, CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE, CODE_NAME(T.AREA_CD) AS NATION, @@ -2215,9 +2223,10 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC COALESCE(CM.PO_NO, '') AS PO_NO, COALESCE(CM.ORDER_DATE, '') AS ORDER_DATE, COALESCE((SELECT SUM(SR.SALES_QUANTITY) FROM SALES_REGISTRATION SR WHERE SR.PROJECT_NO = T.PROJECT_NO), 0) AS SALES_QUANTITY, - COALESCE(T.QUANTITY::NUMERIC, 0) - COALESCE((SELECT SUM(SR.SALES_QUANTITY) FROM SALES_REGISTRATION SR WHERE SR.PROJECT_NO = T.PROJECT_NO), 0) AS REMAINING_QUANTITY, - COALESCE(NULLIF(CM.ORDER_UNIT_PRICE, '')::NUMERIC, 0) AS ORDER_UNIT_PRICE, - COALESCE(NULLIF(CM.EXCHANGE_RATE, '')::NUMERIC, 1) AS EXCHANGE_RATE, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::NUMERIC, 0) - COALESCE((SELECT SUM(SR.SALES_QUANTITY) FROM SALES_REGISTRATION SR WHERE SR.PROJECT_NO = T.PROJECT_NO), 0) AS REMAINING_QUANTITY, + COALESCE(NULLIF(REPLACE(CM.ORDER_UNIT_PRICE, ',', ''), '')::NUMERIC, 0) AS ORDER_UNIT_PRICE, + COALESCE(CASE WHEN REPLACE(COALESCE(CM.EXCHANGE_RATE, ''), ',', '') ~ '^\d+\.?\d*$' + THEN REPLACE(CM.EXCHANGE_RATE, ',', '')::NUMERIC ELSE 1 END, 1) AS EXCHANGE_RATE, COALESCE(CM.CONTRACT_CURRENCY, '') AS CONTRACT_CURRENCY FROM PROJECT_MGMT T LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = T.CONTRACT_OBJID @@ -2393,7 +2402,7 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID AND CI.PART_OBJID = T.PART_OBJID AND CI.STATUS = 'ACTIVE' ), '') AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + COALESCE(NULLIF(REPLACE(T.QUANTITY, ',', ''), '')::numeric, 0) AS ORDER_QUANTITY, (SELECT CM.PO_NO FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PO_NO, COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE, COALESCE(SL.split_quantity, 0) AS SALES_QUANTITY, From b5045b45c24aa16c770f35c4b1c7ca62c73b8a34 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Mon, 16 Mar 2026 15:25:07 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EC=83=9D=EC=82=B0=EA=B3=84=ED=9A=8D&?= =?UTF-8?q?=EC=8B=A4=EC=A0=81=EA=B4=80=EB=A6=AC(=EC=9E=A5=EB=B9=84)=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=B6=94=EA=B0=80,=20wbs=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prodPlanResultMgmtEquipList.jsp | 587 +++++++++++++++ .../prodPlanWbsAssignPopup.jsp | 680 ++++++++++++++++++ .../view/project/wbsTemplateMngList.jsp | 9 +- .../ProductionPlanningController.java | 148 ++++ src/com/pms/mapper/productionplanning.xml | 271 +++++++ .../service/ProductionPlanningService.java | 41 ++ 6 files changed, 1734 insertions(+), 2 deletions(-) create mode 100644 WebContent/WEB-INF/view/productionplanning/prodPlanResultMgmtEquipList.jsp create mode 100644 WebContent/WEB-INF/view/productionplanning/prodPlanWbsAssignPopup.jsp diff --git a/WebContent/WEB-INF/view/productionplanning/prodPlanResultMgmtEquipList.jsp b/WebContent/WEB-INF/view/productionplanning/prodPlanResultMgmtEquipList.jsp new file mode 100644 index 0000000..7dc54b2 --- /dev/null +++ b/WebContent/WEB-INF/view/productionplanning/prodPlanResultMgmtEquipList.jsp @@ -0,0 +1,587 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*" %> +<%@include file= "/init.jsp" %> + + +<% +// DB에서 메뉴명 조회 (공통 유틸 사용) +String menuObjId = request.getParameter("menuObjId"); +String menuName = CommonUtils.getMenuName(menuObjId, "생산계획&실적 관리(장비)"); +%> + + + + + <%=Constants.SYSTEM_NAME%> + + + + + + +
+ + +
+ +
+ + +
+
+
+

+ <%=menuName%> +

+
+ + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ ~ + + + + + + +
+
+ + + <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> + +
+
+
+ + +
+
+
WBS할당
+
+
└ 선택후 WBS 할당 버튼 클릭하여 WBS 할당
+ + + + + + + + + +
생산WBS + +
납품WBS + +
+
+ +
+ + + diff --git a/WebContent/WEB-INF/view/productionplanning/prodPlanWbsAssignPopup.jsp b/WebContent/WEB-INF/view/productionplanning/prodPlanWbsAssignPopup.jsp new file mode 100644 index 0000000..861257f --- /dev/null +++ b/WebContent/WEB-INF/view/productionplanning/prodPlanWbsAssignPopup.jsp @@ -0,0 +1,680 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*"%> +<%@include file="/init.jsp"%> + + + + + <%=Constants.SYSTEM_NAME%> + + + + +
+ + + + + + + + + + + +
${projectInfo.PROJECT_NO}${projectInfo.PART_NO}${projectInfo.PART_NAME}
+
+ + + +
+
+ + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
선택수준Unit Name / 공정담당자계획실적진척율
(%)
지연일수비고
123시작일완료일시작일완료일
+
+
+ + + + + + + + +
+
+ + + + diff --git a/WebContent/WEB-INF/view/project/wbsTemplateMngList.jsp b/WebContent/WEB-INF/view/project/wbsTemplateMngList.jsp index d481235..bb2136b 100644 --- a/WebContent/WEB-INF/view/project/wbsTemplateMngList.jsp +++ b/WebContent/WEB-INF/view/project/wbsTemplateMngList.jsp @@ -24,6 +24,11 @@ String connector = person.getUserId(); +<% +// DB에서 메뉴명 조회 (공통 유틸 사용) +String menuObjId = request.getParameter("menuObjId"); +String menuName = CommonUtils.getMenuName(menuObjId, "품목별 입고 관리"); +%> + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ RPS Logo + +
R P S CO., LTD.
+
+ www.rps-korea.com
+ 8, Gukjegwahak 10-ro, Yuseong-gu, Daejeon, Republic of Korea
+ Tel : +82-42-602-3300 / Fax : +82-42-672-3399 / E-mail : ady1225@rps-korea.com
+ Purchasing Team Manager, An-Dong-Yoon +
+
+
+ + +
Purchase Order
+ +

We are pleased to issue Purchase Order with the terms and condition described as below.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Messrs. + + Shipment + readonly<% } %> /> +
Attn. to + readonly<% } %> /> + Payment + readonly<% } %> /> +
Date + + readonly<% } %> /> + Packing + readonly<% } %> /> +
Ref. NO + + Validity + readonly<% } %> /> +
  Remarks + readonly<% } %> /> +
+ + +
+ <% if(isModify){ %> + + + <% }else{ %> + + <% } %> + +
+ + +
+
+ +
+ + + + + + + +
TOTALUS$0.00
+ + +

Look forward to your soonest delivery with good condition.

+ + +
+
+
Signed by Dong-Heon Lee / President
+
RPS CO.,LTD
+ Stamp +
+ + + +
+ + diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp index 3e2eabf..93e4b89 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderList_new.jsp @@ -507,19 +507,21 @@ function fn_formPopUp(objId, copy, formType){ var url = ""; if(formType == 'outsourcing'){ - // 외주가공 발주서 양식 target = "purchaseOrderFormPopup_outsourcing"; url = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do"; popup_width = 1200; popup_height = 900; + } else if(formType == 'english'){ + target = "purchaseOrderFormPopup_english"; + url = "/purchaseOrder/purchaseOrderFormPopup_english.do"; + popup_width = 1100; + popup_height = 900; } else if(formType == 'general'){ - // 일반 발주서 양식 target = "purchaseOrderFormPopup_general"; url = "/purchaseOrder/purchaseOrderFormPopup_general.do"; popup_width = 1000; popup_height = 900; } else { - // 기존 발주서 양식 (FORM_TYPE이 없거나 기존 데이터) target = "purchaseOrderFormPopup_new"; url = "/purchaseOrder/purchaseOrderFormPopup_new.do"; } diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp index 9ea5053..e719039 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderMailFormPopup.jsp @@ -529,21 +529,24 @@ function fn_generatePdfAndSend(){ } }); - // 발주서 양식 타입 확인 (일반/외주) + // 발주서 양식 타입 확인 (일반/외주/영문) var formType = fnc_checkNull(purchaseOrderInfo.FORM_TYPE) || 'general'; var url = ""; if(formType === 'outsourcing') { url = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do?actType=VIEW&PURCHASE_ORDER_MASTER_OBJID=" + purchaseOrderObjId; + } else if(formType === 'english') { + url = "/purchaseOrder/purchaseOrderFormPopup_english.do?actType=VIEW&PURCHASE_ORDER_MASTER_OBJID=" + purchaseOrderObjId; } else { url = "/purchaseOrder/purchaseOrderFormPopup_general.do?actType=VIEW&PURCHASE_ORDER_MASTER_OBJID=" + purchaseOrderObjId; } // 숨겨진 iframe으로 발주서 페이지 로드 + var iframeWidth = (formType === 'english') ? '1100px' : '900px'; var iframe = $('