MD-11 · 업로드 자동 그룹핑

업로드 자동 그룹핑 검수 (같음·수정·제외 건별 확인)

업로드 상품을 1차 자동 그룹핑해 후보를 제시하고, MD가 같음·수정·제외 3버튼으로 건별 확정한다. 임계 99.9% 신뢰 전까지 전건 사람 확인.

🟡 준비 필요 매칭 엔진 재사용 가격 오염 방지 MD 검수 UI
🆕 신규 화면 개발
무엇 — 업로드 상품을 1차 자동 그룹핑해 후보를 제시하고, MD가 같음·수정·제외 3버튼으로 건별 확정한다. 임계 99.9% 신뢰 전까지 전건 사람 확인.📍 위치: 상품관리 › 공급사 상품 등록 › 업로드 검수

핵심 결정

확정 임계
99.9% 신뢰 전까지 전건 사람 확인 (review_decision=PENDING 기본)
매칭 엔진
「공급사 상품등록」 재사용 — 이름 75% → 이름+중량 86% (top1 자동확정 불가)
검수 워크플로우
같음=자동그룹 확정 / 수정=그룹코드 지정·신규 / 제외=제외분 엑셀 재다운
강제 수동
신선·수산은 신뢰도 무관 자동확정 금지 (auto_confirm_blocked)
후보 없음
매칭 0건 → 신규 등록 플로우로 분기 (NEW)
01

화면 — 먼저 보기

이 티켓이 실제로 어떤 화면이 되는지 먼저 봅니다

자동 그룹핑은 후보 제시까지만 — 임계 99.9% 전까지 전건 사람 확인, 신선·수산은 신뢰도 무관 자동확정 금지.
현행 화면 · 실제 캡처
현행 「상품관리」 목록 — 업로드 자동 그룹핑 대상
현행 「상품관리」 목록 — 업로드 자동 그룹핑 대상
변경안 · 제안 화면
🔍 통합검색관리자 ▾
📊 대시보드
📦 상품관리
🧾 주문관리
🏬 재고관리
🎯 프로모션
💳 정산
⚙️ 설정
상품관리 › 공급사 상품 등록 › 업로드 검수신규 화면
검수상태 ▾카테고리 ▾🔍 상품명·히어로코드 검색일괄 확인(같음)제외분 엑셀 재다운
업로드 상품명중량원산지카테고리매칭 후보(히어로코드·상품명) 🆕신뢰도 🆕검수 결정 🆕
1청양고추 1kg 상1kg국산채소>고추HERO-004821 · 청양고추(1kg)96.2%[같음] [수정] [제외]
2국내산 삼치(냉동)800g국산수산>삼치HERO-011903 · 삼치 원물 800g88.4%🚫자동확정 금지 · 수동
3깐마늘 1kg1kg중국산채소>마늘후보 없음[신규 등록]
총 128건 · 20/page123

▲ 업로드 검수 현황 — 바뀌는 컬럼은 🆕 로 표시(예시 데이터)

1
엑셀 업로드 — 공급사가 상품 엑셀을 업로드하면 seller_product_request 배치가 생성되고 행들이 seller_product_request_item으로 적재된다.
2
1차 자동 그룹핑 — 매칭 엔진(이름+중량+원산지+카테고리)이 행별 top-3 후보를 산출해 seller_product_match_candidate에 저장하고 top1 신뢰도를 item에 기록한다.
3
검수 현황 화면 진입 — MD가 어드민 업로드 검수 화면에서 업로드 상품·후보·신뢰도를 나란히 본다. 신선·수산 행은 자동확정 금지 뱃지로 강조된다.
4
건별 확인(같음) — 후보가 맞으면 '같음' 클릭 → 후보 그룹으로 자동 그룹핑 확정, hero_product_code·group_id 반영, 검수 이력 기록.
5
수정 / 제외 분기 — 후보가 틀리면 '수정'으로 다른 그룹코드 지정·신규 생성, 또는 '제외'로 보류. 후보가 아예 없으면 신규 등록 플로우로 이동.
6
제외분 엑셀 재다운 — 제외(EXCLUDE) 행만 모아 엑셀로 재다운로드해 공급사에 재작업 요청, 배치의 success/fail 카운트를 갱신한다.
02

정책 / 정의

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

용어 정의
용어정의
자동 그룹핑업로드된 공급사 상품 행을 오더히어로 운영 그룹(히어로코드)에 1차 자동 매핑하는 로직. 확정이 아니라 후보 제시까지만 수행하고 최종은 MD가 건별 확인한다.
히어로코드상품 식별 표준키(hero_product_code). 여러 공급사 상품이 하나의 히어로 그룹으로 묶여 가격비교·주문의 기준이 된다.
매칭 후보(top-3)매칭 엔진이 유사도 순으로 제시하는 최대 3개 그룹 후보. top1 자동확정이 아닌 후보 선택 방식(top1 정확도 약 75~86%라 자동확정 불가).
신뢰도 임계 99.9%이 신뢰도에 도달하기 전까지는 사람(MD)이 반드시 건별 확인. 현 매칭 엔진은 임계 미달이므로 전건 수동 검수가 원칙.
검수 결정(같음/수정/제외)행별 3버튼 워크플로우. 같음=후보로 자동그룹 확정, 수정=별도 그룹코드 지정 또는 신규 생성, 제외=검수 보류 후 제외분만 엑셀 재다운.
넷 공급가(net)매입 순공급가(net_price). 오매칭 시 잘못된 그룹의 가격비교 기준을 오염시키므로 검수의 핵심 방지 대상.
DC 작업 코드관리코드 4종(히어로코드·공급사상품코드·복제코드·DC 작업 코드) 중 물류센터 작업용 허브코드. '이지어드민 코드' 명칭은 사용 금지.
정책 (규칙)
#규칙비고
1임계 99.9% 신뢰 전까지 전건 사람 확인자동 그룹핑 결과는 후보일 뿐 자동 확정하지 않는다. review_decision 기본값 PENDING. 임계 도달 시에만 자동확정 정책 재검토(가정: 카테고리별 단계 개방).
2신선·수산 카테고리는 자동확정 금지신뢰도와 무관하게 auto_confirm_blocked=true로 강제 수동검수. 원물 편차가 커 오매칭 시 가격 오염 위험이 가장 큼(원문 명시).
3같음 → 후보 그룹으로 자동 그룹핑 확정top-1 후보의 group_id·hero_product_code를 item에 확정 반영. reviewed_by/reviewed_at 기록.
4수정 → 별도 그룹코드 지정 또는 신규 그룹 생성제시 후보가 틀린 경우 MD가 다른 히어로코드를 직접 지정하거나 신규 그룹을 만든다. review_decision=EDIT.
5제외 → 제외분만 엑셀 재다운로드해당 스쿱(행)만 제외 리스트로 모아 엑셀 재다운. 공급사 재작업/재견적 후 재업로드 대상. review_decision=EXCLUDE.
6후보 없음 → 신규 등록 플로우로 분기매칭 후보가 0건이면 신규 상품 등록 화면으로 이동(review_decision=NEW). 「공급사 상품등록」 신규 플로우 재사용.
7매칭 엔진은 「공급사 상품등록」 기획 재사용char n-gram cosine 기반. 이름만 top1 약 75%, 이름+중량 top1 약 86%. 착수 전 다필드(이름+중량+원산지+카테고리) top-3 적중률 스파이크로 게이트(가정).
8가격비교 기준 오염 방지가 최우선 목적잘못 묶인 넷 공급가 1건이 그룹 전체의 최저가·가격비교를 왜곡. 예외·오매칭 방지가 검수 UI의 존재 이유.
9검수 이력은 감사 가능하게 저장누가(reviewed_by) 언제(reviewed_at) 어떤 결정을 했는지 행 단위로 남긴다. 배치 단위 집계는 seller_product_request의 success/fail 카운트 갱신.
03

ERD

데이터 구조 · 관계 · DDL

seller_product_request READ
idPK bigint
seller_idvarchar(100)
statusvarchar(20)
total_countinteger
success_countinteger
fail_countinteger
업로드 배치 헤더(엑셀 1건). 상태·건수 집계 재사용, 신규 컬럼 불필요.
seller_product_request_item WRITE
idPK bigint
request_idFK bigint
group_idinteger
hero_product_codevarchar(100)
main_product_nametext
weightvarchar(255)
net_pricebigint
review_decisionvarchar(20)
top_match_scorenumeric(5,2)
auto_confirm_blockedboolean
reviewed_byvarchar(50)
업로드 스테이징 행. 검수 결정·신뢰도·강제수동 컬럼 ALTER 추가.
seller_product_match_candidate 신규
idPK bigserial
request_item_idFK bigint
rankinteger
group_idinteger
hero_product_codevarchar(100)
candidate_nametext
scorenumeric(5,2)
match_fieldvarchar(30)
행별 자동 매칭 후보 top-3. 검수 화면의 같음/수정 선택지 원천.
hero_code_mapping READ
hero_product_codePK varchar(100)
typePK varchar(30)
specific_codevarchar(100)
히어로코드↔관리코드 4종 매핑. 확정 시 코드 표시·검증에 참조.
seller_product READ
hero_product_codevarchar(100)
group_idinteger
parent_hero_codevarchar(20)
기존 운영 상품·그룹. 매칭 후보 산출의 카탈로그 소스.
seller_product_request 1 : N seller_product_request_item (request_id)
seller_product_request_item 1 : N seller_product_match_candidate (request_item_id, top-3)
seller_product_match_candidate.hero_product_code → seller_product.hero_product_code (추천 그룹 카탈로그)
seller_product_request_item.hero_product_code → hero_code_mapping.hero_product_code (확정 후 관리코드 4종 조회)
-- [MD-11] 업로드 자동 그룹핑 검수: 매칭 후보 저장 + 검수 결정 필드 추가
-- 기존 seller_product_request(업로드 배치) / seller_product_request_item(스테이징 행)은 재사용

-- 1) 신규: 업로드 행별 매칭 후보(top-3) 저장 테이블
CREATE TABLE seller_product_match_candidate (
    id                bigserial     PRIMARY KEY,                 -- 후보 PK
    request_item_id   bigint        NOT NULL,                    -- 업로드 스테이징 행 FK
    rank              integer       NOT NULL,                    -- 후보 순위 1~3 (top-3 제시)
    group_id          integer,                                   -- 추천 그룹ID(기존 그룹핑 대상)
    hero_product_code varchar(100),                              -- 추천 히어로코드
    candidate_name    text,                                      -- 후보 대표 상품명(비교 표시용)
    weight            varchar(255),                              -- 후보 중량(이름+중량 매칭 근거)
    score             numeric(5,2)  NOT NULL,                    -- 유사도 신뢰도(%) 0.00~100.00
    match_field       varchar(30)   NOT NULL DEFAULT 'NAME',     -- 매칭근거: NAME/NAME_WEIGHT/FULL
    created_at        timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul'),
    CONSTRAINT fk_spmc_item FOREIGN KEY (request_item_id)
        REFERENCES seller_product_request_item(id)
);
CREATE INDEX idx_spmc_item ON seller_product_match_candidate(request_item_id, rank);
COMMENT ON TABLE seller_product_match_candidate IS 'MD-11 업로드 행별 자동 매칭 후보(top-3). 검수 화면에서 같음/수정 선택지로 제시';

-- 2) 변경: 스테이징 행에 검수 결정/신뢰도/강제수동 플래그 추가
ALTER TABLE seller_product_request_item
    ADD COLUMN review_decision     varchar(20)  NOT NULL DEFAULT 'PENDING', -- PENDING/SAME/EDIT/EXCLUDE/NEW
    ADD COLUMN top_match_score      numeric(5,2),                            -- 1순위 후보 신뢰도(%) 정렬·자동확정 판정용
    ADD COLUMN auto_confirm_blocked boolean      NOT NULL DEFAULT false,     -- 신선·수산 등 자동확정 금지(강제 수동검수)
    ADD COLUMN reviewed_by          varchar(50),                             -- 검수 담당 MD
    ADD COLUMN reviewed_at          timestamp;                               -- 검수 완료 시각
COMMENT ON COLUMN seller_product_request_item.review_decision IS '건별 검수 결정: SAME=자동그룹확정, EDIT=그룹코드지정/신규, EXCLUDE=제외분엑셀재다운, NEW=후보없어 신규등록';
COMMENT ON COLUMN seller_product_request_item.auto_confirm_blocked IS '신선·수산 카테고리는 신뢰도 무관 자동확정 금지(가격비교 오염 방지)';
04

화면 상세 — 세부 표·규칙

목록 외 품목표·모달·규칙 등 세부 화면

다름 → 수정 모달 (그룹코드 지정 / 신규)
항목업로드 값매칭 후보 top-3조치
상품명국내산 삼치(냉동) 800g①삼치 원물 800g(88%) ②삼치 손질 1kg(71%) ③고등어 800g(55%)후보 선택
그룹 지정(미지정)히어로코드 직접 입력 → HERO-______그룹코드 지정
신규 생성후보 모두 부적합신규 그룹 생성 → 신규 등록 플로우
수정 결정 시 top-3 중 선택하거나 히어로코드 직접 지정, 또는 신규 그룹 생성. 확정 시 관리코드 4종(hero_code_mapping) 연동.
매칭 신뢰도·자동확정 규칙표
매칭 근거top1 정확도자동확정처리
이름만(NAME)≈75%불가사람 확인 필수
이름+중량(NAME_WEIGHT)≈86%불가사람 확인 필수
전체명 일치(FULL) / ≥99.9%≈99.7%조건부(임계 도달 시)신선·수산은 여전히 금지
가정: 임계 99.9% 도달 카테고리만 단계적 자동확정 개방. 신선·수산은 예외 없이 수동(가격비교 오염 리스크).