From d57e2d91e96b075f5a5c4c6331341fe588aa473e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A3=BC=EC=9D=BC?= Date: Fri, 10 Jul 2026 00:47:16 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20ACI=20POD=20=EB=B0=B0=EC=86=A1=EC=A4=91?= =?UTF-8?q?=20=ED=8C=90=EB=8B=A8=20=EA=B8=B0=EC=A4=80=20=ED=98=84=EC=A7=80?= =?UTF-8?q?=EC=B6=9C=EB=B0=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acidlivy/tasklet/AciPodTasklet.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/wb/domainserver/acidlivy/tasklet/AciPodTasklet.java b/src/main/java/com/wb/domainserver/acidlivy/tasklet/AciPodTasklet.java index 712c6f7..8a4f007 100644 --- a/src/main/java/com/wb/domainserver/acidlivy/tasklet/AciPodTasklet.java +++ b/src/main/java/com/wb/domainserver/acidlivy/tasklet/AciPodTasklet.java @@ -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; } }