fix: ACI POD 배송중 판단 기준 현지출발로 변경

This commit is contained in:
이주일
2026-07-10 00:47:02 +09:00
parent 10b826fb38
commit 796f20b604

View File

@@ -99,19 +99,20 @@ public class AciPodTasklet implements Tasklet {
boolean dlvyCompt = podInfoList.stream()
.anyMatch(podInfo -> !isBlank(podInfo, "dateDelivery"));
/*
* ACI POD API의 DATE_LOCALWHIN은 "현지 창고 입고 시간"이지만, 실제 응답에는
* 아직 입고되지 않은 건도 입고 예정 시간이 미래 시각으로 내려올 수 있다.
* 배송중(65) 판단은 DATE_LOCALWHIN이 아니라 DATE_LOCALDEPARTURE 기준으로 처리한다.
*
* 기존처럼 DATE_LOCALWHIN 값 존재 여부만으로 배송중(65)을 판단하면,
* 실제 창고 입고 전 주문이 배송중으로 전환되고 주문 로그까지 생성된다.
* 2026-07-10 운영 데이터 원복 건(미래 DATE_LOCALWHIN 응답)에서 이 문제가 확인되었다.
* ACI POD API의 DATE_LOCALWHIN은 명세상 "현지 창고 입고 시간"이지만,
* 운영 확인 결과 실제 미입고/입고예정 건에도 배치 조회 시점과 거의 같은 시간이 채워질 수 있었다.
* 이 값만 보거나 현재시간과 비교하면 실제 현지 출발 전 주문이 배송중으로 전환되고,
* 주문/배송/옵션 상태와 주문 로그까지 잘못 생성된다.
*
* 따라서 배송완료(DATE_DELIVERY)는 기존 기준을 유지하되, 배송중 판단은
* DATE_LOCALWHIN 값이 있고 그 시간이 현재 시스템 시간보다 과거/현재인 경우에만 허용한다.
* DATE_LOCALWHIN이 비어 있거나 미래 시간이면 아직 미입고/입고예정으로 보고 상태 변경을 skip한다.
* 따라서 DATE_LOCALWHIN은 상태 전환 트리거로 사용하지 않는다.
* 배송완료는 기존처럼 DATE_DELIVERY 값 존재 여부를 최우선으로 판단하고,
* 배송중은 현지 출발 시간인 DATE_LOCALDEPARTURE가 현재 시스템 시간보다 과거/현재인 경우에만 허용한다.
* DATE_LOCALDEPARTURE가 비어 있거나 미래 시간이면 아직 현지 출발 전으로 보고 상태 변경을 skip한다.
*/
boolean dlvyInPrg = podInfoList.stream()
.anyMatch(this::isLocalWarehouseIn);
.anyMatch(this::isLocalDeparture);
// 건별 배송처리
BODlivyUpdtVO boDlivyUpdtVO = new BODlivyUpdtVO();
@@ -496,19 +497,19 @@ public class AciPodTasklet implements Tasklet {
}
/**
* DATE_LOCALWHIN 값이 현재 시스템 시간 기준으로 실제 입고 처리 가능한 시간인지 확인한다.
* DATE_LOCALDEPARTURE 값이 현재 시스템 시간 기준으로 배송중 처리 가능한 현지 출발 시간인지 확인한다.
*/
private boolean isLocalWarehouseIn(DataMap podInfo) {
if (isBlank(podInfo, "dateLocalwhin")) {
private boolean isLocalDeparture(DataMap podInfo) {
if (isBlank(podInfo, "dateLocaldeparture")) {
return false;
}
String dateLocalwhin = podInfo.get("dateLocalwhin").toString().trim();
String dateLocaldeparture = podInfo.get("dateLocaldeparture").toString().trim();
try {
LocalDateTime localWhInDateTime = LocalDateTime.parse(dateLocalwhin, ACI_DATE_TIME_FORMATTER);
return !localWhInDateTime.isAfter(LocalDateTime.now());
LocalDateTime localDepartureDateTime = LocalDateTime.parse(dateLocaldeparture, ACI_DATE_TIME_FORMATTER);
return !localDepartureDateTime.isAfter(LocalDateTime.now());
} catch (DateTimeParseException e) {
log.info("[AciPodBatch] 스킵 - DATE_LOCALWHIN 파싱 실패 - DATE_LOCALWHIN={}", dateLocalwhin);
log.info("[AciPodBatch] 스킵 - DATE_LOCALDEPARTURE 파싱 실패 - DATE_LOCALDEPARTURE={}", dateLocaldeparture);
return false;
}
}