feat(rx-usage): 주문 모달 개선 - 버튼 3분할 + 총액 표시

- 🧪 테스트 / 🛒 장바구니만 / 🚀 즉시주문 버튼 분리
- cart_only 파라미터로 장바구니만 담기 기능 지원
- 주문 확인 모달에 총액 표시 추가
- 모달 너비 확장 (600px/650px)
This commit is contained in:
thug0bin 2026-03-06 23:47:25 +09:00
parent a672c7a2a0
commit 442815b65e

View File

@ -1224,7 +1224,7 @@
}
// 선택된 도매상 전체 일괄 처리
async function executeAllWholesalers(dryRun = false) {
async function executeAllWholesalers(dryRun = false, cartOnly = false) {
const wsIds = Object.keys(pendingWholesalerItems);
// 체크된 도매상만 필터
@ -1240,10 +1240,20 @@
// 버튼 비활성화
const btnTest = document.getElementById('btnMultiTest');
const btnCart = document.getElementById('btnMultiCart');
const btnReal = document.getElementById('btnMultiReal');
btnTest.disabled = true;
btnCart.disabled = true;
btnReal.disabled = true;
// 진행 상태 표시
if (dryRun) {
btnTest.textContent = '처리 중...';
} else if (cartOnly) {
btnCart.textContent = '처리 중...';
} else {
btnReal.textContent = '처리 중...';
}
const allResults = [];
let totalSuccess = 0;
@ -1272,7 +1282,7 @@
})),
reference_period: `${document.getElementById('startDate').value}~${document.getElementById('endDate').value}`,
dry_run: dryRun,
cart_only: false // 장바구니 + 주문 확정까지
cart_only: cartOnly // true=장바구니만, false=즉시주문
};
const response = await fetch('/api/order/quick-submit', {
@ -1311,12 +1321,15 @@
}
closeMultiWholesalerModal();
showMultiOrderResultModal(allResults, totalSuccess, totalFailed, dryRun);
showMultiOrderResultModal(allResults, totalSuccess, totalFailed, dryRun, cartOnly);
// 버튼 복원
btnTest.disabled = false;
btnCart.disabled = false;
btnReal.disabled = false;
btnReal.textContent = '📤 전체 주문 전송';
btnTest.textContent = '🧪 테스트';
btnCart.textContent = '🛒 장바구니만';
btnReal.textContent = '🚀 전체 즉시주문';
}
// 특정 품목만 클립보드 복사
@ -1329,7 +1342,7 @@
}
// 다중 도매상 결과 모달
function showMultiOrderResultModal(results, totalSuccess, totalFailed, isDryRun) {
function showMultiOrderResultModal(results, totalSuccess, totalFailed, isDryRun, isCartOnly = false) {
const modal = document.getElementById('orderResultModal');
const content = document.getElementById('orderResultContent');
const header = modal.querySelector('.order-modal-header h3');
@ -1339,7 +1352,7 @@
header.innerHTML = '📋 전체 주문 결과';
const statusEmoji = totalFailed === 0 ? '✅' : totalSuccess === 0 ? '❌' : '⚠️';
const modeText = isDryRun ? '[테스트]' : '';
const modeText = isDryRun ? '[테스트]' : isCartOnly ? '[장바구니]' : '';
let html = `
<div class="result-header ${totalFailed === 0 ? 'success' : 'partial'}">
@ -1419,17 +1432,28 @@
headerDiv.style.background = ws.gradient;
let html = '';
let totalAmount = 0;
items.forEach((item, idx) => {
// 예상 금액 계산 (단가 × 수량)
const unitPrice = item.unit_price || item.price || 0;
const itemAmount = unitPrice * item.qty;
totalAmount += itemAmount;
html += `
<tr>
<td>${escapeHtml(item.product_name)}</td>
<td class="mono">${item.specification || '-'}</td>
<td class="mono">${item.qty}</td>
<td class="mono" style="text-align:center;">${item.qty}</td>
<td class="mono" style="text-align:right;">${itemAmount > 0 ? itemAmount.toLocaleString() + '원' : '-'}</td>
</tr>`;
});
tbody.innerHTML = html;
document.getElementById('orderConfirmCount').textContent = items.length;
document.getElementById('orderConfirmTotal').innerHTML = totalAmount > 0
? `₩${totalAmount.toLocaleString()}`
: '<span style="font-size:12px;color:var(--text-muted);">금액 미정</span>';
modal.classList.add('show');
}
@ -1508,7 +1532,7 @@
}
}
async function executeOrder(dryRun = true) {
async function executeOrder(dryRun = true, cartOnly = false) {
const wholesaler = currentOrderWholesaler || 'geoyoung';
// 해당 도매상 품목 필터
@ -1522,11 +1546,20 @@
// 버튼 비활성화
const btnTest = document.getElementById('btnOrderTest');
const btnCart = document.getElementById('btnOrderCart');
const btnReal = document.getElementById('btnOrderReal');
btnTest.disabled = true;
btnCart.disabled = true;
btnReal.disabled = true;
btnTest.textContent = dryRun ? '처리 중...' : '🧪 테스트';
btnReal.textContent = !dryRun ? '처리 중...' : '🛒 장바구니 담기';
// 진행 상태 표시
if (dryRun) {
btnTest.textContent = '처리 중...';
} else if (cartOnly) {
btnCart.textContent = '처리 중...';
} else {
btnReal.textContent = '처리 중...';
}
try {
const payload = {
@ -1544,7 +1577,7 @@
})),
reference_period: `${document.getElementById('startDate').value}~${document.getElementById('endDate').value}`,
dry_run: dryRun,
cart_only: false // 장바구니 + 주문 확정까지
cart_only: cartOnly // true=장바구니만, false=즉시주문
};
// 타임아웃 설정
@ -1576,9 +1609,11 @@
showToast(`❌ 오류: ${err.message}`, 'error');
} finally {
btnTest.disabled = false;
btnCart.disabled = false;
btnReal.disabled = false;
btnTest.textContent = '🧪 테스트';
btnReal.textContent = '📤 주문 전송';
btnCart.textContent = '🛒 장바구니만';
btnReal.textContent = '🚀 즉시주문';
}
}
@ -2536,26 +2571,32 @@
<!-- 주문 확인 모달 -->
<div class="order-modal" id="orderConfirmModal">
<div class="order-modal-content">
<div class="order-modal-content" style="max-width:600px;">
<div class="order-modal-header">
<h3 id="orderConfirmTitle">🏭 지오영 주문 확인</h3>
<button class="order-close" onclick="closeOrderConfirmModal()"></button>
</div>
<div class="order-modal-body">
<p style="margin-bottom:12px;color:var(--text-secondary);">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;">
<p style="color:var(--text-secondary);margin:0;">
<span id="orderConfirmCount">0</span>개 품목을 <span id="orderConfirmWholesaler">지오영</span> 장바구니에 담습니다.
</p>
<div id="orderConfirmTotal" style="font-size:18px;font-weight:700;color:var(--accent-cyan);font-family:'JetBrains Mono',monospace;">
₩0
</div>
</div>
<p style="margin-bottom:12px;font-size:12px;color:var(--accent-amber);">
⚠️ 장바구니 담기만 진행됩니다. 도매상 사이트에서 최종 확정이 필요합니다.
</p>
<table class="order-confirm-table">
<thead><tr><th>품목명</th><th>규격</th><th>수량</th></tr></thead>
<thead><tr><th>품목명</th><th>규격</th><th>수량</th><th style="text-align:right;">예상금액</th></tr></thead>
<tbody id="orderConfirmBody"></tbody>
</table>
</div>
<div class="order-modal-footer">
<button class="btn-order-test" id="btnOrderTest" onclick="executeOrder(true)">🧪 테스트</button>
<button class="btn-order-real" id="btnOrderReal" onclick="executeOrder(false)">📤 주문 전송</button>
<div class="order-modal-footer" style="gap:8px;">
<button class="btn-order-test" id="btnOrderTest" onclick="executeOrder(true, false)">🧪 테스트</button>
<button class="btn-order-cart" id="btnOrderCart" onclick="executeOrder(false, true)" style="background:linear-gradient(135deg, #0891b2, #06b6d4);">🛒 장바구니만</button>
<button class="btn-order-real" id="btnOrderReal" onclick="executeOrder(false, false)">🚀 즉시주문</button>
</div>
</div>
</div>
@ -2577,16 +2618,17 @@
<!-- 다중 도매상 선택 모달 -->
<div class="order-modal" id="multiWholesalerModal">
<div class="order-modal-content" style="max-width:550px;">
<div class="order-modal-content" style="max-width:650px;">
<div class="order-modal-header" style="background:linear-gradient(135deg, #059669, #10b981);">
<h3>🛒 전체 도매상 주문</h3>
<button class="order-close" onclick="closeMultiWholesalerModal()"></button>
</div>
<div class="order-modal-body" id="multiWholesalerBody">
</div>
<div class="order-modal-footer">
<button class="btn-order-test" id="btnMultiTest" onclick="executeAllWholesalers(true)">🧪 테스트</button>
<button class="btn-order-real" id="btnMultiReal" onclick="executeAllWholesalers(false)">📤 전체 주문 전송</button>
<div class="order-modal-footer" style="gap:8px;">
<button class="btn-order-test" id="btnMultiTest" onclick="executeAllWholesalers(true, false)">🧪 테스트</button>
<button class="btn-order-cart" id="btnMultiCart" onclick="executeAllWholesalers(false, true)" style="background:linear-gradient(135deg, #0891b2, #06b6d4);">🛒 장바구니만</button>
<button class="btn-order-real" id="btnMultiReal" onclick="executeAllWholesalers(false, false)">🚀 전체 즉시주문</button>
</div>
</div>
</div>