V20260210 #142
@@ -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') {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user