feat(returns): 반품 입고/조회 시 복수 송장번호 주문 매칭 기능 추가 및 예외 처리 강화

- 복수 송장번호 검색 기능 최적화: 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) 해결
This commit is contained in:
2026-05-26 21:13:25 +09:00
parent ed2819d90e
commit 55e54aacd9
+10 -4
View File
@@ -68,12 +68,15 @@ async def return_lookup(tracking_no: str):
conn = get_order_db_conn() conn = get_order_db_conn()
cur = conn.cursor() cur = conn.cursor()
# 주문일시(order_date 또는 upload_date) 기준 가장 최신 1건 조회 # 주문일시(order_date 또는 upload_date) 기준 가장 최신 1건 조회
cur.execute(""" cur.execute(r"""
SELECT vendor, recipient_name, recipient_phone, recipient_mobile, address SELECT vendor, recipient_name, recipient_phone, recipient_mobile, address
FROM orders 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 ORDER BY order_date DESC LIMIT 1
""", (tracking_no,)) """, (tracking_no, tracking_no))
row = cur.fetchone() row = cur.fetchone()
conn.close() conn.close()
@@ -164,12 +167,15 @@ async def create_return_receive_bulk(req: BulkReturnReceive):
else: else:
remarks = "고객이 반품" remarks = "고객이 반품"
# 2. Check orders # 2. Check orders
cur_order.execute(""" cur_order.execute(r"""
SELECT vendor, recipient_name, recipient_phone, recipient_mobile, address SELECT vendor, recipient_name, recipient_phone, recipient_mobile, address
FROM orders 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 ORDER BY order_date DESC LIMIT 1
""", (tracking_no,)) """, (tracking_no, tracking_no))
ord_row = cur_order.fetchone() ord_row = cur_order.fetchone()
if ord_row: if ord_row:
mall = ord_row['vendor'] or "" mall = ord_row['vendor'] or ""