개요
회사에서 재고 실사를 하면 전산과 실물재고가 다른 경우가 있었습니다. 이 문제를 해결하기 위해 현재 상황을 분석하여 원인을 파악하고 개선한 내용을 정리합니다.
1. 지점별 제품/부품 추천 갯수 개선하기
- 문제점
각 지점에서 고객에게 설치를 하기 위해 제품, 부품 재고를 주문하는데 재고가 많이 남거나, 부족해서 재고가 필요한 곳에 제대로 전달되지 못하거나 자주 주문해야 하는 경우가 있었습니다. 이를 개선해 한 번 주문할 때 적정 재고를 주문할 수 있도록 권장 주문수량, 최수 주문수량을 추가했습니다.
그럼에도, 각 지점에서 설치, 교환에 필요한 재고들을 주문하는데 수량 제한이 없다보니 재고가 마이너스로 관리되는 경우들이 있었습니다. 예를 들어, 창고에 있는 제품 A가 재고가 5개밖에 없는데 3개의 지국에서 각각 10개씩 주문한다면, 재고는 10을 3번 빼므로 -25가 되고 재고가 부족하므로 제 때 출고를 할 수 없습니다. 따라서, 지국에서 이 부분을 개선해 적정한 주문을 하고 현업에서 응대할 수 있도록 고도화했습니다.
- (V1) 전월 출고량, 권장 주문수량, 최소 주문수량 추가
기존에는 현재 재고수량만 있었는데 좀 더 정확한 데이터를 알려주기 위해서 전월 출고량, 권장 주문수량, 최소 주문수량, 비고를 추가했습니다. 권장 주문수량과 최소 주문수량은 재고테이블에 칼럼을 추가했습니다. 각 창고에 있는 제품들마다 MIN_QTY(최소 주문수량), OPT_QTY(권장 주문수량)을 물류 직원과 협의하여 설정했습니다.
V1 방식도 효과가 있었지만 각 지국마다 데이터가 상이하다는 특징을 고려하여 이전 판매량을 기준으로 주문수량을 추천하도록 개선했습니다.
- (V2 - 1) 지점별 추천 수량으로 개선하기
처음에는 재고 테이블에서 고정된 데이터를 사용하였으나 사실 각 지점마다 필요한 제품의 갯수는 다릅니다. 따라서 각 지점에 알맞은 수량을 추천하도록 개선했습니다. 해당 지점에서 전월에 사용한 수량을 이용하여 계산식을 만들었습니다.
최소 주문수량 = ROUND(해당 지점 전월 설치수량 * 0.35 - 현재 재고수량)
권장 주문수량 = ROUND(해당 지점 전월 설치수량 * 0.5 - 현재 재고수량)
전월 설치 기준을 따르면서 너무 과도하게 주문을 하여 재고를 남기지 않는 것에 유의하여 계산식을 만들었습니다. 매달 필요한 재고 수량이 정량적으로 정해진 것은 아닙니다. 갑자기 설치수량이 늘어날 수도 있고, 줄어들 수도 있습니다. 따라서 최소 주문수량은 전월 대비 약 35%, 최대 주문수량은 전월대비 약 50%를 선정했습니다.
이는 이후 좀 더 객관적인 데이터를 위해 단순히 전월 설치수량이 아닌 직전 3개월 평균 설치수량으로 개선했습니다.
최소 주문수량 = ROUND(해당 지점 직전 3개월 평균 설치수량 * 0.35 - 현재 재고수량)
권장 주문수량 = ROUND(해당 지점 직전 3개월 평균 설치수량 * 0.5 - 현재 재고수량)
- (V2 - 2) 출고제한 프로세스 만들기
최소수량, 권장수량은 참고자료일 뿐 갯수를 제한하지 않습니다. 따라서 특정 제품이 과도하게 주문되어 마이너스 재고가 되는 경우들이 있었습니다. 이를 방지하기 위해 제품별 출고제한을 만들어 특정 갯수 이하로 재고가 떨어지면 주문을 못하도록 막는 프로세스를 개발했습니다.
위와 같이 출고 제한에 제품을 등록하면, 주문 시 등록된 제품이 존재하는 경우 유효성 검사를 합니다.
[현재 재고량 - 주문수량 < 출고제한 수량] 인 경우 주문불가 메세지 알림
창고마다 만약의 경우를 대비해서 최소한의 출고제한을 두어 물류파트에서 관리하도록 했습니다. 해당 데이터를 위한 별도의 테이블을 만들었습니다. 재고테이블에 칼럼을 추가하는 경우, 만약에 한번도 재고가 있던 적이 없어 데이터가 존재하지 않으면 UPDATE가 안되기 때문입니다. 이로써 특정 제품/부품에 과도한 주문이 몰리는 것이 예방되었습니다.
- (V3) 조직 주문 자동화하기
지점별 제품/부품 추천 갯수 개선하기의 최종 버전으로 주문 갯수 추천을 넘어 주문을 자동화하는 작업을 했습니다. 지국/사무소장님들이 주문을 누락하거나 추천 갯수를 의식하지 않고 과도하게 주문을 하는 낭비를 막기 위함입니다. 약 30개의 조직의 주문을 주단위로 자동화하여 매일 아침 9시에 발송하도록 협의했습니다.
필요한 화면은 총 4개로 배송 스케쥴, 산정공식, 주문수량산정, 출고량 조회 화면입니다.
- 배송 스케쥴: 지국/사무소별 상차 요일을 정함
- 산정공식 : 배송 제품 갯수 수식을 계산하기 위해 비율과 최솟값을 정함
- 주문수량산정: 각 지국/사무소별로 제품과 산정공식을 적용해 실제 주문 갯수를 정함
- 출고량 조회: 직전 3개월 동안 출고량(설치, 교환) 통계로 주문수량 정할 때 활용함
- 배송 스케쥴
배송스케쥴을 선택합니다. 지국/사무소와 요일을 선택해서 어느 요일에 보낼지 정합니다. '접수'를 자동화하기 때문에 주말이나 공휴일에 접수해도 상관없습니다. 어차피 창고직원이 업무시간에 확인 후 실제 제품을 보내기 때문입니다. 정말 급한 건들은 직원끼리 연락합니다.
- 산정공식
산정공식에서 기준명과 비율, 최솟값을 설정하며 공식은 아래와 같습니다.
Math.max([(직전 3개월 설치+교환수량) * 비율] - 현재고, 최솟값)
다만, 실제 주문 시 (현재고 - 주문 수량 < 출고제한 갯수)인 경우에는 주문을 하지 않습니다.
- 출고량 조회
특정 조직의 3개월~1개월 설치량과 출고량 통계입니다. 이 자료를 통해 제품이 어느정도 사용이 되었고 어느정도 주문이 필요할지 계산합니다. 특히 단체 설치 건의 경우에는 1개로 처리합니다. 예를 들어 A회사에서 같은 사업자번호로 100대의 정수기를 주문했다면 이 경우에는 1건만 카운트합니다. 단체 건이므로 통계에 모두 합치면 평균 값이 뻥튀기가 되기 때문입니다.
- 주문수량 산정
주문수량 산정으로 실제 해당 조직에 제품을 어떤 산정공식에 의해서 주문 할 것인지 정합니다. 지국/사무소가 "전체"인 경우 모든 지국/사무소에 해당하는 기준입니다. 하지만 특정 지국/사무소를 등록한다면 해당 데이터가 우선순위가 더 높습니다. 만약 아침 9시 이후에 급하게 주문해야하는 건이 있다면, 배송 스케쥴에서 자동 주문하기 버튼을 통해 특정 조직의 배송 스케쥴을 바로 실행할 수도 있습니다. 주문 해야하는 제품들과 기준 바코드는 해당 화면에서 설정합니다.
2. 대체품 이력관리 개선하기
- 문제점
대체품은 현재 조직까지 이력관리가 되고 있지만, 그 이후에 고객에게 설치가 되었는지 조직으로 다시 회수가 되었는지 이력이 관리되고 있지 않습니다. 따라서 대체품으로 사용하고 있음에도불구하고 전상상으로 조직에서 다시 물류센터로 재고가 이동하는 경우가 발생했습니다. 물류센터 직원들은 이런 경우 수기로 대체품을 찾아서 별도로 기록 관리했습니다. 따라서 대체품으로 사용하는 경우 이력을 추가하여 재고관리의 정확성을 높이고자 했습니다.
- 대체품 이력관리 흐름도 계획안 v1
엔지니어가 고객의 집에 대체품을 설치할 때, 어떤 제품을 설치했는지 바코드를 입력하도록 추가했습니다. 또한 엔지니어에게 재고를 분배하고 대체품을 설치하는 계획을 세웠습니다. 하지만 과연 엔지니어에게 대체품 재고를 분배해서 사용하는 것이 최선인가 고민했습니다. 엔지니어에게 대체품 재고를 분배하려면 다음을 해결해야 합니다.
- 대체품 엔지니어 이력관리 시 고려해야할 점
1. 대체품의 기준이 어떤 것인가?
2. 조직장이 엔지니어에게 재고 제품을 배분할 때 대체품인지 아닌지 어떻게 확인하는가?
3. 대체품은 매달 제품 마감 시, 어느 소속의 재고로 계산해야하는가?
4. 대체품을 개인 재고로 마감하면, 엔지니어가 퇴사하거나 타 지국 이동 시 회수는 어떻게 하는가?
엔지니어까지 대체품 재고를 분배하고 이력을 남기려면, 새로운 기준과 정책이 필요하고 그만큼 작업 시간이 길어지며 코딩 양도 많아집니다. 가장 중요한 것은 특정 제품이 대체품으로 사용되고 있는지 여부입니다. 위의 4가지 문제를 단기간에 핵심만 골라 해결할 수 있는 방법은 대체품은 엔지니어로 분배하지 않고 지국 소속으로 그대로 두는 것입니다.
- 대체품 이력관리 흐름도 계획안 v2
엔지니어가 실제로 대체품을 설치/회수 하지만 대체품을 엔지니어에 분배하지 않으므로 전산에서는 이 과정을 따로 관리하지 않습니다. 그렇다면 위의 4가지 고려사항이 아래와 같이 쉽게 해결됩니다.
- 대체품의 기준이 어떤 것인가?
-> 대체품으로 설치할 때 해당 바코드를 입력하는 순간 해당 제품은 대체품으로 기록
- 조직장이 엔지니어에게 재고 제품을 배분할 때 대체품인지 아닌지 어떻게 확인하는가?
-> 조직장이 엔지니어에게 특정 대체품을 배분 할 필요가 없어짐
- 대체품은 매달 제품 마감 시, 어느 소속의 재고로 계산해야하는가?
-> 대체품이 해당 지국 소속이 되므로 기존 재고 마감 배치 그대로 사용
- 대체품을 개인 재고로 마감하면, 엔지니어가 퇴사하거나 타 지국 이동 시 회수는 어떻게 하는가?
-> 대체품은 지국 소속이이고 엔지니어와 무관하므로 위의 상황에 영향을 받지 않음
대체품 이력을 남기고 관리하기 위해서는 아래 2가지를 작업했습니다.
- 바코드 테이블에 대체품 사용여부 칼럼 추가 및 대체품 사용중 이동 제한
바코드 테이블(TB_BCD_B)에 REPLMENT_YN(대체품 사용여부) 칼럼을 추가했습니다. DEFAULT는 'N'으로 대체품으로 사용하지 않도록 하였으나, 엔지니어가 고객의 집에 대체품을 설치할 때 바코드를 입력하면 'Y'로 변경됩니다. 그렇다면, 'Y'로 변경된 바코드는 비록 고객의 집에 설치되어 있으나 소속은 지국입니다. 따라서, 이 제품이 지국에서 다른 곳으로 이동하지 못하도록 막아야 합니다. 환입품출고등록, 수리품출고등록, 조직간출고요청 3가지 경우에 REPLEMNT_YN이 'Y'인 바코드는 요청하지 못하도록 제한했습니다.
- 대체품 이력 테이블 생성 및 대체품 이력 조회 화면 생성
엔지니어가 고객의 집에 대체품을 설치하는 경우, 수리품 설치로 대체품을 회수하는 경우 2가지에 대체품 이력 테이블에 로그를 INSERT합니다. 이 데이터를 조회할 수 있는 대체품 이력 조회 화면을 만들어 현재 어떤 제품이 대체품으로 사용되고 있고, 어떤 이력을 가지고 있었는지 확인이 가능합니다. 대체품 이력 테이블은 설치구분, 현위치, 등급, 바코드 번호, 제품코드 등을 칼럼으로 가지고 있습니다.
3. 환입품 입고관리(특이건) 개발
환입품이란 설치완료 후 고객 반납 등으로 조직에서 더이상 사용하지 않아 창고로 다시 반환하는 제품들을 말합니다. 가끔 현장에서 바코드를 잘못 등록하는 경우가 있습니다. 예를 들어 A바코드 제품 설치로 전산에 등록하지만 실제로 B바코드 제품을 설치합니다. 이미 설치된 바코드로 제품이 중복 설치되어서는 안되는 것이 맞지만 가끔 같은 바코드가 다른 고객들에게 복수로 설치되는 문제가 있었습니다.
따라서 설치 시 바코드가 재고상태인지 검사를 추가하고, 혹여나 잘못 설치된 바코드를 관리 할 수 있는 기능을 만들었습니다. 해당 화면으로 물류 현업들이 실물 재고와 전산재고를 비교하여 추후 환입품 반납 시 정합성을 맞출 수 있습니다.
입고일자, 사유, 시물바코드, 전산바코드를 입력하여 등록합니다.혹여나 이전에도 환입입고 특이건 이력이 있는지 확인 할 수 있도록 셀 클릭 시 아래 화면에 이력이 조회됩니다.
4. 바코드 발행 관리 개발
바코드를 복수로 발행했을 때 바코드 발행 사유를 관리하는 화면을 만들었습니다. 바코드가 외부 충격으로 훼손되거나, 바코드를 분실하는 등으로 박스 혹은 제품 바코드를 다시 발행하는 경우 이력을 관리합니다. 바코드 발행을 남발하면 중복 바코드가 생기는 경우가 있습니다. 해당 문제를 방지하고자 바코드 발행 시 이력을 저장해 확실하게 사용되며 추후 이력을 확인할 수 있는 화면을 만들었습니다.
정상적으로 사용되면 바코드 발행 이력 삭제가 가능합니다. 실제로 발행된 바코드들만 조회하면 되기 때문입니다. 만약, 발행 이력을 삭제했는데 다시 필요한 경우 원복할 수 있는 기능도 있습니다. 물류에서는 입고, 출고 등의 작업을 완료 및 취소하는 양방향 기능을 잘 고려해야 합니다.
'문제 해결, 기술 비교 > 실무 업무 회고' 카테고리의 다른 글
오픈소스 활용해 바코드 리더 기능 개발 회고 (0) | 2023.08.21 |
---|---|
조직 현장 입출고 모바일 바코드리더기 연동 개발하기 (0) | 2023.07.18 |
기존 로그를 스프링 AOP 로 개선하기 (0) | 2023.01.11 |
UNION을 CASE WHEN THEN으로 개선하기 (0) | 2023.01.09 |
할인 쿠폰 개선하기 (0) | 2022.12.28 |