@@ -561,15 +601,133 @@
setTimeout(() => toast.remove(), 4000);
}
+ // μλ ν¬λ‘€λ§
+ let selectedProductData = null;
+
+ function openManualCrawl() {
+ selectedProductData = null;
+ document.getElementById('mssqlSearchInput').value = '';
+ document.getElementById('mssqlSearchResults').innerHTML = '
μ νλͺ
μ κ²μνμΈμ
';
+ document.getElementById('selectedProduct').style.display = 'none';
+ document.getElementById('crawlSelectedBtn').disabled = true;
+ document.getElementById('manualCrawlModal').classList.add('show');
+ document.getElementById('mssqlSearchInput').focus();
+ }
+
+ function closeManualCrawl() {
+ document.getElementById('manualCrawlModal').classList.remove('show');
+ }
+
+ async function searchMssqlProducts() {
+ const query = document.getElementById('mssqlSearchInput').value.trim();
+ if (!query) {
+ showToast('κ²μμ΄λ₯Ό μ
λ ₯νμΈμ', 'error');
+ return;
+ }
+
+ const resultsDiv = document.getElementById('mssqlSearchResults');
+ resultsDiv.innerHTML = '
κ²μ μ€...
';
+
+ try {
+ // OTC λΌλ²¨ κ²μ API μ¬μ¬μ©
+ const res = await fetch(`/api/admin/otc-labels/search-mssql?q=${encodeURIComponent(query)}`);
+ const data = await res.json();
+
+ if (data.success && data.drugs.length > 0) {
+ resultsDiv.innerHTML = data.drugs.map(drug => `
+
+
${drug.goods_name}
+
+ ${drug.barcode || 'λ°μ½λμμ'}
+ ${drug.sale_price ? ` Β· β©${Math.floor(drug.sale_price).toLocaleString()}` : ''}
+
+
+ `).join('');
+ } else {
+ resultsDiv.innerHTML = '
κ²μ κ²°κ³Όκ° μμ΅λλ€
';
+ }
+ } catch (err) {
+ resultsDiv.innerHTML = `
μ€λ₯: ${err.message}
`;
+ }
+ }
+
+ function selectProduct(barcode, drugCode, productName) {
+ if (!barcode) {
+ showToast('λ°μ½λκ° μλ μ νμ ν¬λ‘€λ§ν μ μμ΅λλ€', 'error');
+ return;
+ }
+
+ selectedProductData = { barcode, drugCode, productName };
+ document.getElementById('selectedProductName').textContent = productName;
+ document.getElementById('selectedProductBarcode').textContent = barcode;
+ document.getElementById('selectedProduct').style.display = 'block';
+ document.getElementById('crawlSelectedBtn').disabled = false;
+ }
+
+ function escapeHtml(str) {
+ if (!str) return '';
+ return str.replace(/'/g, "\\'").replace(/"/g, '"');
+ }
+
+ async function crawlSelected() {
+ if (!selectedProductData) {
+ showToast('μ νμ μ ννμΈμ', 'error');
+ return;
+ }
+
+ const { barcode, drugCode, productName } = selectedProductData;
+
+ closeManualCrawl();
+ showToast(`"${productName}" ν¬λ‘€λ§ μμ...`, 'info');
+
+ try {
+ const res = await fetch('/api/admin/product-images/crawl', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ products: [[barcode, drugCode || null, productName]]
+ })
+ });
+ const data = await res.json();
+
+ if (data.success) {
+ const r = data.result;
+ if (r.success > 0) {
+ showToast(`β
"${productName}" μ΄λ―Έμ§ μμ§ μ±κ³΅!`, 'success');
+ } else if (r.skipped > 0) {
+ showToast(`μ΄λ―Έ λ±λ‘λ λ°μ½λμ
λλ€`, 'info');
+ } else {
+ showToast(`β μ΄λ―Έμ§λ₯Ό μ°Ύμ§ λͺ»νμ΅λλ€`, 'error');
+ }
+ loadStats();
+ loadImages();
+ } else {
+ showToast(data.error || 'ν¬λ‘€λ§ μ€ν¨', 'error');
+ }
+ } catch (err) {
+ showToast('μ€λ₯: ' + err.message, 'error');
+ }
+ }
+
// ESCλ‘ λͺ¨λ¬ λ«κΈ°
document.addEventListener('keydown', (e) => {
- if (e.key === 'Escape') closeModal();
+ if (e.key === 'Escape') {
+ closeModal();
+ closeManualCrawl();
+ }
});
// λͺ¨λ¬ μΈλΆ ν΄λ¦μΌλ‘ λ«κΈ°
document.getElementById('detailModal').addEventListener('click', (e) => {
if (e.target.id === 'detailModal') closeModal();
});
+
+ document.getElementById('manualCrawlModal').addEventListener('click', (e) => {
+ if (e.target.id === 'manualCrawlModal') closeManualCrawl();
+ });