Преглед изворни кода

Merge branch 'develop' into bin2107

bin2107 пре 5 година
родитељ
комит
58b132bbc7

+ 21 - 1
src/main/java/com/style24/core/biz/dao/TscCustomerDao.java

@@ -99,7 +99,7 @@ public interface TscCustomerDao {
 	String getTemporaryPassword(int length);
 
 	/**
-	 * 휴면해제 처리
+	 * 휴면해제
 	 *
 	 * @param customer - 고객정보
 	 * @return int - 처리결과
@@ -118,5 +118,25 @@ public interface TscCustomerDao {
 	 */
 	int deleteDormantCustomer(Integer custNo);
 
+	/**
+	 * 주문정보 휴면해제
+	 *
+	 * @param customer - 고객정보
+	 * @return int - 처리결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	int updateDormantOrderRelease(Customer customer);
+
+	/**
+	 * 휴면주문 정보 삭제
+	 *
+	 * @param custNo - 고객번호
+	 * @return int - 처리결과
+	 * @author jsshin
+	 * @since 2021. 03. 11
+	 */
+	int deleteDormantOrder(Integer custNo);
+
 	void createException();
 }

+ 64 - 4
src/main/java/com/style24/core/biz/dao/TscOrderDao.java

@@ -423,6 +423,20 @@ public interface TscOrderDao {
 	 * @since 2021. 02. 02
 	 */	
 	Collection<Order> getDelvCpnList(Order order);
+
+	/**
+	 * 결제 취소 정보 생성
+	 * @param param
+	 * @return
+	 */
+	void insertPaymentCancel(Payment param);
+
+	/**
+	 * 결제 데이터 생성 중 에러로 인한 결제 취소 데이터 생성
+	 * @param param
+	 * @return
+	 */
+	void insertPaymentRollback(Payment param);
 	
 	/**
 	 * 총알배송 가능 시간 체크
@@ -441,12 +455,58 @@ public interface TscOrderDao {
 	 * @since 2021. 02. 02
 	 */	
 	int getDailyDeliveryZoneInfo(Order order);
-
+	
 	/**
-	 * 결제 후 롤백 취소 데이터 등록
+	 * 1. 주문기본정보 등록
 	 *
-	 * @param param
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	int createOrder(Order order);
+	
+	/**
+	 * 2. 주문배송지정보 등록
+	 *
+	 * @param Order - 주문 정보
 	 * @return
+	 * @author jsh77b
+	 * @since 2021. 03. 09
 	 */
-	int insertPaymentForRollback(Payment param);
+	int createDeliveryAddr(Order order);
+	
+	/**
+	 * 3. 주문배송비정보등록 등록
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	int createDeliveryFee(Order order);
+	
+	/**
+	 * 4. 주문상세정보등록 등록
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	int createOrderDetail(Order order);
+	
+	/**
+	 * 5. 주문상세단품정보등록 등록
+	 *
+	 * @param Order - 주문 정보
+	 * @return
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	int createOrderDetailItem(Order order);
+	
+	
+	
+
 }

+ 8 - 0
src/main/java/com/style24/core/biz/service/TscCustomerService.java

@@ -2,6 +2,7 @@ package com.style24.core.biz.service;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.dao.TscCustomerDao;
+import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.domain.CustContactHst;
 import com.style24.persistence.domain.Customer;
 import lombok.extern.slf4j.Slf4j;
@@ -102,6 +103,7 @@ public class TscCustomerService {
 			result.setString("resultMessage", "진행중인 거래가 있습니다. 진행중인 거래를 완료 후 탈퇴 신청을 해주세요.");
 			return result;
 		}
+		customer.setEncodedCustNm(CryptoUtils.encryptAES("탈퇴"));
 
 		// 3.고객정보 이력 생성
 		customerDao.createCustomerHistory(customer);
@@ -173,6 +175,12 @@ public class TscCustomerService {
 		// 3. 휴면 테이블 삭제
 		customerDao.deleteDormantCustomer(customer.getCustNo());
 
+		// 4. 주문정보 휴면해제
+		customerDao.updateDormantOrderRelease(customer);
+
+		// 5. 휴면주문정보 삭제
+		customerDao.deleteDormantOrder(customer.getCustNo());
+
 		return resultCnt > 0;
 	}
 

+ 73 - 37
src/main/java/com/style24/core/biz/service/TscKakaoPayService.java

@@ -1,5 +1,9 @@
 package com.style24.core.biz.service;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
@@ -9,6 +13,7 @@ import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
 import com.style24.core.biz.thirdparty.KakaoPayApi;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.Order;
@@ -32,9 +37,6 @@ public class TscKakaoPayService {
 	@Autowired
 	private TscMessageByLocale message;
 
-	@Autowired
-	private RestTemplate restTemplate;
-	
 	@Autowired
 	private KakaoPayApi kakaoPayApi;
 
@@ -51,18 +53,21 @@ public class TscKakaoPayService {
 		// API 전송 URL 설정
 		String paymentReadyUrl = env.getProperty("kakao.paymentReadyUrl");
 
+		// Redirect URL 설정
+		String redirectUrl = "http://" + env.getProperty("domain.front") + env.getProperty("kakao.paymentRedirectUrl");
+
 		// API 파라메터 설정
 		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
 		params.add("cid", env.getProperty("kakao.cid"));
 		params.add("partner_order_id", order.getOrdNo()+"");
 		params.add("partner_user_id", order.getCustNo()+"");
 		params.add("item_name", order.getGoodsNm());
-		params.add("quantity", order.getOrdQty()+"");
-		params.add("total_amount", order.getRealOrdAmt()+"");
+		params.add("quantity", order.getOrdGoodsQty()+"");
+		params.add("total_amount", order.getPayAmt()+"");
 		params.add("tax_free_amount", "0");
-		params.add("approval_url", order.getApprovalUrl());
-		params.add("fail_url", order.getFailUrl());
-		params.add("cancel_url", order.getCancelUrl());
+		params.add("approval_url", redirectUrl);
+		params.add("fail_url", redirectUrl);
+		params.add("cancel_url", redirectUrl);
 
 		// 카카오페이 API 전송
 		return kakaoPayApi.kakaoPaymentApi(params, paymentReadyUrl);
@@ -77,23 +82,22 @@ public class TscKakaoPayService {
 	 * @since 2021. 03. 04
 	 */
 	@Transactional("shopTxnManager")
-	public Payment approveKakaoPayment(Order order) {
+	public Payment approveKakaoPayment(Payment payment) {
 		// API 전송 URL 설정
 		String approvePaymentUrl = env.getProperty("kakao.approvePaymentUrl");
 
 		// API 파라메터 설정
 		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
 		params.add("cid", env.getProperty("kakao.cid"));
-		params.add("tid", order.getPgTid());
-		params.add("partner_order_id", order.getOrdNo()+"");
-		params.add("partner_user_id", order.getCustNo()+"");
-		params.add("pg_token", order.getPgToken());
+		params.add("tid", payment.getPgTid());
+		params.add("partner_order_id", payment.getPartnerOrderId());
+		params.add("partner_user_id", payment.getPartnerUserId());
+		params.add("pg_token", payment.getPgToken());
 
 		// 카카오페이 API 전송
 		KakaoPay kakaoPay = kakaoPayApi.kakaoPaymentApi(params, approvePaymentUrl);
 
 		// 카카오페이 API 전송 결과 처리
-		Payment payment = new Payment();
 		int statusCode = kakaoPay.getStatusCode();
 
 		// 승인 성공일때 200
@@ -101,6 +105,8 @@ public class TscKakaoPayService {
 			payment.setPgTradeNo(kakaoPay.getAid());
 			payment.setPgTid(kakaoPay.getTid());
 			payment.setPgShopId(kakaoPay.getCid());
+			payment.setPayDt(convertDateFormat(kakaoPay.getApproved_at()));
+			payment.setPayStat(TscConstants.PaymentStat.PAYMENT_COMPLETE.value());
 			payment.setOrdNo(Integer.parseInt(kakaoPay.getPartner_order_id()));
 			payment.setCustNo(Integer.parseInt(kakaoPay.getPartner_user_id()));
 			payment.setKakaoMethodType(kakaoPay.getPayment_method_type());
@@ -119,18 +125,33 @@ public class TscKakaoPayService {
 			payment.setResCd(String.valueOf(statusCode));
 			payment.setResMsg(message.getMessage("SUCC_0004"));
 		} else {
-			int code = Integer.parseInt(kakaoPay.getCode());
-			String msg = kakaoPay.getMsg();
-			String resultCode = kakaoPay.getExtras().getMethod_result_code();
+			// int code = Integer.parseInt(kakaoPay.getCode());
+			// String msg = kakaoPay.getMsg();
+			// String resultCode = kakaoPay.getExtras().getMethod_result_code();
 			String resultMessage = kakaoPay.getExtras().getMethod_result_message();
 
-			payment.setResCd(String.valueOf(code));
-			payment.setResMsg(resultMessage);
+			throw new IllegalStateException(resultMessage);
+			// payment.setResCd(String.valueOf(code));
+			// payment.setResMsg(resultMessage);
 		}
 
 		return payment;
 	}
 
+	private String convertDateFormat(String date) {
+		String result = "";
+		try {
+			SimpleDateFormat parseSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+			Date parseDate = parseSdf.parse(date);
+			result = sdf.format(parseDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
 	/**
 	 * 카카오페이 주문 조회
 	 *
@@ -140,14 +161,14 @@ public class TscKakaoPayService {
 	 * @since 2021. 03. 04
 	 */
 	@Transactional("shopTxnManager")
-	public KakaoPay getKakaoPaymentOrder(Order order) {
+	public KakaoPay getKakaoPaymentOrder(Payment payment) {
 		// API 전송 URL 설정
 		String paymentOrderUrl = env.getProperty("kakao.paymentOrderUrl");
 
 		// API 파라메터 설정
 		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
 		params.add("cid", env.getProperty("kakao.cid"));
-		params.add("tid", order.getPgTid());
+		params.add("tid", payment.getPgTid());
 
 		// 카카오페이 API 전송
 		KakaoPay pay = kakaoPayApi.kakaoPaymentApi(params, paymentOrderUrl);
@@ -164,29 +185,21 @@ public class TscKakaoPayService {
 	 * @since 2021. 03. 05
 	 */
 	@Transactional("shopTxnManager")
-	public Payment cancelKakaoPayment(Order order) {
+	public Payment cancelKakaoPayment(Payment payment) {
 		// API 전송 URL 설정
 		String cancelPaymentUrl = env.getProperty("kakao.cancelPaymentUrl");
 
 		// API 파라메터 설정
 		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
 		params.add("cid", env.getProperty("kakao.cid"));
-		params.add("tid", order.getPgTid());
+		params.add("tid", payment.getPgTid());
+		params.add("cancel_amount", String.valueOf(payment.getPayAmt()));
 		params.add("cancel_tax_free_amount", "0");
 
-		// 전체 취소의 경우 카카오페이에 취소가능금액으로 취소금액 설정
-		if ("Y".equals(order.getAllCanYn())) {
-			KakaoPay orderInfo = getKakaoPaymentOrder(order);
-			params.add("cancel_amount", String.valueOf(orderInfo.getCancel_available_amount().getTotal()));
-		} else {
-			params.add("cancel_amount", String.valueOf(order.getCnclRtnAmt()));
-		}
-
 		// 카카오페이 API 전송
 		KakaoPay kakaoPay = kakaoPayApi.kakaoPaymentApi(params, cancelPaymentUrl);
 
 		// 카카오페이 API 전송 결과 처리
-		Payment payment = new Payment();
 		int statusCode = kakaoPay.getStatusCode();
 
 		// 승인 성공일때 200
@@ -202,16 +215,39 @@ public class TscKakaoPayService {
 			payment.setResCd(String.valueOf(statusCode));
 			payment.setResMsg(message.getMessage("SUCC_0004"));
 		} else {
-			int code = Integer.parseInt(kakaoPay.getCode());
-			String msg = kakaoPay.getMsg();
-			String resultCode = kakaoPay.getExtras().getMethod_result_code();
+			// int code = Integer.parseInt(kakaoPay.getCode());
+			// String msg = kakaoPay.getMsg();
+			// String resultCode = kakaoPay.getExtras().getMethod_result_code();
 			String resultMessage = kakaoPay.getExtras().getMethod_result_message();
 
-			payment.setResCd(String.valueOf(code));
-			payment.setResMsg(resultMessage);
+			throw new IllegalStateException(resultMessage);
+			// payment.setResCd(String.valueOf(code));
+			// payment.setResMsg(resultMessage);
 		}
 
 		return payment;
 	}
 
+	/**
+	 * 카카오페이 결제 데이터 생성
+	 *
+	 * @param KakaoPay, Order
+	 * @return Payment
+	 * @author card007
+	 * @since 2021. 03. 09
+	 */
+	public Payment setKakaoOrderData(KakaoPay kakaoPay, Order order) {
+		Payment payment = new Payment();
+		payment.setPgTid(kakaoPay.getTid());
+		payment.setPartnerOrderId(String.valueOf(order.getOrdNo()));
+		payment.setPartnerUserId(String.valueOf(order.getCustNo()));
+		payment.setNextRedirectAppUrl(kakaoPay.getNext_redirect_app_url());
+		payment.setNextRedirectMobileUrl(kakaoPay.getNext_redirect_mobile_url());
+		payment.setNextRedirectPcUrl(kakaoPay.getNext_redirect_pc_url());
+		payment.setAndroidAppScheme(kakaoPay.getAndroid_app_scheme());
+		payment.setIosAppScheme(kakaoPay.getIos_app_scheme());
+
+		return payment;
+	}
+
 }

+ 77 - 17
src/main/java/com/style24/core/biz/service/TscKcpService.java

@@ -108,8 +108,8 @@ public class TscKcpService {
 					// 06-3. 가상계좌 승인 결과 처리 (현금영수증은 입금완료 noti에서 입력)
 					result.setVaNm(c_PayPlus.mf_get_res("va_name"));				// 입금할 계좌 예금주
 					result.setVaNo(c_PayPlus.mf_get_res("account"));				// 입금할 계좌 번호
-					result.setVaBank(c_PayPlus.mf_get_res("bankcode"));			// 입금 은행 코드(공통코드 G940)
-					result.setVaDeadline(c_PayPlus.mf_get_res("vaDate"));		// 가상계좌 입금마감시간
+					result.setVaBank(c_PayPlus.mf_get_res("bank_code"));			// 입금 은행 코드(공통코드 G940)
+					result.setVaDeadline(c_PayPlus.mf_get_res("va_date"));		// 가상계좌 입금마감시간
 					result.setPayStat(TscConstants.PaymentStat.PAYMENT_WAIT.value());	// 결제대기
 				} else if ("000010000000".equals(result.getUsePayMethod())) {
 					// 06-4. 휴대폰 승인 결과 처리
@@ -127,10 +127,6 @@ public class TscKcpService {
 			}
 		}
 
-		log.info("CHECK RESPONSE DATA        ::::: {} / {}", c_PayPlus.toString(), c_PayPlus.getRecvObj().toString());
-		log.info("CHECK RESPONSE RESULT DATA ::::: {}", result.toString());
-		log.info("CHECK RESPONSE PARAM DATA  ::::: {}", param.toString());
-
 		return result;
 	}
 
@@ -172,30 +168,94 @@ public class TscKcpService {
 		return payment;
 	}
 
-	@Transactional("shopTxnManager")
+	/**
+	 * KCP 결제 처리 후 로직 진행 중 에러 발생으로 인한 취소처리 (TB_PAYMENT에 insert되는 모든 데이터 필요)
+	 * @param param
+	 * @param request
+	 */
 	public void kcpPayRollBack(Payment param, HttpServletRequest request) {
+		param.setPayStat(TscConstants.PaymentStat.DB_FAIL.value());
+		param.setPayGb("E");
+		param.setModType("STSC");
+		param.setModDesc("가맹점 결과 처리 오류 - 가맹점에서 취소 요청");
+		kcpCancel(param, request);
+	}
+
+	/**
+	 * KCP 전체 취소 (pgTid, regNo, updNo 필수)
+	 * @param param
+	 * @param request
+	 */
+	public void kcpPayCancelAll(Payment param, HttpServletRequest request) {
+		param.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+		param.setPayGb("O");
+		param.setModType("STSC");
+		param.setModDesc("가맹점 취소 - 전체 취소");
+		kcpCancel(param, request);
+	}
+
+	/**
+	 * KCP 부분 취소 (pgTid, regNo, updNo, leftAmt:취소 전 잔여금액, partCancelAmt:부분취소금액 필수)
+	 * @param param
+	 * @param request
+	 */
+	public void kcpPayCancelPart(Payment param, HttpServletRequest request) {
+		param.setPayStat(TscConstants.PaymentStat.PAYMENT_CANCEL.value());
+		param.setPayGb("O");
+		param.setModType("STPC");
+		param.setModDesc("가맹점 취소 - 부분 취소");
+		kcpCancel(param, request);
+	}
+
+	@Transactional("shopTxnManager")
+	public void kcpCancel(Payment param, HttpServletRequest request) {
 		try {	request.setCharacterEncoding("euc-kr");	} catch(Exception e) {	}
 
 		J_PP_CLI_N c_PayPlus = new J_PP_CLI_N();
+		Payment payment = new Payment();
 
 		c_PayPlus.mf_init( "", env.getProperty("pg.kcp.gw.url"), env.getProperty("pg.kcp.gw.port"), Integer.parseInt(env.getProperty("pg.kcp.tx.mode")), env.getProperty("pg.kcp.log.dir"));
 		c_PayPlus.mf_init_set();
 
 		int mod_data_set_no = c_PayPlus.mf_add_set("mod_data");
-		c_PayPlus.mf_set_us( mod_data_set_no, "tno", param.getPgTid());		// KCP 원거래 거래번호
-		c_PayPlus.mf_set_us( mod_data_set_no, "mod_type", "STSC");		// 전체취소 STSC / 부분취소 STPC
-		c_PayPlus.mf_set_us( mod_data_set_no, "mod_ip", f_get_parm(request.getRemoteAddr())); // 변경 요청자 IP
-		c_PayPlus.mf_set_us( mod_data_set_no, "mod_desc", "가맹점 결과 처리 오류 - 가맹점에서 취소 요청"); // 변경 사유
+		c_PayPlus.mf_set_us(mod_data_set_no, "tno"		, param.getPgTid());					// KCP 원거래 거래번호
+		c_PayPlus.mf_set_us(mod_data_set_no, "mod_type"	, param.getModType());					// 전체취소 STSC / 부분취소 STPC
+		c_PayPlus.mf_set_us(mod_data_set_no, "mod_ip"	, f_get_parm(request.getRemoteAddr()));	// 변경 요청자 IP
+		c_PayPlus.mf_set_us(mod_data_set_no, "mod_desc"	, param.getModDesc());					// 변경 사유
+
+		if("STPC".equals(param.getModType())) {
+			c_PayPlus.mf_set_us( mod_data_set_no, "mod_mny", param.getPartCancelAmt() + "");	// 취소요청금액
+			c_PayPlus.mf_set_us( mod_data_set_no, "rem_mny", param.getLeftAmt() + "");		// 취소가능잔액
+		}
 
 		param.setTranCd("00200000");
 		c_PayPlus.mf_do_tx(env.getProperty("pg.kcp.site.cd"), env.getProperty("pg.kcp.site.key"), param.getTranCd(), "", "", env.getProperty("pg.kcp.log.level"), "0");
 
-		param.setResCd(c_PayPlus.m_res_cd);		// 결과 코드
-		param.setResMsg(c_PayPlus.m_res_msg);	// 결과 메시지
-
-		log.info("CHECK CANCEL INFO >> {} ", c_PayPlus.getRecvObj().toString());
+		if("0000".equals(c_PayPlus.m_res_cd)) {
+			payment.setResCd(c_PayPlus.m_res_cd);			// 결과 코드
+			payment.setResMsg(c_PayPlus.m_res_msg);			// 결과 메시지
+			payment.setPgTid(c_PayPlus.mf_get_res("tno"));
+			payment.setPgCpnAmt(-Integer.parseInt(c_PayPlus.mf_get_res("coupon_mny")));
+			if ("STSC".equals(param.getModType())) {
+				payment.setOrdNo(Integer.parseInt(c_PayPlus.mf_get_res("order_no")));			// 전체취소시 return 되는 주문번호
+				payment.setPayAmt(-Integer.parseInt(c_PayPlus.mf_get_res("amount")));			// 전체 취소는 결제 금액 전체
+			} else {
+				payment.setOrdNo(Integer.parseInt(c_PayPlus.mf_get_res("ca_order_id")));			// 부분취소시 return되는 주문번호
+				payment.setPayAmt(-Integer.parseInt(c_PayPlus.mf_get_res("panc_mod_mny")));		// 부분 취소는 취소된 금액
+			}
 
-		param.setPayStat(TscConstants.PaymentStat.DB_FAIL.value());
-		orderDao.insertPaymentForRollback(param);
+			if ("E".equals(param.getPayGb())) {			// 결제완료 로직 진행 중 에러 발생시
+				param.setPgTid(payment.getPgTid());
+				orderDao.insertPaymentCancel(param);
+			} else {									// 일반 취소 작업
+				payment.setRegNo(param.getRegNo() == null ? 0 : param.getRegNo());
+				payment.setUpdNo(param.getUpdNo() == null ? 0 : param.getUpdNo());
+				payment.setPayGb(param.getPayGb());
+				payment.setPayStat(param.getPayStat());
+				orderDao.insertPaymentCancel(payment);
+			}
+		} else {
+			throw new IllegalArgumentException("결제 취소 실패하였습니다.");
+		}
 	}
 }

+ 50 - 45
src/main/java/com/style24/core/biz/service/TscNaverPayService.java

@@ -1,6 +1,9 @@
 package com.style24.core.biz.service;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
@@ -15,6 +18,7 @@ import org.springframework.web.client.RestTemplate;
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.thirdparty.KakaoPayApi;
 import com.style24.core.biz.thirdparty.NaverPayApi;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.KakaoPay;
 import com.style24.persistence.domain.NaverPay;
@@ -55,17 +59,20 @@ public class TscNaverPayService {
 		// API 전송 URL 설정
 		String paymentReadyUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.paymentReadyUrl");
 
+		// Redirect URL 설정
+		String redirectUrl = "http://" + env.getProperty("domain.front") + env.getProperty("naverPay.paymentRedirectUrl");
+
 		// API 파라메터 설정
 		NaverPay naverPay = new NaverPay();
 		naverPay.setModelVersion("2");
 		naverPay.setMerchantUserKey(order.getCustNo());
 		naverPay.setMerchantPayKey(order.getOrdNo());
 		naverPay.setProductName(order.getGoodsNm());
-		naverPay.setProductCount(order.getOrdQty());
-		naverPay.setTotalPayAmount(order.getRealOrdAmt());
-		naverPay.setTaxScopeAmount(order.getRealOrdAmt());
+		naverPay.setProductCount(order.getOrdGoodsQty());
+		naverPay.setTotalPayAmount(order.getPayAmt());
+		naverPay.setTaxScopeAmount(order.getPayAmt());
 		naverPay.setTaxExScopeAmount(0);
-		naverPay.setReturnUrl(order.getReturnUrl());
+		naverPay.setReturnUrl(redirectUrl);
 
 		// 네이버페이 API 전송
 		return naverPayApi.naverPaymentJsonApi(naverPay, paymentReadyUrl);
@@ -80,19 +87,18 @@ public class TscNaverPayService {
 	 * @since 2021. 03. 08
 	 */
 	@Transactional("shopTxnManager")
-	public Payment approveNaverPayment(Order order) {
+	public Payment approveNaverPayment(Payment payment) {
 		// API 전송 URL 설정
-		String paymentReadyUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.approvePaymentUrl");
+		String approvePaymentUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.approvePaymentUrl");
 
 		// API 파라메터 설정
 		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
-		params.add("paymentId", order.getPgTid());
+		params.add("paymentId", payment.getPgTid());
 
 		// 네이버페이 API 전송
-		NaverPay naverPay = naverPayApi.naverPaymentApi(params, paymentReadyUrl);
+		NaverPay naverPay = naverPayApi.naverPaymentApi(params, approvePaymentUrl);
 
-		// 카카오페이 API 전송 결과 처리
-		Payment payment = new Payment();
+		// 네이버페이 API 전송 결과 처리
 		int statusCode = naverPay.getStatusCode();
 
 		// 승인 성공일때 200
@@ -100,6 +106,8 @@ public class TscNaverPayService {
 			payment.setPgTradeNo(naverPay.getBody().getPayHistId());
 			payment.setPgTid(naverPay.getBody().getDetail().getPaymentId());
 			payment.setPgShopId(naverPay.getBody().getDetail().getMerchantId());
+			payment.setPayDt(naverPay.getBody().getDetail().getAdmissionYmdt());
+			payment.setPayStat(TscConstants.PaymentStat.PAYMENT_COMPLETE.value());
 			payment.setOrdNo(Integer.parseInt(naverPay.getBody().getDetail().getMerchantPayKey()));
 			payment.setCustNo(Integer.parseInt(naverPay.getBody().getDetail().getMerchantUserKey()));
 			payment.setNaverMethodType(naverPay.getBody().getDetail().getPrimaryPayMeans());
@@ -109,6 +117,7 @@ public class TscNaverPayService {
 			// 네이버페이 카드결제 시 카드정보 설정
 			if ("CARD".equals(naverPay.getBody().getDetail().getPrimaryPayMeans())) {
 				payment.setCardNm(getCardNm(naverPay.getBody().getDetail().getCardCorpCode()));
+				payment.setCardType("N");	// 신용카드 결제
 				payment.setCardMips(String.valueOf(naverPay.getBody().getDetail().getCardInstCount()));
 			}
 		}
@@ -146,13 +155,13 @@ public class TscNaverPayService {
 	 * @since 2021. 03. 08
 	 */
 	@Transactional("shopTxnManager")
-	public NaverPay getNaverPaymentOrder(Order order) {
+	public NaverPay getNaverPaymentOrder(Payment payment) {
 		// API 전송 URL 설정
 		String paymentOrderUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.paymentOrderUrl");
 
 		// API 파라메터 설정
 		NaverPay naverPay = new NaverPay();
-		naverPay.setPaymentId(order.getPgTid());
+		naverPay.setPaymentId(payment.getPgTid());
 
 		// 기간별 주문 조회 (31일 이내)
 		// naverPay.setStartTime(order.getStartTime());
@@ -161,7 +170,7 @@ public class TscNaverPayService {
 		// naverPay.setPageNumber(order.getPageNo());
 		// naverPay.setRowsPerPage(order.getPageSize());
 
-		// 카카오페이 API 전송
+		// 네이버페이 API 전송
 		return naverPayApi.naverPaymentJsonApi(naverPay, paymentOrderUrl);
 	}
 
@@ -174,56 +183,37 @@ public class TscNaverPayService {
 	 * @since 2021. 03. 08
 	 */
 	@Transactional("shopTxnManager")
-	public Payment cancelNaverPayment(Order order) {
+	public Payment cancelNaverPayment(Payment payment) {
 		// API 전송 URL 설정
 		String cancelPaymentUrl = env.getProperty("naverPay.apiUrl") + env.getProperty("naverPay.partnerId") + env.getProperty("naverPay.cancelPaymentUrl");
 
 		// API 파라메터 설정
 		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
-		params.add("paymentId", order.getPgTid());
-		params.add("cancelReason", order.getChgReasonNm());
-
-		// 전체 취소의 경우 네이버페이에 취소가능금액으로 취소금액 설정
-		if ("Y".equals(order.getAllCanYn())) {
-			NaverPay orderInfo = getNaverPaymentOrder(order);
-			
-			int cancelAmount = 0;
-			for (int i = 0; i < orderInfo.getBody().getList().size(); i++) {
-				int amt = 0;
-
-				if ("01".equals(orderInfo.getBody().getList().get(i).getAdmissionTypeCode())) {
-					amt = orderInfo.getBody().getList().get(i).getTotalPayAmount();
-				} else if ("04".equals(orderInfo.getBody().getList().get(i).getAdmissionTypeCode())) {
-					amt = orderInfo.getBody().getList().get(i).getTotalPayAmount() * -1;
-				}
-
-				cancelAmount += amt;
-			}
-			params.add("cancelAmount", String.valueOf(cancelAmount));
-		} else {
-			params.add("cancelAmount", String.valueOf(order.getCnclRtnAmt()));
-		}
-		
+		params.add("paymentId", payment.getPgTid());
+		params.add("cancelReason", payment.getChgReasonNm());
+		params.add("cancelAmount", String.valueOf(payment.getPayAmt()));
+		params.add("taxScopeAmount", String.valueOf(payment.getPayAmt()));
+		params.add("taxExScopeAmount", "0");
+
 		// 취소 요청자 설정
 		String cancelRequester = "2";
-		if (StringUtils.isNotBlank(order.getCancelRequester())) {
-			cancelRequester = order.getCancelRequester();
+		if (StringUtils.isNotBlank(payment.getCancelRequester())) {
+			cancelRequester = payment.getCancelRequester();
 		}
 		params.add("cancelRequester", cancelRequester);
 
-		// 카카오페이 API 전송
+		// 네이버페이 API 전송
 		NaverPay naverPay = naverPayApi.naverPaymentApi(params, cancelPaymentUrl);
 
-		// 카카오페이 API 전송 결과 처리
-		Payment payment = new Payment();
+		// 네이버페이 API 전송 결과 처리
 		int statusCode = naverPay.getStatusCode();
 
 		// 승인 성공일때 200
 		if (statusCode == 200) {
 			payment.setPgTradeNo(naverPay.getBody().getPayHistId());
 			payment.setPgTid(naverPay.getBody().getPaymentId());
-			payment.setOrdNo(order.getOrdNo());
-			payment.setCustNo(order.getCustNo());
+			payment.setOrdNo(payment.getOrdNo());
+			payment.setCustNo(payment.getCustNo());
 			payment.setNaverMethodType(naverPay.getBody().getPrimaryPayMeans());
 			payment.setPayAmt(naverPay.getBody().getPrimaryPayCancelAmount() + naverPay.getBody().getNpointCancelAmount());
 		}
@@ -233,4 +223,19 @@ public class TscNaverPayService {
 
 		return payment;
 	}
+
+	/**
+	 * 네이버페이 결제 데이터 생성
+	 *
+	 * @param Order
+	 * @return Payment
+	 * @author card007
+	 * @since 2021. 03. 09
+	 */
+	public Payment setNaverOrderData(NaverPay naverPay) {
+		Payment payment = new Payment();
+		payment.setReserveId(naverPay.getBody().getReserveId());
+
+		return payment;
+	}
 }

+ 93 - 11
src/main/java/com/style24/core/biz/service/TscOrderService.java

@@ -854,11 +854,11 @@ public class TscOrderService {
 	 */
 	public Collection<Order> getDelvCpnApplyList(Collection<Order> delvFeeCdList, Collection<Order> delvCpnAllList) {
 		
-		// 배송비가 있으면 배업체코드, 배송비 배송비쿠폰에 설정
+		// 배송비가 있으면 배업체코드, 배송비 배송비쿠폰에 설정
 		for (Order delvCpn : delvCpnAllList) {
 			for (Order delvFeeCd : delvFeeCdList) {
 				if (delvFeeCd.getDelvFee() > 0) {
-					delvCpn.setCpnDcAmt(delvFeeCd.getDelvFee());
+					delvCpn.setDelvFee(delvFeeCd.getDelvFee());
 					delvCpn.setDelvFeeCd(delvFeeCd.getDelvFeeCd());
 				}
 			}
@@ -989,10 +989,8 @@ public class TscOrderService {
 		Collection<Order> resCartList 						= (Collection<Order>)new ArrayList();					// 자사 예약배송
 		Collection<Order> delvCartList 						= (Collection<Order>)new ArrayList();					// 입점 일반배송
 		Collection<Collection<Order>> delvAllCartList 		= (Collection<Collection<Order>>)new ArrayList();		// 배송전체목록
-		Collection<Collection<Order>> delvCartGoodsList 	= (Collection<Collection<Order>>)new ArrayList();		// 장바구니상품목록
 		
-		
-		List<Order> delvFeeCdList 		= (ArrayList<Order>)new ArrayList();
+		List<Order> delvFeeCdList 		= (ArrayList<Order>)new ArrayList();										// 배송업체단위목록
 		int ordAmt 						= 0; // 주문금액
 		int sumOrdAmt 					= 0; // 배송단위 주문합계금액
 		int sumDelvFee					= 0; // 전체배송금액
@@ -1141,11 +1139,6 @@ public class TscOrderService {
 		delvAllCartList.add(delvCartList);							// index 4
 		delvAllCartList.add(resCartList);							// index 5
 		
-		delvCartGoodsList.add(shotCartList);
-		delvCartGoodsList.add(wmsCartList);
-		delvCartGoodsList.add(delvCartList);
-		delvCartGoodsList.add(resCartList);
-		
 		resultMap.set("delvFeeCdCnt"		, delvFeeCdCnt);		// 배송타입건수
 		resultMap.set("shotCnt"				, shotCnt);				// 자사몰 총알배송건수
 		resultMap.set("wmsCnt"				, wmsCnt);				// 자사몰 일반배송건수(총알배송불가)
@@ -1155,7 +1148,6 @@ public class TscOrderService {
 		
 		resultMap.set("goodsTotCnt"			, goodsTotCnt);			// 전체상품건수
 		resultMap.set("delvAllCartList"		, delvAllCartList);		// 전체배송단위목록 sort
-		resultMap.set("delvCartGoodsList"	, delvCartGoodsList);	// 장바구니상품목록 sort
 		
 		resultMap.set("sumDelvFee"			, sumDelvFee);			// 배송비합계
 		resultMap.set("delvFeeCdList"		, delvFeeCdList);		// 배송업체목록
@@ -1248,5 +1240,95 @@ public class TscOrderService {
 	 */
 	public Collection<Order> getSerialCpnApplyGoodsList(Order order) {
 		return orderDao.getGoodsCartCpnApplyGoodsList(order);
+	}
+	
+	/**
+	 * 주문정보등록(사전등록)
+	 * @param Order
+	 * @return Order
+	 * @author jsh77b
+	 * @since 2021. 03. 09
+	 */
+	@Transactional("shopTxnManager")
+	public void createPreOrder(Order order) {
+		
+		// 1. 주문기본정보등록
+		orderDao.createOrder(order);
+		
+		// 2. 주문배송정보등록
+		orderDao.createDeliveryAddr(order);
+		
+		// 3. 주문배송비정보등록
+		Collection<Order> delvFeeCdList = order.getDelvFeeCdList();
+		for (Order delvFeeCd : delvFeeCdList) {
+			
+			delvFeeCd.setOrdNo(order.getOrdNo());
+			delvFeeCd.setCustNo(order.getCustNo());
+			delvFeeCd.setDelvFeeGb(TscConstants.DeliveryFeeGb.ORIGIN_DELIVERY_FEE.value());
+			
+			// TODO 보유쿠폰존재여부체크
+			// 배송비쿠폰할인금액이 존재한다면 실결제배송비용에 쿠폰할인금액을 적용
+			if (delvFeeCd.getDelvCpnDcAmt() > 0) {
+				// 배송비 > 쿠폰할인금액
+				if (delvFeeCd.getDelvFee() > delvFeeCd.getDelvCpnDcAmt()) {
+					int realDelvAmt = delvFeeCd.getDelvFee() - delvFeeCd.getDelvCpnDcAmt();
+					delvFeeCd.setRealDelvAmt(realDelvAmt);
+				} else {
+					delvFeeCd.setRealDelvAmt(0);
+				}
+			} else {
+				delvFeeCd.setRealDelvAmt(delvFeeCd.getDelvFee());
+			}
+			
+			orderDao.createDeliveryFee(delvFeeCd); // 주문배송비정보등록
+		}
+		
+		// 4. 주문상세정보등록
+		Collection<Order> orderDetailList = order.getOrderDetailList();
+		for (Order orderDetail : orderDetailList) {
+			orderDetail.setOrdNo(order.getOrdNo());
+			orderDetail.setOrdExchGb("O");
+			orderDetail.setCustNo(order.getCustNo());
+			orderDetail.setOrdDtlStat(TscConstants.OrderDetailStat.ORDER_RECEIPT.value());
+			orderDetail.setDelvAddrSq(order.getDelvAddrSq());
+			orderDetail.setGiftPackYn("N");
+			
+			// TODO 총알배송, 구매대행상품여붗 체크
+			orderDao.createOrderDetail(orderDetail); // 주문상세정보등록
+
+			orderDao.createOrderDetailItem(orderDetail); // 주문상세단품정보등록
+		}
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
 	}
 }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 5 - 5
src/main/java/com/style24/core/support/env/TscConstants.java

@@ -293,9 +293,9 @@ public class TscConstants {
 
 	// 결제상태
 	public enum PaymentStat {
-		PAYMENT_WAIT("G016_00"),				// 결제대기
-		PAYMENT_SUCCESS("G016_20"),			// 결제성공
-		PAYMENT_COMPLETE("G016_30"),			// 결제완료
+		PAYMENT_WAIT("G016_00"),			// 결제대기
+		// PAYMENT_SUCCESS("G016_20"),			// 결제성공
+		PAYMENT_COMPLETE("G016_30"),		// 결제완료
 		DB_FAIL("G016_97"),					// 결제성공후DB실패
 		PAYMENT_CANCEL("G016_99");			// 결제취소
 
@@ -684,8 +684,8 @@ public class TscConstants {
 	// 장바구니 구분
 	public enum CartGb {
 		CART("G026_BC"),			// 장바구니
-		PC_ORDER("G026_DM"),		// 바로구매(모바일)
-		MOB_ORDER("G026_DP"),		// 바로구매(PC)
+		PC_ORDER("G026_DP"),		// 바로구매(모바일)
+		MOB_ORDER("G026_DM"),	// 바로구매(PC)
 		CREATE_ORDER("G026_PP");	// 주문생성
 
 		private String value;

+ 2 - 0
src/main/java/com/style24/persistence/domain/Customer.java

@@ -86,6 +86,8 @@ public class Customer extends TscBaseDomain {
 	private String encData;
 	private String authMethod;		// 인증방법(고객정보, 휴대폰인증, 아이핀 인증)
 
+	// 비밀번호 변경일자
+	private int pwdChangeDay;		// 비밀번호 캠페인 화면 - ?일간 보지않기
 
 	// 암호화 대상 복호화 처리
 	public String getCustNm() {

+ 12 - 13
src/main/java/com/style24/persistence/domain/Order.java

@@ -94,6 +94,7 @@ public class Order extends TscBaseDomain {
 	private String shotDelvYn;						// 총알배송여부
 	private String shotDelvUseYn;					// 총알배송사용여부(장바구니)
 	private String giftPackYn;						// 선물포장여부
+	private String foreignYn;						// 해외구매대행여부
 	
 	private String delvLocCd;						// 출고처코드
 	private String delvAssigngDt;					// 출고처지정일자
@@ -161,6 +162,7 @@ public class Order extends TscBaseDomain {
 	
 	private String foreignBuyYn;					// 해외구매대행가능여부
 	private String orderMadeYn;						// 주문제작상품여부
+	private String entryNo;							// 통관번호
 	
 	/* Multi CheckBox 항목 */
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
@@ -526,19 +528,8 @@ public class Order extends TscBaseDomain {
 	private int exchangeCount;
 	private int returnCount;
 
-	// 카카오페이
-	private String approvalUrl;
-	private String failUrl;
-	private String cancelUrl;
-	private String pgToken;
-
-	// 네이버페이
-	private String returnUrl;
-	private String paymentId;
-	private String startTime;
-	private String endTime;
-	private String approvalType;
-	private String cancelRequester;
+	// 카카오페이 & 네이버페이
+	private int ordGoodsQty;
 
 	// 암호화 대상 복호화 처리
 	public String getCustNm() {
@@ -568,4 +559,12 @@ public class Order extends TscBaseDomain {
 	
 	private String dispYn;
 	
+	// 주묹정보등록
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private int[] freegiftValArr;			// 다다익선 일련번호
+	private String prePntDcAmtYn; 			// 선포인트사용여부
+	Collection<Order> orderDetailList;		// 주문상세목록
+	Collection<Order> delvFeeCdList;		// 배송정보목록
+	
+	
 }

+ 76 - 57
src/main/java/com/style24/persistence/domain/Payment.java

@@ -19,70 +19,89 @@ import lombok.Data;
 @Data
 public class Payment extends TscBaseDomain {
 	// TB_PAYMENT
-	private int paySq;				// 결제 일련번호
-	private int ordNo;				// 주문번호
-	private int payAmt;				// 결제금액
-	private int pgCpnAmt;			// PG 쿠폰할인금
-	private int npayPntAmt;			// 네이버페이 포인트 할인금
-	private int ordChgSq;			// 주문변경일련번호
-	private int custNo;				// 고객번호
-	private String payGb;			// 결제구분(O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
-	private String payDt;			// 결제일자
-	private String payMeans;		// 결제수단
-	private String pgGb;			// PG구분
-	private String payStat;			// 결제 상태
-	private String pgTid;			// PG TID
-	private String pgTradeNo;		// PG거래번호(승인번호)
-	private String pgShopId;		// PG가맹점ID
-	private String cardType;		// PG 카드 유형 (Y:체크카드, N:신용카드, G:기프트카드) 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
-	private String cardKind;		// 카드종류. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
-	private String cardBank;		// 카드발급은행. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
-	private String cardNm;			// 카드명. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
-	private String cardMips;		// 카드할부개월수. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
-	private String cardPcableYn;	// 부분취소가능여부
-	private String vaNo;			// 가상계좌번호. 결제수단이 "20:무통장입금일" 때 사용
-	private String vaNm;			// 가상계좌예금주명. 결제수단이 "20:무통장입금일" 때 사용
-	private String vaBank;			// 가상계좌은행(공통코드G940). 결제수단이 "20:무통장입금일" 때 사용
-	private String vaDeadline;		// 무통장입금마감일시. 결제수단이 "20:무통장입금일" 때 사용
-	private String telecom;			// 통신사.결제수단이 휴대폰결제인경우만 사용
-	private String escrowYn;		// 에스크로 여부
-	private String cashAuthNo;		// 현금영수증 승인번호
-	private String cashTradeNo;		// 현금영수증 거래번호
+	private int paySq;						// 결제 일련번호
+	private int ordNo;						// 주문번호
+	private int payAmt;						// 결제금액
+	private int pgCpnAmt;					// PG 쿠폰할인금
+	private int npayPntAmt;					// 네이버페이 포인트 할인금
+	private int ordChgSq;					// 주문변경일련번호
+	private int custNo;						// 고객번호
+	private String payGb;					// 결제구분(O:주문시결제, D:배송시결제, E:에러(강제 결제 태울 때 또는 에러일 때)
+	private String payDt;					// 결제일자
+	private String payMeans;				// 결제수단
+	private String pgGb;					// PG구분
+	private String payStat;					// 결제 상태
+	private String pgTid;					// PG TID
+	private String pgTradeNo;				// PG거래번호(승인번호)
+	private String pgShopId;				// PG가맹점ID
+	private String cardType;				// PG 카드 유형 (Y:체크카드, N:신용카드, G:기프트카드) 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardKind;				// 카드종류. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardBank;				// 카드발급은행. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardNm;					// 카드명. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardMips;				// 카드할부개월수. 결제수단이 "30:신용카드"일 때 사용. PG사에서 받은 값
+	private String cardPcableYn;			// 부분취소가능여부
+	private String vaNo;					// 가상계좌번호. 결제수단이 "20:무통장입금일" 때 사용
+	private String vaNm;					// 가상계좌예금주명. 결제수단이 "20:무통장입금일" 때 사용
+	private String vaBank;					// 가상계좌은행(공통코드G940). 결제수단이 "20:무통장입금일" 때 사용
+	private String vaDeadline;				// 무통장입금마감일시. 결제수단이 "20:무통장입금일" 때 사용
+	private String telecom;					// 통신사.결제수단이 휴대폰결제인경우만 사용
+	private String escrowYn;				// 에스크로 여부
+	private String cashAuthNo;				// 현금영수증 승인번호
+	private String cashTradeNo;				// 현금영수증 거래번호
 
 	// KCP
-	private int ordrIdxx;			// 가맹점 주문번호
-	private int goodMny;			// 결제금액
-	private int shopUserId;			// 가맹점 고객 ID (CUST_NO)
-	private int quotaopt;			// 신용카드 최대 할부개월수
-	private Integer vcntExpireTerm;	// 무통장입금 유효기간 설정
-	private String dispTaxYn;		// 현금영수증 노출 여부
-	private String paycoDirect;		// 페이코 직접 호출 변수
-	private String payMthod;		// 페이코 직접 호출 변수
-	private String siteCd;			// 가맹점 상점코드
-	private String siteName;		// 가맹점 명
+	private int ordrIdxx;					// 가맹점 주문번호
+	private int goodMny;					// 결제금액
+	private int shopUserId;					// 가맹점 고객 ID (CUST_NO)
+	private int quotaopt;					// 신용카드 최대 할부개월수
+	private int leftAmt;					// 남은 금액
+	private int partCancelAmt;				// 부분취소금액
+	private Integer vcntExpireTerm;			// 무통장입금 유효기간 설정
+	private String dispTaxYn;				// 현금영수증 노출 여부
+	private String paycoDirect;				// 페이코 직접 호출 변수
+	private String payMthod;				// 페이코 직접 호출 변수
+	private String siteCd;					// 가맹점 상점코드
+	private String siteName;				// 가맹점 명
+	private String modType;					// 취소/부분취소 구분
+	private String modDesc;					// 취소 사유
 	private String moduleType;
 	private String goodExpr;
-	private String buyrName;		// 구매자명
-	private String buyrMail;		// 구매자메일
-	private String buyrTel1;		// 구매자 전화번호
-	private String buyrTel2;		// 구매자 휴대폰번호
-	private String currency;		// 원화/달러 구분
-	private String payMethod;		// 신용카드, 무통장입금, 가상계좌, 휴대폰결제 구분
-	private String goodName;		// 상품명
-	private String reqTx;			// 요청종류 (승인 : pay, 취소, 매입 : mod)
-	private String usePayMethod;	// 신용카드, 무통장입금, 가상계좌, 휴대폰결제 요청 결과
+	private String buyrName;				// 구매자명
+	private String buyrMail;				// 구매자메일
+	private String buyrTel1;				// 구매자 전화번호
+	private String buyrTel2;				// 구매자 휴대폰번호
+	private String currency;				// 원화/달러 구분
+	private String payMethod;				// 신용카드, 무통장입금, 가상계좌, 휴대폰결제 구분
+	private String goodName;				// 상품명
+	private String reqTx;					// 요청종류 (승인 : pay, 취소, 매입 : mod)
+	private String usePayMethod;			// 신용카드, 무통장입금, 가상계좌, 휴대폰결제 요청 결과
 	private String tranCd;
-	private String resCd;			// 결과코드
-	private String resMsg;			// 결과메세지
+	private String resCd;					// 결과코드
+	private String resMsg;					// 결과메세지
 	
 	// KakaoPay
-	private String kakaoMethodType;	// 결제 수단, CARD 또는 MONEY 중 하나
-	private int kakaoPoint;			// 사용한 포인트 금액
-	private int kakaoDiscount;		// 할인 금액
-	private String createDt;		// 결제 준비 요청 시각
-	private String approveDt;		// 결제 승인 시각
-	private String status;			// 카카오페이 결제 상태
+	private String partnerOrderId;			// 카카오페이 가맹점 주문번호, 최대 100자
+	private String partnerUserId;			// 카카오페이 가맹점 회원 id, 최대 100자
+	private String pgToken;					// 카카오페이 결제승인 요청을 인증하는 토큰
+	private String nextRedirectAppUrl;		// 카카오톡 결제 페이지 Redirect URL (모바일 앱)
+	private String nextRedirectMobileUrl;	// 카카오톡 결제 페이지 Redirect URL (모바일 웹)
+	private String nextRedirectPcUrl;		// 카카오톡 결제 페이지 Redirect URL (PC 웹)
+	private String androidAppScheme;		// 카카오페이 결제 화면으로 이동하는 Android 앱 스킴
+	private String iosAppScheme;			// 카카오페이 결제 화면으로 이동하는 iOS 앱 스킴
+	private String kakaoMethodType;			// 카카오페이 결제 수단, CARD 또는 MONEY 중 하나
+	private int kakaoPoint;					// 카카오페이 사용한 포인트 금액
+	private int kakaoDiscount;				// 카카오페이 할인 금액
+	private String createDt;				// 카카오페이 결제 준비 요청 시각
+	private String approveDt;				// 카카오페이 결제 승인 시각
+	private String status;					// 카카오페이 결제 상태
 	
 	// NaverPay
-	private String naverMethodType;	// 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
+	private String reserveId;				// 네이버페이 결제 예약 ID
+	private String startTime;				// 네이버페이 주문조회 시작일시
+	private String endTime;					// 네이버페이 주문조회 종료일시
+	private String approvalType;			// 네이버페이 주문조회 타입
+	private String cancelRequester;			// 네이버페이 취소 요청자(1: 구매자, 2: 가맹점 관리자)
+	private String chgReasonNm;				// 취소 사유
+	private String naverMethodType;			// 네이버페이 주 결제 수단 (CARD:신용카드, BANK:계좌이체)
+
 }

+ 31 - 3
src/main/java/com/style24/persistence/mybatis/shop/TscCustomer.xml

@@ -304,11 +304,12 @@
 		WHERE  CUST_NO = #{custNo}
 	</insert>
 
-	<!-- 회원 탈퇴 개인정보 공백 처리 -->
+	<!-- 회원 탈퇴 개인정보 처리 -->
 	<update id="updateCustomerSecedeInfo" parameterType="Customer">
 		/* TscCustomer.updateCustomerSecedeInfo */
 		UPDATE TB_CUSTOMER
 		SET    CUST_ID = CONCAT('secede_cust_',#{custNo})
+		     , CUST_NM = #{encodedCustNm}
 		     , CUST_STAT = #{custStat}
 		     , SECEDE_RSN = #{secedeRsn}
 		     , SECEDE_DTL_RSN = #{secedeDtlRsn}
@@ -317,10 +318,15 @@
 		     , SEX_GB = NULL
 		     , CELL_PHNNO = NULL
 		     , EMAIL = NULL
+		     , EMAIL_AGREE_YN = 'N'
+		     , EMAIL_AGREE_DT = NULL
+		     , APP_AGREE_YN = 'N'
+		     , APP_AGREE_DT = NULL
 		     , HOME_ZIPCODE = NULL
 		     , HOME_BASE_ADDR = NULL
 		     , HOME_DTL_ADDR = NULL
 		     , CI = NULL
+		     , CUST_STAT = #{custStat} -- G104_30
 		WHERE  CUST_NO = #{custNo}
 	</update>
 
@@ -360,7 +366,7 @@
 	</select>
 
 	<!--휴면 해제처리-->
-	<insert id="updateDormantCustomerRelease" parameterType="Customer">
+	<update id="updateDormantCustomerRelease" parameterType="Customer">
 		/* TscCustomer.updateDormantCustomerRelease */
 		UPDATE TB_CUSTOMER C
 		INNER JOIN
@@ -384,7 +390,7 @@
 		     , C.CUST_STAT = 'G104_10'
 		     , C.UPD_DT = NOW()
 		     , C.UPD_NO = #{updNo}
-	</insert>
+	</update>
 
 	<!--휴면 테이블 삭제-->
 	<delete id="deleteDormantCustomer" parameterType="Integer">
@@ -394,6 +400,28 @@
 		WHERE CUST_NO = #{custNo}
 	</delete>
 
+	<!--주문정보 휴면 해제-->
+	<update id="updateDormantOrderRelease" parameterType="Customer">
+		/* TscCustomer.updateDormantOrderRelease */
+		UPDATE  TB_ORDER O
+		INNER JOIN
+		        TB_ORDER_DORMANT OD
+		ON      O.CUST_NO = OD.CUST_NO
+		AND     O.CUST_NO = #{custNo}
+		SET     O.ORD_NM = OD.ORD_NM
+		      , O.ORD_PHNNO = OD.ORD_PHNNO
+		      , O.ORD_TELNO = OD.ORD_TELNO
+		      , O.ORD_EMAIL = OD.ORD_EMAIL
+	</update>
+
+	<!--휴면 테이블 삭제-->
+	<delete id="deleteDormantOrder" parameterType="Integer">
+		/* TscCustomer.deleteDormantOrder */
+		DELETE
+		FROM  TB_ORDER_DORMANT
+		WHERE CUST_NO = #{custNo}
+	</delete>
+
 	<!--Exception 테스트-->
 	<insert id="createException">
 		/* TscCustomer.createException */

+ 414 - 10
src/main/java/com/style24/persistence/mybatis/shop/TscOrder.xml

@@ -1832,8 +1832,8 @@
 		  FROM TB_CUST_POINT CP
 		 WHERE 1=1
 		   AND CP.CUST_NO = #{custNo}
-		   AND CP.EXP_BE_DT <![CDATA[<]]> NOW()
-		   AND CP.EXP_CMP_DT <![CDATA[>=]]> NOW()
+		   AND CP.EXP_BE_DT <![CDATA[>]]> NOW()
+		   AND CP.EXP_CMP_DT IS NULL
 	</select>
 	
 	<!-- 상품권정보 조회 -->
@@ -2098,9 +2098,9 @@
 		     , CP.CPN_NM
 		     , CP.CPN_TYPE
 		     , CP.DC_WAY
-		     , CP.DC_PVAL
-		     , CP.DC_MVAL
-		     , CP.DC_AVAL
+		     , CASE WHEN #{frontGb} = 'P' THEN CP.DC_PVAL
+			        WHEN #{frontGb} = 'M' THEN CP.DC_MVAL
+			        ELSE CP.DC_AVAL END AS DC_VAL
 		     , CP.MAX_DC_AMT
 		     , CP.BUY_LIMIT_AMT
 		     , CCP.CUST_CPN_SQ
@@ -2158,8 +2158,69 @@
 		</foreach>
 	</insert>
 
-	<insert id="insertPaymentForRollback" parameterType="Payment">
-		/* TscOrder.insertPaymentForRollback : 롤백 취소 데이터 등록 */
+	<!-- 결제 취소 정보 생성 -->
+	<insert id="insertPaymentCancel" parameterType="Payment">
+		/* TscOrder.insertPaymentCancel : 결제 취소 정보 생성 */
+		INSERT INTO TB_PAYMENT (
+			  ORD_NO
+			, PAY_DT
+			, PAY_MEANS
+			, PAY_AMT
+			, PG_CPN_AMT
+			, NPAY_PNT_AMT
+			, PAY_GB
+			, PAY_STAT
+			, PG_GB
+			, PG_TID
+			, PG_SHOP_ID
+			, CARD_TYPE
+			, CARD_KIND
+			, CARD_BANK
+			, CARD_NM
+			, CARD_MIPS
+			, CARD_PCABLE_YN
+			, VA_NO
+			, VA_NM
+			, VA_BANK
+			, VA_DEADLINE
+			, TELECOM
+			, REG_NO
+			, REG_DT
+			, UPD_NO
+			, UPD_DT )
+		SELECT #{ordNo}
+			 , NOW()
+			 , PAY_MEANS
+			 , #{payAmt}
+			 , #{pgCpnAmt}
+			 , #{npayPntAmt}
+			 , #{payGb}
+			 , #{payStat}
+			 , PG_GB
+			 , #{pgTid}
+			 , PG_SHOP_ID
+			 , CARD_TYPE
+			 , CARD_KIND
+			 , CARD_BANK
+			 , CARD_NM
+			 , CARD_MIPS
+			 , CARD_PCABLE_YN
+			 , VA_NO
+			 , VA_NM
+			 , VA_BANK
+			 , VA_DEADLINE
+			 , TELECOM
+			 , #{regNo}
+			 , NOW()
+			 , #{updNo}
+			 , NOW()
+		FROM   TB_PAYMENT PAY
+		WHERE  PG_TID = #{pgTid}
+	</insert>
+
+	<!-- 결제 데이터 생성 중 에러로 인한 결제 취소 데이터 생성 -->
+	<insert id="insertPaymentRollback" parameterType="Payment">
+		/* TscOrder.insertPaymentRollback : 결제 데이터 생성 중 에러로 인한 결제 취소 데이터 생성 */
 		INSERT INTO TB_PAYMENT (
 			  ORD_NO
 			, PAY_DT
@@ -2195,7 +2256,7 @@
 			, -#{payAmt}
 			, -#{pgCpnAmt}
 			, -#{npayPntAmt}
-			, 'E'
+			, #{payGb}
 			, #{payStat}
 			, #{pgGb}
 			, #{pgTid}
@@ -2206,7 +2267,7 @@
 			, #{cardBank}
 			, #{cardNm}
 			, #{cardMips}
-			, #{cardPcableYn}
+			, IFNULL(#{cardPcableYn}, 'Y')
 			, #{vaNo}
 			, #{vaNm}
 			, #{vaBank}
@@ -2214,10 +2275,353 @@
 			, #{telecom}
 			, #{regNo}
 			, NOW()
-			, #{regNo}
+			, #{updNo}
 			, NOW()
 		)
 	</insert>
+	
+	<!-- 주문정보등록 -->
+	<!-- 1. 주문기본정보등록 -->
+	<insert id="createOrder" parameterType="Order" keyProperty="ordNo">
+		/* TscOrder.createOrder : 주문기본정보등록 */
+		INSERT INTO TB_ORDER ( 
+		    MALL_GB
+		    , ORD_DT
+		    , PAY_DT
+		    , CUST_NO
+		    , ORD_NM
+		    , ORD_PHNNO
+		    , ORD_TELNO
+		    , ORD_EMAIL
+		    , SITE_CD
+		    , NPAY_ORD_NO
+		    , FRONT_GB
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) 
+		SELECT 'G011_10'
+		     , NOW()
+		     , NOW()
+		     , CUST_NO
+		     , #{custNm}
+		     , #{recipPhnno}
+		     , #{recipTelno}
+		     , #{email}
+		     , 'G000_10'
+		     , #{npayOrdNo}
+		     , #{frontGb}
+		     , CUST_NO
+		     , NOW()
+		     , CUST_NO
+		     , NOW()
+		FROM   TB_CUSTOMER
+		WHERE  CUST_NO = #{custNo}
+	</insert>
+	
+	<!-- 2. 주문배송주소정보등록-->
+	<insert id="createDeliveryAddr" parameterType="Order" keyProperty="delvAddrSq">
+		/* TscOrder.createDeliveryAddr : 주문배송주소정보등록 */
+		INSERT INTO TB_DELIVERY_ADDR ( 
+		    RECIP_NM
+		    , RECIP_PHNNO
+		    , RECIP_TELNO
+		    , RECIP_ZIPCODE
+		    , RECIP_BASE_ADDR
+		    , RECIP_DTL_ADDR
+		    , DELV_MEMO
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		    #{custNm}
+		    , #{recipPhnno}
+		    , #{recipTelno}
+		    , #{recipZipcode}
+		    , #{recipBaseAddr}
+		    , #{recipDtlAddr}
+		    , #{delvMemo}
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		)
+	</insert>
+	
+	<!-- 3. 주문배송비정보등록-->
+	<insert id="createDeliveryFee" parameterType="Order">
+		/* TscOrder.createDeliveryFee : 주문배송비정보등록 */
+		INSERT INTO TB_DELIVERY_FEE ( 
+		    PAY_SQ
+		    , ORD_NO
+		    , DELV_FEE_GB
+		    , DELV_FEE_CD
+		    , DELV_FEE
+		    , DELV_CPN_SQ
+		    , DELV_CPN_DC_AMT
+		    , REAL_DELV_AMT
+		    , ORD_CHG_SQ
+		    , SUPPLY_COMP_CD
+		    , DELV_USAC_YN
+		    , DELV_USAC_DT
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) VALUES (
+		    NULL
+		    , #{ordNo}
+		    , #{delvFeeGb}
+		    , #{delvFeeCd}
+		    , #{delvFee}
+		    , #{delvCpnSq}
+		    , #{delvCpnDcAmt}
+		    , #{realDelvAmt}
+		    , NULL
+		    , #{supplyCompCd}
+		    , 'N'
+		    , NULL
+		    , #{custNo}
+		    , NOW()
+		    , #{custNo}
+		    , NOW()
+		)
+	</insert>
+	
+	<!-- 4. 주문상세정보등록-->
+	<insert id="createOrderDetail" parameterType="Order" keyProperty="ordDtlNo">
+		/* TscOrder.createOrderDetail : 주문상세정보등록 */
+		INSERT INTO TB_ORDER_DETAIL ( 
+		    ORD_NO
+		    , ORD_EXCH_GB
+		    , ORD_DTL_STAT
+		    , ORG_ORD_DTL_NO
+		    , SUPPLY_COMP_CD
+		    , GOODS_CD
+		    , DEAL_GOODS_CD
+		    , FORMAL_GB
+		    , GOODS_TYPE
+		    , LIST_PRICE
+		    , CURR_PRICE
+		    , DC_RATE
+		    , OPT_ADD_PRICE
+		    , ORD_QTY
+		    , ORD_AMT
+		    , CNCL_RTN_QTY
+		    , CNCL_RTN_AMT
+		    , CPN1_CPN_SQ
+		    , CPN1_DC_AMT
+		    , TMTB1_SQ
+		    , TMTB1_DC_AMT
+		    , TMTB2_SQ
+		    , TMTB2_DC_AMT
+		    , GOODS_CPN_SQ
+		    , GOODS_CPN_DC_AMT
+		    , CART_CPN_SQ
+		    , CART_CPN_DC_AMT
+		    , BURDEN_RATE
+		    , PNT_DC_AMT
+		    , PRE_PNT_DC_AMT
+		    , SAVE_PNT_AMT
+		    , REAL_ORD_AMT
+		    , GFCD_USE_AMT
+		    , VENDOR_ID
+		    , EXTMALL_ID
+		    , AGENT_ORDER_ID
+		    , EXTMALL_ORDER_ID
+		    , CHANGABLE_YN
+		    , CHANGE_FEE_FREE_YN
+		    , RETURNABLE_YN
+		    , RETURN_FEE_FREE_YN
+		    , SOLDOUT_YN
+		    , SOLDOUT_MEMO
+		    , SOLDOUT_REG_NO
+		    , SOLDOUT_REG_DT
+		    , DELV_ADDR_SQ
+		    , DELV_FEE_CD
+		    , SHOT_DELV_YN
+		    , GIFT_PACK_YN
+		    , GIFT_ADDR_INP_YN
+		    , MAKE_GOODS_YN
+		    , ENTRY_NO
+		    , DELV_LOC_CD
+		    , DELV_ASSIGN_DT
+		    , DELV_ASSIGN_STAT
+		    , DSTRBT_NOTE
+		    , DELV_STDT
+		    , DELV_EDDT
+		    , SHIP_COMP_CD
+		    , INVOICE_NO
+		    , INVOICE_SEND_YN
+		    , SELL_STORE_CD
+		    , SELL_FEE_RATE
+		    , AF_LINK_CD
+		    , ITHR_CD
+		    , CONTENTS_LOC
+		    , PLAN_DTL_SQ
+		    , SOCIAL_SQ
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		)
+		SELECT #{ordNo}                     AS ORD_NO
+		     , #{ordExchGb}                 AS ORD_EXCH_GB
+		     , #{ordDtlStat}                AS ORD_DTL_STAT
+		     , NULL                         AS ORG_ORD_DTL_NO
+		     , G.SUPPLY_COMP_CD             AS SUPPLY_COMP_CD
+		     , CA.GOODS_CD                  AS GOODS_CD
+		     , CA.DEAL_GOODS_CD             AS DEAL_GOODS_CD
+		     , G.FORMAL_GB                  AS FORMAL_GB
+		     , G.GOODS_TYPE                 AS GOODS_TYPE
+		     , G.LIST_PRICE                 AS LIST_PRICE
+		     , G.CURR_PRICE                 AS CURR_PRICE
+		     , G.DC_RATE                    AS DC_RATE
+		     , #{optAddPrice}               AS OPT_ADD_PRICE
+		     , CA.GOODS_QTY                 AS GOODS_QTY
+		     , #{ordAmt}                    AS ORD_AMT
+		     , 0                            AS CNCL_RTN_QTY
+		     , 0                            AS CNCLRTN_AMT
+		     , #{cpn1CpnSq}                 AS CPN1_CPN_SQ
+		     , #{cpn1DcAmt}                 AS CPN1_DC_AMT
+		     , #{tmtb1Sq}                   AS TMTB1_SQ
+		     , #{tmtb1DcAmt}                AS TMTB1_DC_AMT
+		     , #{tmtb2Sq}                   AS TMTB2_SQ
+		     , #{tmtb2DcAmt}                AS TMTB2_DC_AMT
+		     , #{goodsCpnSq}                AS GOODS_CPN_SQ
+		     , #{goodsCpnDcAmt}             AS GOODS_CPN_DC_AMT
+		     , #{cartCpnSq}                 AS CART_CPN_SQ
+		     , #{cartCpnDcAmt}              AS CART_CPN_DC_AMT
+		     , 0                            AS BURDEN_RATE
+		     , #{pntDcAmt}                  AS PNT_DC_AMT
+		     , #{prePntDcAmt}               AS PRE_PNT_DC_AMT
+		     , #{savePntAmt}                AS SAVE_PNT_AMT
+		     , #{realOrdAmt}                AS REAL_ORD_AMT
+		     , #{gfcdUseAmt}                AS GFCD_USE_AMT
+		     , NULL                         AS VENDOR_ID
+		     , NULL                         AS EXTMALL_ID
+		     , NULL                         AS AGENT_ORDER_ID
+		     , NULL                         AS EXTMALL_ORDER_ID
+		     , G.CHANGEABLE_YN              AS CHANGABLE_YN
+		     , G.CHANGE_FEE_FREE_YN         AS CHANGE_FEE_FREE_YN
+		     , G.RETURNABLE_YN              AS RETURNABLE_YN
+		     , G.RETURN_FEE_FREE_YN         AS RETURN_FEE_FREE_YN
+		     , 'N'                          AS SOLDOUT_YN
+		     , NULL                         AS SOLDOUT_MEMO
+		     , NULL                         AS SOLDOUT_REG_NO
+		     , NULL                         AS SOLDOUT_REG_DT
+		     , #{delvAddrSq}                AS DELV_ADDR_SQ
+		     , #{delvFeeCd}                 AS DELV_FEE_CD
+		     , #{shotDelvYn}                AS SHOT_DELV_YN
+		     , #{giftPackYn}                AS GIFT_PACK_YN
+		     , 'N'                          AS GIFT_ADDR_INP_YN
+		     , G.ORDER_MADE_YN              AS MAKE_GOODS_YN
+		     , #{entryNo}                   AS ENTRY_NO
+		     , NULL                         AS DELV_LOC_CD
+		     , NULL                         AS DELV_ASSIGN_DT
+		     , 'P'                          AS DELV_ASSIGN_STAT
+		     , NULL                         AS DSTRBT_NOTE
+		     , NULL                         AS DELV_STDT
+		     , NULL                         AS DELV_EDDT
+		     , NULL                         AS SHIP_COMP_CD
+		     , NULL                         AS INVOICE_NO
+		     , 'N'                          AS INVOICE_SEND_YN
+		     , NULL                         AS SELL_STORE_CD
+		     , G.SELL_FEE_RATE              AS SELL_FEE_RATE
+		     , CA.AF_LINK_CD                AS AF_LINK_CD
+		     , CA.ITHR_CD                   AS ITHR_CD
+		     , CA.CONTENTS_LOC              AS CONTENTS_LOC
+		     , CA.PLAN_DTL_SQ               AS PLAN_DTL_SQ
+		     , NULL                         AS SOCIAL_SQ
+		     , #{custNo}                    AS REG_NO
+		     , NOW()                        AS REG_DT
+		     , #{custNo}                    AS UPD_NO
+		     , NOW()                        AS UPD_DT
+		FROM  TB_CART CA
+		INNER JOIN TB_GOODS G
+		ON    CA.GOODS_CD = G.GOODS_CD 
+		WHERE 1=1
+		AND   CART_SQ = #{cartSq}
+	</insert>
+	
+	<!-- 5. 주문상세단품정보등록 -->
+	<insert id="createOrderDetailItem" parameterType="Order" keyProperty="ordDtlItemSq">
+		/* TscOrder.createOrderDetailItem : 주문상세단품정보등록 */
+		INSERT INTO TB_ORDER_DETAIL_ITEM ( 
+		    ORD_DTL_NO
+		    , ORD_NO
+		    , ORD_DTL_STAT
+		    , ITEM_CD
+		    , OPT_CD
+		    , OPT_CD1
+		    , OPT_CD2
+		    , SKU_MODEL_NO
+		    , PRODUCT_NO
+		    , PRODUCT_CODE
+		    , ITEM_QTY
+		    , ITEM_PRICE
+		    , OPT_ADD_PRICE
+		    , DISP_ORD
+		    , ORD_AMT
+		    , CNCL_RTN_AMT
+		    , CPN1_DC_AMT
+		    , TMTB1_DC_AMT
+		    , TMTB2_DC_AMT
+		    , GOODS_CPN_DC_AMT
+		    , CART_CPN_DC_AMT
+		    , PNT_DC_AMT
+		    , PRE_PNT_DC_AMT
+		    , SAVE_PNT_AMT
+		    , REAL_ORD_AMT
+		    , GFCD_USE_AMT
+		    , REG_NO
+		    , REG_DT
+		    , UPD_NO
+		    , UPD_DT
+		) 
+		SELECT #{ordDtlNo}                                  AS ORD_DTL_NO
+		     , #{ordNo}                                     AS ORD_NO
+		     , CD.ITEM_CD
+		     , CD.OPT_CD
+		     , CD.OPT_CD1
+		     , CD.OPT_CD2
+		     , CD.SKU_MODEL_NO 
+		     , CD.PRODUCT_NO
+		     , CD.PRODUCT_CODE
+		     , GC.QTY                                       AS ITEM_QTY
+		     , IFNULL(GC.COMPS_CURR_PRICE, G.CURR_PRICE)    AS ITEM_PRICE
+		     , OP.ADD_PRICE 
+		     , CD.DISP_ORD 
+		     , #{ordAmt}                                    AS ORD_AMT
+		     , 0                                            AS CNCL_RTN_AMT
+		     , #{cpn1DcAmt}                                 AS CPN1_DC_AMT
+		     , #{tmtb1DcAmt}                                AS TMTB1_DC_AMT
+		     , #{tmtb1DcAmt}                                AS TMTB1_DC_AMT
+		     , #{goodsCpnDcAmt}                             AS GOODS_CPN_DC_AMT
+		     , #{cartCpnDcAmt}                              AS CART_CPN_DC_AMT
+		     , #{pntDcAmt}                                  AS PNT_DC_AMT
+		     , #{prePntDcAmt}                               AS PRE_PNT_DC_AMT
+		     , #{savePntAmt}                                AS SAVE_PNT_AMT
+		     , #{realOrdAmt}                                AS REAL_ORD_AMT
+		     , #{gfcdUseAmt}                                AS GFCD_USE_AMT
+		     , #{custNo}                                    AS REG_NO
+		     , NOW()                                        AS REG_DT
+		     , #{custNo}                                    AS REG_NO
+		     , NOW()                                        AS REG_DT
+		FROM   TB_CART_DETAIL CD
+		INNER  JOIN TB_OPTION OP
+		ON     CD.ITEM_CD = OP.GOODS_CD
+		INNER  JOIN TB_GOODS G
+		ON     CD.ITEM_CD = G.GOODS_CD
+		LEFT   OUTER JOIN TB_GOODS_COMPOSE GC
+		ON     CD.ITEM_CD = GC.COMPS_GOODS_CD 
+		WHERE 1=1
+		AND    CD.CART_SQ = #{cartSq}
+	</insert>
+	
+	
 </mapper>