feat(cupang): 설정 화면 2열 개편 — itemcode 다중선택 등록 + 활성/삭제

- 수동 등록 카드 제거
- 왼쪽: itemcode_db 전체 목록(낱개+세트) 다중선택, 등록된 항목 진회색+흰글씨
  /cupang/api/products/all + /cupang/products/bulk(JSON 일괄 upsert)
- 오른쪽: 등록 제품명 목록 — 제품명/코드/상태 + 활성·비활성 토글 + 완전삭제
  /products/{id}/active (토글), /products/{id}/delete (hard delete)
- ItemcodeReader.list_all 추가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-05-30 03:46:35 +09:00
parent 96e2c49506
commit 1d33761003
5 changed files with 229 additions and 94 deletions
+10 -2
View File
@@ -114,9 +114,17 @@ class ItemcodeReader:
비활성 상태이거나 조회 실패 시 빈 리스트(예외 비전파 — UI 는 수동 입력 폴백).
"""
q = (query or "").strip()
if not self.enabled or not self._pool or not self._sql or not q:
if not q:
return []
return self._run(f"%{q}%", limit)
def list_all(self, *, limit: int = 2000) -> list[dict[str, Any]]:
"""전체 상품 목록(낱개+세트). 설정 화면 왼쪽 리스트용."""
return self._run("%", limit)
def _run(self, like: str, limit: int) -> list[dict[str, Any]]:
if not self.enabled or not self._pool or not self._sql:
return []
like = f"%{q}%"
try:
with self._pool.connection() as conn:
rows = conn.execute(