발주 자동화

기간  — 

디핏은 도매 공급사의 과일을 쿠팡⁠·⁠토스쇼핑에서 파는 위탁판매로 시작했습니다. 주문이 들어오면 공급사를 골라 발주⁠·⁠결제하고, 공급사 송장을 판매채널에 등록해야 합니다. 이 일을 가장 먼저 자동화했습니다. 첫 실제 결제 주문을 자동으로 발주했고, 이어서 배송완료 확인까지 이었습니다.

디핏이 가장 먼저 만든 기능입니다.
고객 결제부터 공급사 발주⁠·⁠송장⁠·⁠배송 완료 확인까지 잇습니다.

GochiPostgreSQLpgxsqlcgooseOpenAPIMinIOXvfb

  • 판매채널 주문을 중복 없이 받아 공통 모델로 저장하는 주문 수집
  • 주문 품목을 공급사 상품에 연결하고, 실제 발주 없이 후보와 비용을 보는 모의 발주
  • 공급사별 엑셀 양식에 맞춘 발주 파일
  • 작업 큐와 중복 발주 방지를 갖춘 무인 발주⁠·⁠결제⁠·⁠송장 회수
  • 판매채널의 공식 배송완료까지 확인하는 흐름
  • 주문⁠·⁠옵션 단위로 자동 발주와 결제를 멈추고 다시 켜는 중지⁠·⁠재개

응답을 잃은 발주와 결제

문제
공급사에 발주나 결제를 보낸 뒤 응답을 잃으면, 실제로 처리됐는지 알 수 없습니다.
해결
결과를 모르는 요청은 결과 불명으로 두고, 공급사 공식 조회로 확정하기 전에는 다시 보내지 않습니다. 다른 공급사로 다시 제출하지도 않습니다. 제출에 결제가 포함되는 곳과 결제 API가 따로 있는 곳도 나눠 기록합니다. 재시도 때문에 같은 주문을 두 번 발주하거나 결제하지 않습니다.

정전과 네트워크 단절 뒤 빠진 인계

문제
공급사에서 송장을 읽은 뒤 채널에 등록하기 전에 서버가 멈추면, 다음 단계가 생기지 않았습니다.
해결
외부 조회 결과와 다음 처리 단계를 함께 기록했습니다. 서버가 멈추면 DB에 저장한 마지막 처리 지점부터 다시 시작하게 했습니다. 장애가 길어져도 남은 발주⁠·⁠송장 인계를 이어서 처리합니다.

손해를 보는 주문

문제
판매가를 정한 뒤 공급가가 오르면, 주문이 들어올수록 손해가 커질 수 있습니다.
해결
제출과 결제 직전에 실제 결제액에서 수수료⁠·⁠부가세⁠·⁠공급 원가를 빼서 다시 계산합니다. 기여이익이 음수이거나 근거를 확인할 수 없으면 발주를 막습니다.

공급사 로그인의 봇 차단

문제
공급사 사이트가 로그인 단계에서 자동화 접속을 막으면, 발주와 송장 회수가 멈췄습니다.
해결
서버의 가상 화면에서 브라우저를 띄워 인증을 복구하고, 얻은 세션을 백엔드에 안전하게 넘깁니다. 운영자에게 로컬 브라우저 작업을 요구하지 않습니다.

실행 중인 발주와 부딪친 중지 버튼

문제
옵션 중지 저장이 공급사 재평가 작업과 잠금을 다투다가 HTTP 500으로 실패했습니다.
해결
공용 잠금은 공유 모드로 바꿔 독립 작업을 병렬로 돌리고, 실제 발주와 중지는 같은 잠금으로 차례를 세웠습니다. 오래 기다리면 저장 전에 409 충돌로 돌려줍니다. 옵션 전체를 멈춘 상태에서도 주문 한 건만 재개할 수 있습니다.

아키텍처

판매채널

  • 주문 수집

    쿠팡 · 토스쇼핑 · 마지막 성공 지점부터 재개

  • 송장 등록

    공급사 송장을 채널에 등록 · 공식 조회로 확인

발주 실행

  • 작업 큐

    일정 시간 동안 한 실행기만 처리 · 재시도 · 중복 발주 방지

  • 공급사 연동

    제출 · 결제 · 송장 회수 · 공급사별 결제 방식

  • 서버 브라우저

    공급사 로그인 인증 복구

기록

  • 단계별 처리 기록

    외부 조회 결과와 다음 처리 단계를 함께 기록

  • 감사 이력

    기존 이력은 보존하고 새 이벤트만 추가 · 결과를 모르면 보류

주문 접수후보 선정상품 준비공급사 제출공급사 결제출고⁠·⁠송장 확인채널 송장 등록배송 중 확인배송 완료 확인