MD-14 · 재고 이지어드민 연동 (엑셀 업로드)

이지어드민 재고 엑셀 업로드 연동

이지어드민(늘품) 재고를 엑셀로 받아 어드민 재고에 반영합니다. API 실시간 연동 대신(설치비 200만+월20만+@ 회피) — 담당 MD가 산출 전 업로드. 타입1 전체 / 타입2 담당분 둘 다.

🟡 MD-01·04 + 03 선행 API 대신 엑셀 업로드 타입1 전체 · 타입2 담당분 스냅샷 동기화
🆕 신규 화면 개발 (이지어드민 업로드)
무엇 — 이지어드민 재고 엑셀을 업로드해 우리 재고와 대사·동기화. 여러 MD가 하루 10회 내외 올려도 안전하게(중복·순서 관리).📍 위치: 재고관리 › 이지어드민 업로드 (신규)

핵심 결정

방향
API 실시간 연동 폐기 → 엑셀 업로드 · API는 설치비 200만 + 매달 20만+@ 고정비라 이 기능 하나엔 과함
방식
스냅샷 동기화(덮어쓰기) — 증분 아님. 엑셀 = 그 시점 이지어드민 재고 스냅샷 → 그 값으로 맞춤
타입
타입1 전체(전체 덮어쓰기) · 타입2 담당분(담당 범위 내만 덮어쓰기 — 남의 상품 안 건드림)
안전장치
기준시각 역행 차단 · 중복 스냅샷 무시 · 멱등 반영 · 업로드 이력 — 3명이 하루 10회 올려도 안전
매핑
엑셀은 이지어드민 코드(=DC 작업 코드)로 옴 → MD-03 매핑으로 히어로코드 연결 · 미매핑은 수기 큐
01

화면 — 먼저 보기

재고관리 › 이지어드민 업로드 (신규 화면)

흐름 — ① MD가 이지어드민에서 재고 엑셀 다운로드 → ② 어드민 「이지어드민 업로드」에서 타입 선택 + 엑셀 첨부 → ③ 프리뷰(대사)로 반영/스킵/미매핑 확인 → ④ 반영 → 재고 동기화. 그다음 재고회전(MD-04) 산출.
🔍 통합검색morty ▾
📊 대시보드
📦 상품관리
🧾 주문관리
🏬 재고관리
🎯 프로모션
💳 정산
⚙️ 설정
재고관리 › 이지어드민 업로드 신규 화면
업로드일 ▾타입 ▾업로더 ▾+ 엑셀 업로드
업로드 일시업로더(MD)타입 🆕기준시각 🆕총라인반영스킵미매핑 🆕상태
08-05 09:12엠버전체08-05 09:001,2401,22857반영완료
08-05 10:41모티담당분(음료)08-05 10:3031230912반영완료
08-05 11:03담당분(가공)08-05 08:5018001800차단(기준시각 역행)
총 업로드 218건 · 오늘 10건

▲ 이지어드민 업로드 회차 목록 — 타입·기준시각·미매핑·상태로 중복/역행을 한눈에

1
엑셀 업로드 진입 — [+ 엑셀 업로드] → 모달: 타입 선택(전체/담당분) + 엑셀 첨부 + (담당분이면 범위 확인)
2
파싱 & 매핑 — 이지어드민 코드(=DC 작업 코드)를 MD-03 매핑으로 히어로코드에 붙임 · 미매핑 행 표시
3
프리뷰(대사) — 어드민 현재고 vs 엑셀 스냅샷 비교 → 반영/스킵/미매핑 요약 · 기준시각 역행이면 차단 · 동일 스냅샷이면 중복 무시
4
반영 — 스냅샷 값으로 동기화(덮어쓰기)stock_entry append + stock_balance 재계산 (멱등)
5
미매핑 수기 큐 — 코드 매핑 안 된 행은 수기 확인 큐로 · 이력(누가·언제·몇 건)
02

정책 / 정의

용어를 못 박고, 규칙을 명확히

용어 정의
용어정의
이지어드민 엑셀늘품 창고(이지어드민)의 재고 스냅샷 엑셀 — 이지어드민 코드(=DC 작업 코드)·재고수량 등
스냅샷 동기화엑셀 = 그 시점 재고 상태 → 우리 재고를 그 값으로 맞춤(증분 ± 아님)
타입1 전체전체 재고 엑셀 → 전체 덮어쓰기
타입2 담당분담당 MD의 상품 범위 엑셀 → 그 범위 안에서만 덮어쓰기(남의 상품 유지)
기준시각엑셀 스냅샷의 기준 시점 — 역행 업로드 차단
미매핑DC 작업 코드가 히어로코드에 매핑 안 된 행 → 수기 큐
정책 (규칙)
#규칙비고
1API 대신 엑셀 업로드 — 실시간 API 폐기(설치비 200만+월20만+@ 회피)방향 전환
2스냅샷 동기화(덮어쓰기) — 엑셀 값으로 재고를 맞춤. 여러 번 올려도 최신 스냅샷으로 수렴 → 이중 반영 없음핵심
3타입1 전체 = 전체 덮어쓰기 / 타입2 담당분 = 담당 범위 내만 덮어쓰기범위 밖 상품 미변경
4기준시각 역행 차단 — 이미 반영된 것보다 오래된 스냅샷 업로드 시 경고/차단(롤백 사고 방지)안전
5중복 스냅샷 무시 — 동일 기준시각·내용 재업로드는 스킵(멱등)안전
6DC 작업 코드로 매핑 — 이지어드민 코드→히어로코드(MD-03) · 미매핑은 수기 큐MD-03 선행
7반영 = stock_entry append(source='ez_upload') + stock_balance 재계산 · 멱등키이관
8업로드 이력 — 업로더·시각·타입·반영/스킵/미매핑 건수 기록추적
확인 필요타입2 "담당 범위" 기준을 하나 정해야 합니다 — 그룹코드 범위 / 카테고리 / 공급사 / MD 담당 지정 중 무엇? (기본안: 카테고리 또는 공급사 단위)
03

ERD

업로드 헤더/라인 + 재고 원장(재사용)

ez_upload 신규
idPK
uploaded_byMD
upload_typeFULL/PARTIAL
snapshot_at기준시각
scope_ref담당범위
total/appliedint
skipped/unmatchedint
statusenum
file_urlvarchar
업로드 회차 헤더 · 중복/역행 판정 기준
ez_upload_line 신규
idPK
upload_idFK
dc_work_code이지 코드
hero_code매핑
center_code
ez_qty엑셀 재고
admin_qty_before반영 전
match_statusmatched/unmatched
applied_entry_idFK null
라인별 대사·반영 결과
stock_entry WRITE
idPK
hero_codeFK
change_qty± 동기화분
source'ez_upload'
idempotency_key멱등
created_by/at
MD-01·04와 공유하는 재고 원장(append)
hero_code_mapping READ
hero_product_code기존
type='hub'DC
specific_codeDC 작업 코드
MD-03가 채운 매핑(엑셀 코드↔히어로)
ez_upload_line.upload_id → ez_upload.id
ez_upload_line.dc_work_code → hero_code_mapping.specific_code (type='hub') → hero_code
반영: 스냅샷 diff → stock_entry append(source='ez_upload', idempotency_key=upload_id+line) → stock_balance 재계산
중복/역행: 동일 snapshot_at·내용 → skip · snapshot_at < 최근 반영본 → 차단
-- 이지어드민 엑셀 업로드 회차
CREATE TABLE ez_upload (
  id            BIGSERIAL PRIMARY KEY,
  uploaded_by   VARCHAR NOT NULL,          -- 업로더(MD)
  upload_type   VARCHAR NOT NULL,          -- FULL(전체) / PARTIAL(담당분)
  snapshot_at   TIMESTAMPTZ NOT NULL,      -- 엑셀 기준시각(역행 차단)
  scope_ref     VARCHAR,                     -- 담당 범위(카테고리/공급사 등) · PARTIAL만
  total_lines   INT, applied_lines INT, skipped_lines INT, unmatched_lines INT,
  status        VARCHAR NOT NULL,          -- previewed/applied/blocked/duplicated
  file_url      VARCHAR,
  created_at    TIMESTAMPTZ DEFAULT now()
);
-- 라인별 대사·반영 결과
CREATE TABLE ez_upload_line (
  id             BIGSERIAL PRIMARY KEY,
  upload_id      BIGINT NOT NULL REFERENCES ez_upload(id) ON DELETE CASCADE,
  dc_work_code   VARCHAR NOT NULL,          -- 이지어드민 코드(=DC 작업 코드)
  hero_code      VARCHAR,                     -- 매핑 결과(미매핑 시 NULL)
  center_code    VARCHAR,
  ez_qty         INT,                         -- 엑셀 재고(스냅샷)
  admin_qty_before INT,                       -- 반영 전 어드민 재고
  match_status   VARCHAR NOT NULL,          -- matched / unmatched
  applied_entry_id BIGINT                      -- 반영된 stock_entry FK
);
CREATE INDEX ON ez_upload (snapshot_at);
04

타입1 / 타입2 · 화면 상세

업로드 모달과 두 타입의 차이

🔵 타입1 · 전체

전체 재고 엑셀 업로드 → 전 상품 스냅샷 동기화. 엑셀에 없는(0인) 상품은 정책에 따라 0 처리 또는 유지 (확인 필요). 가장 단순.

🟡 타입2 · 담당분

담당 MD의 범위(카테고리/공급사) 안에서만 덮어쓰기. 범위 밖 상품은 그대로 유지. 3명이 각자 담당분만 올려도 서로 안 밟음.
업로드 모달
필드설명
업로드 타입전체 / 담당분 (담당분이면 범위 표시)
엑셀 파일이지어드민 재고 엑셀 (.xlsx)
기준시각엑셀에서 자동 추출 or 입력 — 역행 차단 기준
프리뷰총 N행 / 반영 M / 스킵 K / 미매핑 U · 역행·중복이면 경고
[반영]동기화 실행 (멱등)
대사 라인 (프리뷰 예시)
DC 작업 코드히어로코드엑셀 재고어드민 재고반영 ±상태
85156HERO-008737134135-1반영
85160HERO-0089024042-2반영
90021(미매핑)7--미매핑·수기
엑셀 재고가 어드민 재고와 다르면 그 차이만큼 stock_entry로 반영해 스냅샷 값에 맞춤. 미매핑은 수기 큐로.