From e198838998f011a06daf4e3338260c61b1be9f79 Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Thu, 2 Jul 2026 19:31:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A0=84=ED=99=94=EC=A0=91=EC=88=98=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=97=90=20[=EA=B0=9C=EB=B0=9C=EC=9A=A9=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C]=20=EC=8A=A4=EC=BA=94=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=20=EB=B0=94=EC=BD=94=EB=93=9C=20=ED=9B=84=EB=B3=B4=20=ED=91=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지정판매소 판매의 dev-saleable-barcodes API를 재사용해, 주문 선택 시 그 판매소·주문 기준의 판매 테스트용 바코드 후보를 표로 표시한다. 바코드를 클릭하면 봉투코드 스캔칸에 자동 입력되어 테스트가 쉬워진다. 스캔 성공 시 후보 목록도 갱신(판매된 팩 제외). 개발 완료 후 제거 예정. --- app/Views/bag/order_phone_manage.php | 75 ++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/app/Views/bag/order_phone_manage.php b/app/Views/bag/order_phone_manage.php index 4f4979f..eff0718 100644 --- a/app/Views/bag/order_phone_manage.php +++ b/app/Views/bag/order_phone_manage.php @@ -114,6 +114,31 @@ + + +
포장 명세 @@ -153,6 +178,8 @@ // 봉투코드 스캔(판매/포장) — CSRF 토큰(쿠키 방식, 매 요청 갱신) // base_url() 절대경로를 현재 문서(동일 출처) 기준 경로로 변환 → 워크스페이스 iframe/다른 호스트 접근에도 안전 const scanApi = new URL('', window.location.href).pathname; + // [개발용 임시] 판매 가능 바코드 후보 API (지정판매소 판매의 dev API 재사용) + const devSaleableApi = new URL('', window.location.href).pathname; const csrfName = ''; let csrfHash = ''; @@ -319,10 +346,56 @@ const msg = document.getElementById('scan-msg'); if (msg) msg.textContent = ''; } + // [개발용 임시] 선택 주문 판매소 기준 후보 바코드 표 + loadDevSaleable(order.so_ds_idx, order.so_idx); syncListHeight(); // 상세 카드 높이 확정 후 접수 리스트 높이를 맞춘다 } + // [개발용 임시] 스캔 가능 바코드 후보 로딩(선택 주문 판매소·주문 기준) + const devPanelEl = document.getElementById('dev-saleable-panel'); + const devTbodyEl = document.getElementById('dev-saleable-tbody'); + async function loadDevSaleable(dsIdx, soIdx) { + if (!devPanelEl || !devTbodyEl) return; + const idx = Number(dsIdx || 0); + if (!idx) { devPanelEl.classList.add('hidden'); return; } + devPanelEl.classList.remove('hidden'); + devTbodyEl.innerHTML = '불러오는 중…'; + try { + let url = devSaleableApi + '?ds_idx=' + encodeURIComponent(String(idx)); + if (Number(soIdx || 0) > 0) url += '&so_idx=' + encodeURIComponent(String(soIdx)); + const res = await fetch(url, { credentials: 'same-origin' }); + const data = await res.json(); + if (!data.ok) { devTbodyEl.innerHTML = '' + esc(data.message || '조회 실패') + ''; return; } + const rows = Array.isArray(data.rows) ? data.rows : []; + if (!rows.length) { devTbodyEl.innerHTML = '표시할 바코드가 없습니다.'; return; } + devTbodyEl.innerHTML = rows.map((r) => { + const code = String(r.code || ''); + const codeCell = (code && code !== '-') + ? '' + : '' + esc(code) + ''; + return '' + + '' + esc(r.source || '') + '' + + '' + codeCell + '' + + '' + esc((r.bag_code || '') + ' ' + (r.bag_name || '')) + '' + + '' + esc(r.unit || '') + '' + + '' + nf(r.qty || 0) + '' + + '' + esc(r.state || '') + '' + + '' + esc(r.extra || '') + '' + + ''; + }).join(''); + } catch (e) { + devTbodyEl.innerHTML = '네트워크 오류'; + } + } + // 후보 바코드 클릭 → 스캔칸에 입력(개발 편의) + devTbodyEl?.addEventListener('click', (e) => { + const btn = e.target.closest('.dev-pick'); + if (!btn) return; + const inp = document.getElementById('scan-input'); + if (inp && !inp.disabled) { inp.value = btn.getAttribute('data-code') || ''; inp.focus(); } + }); + // 봉투코드 스캔 → 즉시 판매·포장 처리 후 화면 갱신 const scanInputEl = document.getElementById('scan-input'); const scanMsgEl = document.getElementById('scan-msg'); @@ -386,6 +459,8 @@ } // 접수 리스트의 '포장' 표시(O/X) 갱신 renderList(); + // [개발용 임시] 후보 목록 갱신(방금 판매된 팩 제외) + loadDevSaleable(order.so_ds_idx, order.so_idx); } scanInputEl.value = ''; scanInputEl.focus();