V20260210 #142

Merged
hjjeong merged 3 commits from V20260210 into main 2026-02-20 12:17:44 +00:00
4 changed files with 83 additions and 7 deletions

View File

@@ -1509,6 +1509,68 @@ function fn_save() {
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<script>
// PDF 캡처 전 폼 요소를 일반 텍스트로 변환 (html2canvas 글자 잘림 방지)
function fn_replaceFormElementsWithText() {
var backupData = [];
// select2 컨테이너도 숨김 처리
var select2Containers = [];
$('.estimate-container').find('.select2-container').each(function() {
$(this).hide();
select2Containers.push($(this));
});
$('.estimate-container').find('input[type="text"], textarea, select').each(function(idx) {
var $el = $(this);
var displayText = '';
if ($el.is('select')) {
displayText = $el.find('option:selected').text() || '';
} else {
displayText = $el.val() || '';
}
var computedStyle = window.getComputedStyle(this);
var elWidth = $el.outerWidth();
var span = $('<span class="pdf-temp-text"></span>');
span.text(displayText);
span.css({
'font-family': computedStyle.fontFamily,
'font-size': computedStyle.fontSize,
'font-weight': computedStyle.fontWeight,
'color': computedStyle.color,
'text-align': computedStyle.textAlign,
'display': computedStyle.display === 'none' ? 'inline-block' : computedStyle.display,
'width': elWidth + 'px',
'padding': computedStyle.padding,
'white-space': $el.is('textarea') ? 'pre-wrap' : 'nowrap',
'overflow': 'visible',
'line-height': computedStyle.lineHeight,
'vertical-align': 'middle'
});
backupData.push({ element: $el, replacement: span });
$el.after(span).hide();
});
backupData._select2Containers = select2Containers;
return backupData;
}
// PDF 캡처 후 원래 폼 요소로 복원
function fn_restoreFormElements(backupData) {
for (var i = 0; i < backupData.length; i++) {
backupData[i].element.show();
backupData[i].replacement.remove();
}
// select2 컨테이너 복원
if (backupData._select2Containers) {
for (var j = 0; j < backupData._select2Containers.length; j++) {
backupData._select2Containers[j].show();
}
}
}
// PDF 다운로드 버튼 클릭 이벤트
$("#btnDownloadPdf").click(function(){
fn_generatePdf();
@@ -1547,6 +1609,9 @@ function fn_generatePdf() {
// 버튼 영역 임시 숨김
$('.btn-area').hide();
// 폼 요소를 텍스트로 변환 (html2canvas 글자 잘림 방지)
var formBackup = fn_replaceFormElementsWithText();
// PDF 생성을 위해 스타일 조정
var container = $('.estimate-container');
var originalBg = container.css('background');
@@ -1578,6 +1643,8 @@ function fn_generatePdf() {
'padding': originalPadding
});
$('body').css('background-color', originalBodyBg);
// 폼 요소 복원
fn_restoreFormElements(formBackup);
// 버튼 영역 다시 표시
$('.btn-area').show();
@@ -1629,6 +1696,7 @@ function fn_generatePdf() {
});
}
}).catch(function(error) {
fn_restoreFormElements(formBackup);
$('.btn-area').show();
Swal.close();
console.error('Canvas 캡처 오류:', error);
@@ -1656,6 +1724,9 @@ function fn_generateAndUploadPdf(callback) {
// 버튼 영역 임시 숨김
$('.btn-area').hide();
// 폼 요소를 텍스트로 변환 (html2canvas 글자 잘림 방지)
var formBackup = fn_replaceFormElementsWithText();
// PDF 생성을 위해 스타일 조정
var container = $('.estimate-container');
var originalBg = container.css('background');
@@ -1690,6 +1761,9 @@ function fn_generateAndUploadPdf(callback) {
});
$('body').css('background-color', originalBodyBg);
// 폼 요소 복원
fn_restoreFormElements(formBackup);
// 버튼 영역 다시 표시
$('.btn-area').show();
@@ -1735,6 +1809,7 @@ function fn_generateAndUploadPdf(callback) {
}
}).catch(function(error) {
fn_restoreFormElements(formBackup);
$('.btn-area').show();
console.error('Canvas 캡처 오류:', error);
if(callback && typeof callback === 'function') {

View File

@@ -679,10 +679,11 @@ function fn_bulkRegister(){
// 선택한 1건의 항목 가져오기
var selectedRow = selectedRows[0];
// 생산상태 체크 - 생산완료일 때만 판매등록 가능
var productionStatus = selectedRow.PRODUCTION_STATUS || '';
if(productionStatus !== '' && productionStatus !== '생산완료') {
if(!confirm("생산상태가 '" + productionStatus + "'입니다.\n생산완료 전에 출하지시/판매등록을 진행하시겠습니까?")) {
// 포장수량 체크 - 포장수량이 0이면 경고
var packingQty = parseInt(selectedRow.PRODUCTION_STATUS) || 0;
var orderQty = parseInt(selectedRow.ORDER_QUANTITY) || 0;
if(packingQty <= 0) {
if(!confirm("포장수량이 0입니다.\n포장 완료 전에 출하지시/판매등록을 진행하시겠습니까?")) {
return;
}
}

View File

@@ -4732,7 +4732,7 @@
COALESCE(CI.DUE_DATE, PM.DUE_DATE, CM.REQ_DEL_DATE, '') AS REQ_DEL_DATE,
COALESCE(NULLIF(PM.QUANTITY, '')::numeric, 0) AS ORDER_QTY,
COALESCE((SELECT NULLIF(PP.EXTRA_PROD_QTY, '')::numeric FROM PRODUCTION_PLAN PP WHERE PP.PROJECT_OBJID = PM.OBJID AND UPPER(PP.STATUS) = 'ACTIVE' LIMIT 1), 0) AS EXTRA_PROD_QTY,
COALESCE(CM.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
COALESCE(CI.CUSTOMER_REQUEST, CM.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
COALESCE((
SELECT STRING_AGG(CIS.SERIAL_NO, ', ' ORDER BY CIS.SERIAL_NO)
FROM CONTRACT_ITEM_SERIAL CIS

View File

@@ -878,7 +878,7 @@
(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,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.CONTRACT_OBJID AND DOC_TYPE IN ('FTC_ORDER', 'ORDER', 'ORDER_DOC') AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT,
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
COALESCE((SELECT SUM(PR.RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = T.OBJID::VARCHAR AND PR.RESULT_TYPE = 'SHIP_WAIT' AND PR.STATUS = 'active'), 0) AS PRODUCTION_STATUS,
-- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기)
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
-- 판매수량: 모든 분할 출하의 합계
@@ -1589,7 +1589,7 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
AND DOC_TYPE='ORDER_DOC'
AND UPPER(STATUS) = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
COALESCE((SELECT SUM(PR.RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = T.OBJID::VARCHAR AND PR.RESULT_TYPE = 'SHIP_WAIT' AND PR.STATUS = 'active'), 0) AS PRODUCTION_STATUS,
-- 판매 관련 필드들 (sales_registration 테이블에서 가져오기)
SR.sale_no AS SALE_NO,
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,