Compare commits

..

7 Commits

Author SHA1 Message Date
이주일
e34fa87214 fix: ACI 배송조회 주문번호에 주문배송번호 추가 2026-07-22 17:33:56 +09:00
이주일
796f20b604 fix: ACI POD 배송중 판단 기준 현지출발로 변경 2026-07-10 00:47:02 +09:00
이주일
10b826fb38 fix: ACI POD 미래 입고시간 배송중 전환 방지 2026-07-10 00:11:18 +09:00
이주일
c13bbd7e2d fix: ACI POD 배송중 추적 및 배송완료 전환 보정 2026-07-09 22:07:03 +09:00
이주일
a75cfef5ba fix: ACI 출고 배치 출고고유번호 채번 오류 수정 2026-07-09 16:31:26 +09:00
이대환
fee1ff461c fix : 출고 상태 변경 (배송처리)
(cherry picked from commit 303f28b7ed)
2026-07-06 14:12:29 +09:00
이대환
d8d0608606 fix : 출고 상태 변경 (배송처리)
(cherry picked from commit 8080bffb56)
2026-07-06 11:41:54 +09:00
6 changed files with 634 additions and 106 deletions

View File

@@ -170,7 +170,8 @@ public class AciDlivyTasklet implements Tasklet {
headers.set("UserID", userId); headers.set("UserID", userId);
headers.set("ACIKey", aciKeyToken); headers.set("ACIKey", aciKeyToken);
String url = aciDlivyApiUrl + "?searchType=1&orderNumber=" + orderVO.getOrdrInnb(); String aciOrderNumber = orderVO.getOrdrInnb() + "A" + orderVO.getOrdrDlvyInnb();
String url = aciDlivyApiUrl + "?searchType=1&orderNumber=" + aciOrderNumber;
HttpEntity<Void> entity = new HttpEntity<>(headers); HttpEntity<Void> entity = new HttpEntity<>(headers);
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
@@ -240,22 +241,28 @@ public class AciDlivyTasklet implements Tasklet {
} }
log.debug("[AciDlivyBatch] 주문 상품 옵션 수={} (ORDR_DLVY_INNB={})", itemList.size(), orderVO.getOrdrDlvyInnb()); log.debug("[AciDlivyBatch] 주문 상품 옵션 수={} (ORDR_DLVY_INNB={})", itemList.size(), orderVO.getOrdrDlvyInnb());
// ② DLIVY_INNB = ORDR_DLVY_INNB (gc_order_shipping.ORDR_DLVY_INNB → gc_goods_export.DLIVY_INNB) // ② gc_goods_export INSERT/UPDATE
orderVO.setDlivyInnb(orderVO.getOrdrDlvyInnb());
// ③ dlivyCdNb 생성 (DLIVY_INNB 확정 후, INSERT 전)
String dlivyCdNb = "D" + new SimpleDateFormat("yyMMddHH").format(new Date()) + orderVO.getDlivyInnb();
orderVO.setDlivyCdNb(dlivyCdNb);
// ④ gc_goods_export INSERT/UPDATE (dlivyCdNb 직접 포함)
int exportCnt = aciDlivyMapper.selectGoodsExportCount(orderVO); int exportCnt = aciDlivyMapper.selectGoodsExportCount(orderVO);
boolean newExport = exportCnt == 0;
if (exportCnt > 0) { if (exportCnt > 0) {
String dlivyInnb = aciDlivyMapper.selectGoodsExportDlivyInnb(orderVO);
if (dlivyInnb == null || dlivyInnb.isBlank()) {
throw new IllegalStateException("기존 출고번호 조회 실패 - ORDR_INNB=" + orderVO.getOrdrInnb()
+ ", ORDR_DLVY_INNB=" + orderVO.getOrdrDlvyInnb());
}
orderVO.setDlivyInnb(dlivyInnb);
aciDlivyMapper.updateGoodsExport(orderVO); aciDlivyMapper.updateGoodsExport(orderVO);
} else { } else {
aciDlivyMapper.insertGoodsExport(orderVO); aciDlivyMapper.insertGoodsExport(orderVO);
} }
// ⑤ 주문 상품 옵션별 처리 (gc_goods_export_item, gc_order_item_option) String dlivyCdNb = "D" + new SimpleDateFormat("yyMMddHH").format(new Date()) + orderVO.getDlivyInnb();
orderVO.setDlivyCdNb(dlivyCdNb);
if (newExport) {
aciDlivyMapper.updateGoodsExportDlivyCdNb(orderVO);
}
// ③ 주문 상품 옵션별 처리 (gc_goods_export_item, gc_order_item_option)
for (DataMap itemMap : itemList) { for (DataMap itemMap : itemList) {
Object qyObj = itemMap.get("qy"); Object qyObj = itemMap.get("qy");
if (qyObj == null) continue; if (qyObj == null) continue;

View File

@@ -3,9 +3,10 @@ package com.wb.domainserver.acidlivy.tasklet;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO; import com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO;
import com.wb.domainserver.acidlivy.vo.BODlivyUpdtVO;
import com.wb.domainserver.exception.WnbtRestException;
import com.wb.domainserver.mapper.gcone.AciDlivyMapper; import com.wb.domainserver.mapper.gcone.AciDlivyMapper;
import com.wb.domainserver.response.WnbtWebClientResponseHandler; import com.wb.domainserver.response.WnbtWebClientResponseHandler;
import com.wb.domainserver.util.communicate.RESRC;
import com.wb.domainserver.util.communicate.SendToResrc; import com.wb.domainserver.util.communicate.SendToResrc;
import com.wb.domainserver.util.dataaccess.DataMap; import com.wb.domainserver.util.dataaccess.DataMap;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -20,15 +21,19 @@ import org.springframework.http.*;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.text.SimpleDateFormat; 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
// 흐름: gc_order_shipping(DLIVY_STTUS_CD=55) 조회 → 토큰 발급 → ACI API 호출 → BLNO 추출 → 배송처리 // 흐름: gc_goods_export(DLIVY_STTUS_CD=55,65) 조회 -> 토큰 발급 -> ACI API 호출 -> BLNO 검증 -> 배송처리
@Slf4j @Slf4j
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -55,7 +60,10 @@ public class AciPodTasklet implements Tasklet {
@Value("${acikey.apikey}") @Value("${acikey.apikey}")
private String apiKey; private String apiKey;
private static final String DLIVY_STTUS_CD = "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_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) {
@@ -64,8 +72,8 @@ public class AciPodTasklet implements Tasklet {
// 토큰 발급 (yaml 고정 apikey → ACIKey 토큰 발급, 메모리에만 유지) // 토큰 발급 (yaml 고정 apikey → ACIKey 토큰 발급, 메모리에만 유지)
String aciKeyToken = issueAciKeyToken(); String aciKeyToken = issueAciKeyToken();
// 대상 주문 목록 조회 (DLIVY_STTUS_CD = '55') // 대상 주문 목록 조회 (DLIVY_STTUS_CD IN ('55', '65'))
List<AciDlivyOrderVO> goodsExportList = AciDlivyMapper.selectGoodsExportList(DLIVY_STTUS_CD); List<AciDlivyOrderVO> goodsExportList = AciDlivyMapper.selectGoodsExportList();
log.info("[AciPodBatch] 대상 출고 건수: {}", goodsExportList.size()); log.info("[AciPodBatch] 대상 출고 건수: {}", goodsExportList.size());
if (goodsExportList.isEmpty()) { if (goodsExportList.isEmpty()) {
@@ -85,28 +93,52 @@ public class AciPodTasklet implements Tasklet {
try { try {
// 건별 ACI 출고자료 API 호출 // 건별 ACI 출고자료 API 호출
List<DataMap> podInfoList = callAciPodApi(dlivyOrderVO, aciKeyToken); List<DataMap> podInfoList = callAciPodApi(dlivyOrderVO, aciKeyToken);
if (podInfoList.isEmpty()) { 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()
.allMatch(podInfo -> !isBlank(podInfo, "dateDelivery")); .anyMatch(podInfo -> !isBlank(podInfo, "dateDelivery"));
/*
* 배송중(65) 판단은 DATE_LOCALWHIN이 아니라 DATE_LOCALDEPARTURE 기준으로 처리한다.
*
* ACI POD API의 DATE_LOCALWHIN은 명세상 "현지 창고 입고 시간"이지만,
* 운영 확인 결과 실제 미입고/입고예정 건에도 배치 조회 시점과 거의 같은 시간이 채워질 수 있었다.
* 이 값만 보거나 현재시간과 비교하면 실제 현지 출발 전 주문이 배송중으로 전환되고,
* 주문/배송/옵션 상태와 주문 로그까지 잘못 생성된다.
*
* 따라서 DATE_LOCALWHIN은 상태 전환 트리거로 사용하지 않는다.
* 배송완료는 기존처럼 DATE_DELIVERY 값 존재 여부를 최우선으로 판단하고,
* 배송중은 현지 출발 시간인 DATE_LOCALDEPARTURE가 현재 시스템 시간보다 과거/현재인 경우에만 허용한다.
* DATE_LOCALDEPARTURE가 비어 있거나 미래 시간이면 아직 현지 출발 전으로 보고 상태 변경을 skip한다.
*/
boolean dlvyInPrg = podInfoList.stream()
.anyMatch(this::isLocalDeparture);
// 건별 배송처리 // 건별 배송처리
DataMap dataMap = new DataMap(); BODlivyUpdtVO boDlivyUpdtVO = new BODlivyUpdtVO();
dataMap.put("dlivyInnb", dlivyOrderVO.getDlivyInnb()); boDlivyUpdtVO.setDlivyInnb(dlivyOrderVO.getDlivyInnb());
dataMap.put("dlivySttusCd", dlivyOrderVO.getDlivySttusCd()); boDlivyUpdtVO.setDlivySttusCd(dlivyOrderVO.getDlivySttusCd());
dataMap.put("sopmalCd", dlivyOrderVO.getSopmalCd()); boDlivyUpdtVO.setSopmalCd(dlivyOrderVO.getSopmalCd());
if(dlvyInPrg) {
dataMap.put("dlivySttusCd", "65"); String currentDlivySttusCd = dlivyOrderVO.getDlivySttusCd();
processDeliveryPod(dataMap); if (dlvyCompt) {
boDlivyUpdtVO.setDlivySttusCd(DLIVY_STTUS_CD_DELIVERY_COMPLETE);
processDeliveryPod(boDlivyUpdtVO);
successCnt++;
} else if (dlvyInPrg && DLIVY_STTUS_CD_EXPORT_COMPLETE.equals(currentDlivySttusCd)) {
boDlivyUpdtVO.setDlivySttusCd(DLIVY_STTUS_CD_DELIVERY_IN_PROGRESS);
processDeliveryPod(boDlivyUpdtVO);
successCnt++;
} else {
if (dlvyInPrg && DLIVY_STTUS_CD_DELIVERY_IN_PROGRESS.equals(currentDlivySttusCd)) {
log.info("[AciPodBatch] 스킵 - 이미 배송중 상태 유지 - DLIVY_INNB={}, INVCNB={}",
dlivyOrderVO.getDlivyInnb(), dlivyOrderVO.getInvcnb());
} else {
log.info("[AciPodBatch] 스킵 - ACI 배송상태 판단 불가 - DLIVY_INNB={}, INVCNB={}",
dlivyOrderVO.getDlivyInnb(), dlivyOrderVO.getInvcnb());
}
skipCnt++;
} }
if(dlvyCompt) {
dataMap.put("dlivySttusCd", "75");
processDeliveryPod(dataMap);
}
successCnt++;
} }
} catch (Exception e) { } catch (Exception e) {
log.error("[AciPodBatch] 배송처리 실패 - DLIVY_INNB={}, 오류={}", log.error("[AciPodBatch] 배송처리 실패 - DLIVY_INNB={}, 오류={}",
@@ -186,7 +218,7 @@ public class AciPodTasklet implements Tasklet {
HttpEntity<Map<String, Object>> apiRequest = HttpEntity<Map<String, Object>> apiRequest =
new HttpEntity<>(body, headers); new HttpEntity<>(body, headers);
log.info("[AciPodBatch] API 응답: {}", apiRequest.toString()); log.info("[AciPodBatch] API 요청: {}", apiRequest.toString());
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange( ResponseEntity<String> response = restTemplate.exchange(
@@ -199,98 +231,261 @@ public class AciPodTasklet implements Tasklet {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.getBody()); JsonNode jsonNode = objectMapper.readTree(response.getBody());
log.info("[AciPodBatch] API 응답 Status: {}", jsonNode.get("Status").asText()); String status = getText(jsonNode, "Status");
log.info("[AciPodBatch] API 응답 RstMsg: {}", jsonNode.get("RstMsg").asText()); log.info("[AciPodBatch] API 응답 Status: {}", status);
log.info("[AciPodBatch] API 응답 RstMsg: {}", getText(jsonNode, "RstMsg"));
if (!"success".equals(status)) {
log.info("[AciPodBatch] 스킵 - ACI 응답 Status 실패 - DLIVY_INNB={}, Status={}, ErrMsg={}",
orderVO.getDlivyInnb(), status, getText(jsonNode, "ErrMsg"));
return Collections.emptyList();
}
JsonNode podInfoNode = jsonNode.get("PODInfo"); JsonNode podInfoNode = jsonNode.get("PODInfo");
if(!podInfoNode.isNull()) { if(podInfoNode != null && podInfoNode.isArray() && podInfoNode.size() > 0) {
List<DataMap> podInfoList = new ArrayList<>(); List<DataMap> podInfoList = new ArrayList<>();
for(JsonNode podInfoItem : podInfoNode) { for(JsonNode podInfoItem : podInfoNode) {
String blno = getText(podInfoItem, "BLNO");
if (!Objects.equals(trimToEmpty(orderVO.getInvcnb()), trimToEmpty(blno))) {
log.info("[AciPodBatch] 스킵 - 요청 송장번호와 ACI 응답 BLNO 불일치 - DLIVY_INNB={}, INVCNB={}, BLNO={}",
orderVO.getDlivyInnb(), orderVO.getInvcnb(), blno);
continue;
}
DataMap PODInfo = new DataMap(); DataMap PODInfo = new DataMap();
PODInfo.put("blno", podInfoItem.get("BLNO").asText()); PODInfo.put("blno", blno);
PODInfo.put("dateLocalwhin", podInfoItem.get("DATE_LOCALWHIN").asText()); PODInfo.put("dateLocalwhin", getText(podInfoItem, "DATE_LOCALWHIN"));
PODInfo.put("dateLocaldeparture", podInfoItem.get("DATE_LOCALDEPARTURE").asText()); PODInfo.put("dateLocaldeparture", getText(podInfoItem, "DATE_LOCALDEPARTURE"));
PODInfo.put("dateIcnarrival", podInfoItem.get("DATE_ICNARRIVAL").asText()); PODInfo.put("dateIcnarrival", getText(podInfoItem, "DATE_ICNARRIVAL"));
PODInfo.put("dateCustomes", podInfoItem.get("DATE_CUSTOMES").asText()); PODInfo.put("dateCustomes", getText(podInfoItem, "DATE_CUSTOMES"));
PODInfo.put("dateDelivery", podInfoItem.get("DATE_DELIVERY").asText()); PODInfo.put("dateDelivery", getText(podInfoItem, "DATE_DELIVERY"));
PODInfo.put("recipient", podInfoItem.get("RECIPIENT").asText()); PODInfo.put("recipient", getText(podInfoItem, "RECIPIENT"));
PODInfo.put("wta", podInfoItem.get("WTA").asText()); PODInfo.put("wta", getText(podInfoItem, "WTA"));
PODInfo.put("wtdan", podInfoItem.get("WTDAN").asText()); PODInfo.put("wtdan", getText(podInfoItem, "WTDAN"));
List<DataMap> volumeList = new ArrayList<>(); List<DataMap> volumeList = new ArrayList<>();
for(JsonNode volumeItem : podInfoItem.get("VOLUME")) { JsonNode volumeNode = podInfoItem.get("VOLUME");
DataMap volume = new DataMap(); if (volumeNode != null && volumeNode.isArray()) {
volume.put("width", volumeItem.get("WIDTH").asText()); for(JsonNode volumeItem : volumeNode) {
volume.put("length", volumeItem.get("LENGTH").asText()); DataMap volume = new DataMap();
volume.put("height", volumeItem.get("HEIGHT").asText()); volume.put("width", getText(volumeItem, "WIDTH"));
volume.put("length", getText(volumeItem, "LENGTH"));
volume.put("height", getText(volumeItem, "HEIGHT"));
volumeList.add(volume); volumeList.add(volume);
}
} }
PODInfo.put("volume", volumeList); PODInfo.put("volume", volumeList);
List<List> customsList = new ArrayList<>(); List<List> customsList = new ArrayList<>();
for(JsonNode customsItem : podInfoItem.get("CUSTOMS")) { JsonNode customsNode = podInfoItem.get("CUSTOMS");
List<DataMap> customDetail = new ArrayList<>(); if (customsNode != null && customsNode.isArray()) {
for(JsonNode customItem : customsItem) { for(JsonNode customsItem : customsNode) {
DataMap Custom = new DataMap(); List<DataMap> customDetail = new ArrayList<>();
Custom.put("dateEvent", customItem.get("DATE_EVENT").asText()); for(JsonNode customItem : customsItem) {
Custom.put("traceStatus", customItem.get("TRACE_STATUS").asText()); DataMap Custom = new DataMap();
Custom.put("dateEvent", getText(customItem, "DATE_EVENT"));
Custom.put("traceStatus", getText(customItem, "TRACE_STATUS"));
customDetail.add(Custom); customDetail.add(Custom);
}
customsList.add(customDetail);
} }
customsList.add(customDetail);
} }
PODInfo.put("customs", customsList); PODInfo.put("customs", customsList);
List<DataMap> localPodList = new ArrayList<>(); List<DataMap> localPodList = new ArrayList<>();
for(JsonNode localPodItem : podInfoItem.get("LOCAL_POD")) { JsonNode localPodNode = podInfoItem.get("LOCAL_POD");
DataMap localPod = new DataMap(); if (localPodNode != null && localPodNode.isArray()) {
localPod.put("traceStatus", localPodItem.get("TRACE_STATUS").asText()); for(JsonNode localPodItem : localPodNode) {
localPod.put("dateEvent", localPodItem.get("DATE_EVENT").asText()); DataMap localPod = new DataMap();
localPod.put("position", localPodItem.get("POSITION").asText()); localPod.put("traceStatus", getText(localPodItem, "TRACE_STATUS"));
localPod.put("dateEvent", getText(localPodItem, "DATE_EVENT"));
localPod.put("position", getText(localPodItem, "POSITION"));
localPodList.add(localPod); localPodList.add(localPod);
}
} }
PODInfo.put("localPod", localPodList); PODInfo.put("localPod", localPodList);
podInfoList.add(PODInfo); podInfoList.add(PODInfo);
} }
log.info("[AciPodBatch] API 응답 PODInfo: {}", podInfoList); if (podInfoList.isEmpty()) {
log.info("[AciPodBatch] 스킵 - 요청 송장번호와 일치하는 ACI PODInfo 없음 - DLIVY_INNB={}, INVCNB={}",
orderVO.getDlivyInnb(), orderVO.getInvcnb());
} else {
log.info("[AciPodBatch] API 응답 PODInfo: {}", podInfoList);
}
return podInfoList; return podInfoList;
} else { } else {
log.info("[AciPodBatch] API 응답 ErrMsg: {}", jsonNode.get("ErrMsg").asText()); log.info("[AciPodBatch] 스킵 - ACI PODInfo 없음 - DLIVY_INNB={}, ErrMsg={}",
return null; orderVO.getDlivyInnb(), getText(jsonNode, "ErrMsg"));
return Collections.emptyList();
} }
} catch (Exception e) { } catch (Exception e) {
log.error("[AciPodBatch] API 호출 오류 - DLIVY_INNB={}, 오류={}", orderVO.getDlivyInnb(), e.getMessage(), e); log.error("[AciPodBatch] API 호출 오류 - DLIVY_INNB={}, 오류={}", orderVO.getDlivyInnb(), e.getMessage(), e);
return null; return Collections.emptyList();
} }
} }
/** /**
* 배송처리 * 배송처리
*/ */
private void processDeliveryPod(DataMap dataMap) { private void processDeliveryPod(BODlivyUpdtVO boDlivyUpdtVO) {
dataMap.put("opetrNm", "시스템"); boDlivyUpdtVO.setOpetrNm("시스템");
dataMap.put("regusr", 0); boDlivyUpdtVO.setMngrInnb("0");
dataMap.put("updusr", 0); boDlivyUpdtVO.setRegusr(0);
boDlivyUpdtVO.setUpdusr(0);
Map<String, Object> result = responseHandler.handleResponseAsMap( Map<String, Object> message = new HashMap<>();
sendToResrc.ofPost(RESRC.GCONEBO, "/mngr/ordr/dlivy/updateDlivySttusGetbackBatchUpdt", dataMap) try {
); updateBODlvySttusUpdt(boDlivyUpdtVO);
log.debug("result = {}", result);
// 메시지전송 ================================================================== // 메시지전송 ==================================================================
/*List<DataMap> smsList = mapper.selectDlivySmsListInqire(tempVO); /*List<DataMap> smsList = mapper.selectDlivySmsListInqire(tempVO);
log.debug("메시지 발송 파라미터 확인 : {}", smsList); log.debug("메시지 발송 파라미터 확인 : {}", smsList);
if (!CollectionUtils.isEmpty(smsList)) { if (!CollectionUtils.isEmpty(smsList)) {
System.out.println("smsList = " + smsList); System.out.println("smsList = " + smsList);
try { try {
DataMap result = mssageService.insertBOAtmcsndng(smsList); DataMap result = mssageService.insertBOAtmcsndng(smsList);
} catch (Exception e) { } catch (Exception e) {
log.debug("메시지 발송 실패"); log.debug("메시지 발송 실패");
}
}*/
message.put("dlivyInnb", boDlivyUpdtVO.getDlivyInnb());
message.put("result", "success");
message.put("status", "0");
} catch (WnbtRestException wre){
message.put("status", "1");
log.error(wre.getMessage(), wre);
throw new WnbtRestException(wre.getMessage());
} catch (Exception e) {
message.put("status", "1");
message.put("errorMsg", e.getMessage());
log.error(e.getMessage(), e);
// throw new WnbtRestException(e.getMessage());
}
log.debug("result = {}", message);
}
/**
* 출고상태변경 팝업 > 출고 상태변경 ( '배송중', '배송완료' ) > 출고 및 주문 상태 업데이트
* @param tempVO
*/
@Transactional
public Map<String, Object> updateBODlvySttusUpdt(BODlivyUpdtVO tempVO) {
Map<String, Object> message = new HashMap<>();
List<DataMap> orderLogList = new ArrayList<>();
String logSj = "";
String logDtlCn = "";
String dlivyCdNb = "";
Integer ordrItemResult = 0;
String ordrInnb = "";
try {
log.debug("출고 상태 일괄 변경 tempVO : {}", tempVO);
ordrItemResult = AciDlivyMapper.updateBODlivySttusGetbackUpdtArr(tempVO);
List<DataMap> orderItemList = AciDlivyMapper.selectBOExportOrderItemInqire(tempVO);
Set<String> ordrDlvyInnbSet = new HashSet<>();
if (ordrItemResult > 0) {
if (orderItemList != null && orderItemList.size() > 0) {
ordrInnb = String.valueOf(orderItemList.get(0).get("ordrInnb"));
// 주문 상품 옵션 상태 부분배송중(60), 배송중(65) 처리 및 수량 수정
for (DataMap item : orderItemList) {
item.put("dlivySttusCd", tempVO.getDlivySttusCd());
item.put("updusr", tempVO.getUpdusr());
// 해당하는 주문상품옵션 배송중 수량 update 하는데 배송중 수량이 (판매가 - 결제취소 ) 수량보다 작으면 상태 부분배송중으로 업데이트
AciDlivyMapper.updateBOOrdrItemStatusUpdt6575(item); // TODO : 배송중 처리하면 개수안맞아도 걍 다 배송중 처리해야하는건지 확인 필요
dlivyCdNb = String.valueOf(item.get("dlivyCdNb"));
ordrDlvyInnbSet.add(item.get("ordrDlvyInnb").toString());
}
String[] ordrDlvyInnbArr = ordrDlvyInnbSet.toArray(new String[0]);
log.debug("주문 배송 set : {}", ordrDlvyInnbSet);
log.debug("주문 set : {}", ordrInnb);
// 주문 배송 상태 부분배송중(60), 배송중(65) 처리
DataMap dlvyVO = new DataMap();
dlvyVO.put("ordrDlvyInnbArr", ordrDlvyInnbArr);
dlvyVO.put("sopmalCd", tempVO.getSopmalCd());
dlvyVO.put("ordrInnb", ordrInnb);
dlvyVO.put("updusr", tempVO.getUpdusr());
Integer dlvyResult = 0;
dlvyResult = AciDlivyMapper.updateBOOrdrDlvyStatusUpdt6575(dlvyVO);
// 주문 상태 부분배송중(60), 배송중(65) 처리
if (dlvyResult > 0) {
DataMap ordrVO = new DataMap();
ordrVO.put("ordrInnb", ordrInnb);
ordrVO.put("sopmalCd", tempVO.getSopmalCd());
ordrVO.put("updusr", tempVO.getUpdusr());
AciDlivyMapper.updateBOOrdrStatusUpdt6575(ordrVO);
}
if ("65".equals(tempVO.getDlivySttusCd())) {
logSj = "배송중(" + dlivyCdNb + ")";
} else if ("75".equals(tempVO.getDlivySttusCd())) {
logSj = "배송완료(" + dlivyCdNb + ")";
}
logDtlCn = "[관리자] " + tempVO.getOpetrNm() + "이(가)" + logSj + " 처리를 하였습니다.";
} else {
if ("65".equals(tempVO.getDlivySttusCd())) {
logSj = "배송중(ERROR)";
} else if ("75".equals(tempVO.getDlivySttusCd())) {
logSj = "배송완료(ERROR)";
}
logDtlCn = "[관리자] " + tempVO.getOpetrNm() + "이(가)" + logSj + " 처리를 실패하였습니다.";
}
} }
}*/ } catch (WnbtRestException wre){
throw new WnbtRestException(wre.getMessage());
} catch (Exception e ){
log.error(e.getMessage(), e);
} finally {
DataMap orderLogVO = new DataMap();
if (ordrInnb != null && !ordrInnb.equals("")) {
orderLogVO.put("ordrInnb", BigInteger.valueOf(Long.valueOf(ordrInnb)));
}
orderLogVO.put("sopmalCd", tempVO.getSopmalCd());
orderLogVO.put("logSj", logSj);
orderLogVO.put("logDtlCn", logDtlCn);
orderLogVO.put("logDvCd", "05"); // 출고
orderLogVO.put("dvCd", "02"); // 관리자
orderLogVO.put("opetrNm", tempVO.getOpetrNm());
orderLogVO.put("dlivyCdNb", tempVO.getDlivyInnb());
orderLogVO.put("qy", 0);
orderLogList.add(orderLogVO);
insertBODlivyOrdrLogRegist(orderLogList);
}
return message;
}
/**
* 출고 관련 주문 로그 등록
*/
public void insertBODlivyOrdrLogRegist(List<DataMap> logList) {
if (!CollectionUtils.isEmpty(logList)) {
for (DataMap logVO : logList) {
AciDlivyMapper.insertOrderLog(logVO);
}
}
} }
/** /**
@@ -300,4 +495,34 @@ public class AciPodTasklet implements Tasklet {
return podInfo.get(key) == null return podInfo.get(key) == null
|| podInfo.get(key).toString().trim().isEmpty(); || podInfo.get(key).toString().trim().isEmpty();
} }
/**
* DATE_LOCALDEPARTURE 값이 현재 시스템 시간 기준으로 배송중 처리 가능한 현지 출발 시간인지 확인한다.
*/
private boolean isLocalDeparture(DataMap podInfo) {
if (isBlank(podInfo, "dateLocaldeparture")) {
return false;
}
String dateLocaldeparture = podInfo.get("dateLocaldeparture").toString().trim();
try {
LocalDateTime localDepartureDateTime = LocalDateTime.parse(dateLocaldeparture, ACI_DATE_TIME_FORMATTER);
return !localDepartureDateTime.isAfter(LocalDateTime.now());
} catch (DateTimeParseException e) {
log.info("[AciPodBatch] 스킵 - DATE_LOCALDEPARTURE 파싱 실패 - DATE_LOCALDEPARTURE={}", dateLocaldeparture);
return false;
}
}
private String getText(JsonNode jsonNode, String key) {
JsonNode valueNode = jsonNode.get(key);
if (valueNode == null || valueNode.isNull()) {
return "";
}
return valueNode.asText();
}
private String trimToEmpty(String value) {
return value == null ? "" : value.trim();
}
} }

View File

@@ -20,6 +20,6 @@ public class AciDlivyOrderVO {
private String blno; // ACI 운송장번호 (BLNO) private String blno; // ACI 운송장번호 (BLNO)
private String hdrycpnCd; // 택배사코드 (고정값: code22) private String hdrycpnCd; // 택배사코드 (고정값: code22)
private String dlivySttusCd; // 출고상태코드 (고정값: 55) private String dlivySttusCd; // 출고상태코드 (고정값: 55)
private String dlivyInnb; // 출고고유번호 (gc_goods_export.DLIVY_INNB = ordrDlvyInnb) private String dlivyInnb; // 출고고유번호 (gc_goods_export.DLIVY_INNB)
private String dlivyCdNb; // 출고코드번호 ('D'+yyMMddHH+dlivyInnb 형식, INSERT 전 Java에서 생성) private String dlivyCdNb; // 출고코드번호 ('D'+yyMMddHH+dlivyInnb 형식)
} }

View File

@@ -0,0 +1,23 @@
package com.wb.domainserver.acidlivy.vo;
import lombok.Data;
@Data
public class BODlivyUpdtVO {
/**출고고유번호*/
private String dlivyInnb;
/**출고준비(45), 출고완료(55), 배송중(65), 배송완료(75)*/
private String dlivySttusCd;
/**쇼핑몰 코드*/
private String sopmalCd;
/** 처리자명 */
private String opetrNm;
/** 관리자 고유번호*/
private String mngrInnb;
/** 등록자*/
private int regusr;
/** 수정자*/
private int updusr;
}

View File

@@ -1,6 +1,7 @@
package com.wb.domainserver.mapper.gcone; package com.wb.domainserver.mapper.gcone;
import com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO; import com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO;
import com.wb.domainserver.acidlivy.vo.BODlivyUpdtVO;
import com.wb.domainserver.util.dataaccess.DataMap; import com.wb.domainserver.util.dataaccess.DataMap;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@@ -20,13 +21,16 @@ public interface AciDlivyMapper {
/** gc_goods_export 존재 여부 */ /** gc_goods_export 존재 여부 */
int selectGoodsExportCount(AciDlivyOrderVO vo); int selectGoodsExportCount(AciDlivyOrderVO vo);
/** 기존 gc_goods_export 출고고유번호 조회 */
String selectGoodsExportDlivyInnb(AciDlivyOrderVO vo);
/** gc_goods_export INSERT */ /** gc_goods_export INSERT */
int insertGoodsExport(AciDlivyOrderVO vo); int insertGoodsExport(AciDlivyOrderVO vo);
/** gc_goods_export UPDATE (기존 레코드 있음) */ /** gc_goods_export UPDATE (기존 레코드 있음) */
int updateGoodsExport(AciDlivyOrderVO vo); int updateGoodsExport(AciDlivyOrderVO vo);
/** gc_goods_export DLIVY_CD_NB UPDATE (미사용 - dlivyCdNb는 INSERT 전 Java에서 생성) */ /** gc_goods_export DLIVY_CD_NB UPDATE (신규 출고 생성키 수신 후 호출) */
int updateGoodsExportDlivyCdNb(AciDlivyOrderVO vo); int updateGoodsExportDlivyCdNb(AciDlivyOrderVO vo);
/** gc_goods_export_item 존재 여부 */ /** gc_goods_export_item 존재 여부 */
@@ -53,6 +57,21 @@ public interface AciDlivyMapper {
/** GC_ORDER_LOG INSERT */ /** GC_ORDER_LOG INSERT */
int insertOrderLog(DataMap logMap); int insertOrderLog(DataMap logMap);
/** 배송처리 대상 주문 목록 조회 (gc_goods_export.DLIVY_STTUS_CD = '55') */ /** 배송처리 대상 주문 목록 조회 (gc_goods_export.DLIVY_STTUS_CD IN ('55', '65')) */
List<AciDlivyOrderVO> selectGoodsExportList(String dlivySttusCd); List<AciDlivyOrderVO> selectGoodsExportList();
/** 출고 상태 일괄 변경 다건 */
public Integer updateBODlivySttusGetbackUpdtArr(BODlivyUpdtVO dlivyVO);
/** 출고에 해당하는 주문 상품 옵션 조회 */
public List<DataMap> selectBOExportOrderItemInqire(BODlivyUpdtVO dlivyVO);
/** 출고처리 후 주문 상품 옵션 상태 및 수량 수정 */
public void updateBOOrdrItemStatusUpdt6575(DataMap ordrItemVO);
/** 출고처리 후 주문 배송 상태 수정 */
public Integer updateBOOrdrDlvyStatusUpdt6575(DataMap ordrItemVO);
/** 출고처리 후 주문 상태 수정 */
public void updateBOOrdrStatusUpdt6575(DataMap ordrItemVO);
} }

View File

@@ -52,22 +52,38 @@
AND HDRYCPN_CD = #{hdrycpnCd} AND HDRYCPN_CD = #{hdrycpnCd}
]]> ]]>
</select> </select>
<!-- 기존 gc_goods_export 출고고유번호 조회 -->
<select id="selectGoodsExportDlivyInnb"
parameterType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO"
resultType="java.lang.String">
<![CDATA[
SELECT DLIVY_INNB
FROM GC_GOODS_EXPORT
WHERE SOPMAL_CD = #{sopmalCd}
AND ORDR_INNB = #{ordrInnb}
AND ORDR_DLVY_INNB = #{ordrDlvyInnb}
AND HDRYCPN_CD = #{hdrycpnCd}
LIMIT 1
]]>
</select>
<!-- gc_goods_export INSERT --> <!-- gc_goods_export INSERT -->
<!-- DLIVY_INNB: gc_order_shipping.ORDR_DLVY_INNB 값 사용 (Java에서 dlivyInnb = ordrDlvyInnb 세팅 후 전달) --> <!-- DLIVY_INNB: DB AUTO_INCREMENT 생성키 사용 -->
<!-- DLIVY_CD_NB: Java에서 생성한 dlivyCdNb 직접 포함 (INSERT 전 생성) --> <!-- DLIVY_CD_NB: 생성키 수신 후 updateGoodsExportDlivyCdNb에서 설정 -->
<!-- HDRYCPN_CD: code22 고정, INVCNB: ACI BLNO --> <!-- HDRYCPN_CD: code22 고정, INVCNB: ACI BLNO -->
<insert id="insertGoodsExport" <insert id="insertGoodsExport"
parameterType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO"> parameterType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO"
useGeneratedKeys="true"
keyProperty="dlivyInnb"
keyColumn="DLIVY_INNB">
<![CDATA[ <![CDATA[
INSERT INTO GC_GOODS_EXPORT ( INSERT INTO GC_GOODS_EXPORT (
DLIVY_INNB,
SOPMAL_CD, SOPMAL_CD,
ORDR_INNB, ORDR_INNB,
ORDR_DLVY_INNB, ORDR_DLVY_INNB,
DLIVY_CD_NB,
DLIVY_STTUS_CD, DLIVY_STTUS_CD,
STTUS_UPDT_DT, STTUS_UPDT_DT,
HDRYCPN_CD, HDRYCPN_CD,
@@ -78,11 +94,9 @@
REGIST_DT, REGIST_DT,
UPDT_DT UPDT_DT
) VALUES ( ) VALUES (
#{dlivyInnb},
#{sopmalCd}, #{sopmalCd},
#{ordrInnb}, #{ordrInnb},
#{ordrDlvyInnb}, #{ordrDlvyInnb},
#{dlivyCdNb},
#{dlivySttusCd}, #{dlivySttusCd},
SYSDATE(), SYSDATE(),
#{hdrycpnCd}, #{hdrycpnCd},
@@ -106,12 +120,12 @@
DLIVY_CD_NB = #{dlivyCdNb}, DLIVY_CD_NB = #{dlivyCdNb},
UPDT_DT = SYSDATE() UPDT_DT = SYSDATE()
WHERE DLIVY_INNB = #{dlivyInnb} WHERE DLIVY_INNB = #{dlivyInnb}
AND SOPMAL_CD = #{sopmalCd}
]]> ]]>
</update> </update>
<!-- gc_goods_export UPDATE (기존 레코드 있음) --> <!-- gc_goods_export UPDATE (기존 레코드 있음) -->
<!-- gc_goods_export UPDATE (기존 레코드 있음, dlivyInnb = ordrDlvyInnb Java 세팅) -->
<update id="updateGoodsExport" <update id="updateGoodsExport"
parameterType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO"> parameterType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO">
@@ -353,24 +367,24 @@
]]> ]]>
</insert> </insert>
<!-- 배송처리 대상 주문 목록 조회 (DLIVY_STTUS_CD = '55' 출고완료) --> <!-- 배송처리 대상 주문 목록 조회 (DLIVY_STTUS_CD IN ('55', '65')) -->
<select id="selectGoodsExportList" parameterType="java.lang.String" <select id="selectGoodsExportList" resultType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO">
resultType="com.wb.domainserver.acidlivy.vo.AciDlivyOrderVO">
<![CDATA[ <![CDATA[
SELECT SELECT
DLIVY_INNB, DLIVY_INNB,
ORDR_INNB, ORDR_INNB,
ORDR_DLVY_INNB, ORDR_DLVY_INNB,
SOPMAL_CD, SOPMAL_CD,
INVCNB INVCNB,
DLIVY_STTUS_CD
FROM GC_GOODS_EXPORT FROM GC_GOODS_EXPORT
WHERE DLIVY_STTUS_CD = #{param} WHERE DLIVY_STTUS_CD IN ('55', '65')
ORDER BY DLIVY_INNB ASC ORDER BY DLIVY_INNB ASC
]]> ]]>
</select> </select>
<!-- 출고 상태 일괄 변경 다건 --> <!-- 출고 상태 일괄 변경 다건 -->
<update id="updateBODlivySttusGetbackUpdtArr" parameterType="dataMap"> <update id="updateBODlivySttusGetbackUpdtArr" parameterType="com.wb.domainserver.acidlivy.vo.BODlivyUpdtVO">
<![CDATA[ <![CDATA[
UPDATE GC_GOODS_EXPORT SET UPDATE GC_GOODS_EXPORT SET
DLIVY_STTUS_CD = #{dlivySttusCd}, DLIVY_STTUS_CD = #{dlivySttusCd},
@@ -389,4 +403,244 @@
]]> ]]>
</update> </update>
<!-- 출고완료상태의 출고상품 목록 조회 -->
<select id="selectBOExportOrderItemInqire">
<![CDATA[
SELECT
EXI.ORDR_GOODS_OPTN_INNB
,EXI.OPTN_TY
,EXI.SOPMAL_CD
,(OIOP.STEP45 + OIOP.STEP55 + OIOP.STEP65 + OIOP.STEP75) AS QY
,0 AS PYMNT_PREARNGE_QY -- 지급예정수량
,IFNULL((EXI.PYMNT_PREARNGE_QY - OIOP.STEP85), 0) AS ACCMLMNY_PYMNT_QY -- 적립금지급수량
,IFNULL(OIOP.STEP85, 0) AS PYMNT_PREARNGE_EXTSH_QY -- 지급예정소멸수량
,EX.ORDR_INNB
,O.MBR_DV_CD
,O.MBR_INNB
,OIOP.ORDR_DLVY_INNB
,IFNULL(EX.DLIVY_CD_NB, '') AS DLIVY_CD_NB
,EX.DLIVY_INNB
,IFNULL(OIOP.MLG_VALID_PD, 0) AS MLG_VALID_PD
,IFNULL(OIOP.MLG_VALID_PD_AT, 'N') AS MLG_VALID_PD_AT
,CASE
WHEN OIOP.STEP85 = 0 THEN ROUND(OIOP.MLG_ACCML_UNIT * ( OIOP.ORDR_QY - OIOP.STEP85 ) + OIOP.MLG_ACCML_REST)
WHEN OIOP.STEP85 > 0 THEN ROUND(OIOP.MLG_ACCML_UNIT * ( OIOP.ORDR_QY - OIOP.STEP85 ))
END AS MLG_ACCML_AMT
FROM GC_GOODS_EXPORT_ITEM EXI
INNER JOIN GC_GOODS_EXPORT EX ON EXI.SOPMAL_CD = EX.SOPMAL_CD
AND EXI.DLIVY_INNB = EX.DLIVY_INNB
INNER JOIN GC_ORDER_ITEM_OPTION OIOP ON EXI.SOPMAL_CD = OIOP.SOPMAL_CD
AND EXI.OPTN_TY = OIOP.OPTN_TY
AND EXI.ORDR_GOODS_OPTN_INNB = OIOP.ORDR_GOODS_OPTN_INNB
AND OIOP.PURCHS_DCSN_QY < ( OIOP.ORDR_QY - OIOP.STEP85 )
INNER JOIN GC_ORDER O ON EX.SOPMAL_CD = O.SOPMAL_CD
AND EX.ORDR_INNB = O.ORDR_INNB
WHERE 1 = 1
AND EX.SOPMAL_CD = #{sopmalCd}
]]>
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(dlivyInnb)">
<![CDATA[
AND EX.DLIVY_INNB = #{dlivyInnb}
]]>
</when>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(ordrGoodsOptnInnb)">
<![CDATA[
AND EXI.OPTN_TY = #{optnTy}
AND EXI.ORDR_GOODS_OPTN_INNB = #{ordrGoodsOptnInnb}
]]>
</when>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(ordrInnb)">
<![CDATA[
AND EX.ORDR_INNB = #{ordrInnb}
]]>
</when>
</choose>
</select>
<!-- 출고 처리 후 주문 상품 옵션 상태 변경 -->
<update id="updateBOOrdrItemStatusUpdt6575">
<![CDATA[
UPDATE GC_ORDER_ITEM_OPTION SET
]]>
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isEquals(dlivySttusCd, '65')">
<![CDATA[
ORDR_STTUS_CD =
CASE
WHEN (ORDR_QY - STEP85) > #{qy} THEN '60'
WHEN (ORDR_QY - STEP85) = #{qy} THEN '65'
ELSE ORDR_STTUS_CD
END
,STEP65 = #{qy}
,STEP55 = CASE
WHEN (STEP55 - #{qy}) < 0 THEN 0
ELSE (STEP55 - #{qy})
END,
]]>
</when>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isEquals(dlivySttusCd, '75')">
<![CDATA[
ORDR_STTUS_CD =
CASE
WHEN (ORDR_QY - STEP85) > #{qy} THEN '70'
WHEN (ORDR_QY - STEP85) = #{qy} THEN '75'
ELSE ORDR_STTUS_CD
END
,STEP55 = CASE
WHEN (STEP55 - #{qy}) < 0 THEN 0
ELSE (STEP55 - #{qy})
END
,STEP65 = CASE
WHEN (STEP65 - #{qy}) < 0 THEN 0
ELSE (STEP65 - #{qy})
END
,STEP75 = #{qy},
]]>
</when>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isEquals(dlivySttusCd, '55')">
<![CDATA[
ORDR_STTUS_CD =
CASE
WHEN (ORDR_QY - STEP85) > #{qy} THEN '50'
WHEN (ORDR_QY - STEP85) = #{qy} THEN '55'
ELSE ORDR_STTUS_CD
END
,STEP55 = #{qy},
]]>
</when>
</choose>
<![CDATA[
STEP45 = 0
,UPDT_DT = SYSDATE()
WHERE SOPMAL_CD = #{sopmalCd}
AND OPTN_TY = #{optnTy}
AND ORDR_GOODS_OPTN_INNB = #{ordrGoodsOptnInnb}
]]>
</update>
<!-- 출고 처리 후 주문 배송 상태 변경
SH.ORDR_STTUS_CD =
CASE
WHEN EXISTS (
SELECT
1
FROM GC_ORDER_ITEM_OPTION OIOP
WHERE OIOP.SOPMAL_CD = SH.SOPMAL_CD
AND OIOP.ORDR_DLVY_INNB = SH.ORDR_DLVY_INNB
AND OIOP.ORDR_STTUS_CD = '60'
) THEN '60'
WHEN EXISTS (
SELECT
1
FROM GC_ORDER_ITEM_OPTION OIOP
WHERE OIOP.SOPMAL_CD = SH.SOPMAL_CD
AND OIOP.ORDR_DLVY_INNB = SH.ORDR_DLVY_INNB
AND OIOP.ORDR_STTUS_CD = '65'
) THEN '65'
ELSE ORDR_STTUS_CD
END
-->
<update id="updateBOOrdrDlvyStatusUpdt6575">
<![CDATA[
UPDATE
GC_ORDER_SHIPPING SH,
(
SELECT CASE WHEN MAX(OIOP.ORDR_STTUS_CD) = MIN(OIOP.ORDR_STTUS_CD) THEN MAX(OIOP.ORDR_STTUS_CD)
ELSE CAST(MAX(OIOP.ORDR_STTUS_CD) - 5 AS CHAR(2))
END ORDR_STTUS_CD
, SH.SOPMAL_CD, SH.ORDR_INNB, SH.ORDR_DLVY_INNB
FROM GC_ORDER_SHIPPING SH
INNER JOIN GC_ORDER_ITEM_OPTION OIOP
ON SH.SOPMAL_CD = OIOP.SOPMAL_CD
AND SH.ORDR_DLVY_INNB = OIOP.ORDR_DLVY_INNB
AND OIOP.ORDR_QY <> OIOP.STEP85
WHERE SH.SOPMAL_CD = #{sopmalCd}
AND SH.ORDR_INNB = #{ordrInnb}
]]>
<choose>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(ordrDlvyInnb)">
AND SH.ORDR_DLVY_INNB = #{ordrDlvyInnb}
</when>
<when test="@com.wb.domainserver.util.dataaccess.MybaitsUtil@isNotEmpty(ordrDlvyInnbArr)">
<![CDATA[
AND SH.ORDR_DLVY_INNB IN
]]>
<foreach collection="ordrDlvyInnbArr" item="ordrDlvyInnbArr" open="(" close=")" separator=",">
#{ordrDlvyInnbArr}
</foreach>
</when>
</choose>
<![CDATA[
AND SH.USE_AT = 'Y'
GROUP BY SH.SOPMAL_CD, SH.ORDR_INNB, SH.ORDR_DLVY_INNB
]]>
<![CDATA[
) STEP
SET
SH.ORDR_STTUS_CD = STEP.ORDR_STTUS_CD
,SH.MNGR_INNB = #{updusr}
,SH.UPDT_DT = SYSDATE()
WHERE 1 = 1
AND SH.SOPMAL_CD = STEP.SOPMAL_CD
AND SH.ORDR_INNB = STEP.ORDR_INNB
AND SH.ORDR_DLVY_INNB = STEP.ORDR_DLVY_INNB
]]>
</update>
<!-- 출고 처리 후 주문 상태 변경
UPDATE GC_ORDER O SET
O.ORDR_STTUS_CD =
CASE
WHEN EXISTS (
SELECT
1
FROM GC_ORDER_SHIPPING SH
WHERE O.SOPMAL_CD = SH.SOPMAL_CD
AND O.ORDR_INNB = SH.ORDR_INNB
AND SH.ORDR_STTUS_CD = '60'
) THEN '60'
WHEN EXISTS (
SELECT
1
FROM GC_ORDER_SHIPPING SH
WHERE O.SOPMAL_CD = SH.SOPMAL_CD
AND O.ORDR_INNB = SH.ORDR_INNB
AND SH.ORDR_STTUS_CD = '65'
) THEN '65'
ELSE ORDR_STTUS_CD
END
WHERE O.SOPMAL_CD = #{sopmalCd}
AND O.ORDR_INNB = #{ordrInnb}
AND O.USE_AT = 'Y'
-->
<update id="updateBOOrdrStatusUpdt6575">
<![CDATA[
UPDATE
GC_ORDER O,
(SELECT CASE WHEN MAX(SH.ORDR_STTUS_CD) = MIN(SH.ORDR_STTUS_CD) THEN MAX(SH.ORDR_STTUS_CD)
ELSE CAST(MAX(SH.ORDR_STTUS_CD) - 5 AS CHAR(2))
END ORDR_STTUS_CD
, O.SOPMAL_CD, O.ORDR_INNB
FROM GC_ORDER O
INNER JOIN GC_ORDER_SHIPPING SH
ON O.SOPMAL_CD = SH.SOPMAL_CD
AND O.ORDR_INNB = SH.ORDR_INNB
AND SH.ORDR_STTUS_CD <> '85'
WHERE O.SOPMAL_CD = #{sopmalCd}
AND O.ORDR_INNB = #{ordrInnb}
GROUP BY O.SOPMAL_CD, O.ORDR_INNB
) STEP
SET
O.ORDR_STTUS_CD = STEP.ORDR_STTUS_CD
,O.MNGR_INNB = #{updusr}
,O.UPDT_DT = SYSDATE()
WHERE 1 = 1
AND O.SOPMAL_CD = STEP.SOPMAL_CD
AND O.ORDR_INNB = STEP.ORDR_INNB
AND O.USE_AT = 'Y'
]]>
</update>
</mapper> </mapper>