가족 중에 쇼핑몰을 하시는 분이 있어서 그분의 일을 돕다가 너무 불편한 부분이 있어서, "프로그램적으로 해결하면 좋겠다" 라고 생각한 부분이 있어서 프로그램으로 만들어봤습니다.
해당 프로그램을 만들기 전에는 송장에 기록된 고객을 쇼핑몰에서 찾고 (운송장 번호를 등록하기 위해서 쇼핑몰에서 고객 검색이 필요함), 송장에 적혀있는 운송장 번호를 상품 배송정보에 하나 하나 직접 입력해서 등록함
이렇게 하다보니 시간은 시간대로 엄청 걸리고 눈도 아프고 번호를 잘못보고 실수로 다른 번호를 입력하게 되면 입력을 안하니만 못한 결과가 발생
특징
- HashMap 사용
- 운송장 번호 를 Key 로 해서 주문번호를 알아내기 위해서 HashMap 사용
- 등록한 운송장 번호를 관리하기 위해서 ArrayList를 추가로 사용
- 등록한 송장번호는 ArrayList에 추가함
- 프로그램 종료 전에 스캐너의 nextLine 메서드를 추가해서 에러 발생시에 바로 꺼지지 않고 메세지를 확인 후 꺼지게 만듬
- 바코드 리더기에서 \n 까지 입력이 되기 때문에 String.replace 메서드를 이용해서 \n 을 "" 로 변경
- Gradle을 사용해서 Build 후 jar 파일로 만듬 -> 다른 컴퓨터에서 사용하기 위해서
- OpenCSV , apache.poi 라이브러리를 사용함
더 자세한 내용은 아래의 Github 을 참고해주세요.
https://github.com/Denia-park/CheckDeliNum
public static void main(String[] args) {
System.out.println("송장 번호 등록 프로그램을 시작합니다. [ " + PROGRAM_VERSION + " ]");
HashMap<String, String> hashMap = new HashMap<>(1500);//초기 용량(capacity)지정 , 운송장 번호 를 Key 로 해서 주문번호를 알아내기 위해서 HashMap 사용
List<String> savedDeliNumList = new ArrayList<>(500);//초기 용량(capacity)지정 , 등록한 운송장 번호를 관리하기 위해서 ArrayList를 추가로 사용
Scanner sc = new Scanner(System.in); // 사용자로부터 데이터를 받기 위한 Scanner
String path = System.getProperty("user.dir") + "\\"; //현재 작업 경로
String fileName = "parcelExcel.xlsx"; //파일명 설정
XSSFSheet sheetDataFromExcel = readExcel(path, fileName); //엑셀 파일 Read
if (sheetDataFromExcel == null) { //파일을 못 읽어오면 종료.
System.out.println("파일을 찾지 못했으므로 프로그램을 종료 합니다.");
System.out.println("Enter 를 치면 정상 종료됩니다.");
sc.nextLine(); //프로그램 종료 전 Holding
return; //프로그램 종료
}
saveReadDataToHashMap(sheetDataFromExcel,hashMap); //읽은 엑셀 파일 HashMap으로 저장
System.out.print("Excel 파일을 읽었습니다. \n\n" +
"이제 바코드를 입력해주시면 됩니다!!! \n" +
"===========================================================================\n\n");
Toolkit toolkit = Toolkit.getDefaultToolkit(); // 비프음 내기 위해서 생성해야할 인스턴스
while(true){
//바코드 입력을 무한으로 Read , "qq" 입력이 들어오면 프로그램 종료
String barcodeNumber = getBarcodeNumber(sc).replace("\n", ""); // \n을 없애고 저장
// System.out.println(barcodeNumber);
if (barcodeNumber.equals("qq") || barcodeNumber.equals("QQ")) {
break;
}
//이미 등록된 송장 번호 인지 확인하기.
if(savedDeliNumList.contains(barcodeNumber)){
System.out.println("이미 등록된 송장입니다.");
System.out.println();
continue;
}
//바코드 입력이 들어오면 HashMap에서 주문번호 확인
ActualData actualData = getActualData(hashMap, barcodeNumber, toolkit);
if(!actualData.isValidBarcodeNumInHashMap){
continue;
}
//주문번호 확인이 되면 CSV 파일에 내용을 추가 (추가할때 "상품별주문번호"도 추가해줘야함)
writeDataToCSV(path,actualData,savedDeliNumList);
}
System.out.println("오늘 처리한 송장 개수 : "+ completeDeliProduct +" 개 , 사용해주셔서 감사합니다.");
System.out.println("Enter 를 치면 정상 종료됩니다.");
sc.nextLine(); //프로그램 종료 전 Holding
}
//JAR 파일을 만들기 위해서 필요한 부분
jar {
manifest {
attributes 'Main-Class': 'org.example.Main'
}
// 이 부분 추가
from {
configurations.runtimeClasspath.collect {
it.isDirectory() ? it : zipTree(it)
}
}
// 이 부분 추가
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
//의존성
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
// https://mvnrepository.com/artifact/com.opencsv/opencsv
implementation 'com.opencsv:opencsv:5.6'
// https://mvnrepository.com/artifact/org.apache.poi/poi
implementation 'org.apache.poi:poi:5.2.2'
// https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
implementation 'org.apache.poi:poi-ooxml:5.2.2'
}