diff --git a/app/routers/orders.py b/app/routers/orders.py index 1559c3c..d365d2e 100644 --- a/app/routers/orders.py +++ b/app/routers/orders.py @@ -766,14 +766,16 @@ def upload_file( s_code = comp["single_code"] comp_qty = safe_int_quantity(comp["quantity"], default=1) single_qty_sums[s_code] = single_qty_sums.get(s_code, 0) + (qty * comp_qty) - # 세트 구성 단품 정보가 single_items 에 없을 수도 있으므로 보강 + # 세트 구성 단품 정보가 single_items 에 없을 수도 있으므로 placeholder 만 보강. + # 사방넷 코드는 비워서, 결과 엑셀 빌드 단계에서 제외 대상으로 인식되게 둔다. if s_code not in single_items: - single_items[s_code] = {"sabangnet_code": s_code, "name": ""} + single_items[s_code] = {"sabangnet_code": "", "name": ""} else: - # 마스터 미등록 코드: 단품으로 간주, 이름은 주문서의 상품명으로 채움 + # 마스터 미등록 코드: 사방넷 코드를 알 수 없으므로 placeholder 로만 추적. + # 결과 엑셀에서는 제외된다. unknown_codes.add(prod_code) single_items[prod_code] = { - "sabangnet_code": prod_code, + "sabangnet_code": "", "name": order.product_name or "" } single_qty_sums[prod_code] = single_qty_sums.get(prod_code, 0) + qty @@ -788,15 +790,29 @@ def upload_file( # 5. 결과 엑셀 데이터 빌드 # A열=사방넷코드, B열=합계수량, C열=이름. 헤더는 요청 사양(상품코드[필수]/가용수량/불용수량). + # 사방넷 코드가 없는(마스터 미등록·구성품 미등록) 단품은 결과에서 제외한다. excel_rows = [] + skipped_no_sabang: list[str] = [] for s_code, total_qty in single_qty_sums.items(): - s_info = single_items.get(s_code, {"sabangnet_code": s_code, "name": ""}) + s_info = single_items.get(s_code, {"sabangnet_code": "", "name": ""}) + sabang_code = (s_info.get("sabangnet_code") or "").strip() + if not sabang_code: + skipped_no_sabang.append(s_code) + continue excel_rows.append({ - "상품코드[필수]": s_info["sabangnet_code"] or s_code, + "상품코드[필수]": sabang_code, "가용수량": total_qty, - "불용수량": s_info["name"] or "" + "불용수량": s_info.get("name") or "" }) + if skipped_no_sabang: + log_event( + current_user, + "낱개 출고 분석 — 사방넷 코드 없는 항목 제외", + "warning", + {"skipped_count": len(skipped_no_sabang), "sample": skipped_no_sabang[:20]}, + ) + df_out = pd.DataFrame(excel_rows, columns=["상품코드[필수]", "가용수량", "불용수량"]) # 엑셀 파일 쓰기 (1행 헤더, 2행부터 데이터 — pandas to_excel 기본 동작) @@ -824,7 +840,9 @@ def upload_file( "filenames": filenames_str, "uploaded_count": len(db_records), "single_code_count": len(single_qty_sums), + "excel_row_count": len(excel_rows), "unknown_code_count": len(unknown_codes), + "skipped_no_sabang_count": len(skipped_no_sabang), }, )