자사 물류 센터를 직접 운영할 수 없는 중소기업 또는 스타트업을 대상으로 3PL 플랫폼을 구축하여 상품 등록부터 발주, 입/출고까지 전반적인 물류 시스템을 제작한다.
특히, 자동화 환경에 초점을 두어 물류 재고 파악의 정확도를 높인다.
또한, 고객사가 마케팅과 같은 판매 업무에 더욱 집중할 수 있도록 매출 통계 서비스를 추가적으로 제공한다.
Language | JAVA, SQL, JAVASCRIPT, JSP |
---|---|
Tool | Eclipse, MySQL, Mockaroo(목업데이터) |
DataBase | MySQL 8.0 |
Server | APACHE TOMCAT 9.0 |
Library | Chart.js, Bootstrap, JSTL, POI3.7VER |
제 3자가 관여하는 물류대행 서비스이다. 회사에서 발생하는 물류 업무를 외부 물류 전문 업체에게 아웃소싱하여 물류 서비스를 제공받는다.
분류 | 기능 | 비고 |
---|---|---|
로그인 | 3PL 관리자, 고객사 로그인 | 비활성화된 고객사는 로그인 X, 고객사 로그인 시 기업관리, 입고관리 메뉴는 보이지 않음. |
고객사 관리 | 고객사 기업 등록/조회/수정/비활성화 기능 | 활성화,비활성화 여부에 따른 필터링 기능 구현, 삭제 기능 대신 비활성화 기능으로 안정성 고려. |
상품 관리 | 고객사 상품 등록/조회/수정/비활성화 기능 | 상품 활성화, 비활성화 여부에 따른 필터링 기능 구현, 삭제 기능 대신 비활성화 기능으로 안정성 고려. |
발주 관리 | 자동 발주 상품 목록 조회, 발주 상품 등록/상세조회 기능 | 안전재고 > 현재재고 상태의 상품들만 자동 발주 상품 목록에 뜨도록 구현. 발주코드는 B-기업코드-시퀀스(날짜)로 생성 하여 Unique성 고려. |
입고 관리 | 발주서 연동 자동 입고 등록 기능, 상품별 수동 입고 등록 기능, 수동입고를 위한 상품 통합 검색 기능, 입고 품목 수정,삭제,확정 기능, 확정 입고 내역 조회 기능 | 발주서 연동 시 재확인을 위한 상세 조회 기능 추가. 입고 코드는 I-기업코드-시퀀스(날짜)로 생성하여 Unique성 고려. 각 처리 시 확정여부를 다시한번 묻는 모달창 생성. |
출고 관리 | 주문건 수동 등록, 자동 등록 기능, 주문건 상세 조회 기능 | 주문건 자동 등록은 엑셀 파일 업로드시 자동 등록 되도록 구현, 출고 코드는 O-기업코드-시퀀스(날짜)로 생성하여 Unique성 고려. |
입출고 내역 조회 | 입/출고 내역 조회 기능 | 입고/출고 별 필터링 기능 구현. |
통계서비스 | 기간별, 카테고리별, 상품별 매출 통계 기능 | 표와 차트 동시 제공. 고객기업사가 물류 이외의 다른 업무에 집중할 수 있도록 매출 통계 부가서비스를 제공하여 다른 3PL 플랫폼과의 차별성을 둠. |
위 로직은 두번째 방법을 구현한 코드입니다.
(엑셀 데이터 예시 : Samsung_김신한씨.xlsx)
기업 측에서 위 양식대로 주문 정보를 입력하여 보내면 다량의 주문건을 손쉽게 등록할 수 있습니다.
[출고관리 - 주문건조회]
'송장입력' 버튼을 누르고 => 입력할 주문건을 체크 => '입력저장' 버튼을 누르면
(1)송장번호와 출고일자가 찍히고 주문상태는 '출고완료'로 바뀝니다.
(2)따라서 그에 해당하는 재고가 감소하게끔 로직을 짰습니다.
'주문취소', '취소저장' 버튼에 대한 로직도 위와 비슷합니다.
특이사항으로 위 로직을 짤 때 full outer join을 해야 했는데, 저희는 MySQL을 사용했기 때문에 union이라는 문법을 써서 해결했습니다.
페이지마다 nav 바를 활성화하기 위해 주소창을 불러와 nav 링크 주소와 비교했습니다.
3PL이 조회 기업을 변경할 때마다 기업 변경 컨트롤러로 이동해 세션에 기업 정보를 저장했습니다.
MySQL에는 시퀀스가 존재하지 않기 때문에 procedure, function을 이용해 기업, 상품을 위한 별도의 시퀀스를 생성했습니다.
기업, 상품 수정 시 현재 정보를 모달 창에 그대로 보이기 위해 자바스크립트 객체 형태로 받아 조건에 따라 모달 창에 정보를 채웠습니다.
입고, 출고 데이터를 하나의 테이블에 함께 보이기 위해 입고인 경우, 출고인 경우로 나눠 칼럼을 설정하였습니다. 또한 첫 번째로 날짜 기준 내림차순, 두 번째로 상품 번호 기준 오름차순 정렬을 위해 compareTo를 재정의했습니다.
table에 담겨있는 데이터를 JQuery를 이용해 배열 형태로 저장한 후, Chart.js를 이용해 막대그래프와 꺾은선 그래프로 그려냈습니다.
Servlet Filtering을 이용해 로그인을 하지 않을 경우 index 화면 이외의 내부 서비스에 접근할 수 없도록 구현하였습니다.
세션 저장 시 3PL과 고객 기업 중 어떤 사용자가 로그인을 했는지에 따라 다른 세션에 저장시켜 해당 유형의 사용자가 이용가능한 화면이 보여지도록 구현하였습니다.
또한 비활성화된 기업은 로그인 화면에서 넘어가지 못하도록 구현하였습니다.
부트스트랩을 이용해 페이지네이션 기능이 있는 테이블에서 한 row의 데이터를 체크박스 onclick이벤트를 이용해 가져오려고 할 때,
첫번 째 페이지네이션 이외의 페이지들은 disable 되어 있는 상태라 데이터가 가져와지지 않은 issue가 있었습니다.
이벤트를 등록할 시, 페이지가 load된 후의 row 컬럼에 접근하는 것이 아니라 row 컬럼 자체에 onclick 이벤트를 등록하는 것으로 수정하여
disable 여부 상관업시 row 자체에 이벤트처리가 되어 데이터를 가져오도록 하여 해결할 수 있었습니다.
체크박스로 가져온 데이터를 ajax로 JSON 배열처럼 만들어 서블릿에 보낸 후, 서블릿에서 JSONAraay와 Object로 만들어 원하는 데이터를 얻을 수 있도록 파싱하는 로직입니다.