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:
+10
-4
@@ -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 ""
|
||||||
|
|||||||
Reference in New Issue
Block a user