tsit05 5 лет назад
Родитель
Сommit
76e02b6d76

+ 31 - 0
src/main/java/com/style24/admin/biz/dao/TsaWithdrawDao.java

@@ -77,6 +77,16 @@ public interface TsaWithdrawDao {
 	 */
 	void updateWithdrawException(WithdrawExc withdrawExc);
 	
+	/**
+	 * 회수예외 사유변경 목록 
+	 * 
+	 * @param WithdrawExc
+	 * @return Collection<WithdrawExc>
+	 * @author moon
+	 * @since 2021. 05. 20
+	 */
+	Collection<WithdrawExc> getWithdrawExceptionChangeList(WithdrawExc withdrawExc);
+	
 	
 	/**
 	 * 상품옵션 정보
@@ -119,6 +129,26 @@ public interface TsaWithdrawDao {
 	 */
 	void updateReRecallOrder(Withdraw withdraw);
 	
+	/**
+	 * 주문변경사유 변경
+	 * 
+	 * @param WithdrawExc
+	 * @return 
+	 * @author moon
+	 * @since 2021. 05. 21
+	 */
+	void updateChangeReason(WithdrawExc withdrawExc);
+	
+	/**
+	 * 주문변경상세상태변경 
+	 * 
+	 * @param WithdrawExc
+	 * @return 
+	 * @author moon
+	 * @since 2021. 05. 21
+	 */
+	void updateChangeStat(WithdrawExc withdrawExc);
+	
 	
 	/**
 	 * 회수등록 - 조회(송장번호용)
@@ -553,4 +583,5 @@ public interface TsaWithdrawDao {
 	 */
 	//void mergeDeliveryFee(TsaOrder setParams);
 
+	
 }

+ 31 - 3
src/main/java/com/style24/admin/biz/service/TsaDeliveryService.java

@@ -72,6 +72,36 @@ public class TsaDeliveryService {
 	 * @since 2021. 02. 26
 	 */
 	public int getDeliveryListCount(Delivery delivery) {
+		
+		if (StringUtils.isNotBlank(delivery.getCondition())) {
+			delivery.setConditions(delivery.getCondition().replaceAll("\r", "").split("\n"));
+		}
+		
+		// 외부몰권한일 때 외부몰벤더ID 설정
+		if (TsaSession.getInfo().getRoleCd().startsWith("G001_C")) {
+			delivery.setMallGb(TsaConstants.MallGb.EXTMALL.value());
+			delivery.setVendorId(TsaSession.getInfo().getVendorId());
+		}
+		
+		if (!StringUtils.isBlank(delivery.getBrandList())) {
+			try {
+				String [] arrBrandCd = mapper.readValue(delivery.getBrandList(), String[].class);
+				delivery.setMultiBrand(arrBrandCd);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("브랜드코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}
+
+		if (!StringUtils.isBlank(delivery.getSupplyCompList())) {
+			try {
+				String [] arrSupplyComp = mapper.readValue(delivery.getSupplyCompList(), String[].class);
+				delivery.setMultiSupplyCompCd(arrSupplyComp);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw new IllegalStateException("업체코드 검색중 오류로 인해 조회되지 않았습니다.");
+			}
+		}		
 		return deliveryDao.getDeliveryListCount(delivery);
 	}
 	
@@ -87,9 +117,7 @@ public class TsaDeliveryService {
 		// multi row 검색관련 처리
 		
 		if (StringUtils.isNotBlank(delivery.getCondition())) {
-			TsitUtil tsitUtil = new TsitUtil();
-			String searchCondition = tsitUtil.replaceMultiSelectParamsArr(delivery.getCondition());
-			delivery.setConditions(searchCondition.split(","));
+			delivery.setConditions(delivery.getCondition().replaceAll("\r", "").split("\n"));
 		}
 
 		// 외부몰권한일 때 외부몰벤더ID 설정

+ 105 - 4
src/main/java/com/style24/admin/biz/service/TsaWithdrawService.java

@@ -8,15 +8,20 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import lombok.extern.slf4j.Slf4j;
+
+import com.gagaframework.web.parameter.GagaMap;
 import com.style24.admin.biz.dao.TsaDeliveryDao;
 import com.style24.admin.biz.dao.TsaWithdrawDao;
 import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 import com.style24.persistence.domain.Withdraw;
 import com.style24.persistence.domain.WithdrawExc;
 import com.style24.persistence.domain.WmsWithdraw;
 import com.style24.core.support.env.TscConstants.OrderChangeStat;
 import com.style24.core.biz.dao.TscOrderChangeDao;
+import com.style24.core.biz.service.TscOrderChangeService;
+import com.style24.core.biz.service.TscOrderRefundService;
 import com.style24.core.support.env.TscConstants.OrderChangeGb;
 
 
@@ -44,6 +49,12 @@ public class TsaWithdrawService {
 	@Autowired
 	private TscOrderChangeDao orderChangeDao;
 	
+	@Autowired
+	private TscOrderChangeService coreOrderChangeService;
+	
+	@Autowired
+	private TscOrderRefundService coreOrderRefundService;
+	
 	//@Autowired
 	//private TsaOrderDao orderDao;
 
@@ -124,7 +135,57 @@ public class TsaWithdrawService {
 	}
 	
 	/**
-	 * 회수예외 목록 
+	 * 회수예외 사유변경 목록 
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 05. 20
+	 */
+	public Collection<WithdrawExc> getWithdrawExceptionChangeList(WithdrawExc withdrawExc) {
+		return withdrawDao.getWithdrawExceptionChangeList(withdrawExc);
+	}
+	
+	/**
+	 * 환불비 조회
+	 *
+	 * @param Delivery
+	 * @return
+	 * @author moon
+	 * @since 2021. 05. 21
+	 */
+	public GagaMap getRefundAmt(Collection<WithdrawExc> list) {
+		
+		OrderChange  orderChange = new OrderChange();
+		
+		
+		int[] ordDtlNoArr		= new int[list.size()];
+		int[] cnclRtnReqQtyArr	= new int[list.size()];
+		
+		int i=0;
+		for(WithdrawExc data : list) {
+			ordDtlNoArr[i] = data.getOrdDtlNo();
+			cnclRtnReqQtyArr[i] = data.getChgQty();
+			i++;
+		}
+		
+		WithdrawExc item = list.iterator().next();
+		
+		orderChange.setOrdDtlNoArr(ordDtlNoArr);
+		orderChange.setCnclRtnReqQtyArr(cnclRtnReqQtyArr);
+		orderChange.setCustNo(item.getCustNo());
+		orderChange.setOrdNo(item.getOrdNo());
+		orderChange.setDelvFeeCd(item.getDelvFeeCd());
+		orderChange.setChgGb(item.getChgGb());
+		
+		GagaMap refundPreInfo = coreOrderChangeService.getRefundPreInfo(orderChange);
+		List<Order> returnReqList = (List<Order>)refundPreInfo.get("cnclReqList"); 
+		GagaMap result = coreOrderRefundService.cnclRtnRefundAmt(returnReqList);
+		return result;
+	}
+	
+	/**
+	 * WMS회수목록 - 옵션정보 
 	 *
 	 * @param Delivery
 	 * @return
@@ -196,9 +257,49 @@ public class TsaWithdrawService {
 		
 	}
 	
-	
-	
-	
+	/**
+	 * 주문변경사유 변경
+	 *
+	 * @param Withdraw
+	 * @return void
+	 * @author moon
+	 * @since 2021. 05. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void saveChangeReason(WithdrawExc withdrawExc) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		if("Y".equals(withdrawExc.getChangeYn())) {
+			// TB_ORDER_CHANGE_DETAIL 변경 
+			String[] listDtlNo = withdrawExc.getOrdDtlNoList().split(",");
+			for(int i=0; i<listDtlNo.length; i++) {
+				WithdrawExc item = new WithdrawExc();
+				if("G680_30".equals(withdrawExc.getWdGb())) { // 반품요청
+					item.setChgStat(OrderChangeStat.RETURN_WAIT.value());   // 반품대기 (추가배송비 결제 전)
+				} else { // 교환요청 
+					item.setChgStat(OrderChangeStat.EXCHANGE_WAIT.value()); // 교환대기 (추가배송비 결제 전)
+				}
+				item.setOrdChgSq(withdrawExc.getOrdChgSq());
+				item.setOrdDtlNo(Integer.parseInt(listDtlNo[i]));
+				item.setUpdNo(userNo);
+				withdrawDao.updateChangeStat(withdrawExc);
+				
+				// 주문상세변경 이력 
+				OrderChange ordChg = new OrderChange();
+				ordChg.setRegNo(userNo);
+				ordChg.setUpdNo(userNo);
+				ordChg.setOrdChgSq(item.getOrdChgSq()); 
+				ordChg.setOrdDtlNo(item.getOrdDtlNo()); 
+				ordChg.setChgStat(item.getChgStat());
+				orderChangeDao.createOrderChangeDetailHst(ordChg);
+				
+			}
+		}
+		
+		// TB_ORDER_CHANGE 변경 
+		withdrawDao.updateChangeReason(withdrawExc);
+	}
+
+
 	/**
 	 * 회수등록 - 조회(송장번호용)
 	 *

+ 0 - 1
src/main/java/com/style24/admin/biz/web/TsaDeliveryController.java

@@ -111,7 +111,6 @@ public class TsaDeliveryController extends TsaBaseController {
 	public GagaMap getDeliveryList(@RequestBody Delivery delivery) throws Exception {
 		
 		GagaMap result = new GagaMap();
-
 		delivery.setPageable(new TscPageRequest(delivery.getPageNo() - 1, delivery.getPageSize()));
 		delivery.getPageable().setTotalCount(deliveryService.getDeliveryListCount(delivery));
 

+ 71 - 8
src/main/java/com/style24/admin/biz/web/TsaWithdrawController.java

@@ -1,5 +1,6 @@
 package com.style24.admin.biz.web;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.commons.collections4.CollectionUtils;
@@ -9,6 +10,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -170,6 +172,67 @@ public class TsaWithdrawController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
 	
+	/**
+	 * 회수예외관리 - 사유변경(팝업)
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 05. 20
+	 */
+	@GetMapping("/exception/change/form")
+	@ResponseBody
+	public ModelAndView saveInvoiceForm(WithdrawExc withdrawExc) {
+		
+		ModelAndView mav = new ModelAndView();
+		Collection<WithdrawExc> list  = withdrawService.getWithdrawExceptionChangeList(withdrawExc);
+		WithdrawExc data = list.iterator().next();
+		
+		GagaMap rtnMap = withdrawService.getRefundAmt(list);
+		
+		
+		mav.addObject("orderWithdrawList", list);
+		if("G680_30".equals(withdrawExc.getChgGb())) {
+			mav.addObject("chgReasonList", rendererService.getAvailCommonCodeList("G688"));
+		} else {
+			mav.addObject("chgReasonList", rendererService.getAvailCommonCodeList("G689"));
+		}
+		
+		mav.addObject("ordChgSq",  data.getOrdChgSq());		
+		mav.addObject("chgGb",     withdrawExc.getChgGb());		
+		mav.addObject("wdGb",      data.getWdGb());
+		mav.addObject("chgReason", data.getChgReason());
+		mav.addObject("chgMemo",   data.getChgMemo());
+		mav.addObject("delvFee",   data.getDelvFee());
+		mav.addObject("rtnDelvFee",data.getRtnDelvFee());		
+		mav.addObject("spanRefundAmt",   rtnMap.getInt("spanRefundAmt"));
+
+		mav.setViewName("withdraw/WithdrawChangePopForm");
+		return mav;
+	} 
+	
+	/**
+	 * 회수예외관리 - 사유변경(팝업) 저장 
+	 *
+	 * @param
+	 * @return
+	 * @throws Exception
+	 * @author moon
+	 * @since 2021. 05. 21
+	 */
+	@PostMapping("/change/save")
+	@ResponseBody
+	public GagaResponse saveDeliveryComplete(@RequestBody WithdrawExc withdrawExc) throws Exception {
+
+		if (withdrawExc == null) {
+			throw new IllegalStateException(message.getMessage("FAIL_1002"));
+		}
+		
+		withdrawService.saveChangeReason(withdrawExc);
+		return super.ok(message.getMessage("SUCC_0004"));
+	}
+	
 	
 	/**
 	 * WMS회수목록 화면 
@@ -523,27 +586,27 @@ public class TsaWithdrawController extends TsaBaseController {
 	@ResponseBody
 	public ModelAndView refundDetailForm(Withdraw withdraw) {
 		ModelAndView mav = new ModelAndView();
-
+		log.info("withdraw {}"+withdraw.toString());
 		mav.addObject("ordChgSq", withdraw.getOrdChgSq());
-
+		
 		// 남은 상품 정보
-		mav.addObject("remainGoodsInfo", withdrawService.getRemainGoodsInfo(withdraw));
+		mav.addObject("remainGoodsInfo", withdraw);//withdrawService.getRemainGoodsInfo(withdraw));
 
 		// 남은 상품 목록
-		mav.addObject("remainGoodsList", withdrawService.getWithdrawRemainOrderDetailList(withdraw));
+		mav.addObject("remainGoodsList", withdraw); //withdrawService.getWithdrawRemainOrderDetailList(withdraw));
 
 		// 장바구니 쿠폰 정보
-		mav.addObject("couponInfo", withdrawService.getCouponInfo(withdraw));
+		mav.addObject("couponInfo", withdraw); // withdrawService.getCouponInfo(withdraw));
 
 		// 주문전체 금액
-		mav.addObject("orderDetailSumAmt", withdrawService.getOrderDetailSumAmt(withdraw.getOrdNo().toString()));
+		mav.addObject("orderDetailSumAmt", withdraw); //withdrawService.getOrderDetailSumAmt(withdraw.getOrdNo().toString()));
 
 		//
-		mav.addObject("sumQty", withdrawService.getSumChgQtyWdQty(withdraw));
+		mav.addObject("sumQty", withdraw); // withdrawService.getSumChgQtyWdQty(withdraw));
 
 		// TODO: 아래 확인후 구현 (.. ) ( ..)
 		//mav.addObject("ordChgCnt", deliveryService.getOrdChgCnt(withdraw.getOrdNo()));
-		mav.setViewName("withdraw/WithdrawDetailForm");
+		mav.setViewName("withdraw/RefundDetailForm");
 		return mav;
 	}
 

+ 3 - 0
src/main/java/com/style24/persistence/domain/Withdraw.java

@@ -68,6 +68,9 @@ public class Withdraw extends TscBaseDomain {
 	private String chgerDtlAddr;                        // 변경자상세주소
 	private String ordTelno;                            // 주문자전화번호
 	private String ordEmail;                            // 주문자이메일	
+	private String wdRegDt;
+	private String rcRegDt;
+	
 	
 	private Integer ordNo;
 	private Integer ordDtlNo; 

+ 27 - 4
src/main/java/com/style24/persistence/domain/WithdrawExc.java

@@ -46,7 +46,21 @@ public class WithdrawExc extends TscBaseDomain {
 	private String adminMemo;          // WMS메시지
 	private String goodsType;				// 상품유형
 	private String csMemo; // cs메모
-
+	private String chgStat;
+	private String wdGb; 		
+	private String chgReason; 	
+	private String chgReasonNm;
+	private String chgGb;
+	private String chgGbNm;
+	private String chgerNm; 
+	private String chgerPhnno; 
+	private String chgMemo;
+	private String goodsNm; 
+	private String optCd;
+	private String chgStatNm;
+	private String delvFeeCd;
+	private String changeYn;
+	private String ordDtlNoList;
 	
 	private int chargeAmount;          // 요금총액
 	private int exceptionQty;          // 수량
@@ -67,11 +81,20 @@ public class WithdrawExc extends TscBaseDomain {
 	private int itemPrice;	// 단품단가	
 	private int csEncloseFee; // 추가비용	
 	private int csAddFee;  
-
+	private int delvFee;   
+	private int rtnDelvFee; 
+	private int chgQty;  
+	private int ordAmt;
+	private int addPayCost;
+	
 	private Integer orderNo;           // 주문번호
 	private Integer orderDtlNo;        // 주문상세번호 
 	private Integer recallExceptionItemNo;
 	private Integer recallExceptionNo; // 반품예외처리번호 
+	private Integer ordChgSq;	
+	private Integer ordNo;
+	private Integer ordDtlNo;
+	private Integer custNo;
 	
 	
 	// 검색
@@ -89,7 +112,7 @@ public class WithdrawExc extends TscBaseDomain {
 	private String delayDt;					// 회수지연일
 	private String delayDtType;				// 회수유형
 	private String goodsInfo;				// 상품정보(상품코드+사이즈코드)
-
-
+	
+	
 
 }

+ 75 - 7
src/main/java/com/style24/persistence/mybatis/shop/TsaWithdraw.xml

@@ -17,7 +17,7 @@
 	</sql>
 	
 	<!-- 환불관리 목록 건수 -->
-	<select id="getRefundListCount" parameterType="WithdrawExc" resultType="int">
+	<select id="getRefundListCount" parameterType="Withdraw" resultType="int">
 		/* TsaWithdraw.getRefundListCount */
 		SELECT COUNT(*) AS TOTCNT
 		  FROM (
@@ -39,11 +39,11 @@
 	</select>
 
 	<!-- 환불관리 목록  -->
-	<select id="getRefundList" parameterType="WmsWithdraw" resultType="WmsWithdraw">
+	<select id="getRefundList" parameterType="Withdraw" resultType="Withdraw">
 		/* TsaWithdraw.getRefundList */
 		
 		SELECT Z.*
-		    , FN_GET_CODE_NM('G688', Z.CHG_REASON) AS CHG_REASON -- 요청사유   
+		    , FN_GET_CODE_NM('G688', Z.CHG_REASON) AS CHG_REASON_NM -- 요청사유   
 		FROM (
 		    SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.ORD_NO DESC, A.ORD_DTL_NO) RNUM 
 		    FROM (
@@ -58,8 +58,10 @@
 					, I.ORD_PHNNO     -- 주문자연락처	
 					, A.SENDER_NM     -- 보내는사람
 					, A.SENDER_PHNNO  -- 보낸연락처
-					, A.ARRIVAL_DT    -- 도착일시
-					, D.WD_EDDT       -- 환불확정일자
+					, DATE_FORMAT(A.ARRIVAL_DT, '%Y-%m-%d') AS ARRIVAL_DT    -- 도착일시
+					, DATE_FORMAT(D.WD_STDT, '%Y-%m-%d') AS WD_STDT       -- 회수시작일시
+					, DATE_FORMAT(D.WD_EDDT, '%Y-%m-%d') AS WD_EDDT       -- 회수종료일시
+					, DATE_FORMAT(C.COMPLETE_DT, '%Y-%m-%d') AS COMPLETE_DT   -- 환불확정일
 					, A.WD_MEMO       -- wms회수메모
 					, B.GOODS_CD      -- 상품코드
 					, B.OPT_CD1       -- 옵션1
@@ -68,7 +70,8 @@
 					, B.WD_QTY        -- 회수수량
 					, d.CHG_MEMO      -- 클레임메모
 					, D.CHG_REASON    -- 요청사유 
-					, C.COMPLETE_DT   -- 반품완료일자 
+					, DATE_FORMAT(B.REG_DT, '%Y-%m-%d') AS WD_REG_DT        -- 회수등록일
+					, DATE_FORMAT(D.REG_DT, '%Y-%m-%d') AS RC_REG_DT        -- 반품신청일
 				  FROM TB_WITHDRAW A
 				  JOIN TB_WITHDRAW_DETAIL B ON A.WD_INVOICE_NO  = B.WD_INVOICE_NO AND A.ORD_CHG_SQ = B.ORD_CHG_SQ 
 				  JOIN TB_ORDER_CHANGE_DETAIL C ON B.ORD_CHG_SQ = C.ORD_CHG_SQ AND B.ORD_DTL_NO = C.ORD_DTL_NO AND C.DEL_YN ='N'
@@ -159,11 +162,14 @@
 			, ROW_NUMBER() OVER W AS ROWSPAN_CNT
 	        , ROW_NUMBER() OVER T AS ROWSPAN_RANK
 	        , (SELECT E.EXTMALL_NM FROM TB_EXTMALL E WHERE E.EXTMALL_ID = Z.EXTMALL_ID) AS SITE_CD
+	        , CASE WHEN Z.CHG_GB = 'G680_30' THEN FN_GET_CODE_NM('G688', Z.CHG_REASON)
+			       WHEN Z.CHG_GB = 'G680_40' THEN FN_GET_CODE_NM('G689', Z.CHG_REASON)   ELSE '' END AS CHG_REASON_NM  
+			, IFNULL(FN_GET_CODE_NM('G680', Z.CHG_GB),'출고예외') AS CHG_GB_NM
 		FROM (
 		    SELECT A.*, ROW_NUMBER() OVER(ORDER BY  A.ORDER_NO, A.RECALL_EXCEPTION_NO, A.RECALL_EXCEPTION_ITEM_NO)  RNUM 
 		          , CASE WHEN A.MALL_GB = 'G011_20' THEN (SELECT MAX(BB.EXTMALL_ID) FROM TB_ORDER_DETAIL BB WHERE BB.ORD_NO = A.ORDER_NO) ELSE 'APISHOP_0054' END AS EXTMALL_ID
 		    FROM (   
-				SELECT A.* 
+				SELECT A.* , CD.CHG_STAT, OC.ORD_CHG_SQ , OC.WD_GB , OC.CHG_REASON, OC.CHG_GB 
 				  FROM (
 						SELECT 
 							  A.RECALL_STAT   -- 반품대기처리상태
@@ -214,6 +220,8 @@
 							AND   A.DATE_CREATED <![CDATA[<]]> STR_TO_DATE(REPLACE(#{edDate},'-','')+ 1, '%Y%m%d%H%i%s')
 							</if>
 				) A
+				LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL  CD ON A.ORDER_DTL_NO = CD.ORD_DTL_NO AND CD.DEL_YN ='N'
+				LEFT OUTER JOIN TB_ORDER_CHANGE         OC ON CD.ORD_CHG_SQ = OC.ORD_CHG_SQ 
 				ORDER BY A.ORDER_NO, A.RECALL_EXCEPTION_NO, A.RECALL_EXCEPTION_ITEM_NO
 	<include refid="getListPagingCondition_sql"/>
 	      WINDOW W AS (PARTITION BY ORDER_NO ORDER BY ORDER_NO), T AS (PARTITION BY ORDER_NO ORDER BY ORDER_NO , RECALL_EXCEPTION_ITEM_NO DESC )
@@ -377,4 +385,64 @@
 
 	</update>
 
+
+	<!-- 회수예외 사유변경 목록 -->
+	<select id="getWithdrawExceptionChangeList" parameterType="WithdrawExc" resultType="WithdrawExc">
+		/* TsaWithdraw.getWithdrawExceptionChangeList */
+		SELECT 
+			  A.ORD_CHG_SQ 
+			, C.ORD_NO 
+			, B.ORD_DTL_NO
+			, FN_GET_CODE_NM('G685', B.CHG_STAT)  AS CHG_STAT_NM
+			, A.REG_DT 
+			, A.CHGER_NM 
+			, A.CHGER_PHNNO 
+			, (SELECT G.GOODS_NM FROM TB_GOODS G WHERE G.GOODS_CD = C.ITEM_CD) AS GOODS_NM
+			, C.ITEM_CD  AS GOODS_CD 
+			, D.SKU_VALUE AS OPT_CD 
+			, B.CHG_QTY 
+			, IFNULL((SELECT GROUP_CONCAT(ADMIN_MEMO ORDER BY RECALL_EXCEPTION_MEMO_NO ) 
+						FROM TB_ORDER_RECALL_EXCEPTION_MEMO M WHERE M.RECALL_EXCEPTION_NO = D.RECALL_EXCEPTION_NO  AND ADMIN_MEMO !='.'),'-') AS ADMIN_MEMO -- WMS메시지
+			, A.CHG_GB 
+			, A.CHG_REASON 
+			, A.CHG_MEMO
+			, P.DELV_FEE
+			, P.RTN_DELV_FEE 
+			, B.CHG_STAT
+			, A.WD_GB 
+			, OD.DELV_FEE_CD 
+			, (SELECT O.CUST_NO FROM TB_ORDER O WHERE O.ORD_NO = OD.ORD_NO) AS CUST_NO
+		  FROM TB_ORDER_CHANGE A
+		  JOIN TB_ORDER_CHANGE_DETAIL B ON A.ORD_CHG_SQ = B.ORD_CHG_SQ 
+		  JOIN TB_ORDER_DETAIL       OD ON B.ORD_DTL_NO = OD.ORD_DTL_NO 
+		  JOIN TB_ORDER_DETAIL_ITEM   C ON OD.ORD_DTL_NO  = C.ORD_DTL_NO  
+		  JOIN TB_ORDER_RECALL_EXCEPTION_ITEM D ON C.ORD_DTL_NO = D.ORDER_DTL_NO 
+		  JOIN TB_DELV_FEE_POLICY     P ON OD.DELV_FEE_CD = P.DELV_FEE_CD 
+		 WHERE A.ORD_CHG_SQ = #{ordChgSq}
+	</select>
+	
+	<!-- 주문변경사유 변경 -->
+	<update id="updateChangeReason" parameterType="WithdrawExc" >
+		/* TsaWithdraw.updateChangeReason */
+		UPDATE TB_ORDER_CHANGE SET
+			  CHG_REASON   = #{chgReason} 
+			, ADD_PAY_COST = #{addPayCost}
+			, CHG_MEMO     = #{chgMemo}
+			, UPD_NO       = #{updNo}
+			, UPD_DT       = NOW()
+		WHERE ORD_CHG_SQ  = #{ordChgSq}
+	</update>
+	
+	<!-- 주문변경상세상태변경 -->
+	<update id="updateChangeStat" parameterType="WithdrawExc" >
+		/* TsaWithdraw.updateChangeStat */
+		UPDATE TB_ORDER_CHANGE_DETAIL SET
+			  CHG_STAT = #{chgStat}
+			, UPD_NO   = #{updNo}
+			, UPD_DT   = NOW()
+		WHERE ORD_CHG_SQ = #{ordChgSq}
+		  AND ORD_DTL_NO = #{ordDtlNo}
+  
+	</update>	
+		
 </mapper>

+ 1 - 2
src/main/webapp/WEB-INF/views/delivery/DeliveryListForm.html

@@ -361,7 +361,7 @@
 	//gridOptions.defaultColDef.editable = true;
 
 	gridOptions.suppressRowClickSelection = true;
-	//gridOptions.rowSelection = 'multiple';
+	gridOptions.rowSelection = 'multiple';
 	gridOptions.isRowSelectable = function(rowNode) {
 		return rowNode.data.ordDtlStat == 'G013_20' || rowNode.data.ordDtlStat == 'G013_25';
 	}
@@ -464,7 +464,6 @@
 	* 품절처리
 	**************************************************************************/		
 	$('#btnSoldout').on('click', function () {
-		alert("1");
 		var selectedData = gridOptions.api.getSelectedRows();
 
 		if (selectedData.length == 0) {

+ 3 - 3
src/main/webapp/WEB-INF/views/withdraw/RefundDetailForm.html

@@ -14,7 +14,7 @@
  * 1.0  2020.11.16   moon        최초 작성
  *******************************************************************************
  -->
-	<ul class="popup modal" data-width="1260" >
+	<div class="modalPopup" data-width="1000" >
 		<div class="panelStyle">
 		<!-- TITLE -->
 		<div class="panelTitle">
@@ -142,7 +142,7 @@
 			</form>
 		
 		</div>
-	</ul>
+	</div>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
@@ -205,7 +205,7 @@
 		// Create a agGrid
 		gagaAgGrid.createGrid('refundGridList', withdrawDetailGridOptions);
 		
-		fnDetailSearch(true);
+		//fnDetailSearch(true);
 	});
 	
 	var initFlag = '';

+ 26 - 25
src/main/webapp/WEB-INF/views/withdraw/RefundRegisterListForm.html

@@ -137,11 +137,11 @@
 /*<![CDATA[*/
 	// specify the columns
 	var columnDefs = [
-		{headerName: "환불상태 ",		field: "rfndStat",	width: 80, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "회수구분", 		field: "wdGb",		width: 80, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "주문번호", 		field: "ordNo",		width: 100, minWidth: 190, cellClass: 'text-center'},
-		{headerName: "주문상세번호", 	field: "ordDtlNo",	width: 100, minWidth: 190, cellClass: 'text-center'},
-		{headerName: "반품요청일련번호", field: "ordChgSq",	width: 120, minWidth: 100, cellClass: 'text-center',
+		{headerName: "환불상태 ",		field: "rfndStat",	width: 80,  cellClass: 'text-center'},
+		{headerName: "회수구분", 		field: "wdGb",		width: 80,  cellClass: 'text-center'},
+		{headerName: "주문번호", 		field: "ordNo",		width: 100,  cellClass: 'text-center'},
+		{headerName: "주문상세번호", 	field: "ordDtlNo",	width: 100,  cellClass: 'text-center'},
+		{headerName: "반품요청일련번호", field: "ordChgSq",	width: 120,  cellClass: 'text-center',
 			cellRenderer: function(params) {
 				if (params.data.rfndStat == '환불완료') {
 					return "<a href=\"javascript:void(0);\" class=\"btn btn-dark btn-sm\">환불완료</a>";
@@ -150,38 +150,41 @@
 				}
 			}
 		},
-		{headerName: "회수송장번호", 	field: "wdInvoiceNo", 	width: 100, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "보내는사람", 	field: "senderNm", 		width: 100, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "보낸연락처", 	field: "senderPhnno", 	width: 120, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "주문자명", 		field: "ordNm",			width: 100, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "주문자연락처", 	field: "ordPhnno",		width: 120, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "도착일시", 		field: "arrivalDt", 	width: 100, minWidth: 120, cellClass: 'text-center'},
-		{headerName: "환불확정일자", 	field: "wdEddt",	 	width: 100, minWidth: 120, cellClass: 'text-center'},
-		{headerName: "WMS회수메모", 	field: "wdMemo", 		width: 200, minWidth: 100, cellClass: 'text-lecenterft'},
-		{headerName: "상품코드", 		field: "goodsCd", 		width: 150, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "옵션1", 		field: "sizeCd", 		width: 80, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "옵션2", 		field: "sizeCd", 		width: 80, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "반품수량", 		field: "chgQty", 		width: 80, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "회수수량", 		field: "wdQty", 		width: 80, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "요청사유",		field: "chgReason", 	width: 150, minWidth: 100, cellClass: 'text-center'},
-		{headerName: "클레임메모", 	field: "chgMemo", 		width: 200, minWidth: 100, cellClass: 'text-lecenterft'},
+		{headerName: "회수송장번호", 	field: "wdInvoiceNo", 	width: 100, cellClass: 'text-center'},
+		{headerName: "보내는사람", 	field: "senderNm", 		width: 100, cellClass: 'text-center'},
+		{headerName: "보낸연락처", 	field: "senderPhnno", 	width: 120, cellClass: 'text-center'},
+		{headerName: "주문자명", 		field: "ordNm",			width: 100, cellClass: 'text-center'},
+		{headerName: "주문자연락처", 	field: "ordPhnno",		width: 120, cellClass: 'text-center'},
+		{headerName: "도착일", 		field: "arrivalDt", 	width: 100,  cellClass: 'text-center'},
+		{headerName: "환불확정일", 	field: "completeDt",	width: 100,  cellClass: 'text-center'},
+		{headerName: "WMS회수메모", 	field: "wdMemo", 		width: 200,  cellClass: 'text-left'},
+		{headerName: "요청사유",		field: "chgReasonNm", 	width: 150,  cellClass: 'text-center'},
+		{headerName: "클레임메모", 	field: "chgMemo", 		width: 200,  cellClass: 'text-left'},
+		{headerName: "상품코드", 		field: "goodsCd", 		width: 150,  cellClass: 'text-center'},
+		{headerName: "옵션1", 		field: "optCd1", 		width: 80,  cellClass: 'text-center'},
+		{headerName: "옵션2", 		field: "optCd2", 		width: 80,  cellClass: 'text-center'},
+		{headerName: "반품수량", 		field: "chgQty", 		width: 80,  cellClass: 'text-center'},
+		{headerName: "회수수량", 		field: "wdQty", 		width: 80,  cellClass: 'text-center'},
+		{headerName: "회수등록일", 	field: "wdRegDt", 		width: 80,  cellClass: 'text-center'},
+		{headerName: "반품신청일", 	field: "rcRegDt", 		width: 80,  cellClass: 'text-center'},
+		{headerName: "반품완료일", 	field: "wdEddt", 		width: 80,  cellClass: 'text-center'}
+
 	];
 
 	// Get GridOptions
 	var withDrawGridOptions = gagaAgGrid.getGridOptions(columnDefs);
 
 	// Grid editable
-	withDrawGridOptions.defaultColDef.editable = false;
+	//withDrawGridOptions.defaultColDef.editable = false;
 
 
 	/*************************************************************************
 	*  init
 	**************************************************************************/	
 	$(document).ready(function() {
-		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '조회');
-
 		// Create a agGrid
 		gagaAgGrid.createGrid('gridList', withDrawGridOptions);
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', true, '조회');
 
 		gagajf.setDate('#terms', 'stDate', 'edDate', '3m');
 
@@ -234,7 +237,6 @@
 	**************************************************************************/	
 	withDrawGridOptions.onCellClicked = function(event) {
 		if (event.colDef.field != 'ordChgSq') return;
-
 		// 회수등록 팝업
 		if (event.data.ordChgSq > 0 && !gagajf.isNull(event.data.ordChgSq) && event.data.wdQty > 0) {
 			// 회수 상세 화면
@@ -248,7 +250,6 @@
 	**************************************************************************/		
 	var detailPopup = function(ordChgSq, ordNo) {
 		if (ordChgSq == 0) return;
-
 		var actionUrl = "/withdraw/refund/detail/form?ordChgSq=" + ordChgSq + '&ordNo=' + ordNo;
 		cfnOpenModalPopup(actionUrl, "popupWithdrawDetail");
 	}

+ 289 - 0
src/main/webapp/WEB-INF/views/withdraw/WithdrawChangePopForm.html

@@ -0,0 +1,289 @@
+<!DOCTYPE html>
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : WithdrawChangePopForm.html
+ * @desc    : 회수 사유변경 팝업 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.05.20   moon       최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1400" data-height="520">
+	<div class="panelStyle">
+		<div class="panelTitle">
+			<h2>사유변경</h2>
+			<button type="button" class="close" onclick="uifnPopupClose('popupWithdrawChangeForm');"><i class="fa fa-times"></i></button>
+		</div>
+			
+		<div class="panelContent" style="height:90%; overflow-y:auto; padding:0px 20px !important; ">
+			<form id="cancelRequestFrm" name="cancelRequestFrm" action="/orderChange/return" method="post" target="hdFrameForOrderCancel">
+				<input type="hidden" name="ordNo" 			th:value="${ordNo}"/>
+				<input type="hidden" name="ordChgSq" 		th:value="${ordChgSq}"/>
+				<input type="hidden" name="chgReason" 		value=""/>
+				
+				<th:block th:if="${chgGb} == 'G680_30'">
+					<h4>반품정보</h4>
+				</th:block>
+				<th:block th:if="${chgGb} == 'G680_40'">
+					<h4>교환정보</h4>
+				</th:block>
+				<div id="gridOrderWithdrawList" style="width:100%; height: 200px;" class="ag-theme-balham"></div>
+				<div style="text-align:right; padding-bottom:5px; padding-top:5px;">
+					<button type="button" class="btn btn-success" id="changeSaveBtn">저장</button>
+				</div>
+				
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:160px;" />
+						<col style="width:200px;" />
+						<col style="width:160px;" />
+						<col style="width:150px;" />
+						<col style="width:160px;" />
+						<col style="width:150px;" />
+						<col style="width:160px;" />
+						<col />
+					</colgroup>
+					<tbody>
+						<tr>
+							<!-- 반품회수 -->
+							<th:block th:if="${chgGb} == 'G680_30'">
+								<th>반품사유 <i class="star"></i></th>
+								<td>
+									<select name="selectChgReason" onchange="fnChangeChgReason($(this).val());">
+										<option value="">[선택하세요]</option>
+										<th:block th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}">
+											<th:block th:if="${oneData.cd} == ${chgReason}">
+												<option th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|" selected></option>
+											</th:block>
+											<th:block th:unless="${oneData.cd} == ${chgReason}">
+												<option th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|"></option>
+											</th:block>
+										</th:block>
+									</select>
+								</td>
+							</th:block>
+							<!-- //반품회수 -->
+							<!-- 교환회수 -->
+							<th:block th:if="${chgGb} == 'G680_40'">
+								<th>교환사유 <i class="star"></i></th>
+								<td>
+									<select name="selectChgReason" onchange="fnChangeChgReason($(this).val());">
+										<option value="">[선택하세요]</option>
+										<th:block th:if="${chgReasonList}" th:each="oneData, status : ${chgReasonList}">
+											<th:block th:if="${oneData.cd} == ${chgReason}">
+												<option th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|" selected></option>
+											</th:block>
+											<th:block th:unless="${oneData.cd} == ${chgReason}">
+												<option th:value="|${oneData.cd}|" th:text="|${oneData.cdNm}|"></option>
+											</th:block>
+										</th:block>
+									</select>
+								</td>
+							</th:block>
+							<!-- //교환회수 -->
+							<th>회수방법</th>
+							<td>
+								<th:blcok th:if="${wdGb} == 'W'">회수요청</th:blcok>
+								<th:blcok th:if="${wdGb} == 'D'">직접발송</th:blcok>
+							</td>
+							<th>귀책사유</th>
+							<td><span id="imputeReason"></span></td>
+							<th>추가비용</th>
+							<td><input type="text" name="addPayAmt" data-valid-type="integer"  readonly="true" class="w100 aR"/>원</td>
+						</tr>
+						<tr>
+							<th>요청메모</th>
+							<td colspan="7">
+								<textarea id="chgMemo" name="chgMemo" style="height:80px;" placeholder="취소사유를 300자내외로 작성해 주세요" th:text="${chgMemo}"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+	</div>
+</div>
+
+<!-- data -->
+<script th:inline="javascript">
+/*<![CDATA[*/
+var orderWithdrawList 	= [[${orderWithdrawList}]];		// 회수대상목록
+var chgReason			= [[${chgReason}]];				// 사유코드
+var orgChgReason		= [[${chgReason}]];				// ORG 사유코드
+var chgGb				= [[${chgGb}]];					// 요청구분
+var spanRefundAmt       = [[${spanRefundAmt}]];			// 환불비용
+var delvFee				= [[${delvFee}]];				// 배송비
+var rtnDelvFee 			= [[${rtnDelvFee}]];			// 반품비
+var wdGb 				= [[${wdGb}]];					// 회수구분(W:회수요청, D:직접배송)
+var ordChgSq			= [[${ordChgSq}]];				// 주문변경번호
+
+var columnWidthdrawList = [
+
+	{headerName: "변경번호",			field:"ordChgSq",			width:80, cellClass: 'text-center'},
+	{headerName: "주문번호",			field:"ordNo",				width:80, cellClass: 'text-center'},
+	{headerName: "상세번호",			field:"ordDtlNo",			width:80, cellClass: 'text-center'},
+	{headerName: "클레임상태",			field:"chgStatNm", 			width:100, cellClass: 'text-center'},
+	{headerName: "요청일시",			field:"regDt", 				width:150, cellClass: 'text-center'},
+	{headerName: "요청자명",			field:"chgerNm",			width:100, cellClass: 'text-center'},
+	{headerName: "휴대전화",			field:"chgerPhnno",			width:120, cellClass: 'text-center'},
+	{headerName: "상품명",			field:"goodsNm",			width:100, cellClass: 'text-center'},
+	{headerName: "상품코드",			field:"goodsCd",			width:100, cellClass: 'text-center'},
+	{headerName: "옵션",				field:"optCd",				width:100, cellClass: 'text-center'},
+	{headerName: "요청수량",			field:"chgQty",				width:100, cellClass: 'text-center'},
+	{headerName: "물류메모",			field:"adminMemo",			width:200, cellClass: 'text-center'}
+
+];
+
+var gridOptionsWidthdrawList = gagaAgGrid.getGridOptions(columnWidthdrawList);
+</script>
+
+<script th:inline="javascript">
+
+// 사유코드체크
+var fnChangeChgReason = function(reasonCd) {
+
+	var customerReasonArr = ['G688_10', 'G689_10'];	
+	isCustomer = false;
+	
+	// 귀책사유체크(취소,반품,교환)
+	for (i=0 ; i<customerReasonArr.length ; i++) {
+		if (customerReasonArr[i] == reasonCd) {
+			isCustomer = true;
+		}
+	}
+	
+	// 귀책사유체크(회사,고객)
+	if (isCustomer) {
+		$("#imputeReason").text("고객");
+	} else {
+		$("#imputeReason").text("회사");
+	}
+	
+	$('#cancelRequestFrm input[name=chgReason]').val(reasonCd);
+
+	
+	var changeYn = "N";
+	var addPayCost = 0 ;
+	var rsn = $('#cancelRequestFrm input[name=chgReason]').val(); // 사유코드 
+	
+	if(orgChgReason != rsn){
+		if(chgGb == "G680_30"){   // 반품
+			if(rsn == "G688_10"){ // 고객귀책 
+				if(wdGb == "W"){  // 회수요청 
+					changeYn = "Y";
+					addPayCost = rtnDelvFee;
+				}
+			}
+			
+		} else { // 교환
+			if(rsn == "G689_10"){ // 고객귀책 
+				if(wdGb == "W"){  // 회수요청 
+					changeYn = "Y";
+					addPayCost = rtnDelvFee + delvFee;
+				} else {          // 직접배송
+					changeYn = "Y";
+					addPayCost = rtnDelvFee;
+				}
+			}
+		}
+		
+		if(changeYn == "Y"){
+			$('#cancelRequestFrm input[name=addPayAmt]').val(addPayCost);
+		} else {
+			$('#cancelRequestFrm input[name=addPayAmt]').val(0);
+		}
+	} else {
+		$('#cancelRequestFrm input[name=addPayAmt]').val(0);
+	}
+
+}
+
+$(document).ready(function() {
+
+	// 1. 그리드생성
+	gagaAgGrid.createGrid('gridOrderWithdrawList', gridOptionsWidthdrawList);
+	gridOptionsWidthdrawList.api.setRowData(orderWithdrawList);
+
+	// 2. TOTAL ROWS 없애기
+	gagaAgGrid.hideStatusBar('gridOrderWithdrawList');
+
+	// 사유체크실행
+	fnChangeChgReason(chgReason);
+	
+});
+
+
+// 저장
+$("#changeSaveBtn").on("click", function(){
+	
+	// 1. 취소사유 체크
+	var chgReason = $("#cancelRequestFrm select[name=selectChgReason]").val();
+	if (gagajf.isNull(chgReason)) {
+		mcxDialog.alert("취소사유를 입력하세요."); 
+		return ;
+	}
+	
+	
+	var changeYn = "N";
+	var addPayCost = 0 ;
+	var rsn = $('#cancelRequestFrm input[name=chgReason]').val(); // 사유코드 
+	
+	
+	if(chgGb == "G680_30"){   // 반품
+		if(rsn == "G688_10"){ // 고객귀책 
+			if(wdGb == "W"){  // 회수요청 
+				changeYn = "Y";
+				addPayCost = rtnDelvFee;
+			}
+		}
+		
+	} else { // 교환
+		if(rsn == "G689_10"){ // 고객귀책 
+			if(wdGb == "W"){  // 회수요청 
+				changeYn = "Y";
+				addPayCost = rtnDelvFee + delvFee;
+			} else {          // 직접배송
+				changeYn = "Y";
+				addPayCost = rtnDelvFee;
+			}
+		}
+	}
+	var ordDtlNoList = "";
+	for(var i=0; i<orderWithdrawList.length; i++) {
+		if(i == 0){
+			ordDtlNoList = orderWithdrawList[i].ordDtlNo;
+		} else {
+			ordDtlNoList = ordDtlNoList +","+ orderWithdrawList[i].ordDtlNo;
+		}
+		
+	}
+
+	mcxDialog.confirm('변경 하시겠습니까?', {
+		cancelBtnText: "취소",
+		sureBtnText: "확인",
+		sureBtnClick: function () {
+			var jsonData = {
+				"ordChgSq": ordChgSq,
+				"changeYn": changeYn,
+				"addPayCost": addPayCost,
+				"chgGb": chgGb,
+				"chgMemo": $("#cancelRequestFrm textarea[name=chgMemo]").val() ,
+				"ordDtlNoList": ordDtlNoList
+			};
+			var tranData = JSON.stringify(jsonData);
+			gagajf.ajaxJsonSubmit('/withdraw/change/save', tranData, function() {uifnPopupClose('popupWithdrawChangeForm');});
+		}
+	});
+});
+</script>
+</html>
+
+
+
+
+

+ 21 - 2
src/main/webapp/WEB-INF/views/withdraw/WithdrawExceptionListForm.html

@@ -155,6 +155,20 @@
 		{headerName: "주문자명",			field: "customerName",		width: 100,	cellClass: 'text-center'},
 		{headerName: "예외사유",			field: "reasonCd",			width: 150,	cellClass: 'text-center'},
 		{headerName: "WMS메시지",			field: "adminMemo",			width: 300,	cellClass: 'text-left'},
+		{headerName: "회수요청구분",		field: "chgGbNm",			width: 80,	cellClass: 'text-left'},
+		{headerName: "반품교환사유",		field: "chgReasonNm",		width: 150,	cellClass: 'text-left'},
+		{headerName: "반품교환사유변경",		field: "chgReason",			width: 120,	cellClass: 'text-center',rowSpan: params => params.data.rowspanRank === 1 ? params.data.rowspanCnt : 1,
+			    cellClassRules: {
+			        'cell-span': "data.rowspanRank == 1"
+			      },
+				cellRenderer: function(params) {
+					var btnText = '';
+					if(params.data.recallStat === 'P' && params.data.chgStat != null) {
+						btnText= '<a href="javascript:void(0);"  class="btn btn-success btn-ssm">사유변경</a>';
+					} else { btnText = '' }
+					return btnText;
+				}		
+		},
 		{headerName: "요금구분",			field: "chargeType",		width: 80,	cellClass: 'text-center'},
 		{headerName: "동봉비",			field: "chargeAmount",		width: 100,	cellClass: 'text-right'
 			,valueFormatter: function(params) {
@@ -174,8 +188,8 @@
 			cellEditorParams: { maxlength: 1000, required: true }
 		},			
 		{headerName: "작업자",			field: "userNameCreated",	width: 100,	cellClass: 'text-center'},
-
 		{headerName: "브랜드명",			field: "brandNm",			width: 150,	cellClass: 'text-center'},
+		{headerName: "상품명",			field: "productName",		width: 200,	cellClass: 'text-left'},
 		{headerName: "상품코드",			field: "productCode",		width: 100,	cellClass: 'text-center',
 			cellRenderer: function (params) {
 				if (roleCd.indexOf("C") < 0) {
@@ -186,7 +200,6 @@
 			}
 		},
 		{headerName: "SKU코드",			field: "skuCode",			width: 100,	cellClass: 'text-center'},
-		{headerName: "상품명",			field: "productName",		width: 200,	cellClass: 'text-left'},
 		{headerName: "속성",		    	field: "skuValue",			width: 80,	cellClass: 'text-center'},
 		{headerName: "원코드",			field: "skuModelNo",		width: 150,	cellClass: 'text-left'},
 		{headerName: "주문수량",			field: "qty",				width: 80,	cellClass: 'text-right'},
@@ -280,6 +293,12 @@
 					}
 				});
 			}
+		} else if(event.colDef.field == 'chgReason'){
+			if(event.data.recallStat == "P" && event.data.rowspanRank == "1"){
+				
+				var actionUrl = "/withdraw/exception/change/form?ordChgSq=" + event.data.ordChgSq + '&chgGb=' + event.data.chgGb;
+				cfnOpenModalPopup(actionUrl, 'popupWithdrawChangeForm');
+			}
 		}
 	}
 	/*