fix : 관리자 결제취소, 환불 원화추가

This commit is contained in:
jazz
2026-03-10 12:09:42 +09:00
parent c82f48966a
commit e7a9499780
6 changed files with 106 additions and 39 deletions

View File

@@ -2291,15 +2291,18 @@ public class BOOrdrService{
}});
}
//상품 환불금액 합산
refundVO.setRefundAmt(BigDecimal.valueOf(refundItemList.stream().mapToInt(vo -> vo.getGoodsRefundAmt().intValue()).sum()));
refundVO.setRefundAccmlmnyAmt(BigDecimal.valueOf(refundItemList.stream().mapToInt(vo -> vo.getSnggdsAccmlMlgAmt().intValue()).sum()));
BigDecimal useMlg = null;
// 구매총수량과 환불요청수량이 같은경우는 전체결제취소 또는 전체 환불신청
if (ordrQy == canclQy) { // TODO : 구매확정 수량으로 계산해야함. *****
// BigDecimal의 더하기 연산은 add() 메서드를 사용
// 마일리지 합산 + 자투리 합산
useMlg = BigDecimal.valueOf(refundItemList.stream().mapToInt(vo -> vo.getSnggdsRefundMlgAmt().intValue()).sum())
.add(BigDecimal.valueOf(refundItemList.stream().mapToInt(vo -> vo.getSnggdsRefundMlgRmndrAmt().intValue()).sum()));
} else {
// 마일리지 합산
useMlg = BigDecimal.valueOf(refundItemList.stream().mapToInt(vo -> vo.getSnggdsRefundMlgAmt().intValue()).sum());
}
@@ -2426,13 +2429,15 @@ public class BOOrdrService{
BigDecimal addPaidDlvyAmt = new BigDecimal(0); // 유료배송 도서산간 추가 배송비 합
BigDecimal returnPaidDlvyAmt = new BigDecimal(0); // 유료배송 반품 배송비
int loopCnt = 0;
if (!CollectionUtils.isEmpty(dlvylcItemList)) {
log.debug("환불 상품 목록 확인 : {}", dlvylcItemList);
// 1. 주문 금액에서 환불 금액빼는 상품별 금액 합산 변수 선언
// 2. 반품 배송비 변수 선언
// 3. 왕복 배송비 변수 선언
/* 반품/환불 신청 인경우*/
if (param.get("returnMthCd") != null) {
for (DataMap shippingGrouping : dlvylcItemList) {
log.debug("환불 상품 확인 : {}", shippingGrouping);
@@ -2453,6 +2458,13 @@ public class BOOrdrService{
BigDecimal subSlepric = (BigDecimal) shippingGrouping.get("subSlepric");
BigDecimal realDlvyAmt = (BigDecimal) shippingGrouping.get("realDlvyAmt"); // 상품별 결제 배송비
/*환불배송비 누적*/
if(loopCnt == 0 ){
rlRefundDlvyAmt = rlRefundDlvyAmt.add(realDlvyAmt);
loopCnt++;
}
if (!StringUtils.isEmpty(shippingGrouping.get("refundQy"))) {
Integer refundQy = Integer.parseInt(String.valueOf(shippingGrouping.get("refundQy"))); // 환불 수량
@@ -2634,10 +2646,9 @@ public class BOOrdrService{
// 최종 반품 배송비
refundVO.setReturnDlvyAmt(rlReturnDlvyAmt);
// 최종 환불 배송비 : 전체 환불일 경우에만 산정됨.
log.debug(" selectBOLastRefundDlvyAmtInqire 업데이트 치기 전 refundVO:: {}", refundVO);
rlRefundDlvyAmt = mapper.selectBOLastRefundDlvyAmtInqire(refundVO);
// rlRefundDlvyAmt = mapper.selectBOLastRefundDlvyAmtInqire(refundVO);
log.debug(" 환불금액이랑 반품 금액 업데이트 치기 전 rlRefundDlvyAmt:: {}", rlRefundDlvyAmt);
refundVO.setRefundDlvyAmt(rlRefundDlvyAmt);
log.debug(" 환불금액이랑 반품 금액 업데이트 치기 전 refundVO:: {}", refundVO);

View File

@@ -57,7 +57,7 @@ import java.util.stream.Collectors;
import static org.springframework.beans.factory.config.BeanDefinition.ROLE_INFRASTRUCTURE;
@EnableWebSecurity(debug = true)
@EnableWebSecurity
@Configuration
//@EnableMethodSecurity
public class ResourceServerConfig {

View File

@@ -1003,7 +1003,7 @@
, IFNULL(FOI.MLG_AMT, 0) AS MLG_AMT
, IFNULL(FOS.DLVY_AMT, 0) AS DLVY_AMT
, IFNULL(FO.RL_SETLE_AMT, 0) AS SETLE_AMT
, ROUND(FO.WON_RL_SETLE_AMT) AS WON_RL_SETLE_AMT
, ROUND(IFNULL(FO.WON_RL_SETLE_AMT, 0)) AS WON_RL_SETLE_AMT
FROM (
SELECT FOI.SOPMAL_CD
, FOI.ORDR_INNB
@@ -1733,10 +1733,10 @@
, #{refundAcntDpstrNm}
, REPLACE(#{refundAcntnb}, '-', '')
, #{refundAmt}
, ROUND((SELECT GO2.BUY_RATE FROM GC_ORDER GO2 WHERE GO2.SOPMAL_CD = #{sopmalCd} AND GO2.ORDR_INNB = #{ordrInnb}) * ${refundAmt},0)
, ROUND((SELECT GO2.BUY_RATE FROM GC_ORDER GO2 WHERE GO2.SOPMAL_CD = #{sopmalCd} AND GO2.ORDR_INNB = #{ordrInnb}) * #{refundAmt},0)
, #{refundAccmlmnyAmt}
, #{refundDlvyAmt}
, #{wonRefundDlvyAmt}
, ROUND((SELECT GO2.BUY_RATE FROM GC_ORDER GO2 WHERE GO2.SOPMAL_CD = #{sopmalCd} AND GO2.ORDR_INNB = #{ordrInnb}) * #{refundDlvyAmt},0)
, #{mlgAccmlmnyAmt}
, #{mlgAccmlmnyValidDt}
, #{enuriRevisnAmt}
@@ -1762,7 +1762,7 @@
, HEX(AES_ENCRYPT(REPLACE(#{returnCstmrTelnb}, '-', ''), '1df5be2f7e90ae36'))
, HEX(AES_ENCRYPT(REPLACE(#{returnCstmrMbtlnb}, '-', ''), '1df5be2f7e90ae36'))
, #{returnDlvyAmt}
, #{wonReturnDlvyAmt}
, ROUND((SELECT GO2.BUY_RATE FROM GC_ORDER GO2 WHERE GO2.SOPMAL_CD = #{sopmalCd} AND GO2.ORDR_INNB = #{ordrInnb}) * #{returnDlvyAmt},0)
, #{returnDlvyTrgetCd}
, #{returnDlvyRspnsblCd}
, #{returnDlvyPymntTyCd}
@@ -4818,19 +4818,51 @@
THEN (IFNULL(OIOP2.ENURI_DSCNT_UNIT, 0) * RI.REFUND_QY) + IFNULL(OIOP2.ENURI_DSCNT_REST, 0)
ELSE (IFNULL(OIOP2.ENURI_DSCNT_UNIT, 0) * RI.REFUND_QY) END ) AS SUB_SLEPRIC
, FSG.DLVY_GROUP_DV_CD
, ROUND(IFNULL(FSG.DFT_DLVY_AMT, 0), '0') AS DFT_DLVY_AMT
, FSG.AMT_CND_USE_AT
, ROUND(IFNULL(FSG.AMT_CND_ADIT_AMT, 0), '0') AS AMT_CND_ADIT_AMT
, FSG.CNT_CND_USE_AT
, ROUND(IFNULL(FSG.CNT_CND_ADIT_AMT, 0), '0') AS CNT_CND_ADIT_AMT
, FSG.BUNDLE_DLVY_USE_AT
, ROUND(IFNULL(FSG.BUNDLE_DLVY_CND_AMT, 0), '0') AS BUNDLE_DLVY_CND_AMT
, FSG.DLVY_AREA_ADIT_AT
, ROUND(IFNULL(FSG.AREA_ADIT_DLVY_AMT, 0), '0') AS AREA_ADIT_DLVY_AMT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN ROUND(IFNULL(FSG.DFT_DLVY_AMT2, 0), '0')
ELSE ROUND(IFNULL(FSG.DFT_DLVY_AMT, 0), '0')
END) AS DFT_DLVY_AMT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN FSG.AMT_CND_USE_AT2
ELSE FSG.AMT_CND_USE_AT
END) AS AMT_CND_USE_AT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN ROUND(IFNULL(FSG.AMT_CND_ADIT_AMT2, 0), '0')
ELSE ROUND(IFNULL(FSG.AMT_CND_ADIT_AMT, 0), '0')
END) AS AMT_CND_ADIT_AMT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN FSG.CNT_CND_USE_AT2
ELSE FSG.CNT_CND_USE_AT
END) AS CNT_CND_USE_AT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN ROUND(IFNULL(FSG.CNT_CND_ADIT_AMT2, 0), '0')
ELSE ROUND(IFNULL(FSG.CNT_CND_ADIT_AMT, 0), '0')
END) AS CNT_CND_ADIT_AMT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN FSG.BUNDLE_DLVY_USE_AT2
ELSE FSG.BUNDLE_DLVY_USE_AT
END) AS BUNDLE_DLVY_USE_AT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN ROUND(IFNULL(FSG.BUNDLE_DLVY_CND_AMT2, 0), '0')
ELSE ROUND(IFNULL(FSG.BUNDLE_DLVY_CND_AMT, 0), '0')
END) AS BUNDLE_DLVY_CND_AMT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN FSG.DLVY_AREA_ADIT_AT2
ELSE FSG.DLVY_AREA_ADIT_AT
END) AS DLVY_AREA_ADIT_AT
, (CASE
WHEN SH.DLVYLC_AREA_CD = 'JP' THEN ROUND(IFNULL(FSG.AREA_ADIT_DLVY_AMT2, 0), '0')
ELSE ROUND(IFNULL(FSG.AREA_ADIT_DLVY_AMT, 0), '0')
END) AS AREA_ADIT_DLVY_AMT
, (CASE
WHEN OIOP2.ORDR_QY = (OIOP2.STEP85 + RI.REFUND_QY) THEN ROUND(IFNULL(SH.RL_DLVY_AMT, 0), '0')
ELSE 0
END) AS REAL_DLVY_AMT
, ROUND(IFNULL(SH.RL_DLVY_AMT + SH.DLVY_COUPON_DSCNT_AMT, 0), '0') AS RL_DLVY_AMT
, OIOP2.RETURN_DLVY_APPLC_AT
, ROUND(IFNULL(OIOP2.RETURN_DLVY_AMT, 0), '0') AS RETURN_DLVY_AMT
, ROUND(IFNULL(OIOP2.EXCHNG_DLVY_AMT, 0), '0') AS EXCHNG_DLVY_AMT
, SH.DLVYLC_AREA_CD
FROM GC_ORDER_ITEM_OPTION OIOP2
INNER JOIN GC_ORDER_ITEM OI
ON OIOP2.SOPMAL_CD = OI.SOPMAL_CD

View File

@@ -1750,6 +1750,9 @@
,SUM(PRI.CASH_DSCNT_UNIT * PRI.REFUND_QY + PRI.CASH_DSCNT_REST) AS P_USE_CANCEL_CASH
,ROUND(RL_USE_CASH) AS RL_USE_CASH
,RL_ORDR_ITEM.RL_ORDR_QY
,SUM(PRE.REFUND_DLVY_AMT) AS P_REFUND_DLVY_AMT
,SUM(PRE.WON_REFUND_DLVY_AMT) AS P_WON_REFUND_DLVY_AMT
,SUM(PRE.WON_REFUND_AMT) AS P_WON_REFUND_AMT
FROM GC_ORDER_REFUND_ITEM PRI
INNER JOIN GC_ORDER_REFUND PRE ON PRI.SOPMAL_CD = PRE.SOPMAL_CD
AND PRI.ORDER_REFUND_INNB = PRE.ORDER_REFUND_INNB

View File

@@ -671,7 +671,7 @@
<option value="">선택</option>
<c:if test="${not empty resultMap.dlvyGrpList}">
<c:forEach var="dlvyGrpInfo" items="${resultMap.dlvyGrpList}">
<option value="${dlvyGrpInfo.dlvyGroupDvCd}">${dlvyGrpInfo.dlvyGroupNm}</option>
<option value="${dlvyGrpInfo.dlvyGroupInnb}">${dlvyGrpInfo.dlvyGroupNm}</option>
</c:forEach>
</c:if>
</select>

View File

@@ -75,8 +75,8 @@
let pRefundQy = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundQy }"/>');
let rlOrdrQy = parseAmount('<c:out value="${ resultMap.result.pRefund.rlOrdrQy }"/>');
let pRefundAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundAmt }"/>');
let pRefundAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundAmt }"/>'); /*환불상품금액*/
let pRefundDlvyAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundDlvyAmt }"/>'); /*환불배송비*/
// 마일리지
let pUseCancelMlg = parseAmount('<c:out value="${ resultMap.result.pRefund.pUseCancelMlg }"/>');
let rlUseMlg = parseAmount('<c:out value="${ resultMap.result.pRefund.rlUseMlg }"/>');
@@ -98,13 +98,18 @@
totalRefundQy += refundQy;
});
//전체 환불인경우
if (totalRefundQy + pRefundQy >= rlOrdrQy) {
let nowRefundDlvyAmt = 0;
$('input[name="shippingDlvyAmt"]').each(function (idx){
nowRefundDlvyAmt += parseAmount($(this).val());
} );
let pRemainAmt = (rlSetleAmt - pRefundAmt) - nowRefundAmt;
// (주문전체 결제금액 - 이전환불 환불금액 - 이전환불배송비) - 총환불금액(배송비 제외) - 전체배송비
let pRemainAmt = (rlSetleAmt - pRefundAmt - pRefundDlvyAmt) - nowRefundAmt - nowRefundDlvyAmt;
// 절대값
let pRemainAmtRemain = Math.abs(pRemainAmt);
@@ -374,7 +379,11 @@
function rlRefundAmtProcessing() {
let buyRate = parseAmount('${resultMap.result.totRefundDscntAmt.buyRate}');
let wonRlSetleAmt = parseAmount('${data.ordrGoodsDtl.total.wonRlSetleAmt}'); /*실주문결제금액(원)*/
let pWonRefundAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pWonRefundAmt }"/>'); /*이전환불상품금액*/
let pWonRefundDlvyAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pWonRefundDlvyAmt }"/>'); /*이전환불배송비*/
let wonLimitRefundAmt = wonRlSetleAmt - (pWonRefundAmt + pWonRefundDlvyAmt); /*환불최대금액*/
let buyRate = parseFloat('${resultMap.result.totRefundDscntAmt.buyRate}',2);
let refundTyCd = '<c:out value="${ resultMap.result.refnd.refundTyCd }"/>';
let returnMthCd = $('input[name="returnMthCd"]:checked').val(); // 반품 방법 코드
let refundDlvyAmt = '<c:out value="${ resultMap.result.refnd.refundDlvyAmt }"/>'; // 환불 배송비 금액
@@ -509,14 +518,23 @@
/*환불금액 한화환불금액 계산*/
let wonRlRefundAmt = Math.round(realRefundAmt * buyRate);
console.log("wonRlRefundAmt : ",wonRlRefundAmt, " realRefundAmt : ",realRefundAmt, " buyRate : ",buyRate)
wonRlRefundAmt = wonRlRefundAmt > 0 ? wonRlRefundAmt : 0;
/*환불금액이 최대금액을 넘어설경우 원화 최대치로 치환 */
wonRlRefundAmt = wonRlRefundAmt > wonLimitRefundAmt ? wonLimitRefundAmt : wonRlRefundAmt;
$('.wonRlRefundAmt').text(formatWithComma(wonRlRefundAmt));
}
function rlRefundAmtProcessingInput() {
let wonRlSetleAmt = parseAmount('${data.ordrGoodsDtl.total.wonRlSetleAmt}'); /*실주문결제금액(원)*/
let pWonRefundAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pWonRefundAmt }"/>'); /*이전환불상품금액*/
let pWonRefundDlvyAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pWonRefundDlvyAmt }"/>'); /*이전환불배송비*/
let wonLimitRefundAmt = wonRlSetleAmt - (pWonRefundAmt + pWonRefundDlvyAmt); /*환불최대금액*/
let buyRate = parseAmount('${resultMap.result.totRefundDscntAmt.buyRate}');
let buyRate = parseFloat('${resultMap.result.totRefundDscntAmt.buyRate}',2);
let refundTyCd = '<c:out value="${ resultMap.result.refnd.refundTyCd }"/>';
let returnMthCd = $('input[name="returnMthCd"]:checked').val(); // 반품 방법 코드
let refundDlvyAmt = '<c:out value="${ resultMap.result.refnd.refundDlvyAmt }"/>'; // 환불 배송비 금액
@@ -643,9 +661,11 @@
/*환불금액 한화환불금액 계산*/
let wonRlRefundAmt = Math.round(realRefundAmt * buyRate);
wonRlRefundAmt = wonRlRefundAmt > 0 ? wonRlRefundAmt : 0;
/*환불금액이 최대금액을 넘어설경우 원화 최대치로 치환 */
wonRlRefundAmt = wonRlRefundAmt > wonLimitRefundAmt ? wonLimitRefundAmt : wonRlRefundAmt;
$('.wonRlRefundAmt').text(formatWithComma(wonRlRefundAmt));
}
$('#returnDlvyPymntTyCd').on('change', function() {
@@ -693,9 +713,6 @@
$('select[name="refundMthCd"]').on('change', function() {
fn_refund_mth_ctrl();
});
});
@@ -1087,16 +1104,20 @@
fn_create_input('hidden', "orderReItemVOList["+idx+"].invntryIncrsQy", $('[name=invntryIncrsQy]').eq(idx).val(), hiddenForm);
}
});
/*총 환불금액은 계산된 금액으로 대체 (상품금액 + 배송비)*/
totRefundAmt = parseAmount($('.realRefundAmt').text());
let registRlSetleAmt = parseAmount('${data.ordrGoodsDtl.total.setleAmt}');
let pRefundAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundAmt }"/>');
let pRefundAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundAmt }"/>'); /*이전상품환불금액*/
let nowRefundAmt = parseAmount('<c:out value="${ resultMap.result.totRefundDscntAmt.refundAmt }"/>');
console.log("환불 계산 정보 pRefundAmt : ", pRefundAmt);
console.log("환불 계산 정보 nowRefundAmt : ", nowRefundAmt);
let pRefundDlvyAmt = parseAmount('<c:out value="${ resultMap.result.pRefund.pRefundDlvyAmt }"/>'); /*이전환불배송금액*/
console.debug("환불 계산 정보 pRefundAmt : ", pRefundAmt);
console.debug("환불 계산 정보 nowRefundAmt : ", nowRefundAmt);
let registRefundAmt = pRefundAmt + totRefundAmt;
console.log("던질 마일리지가 총 합산을 넘으면 안됌.", registRefundAmt);
console.log("던질 마일리지가 총 합산을 넘으면 안됌.", totRefundAmt);
/*총 환불금액 계산 : 이전상품환불금액 + 현재환불금액(상품환불금액 + 환불배송비) + 이전환불배송금액 */
let registRefundAmt = pRefundAmt + totRefundAmt + pRefundDlvyAmt;
console.debug("던질 마일리지가 총 합산을 넘으면 안됌.", registRefundAmt);
console.debug("던질 마일리지가 총 합산을 넘으면 안됌.", totRefundAmt);
if (registRefundAmt > registRlSetleAmt) {
alert("최종 환불금액이 전체 결제금액을 넘을 수 없습니다.");
@@ -2647,7 +2668,7 @@
<td class="center" rowspan="${reRowspanCnt}">
<span class="fs-13 fw-400">${reDlvyCnt += ' 번째 배송지'}</span><br>
<span class="fs-13 fw-400">${refundList.dlvyMthNm}</span><br>
<input type="hidden" id="shippingDlvyAmt" value="${ refundList.dlvyAmt }"/>
<input type="hidden" id="shippingDlvyAmt" name="shippingDlvyAmt" value="${ refundList.dlvyAmt }"/>
<c:choose>
<c:when test="${0 == refundList.dlvyAmt}">
<span class="fs-13 fw-400">무료</span>
@@ -2665,7 +2686,7 @@
<c:if test="${status.index == 0}">
<td class="center" ${fn:length(resultMap.result.itemsList) > 1 ? 'rowspan="' += fn:length(resultMap.result.itemsList) += '"' : ''}>
<span class="fs-13 fw-400">${refundList.dlvyMthNm}</span><br>
<input type="hidden" id="shippingDlvyAmt" value="${ refundList.dlvyAmt }"/>
<input type="hidden" id="shippingDlvyAmt" name="shippingDlvyAmt" value="${ refundList.dlvyAmt }"/>
<c:choose>
<c:when test="${0 == refundList.dlvyAmt}">
<span class="fs-13 fw-400">무료</span>