MD-08 · 수량별 가격 + 복제코드 정리

수량별 가격 관리 (개수·배수·박스 구간 + 복제코드 정리)

1개 히어로코드에 개수·배수·박스 단위 수량 구간별 가격을 부여하고, 스캔 오류로 생긴 복제코드를 대표코드로 병합·정리한다.

🔴 결정 대기 상품관리 가격/옵션 확장 복제코드 정리
➕ 기능 추가
무엇 — 1개 히어로코드에 개수·배수·박스 단위 수량 구간별 가격을 부여하고, 스캔 오류로 생긴 복제코드를 대표코드로 병합·정리한다.📍 위치: 상품관리 › 가격 관리 › 수량별 가격

핵심 결정

가격 모델
1개 코드에 개수·배수·박스 단위 수량 구간별 단가 (예: 1개 5,000 / 10개~ 4,000×박스 / 20개~ 3,500×박스)
구현 방식
텍스트 전용인 기존 seller_product_option은 가격을 못 담아 구간 단가표(신규) 추가로 확장
복제 규모
parent_hero_code 보유 118건 / 부모 68개 → 대표코드로 수작업 병합
넷 공급가
구간마다 net_price(소문자) 저장, 판매가<net 시 역마진 경고
결정 대기
🔴 박스 수량 마스터 산출물 형태(신규 컬럼 vs 마스터 테이블) 미정
01

화면 — 먼저 보기

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

착수 전 박스 수량 마스터 산출물과 개수/배수/박스 단위 정책 확정 필요(💬 논의). 복제코드는 실측 118건·부모 68개로 수작업 정리(대폭 완화).
현행 화면 · 실제 캡처
현행 「가격수정」 모달(수량 탭) — 수량별 가격 + 복제코드 정리
현행 「가격수정」 모달(수량 탭) — 수량별 가격 + 복제코드 정리
변경안 · 제안 화면
상품관리 › 가격 관리 › 수량별 가격기능 추가
복제여부 ▾🔍 히어로코드·상품명 검색구간 추가복제코드 정리
히어로코드상품명공급사가격 구간 🆕최저 단가net 공급가 🆕복제여부 🆕상태
HERO-000159앵커 무염버터 454g서울우유3구간3,500원net 3,050원대표노출중
HERO-0009C0대상 청정원 카놀라유 18L대상2구간28,000원net 25,400원-노출중
HERO-00092E곰표 중력분 20kg대한제분미설정22,000원net 20,100원복제(자식)숨김

▲ 수량별 가격 목록 — 바뀌는 컬럼은 🆕 로 표시(예시 데이터)

1
가격 관리 진입 — 상품관리 › 가격 관리 › 수량별 가격 목록에서 상품을 검색. 가격 구간 수·최저 단가·복제여부가 한눈에 표시된다.
2
구간 추가 모달 — 상품 행에서 '구간 추가'를 열어 개수/배수/박스 단위로 시작수량과 단가를 입력. 박스 선택 시 박스당 수량을 함께 지정한다.
3
구간 검증·넷 표시 — 저장 시 구간 겹침·역순을 검증하고, 구간별 넷 공급가(net)를 표시. 판매가가 net보다 낮으면 역마진 경고를 띄운다.
4
복제여부로 묶음 검색 — '복제코드 정리'에서 복제여부/부모 코드로 검색해 스캔 오류 중복 묶음(부모 68개)을 조회한다.
5
대표코드 병합 — 묶음에서 대표(부모)를 지정하고, 자식의 주문내역을 대표코드로 이어붙임. 장바구니·북마크 참조를 확인 후 병합/삭제한다.
6
반영·이력 기록 — 병합 결과와 이어붙인 주문 건수를 merge_log에 기록. 구간 가격은 앱(사장님)에 수량별 단가로 노출된다.
02

정책 / 정의

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

용어 정의
용어정의
히어로코드상품 식별 표준키(seller_product.hero_product_code). 수량 구간·복제 병합의 기준 코드.
넷 공급가(net)매입 순공급가. seller_product.net_price(소문자 net)에 저장, 구간별로도 관리.
수량 구간시작 수량(min_qty) 기준으로 나눈 가격 계단. 구간마다 단가·단위·넷 공급가를 가짐.
단위 3종개수(EACH)·배수(MULTIPLE)·박스(BOX). 박스는 상품별 박스당 수량이 있어야 단가 계산 가능.
복제코드스캔 오류 등으로 같은 상품에 중복 생성된 코드. parent_hero_code로 부모(대표)를 가리킴.
대표코드복제 묶음에서 존치할 부모 히어로코드. 병합 시 자식의 주문내역·매핑이 이 코드로 이어붙는다.
DC 작업 코드(허브코드)물류센터 작업용 코드. hero_code_mapping(type='hub')에 매핑. '이지어드민 코드' 명칭 미사용.
정책 (규칙)
#규칙비고
1수량 구간은 시작수량(min_qty) 오름차순, 구간 겹침 금지동일 코드 내 min_qty 유일. 저장 시 겹침·역순 검증. 미설정 구간은 상품 기본가(price) 적용.
2단위는 개수/배수/박스 3종, 박스는 박스당 수량 필수💬 논의 항목. 배수·박스 단위 단가는 (박스당 수량 × 단가)로 환산 노출.
3박스 수량 마스터 산출물은 🔴 [결정 필요]가정: seller_product.box_quantity 신규 컬럼으로 상품별 관리. 마스터 테이블 분리안도 논의 대상.
4구간마다 넷 공급가(net_price) 저장, 역마진 경고판매 단가 < net 공급가면 저장 전 경고. net 미입력 시 상품 기본 net_price 상속(가정).
5복제 묶음은 parent_hero_code로 식별, 대표 1개 지정'복제여부/부모 코드' 검색으로 묶음 조회. 대표=부모 히어로코드 1개.
6병합 시 자식 주문내역을 대표코드로 이어붙임member_order_details의 hero_product_code/parent_hero_code를 대표코드로 재기입(과거 주문 보존).
7삭제·병합 전 타 참조 확인, 참조 있으면 차단장바구니(member_cart)·북마크(member_bookmark_product)·진행 주문 참조 시 병합만 허용, 물리 삭제 차단.
8DC 작업 코드(hub) 매핑은 대표코드로 재매핑병합 시 hero_code_mapping(type='hub')의 자식 매핑을 대표코드로 옮기거나 삭제.
9복제 정리는 실측 118건·부모 68개 수작업자동 병합 배치 아님. 어드민 화면에서 건별 확인 후 병합(대폭 완화된 선행B).
03

ERD

데이터 구조 · 관계 · DDL

seller_product_volume_price 신규
hero_product_codePK varchar(20)
tier_noPK integer
min_qtyinteger
unit_typevarchar(10)
box_qtyinteger
sell_priceinteger
net_pricebigint
created_byvarchar(20)
created_ontimestamp
수량 구간별 가격표(신규). 히어로코드 1개에 구간·단위·단가·넷 공급가를 여러 행으로.
seller_product WRITE
hero_product_codePK varchar(100)
parent_hero_codeFK varchar(20)
priceinteger
net_pricebigint
box_quantityinteger
상품 마스터. parent_hero_code로 복제 관계 보유(실측 118/부모68). 박스 수량 마스터 컬럼 추가(가정).
seller_product_option READ
hero_product_codePK varchar(20)
select_keyPK integer
option_valuevarchar(50)
기존 옵션(색상/사이즈 등 텍스트 속성). 가격 필드가 없어 이 티켓의 구간 단가는 신규 표로 확장.
hero_code_mapping READ
hero_product_codePK varchar(100)
typePK varchar(30)
specific_codevarchar(100)
관리코드 매핑(현재 type='hub' 356건 = DC 작업 코드). 병합 시 대표코드로 재매핑 대상.
member_order_details READ
hero_product_codevarchar
parent_hero_codevarchar(20)
주문 상세. parent_hero_code 보유 → 복제 병합 시 과거 주문을 대표코드로 이어붙일 근거.
seller_product_volume_price.hero_product_code = seller_product.hero_product_code (구간표 → 상품, 1:N)
seller_product.parent_hero_code → seller_product.hero_product_code (복제 자식→부모 자기참조)
hero_code_mapping.hero_product_code = seller_product.hero_product_code (type='hub' → DC 작업 코드, 병합 시 재매핑)
member_order_details.hero_product_code = seller_product.hero_product_code (병합 시 대표코드로 이어붙이기)
member_cart.hero_product_code = seller_product.hero_product_code (삭제 전 참조 확인)
-- 1) 수량 구간별 가격표 (신규)
CREATE TABLE seller_product_volume_price (
    hero_product_code varchar(20)  NOT NULL,           -- 대상 히어로코드(FK)
    tier_no           integer      NOT NULL,           -- 구간 번호(1,2,3…)
    min_qty           integer      NOT NULL,           -- 구간 시작 수량(이상)
    unit_type         varchar(10)  NOT NULL DEFAULT 'EACH', -- EACH개수 / MULTIPLE배수 / BOX박스
    box_qty           integer      NULL,               -- 박스당 수량(unit_type=BOX일 때) — 가정
    sell_price        integer      NOT NULL,           -- 해당 구간 판매 단가
    net_price         bigint       NULL,               -- 해당 구간 넷 공급가(소문자 net)
    created_by        varchar(20)  NOT NULL,           -- 등록 관리자
    created_on        timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT seller_product_volume_price_pk PRIMARY KEY (hero_product_code, tier_no),
    CONSTRAINT seller_product_volume_price_fk
        FOREIGN KEY (hero_product_code) REFERENCES seller_product (hero_product_code),
    CONSTRAINT chk_unit_type CHECK (unit_type IN ('EACH','MULTIPLE','BOX')),
    CONSTRAINT chk_box_qty  CHECK (unit_type <> 'BOX' OR box_qty IS NOT NULL)
);
-- 동일 상품 내 구간 시작수량 겹침 방지
CREATE UNIQUE INDEX ux_volume_price_min_qty
    ON seller_product_volume_price (hero_product_code, min_qty);
COMMENT ON TABLE seller_product_volume_price IS '히어로코드별 수량 구간 가격(개수·배수·박스)';

-- 2) 박스 수량 마스터 (가정: 상품 컬럼 추가) — 🔴 결정 필요(마스터 테이블 분리안과 택1)
ALTER TABLE seller_product
    ADD COLUMN box_quantity integer NULL;              -- 상품별 박스당 수량 마스터
COMMENT ON COLUMN seller_product.box_quantity IS '박스당 수량 마스터(BOX 단위 단가 환산용) — 결정 대기';

-- 3) 복제 병합 감사 로그 (신규, 이력·이어붙이기 추적)
CREATE TABLE seller_product_merge_log (
    id                bigserial    PRIMARY KEY,
    parent_hero_code  varchar(20)  NOT NULL,           -- 존치한 대표코드
    child_hero_code   varchar(20)  NOT NULL,           -- 병합된 자식코드
    moved_order_cnt   integer      NOT NULL DEFAULT 0, -- 대표코드로 이어붙인 주문 건수
    action            varchar(10)  NOT NULL,           -- MERGE 병합 / DELETE 삭제
    merged_by         varchar(20)  NOT NULL,           -- 처리 관리자
    merged_on         timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE seller_product_merge_log IS '복제코드 정리(병합/삭제) 이력';
04

화면 상세 — 세부 표·규칙

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

수량 구간별 가격 모달 (구간표)
구간시작 수량단위박스당 수량판매 단가net 공급가
1구간1개~개수-5,000원net 4,300원
2구간10개~박스104,000원 ×박스net 3,500원
3구간20개~박스203,500원 ×박스net 3,050원
시작 수량 오름차순·겹침 금지. 박스 단위는 박스당 수량(마스터) 필수. 판매가
복제코드 정리 (부모 묶음)
대표 히어로코드자식 코드상품명주문 건수장바구니 참조DC 작업코드처리
HERO-000159HERO-01A2F앵커 무염버터 454g(복제)12건2건HUB-00159대표로 병합
HERO-000698HERO-0B21CCJ 백설 식용유(스캔중복)0건0건-삭제 가능
HERO-0009C0HERO-0C7D1카놀라유 18L(중복)3건1건HUB-009C0참조 확인 필요
주문 건수>0이면 물리 삭제 차단·병합만 허용(주문내역 이어붙이기). 병합 시 DC 작업코드(hub) 매핑도 대표코드로 재매핑.