fix: ACI POD 미래 입고시간 배송중 전환 방지

This commit is contained in:
이주일
2026-07-10 00:11:36 +09:00
parent 40f33b7974
commit aaebd9aed7

View File

@@ -27,6 +27,9 @@ import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.math.BigInteger; import java.math.BigInteger;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.*; import java.util.*;
// ACI 배송자료 조회 및 배송처리 배치 Tasklet // ACI 배송자료 조회 및 배송처리 배치 Tasklet
@@ -60,6 +63,7 @@ public class AciPodTasklet implements Tasklet {
private static final String DLIVY_STTUS_CD_EXPORT_COMPLETE = "55"; // 출고완료 코드 private static final String DLIVY_STTUS_CD_EXPORT_COMPLETE = "55"; // 출고완료 코드
private static final String DLIVY_STTUS_CD_DELIVERY_IN_PROGRESS = "65"; // 배송중 코드 private static final String DLIVY_STTUS_CD_DELIVERY_IN_PROGRESS = "65"; // 배송중 코드
private static final String DLIVY_STTUS_CD_DELIVERY_COMPLETE = "75"; // 배송완료 코드 private static final String DLIVY_STTUS_CD_DELIVERY_COMPLETE = "75"; // 배송완료 코드
private static final DateTimeFormatter ACI_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override @Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
@@ -92,10 +96,22 @@ public class AciPodTasklet implements Tasklet {
if (CollectionUtils.isEmpty(podInfoList)) { if (CollectionUtils.isEmpty(podInfoList)) {
skipCnt++; skipCnt++;
} else { } else {
boolean dlvyInPrg = podInfoList.stream()
.anyMatch(podInfo -> !isBlank(podInfo, "dateLocalwhin"));
boolean dlvyCompt = podInfoList.stream() boolean dlvyCompt = podInfoList.stream()
.anyMatch(podInfo -> !isBlank(podInfo, "dateDelivery")); .anyMatch(podInfo -> !isBlank(podInfo, "dateDelivery"));
/*
* ACI POD API의 DATE_LOCALWHIN은 "현지 창고 입고 시간"이지만, 실제 응답에는
* 아직 입고되지 않은 건도 입고 예정 시간이 미래 시각으로 내려올 수 있다.
*
* 기존처럼 DATE_LOCALWHIN 값 존재 여부만으로 배송중(65)을 판단하면,
* 실제 창고 입고 전 주문이 배송중으로 전환되고 주문 로그까지 생성된다.
* 2026-07-10 운영 데이터 원복 건(미래 DATE_LOCALWHIN 응답)에서 이 문제가 확인되었다.
*
* 따라서 배송완료(DATE_DELIVERY)는 기존 기준을 유지하되, 배송중 판단은
* DATE_LOCALWHIN 값이 있고 그 시간이 현재 시스템 시간보다 과거/현재인 경우에만 허용한다.
* DATE_LOCALWHIN이 비어 있거나 미래 시간이면 아직 미입고/입고예정으로 보고 상태 변경을 skip한다.
*/
boolean dlvyInPrg = podInfoList.stream()
.anyMatch(this::isLocalWarehouseIn);
// 건별 배송처리 // 건별 배송처리
BODlivyUpdtVO boDlivyUpdtVO = new BODlivyUpdtVO(); BODlivyUpdtVO boDlivyUpdtVO = new BODlivyUpdtVO();
@@ -479,6 +495,24 @@ public class AciPodTasklet implements Tasklet {
|| podInfo.get(key).toString().trim().isEmpty(); || podInfo.get(key).toString().trim().isEmpty();
} }
/**
* DATE_LOCALWHIN 값이 현재 시스템 시간 기준으로 실제 입고 처리 가능한 시간인지 확인한다.
*/
private boolean isLocalWarehouseIn(DataMap podInfo) {
if (isBlank(podInfo, "dateLocalwhin")) {
return false;
}
String dateLocalwhin = podInfo.get("dateLocalwhin").toString().trim();
try {
LocalDateTime localWhInDateTime = LocalDateTime.parse(dateLocalwhin, ACI_DATE_TIME_FORMATTER);
return !localWhInDateTime.isAfter(LocalDateTime.now());
} catch (DateTimeParseException e) {
log.info("[AciPodBatch] 스킵 - DATE_LOCALWHIN 파싱 실패 - DATE_LOCALWHIN={}", dateLocalwhin);
return false;
}
}
private String getText(JsonNode jsonNode, String key) { private String getText(JsonNode jsonNode, String key) {
JsonNode valueNode = jsonNode.get(key); JsonNode valueNode = jsonNode.get(key);
if (valueNode == null || valueNode.isNull()) { if (valueNode == null || valueNode.isNull()) {