From 55e54aacd9ed4da053c33fb2a28b9028be7ac9ef Mon Sep 17 00:00:00 2001 From: king Date: Tue, 26 May 2026 21:13:25 +0900 Subject: [PATCH] =?UTF-8?q?feat(returns):=20=EB=B0=98=ED=92=88=20=EC=9E=85?= =?UTF-8?q?=EA=B3=A0/=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EB=B3=B5=EC=88=98?= =?UTF-8?q?=20=EC=86=A1=EC=9E=A5=EB=B2=88=ED=98=B8=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EB=A7=A4=EC=B9=AD=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EA=B0=95?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 복수 송장번호 검색 기능 최적화: routers/returns.py 파일의 단건 조회(/lookup) 및 벌크 입고(/receive/bulk) 내 orders 테이블 대상 SQL 쿼리 개선 / 기존 단일 송장번호 완전 일치 검사(B-Tree 인덱스 스캔)를 유지하면서, 불일치 시 명시적 IS NOT NULL 및 빈값 검사 방어 코드를 수행하여 안정성 확보 / 쉼표(,)나 공백( ) 외에도 슬래시(/) 및 세미콜론(;) 구분자('[,\s/;]+')까지 함께 분리 지원하여 다양한 입력 형태 호환 보장 - 코드 안정성 확보: 다중행 SQL 문자열에 raw string(r 접두사)를 적용하여 Python의 이스케이프 시퀀스 구문 경고(SyntaxWarning: '\s' is an invalid escape sequence) 해결 --- routers/returns.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/routers/returns.py b/routers/returns.py index bed929c..780fb3b 100644 --- a/routers/returns.py +++ b/routers/returns.py @@ -68,12 +68,15 @@ async def return_lookup(tracking_no: str): conn = get_order_db_conn() cur = conn.cursor() # 주문일시(order_date 또는 upload_date) 기준 가장 최신 1건 조회 - cur.execute(""" + cur.execute(r""" SELECT vendor, recipient_name, recipient_phone, recipient_mobile, address FROM orders - WHERE tracking_number = %s + WHERE tracking_number = %s + OR (tracking_number IS NOT NULL + AND tracking_number != '' + AND %s = ANY(regexp_split_to_array(tracking_number, '[,\s/;]+'))) ORDER BY order_date DESC LIMIT 1 - """, (tracking_no,)) + """, (tracking_no, tracking_no)) row = cur.fetchone() conn.close() @@ -164,12 +167,15 @@ async def create_return_receive_bulk(req: BulkReturnReceive): else: remarks = "고객이 반품" # 2. Check orders - cur_order.execute(""" + cur_order.execute(r""" SELECT vendor, recipient_name, recipient_phone, recipient_mobile, address FROM orders WHERE tracking_number = %s + OR (tracking_number IS NOT NULL + AND tracking_number != '' + AND %s = ANY(regexp_split_to_array(tracking_number, '[,\s/;]+'))) ORDER BY order_date DESC LIMIT 1 - """, (tracking_no,)) + """, (tracking_no, tracking_no)) ord_row = cur_order.fetchone() if ord_row: mall = ord_row['vendor'] or ""