|
@@ -152,6 +152,298 @@ public class TscOrderChangeService {
|
|
|
|
|
|
|
|
return mav;
|
|
return mav;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 마이페이지 부분취소 처리
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param GagaMap
|
|
|
|
|
+ * @return GagaMap
|
|
|
|
|
+ * @author card007
|
|
|
|
|
+ * @since 2021. 04. 19
|
|
|
|
|
+ */
|
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
|
|
+ @Transactional("shopTxnManager")
|
|
|
|
|
+ public GagaMap partialCancel(GagaMap map) {
|
|
|
|
|
+ // 1. 취소요청목록 및 정보 설정
|
|
|
|
|
+ List<Order> cancelOrderRefundList = (List<Order>) map.get("cancelOrderRefundList"); // 취소환불금액 목록 (주문상세단품 단위)
|
|
|
|
|
+ List<Order> cancelDelvRefundList = (List<Order>) map.get("cancelDelvRefundList"); // 취소환불배송금액 목록 (DELV_FEE_CD 단위)
|
|
|
|
|
+ int ordNo = map.getInt("ordNo"); // 주문번호
|
|
|
|
|
+ int custNo = map.getInt("custNo"); // 고객번호
|
|
|
|
|
+ String chgReason = map.getString("chgReason"); // 변경사유
|
|
|
|
|
+ String chgMemo = map.getString("chgMemo"); // 변경메모
|
|
|
|
|
+ String allLastCanYn = map.getString("allLastCanYn"); // 마지막 취소 여부
|
|
|
|
|
+ String isCustomer = map.getString("isCustomer"); // 귀책사유 (고객, 회사)
|
|
|
|
|
+ String ipAddress = map.getString("ipAddress"); // IP주소
|
|
|
|
|
+ String pgTid = map.getString("pgTid"); // PG거래ID
|
|
|
|
|
+ String payMeans = map.getString("payMeans"); // 결제수단
|
|
|
|
|
+ String pgGb = map.getString("pgGb"); // PG구분
|
|
|
|
|
+ String accountNo = map.getString("accountNo"); // 환불계좌번호
|
|
|
|
|
+ String accountNm = map.getString("accountNm"); // 환불계좌주명
|
|
|
|
|
+ String bankCd = map.getString("bankCd"); // 환불계좌은행코드
|
|
|
|
|
+ String chgGb = TscConstants.OrderChangeGb.CANCEL.value(); // 취소요청 (공톹코드:G680)
|
|
|
|
|
+ String ordDtlStat = TscConstants.OrderDetailStat.PAYMENT_AFTER_CANCEL.value(); // 주문상세상태
|
|
|
|
|
+ String chgStat = TscConstants.OrderChangeStat.PAYMENT_AFTER_CANCEL.value(); // 주문변경상태
|
|
|
|
|
+ int pgCancelAmt = 0; // PG취소금액
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 주문상세단품정보등록, 변경 (단품단위)
|
|
|
|
|
+ List<Order> cancelOrderDetailList = new ArrayList<>();
|
|
|
|
|
+ List<Integer> ordDtlNoList = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ for (Order cancelOrderRefundPo : cancelOrderRefundList) {
|
|
|
|
|
+ cancelOrderRefundPo.setOrdDtlStat(ordDtlStat);
|
|
|
|
|
+ cancelOrderRefundPo.setRegNo(custNo);
|
|
|
|
|
+ cancelOrderRefundPo.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ // 2-1. 취소수량이 존재하면 주문상세단품정보 수정 및 주문상세단품 이력 등록
|
|
|
|
|
+ if (cancelOrderRefundPo.getOrdCanChgQty() > 0) {
|
|
|
|
|
+ // 2-1-1. 주문상세단품정보 수정
|
|
|
|
|
+ orderChangeDao.updateOrderDetailItem(cancelOrderRefundPo);
|
|
|
|
|
+ // 2-1-2. 주문상세단품정보 이력 등록
|
|
|
|
|
+ orderChangeDao.createOrderDetailItemHst(cancelOrderRefundPo);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2-2. 주문상세단위로 데이터 설정
|
|
|
|
|
+ Integer ordDtlNo = cancelOrderRefundPo.getOrdDtlNo();
|
|
|
|
|
+ if (!ordDtlNoList.contains(ordDtlNo)) {
|
|
|
|
|
+ cancelOrderDetailList.add(cancelOrderRefundPo);
|
|
|
|
|
+ ordDtlNoList.add(ordDtlNo);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 주문변경정보, 주문정보, 환불정보 (배송정책코드 별)
|
|
|
|
|
+ for (Order obj : cancelDelvRefundList) {
|
|
|
|
|
+ // 취소금액 있을 시 처리
|
|
|
|
|
+ if (obj.getCnclRtnAmt() > 0) {
|
|
|
|
|
+ // 3-1. 주문변경정보 생성
|
|
|
|
|
+ OrderChange orderChange = new OrderChange();
|
|
|
|
|
+ orderChange.setOrdNo(ordNo);
|
|
|
|
|
+ orderChange.setChgGb(chgGb);
|
|
|
|
|
+ orderChange.setChgReason(chgReason);
|
|
|
|
|
+ orderChange.setChgMemo(chgMemo);
|
|
|
|
|
+ orderChange.setAddPayCost(0);
|
|
|
|
|
+ orderChange.setAddPayAmt(0);
|
|
|
|
|
+ orderChange.setRegNo(custNo);
|
|
|
|
|
+ orderChange.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ orderChangeDao.createOrderChange(orderChange);
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2. 주문상세정보 수정
|
|
|
|
|
+ for (Order vo : cancelOrderDetailList) {
|
|
|
|
|
+ // 배송정책코드 별 주문상세 처리
|
|
|
|
|
+ if (obj.getDelvFeeCd().equals(vo.getDelvFeeCd())) {
|
|
|
|
|
+ // 주문상세 별 전체취소여부 설정
|
|
|
|
|
+ int leftQty = vo.getOrdQty() - vo.getCnclRtnQty() - vo.getOrdCanChgQty();
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-1. 주문상세 이력 등록
|
|
|
|
|
+ orderChangeDao.createOrderDetailHstCnclRtn(vo);
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-2. 주문상세정보 수정
|
|
|
|
|
+ orderChangeDao.updateOrderDetail(vo);
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-3. 사용포인트원복
|
|
|
|
|
+ int pntDcAmt = vo.getPntDcAmt();
|
|
|
|
|
+ vo.setOccurGb(TscConstants.PointOccurGb.USE_POINT.value());
|
|
|
|
|
+
|
|
|
|
|
+ for (Order point : orderChangeDao.getCustPointHst(vo)) {
|
|
|
|
|
+ while (pntDcAmt > 0) {
|
|
|
|
|
+ if (pntDcAmt < point.getPntAmt()) {
|
|
|
|
|
+ point.setPntAmt(pntDcAmt);
|
|
|
|
|
+ pntDcAmt -= pntDcAmt;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ pntDcAmt -= point.getPntAmt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ point.setOccurGb(TscConstants.PointOccurGb.USE_POINT_CANCEL.value());
|
|
|
|
|
+ point.setOccurDtlDesc("포인트사용취소");
|
|
|
|
|
+ point.setRegNo(custNo);
|
|
|
|
|
+ point.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ // 포인트 사용 취소 이력 생성 및 포인트 수정
|
|
|
|
|
+ orderChangeDao.createCustPointHstRollback(point);
|
|
|
|
|
+ orderChangeDao.updateCustPointRollback(point);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-4. 적립예정포인트 수정
|
|
|
|
|
+ int savePntAmt = vo.getSavePntAmt();
|
|
|
|
|
+ vo.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT.value());
|
|
|
|
|
+
|
|
|
|
|
+ for (Order point : orderChangeDao.getCustPointHst(vo)) {
|
|
|
|
|
+ point.setOccurGb(TscConstants.PointOccurGb.EXPECT_POINT_CANCEL.value());
|
|
|
|
|
+ point.setOccurDtlDesc("예정포인트적립취소");
|
|
|
|
|
+ point.setPayAmt(savePntAmt * -1);
|
|
|
|
|
+ point.setRegNo(custNo);
|
|
|
|
|
+ point.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ // 적립예정포인트 취소 이력 생성
|
|
|
|
|
+ orderChangeDao.createCustPointHstRollback(point);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-5. 상품쿠폰원복
|
|
|
|
|
+ if (leftQty == 0) {
|
|
|
|
|
+ orderChangeDao.updateGoodsCpnRollback(vo);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-6. 사용상품권 원복
|
|
|
|
|
+ int gfcdUseAmt = vo.getGfcdUseAmt();
|
|
|
|
|
+
|
|
|
|
|
+ for (Order giftCard : orderChangeDao.getCustGiftCardHst(vo)) {
|
|
|
|
|
+ while (gfcdUseAmt > 0) {
|
|
|
|
|
+ if (gfcdUseAmt < giftCard.getGfcdAmt()) {
|
|
|
|
|
+ giftCard.setGfcdAmt(gfcdUseAmt);
|
|
|
|
|
+ gfcdUseAmt -= gfcdUseAmt;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ gfcdUseAmt -= giftCard.getGfcdAmt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ giftCard.setOccurGb(TscConstants.GiftCardOccurGb.USE_GIFTCARD_CANCEL.value());
|
|
|
|
|
+ giftCard.setOccurDtlDesc("상품권사용취소");
|
|
|
|
|
+ giftCard.setRegNo(custNo);
|
|
|
|
|
+ giftCard.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ // 포인트 사용 취소 이력 생성 및 포인트 수정
|
|
|
|
|
+ orderChangeDao.createCustGiftCardHstRollback(giftCard);
|
|
|
|
|
+ orderChangeDao.updateCustGiftCardRollback(giftCard);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3-2-7. 주문변경상세정보 및 이력 등록
|
|
|
|
|
+ OrderChange changeDetailPo = new OrderChange();
|
|
|
|
|
+ changeDetailPo.setOrdChgSq(orderChange.getOrdChgSq());
|
|
|
|
|
+ changeDetailPo.setOrdDtlNo(vo.getOrdDtlNo());
|
|
|
|
|
+ changeDetailPo.setChgQty(vo.getOrdCanChgQty());
|
|
|
|
|
+ changeDetailPo.setChgStat(chgStat);
|
|
|
|
|
+ changeDetailPo.setRegNo(custNo);
|
|
|
|
|
+ changeDetailPo.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ orderChangeDao.createOrderChangeDetail(changeDetailPo);
|
|
|
|
|
+ orderChangeDao.createOrderChangeDetailHst(changeDetailPo);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3-3. 상품재고원복
|
|
|
|
|
+ orderChange.setSellGb(TscConstants.SellGb.ORDER_CANCEL.value());
|
|
|
|
|
+ orderChangeDao.createSellQty(orderChange);
|
|
|
|
|
+
|
|
|
|
|
+ // 3-4. 환불결제정보 등록 (배송정책 별)
|
|
|
|
|
+ int spanRealCnclRtnAmt = obj.getRealOrdAmt(); // 취소금액합계
|
|
|
|
|
+ int sumDeliveryFee = obj.getDelvFee(); // 배송비합계
|
|
|
|
|
+ int spanRefundAmt = spanRealCnclRtnAmt + sumDeliveryFee;
|
|
|
|
|
+
|
|
|
|
|
+ Order paymentOrder = new Order();
|
|
|
|
|
+ paymentOrder.setOrdNo(ordNo);
|
|
|
|
|
+ paymentOrder.setPayAmt(spanRefundAmt * -1);
|
|
|
|
|
+ paymentOrder.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
|
|
|
|
|
+ paymentOrder.setOrdChgSq(orderChange.getOrdChgSq());
|
|
|
|
|
+ paymentOrder.setRegNo(custNo);
|
|
|
|
|
+ paymentOrder.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ orderChangeDao.createPayment(paymentOrder);
|
|
|
|
|
+
|
|
|
|
|
+ // 3-5. 환불정보 등록
|
|
|
|
|
+ Order refundOrder = new Order();
|
|
|
|
|
+ refundOrder.setOrdNo(ordNo);
|
|
|
|
|
+ refundOrder.setPaySq(paymentOrder.getPaySq());
|
|
|
|
|
+ refundOrder.setOrdChgSq(orderChange.getOrdChgSq());
|
|
|
|
|
+ refundOrder.setRefundAmt(spanRefundAmt);
|
|
|
|
|
+ refundOrder.setRfCpn1Amt(obj.getCpn1DcAmt());
|
|
|
|
|
+ refundOrder.setRfTmtb1Amt(obj.getTmtb1DcAmt());
|
|
|
|
|
+ refundOrder.setRfTmtb2Amt(obj.getTmtb2DcAmt());
|
|
|
|
|
+ refundOrder.setRfGoodsCpnAmt(obj.getGoodsCpnDcAmt());
|
|
|
|
|
+ refundOrder.setRfCartCpnAmt(obj.getCartCpnDcAmt());
|
|
|
|
|
+ refundOrder.setRfPntAmt(obj.getPntAmt());
|
|
|
|
|
+ refundOrder.setRfPrePntAmt(obj.getPrePntDcAmt());
|
|
|
|
|
+ refundOrder.setRfGfcdUseAmt(obj.getGfcdUseAmt());
|
|
|
|
|
+ refundOrder.setRfCnclAmt(obj.getRfCnclAmt());
|
|
|
|
|
+ refundOrder.setRfDeliveryFee(obj.getRfDeliveryFee());
|
|
|
|
|
+ refundOrder.setRfRealCnclAmt(obj.getRfRealCnclAmt());
|
|
|
|
|
+ refundOrder.setRaNo(accountNo);
|
|
|
|
|
+ refundOrder.setRaNm(accountNm);
|
|
|
|
|
+ refundOrder.setRaBank(bankCd);
|
|
|
|
|
+ refundOrder.setRegNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ orderChangeDao.createRefund(refundOrder);
|
|
|
|
|
+
|
|
|
|
|
+ // 3-6. 결제금액이 무료배송금액보다 작으면 배송비 신규 등록
|
|
|
|
|
+ if (obj.getAddDelvFee() > 0) {
|
|
|
|
|
+ Order delvFeeOrder = new Order();
|
|
|
|
|
+ delvFeeOrder.setPaySq(paymentOrder.getPaySq());
|
|
|
|
|
+ delvFeeOrder.setOrdNo(ordNo);
|
|
|
|
|
+ delvFeeOrder.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
|
|
|
|
|
+ delvFeeOrder.setDelvFeeCd(obj.getDelvFeeCd());
|
|
|
|
|
+ delvFeeOrder.setDelvFee(obj.getAddDelvFee());
|
|
|
|
|
+ delvFeeOrder.setRealDelvAmt(obj.getDelvFee());
|
|
|
|
|
+ delvFeeOrder.setOrdChgSq(orderChange.getOrdChgSq());
|
|
|
|
|
+ delvFeeOrder.setSupplyCompCd(obj.getSupplyCompCd());
|
|
|
|
|
+ delvFeeOrder.setRegNo(custNo);
|
|
|
|
|
+ delvFeeOrder.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ orderChangeDao.createDeliveryFee(delvFeeOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pgCancelAmt += spanRefundAmt;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 장바구니, 배송비 쿠폰 원복 및 사은품 전체 취소 처리 (마지막 취소 시)
|
|
|
|
|
+ if ("Y".equals(allLastCanYn)) {
|
|
|
|
|
+ // 4-1. 장바구니, 배송비 쿠폰 원복처리
|
|
|
|
|
+ Order coupon = new Order();
|
|
|
|
|
+ coupon.setOrdNo(ordNo);
|
|
|
|
|
+ coupon.setUpdNo(custNo);
|
|
|
|
|
+ orderChangeDao.updateCartCpnRollback(coupon);
|
|
|
|
|
+ orderChangeDao.updateDeliveryCpnRollback(coupon);
|
|
|
|
|
+
|
|
|
|
|
+ // 4-2. 사은품 전체 취소 (전체취소시 적용) 추후 사은품 관련 취소 로직 개발 예정
|
|
|
|
|
+ Order freegiftOrder = new Order();
|
|
|
|
|
+ freegiftOrder.setOrdNo(ordNo);
|
|
|
|
|
+ freegiftOrder.setUpdNo(custNo);
|
|
|
|
|
+ orderChangeDao.updateOrdFreegiftDel(freegiftOrder);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 5. PG 결제 취소 처리 (상품권으로만 결제 시 PG점프)
|
|
|
|
|
+ if (!TscConstants.PgGb.ISTYLE.value().equals(pgGb)) {
|
|
|
|
|
+ if (TscConstants.PgGb.KCP.value().equals(pgGb) || TscConstants.PgGb.PAYCO.value().equals(pgGb)) {
|
|
|
|
|
+ Payment kcp = new Payment();
|
|
|
|
|
+ kcp.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
|
|
|
|
|
+ kcp.setPayGb("O");
|
|
|
|
|
+ kcp.setModType("STSC");
|
|
|
|
|
+ kcp.setModDesc("가맹점 취소 - 전체 취소");
|
|
|
|
|
+ kcp.setIpAddress(ipAddress);
|
|
|
|
|
+ kcp.setPgTid(pgTid);
|
|
|
|
|
+ kcp.setPayAmt(pgCancelAmt);
|
|
|
|
|
+ kcp.setRegNo(custNo);
|
|
|
|
|
+ kcp.setUpdNo(custNo);
|
|
|
|
|
+ kcpService.kcpCancel(kcp);
|
|
|
|
|
+ } else if (TscConstants.PgGb.NAVER.value().equals(pgGb)) {
|
|
|
|
|
+ Payment naverPay = new Payment();
|
|
|
|
|
+ naverPay.setOrdNo(ordNo);
|
|
|
|
|
+ naverPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
|
|
|
|
|
+ naverPay.setPayGb("O");
|
|
|
|
|
+ naverPay.setPayMeans(payMeans);
|
|
|
|
|
+ naverPay.setChgReasonNm(chgReason);
|
|
|
|
|
+ naverPay.setPgTid(pgTid);
|
|
|
|
|
+ naverPay.setPayAmt(pgCancelAmt);
|
|
|
|
|
+ naverPay.setRegNo(custNo);
|
|
|
|
|
+ naverPay.setUpdNo(custNo);
|
|
|
|
|
+
|
|
|
|
|
+ naverPayService.cancelNaverPayment(naverPay);
|
|
|
|
|
+ } else if (TscConstants.PgGb.KAKAO.value().equals(pgGb)) {
|
|
|
|
|
+ Payment kakaoPay = new Payment();
|
|
|
|
|
+ kakaoPay.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
|
|
|
|
|
+ kakaoPay.setPayGb("O");
|
|
|
|
|
+ kakaoPay.setPgTid(pgTid);
|
|
|
|
|
+ kakaoPay.setPayAmt(pgCancelAmt);
|
|
|
|
|
+
|
|
|
|
|
+ kakaoPayService.cancelKakaoPayment(kakaoPay);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return map;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 취소완료 (admin, front, batch(soldout), batch(gift), batch(napy), batch(extmall))
|
|
* 취소완료 (admin, front, batch(soldout), batch(gift), batch(napy), batch(extmall))
|
|
@@ -163,15 +455,15 @@ public class TscOrderChangeService {
|
|
|
@SuppressWarnings("unchecked")
|
|
@SuppressWarnings("unchecked")
|
|
|
@Transactional("shopTxnManager")
|
|
@Transactional("shopTxnManager")
|
|
|
public GagaMap cnclComplete(GagaMap mav, int userNo) {
|
|
public GagaMap cnclComplete(GagaMap mav, int userNo) {
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 1. 세션회원조회
|
|
// 1. 세션회원조회
|
|
|
//userNo = userNo;
|
|
//userNo = userNo;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 2. 취소요정정보목록
|
|
// 2. 취소요정정보목록
|
|
|
List<Order> cancelReqList = (List<Order>) mav.get("cnclRtnList"); // 취소요청 목록
|
|
List<Order> cancelReqList = (List<Order>) mav.get("cnclRtnList"); // 취소요청 목록
|
|
|
List<Order> cancelOrderRefundList = (List<Order>) mav.get("cancelOrderRefundList"); // 취소환불금액 목록 (주문상세단품 단위)
|
|
List<Order> cancelOrderRefundList = (List<Order>) mav.get("cancelOrderRefundList"); // 취소환불금액 목록 (주문상세단품 단위)
|
|
|
List<Order> cancelDelvRefundList = (List<Order>) mav.get("cancelDelvRefundList"); // 취소환불배송금액 목록 (DELV_FEE_CD 단위)
|
|
List<Order> cancelDelvRefundList = (List<Order>) mav.get("cancelDelvRefundList"); // 취소환불배송금액 목록 (DELV_FEE_CD 단위)
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
// 3. 취소신청정보
|
|
// 3. 취소신청정보
|
|
|
int ordNo = Integer.parseInt(mav.getString("ordNo")); // 주문번호
|
|
int ordNo = Integer.parseInt(mav.getString("ordNo")); // 주문번호
|
|
|
String chgReason = mav.getString("chgReason"); // 변경사유
|
|
String chgReason = mav.getString("chgReason"); // 변경사유
|