본문으로 건너뛰기

환불완료 주문 상태 정합성 개선

PHP 8 · GODO25
변경 파일 수: 2개
변경 파일 목록
총 2개
변경 파일 코드
추가삭제
Component/Order/OrderAdminNew.php+7-2
변경 전OrderAdminNew.php
}
 
// 환불완료/취소/실패인 경우 무조건 상태변경 금지
if ($val['orderStatus'] == 'r3' || $val['orderStatus'] == 'c' || $val['orderStatus'] == 'f') {
if($channel != 'naverpay') {
 
 
 
 
 
$changeStatusCheck = false;
 
if ($changeStatus === 'r3') {
 
변경 후OrderAdminNew.php
}
 
// 환불완료/취소/실패인 경우 무조건 상태변경 금지
// 스냅샷($val)뿐 아니라 FOR UPDATE 잠금조회로 최신 상태까지 확인해 배치 중 커밋된 환불완료(r3) 덮어쓰기 방지
if ($channel != 'naverpay') {
$lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', ['is', $val['sno'], $orderNo], false);
$currentOrderStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus'];
 
if ($val['orderStatus'] == 'r3' || $val['orderStatus'] == 'c' || $val['orderStatus'] == 'f'
|| $currentOrderStatus == 'r3' || $currentOrderStatus == 'c' || $currentOrderStatus == 'f') {
$changeStatusCheck = false;
 
if ($changeStatus === 'r3') {
 
Component/Order/OrderAdmin.php+4-2
변경 전OrderAdmin.php
$changeStatusCheck = false;
}
} else {
// 실제 주문상품의 주문상태
$orderGoodsStatus = $this->getOrderGoods($orderNo,$val['sno'])[0]['orderStatus'];
 
 
 
if ($changeStatus === 'r3') {
$this->setCommonLog(
 
변경 후OrderAdmin.php
$changeStatusCheck = false;
}
} else {
// 실제 주문상품의 주문상태 배치 트랜잭션 스냅샷(REPEATABLE READ)에 가려진 환불완료(r3)를 놓치지 않도록
// FOR UPDATE 잠금조회로 최신 커밋 상태 재조회 (덮어쓰기 방지)
$lockedOrderGoods = $this->db->query_fetch('SELECT orderStatus FROM ' . DB_ORDER_GOODS . ' WHERE sno = ? AND orderNo = ? FOR UPDATE', ['is', $val['sno'], $orderNo], false);
$orderGoodsStatus = $lockedOrderGoods['orderStatus'] ?? $val['orderStatus'];
 
if ($changeStatus === 'r3') {
$this->setCommonLog(