Просмотр исходного кода

Merge remote-tracking branch 'origin/develop' into jsh77b

Conflicts:
	src/main/java/com/style24/front/biz/web/TsfOrderController.java
jsh77b 5 лет назад
Родитель
Сommit
0ca9acffe6
42 измененных файлов с 1712 добавлено и 824 удалено
  1. 8 0
      pom.xml
  2. 11 0
      src/main/java/com/style24/front/biz/dao/TsfCouponDao.java
  3. 11 1
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  4. 8 1
      src/main/java/com/style24/front/biz/dao/TsfPointDao.java
  5. 22 0
      src/main/java/com/style24/front/biz/service/TsfCouponService.java
  6. 13 13
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  7. 23 3
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  8. 2 1
      src/main/java/com/style24/front/biz/service/TsfKakaoService.java
  9. 16 0
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  10. 10 1
      src/main/java/com/style24/front/biz/service/TsfPointService.java
  11. 2 4
      src/main/java/com/style24/front/biz/thirdparty/NaverLogin.java
  12. 4 5
      src/main/java/com/style24/front/biz/thirdparty/NiceCertify.java
  13. 49 0
      src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java
  14. 55 12
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  15. 31 1
      src/main/java/com/style24/front/biz/web/TsfIndexController.java
  16. 27 0
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  17. 141 428
      src/main/java/com/style24/front/biz/web/TsfOrderController.java
  18. 2 2
      src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java
  19. 2 0
      src/main/java/com/style24/persistence/domain/CardPromotion.java
  20. 7 7
      src/main/java/com/style24/persistence/domain/Cate4Srch.java
  21. 0 44
      src/main/java/com/style24/persistence/domain/Coupon.java
  22. 7 6
      src/main/java/com/style24/persistence/domain/Goods.java
  23. 2 1
      src/main/java/com/style24/persistence/domain/GoodsStock.java
  24. 37 0
      src/main/java/com/style24/persistence/domain/Search.java
  25. 20 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  26. 1 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  27. 96 26
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  28. 78 37
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  29. 14 6
      src/main/resources/config/application-locd.yml
  30. 16 14
      src/main/resources/config/application.yml
  31. BIN
      src/main/webapp/WEB-INF/lib/ConnectionKCP.jar
  32. BIN
      src/main/webapp/WEB-INF/lib/jPpcliE.jar
  33. 5 0
      src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html
  34. 2 2
      src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html
  35. 1 1
      src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html
  36. 98 0
      src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html
  37. 469 127
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  38. 139 39
      src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html
  39. 36 18
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  40. 65 0
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  41. 51 0
      src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html
  42. 131 23
      src/main/webapp/ux/style24_link.js

+ 8 - 0
pom.xml

@@ -115,6 +115,14 @@
 			<scope>system</scope>
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/IPIN2Client.jar</systemPath>
 		</dependency>
+		<!--KCP-->
+		<dependency>
+			<groupId>com.kcp</groupId>
+			<artifactId>kcp</artifactId>
+			<version>1.0</version>
+			<scope>system</scope>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/jPpcliE.jar</systemPath>
+		</dependency>
 		<!--//NICE 본인인증-->
 		<!-- \\\ WEB-INF lib -->
 	</dependencies>

+ 11 - 0
src/main/java/com/style24/front/biz/dao/TsfCouponDao.java

@@ -40,4 +40,15 @@ public interface TsfCouponDao {
 	 * @since 2021.02.25
 	 */
 	Collection<Coupon> getCustGradeCouponInfo(Coupon coupon);
+
+
+	/**
+	 * 회원가입 쿠폰
+	 * @param coupon - 쿠폰정보
+	 * @return Coupon
+	 * @author jsshin
+	 * @since 2021. 03. 03
+	 */
+	Coupon getJoinCoupon(Coupon coupon);
+
 }

+ 11 - 1
src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java

@@ -53,7 +53,7 @@ public interface TsfGoodsDao {
 	 * @author eskim
 	 * @date 2021. 2. 9
 	 */
-	Collection<GoodsImg> getGoodsImgList(String goodsCd);
+	Collection<GoodsImg> getGoodsImgList(Goods goods);
 
 	/**
 	 * 상품 동영상정보
@@ -193,4 +193,14 @@ public interface TsfGoodsDao {
 	 */
 	Collection<LookbookGoods> getLookbookBannerGoodsList(Lookbook lookbook);
 
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 *
+	 * @param goodsStock
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 3
+	 */
+	int getGoodsStockQty(GoodsStock goodsStock);
+	
 }

+ 8 - 1
src/main/java/com/style24/front/biz/dao/TsfPointDao.java

@@ -25,9 +25,16 @@ public interface TsfPointDao {
 	Point getExpectedPointInfo(Point point);
 	Point getExtinctPointInfo(Point point);
 	
-	
+	/**
+	 * 포인트정보 내역조회
+	 *
+	 * @param Point
+	 * @author csh9191
+	 * @since 2021. 03. 03
+	 */	
 	Collection<Point> getAccumulatePointList(Point point);
 	Collection<Point> getUsePointList(Point point);
+	Collection<Point> getAllPointList(Point point);
 	
 	
 

+ 22 - 0
src/main/java/com/style24/front/biz/service/TsfCouponService.java

@@ -254,4 +254,26 @@ public class TsfCouponService {
 		
 		return count;
 	}
+
+	/**
+	 * 회원가입시 혜택 쿠폰지급
+	 *
+	 * @param coupon - 쿠폰정보
+	 * @author jsshin
+	 * @since 2021.03.03
+	 */
+	@Transactional("shopTxnManager")
+	public void saveJoinCoupon(Coupon coupon) {
+		Coupon joinCoupon = couponDao.getJoinCoupon(coupon);
+		if (joinCoupon != null) {
+			CustCoupon custCoupon = new CustCoupon();
+			custCoupon.setCpnId(joinCoupon.getCpnId());
+			custCoupon.setAvailStdt(joinCoupon.getAvailStdt());
+			custCoupon.setAvailEddt(joinCoupon.getAvailEddt());
+			custCoupon.setPubReason(TscConstants.PubReason.JOIN.value());
+			custCoupon.setEndAlimSendYn(joinCoupon.getEndAlimYn());
+			custCoupon.setUpdNo(coupon.getCustNo());
+			custCoupon.setRegNo(coupon.getCustNo());
+		}
+	}
 }

+ 13 - 13
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -6,7 +6,6 @@ import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
-import com.style24.core.support.util.CryptoUtils;
 import com.style24.core.support.util.MaskingUtils;
 import com.style24.front.support.security.TsfLoginDetails;
 import com.style24.front.support.security.session.TsfSession;
@@ -14,7 +13,6 @@ import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Login;
-import com.style24.persistence.domain.Point;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -52,6 +50,9 @@ public class TsfCustomerService {
 	@Autowired
 	private TsfLoginService loginService;
 
+	@Autowired
+	private TsfCouponService couponService;
+
 	@Autowired
 	private ObjectMapper objectMapper;
 
@@ -108,7 +109,7 @@ public class TsfCustomerService {
 	 */
 	@Transactional("shopTxnManager")
 	public void saveCustomerPassword(Customer customer) {
-		customer.setEncodedPasswd(passwordEncoder.encode(customer.getPasswd()));
+		customer.setEncodedPasswd(passwordEncoder.encodeSha256(customer.getPasswd()));
 		coreCustomerService.saveCustomerPassword(customer);
 	}
 
@@ -277,7 +278,7 @@ public class TsfCustomerService {
 		// 1. validation
 		customer.setHypenCellPhone();
 		customer.encryptData();
-		customer.setEncodedPasswd(passwordEncoder.encode(customer.getPasswd()));
+		customer.setEncodedPasswd(passwordEncoder.encodeSha256(customer.getPasswd()));
 
 		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
 		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
@@ -332,21 +333,20 @@ public class TsfCustomerService {
 	}
 
 	/**
-	 * 가입 후 처리 혜택(쿠폰,포인트)
+	 * 가입 후 처리 혜택(쿠폰)
 	 * @param customer - 일반가입, SNS 가입
 	 * @author jsshin
 	 * @since 2021. 02. 19
 	 */
 	@Transactional("shopTxnManager")
 	public void saveJoinPostProcessing(Customer customer) {
-		// 1. 쿠폰
-		// 어드민 > 회원등급정책 관리 > 신규회원등급으로 설정된 쿠폰
-
-
-		// 2. 포인트
-		// 어드민 > 포인트 정책설정 > 신규회원 등록된 포인트
-
-
+		// 1. 쿠폰지급 : 운영관리 > 회원등급정책관리 > WELCOME 등급
+		Coupon coupon = new Coupon();
+		coupon.setFrontGb(customer.getFrontGb());
+		coupon.setCustGrade(customer.getCustGrade());
+		coupon.setCustNo(customer.getCustNo());
+		coupon.setSiteCd(TscConstants.Site.STYLE24.value());
+		couponService.saveJoinCoupon(coupon);
 	}
 
 

+ 23 - 3
src/main/java/com/style24/front/biz/service/TsfGoodsService.java

@@ -181,9 +181,8 @@ public class TsfGoodsService {
 	 * @author eskim
 	 * @since 2021. 2. 9
 	 */
-	public Collection<GoodsImg> getGoodsImgList(String goodsCd) {
-		log.info("aa\\ {}  ", goodsDao.getGoodsImgList(goodsCd));
-		return goodsDao.getGoodsImgList(goodsCd);
+	public Collection<GoodsImg> getGoodsImgList(Goods goods) {
+		return goodsDao.getGoodsImgList(goods);
 	}
 
 	/**
@@ -383,5 +382,26 @@ public class TsfGoodsService {
 		return lookbookBannerList;
 	}
 
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 *
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2020. 7. 9
+	 */
+	public int getGoodsStockQty(GoodsStock goodsStock) {
+		int result = 0;
+		// 예약상품 여부 확인
+		//int goodsResSellCount = goodsDao.getGoodsResSellCount(stock.getGoodsCd());
+
+		//if ("N".equals(stock.getSelfGoodsYn()) || goodsResSellCount > 0) {
+			result = goodsDao.getGoodsStockQty(goodsStock);
+		//} else {
+		//	result = goodsDao.getGoodsStoreStockQty(stock);
+		//}
 
+		return result;
+
+	}
 }

+ 2 - 1
src/main/java/com/style24/front/biz/service/TsfKakaoService.java

@@ -29,6 +29,7 @@ public class TsfKakaoService {
 	@Autowired
 	private TscCustomerService coreCustomerService;
 
+	public static final String siteNm = "STYLE24";
 
 	/**
 	 * 가입축하 알림톡
@@ -44,7 +45,7 @@ public class TsfKakaoService {
 		dm.setFkkoresendtype("LMS");
 
 		GagaMap replaceInfo = new GagaMap();
-		replaceInfo.setString("siteNm", TscConstants.Style24Infomation.SITE_NAME.value());
+		replaceInfo.setString("siteNm", siteNm);
 		replaceInfo.setString("custNm", customer.getCustNm());
 		kakaoSender.send(SsgKakaoSender.KakaoAnswerSq.JoinCongrat.value(), dm, replaceInfo);
 

+ 16 - 0
src/main/java/com/style24/front/biz/service/TsfOrderService.java

@@ -8,13 +8,18 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.gagaframework.web.parameter.GagaMap;
+import com.style24.core.biz.service.TscKcpService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfOrderDao;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -31,6 +36,9 @@ public class TsfOrderService {
 	@Autowired
 	private TsfOrderDao orderDao;
 
+	@Autowired
+	private TscKcpService coreKcpService;
+
 	/**
 	 * 마이페이지 검색 기간 영역 설정
 	 *
@@ -206,6 +214,14 @@ public class TsfOrderService {
 		return mapList;
 	}
 
+	public void kcpTest(Payment param, HttpServletRequest request, HttpServletResponse response) {
+		try {
+			coreKcpService.kcpPayRequest(param, request, response);
+		} catch(Exception e) {
+			e.printStackTrace();
+		}
+	}
+
 	/**
 	 * 주문 상태 별 수량 조회
 	 *

+ 10 - 1
src/main/java/com/style24/front/biz/service/TsfPointService.java

@@ -42,7 +42,13 @@ public class TsfPointService {
 		return pointDao.getExtinctPointInfo(point);
 	}
 	
-	
+	/**
+	 * 포인트정보 내역조회
+	 *
+	 * @param Point
+	 * @author csh9191
+	 * @since 2021. 03. 03
+	 */	
 	public Collection<Point> getAccumulatePointList(Point point) {
 		return pointDao.getAccumulatePointList(point);
 	}
@@ -50,5 +56,8 @@ public class TsfPointService {
 	public Collection<Point> getUsePointList(Point point) {
 		return pointDao.getUsePointList(point);
 	}
+	public Collection<Point> getAllPointList(Point point) {
+		return pointDao.getAllPointList(point);
+	}
 
 }

+ 2 - 4
src/main/java/com/style24/front/biz/thirdparty/NaverLogin.java

@@ -160,10 +160,8 @@ public class NaverLogin {
 			String snsId = response.getString("id");
 			String custNm = this.uniCodeDeCode(response.getString("name"));
 			String email = response.getString("email");
-			// TODO: 네이버 로그인 셋팅 시 휴대폰 필수로 셋팅 한다고 함 jsshin 2021-02-26
-			String cellphnno = response.getString("mobile").equals("") ? "010-2590-6246" : response.getString("mobile");
-			// TODO: 출생년도도 필수 값으로 셋팅 해야 할것 같음 jsshin 2021-02-26
-			String birthYmd = (response.getString("birthyear").equals("") ? "1990" : response.getString("birthyear")) + response.getString("birthday").replaceAll("-","");
+			String cellphnno = response.getString("mobile");
+			String birthYmd = response.getString("birthyear") + response.getString("birthday").replaceAll("-","");
 			String sexGb = response.getString("gender");
 			String ci = this.requestReplace(response.getString("ci"),"encodeData");
 

+ 4 - 5
src/main/java/com/style24/front/biz/thirdparty/NiceCertify.java

@@ -5,7 +5,6 @@ import NiceID.Check.CPClient;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaDateUtil;
 import com.gagaframework.web.util.GagaFileUtil;
-import com.style24.core.support.session.TscSession;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Customer;
 import lombok.extern.slf4j.Slf4j;
@@ -68,7 +67,7 @@ public class NiceCertify {
 
 		String sRequestNo = niceCheck.getRequestNO(niceId);
 		log.info("sRequestNo: {}", sRequestNo);
-		TscSession.setAttribute("REQ_SEQ", sRequestNo);
+		TsfSession.setAttribute("REQ_SEQ", sRequestNo);
 
 		String callback = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), niceCallback);
 		log.info("niceCallback: {}", niceCallback);
@@ -184,7 +183,7 @@ public class NiceCertify {
 		String sMobileCo = (String)result.get("MOBILE_CO");				// 통신사
 
 
-		String sRequestNo = TscSession.getAttribute("REQ_SEQ");	// 세션에 저장된 요청번호
+		String sRequestNo = TsfSession.getAttribute("REQ_SEQ");	// 세션에 저장된 요청번호
 		if (!sRequestNo.equals(sRequestNumber)) {
 			sResponseNumber = "";
 			sAuthType = "";
@@ -235,7 +234,7 @@ public class NiceCertify {
 		String callback = GagaFileUtil.getConcatenationPath( PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), ipinCallback);
 
 		String sCPRequestNo = ipinClinet.getRequestNO(ipinId);
-		TscSession.setAttribute("CPREQUEST", sCPRequestNo);
+		TsfSession.setAttribute("CPREQUEST", sCPRequestNo);
 
 		// 인증요청 암호화 데이터 생성
 		int iRtn = ipinClinet.fnRequest(ipinId, ipinPwd, sCPRequestNo, callback);
@@ -318,7 +317,7 @@ public class NiceCertify {
 		String sAuthInfo = ipinClinet.getAuthInfo();		// 본인확인수단 (0~4: 가이드 참조)
 
 
-		String sCPRequestNo = TscSession.getAttribute("CPREQUEST");
+		String sCPRequestNo = TsfSession.getAttribute("CPREQUEST");
 		if (!sCPRequestNo.equals(sCPRequestNum)) {
 			throw new IllegalStateException("세션값 불일치 오류 입니다.");
 		}

+ 49 - 0
src/main/java/com/style24/front/biz/thirdparty/Yes24Login.java

@@ -0,0 +1,49 @@
+package com.style24.front.biz.thirdparty;
+
+import com.gagaframework.web.util.GagaFileUtil;
+import com.style24.front.support.security.session.TsfSession;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+
+/**
+ * Yes24 로그인
+ *
+ * @author jsshin
+ * @since 2021. 03. 03
+ */
+@Component
+@Slf4j
+public class Yes24Login {
+
+	@Autowired
+	private Environment env;
+
+	@Autowired
+	private RestTemplate restTemplate;
+
+	public static final String PROTOCOL = "http://";
+
+	/**
+	 * YES24 로그인 창
+	 * @param state - 콜백 시 해당 값으로 비교 및 모바일을 redirect 값이 있음
+	 * @return String - 호출 url정보
+	 * @author jsshin
+	 * @since 2021. 03. 03
+	 */
+	public String getAuthorizeUrl(String state) {
+		String authorizeUrl = "https://www.yes24.com/Templates/FTLogin.aspx";
+		String callBackUrl = "/signin/snsLoginCallback?snsType=YS";
+		StringBuilder apiUrlBuilder = new StringBuilder();
+		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
+		apiUrlBuilder.append(authorizeUrl)
+				.append("?PID=101582")
+				.append("&ReturnURL=")
+				.append(redirectUri);
+		log.info("apiUrlBuilder ===> {}", apiUrlBuilder.toString());
+		return apiUrlBuilder.toString();
+	}
+}

+ 55 - 12
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -5,7 +5,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.style24.core.biz.service.TscEnvsetService;
@@ -17,6 +19,7 @@ import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.CardPromotion;
 import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.GoodsStock;
 import com.style24.persistence.domain.Lookbook;
 
 import lombok.extern.slf4j.Slf4j;
@@ -71,13 +74,18 @@ public class TsfGoodsController extends TsfBaseController {
 
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
 		setGoods(paramsGoods);
-
+		
+		
 		String mobileYn = paramsGoods.getMobileYn();
 		if ("Y".equals(mobileYn)) {
 			paramsGoods.setFrontGb("M");
 		}
 
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 조회색상이 없으면 메인컬러 설정
+		if(StringUtils.isEmpty(paramsGoods.getColorCd())) {
+			paramsGoods.setColorCd(goods.getMainColorCd());
+		}
 
 		if (goods == null || goods.getGoodsCd().isEmpty()) {
 			if (StringUtils.isBlank(afLinkCd)) {
@@ -89,7 +97,7 @@ public class TsfGoodsController extends TsfBaseController {
 		}
 
 		// 상품 상세
-		goods = goodsService.getGoodsDesc(paramsGoods);
+		goods = goodsService.getGoodsDesc(goods);
 		// 핫딜정보
 		Goods socialGoods = goodsService.getSocialGoods(paramsGoods);
 		if (socialGoods != null && !StringUtils.isBlank(socialGoods.getGoodsCd())) {
@@ -107,25 +115,29 @@ public class TsfGoodsController extends TsfBaseController {
 		paramsGoods.setCateGb("G032_101"); 		//by item
 		mav.addObject("goodsNavigation", goodsService.getGoodsNavigation(paramsGoods));
 		// 상품 이미지정보
-		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods.getGoodsCd()));
+		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods));
 		// 상품 동영상정보
 		mav.addObject("goodsVideoList", goodsService.getVideoList(paramsGoods.getGoodsCd()));
 
-		if ("D".equals(goods.getGoodsType())) {	// 딜상품
+		if ("G056_D".equals(goods.getGoodsType())) {	// 딜상품
 			// 딜 구성상품 정보
 			paramsGoods.setGoodsComposeSearchYn("Y");
 			mav.addObject("goodsExtendList", goodsService.getGoodsDealComposeList(paramsGoods));
 		} else {
-			if ("N".equals(goods.getGoodsType())) {	// 일반상품
-				// 상품 옵션1(색상) 정보
-				mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
-				// 상품 옵션2(사이즈) 정보
-				mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
+			if ("G056_N".equals(goods.getGoodsType())) {	// 일반상품
+				if ("Y".equals(goods.getSelfGoodsYn()) ) {  // 자사상품
+					// 상품 옵션1(색상) 정보
+					mav.addObject("goodsOption1List", goodsService.getGoodsOption1List(paramsGoods));
+					// 상품 옵션2(사이즈) 정보
+					mav.addObject("goodsOption2List", goodsService.getGoodsOption2List(paramsGoods));
+				}else {
+					//mav.addObject("goodsOptionList", goodsService.getGoodsOptionList(paramsGoods));
+				}
 
 //				// 상품 고시정보
 				mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
 
-			} else if ("S".equals(goods.getGoodsType())) {		// 셋트상품
+			} else if ("G056_S".equals(goods.getGoodsType())) {		// 셋트상품
 //				mav.addObject("goodsExtendList", goodsService.getGoodsSetExtendList(paramsGoods));
 			}
 			// 상품쿠폰
@@ -141,7 +153,7 @@ public class TsfGoodsController extends TsfBaseController {
 //
 		// 카드 혜택안내
 		CardPromotion cardPromotion = new CardPromotion();
-		cardPromotion.setRegNo(1); // 혜택유형별로 1건씩
+		cardPromotion.setRownum(1); // 혜택유형별로 1건씩
 		mav.addObject("cardInfoList", goodsService.getCardPromotionList(cardPromotion));
 
 		// 쇼핑 혜택
@@ -154,7 +166,7 @@ public class TsfGoodsController extends TsfBaseController {
 		// 룩북
 		Lookbook lookbook = new Lookbook();
 		lookbook.setGoodsCd(paramsGoods.getGoodsCd());
-		mav.addObject("cardInfoList", goodsService.getLookbookList(lookbook));
+		mav.addObject("lookbookList", goodsService.getLookbookList(lookbook));
 		// 오늘본 상품 쿠키 담기
 		// SSL Server
 		boolean isSslServer = Boolean.parseBoolean(hasSsl);
@@ -163,6 +175,7 @@ public class TsfGoodsController extends TsfBaseController {
 		//기존쿠키 가져오기
 		setTodayGoodsCd(paramsGoods);
 
+		
 		mav.addObject("params", paramsGoods);
 
 		if ("D".equals(goods.getGoodsType())) {
@@ -254,4 +267,34 @@ public class TsfGoodsController extends TsfBaseController {
 		GagaCookieUtil.setCookie(TsfSession.getHttpServletResponse(), TsfConstants.CK_PREFIX + "_today_goodsCd", setCkGoodsCd, 24 * 60 * 60);
 		//		}
 	}
+	
+	/**
+	 * 상품상세 -  카드혜택안내 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 4
+	 */
+	@PostMapping("/card/prmt/layer")
+	public ModelAndView cardPrmtForm() {
+		ModelAndView mav = new ModelAndView();
+		CardPromotion cardPromotion = new CardPromotion();
+		mav.addObject("cardInfoList", goodsService.getCardPromotionList(cardPromotion));
+		mav.setViewName(super.getDeviceViewName("goods/CardPrmtForm"));
+		return mav;
+	}
+	
+	/**
+	 * 상품 사이즈 선택 시 재고수량 가져오기
+	 * 
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 4
+	 */
+	@GetMapping("/detail/ajaxGoodsStockQty")
+	@ResponseBody
+	public int getAjaxGoodsStockQty(GoodsStock goodsStock) {
+		int stockQty = 0;
+		stockQty = goodsService.getGoodsStockQty(goodsStock);
+		return stockQty;
+	}
 }

+ 31 - 1
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -17,6 +17,7 @@ import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.service.TsfCustomerService;
 import com.style24.front.biz.thirdparty.KaKaoLogin;
 import com.style24.front.biz.thirdparty.NaverLogin;
+import com.style24.front.biz.thirdparty.Yes24Login;
 import com.style24.persistence.domain.CustSnsInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -61,6 +62,9 @@ public class TsfIndexController extends TsfBaseController {
 	@Autowired
 	private NaverLogin naverLogin;
 
+	@Autowired
+	private Yes24Login yes24Login;
+
 	@Autowired
 	private ObjectMapper objectMapper;
 
@@ -187,7 +191,7 @@ public class TsfIndexController extends TsfBaseController {
 	 *
 	 * @return String
 	 * @author jsshin
-	 * @since 2020. 5. 25
+	 * @since 2021. 02. 23
 	 */
 	@GetMapping("/signin/naverlogin")
 	public String signinNaverLogin(@RequestParam(value = "rememberMe", required = false) String rememberMe
@@ -208,6 +212,32 @@ public class TsfIndexController extends TsfBaseController {
 		return "redirect:" + redirectUrl;
 	}
 
+	/**
+	 * YES24 로그인 페이지 호출
+	 *
+	 * @return String
+	 * @author jsshin
+	 * @since 2021. 02. 23
+	 */
+	@GetMapping("/signin/yes24login")
+	public String signinYes24Login(@RequestParam(value = "rememberMe", required = false) String rememberMe
+			, @RequestParam(value = "requestGb", required = false) String requestGb) {
+
+		if (StringUtils.isNotBlank(rememberMe)) {
+			// RememberMe 세션 저장
+			TsfSession.setAttribute("rememberMe", rememberMe);
+		}
+		// CSRF 방지를 위한 상태 토큰 생성 코드
+		SecureRandom random = new SecureRandom();
+		String state = new BigInteger(130, random).toString(32);
+		state += "!@!" + requestGb;
+		TsfSession.setAttribute("state", state);
+
+		String redirectUrl = yes24Login.getAuthorizeUrl(state);
+
+		return "redirect:" + redirectUrl;
+	}
+
 
 	/**
 	 * SNS 로그인

+ 27 - 0
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -20,6 +20,7 @@ import org.springframework.web.servlet.ModelAndView;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscCustomerService;
+import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscOrderChangeService;
 import com.style24.core.biz.service.TscOrderRefundService;
 import com.style24.core.biz.service.TscOrderService;
@@ -96,6 +97,9 @@ public class TsfMypageController extends TsfBaseController {
 
 	@Autowired
 	private TsfRendererService rendererService;
+	
+	@Autowired
+	private TscKakaoPayService kakaoPayService;
 
 	/**
 	 * 마이페이지 메인 화면
@@ -556,6 +560,29 @@ public class TsfMypageController extends TsfBaseController {
 		
 		return result;
 	}
+	
+	/**
+	 * 마이페이지 STYLE24 전체내역
+	 *
+	 * @param param
+	 * @return GagaMap
+	 * @author csh9191
+	 * @since 2021. 03. 02
+	 */
+	@PostMapping("/allpoint/list")
+	@ResponseBody
+	public GagaMap getAllPointList(@RequestBody Point point) {
+		GagaMap result = new GagaMap();
+		
+		int custNo = TsfSession.getInfo().getCustNo();
+		point.setCustNo(custNo);
+		
+		result.set("allPointList",pointService.getAllPointList(point));
+		
+		log.info("result {}", result);
+		
+		return result;
+	}
 
 	/**
 	 * 마이페이지 반품신청 환불금액 계산

+ 141 - 428
src/main/java/com/style24/front/biz/web/TsfOrderController.java

@@ -1,12 +1,13 @@
 package com.style24.front.biz.web;
 
-import java.util.ArrayList;
 import java.util.Collection;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
@@ -14,12 +15,15 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.style24.core.biz.service.TscFreegiftService;
+import com.style24.core.biz.service.TscKakaoPayService;
 import com.style24.core.biz.service.TscOrderService;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCartService;
+import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Order;
+import com.style24.persistence.domain.Payment;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -39,6 +43,9 @@ public class TsfOrderController extends TsfBaseController {
 
 	@Autowired
 	private TscOrderService coreOrderService;
+
+	@Autowired
+	private TsfOrderService orderService;
 	
 	@Autowired
 	private TscFreegiftService coreFreegiftService;
@@ -46,6 +53,9 @@ public class TsfOrderController extends TsfBaseController {
 	@Autowired
 	private TsfCartService cartService;
 	
+	@Autowired
+	private TscKakaoPayService kakaoPayService;
+	
 	/**
 	 * 회원, 비회원 주문페이지
 	 *
@@ -58,6 +68,8 @@ public class TsfOrderController extends TsfBaseController {
 	public ModelAndView orderNoMember(Order order, RedirectAttributes redirectAttributes) {
 		ModelAndView mav = new ModelAndView();
 		
+		String rtnView = "";
+		
 		// 비회원 주문시 로직 정리
 		// @ web 인 경우에는 고객정보 입력 화면 후 주문서 이동 후 본인인중
 		// @ web 의 경우에는 입력한 고객정보와 인증받은 고객정보가 다른경우 고객정보 업데이트
@@ -85,6 +97,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @author jsh77b
 	 * @since 2021. 02. 02
 	 */
+	@SuppressWarnings({ "unchecked", "null" })
 	@RequestMapping(value = "/form")
 	public ModelAndView orderForm(Order order) {
 		ModelAndView mav = new ModelAndView();
@@ -92,31 +105,58 @@ public class TsfOrderController extends TsfBaseController {
 		// TODO
 		// 1.비회주문, 회원 주문 판단 로직,  고객정보 세션 판단
 		// 세션고객정보가 존재하면 회원주문 없으면 비회원 주문
+		
+		// 임시 jsessionId
+		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
+		Boolean noMember 	= true;
 
-		// 1. 로그인체크 후 custNo 설정
-		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
+		// TODO 로그인체크 로직 추가
+		// 1.0 회원, 비회원 여부 판단
+		if (TsfSession.getInfo().getCustNo() == null) {
+			order.setJsessionId(jsessionId);
 		} else {
-			order.setJsessionId(TsfSession.getSessionId());
+			noMember = false;
+			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
 		}
 		
 		// TODO
-		// 1.1 카트시퀀스가 정보가 없을때 처리 장바구니로 이동 
+		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
 		if (order.getCartSqArr() == null) {
 			mav.setViewName("redirect:/order/noMember");		// 비회원주문서화면
 			return mav;
 		}
 		
-		// 2. 로그인정보 체크 후 비회원 고객정보 설정 (화면에서 오류 발생에 대비해서 정리)
-		if (TsfSession.isLogin()) {
-			order.setCustNm("");
-			order.setCellPhnno("");
-			order.setEmail("");
+		Order custemerInfo = new Order();
+		Order deliveryAddrInfo = new Order();
+
+		// TODO 로그인체크 로직 추가
+		if (noMember) {
+			// 1.1 주문고객 정보조회
+			custemerInfo.setCustNm(order.getCustNm());
+			custemerInfo.setCellPhnno(order.getCellPhnno());
+			custemerInfo.setEmail(order.getEmail());
+			
+			// 1.2 배송지 정보조회 (기본배송지)
+			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
+			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
+			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
+			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
+			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+		} else {
+			// 1.1 주문고객 정보조회
+			custemerInfo = coreOrderService.getCustemerInfo(order);
+			
+			// 1.2 배송지 정보조회 (기본배송지)
+			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
 			
-			order.setDelvAddrNm("");
-			order.setRecipZipcode("");
-			order.setRecipBaseAddr("");
-			order.setRecipDtlAddr("");
+			if (deliveryAddrInfo == null) {
+				deliveryAddrInfo = new Order();
+				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
+				deliveryAddrInfo.setRecipZipcode("");
+				deliveryAddrInfo.setRecipBaseAddr("");
+				deliveryAddrInfo.setRecipDtlAddr("");
+				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
+			}
 		}
 
 		// TODO 임시 장바구니
@@ -124,303 +164,123 @@ public class TsfOrderController extends TsfBaseController {
 		// 2.1 배송단위별 상품 목록 조회 (장바구니)
 		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
 		
-		// 2.2 상품금액, 선포인트, 다다익선할인금액
+		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
 		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
 		
-		// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
+		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
 		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
-		
-		// 2.4 고객 보유 포인트 정보 조회
-		//int rmPntAmt = coreOrderService.getCustPointInfo(order);
-		
-		// 2.5 고객 보유 상품권 정보 조회
-		//int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
 
-		// 101. 상품정보
-		mav.addObject("cartGoodsList"			, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
-		mav.addObject("delvTotCnt" 				, delvOrderMap.get("delvTotCnt"));			// 총상품건수
-		mav.addObject("delvFeeTotCnt"			, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
-		mav.addObject("wmsCnt" 					, delvOrderMap.get("wmsCnt"));				// 자사상품건수
-		mav.addObject("resCnt" 					, delvOrderMap.get("resCnt"));				// 자사예약상품건수
-		mav.addObject("delvCnt" 				, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
-		
-		mav.addObject("shotCartList" 			, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
-		mav.addObject("wmsCartList" 			, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
-		mav.addObject("delvCartList" 			, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
-		mav.addObject("resCartList" 			, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
-		mav.addObject("delvAllCartList" 		, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
-		mav.addObject("sumDelvFee" 				, delvOrderMap.get("sumDelvFee"));			// 배송비합계
-		
-		// 102. 주문정보
-		mav.addObject("order" 					, order);									// 주문정보
-
-		// 103. 할인정보
-		mav.addObject("tmtbGoodsApplyList"		, tmtbGoodsApplyList);						// 다다익선상품 적용목록
-		mav.addObject("orgGoodsSumAmt"			, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
-		mav.addObject("cpn1DcSumAmt"			, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
-		mav.addObject("tmtbDcSumAmt"			, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		// 3. 할인구간정보조회
+		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
+		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
 		
-		mav.addObject("prePntDcAmt"				, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액		
-		mav.addObject("savePntSumAmt"			, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
+		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
+		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
 		
-		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
+		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
+		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
 		
-		return mav;
-	}
-	
-	/**
-	 * 고객정보조회
-	 *
-	 * @param
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 02. 17
-	 */
-	@ResponseBody
-	@PostMapping("/custemerInfo")
-	public ModelAndView custemerInfo(@RequestBody Order order) {
+		// 3.2.2 장바구니쿠폰기준 ---> 상품목록
+		cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
 		
-		Order custemerInfo = new Order();
+		// 3.3 배송비쿠폰목록 조회
+		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
 		
-		// 1. 로그인체크 후 custNo 설정
-		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-		} else {
-			order.setJsessionId(TsfSession.getSessionId());
-		}
+		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
 		
-		// 2. 로그인체크 후 고객정보 설정
-		if (TsfSession.isLogin()) {
-			// 2.1 주문고객 정보조회
-			custemerInfo = coreOrderService.getCustemerInfo(order);
-		} else {
-			// 2.1 주문고객 정보조회
-			custemerInfo.setCustNm(order.getCustNm());
-			custemerInfo.setCellPhnno(order.getCellPhnno());
-			custemerInfo.setEmail(order.getEmail());
-		}
+		// 3.3.1 배소업체기준 ---> 배송비쿠폰
+		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
 		
-		ModelAndView mav = new ModelAndView();
-		mav.addObject("custemerInfo"	, custemerInfo); 	// 고객정보
-		mav.addObject("order"			, order);			// 파라미터
-		mav.setViewName(super.getDeviceViewName("order/OrderCustemerInfo"));
+		// 3.4 고객 보유 포인트 정보 조회
+		int rmPntAmt = coreOrderService.getCustPointInfo(order);
 		
-		return mav;
-	}
-	
-	/**
-	 * 배송정보조회
-	 *
-	 * @param
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 02. 17
-	 */
-	@ResponseBody
-	@PostMapping("/deliveryAddrInfo")
-	public ModelAndView deliveryAddrInfo(@RequestBody Order order) {
+		// 3.5 고객 보유 상품권 정보 조회
+		int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
+		
+		// 4. 사은품 정보
+		// 4.1 장바구니상품 사음품 적용 정보 조회
+		GagaMap  resultMap = coreFreegiftService.getOrderFreegift(order);
 
-		Order deliveryAddrInfo = new Order();
+		// 101. 상품정보
+		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
+		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));			// 총상품건수
+		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
+		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));				// 자사상품건수
+		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));				// 자사예약상품건수
+		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
 		
-		// 1. 로그인체크 후 custNo 설정
-		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-		} else {
-			order.setJsessionId(TsfSession.getSessionId());
-		}
+		mav.addObject("shotCartList" 					, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
+		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
+		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));		// 입점업체상품목
+		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
+		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
+		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
 		
-		// 2. 로그인체크 후 고객정보 설정
-		if (TsfSession.isLogin()) {
-			// 2.1 주문고객 정보조회
-			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
-			
-			if (deliveryAddrInfo == null) {
-				deliveryAddrInfo = new Order();
-				deliveryAddrInfo.setDelvAddrNm(deliveryAddrInfo.getCustNm());
-				deliveryAddrInfo.setRecipZipcode("");
-				deliveryAddrInfo.setRecipBaseAddr("");
-				deliveryAddrInfo.setRecipDtlAddr("");
-				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
-			}
-		} else {
-			// 2.1 주문고객 정보조회			
-			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
-			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
-			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
-			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
-			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
-		}
+		// 102. 고객정보
+		mav.addObject("custemerInfo"					, custemerInfo);							// 고객정보
+		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);						// 배송지정보
+		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());					// 장바구니 총알배송여부
 		
-		ModelAndView mav = new ModelAndView();
-		mav.addObject("deliveryAddrInfo", deliveryAddrInfo);						// 배송지정보
-		mav.addObject("order"			, order);									// 파라미터
-		mav.setViewName(super.getDeviceViewName("order/OrderDeliveryAddrInfo"));
+		// 103. 할인정보
+		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
+		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
+		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
+		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
 		
-		return mav;
-	}
-	
-	/**
-	 * 사은품정보조회
-	 *
-	 * @param
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 02. 17
-	 */
-	@ResponseBody
-	@PostMapping("/freegiftInfo")
-	public ModelAndView freegiftInfo(@RequestBody Order order) {
+		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
+		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
+		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
+		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
 
-		GagaMap resultMap = new GagaMap();
-		
-		// 1. 로그인체크 후 custNo 설정
-		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-		} else {
-			order.setJsessionId(TsfSession.getSessionId());
-		}
-		
-		// 2. 로그인체크 후 정보 설정
-		if (TsfSession.isLogin()) {
-			// 4. 사은품 정보 (장바구니상품 사음품 적용 정보 조회)
-			resultMap = coreFreegiftService.getOrderFreegift(order);
-		} 
+		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
+		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
+		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
 		
-		ModelAndView mav = new ModelAndView();
-		mav.addObject("freegiftGoodsList"	, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
-		mav.addObject("freegiftList"		, resultMap.get("freegiftList"));			// 사은품정보 목록
-		mav.addObject("order"				, order);									// 파라미터
+		// 104. 사은품정보
+		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
+		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));			// 사은품정보 목록
 		
-		mav.setViewName(super.getDeviceViewName("order/OrderFreegiftInfo"));
+		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
 		
 		return mav;
 	}
-	
+
 	/**
-	 * 할인정보조회
+	 * 총알배송 가능 지역 체크
 	 *
 	 * @param
 	 * @return
 	 * @author jsh77b
-	 * @since 2021. 02. 17
+	 * @since 2021. 02. 08
 	 */
-	@SuppressWarnings("unchecked")
 	@ResponseBody
-	@PostMapping("/dcAmtInfo")
-	public ModelAndView dcAmtInfo(@RequestBody Order order) {
-
-		GagaMap goodsDcAmtMap = new GagaMap();
-		
-		Collection<Order> goodsApplyCpnList 	= new ArrayList<Order>();
-		Collection<Order> goodsCpnList			= new ArrayList<Order>();
-		Collection<Order> cartCpnList 			= new ArrayList<Order>();
-		Collection<Order> delvCpnList 			= new ArrayList<Order>();
-		Collection<Order> delvFeeCdList 		= new ArrayList<Order>();
-		
-		int rmPntAmt 	= 0;
-		int rmGfcdAmt 	= 0;
-		
-		// 1. 로그인체크 후 custNo 설정
-		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-		} else {
-			order.setJsessionId(TsfSession.getSessionId());
-		}
-		
-		// 2. 로그인체크 후 정보 설정 (할인구간정보조회)
-		if (TsfSession.isLogin()) {
-			
-			// 2.1 배송단위별 상품 목록 조회 (장바구니)
-			Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
-			
-			// 2.2 상품금액, 선포인트, 다다익선할인금액
-			goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
-			
-			// 2.3 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
-			GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
-			
-			// 2.4 상품쿠폰, 장바구니쿠폰 목록 조회
-			GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
-			
-			goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
-			cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
-			
-			// 2.5 상품쿠폰 적용된 상품 목록(상품기준)
-			goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
-			
-			// 2.6 장바구니쿠폰(장바구니기준 상품목록)
-			cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
-			
-			// 2.7 배송비쿠폰목록 조회
-			delvCpnList = coreOrderService.getDelvCpnList(order);
-			
-			delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
-			
-			// 2.8 배송비쿠폰(배송업체기준)
-			delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
-			
-			// 2.9 고객 보유 포인트 정보 조회
-			rmPntAmt = coreOrderService.getCustPointInfo(order);
-			
-			// 2.10 고객 보유 상품권 정보 조회
-			rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
-		} 
-
+	@RequestMapping(value = "/create/order")
+	public ModelAndView createOrder(Order order) {
 		ModelAndView mav = new ModelAndView();
-		mav.addObject("goodsApplyCpnList"		, goodsApplyCpnList);						// 상품적용쿠폰
-		mav.addObject("cartCpnList"				, cartCpnList);								// 장바구니쿠폰목록
-		mav.addObject("delvCpnList"				, delvCpnList);								// 배송비쿠폰목록
-
-		mav.addObject("orgGoodsSumAmt"			, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
-		mav.addObject("cpn1DcSumAmt"			, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
-		mav.addObject("tmtbDcSumAmt"			, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
-		mav.addObject("prePntDcAmt"				, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
 
-		mav.addObject("rmPntAmt"				, rmPntAmt);								// 고객포인트정보
-		mav.addObject("rmGfcdAmt"				, rmGfcdAmt);								// 고객상품권정보
-		mav.addObject("savePntSumAmt"			, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
-		mav.addObject("order"					, order);									// 파라미터
-		
-		mav.setViewName(super.getDeviceViewName("order/OrderDcAmtInfo"));
-		
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		return mav;
 	}
-	
+
 	/**
-	 * 할인정보조회
+	 * 주문페이지
 	 *
 	 * @param
 	 * @return
 	 * @author jsh77b
-	 * @since 2021. 02. 17
+	 * @since 2021. 02. 02
 	 */
-	@ResponseBody
-	@PostMapping("/paymentInfo")
-	public ModelAndView paymentInfo(@RequestBody Order order) {
-		
-		// 1. 로그인체크 후 custNo 설정
-		if (TsfSession.isLogin()) {
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-		} else {
-			order.setJsessionId(TsfSession.getSessionId());
-		}
-		
-		// 2. 로그인체크 후 정보 설정
-		if (TsfSession.isLogin()) {
-			
-		} 
-
+	@SuppressWarnings({ "unchecked", "null" })
+	@RequestMapping(value = "/pay/result/response")
+	public ModelAndView payResultResponse(Payment param, HttpServletRequest request, HttpServletResponse response) {
 		ModelAndView mav = new ModelAndView();
-		mav.addObject("order" , order);	// 파라미터
-		mav.setViewName(super.getDeviceViewName("order/OrderPaymentInfo"));
+
+		orderService.kcpTest(param, request, response);
 		
+		mav.setViewName(super.getDeviceViewName("pg/kcpOrder"));
 		return mav;
 	}
-	
-	
-	
-	
-	
+
 	/**
 	 * 총알배송 가능 지역 체크
 	 *
@@ -430,7 +290,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 08
 	 */
 	@ResponseBody
-	@PostMapping(value = "/getDailyDeliveryCheck")
+	@RequestMapping(value = "/getDailyDeliveryCheck")
 	public int getDailyDeliveryCheck(Order order) {
 		
 		// 1. 총알배송가능 지역, 총알배송 가능 시간 체크
@@ -448,7 +308,7 @@ public class TsfOrderController extends TsfBaseController {
 	 * @since 2021. 02. 17
 	 */
 	@ResponseBody
-	@PostMapping(value = "/delvAddrChangePop")
+	@RequestMapping(value = "/delvAddrChangePop")
 	public ModelAndView delvAddrChangePop(Order order) {
 		
 		ModelAndView mav = new ModelAndView();
@@ -532,166 +392,19 @@ public class TsfOrderController extends TsfBaseController {
 		
 		return mav;
 	}
-	
-	
-	
-	
+
 	/**
-	 * 주문페이지
+	 * 카카오페이 결제준비 처리
 	 *
-	 * @param
-	 * @return
-	 * @author jsh77b
-	 * @since 2021. 02. 02
+	 * @param Order
+	 * @return GagaMap
+	 * @author card007
+	 * @since 2021. 03. 03
 	 */
-	@SuppressWarnings({ "unchecked", "null" })
-	@RequestMapping(value = "/form20210304")
-	public ModelAndView orderForm20210304(Order order) {
-		ModelAndView mav = new ModelAndView();
-		
-		// TODO
-		// 1.비회주문, 회원 주문 판단 로직,  고객정보 세션 판단
-		// 세션고객정보가 존재하면 회원주문 없으면 비회원 주문
-		
-		// 임시 jsessionId
-		String jsessionId 	= "aaec62cc-5f91-47bb-ba65-ebc9a61385cf";
-		Boolean noMember 	= true;
-
-		// TODO 로그인체크 로직 추가
-		// 1.0 회원, 비회원 여부 판단
-		if (TsfSession.getInfo().getCustNo() == null) {
-			order.setJsessionId(jsessionId);
-		} else {
-			noMember = false;
-			order.setCustNo(TsfSession.getInfo().getCustNo()); // 고객번호등록
-		}
-		
-		// TODO
-		// 1.1 카트시퀀스가 없을때 처리 장바구니로 이동 
-		if (order.getCartSqArr() == null) {
-			mav.setViewName("redirect:/order/noMember");		// 비회원주문서화면
-			return mav;
-		}
-		
-		Order custemerInfo = new Order();
-		Order deliveryAddrInfo = new Order();
-
-		// TODO 로그인체크 로직 추가
-		if (noMember) {
-			// 1.1 주문고객 정보조회
-			custemerInfo.setCustNm(order.getCustNm());
-			custemerInfo.setCellPhnno(order.getCellPhnno());
-			custemerInfo.setEmail(order.getEmail());
-			
-			// 1.2 배송지 정보조회 (기본배송지)
-			deliveryAddrInfo.setDelvAddrNm(order.getCustNm());
-			deliveryAddrInfo.setRecipZipcode(order.getRecipZipcode());
-			deliveryAddrInfo.setRecipBaseAddr(order.getRecipBaseAddr());
-			deliveryAddrInfo.setRecipDtlAddr(order.getRecipDtlAddr());
-			deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
-		} else {
-			// 1.1 주문고객 정보조회
-			custemerInfo = coreOrderService.getCustemerInfo(order);
-			
-			// 1.2 배송지 정보조회 (기본배송지)
-			deliveryAddrInfo = coreOrderService.getDeliveryAddrInfo(order);
-			
-			if (deliveryAddrInfo == null) {
-				deliveryAddrInfo = new Order();
-				deliveryAddrInfo.setDelvAddrNm(custemerInfo.getCustNm());
-				deliveryAddrInfo.setRecipZipcode("");
-				deliveryAddrInfo.setRecipBaseAddr("");
-				deliveryAddrInfo.setRecipDtlAddr("");
-				deliveryAddrInfo.setDelvMemo("직접받고 부재시 문 앞");
-			}
-		}
-
-		// TODO 임시 장바구니
-		// 2. 장바구니시퀀스 배열 등록 (장바구니 상품 정보 조회)		
-		// 2.1 배송단위별 상품 목록 조회 (장바구니)
-		Collection<Order> tmtbGoodsApplyList = cartService.getMoreBetterAmtList(order);
-		
-		// 2.1.0 상품금액, 선포인트, 다다익선할인금액
-		GagaMap goodsDcAmtMap = coreOrderService.getGoodsDcAmt(tmtbGoodsApplyList);
-		
-		// 2.2 배송단위별 장바구니 상품 건수 조회 (장바구니상품)
-		GagaMap delvOrderMap = coreOrderService.getCartDelvGoodsCntList(tmtbGoodsApplyList);
-
-		// 3. 할인구간정보조회
-		// 3.2 상품쿠폰, 장바구니쿠폰 목록 조회
-		GagaMap goodsCartCpnMap = coreOrderService.getGoodsCartCpnApplyGoodsList(order);
-		
-		Collection<Order> goodsCpnList 	= (Collection<Order>) goodsCartCpnMap.get("goodsCpnList");
-		Collection<Order> cartCpnList 	= (Collection<Order>) goodsCartCpnMap.get("cartCpnList");
-		
-		// 3.2.1 상품기준 ---> 상품쿠폰 적용된 상품 목록
-		Collection<Order> goodsApplyCpnList = coreOrderService.getGoodsCpnApplyList(tmtbGoodsApplyList, goodsCpnList);
-		
-		// 3.2.2 장바구니쿠폰기준 ---> 상품목록
-		cartCpnList = coreOrderService.getCartCpnApplyList(tmtbGoodsApplyList, cartCpnList);
-		
-		// 3.3 배송비쿠폰목록 조회
-		Collection<Order> delvCpnList = coreOrderService.getDelvCpnList(order);
-		
-		Collection<Order> delvFeeCdList = (Collection<Order>) delvOrderMap.get("delvFeeCdList");
-		
-		// 3.3.1 배소업체기준 ---> 배송비쿠폰
-		delvCpnList = coreOrderService.getDelvCpnApplyList(delvFeeCdList, delvCpnList);
-		
-		// 3.4 고객 보유 포인트 정보 조회
-		int rmPntAmt = coreOrderService.getCustPointInfo(order);
-		
-		// 3.5 고객 보유 상품권 정보 조회
-		int rmGfcdAmt = coreOrderService.getGiftcardInfo(order);
-		
-		// 4. 사은품 정보
-		// 4.1 장바구니상품 사음품 적용 정보 조회
-		GagaMap  resultMap = coreFreegiftService.getOrderFreegift(order);
-
-		// 101. 상품정보
-		mav.addObject("cartGoodsList"					, tmtbGoodsApplyList);						// 장바구니상품목록 (즉시할인쿠폰적용)
-		mav.addObject("delvTotCnt" 						, delvOrderMap.get("delvTotCnt"));			// 총상품건수
-		mav.addObject("delvFeeTotCnt"					, delvOrderMap.get("delvFeeTotCnt"));		// 총배송타입건수
-		mav.addObject("wmsCnt" 							, delvOrderMap.get("wmsCnt"));				// 자사상품건수
-		mav.addObject("resCnt" 							, delvOrderMap.get("resCnt"));				// 자사예약상품건수
-		mav.addObject("delvCnt" 						, delvOrderMap.get("delvCnt"));				// 입점업체상품건수
-		
-		mav.addObject("shotCartList" 					, delvOrderMap.get("shotCartList"));		// 자사총알배송상품목록
-		mav.addObject("wmsCartList" 					, delvOrderMap.get("wmsCartList"));			// 자사일반배송상품목록
-		mav.addObject("delvCartList" 					, delvOrderMap.get("delvCartList"));		// 입점업체상품목록
-		mav.addObject("resCartList" 					, delvOrderMap.get("resCartList"));			// 자사예약배송상품목록
-		mav.addObject("delvAllCartList" 				, delvOrderMap.get("delvAllCartList"));		// 전체배송목록
-		mav.addObject("sumDelvFee" 						, delvOrderMap.get("sumDelvFee"));			// 배송비합계
-		
-		// 102. 고객정보
-		mav.addObject("custemerInfo"					, custemerInfo);							// 고객정보
-		mav.addObject("deliveryAddrInfo"				, deliveryAddrInfo);						// 배송지정보
-		mav.addObject("shotDelvYn" 						, order.getShotDelvYn());					// 장바구니 총알배송여부
-		
-		// 103. 할인정보
-		mav.addObject("tmtbGoodsApplyList"				, tmtbGoodsApplyList);						// 다다익선상품 적용목록
-		mav.addObject("goodsApplyCpnList"				, goodsApplyCpnList);						// 상품적용쿠폰
-		mav.addObject("cartCpnList"						, cartCpnList);								// 장바구니쿠폰목록
-		mav.addObject("delvCpnList"						, delvCpnList);								// 배송비쿠폰목록
-		
-		mav.addObject("orgGoodsSumAmt"					, goodsDcAmtMap.get("orgGoodsSumAmt"));		// 상품금액합계
-		mav.addObject("cpn1DcSumAmt"					, goodsDcAmtMap.get("cpn1DcSumAmt"));		// 즉시할인금액합계
-		mav.addObject("tmtbDcSumAmt"					, goodsDcAmtMap.get("tmtbDcSumAmt"));		// 다다익선할인금액합계
-		mav.addObject("prePntDcAmt"						, goodsDcAmtMap.get("prePntDcAmt"));		// 선포인트사용가능금액
-
-		mav.addObject("rmPntAmt"						, rmPntAmt);								// 고객포인트정보
-		mav.addObject("rmGfcdAmt"						, rmGfcdAmt);								// 고객상품권정보
-		mav.addObject("savePntSumAmt"					, goodsDcAmtMap.get("savePntSumAmt"));		// 적립예정포인트합계
-		
-		// 104. 사은품정보
-		mav.addObject("freegiftGoodsList"				, resultMap.get("freegiftGoodsList"));		// 사은품상품정보 목록
-		mav.addObject("freegiftList"					, resultMap.get("freegiftList"));			// 사은품정보 목록
-		
-		mav.setViewName(super.getDeviceViewName("order/OrderForm"));
-		
-		return mav;
+	@RequestMapping(value = "/kakao/payment/ready")
+	@ResponseBody
+	public GagaMap kakaoPaymentReady(Order order) {
+		return kakaoPayService.kakaoPaymentReady(order);
 	}
-	
-	
 
 }

+ 2 - 2
src/main/java/com/style24/front/support/security/TsfAuthenticationProvider.java

@@ -82,8 +82,8 @@ public class TsfAuthenticationProvider implements AuthenticationProvider {
 
 		/// SNS로그인이 아닌 일반로그인 이면
 		if (!loginId.startsWith(TsfConstants.SNSLOGIN_PREFIX)) {
-			log.info("encoded password: {}", passwordEncoder.encode(passwd));
-			boolean isMatch = passwordEncoder.matches(passwd, loginInfo.getPasswd());
+			log.info("encoded password: {}", passwordEncoder.encodeSha256(passwd));
+			boolean isMatch = passwordEncoder.matchesSha256(passwd, loginInfo.getPasswd());
 			log.info("Password is match?: {}", isMatch);
 
 			if (!isMatch) {

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

@@ -24,9 +24,11 @@ public class CardPromotion extends TscBaseDomain {
 	private String note;	// 안내
 	private String dispYn;	// 표시여부
 
+	private String prmtGbNm;		//카드혜택유형
 	private Integer cardPrmtCdtSq;	// 카드프로모션행사조건일련번호
 	private int minPayAmt;	// 최소결제금액
 	private String dcWay;	// 할인구분할인방식(공통코드G240, 프로모션구분이 A:할인인 경우)
+	private String dcWayNm; 	// 할인구분방식명 %, 원
 	private int dcVal;	// 할인값(프로모션구분이 A:할인인 경우, 할인방식이 금액이면 할인금액, 율이면 할인율)
 	private int maxDcAmt;	// 최대할인금액(프로모션구분이 A:할인인 경우)
 	private String minNoItrt;	// 최소무이자월수(프로모션구분이 B:무이자 인경우)

+ 7 - 7
src/main/java/com/style24/persistence/domain/Cate4Srch.java

@@ -16,18 +16,18 @@ public class Cate4Srch extends TscBaseDomain {
 
 	private String siteCd;
 	private String cateGb;
-	private int cateNo;
-	private int leafCateNo;
+	private Integer cateNo;
+	private Integer leafCateNo;
 	private String cateType;
-	private int cate1No;
+	private Integer cate1No;
 	private String cate1Nm;
-	private int cate2No;
+	private Integer cate2No;
 	private String cate2Nm;
-	private int cate3No;
+	private Integer cate3No;
 	private String cate3Nm;
-	private int cate4No;
+	private Integer cate4No;
 	private String cate4Nm;
-	private int cate5No;
+	private Integer cate5No;
 	private String cate5Nm;
 	private String fullCateCd;
 	private String fullCateNm;

+ 0 - 44
src/main/java/com/style24/persistence/domain/Coupon.java

@@ -1,44 +0,0 @@
-package com.style24.persistence.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TscBaseDomain;
-
-import lombok.Data;
-
-/**
- * 장바구니
- *
- * @author xodud1202
- * @since 2021.01.22
- */
-@SuppressWarnings("serial")
-@Data
-public class Coupon extends TscBaseDomain {
-	// 쿠폰 정보
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private int[] cartSqArr;		// 장바구니 일련번호 배열
-	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private int[] currPrices;		// 상품가격 배열
-	private int cpnId;				// 쿠폰번호
-	private int custNo;				// 회원번호
-	private String custGb;			// 회원구분
-	private String custGrade;		// 회원등급
-	private int availDays;			// 쿠폰 다운로드 후 유효기간일
-	private int rdCpnId;			// 랜덤쿠폰번호
-	private int dcAmt;				// 할인적용금액
-	private int dcVal;				// 할인금액/율
-	private String useYn;			// 쿠폰 사용 여부
-	private String cpnNm;			// 쿠폰명
-	private String rdCpnNm;			// 시리얼쿠폰 키
-	private String usedDt;			// 쿠폰 사용완료 일자
-	private String result;			// 결과
-	private String pdGb;			// 기간/일수 구분 (P : 기간, D : 일수)
-	private String availStdt;		// 쿠폰 유효일
-	private String availEddt;		// 쿠폰 유효일
-	private String endAlimYn;		// 쿠폰 종료 알림 여부
-	private String frontGb;			// 화면 구분
-	private String availYn;			// 지급 받은 쿠폰 사용 가능 유무
-	private String dcWay;			// 할인금액/율 구분
-	private String cpnDesc;			// 쿠폰설명
-	private int downloadCnt;		// 다운로드수
-}

+ 7 - 6
src/main/java/com/style24/persistence/domain/Goods.java

@@ -34,6 +34,7 @@ public class Goods extends TscBaseDomain {
 	private int currPrice;		//현재판매가
 	private String priceUpdDt;		//가격변경일시
 	private float dcRate;		//할인율
+	private int pntAmt;				// 적립금
 	private int benefitCurrPrice;		//즉시할인판매가
 	private String goodsStat;		//상품상태(공통코드G008)
 	private String selfMallYn;		//자사몰노출여부
@@ -71,9 +72,9 @@ public class Goods extends TscBaseDomain {
 	private String adultYn;		//성인용품여부
 
 	private String colorCd;		//색상코드
-	private String colorNM;		//색상코드명
+	private String colorNm;		//색상코드명
 	private String brandnm;		//브랜드명
-	private int brandGroupNo;	//브랜드그룹번호
+	private Integer brandGroupNo;	//브랜드그룹번호
 	private String brandGroupNm;	//브랜드그룹명
 	private String frontGb;		//프론트구분
 	private String isApp;		//앱구분
@@ -82,7 +83,7 @@ public class Goods extends TscBaseDomain {
 	private String afLinkCd;	//제휴링크코드
 	private String ithrCd;		//위치코드
 	private String contentsLoc;	//컨텐츠위치
-	private int pntRate;		//적립율
+	private float pntRate;		//적립율
 	private String prePntUsableYn;	//적립율즉시사용여부
 	private String niClsfCd;	//고시분류코드
 	private String brandTcateNo;	//브랜드카테1번호
@@ -91,7 +92,7 @@ public class Goods extends TscBaseDomain {
 	private String viewDt;		//미리보기일시
 	private String custGb;		//고객구분
 	private String custGrade;	//고객등급
-	private int custNo;		//고객번호
+	private Integer custNo;		//고객번호
 	private String soldoutGoodsDisplayYn = "N";	//품절노추여부
 	private int pointUnit = 10;	//포인트단위
 	private String goodsNmFull;	//상품타이틀+ 상품명
@@ -102,7 +103,7 @@ public class Goods extends TscBaseDomain {
 	private String wishYn;		//위시리스트여부
 	private String goodsComposeSearchYn;	//구성상품 조회여부
 	private String goodsCdIncludeYn;	//상품코드포함 여부
-	private String socialSq;	//소셜번호
+	private Integer socialSq;	//소셜번호
 //	private String socialTypeNm;	//소셜타입명
 	private String socialType;	//소셜타입
 	private String socialTnm;	//소셜명
@@ -110,7 +111,7 @@ public class Goods extends TscBaseDomain {
 	private String socialEddt;	//소셜종료일
 	private String planDtlSq;	//기획전상세번호
 
-	private int floorUnit; // 절사단위(10:일원단위절사, 100:십원단위절사, 1000:백원단위절사)
+	private int floorUnit; // 절사단위(1:일원단위절사, 10:십원단위절사, 100:백원단위절사)
 
 	private String skuModelNo;		// SKUModelNo(WMS)
 	private String compsGoodsCd;	// 세트 구성품 상품번호

+ 2 - 1
src/main/java/com/style24/persistence/domain/GoodsStock.java

@@ -31,5 +31,6 @@ public class GoodsStock extends TscBaseDomain {
 	private String sysImgNm;		// 상품이미지 명
 	private int goodsQty;			// 안전재고
 	private int stockQty;			// 상품 재고
-
+	private String selfGoodsYn;		// 자사상품구분
+	
 }

+ 37 - 0
src/main/java/com/style24/persistence/domain/Search.java

@@ -0,0 +1,37 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 검색 Domain
+ *
+ * @author gagamel
+ * @since 2021. 3. 2
+ */
+@SuppressWarnings("serial")
+@Data
+public class Search extends TscBaseDomain {
+
+	// 최근검색어 목록
+	private Collection<String> recentlyList;
+
+	// 카테고리 목록
+	private Collection<Cate4Srch> cateList;
+
+	// 브랜드 목록
+	private Collection<Brand> brandList;
+
+	// 상품 목록
+	private Collection<Goods> goodsList;
+
+	@Data
+	public class Brand {
+		private Integer brandGroupNo;
+		private String brandGroupNm;
+	}
+
+}

+ 20 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml

@@ -113,4 +113,24 @@
 				) Z
 		 WHERE Z.DOWNLOAD_CNT > 0
 	</select>
+
+	<!--회원가입 쿠폰-->
+	<select id="getJoinCoupon" parameterType="Coupon" resultType="Coupon">
+		SELECT CP.CPN_ID
+		     , CP.END_ALIM_YN
+		     , CASE WHEN #{frontGb} = 'P' THEN CP.DC_PVAL
+		            WHEN #{frontGb} = 'M' THEN CP.DC_MVAL
+		            ELSE CP.DC_AVAL                                              END AS DC_VAL
+		     , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(NOW(), '%Y%M%D%H%I%S')
+		            ELSE DATE_FORMAT(CP.AVAIL_STDT, '%Y%M%D%H%I%S')              END AS AVAIL_STDT
+		     , CASE WHEN CP.PD_GB = 'D' THEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL CP.AVAIL_DAYS DAY), '%Y%M%D%H%I%S')
+		            ELSE  DATE_FORMAT(CP.AVAIL_EDDT, '%Y%M%D%H%I%S')             END AS AVAIL_EDDT
+		FROM  TB_CUST_GRADE_POLICY CGP
+		INNER JOIN
+		      TB_COUPON CP
+		ON    CGP.GRADE_CPN_ID1 = CP.CPN_ID
+		WHERE CGP.GRADE_CD = #{custGrade}
+		AND   CP.SITE_CD = #{siteCd}
+	</select>
+	
 </mapper>

+ 1 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml

@@ -234,7 +234,7 @@
 		     , NOW()                               AS JOIN_DT
 		     , IFNULL(#{foreignerYn}, 'N')         AS FOREIGNER_YN
 		     , #{custStat}                         AS CUST_STAT
-		     , #{passwdChgDt}                      AS PASSWD_CHG_DT
+		     , NOW()                               AS PASSWD_CHG_DT
 		     , 'N'                                 AS TEMP_PASSWD_YN
 		     , NOW()                               AS LOGIN_LDT
 		     , #{ci}                               AS CI

+ 96 - 26
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -100,6 +100,7 @@
 		     , G.GOODS_STAT
 		     , (CASE WHEN #{frontGb} = 'P' THEN G.PNT_PRATE ELSE G.PNT_MRATE END) AS PNT_RATE
 		     , (CASE WHEN #{frontGb} = 'P' THEN G.PRE_PPNT_USABLE_YN ELSE G.PRE_MPNT_USABLE_YN END) AS PRE_PNT_USABLE_YN
+		     , (CASE WHEN #{frontGb} = 'P' THEN (G.PNT_PRATE * BP.CURR_PRICE)/100 ELSE (G.PNT_MRATE * BP.CURR_PRICE) / 100 END) AS PNT_AMT
 		     , G.MIN_ORD_QTY
 		     , G.MAX_ORD_QTY
 		     , G.DAY_MAX_ORD_QTY
@@ -121,9 +122,8 @@
 		     , G.GOODS_TYPE
 		     , G.CHANGEABLE_YN
 		     , G.RETURNABLE_YN
-		     , (SELECT CATE1_NO FROM TB_SITE_BRAND WHERE  BRAND_CD = G.BRAND_CD AND SITE_CD = #{siteCd} AND USE_YN = 'Y') AS BRAND_CATE1_NO
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IFNULL(#{colorCd}, IFNULL(G.MAIN_COLOR_CD,'XX')) AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		     /*, (SELECT ) AS COLOR_NM*/
+		     , (SELECT COLOR_KNM FROM tb_color C WHERE COLOR_CD = IFNULL(NULLIF(#{colorCd},'') , G.MAIN_COLOR_CD ) AND USE_YN  = 'Y') AS COLOR_NM
 		     , BP.CURR_PRICE AS BENEFIT_PRICE
 		     , (CASE WHEN W.GOODS_CD IS NULL THEN 'N' ELSE 'Y' END) AS WISH_YN
 		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
@@ -204,8 +204,8 @@
 		LIMIT 1
 	</select>
 	
-	<!-- 상품 옵션1 목록 -->
-	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
+	<!-- 상품 옵션1 목록  - 자사용 -->
+	<select id="getGoodsOption1List_ORG" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption1List */
 		SELECT GOODS_CD
 		     , OPT_CD1
@@ -238,7 +238,7 @@
 		                      WHERE DISP_YN = 'Y'
 		                      GROUP BY GOODS_CD, OPT_CD1) S ON G.GOODS_CD = S.GOODS_CD 
 		                                                    AND O.OPT_CD1 = S.OPT_CD1
-		     WHERE G.GOODS_CD = #{goodsCd})
+		     WHERE G.GOODS_CD = #{goodsCd}
 		     AND G.GOODS_TYPE = 'G056_N' -- 일반상품
 		     ORDER BY O.DISP_ORD
 		) Z
@@ -256,8 +256,61 @@
 		ORDER BY DISP_ORD
 	</select>
 	
-	<!-- 상품 옵션2 목록-->
+	<!-- 상품 옵션1 목록 - 자사용 -->
+	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption1List */
+		SELECT *
+		FROM (
+		      SELECT G.GOODS_CD
+		           , G.SELF_GOODS_YN
+		           , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = IF(G.SELF_GOODS_YN ='Y', O.OPT_CD1, 'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
+		           , O.OPT_CD1
+		           , O.DISP_ORD
+		           , RANK() OVER(PARTITION BY O.GOODS_CD , O.OPT_CD1 ORDER BY O.DISP_ORD) ROWNUM
+		      FROM TB_GOODS G
+		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
+		                             AND O.DISP_YN = 'Y' 
+		      WHERE G.GOODS_CD =  #{goodsCd}
+		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
+		) A
+		WHERE ROWNUM = 1
+	</select>
+		
+	<!-- 상품 옵션2 목록  - 자사용-->
 	<select id="getGoodsOption2List" parameterType="Goods" resultType="GoodsStock">
+		/* TsfGoods.getGoodsOption2List */
+		SELECT GOODS_CD
+		     , OPT_CD
+		     , OPT_CD1
+		     , OPT_CD2
+		     , ADD_PRICE 
+		     , (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		             ELSE 0
+		        END ) AS STOCK_QTY
+		     , SOLDOUT_YN
+		     , DISP_ORD
+		FROM (
+		      SELECT O.GOODS_CD
+		           , O.OPT_CD
+		           , O.OPT_CD1
+		           , O.OPT_CD2
+		           , O.ADD_PRICE 
+		           , VS.CURR_STOCK_QTY AS STOCK_QTY
+		           , O.SOLDOUT_YN
+		           , O.DISP_ORD
+		           , (SELECT MIN_ORD_QTY FROM TB_GOODS WHERE GOODS_CD = O.GOODS_CD ) AS MIN_ORD_QTY
+		      FROM TB_OPTION O 
+		      INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
+		                          AND O.OPT_CD = VS.OPT_CD
+		      WHERE O.GOODS_CD = #{goodsCd}
+		      AND O.OPT_CD1 = #{colorCd}
+		      AND O.DISP_YN = 'Y'
+		     ) B
+		ORDER BY DISP_ORD
+	</select>
+	
+	<!-- 상품 옵션2 목록  - 자사용-->
+	<select id="getGoodsOption2List_ORG" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption2List */
 		SELECT GOODS_CD
 		     , OPT_CD
@@ -281,23 +334,14 @@
 		               , OPT_CD
 		               , OPT_CD1
 		               , OPT_CD2
-		               , STOCK_QTY
+		               , CURR_STOCK_QTY AS STOCK_QTY
 		               , SOLDOUT_YN
 		               , DISP_ORD
 		               , (SELECT MIN_ORD_QTY FROM TB_GOODS WHERE GOODS_CD = A.GOODS_CD ) AS MIN_ORD_QTY
-		          FROM (
-		                SELECT GOODS_CD
-		                     , OPT_CD
-		                     , OPT_CD1
-		                     , OPT_CD2
-		                     , CURR_STOCK_QTY AS STOCK_QTY
-		                     , SOLDOUT_YN
-		                     , DISP_ORD
-		                FROM VW_STOCK
-		                WHERE GOODS_CD = #{goodsCd}
-		                AND DISP_YN ='Y'
-		                AND OPT_CD2 IS NOT NULL
-		               ) A
+		          FROM VW_STOCK A
+		          WHERE GOODS_CD = #{goodsCd}
+		          AND COLOR = #{colorCd}
+		          AND DISP_YN = 'Y'
 		        ) B
 		     ) Z
 		WHERE 1 = 1
@@ -345,7 +389,7 @@
 	</select>
 		
 	<!-- 상품 이미지 정보 -->
-	<select id="getGoodsImgList" parameterType="String" resultType="GoodsImg">
+	<select id="getGoodsImgList" parameterType="Goods" resultType="GoodsImg">
 		/* TsfGoods.getGoodsImgList */
 		SELECT GOODS_CD
 		     , COLOR_CD
@@ -355,6 +399,7 @@
 		     , MOUSEOVER_IMG_YN
 		FROM TB_GOODS_IMG
 		WHERE GOODS_CD = #{goodsCd}
+		AND COLOR_CD = #{colorCd}
 		ORDER BY DISP_ORD
 	</select>
 	
@@ -456,17 +501,24 @@
 		           , A.PRMT_NM 
 		           , A.PRMT_GB 
 		           , A.DC_GB 
+		           , (CASE WHEN A.PRMT_GB = 'A' AND A.DC_GB = '1' THEN '즉시할인' 
+		                   WHEN A.PRMT_GB = 'A' AND A.DC_GB = '2' THEN '청구할인'
+		                   WHEN A.PRMT_GB = 'A' AND A.DC_GB = '3' THEN '청구할인'
+		                   ELSE '신용카드 무이자 혜택' END
+		              ) AS PRMT_GB_NM
 		           , A.LINK_URL 
 		           , A.NOTE 
 		           , B.CARD_PRMT_CDT_SQ 
-		           , B.MIN_PAY_AMT 
+		           , (B.MIN_PAY_AMT / 10000) AS MIN_PAY_AMT  -- 만원단위 
+		           , B.MAX_DC_AMT
 		           , B.MAX_NO_ITRT 
 		           , B.MIN_NO_ITRT 
-		           , B.DC_WAY 
+		           , B.DC_WAY
+		           , (CASE WHEN B.DC_WAY = 'G240_11' THEN '%' ELSE '원' END) AS DC_WAY_NM 
 		           , B.DC_VAL 
 		           , C.PRMT_TARGET_CD 
-		           , D.CD_NM 
-		           , RANK() OVER(PARTITION BY A.PRMT_GB, A.DC_GB ORDER BY A.CARD_PRMT_SQ , B.CARD_PRMT_CDT_SQ, C.PRMT_TARGET_CD DESC) RNUM
+		           , D.CD_NM AS PRMT_TARGET_NM
+		           , RANK() OVER(PARTITION BY A.PRMT_GB, A.DC_GB ORDER BY A.CARD_PRMT_SQ , B.CARD_PRMT_CDT_SQ, C.PRMT_TARGET_CD DESC) ROWNUM
 		      FROM TB_CARD_PROMOTION A
 		      INNER JOIN TB_CARD_PROMOTION_CONDITION B ON A.CARD_PRMT_SQ = B.CARD_PRMT_SQ
 		      INNER JOIN TB_CARD_PROMOTION_TARGET C ON B.CARD_PRMT_CDT_SQ = C.CARD_PRMT_CDT_SQ
@@ -490,7 +542,7 @@
 		      </if>
 		) A
 		<if test="rownum != null and rownum > 0 ">
-		WHERE RNUM = 1
+		WHERE ROWNUM = 1
 		</if>
 	</select>
 	
@@ -595,4 +647,22 @@
 		) Z
 	</select>
 	
+	<!-- 상품 사이즈 선택 시 재고수량 가져오기 -->
+	<select id="getGoodsStockQty"  parameterType="GoodsStock" resultType="int">
+		/* TsfGoods.getGoodsStockQty */
+		SELECT (CASE WHEN STOCK_QTY - MIN_ORD_QTY >= 0 THEN STOCK_QTY
+		             ELSE 0
+		        END ) AS STOCK_QTY
+		FROM ( 
+		    SELECT CASE WHEN A.SOLDOUT_YN = 'Y' THEN 0
+		                ELSE A.CURR_STOCK_QTY
+		           END AS STOCK_QTY
+		           , B.MIN_ORD_QTY
+		    FROM  VW_STOCK A
+		    INNER JOIN TB_GOODS B ON A.GOODS_CD = B.GOODS_CD
+		    WHERE A.GOODS_CD = #{goodsCd}
+		    AND A.OPT_CD = #{optCd}
+		) Z
+	</select>
+	
 </mapper>

+ 78 - 37
src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml

@@ -26,65 +26,67 @@
 	<!-- 적립예정 포인트조회-->
 	<select id="getExpectedPointInfo" parameterType="Point" resultType="Point">
 	/* TsfPoint.getExpectedPointInfo */
-		SELECT IFNULL(SUM(GV_PNT_AMT),0) AS expectedPntAmt
-		FROM   TB_CUST_POINT
+		SELECT IFNULL(SUM(PNT_AMT),0) AS expectedPntAmt
+		FROM   tb_cust_point_hst
 		WHERE  CUST_NO = #{custNo}
-		AND    EXP_BE_DT <![CDATA[>]]> NOW()
+		AND    PNT_UPLOAD_STAT = 'G070_10'
+		AND    PNT_AMT <![CDATA[>]]> 0
+		AND    SWITCH_DUE_DT <![CDATA[>]]> NOW()
 	</select>
 	
 	<!-- 한달 이내 소멸예정 포인트조회-->
 	<select id="getExtinctPointInfo" parameterType="Point" resultType="Point">
 	/* TsfPoint.getExtinctPointInfo */
-		SELECT IFNULL(SUM(PNT_AMT),0) AS expectedExpirePntAmt
-		FROM   tb_cust_point_hst
-		WHERE  PNT_UPLOAD_STAT = 'G070_10'
-		AND    CUST_NO = #{custNo}
-		AND    SWITCH_DUE_DT <![CDATA[>]]> NOW()
+		SELECT IFNULL(SUM(RM_PNT_AMT),0) AS expectedExpirePntAmt
+		FROM   TB_CUST_POINT
+		WHERE  CUST_NO = #{custNo}
+		AND    NOW()  BETWEEN DATE_ADD(EXP_BE_DT,INTERVAL -1 MONTH ) AND EXP_BE_DT;
 	</select>
 	
 	<!-- 적립내역 조회-->
 	<select id="getAccumulatePointList" parameterType="Point" resultType="Point">
 	/* TsfPoint.getAccumulatePointList */
-		SELECT
-		CASE   TCC.CD_NM
-		WHEN   '예정포인트적립' THEN '상품 구매'
-		WHEN   '상품평승인' THEN '리뷰'
-		WHEN   '온라인이벤트' THEN '이벤트'
-		WHEN   '기타' THEN '관리자'
+	SELECT
+		CASE   TCHP.OCCUR_GB
+		WHEN   'G069_12' THEN '상품 구매'
+		WHEN   'G069_20' THEN '리뷰'
+		WHEN   'G069_30' THEN '이벤트'
+		WHEN   'G069_90' THEN '관리자'
 		END AS OCCUR_GB ,	
-		CASE   TCC.CD  	
+		CASE   TCHP.OCCUR_GB  	
 		WHEN   'G069_12' THEN TG.GOODS_NM 
 		WHEN   'G069_20' THEN TG.GOODS_NM 
 		WHEN   'G069_30' THEN TCHP.OCCUR_DTL_DESC
 		WHEN   'G069_90' THEN TCHP.OCCUR_DTL_DESC
-		END AS OCCUR_DTL_DESC
-			 , TCHP.PNT_AMT AS pntAmt
-			 , TCHP.UPD_DT  AS pntUploadDt
+		END AS  OCCUR_DTL_DESC
+			  , TCHP.PNT_AMT AS pntAmt
+			  , TCHP.UPD_DT  AS pntUploadDt
 		FROM TB_CUST_POINT_HST TCHP
-		INNER JOIN TB_COMMON_CODE TCC
-		ON TCC.CD = TCHP.OCCUR_GB
-		INNER JOIN TB_ORDER_DETAIL TOD
+		LEFT JOIN TB_ORDER_DETAIL TOD
 		ON TOD.ORD_NO = TCHP.ORD_NO
-		INNER JOIN TB_GOODS TG 
+		AND TOD.ORD_DTL_NO = TCHP.ORD_DTL_NO
+		LEFT JOIN TB_GOODS TG 
 		ON TG.GOODS_CD = TOD.GOODS_CD 
 		WHERE TCHP.CUST_NO = #{custNo}
 		AND TCHP.OCCUR_GB IN ('G069_12','G069_20','G069_30','G069_90')
+		AND TCHP.PNT_UPLOAD_STAT = 'G070_30'
 		AND TCHP.PNT_AMT <![CDATA[>]]> 0
-		GROUP BY CD_NM, PNT_AMT, GOODS_NM, CD,OCCUR_DTL_DESC, TCHP.UPD_DT
-		ORDER BY TCHP.UPD_DT DESC;
+		AND DATE_FORMAT(TCHP.UPD_DT,'%Y%m') = #{searchDt}
+		GROUP BY TCHP.OCCUR_GB, PNT_AMT, GOODS_NM, TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT
+	ORDER BY TCHP.UPD_DT DESC
 	</select>
 	
 	<!-- 사용내역 조회-->
 	<select id="getUsePointList" parameterType="Point" resultType="Point">
 	/* TsfPoint.getUsePointList */
-		SELECT
-		CASE   TCC.CD_NM
-		WHEN   '포인트사용' THEN '구매 사용'
-		WHEN   '상품평승인취소' THEN '구매 취소'
-		WHEN   '기타' THEN '관리자'
-		WHEN   '포인트소멸' THEN '소멸'
+	SELECT
+		CASE   TCHP.OCCUR_GB
+		WHEN   'G069_10' THEN '구매 사용'
+		WHEN   'G069_21' THEN '구매 취소'
+		WHEN   'G069_90' THEN '관리자'
+		WHEN   'G069_99' THEN '소멸'
 		END AS OCCUR_GB ,	
-		CASE   TCC.CD  	
+		CASE   TCHP.OCCUR_GB	
 		WHEN   'G069_10' THEN TG.GOODS_NM 
 		WHEN   'G069_21' THEN TG.GOODS_NM 
 		WHEN   'G069_90' THEN TCHP.OCCUR_DTL_DESC
@@ -93,16 +95,55 @@
 			 , TCHP.PNT_AMT AS pntAmt
 			 , TCHP.UPD_DT  AS pntUploadDt
 		FROM TB_CUST_POINT_HST TCHP
-		INNER JOIN TB_COMMON_CODE TCC
-		ON TCC.CD = TCHP.OCCUR_GB
-		INNER JOIN TB_ORDER_DETAIL TOD
+		LEFT JOIN TB_ORDER_DETAIL TOD
 		ON TOD.ORD_NO = TCHP.ORD_NO
-		INNER JOIN TB_GOODS TG 
+		AND TOD.ORD_DTL_NO = TCHP.ORD_DTL_NO
+		LEFT JOIN TB_GOODS TG 
 		ON TG.GOODS_CD = TOD.GOODS_CD 
 		WHERE TCHP.CUST_NO = #{custNo}
 		AND TCHP.OCCUR_GB IN ('G069_10','G069_21','G069_90','G069_99')
+		AND TCHP.PNT_UPLOAD_STAT = 'G070_30'
 		AND 0 <![CDATA[>]]> TCHP.PNT_AMT
-		GROUP BY CD_NM, PNT_AMT, GOODS_NM, CD,OCCUR_DTL_DESC, TCHP.UPD_DT
-		ORDER BY TCHP.UPD_DT DESC;
+		AND DATE_FORMAT(TCHP.UPD_DT,'%Y%m') = #{searchDt}
+		GROUP BY  TCHP.OCCUR_GB, PNT_AMT, GOODS_NM,  TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT
+	ORDER BY TCHP.UPD_DT DESC;
+	</select>
+	
+	<!-- 전체내역 조회-->
+	<select id="getAllPointList" parameterType="Point" resultType="Point">
+		/* TsfPoint.getAllPointList */
+	SELECT
+		CASE   TCHP.OCCUR_GB
+		WHEN   'G069_10' THEN '구매 사용'
+		WHEN   'G069_12' THEN '상품 구매'
+		WHEN   'G069_20' THEN '리뷰'	
+		WHEN   'G069_21' THEN '구매 취소'
+		WHEN   'G069_30' THEN '이벤트'
+		WHEN   'G069_90' THEN '관리자'
+		WHEN   'G069_99' THEN '소멸'
+		END AS OCCUR_GB ,	
+		CASE   TCHP.OCCUR_GB
+		WHEN   'G069_10' THEN TG.GOODS_NM
+		WHEN   'G069_12' THEN TG.GOODS_NM 
+		WHEN   'G069_20' THEN TG.GOODS_NM 
+		WHEN   'G069_21' THEN TG.GOODS_NM
+		WHEN   'G069_30' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_90' THEN TCHP.OCCUR_DTL_DESC
+		WHEN   'G069_99' THEN TCHP.OCCUR_DTL_DESC
+		END AS OCCUR_DTL_DESC
+			 , TCHP.PNT_AMT AS pntAmt
+			 , TCHP.UPD_DT  AS pntUploadDt
+		FROM TB_CUST_POINT_HST TCHP
+		LEFT JOIN TB_ORDER_DETAIL TOD
+		ON TOD.ORD_NO = TCHP.ORD_NO
+		AND TOD.ORD_DTL_NO = TCHP.ORD_DTL_NO
+		LEFT JOIN TB_GOODS TG 
+		ON TG.GOODS_CD = TOD.GOODS_CD 
+		WHERE TCHP.CUST_NO = #{custNo}
+		AND TCHP.OCCUR_GB IN ('G069_10','G069_12','G069_20','G069_21','G069_30','G069_90','G069_99')
+		AND TCHP.PNT_UPLOAD_STAT = 'G070_30'
+		AND DATE_FORMAT(TCHP.UPD_DT,'%Y%m') = #{searchDt}
+		GROUP BY TCHP.OCCUR_GB, PNT_AMT, GOODS_NM, TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT
+	ORDER BY TCHP.UPD_DT DESC;
 	</select>
 </mapper>

+ 14 - 6
src/main/resources/config/application-locd.yml

@@ -56,9 +56,17 @@ download.path: /WIDE/workspace/files/data
 
 # PG
 pg:
-    nicepay:
-        merchantId: nictest00m
-        merchantKey: 33F49GnCMS1mFYlGXisbUDzVf2ATWCl9k3R++d5hDd3Frmuos/XLx8XhXpe+LDYAbpGKZYSwtlyyLOtS/8aD7A==
-        log.path: /WIDE/workspace/logs/wivis
-        account.cert.url: https://webapi.nicepay.co.kr/api/checkBankAccountAPI.jsp
-        vbank.refund.url: https://webapi.nicepay.co.kr/v2/api/merchant/vbank_refund.jsp
+    kcp:
+        log.dir: D:\\WIDE\\workspace\\webapps\\style24\\STYLE24\\style24.front\\src\\main\\webapp\\logs
+        gw:
+            url: testpaygw.kcp.co.kr
+            port: 8090
+        js.url: https://testpay.kcp.co.kr/plugin/payplus_web.jsp
+        server: false
+        site:
+            cd: T0007
+            key: 4Ho4YsuOZlLXUZUdOxM1Q7X__
+            name: KCP TEST SHOP
+        log.level: 3
+        module.type: 01
+        tx.mode: 0

+ 16 - 14
src/main/resources/config/application.yml

@@ -48,26 +48,28 @@ naver:
 
 #카카오 API
 kakao:
-    appId: 442702
-    appName: 아이스타일24
-    companyName: 예스이십사
-    nativeAppKey: 5d97db2ee36fa0e121d962b2531ae0c1
-    restApiKey: 46d601394bd887cbada3cf00fdddef54
-    javascriptKey: b3c9ee69171042c3637e8d714a4c8a75
-    adminKey: 7cc33b2ef96d785c4caf3376f9dc9254
-#    appId : 399207
-#    appName : 구축용 테스트앱
-#    companyName : 예스이십사
-#    nativeAppKey : f961e612e07b47aa2d1884714518a194
-#    restApiKey: b3955cef0328a09156c7e25f18552164
-#    javascriptKey : 06cab652ad5d25be2190388d11a88fa4
-#    adminKey : a25ca74dde640f3a63a8d8442fe35fcd
+#    appId: 442702
+#    appName: 아이스타일24
+#    companyName: 예스이십사
+#    nativeAppKey: 5d97db2ee36fa0e121d962b2531ae0c1
+#    restApiKey: 46d601394bd887cbada3cf00fdddef54
+#    javascriptKey: b3c9ee69171042c3637e8d714a4c8a75
+#    adminKey: 7cc33b2ef96d785c4caf3376f9dc9254
+    cid : TC0ONETIME
+    appId : 399207
+    appName : 구축용 테스트앱
+    companyName : 예스이십사
+    nativeAppKey : f961e612e07b47aa2d1884714518a194
+    restApiKey: b3955cef0328a09156c7e25f18552164
+    javascriptKey : 06cab652ad5d25be2190388d11a88fa4
+    adminKey : a25ca74dde640f3a63a8d8442fe35fcd
     addressApiRequestUrl : https://dapi.kakao.com/v2/local/search/address.json?page=1&query=
     login.callbackUrl: /signin/snsLoginCallback?snsType=KK
     tokenUrl: https://kauth.kakao.com/oauth/token
     userInfoUrl: https://kapi.kakao.com/v2/user/me
     authorizeUrl: https://kauth.kakao.com/oauth/authorize
     unlinkUrl : https://kapi.kakao.com/v1/user/unlink
+    paymentReadyUrl : https://kapi.kakao.com/v1/payment/ready
 
 # SPEEDY Image Upload
 speedy:

BIN
src/main/webapp/WEB-INF/lib/ConnectionKCP.jar


BIN
src/main/webapp/WEB-INF/lib/jPpcliE.jar


+ 5 - 0
src/main/webapp/WEB-INF/views/web/cart/cartListAjaxFormWeb.html

@@ -389,6 +389,11 @@
 <div class="modal fade od_pop opt_modify_pop" id="optModifyPop" tabindex="-1" role="dialog" aria-labelledby="optModifyLabel" aria-hidden="true"></div>
 <!-- //옵션변경 팝업 -->
 
+
+<!-- KCP PG TEST -->
+<form name="order_info" method="post" action="pp_cli_hub.jsp" >
+</form>
+
 <script th:inline="javascript">
 	let sumRealPayAmt = [[${order.sumRealPayAmt + order.totDelvFee}]];
 	let totDcAmt = [[${order.totDcAmt}]];

+ 2 - 2
src/main/webapp/WEB-INF/views/web/customer/JoinFormWeb.html

@@ -126,7 +126,7 @@
 					<div class="form_field">
 						<label class="input_label sr-only">휴대폰번호</label>
 						<div class="input_wrap form_full">
-							<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰번호" class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰번호" />
+							<input type="text" id="cellPhnno" name="cellPhnno" placeholder="휴대폰 인증 해주세요." class="form_control" minlength="10" maxlength="11" required="required" data-valid-type="numeric" data-valid-name="휴대폰" readonly="readonly"/>
 							<!-- case (휴대폰번호 형식이 맞지 않을경우,이미 가입되어있는 핸드폰번호일경우) -->
 							<div class="help_block">
 								<!-- 휴대폰번호 형식이 맞지 않을경우 -->
@@ -397,7 +397,7 @@
 		}
 	};
 
-	// 본인증 후 결과
+	// 본인증 후 결과
 	var fnInfoConfirmCallBack = function (result) {
 		// const $cellPhnno = $('#cellPhnno');
 		const $dupPhnno = $('#dupPhnno');

+ 1 - 1
src/main/webapp/WEB-INF/views/web/customer/JoinTypeFormWeb.html

@@ -51,7 +51,7 @@
 								</a>
 							</li>
 							<li>
-								<a href="javascript:void(0)">
+								<a href="javascript:void(0)" onclick="cfnLoginYes24();">
 									<i class="ico ico_snslogin yes24"></i>
 									<span>YES24</span>
 								</a>

+ 98 - 0
src/main/webapp/WEB-INF/views/web/goods/CardPrmtFormWeb.html

@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CardPrmtFormWeb.html
+ * @desc    : 카드 혜택안내
+ *============================================================================
+ * Wivismall
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.02   eskim        최초 작성
+ *******************************************************************************
+ -->
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header">
+			<h5 class="modal-title" id="bnfCardLabel">카드혜택</h5>
+		</div>
+		<div class="modal-body" th:if="${cardInfoList != null and !cardInfoList.empty}">
+			<div class="pop_cont">
+				<div class="benefit_blk">
+					<h6>할인혜택</h6>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="140">
+								<col width="290">
+								<col width="*">
+							</colgroup>
+							<tbody>
+								<tr th:each="cardInfo, status : ${cardInfoList}" th:if="${cardInfo.prmtGb == 'A' }">
+									<th th:text="${cardInfo.prmtTargetNm}">KB국민카드</th>
+									<td>
+										<div class="info_card">
+											<th:block th:if="${cardInfo.dcGb == '3'}">
+											<p th:text="${cardInfo.prmtNm}">5% 즉시할인</p>
+											<p th:text="${cardInfo.note}">할인</p>
+											</th:block>
+											<th:block th:unless="${cardInfo.dcGb == '3'}">
+											<p th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm + ' ' + cardInfo.prmtGbNm}">5% 즉시할인</p>
+											<p th:text="${cardInfo.minPayAmt + '만원 이상 구매 시 최대 ' + #numbers.formatInteger(cardInfo.maxDcAmt, 0,'COMMA') + '원 할인 '}">7만원 이상 구매 시 최대 5만원 할인</p>
+											</th:block>
+											
+										</div>
+									</td>
+									<td>
+										<th:block th:if="${not #strings.isEmpty(cardInfo.linkUrl)}"><a th:href="${cardInfo.linkUrl}" target="_blank" class="btn_more" >자세히보기</a></th:block>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+				</div>
+				<div class="benefit_blk">
+					<h6>무이자 할부</h6>
+					<div class="tbl type1">
+						<table>
+							<colgroup>
+								<col width="140">
+								<col width="*">
+							</colgroup>
+							<tbody>
+								<tr th:each="cardInfo, status : ${cardInfoList}" th:if="${cardInfo.prmtGb == 'B' }">
+									<th th:text="${cardInfo.prmtTargetNm}">KB국민카드</th>
+									<td>
+										<div class="info_card">
+											<p th:text="${cardInfo.minNoItrt + '~' + cardInfo.maxNoItrt + '개월 무이자'}">2~6개월 무이자</p>
+											<p th:text="${cardInfo.minPayAmt + '만원 이상 구매 시'}">5만원 이상 구매 시</p>
+										</div>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+				</div>
+				<th:block th:each="cardInfo, status : ${cardInfoList}" >
+				<div class="benefit_blk"  th:if="${cardInfo.prmtGb == 'B' and not #strings.isEmpty(cardInfo.note) and cardInfo.rownum ==  1}">
+					<th:block >
+					<h6>부분 무이자 할부</h6>
+					<th:block th:utext="${#strings.unescapeJava(#strings.escapeJava(cardInfo.note))}"></th:block>
+					<div class="info_txt">
+						<ul>
+							<li>무이자할부는 행사기간 동안 실 결제금액 기준으로 가능</li>
+							<li>법인, 체크, 기프트 카드는 부분 무이자 할부 제외</li>
+						</ul>
+					</div>
+					</th:block>
+				</div>
+				</th:block>
+			</div>
+		</div>
+	</div>
+</div>	
+<a href="#close-modal" rel="modal:close" onclick="cfCloseLayer('layer_card_benefit')" class="close-modal">Close</a>
+</html>

+ 469 - 127
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -54,6 +54,22 @@
 							</ul>
 						</div>
 					</div>
+					<form name="cartForm" id="cartForm" method="post">
+					<input type="hidden" name="mode">
+					<input type="hidden" name="goodsCd" th:value="${params.goodsCd}" />
+					<input type="hidden" name="contentsLoc" th:value="${params.contentsLoc}" />
+					<input type="hidden" name="ithrCd"  th:value="${params.ithrCd}" />
+					<input type="hidden" name="planDtlSq" th:value="${params.planDtlSq}" />
+					<input type="hidden" name="optCd" />
+					<input type="hidden" name="optCd1" />
+					<input type="hidden" name="optCd2" />
+					<input type="hidden" name="addPrice" />
+					<input type="hidden" name="ordQty" />
+					<input type="hidden" name="stock" />
+					<input type="hidden" name="minOrdQty"/>
+					<input type="hidden" name="maxOrdQty"/>
+					<input type="hidden" name="goodsType" th:value="${goodsInfo.goodsType}"/>
+					<input type="hidden" name="selfGoodsYn" th:value="${goodsInfo.selfGoodsYn}"/>
 					<div class="area_desc">
 						<div class="desc_wrap">
 							<div class="timer_box">
@@ -69,34 +85,34 @@
 							</div>
 							<div class="descript_box">
 								<div class="desc_top">
-									<a href="" class="btn_brand">NBA 키즈</a>
+									<a href="javascript:void(0);" class="btn_brand" th:onclick="cfnGoToBrandMain([[${goodsInfo.brandGroupNo}]])" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</a>
 									<button type="button" class="itemShare">상품 공유하기</button>
-									<button type="button" class="itemLike">관심상품 추가</button>
+									<button type="button" class="itemLike" th:classappend="${wishYn == 'Y'}? 'active' : ''">관심상품 추가</button>
 								</div>
 								<div class="desc_info">
 									<div class="title_blk">
-										<span class="codenumber">
+										<span class="codenumber" th:text="${goodsInfo.goodsCd}">
 											N204TJ112P
 										</span>
-										<span class="comment">
+										<span class="comment" th:text="${goodsInfo.goodsTnm}">
 											#가을 느낌 물씬!
 										</span>
-										<span class="name">
+										<span class="name" th:text="${goodsInfo.goodsFullNm}">
 											유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업
 										</span>
 									</div>
 									<div class="price_blk">
-										<span class="sale_percent">
-											30%
+										<span class="sale_percent" th:if="${goodsInfo.dcRate > 0}" th:text="|${goodsInfo.dcRate}%|">
+											5%
 										</span>
-										<span class="sale_price">
-											<em>134,100</em>원
+										<span class="sale_price" >
+											<em th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}">134,100</em>원
 										</span>
-										<del class="org_price">
-											149,000원
+										<del class="org_price" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" >
+											<em th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</em>
 										</del>
 										<span class="save_point">
-											스타일포인트 9,999P 적립예정
+											스타일포인트 <th:block th:text="${#numbers.formatInteger(goodsInfo.pntAmt, 0,'COMMA')}"></th:block>P 적립예정
 										</span>
 										<button type="button" id="btn_saleCoupon_pop" class="btn btn_primary btn_sm btn_coupon"><span>쿠폰받기</span></button>
 									</div>
@@ -105,114 +121,69 @@
 									<p>예약판매 상품 -2020.12.30 출고예정</p>
 								</div>
 							</div>
-							<div class="benefit_box">
+							<div class="benefit_box" th:if="${cardInfoList != null and !cardInfoList.empty}" >
 								<dl>
 									<div class="bnf_shopping">
 										<dt>쇼핑혜택</dt>
-										<dd>
-											<span>최대 15% 쿠폰 할인</span> 
-											<span>99개 이상 구매 시 9,999,999원 할인</span>
-											<span>미니언즈 우산 증정</span>
-											<button type="button" id="btn_bnfShopping_pop" class="btn_popup"><span>자세히</span></button>
-										</dd>
+											<!------------ 색상 강조 텍스트 영역 <em class="c_primary"></em> 사용요청 ------------>
+											<dd>
+												<span>최대 <em class="c_primary">15%</em> 쿠폰 할인</span> 
+												<span><em class="c_primary">99개</em> 이상 구매 시 <em class="c_primary">9,999,999원</em> 할인</span>
+												<span>미니언즈 우산 증정</span>
+												<button type="button" id="btn_bnfShopping_pop" class="btn_popup"><span>자세히</span></button>
+											</dd>
 									</div>
-									<div class="bnf_card">
+									<div class="bnf_card" th:if="${cardInfoList != null and !cardInfoList.empty}">
 										<dt>카드혜택</dt>
 										<dd>
-											<span>국민카드 5% 즉시할인</span>
-											<span>신용카드 무이자 혜택</span>
-											<button type="button" id="btn_bnfCard_pop" class="btn_popup"><span>자세히</span></button>
+											<th:block th:each="cardInfo, status : ${cardInfoList}">
+											<span th:if="${cardInfo.prmtGb == 'A' and cardInfo.dcGb != '3'}"><th:block th:text="${cardInfo.prmtTargetNm}"></th:block> <em class="c_primary"><th:block th:text="${#numbers.formatInteger(cardInfo.dcVal, 0,'COMMA')+ cardInfo.dcWayNm}"></th:block></em> <th:block th:text="${cardInfo.prmtGbNm}"></span>
+											<span th:if="${cardInfo.prmtGb == 'A' and cardInfo.dcGb == '3'}" th:text="${cardInfo.prmtNm}">프로모션명</span>
+											<span th:if="${cardInfo.prmtGb == 'B'}">신용카드 무이자 혜택</span>
+											</th:block>
+											<button type="button" id="btn_bnfCard_pop" class="btn_popup" onclick="cfCardInfo();return false;"><span>자세히</span></button>
 										</dd>
 									</div>
 								</dl>
 							</div>
 							<div class="option_box">
-								<div class="opt_color">
+								<th:block th:if="${goodsInfo.selfGoodsYn =='Y' }">
+								<div class="opt_color"  th:if="${goodsOption1List != null and !goodsOption1List.empty}" >
 									<div class="opt_header">
 										<span class="title">컬러</span>
-										<span class="color">그레이</span>
+										<span class="color" th:text="${goodsInfo.colorNm}">그레이</span>
 									</div>
-									<ul>
-										<li>
-											<a href="" class="on">  <!-- 해당 컬러 상품페이지로 이동 -->
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="그레이">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="베이지">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="그린">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="핑크">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="민트">
-											</a>
-										</li>
-										<li>
-											<a href="">
-												<img src="/images/pc/thumb/tmp_cartColor1.jpg" alt="블랙">
+									<ul >
+										<li th:each="goodsOption1, status : ${goodsOption1List}">
+											<a href="javascript:void(0);" th:class="${params.colorCd == goodsOption1.optCd1}? 'on':''" th:onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], [[${goodsOption1.optCd1}]])">  <!-- 해당 컬러 상품페이지로 이동 -->
+												<img th:src="${imgGoodsUrl+'/'+goodsOption1.sysImgNm}" alt="">
 											</a>
 										</li>
 									</ul>
 								</div>
-								<div class="opt_size">
+								<div class="opt_size"  th:if="${goodsOption2List != null and !goodsOption2List.empty}" >
 									<div class="opt_header">
 										<span class="title">사이즈</span>
 										<span class="size">
-											<em>95</em>
-											<em>(+1,000원)</em>
+											<em id="selectOptCd1"></em>
+											<em id="selectOptCd1addPrice"></em>
 										</span>
 										<button type="button" id="btn_infoSize_pop" class="btn_popup"><span>사이즈정보</span></button>
 									</div>
 									<div class="form_field">
-										<div>
+										<!-- <div>
 											<input type="radio" name="rdi-optsize" id="rdi-optsize1" value="" checked="">
 											<label for="rdi-optsize1"><span>90</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize2" value="" disabled="">
-											<label for="rdi-optsize2"><span>95</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize3" value="">
-											<label for="rdi-optsize3"><span>100</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize4" value="">
-											<label for="rdi-optsize4"><span>105</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize5" value="">
-											<label for="rdi-optsize5"><span>110</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize6" value="">
-											<label for="rdi-optsize6"><span>115</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize7" value="">
-											<label for="rdi-optsize7"><span>free</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize8" value="">
-											<label for="rdi-optsize8"><span>size1</span></label>
-										</div>
-										<div>
-											<input type="radio" name="rdi-optsize" id="rdi-optsize9" value="">
-											<label for="rdi-optsize9"><span>size2</span></label>
+										</div> -->
+										<div  th:each="goodsOption2, status : ${goodsOption2List}">
+											<input type="radio" name="rdi-optsize"  th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
+													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd=${goodsOption2.optCd}">
+											<label th:for="${goodsInfo.goodsCd + '-'+ goodsInfo.colorCd + '-' +goodsOption2.optCd2}"><span th:text="${goodsOption2.optCd2}" th:onclick="jfViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
 										</div>
 									</div>
 								</div>
+								</th:block>
+								<th:block th:if="${goodsInfo.selfGoodsYn =='N' }">
 								<div class="opt_select">
 									<form class="form_wrap">
 										<div class="form_field">
@@ -238,12 +209,12 @@
 												</div>
 											</div>
 										</div>
-										<div class="form_field">
+										<!-- <div class="form_field">
 											<div class="select_custom item_opt2" disabled="">
 												<div class="combo">
 													<div class="select">선택</div>
 													<ul class="list">
-														<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+														선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가 
 														<li class="selected">선택</li> 
 														<li>상품옵션11</li>
 														<li>상품옵션12</li>
@@ -260,15 +231,16 @@
 													</ul>
 												</div>
 											</div>
-										</div>
+										</div> -->
 									</form>
-								</div>					  
+								</div>
+								</th:block>
 								<!-- 해당 상품 품절시 노출 -->
 								<div class="info_restock">
 									<a href="" id="btn_pushRestock_pop" class="btn_popup">재입고 시 알림을 받아보세요</a>
 								</div>
 								<!-- //해당 상품 품절시 노출 -->
-								<div class="opt_result">
+								<!-- <div class="opt_result">
 									<div class="result_item">
 										<div class="opt_header">
 											<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
@@ -299,41 +271,44 @@
 										</div>
 										<button type="button" class="btn_delete_item"><span>삭제</span></button>
 									</div>
-								</div>
+								</div> -->
 								<div class="opt_count">
 									<div class="opt_header">
 										<span class="title">수량</span>
 									</div>
 									<div class="number_count">
-										<span class="minus"><em class="sr-only">감소</em></span>
-										<input type="text" name="" maxlength="3" style="ime-mode:disabled" value="1">
-										<span class="plus"><em class="sr-only">추가</em></span>
+										<span class="minus" onclick="jfAdjustOrderEa(this);" adjust="-"><em class="sr-only">감소</em></a></span>
+										<input type="text" name="cea" maxlength="3" style="ime-mode:disabled" th:value="${goodsInfo.minOrdQty}" onblur="jfChangeOrderEa(this)" data-valid-type="numeric">
+										<input type="hidden" name="coption" value=""   th:attr="price=${goodsInfo.currPrice}">
+										<span class="plus" onclick="jfAdjustOrderEa(this);" adjust="+"><em class="sr-only">추가</em></span>
 									</div>
 								</div>
 							</div>
 							<div class="price_box">
 								<p class="number">
-									총&nbsp;<span>99</span>개
+									총&nbsp;<span id="goodsTotalQty">0</span>개
 								</p>
 								<p class="price">
 									<span>
-										99,999,999<em>원</em>
+										<b id="goodsTotalPrice">0</b><em>원</em>
 									</span>
 								</p>
 							</div>
 							<div class="btn_box">
 								<div class="btn_group_block ui_row">
+								<th:block  th:if="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_6">
-										<button id="btn_add_cart" class="btn btn_dark btn_block"><span>쇼핑백</span></button>
+										<button id="btn_add_cart" class="btn btn_dark btn_block" onclick="jfAddCart('C');"><span>쇼핑백</span></button>
 									</div>
 									<div class="ui_col_6">
-										<button class="btn btn_primary btn_block" id=""><span>바로구매</span></button>
+										<button class="btn btn_primary btn_block" onclick="jfAddCart('O');"><span>바로구매</span></button>
 									</div>
-								</div>
-								<div class="btn_group_block ui_row">
+								</th:block>
+								<th:block  th:unless="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_12">
 										<button class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
 									</div>
+								</th:block>
 								</div>
 							</div>
 							<div class="npay_box">
@@ -349,7 +324,7 @@
 													<span class="star">
 														<em class="progbar" style="width:86%;"></em> <!-- 평점 style로 표기 -->
 													</span>
-													<span class="score">4.3점</span>
+													<span class="score"><em>4.3</em>점</span>
 												</div>
 											</a>
 										</div>
@@ -398,6 +373,7 @@
 							</div>
 						</div>
 					</div>
+				</form>	
 				</div>
 			</div>
 		</div>
@@ -990,7 +966,7 @@
 												<div class="li_item">
 													<ul>
 														<li>
-															<div class="item_prod">
+															<div class="item_prod unable"> <!-- 판매불가 상품에 unable 추가 -->
 																<div class="item_state">
 																	<a href="#none" class="itemLink">
 																		<div class="itemPic">
@@ -1378,6 +1354,172 @@
 			</div>
 		</div>
 		<!-- // STYLE24의 스타일링 추천 -->
+		<!-- 브랜드 추천상품 -->
+			<div class="content wide pd_brand">
+				<div class="cont_head">
+					<h3 class="subH1 t_c mb40"><span>NIKE</span> 추천상품</h3>
+				</div>
+				<div class="cont_body">
+					<!-- CONT-BODY -->
+					<div class="area_slider">
+						<div class="swiper-container">
+							<div class="swiper-wrapper">
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+								<div class="swiper-slide">
+									<div class="item_prod">
+										<div class="item_state">
+											<a href="#none" class="itemLink">
+												<div class="itemPic">
+													<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdRelate1.jpg">
+													<button type="button" class="itemLike">관심상품 추가</button>
+												</div>
+												<p class="itemBrand">BRAND NAME1</p>
+												<div class="itemName">남성 로고 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건 자카드 방풍 패딩 스웨터 가디건</div>
+												<p class="itemPrice">80,100
+													<span class="itemPrice_original">89,000</span>
+													<span class="itemPercent">10%</span>
+												</p>
+											</a>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+						<!-- Add Pagination -->
+						<div class="swiper-pagination"></div>
+						<!-- Add Arrows -->
+						<div class="swiper-button-next"></div>
+						<div class="swiper-button-prev"></div>					
+					</div>
+					<!-- // CONT-BODY -->
+				</div>
+			</div>
+			<!-- // 브랜드 추천상품 -->
 		<!-- 이 상품과 비슷한 상품 -->
 		<div class="content wide pd_relate">
 			<div class="cont_head">
@@ -1730,7 +1872,7 @@
 	<!-- //쇼핑혜택 팝업 -->
 
 	<!-- 카드혜택 팝업 -->
-	<div class="modal fade pd_pop bnf_card_pop" id="bnfCardPop" tabindex="-1" role="dialog" aria-labelledby="bnfCardLabel" aria-hidden="true">
+<!-- 	<div class="modal fade pd_pop bnf_card_pop" id="bnfCardPop" tabindex="-1" role="dialog" aria-labelledby="bnfCardLabel" aria-hidden="true">
 		<div class="modal-dialog" role="document">
 			<div class="modal-content">
 				<div class="modal-header">
@@ -1840,7 +1982,7 @@
 				</div>
 			</div>
 		</div>
-	</div>	
+	</div>	 -->
 	<!-- //카드혜택 팝업 -->
 
 	<!-- 사이즈정보 팝업 -->
@@ -2875,6 +3017,10 @@
 						<div class="select_blk">
 							<h6>옵션 선택</h6>
 							<div class="opt_select">
+								<div class="opt_header">
+											<span class="title">옵션</span>
+											<button type="button" id="btn_infoSize_pop" class="btn_popup"><span>사이즈정보</span></button>
+										</div>
 								<form class="form_wrap">
 									<div class="form_field">
 										<div class="select_custom item_opt3">
@@ -3234,7 +3380,7 @@
 		//상품 대표설명 > 우측 상품정보 
 		/* 1차 옵션선택 후 2차 옵션 활성화 */
 		var opt_selecter01 = new sCombo('.opt_select .select_custom.item_opt1');
-		var opt_selecter01 = new sCombo('.opt_select .select_custom.item_opt2');
+		var opt_selecter02 = new sCombo('.opt_select .select_custom.item_opt2');
 		$('.opt_select .select_custom .combo .list > li').click(function(e) {
 			$(this).parents('.form_field').next('.form_field').find('.select_custom').attr('disabled', false);
 			return false;
@@ -3267,20 +3413,8 @@
 		setInterval(function() { promotionTimer(); }, 1000);
 
 		/* 상품옵션변경 팝업 > 수량조절 */
-		$(document).on('click','.option_box .opt_count .number_count .minus',function(e){
-			var $input = $(this).parent().find('input');
-			var count = parseInt($input.val()) - 1;
-			count = count < 1 ? 1 : count;
-			$input.val(count);
-			$input.change();
-			return false;
-		}).on('click','.option_box .opt_count .number_count .plus',function(e){
-			var $input = $(this).parent().find('input');
-			$input.val(parseInt($input.val()) + 1);
-			$input.change();
-			return false;
-		});
-
+//		
+		
 		//스타일링 추천 picker	
 		$(document).on('mouseenter','.pd_recommend .area_slider .item_picker button',function(e){
 			$(this).parents('.item_picker').find('.pick_descr').show();
@@ -3319,6 +3453,21 @@
 			},
 		});  
 
+		//슬라이드 - 브랜드 추천상품
+		var relateItemSwiper = new Swiper('.pd .pd_brand .area_slider .swiper-container', {
+			slidesPerView: 5,
+			spaceBetween: 20,
+			navigation: {
+				nextEl: '.pd_brand .swiper-button-next',
+				prevEl: '.pd_brand .swiper-button-prev',
+			},
+			pagination: {
+				el: '.pd_brand .swiper-pagination',
+				clickable: true,
+			},
+		});  
+
+		
 		//슬라이드 - 이 상품과 함께 본 상품 
 		var otherItemSwiper = new Swiper('.pd .pd_clickother .area_slider .swiper-container', {
 			slidesPerView: 5,
@@ -3386,6 +3535,12 @@
 			});
 		};
 
+		//팝업 - 공통 닫기 sample
+		$(document).on('click','.modal a.close-modal',function(e){
+			$(".modal").modal("hide");
+			return false;
+		});
+		
 		//팝업 - 쿠폰받기
 		$(document).on('click','#btn_saleCoupon_pop',function(e){
 			$("#saleCouponPop").modal("show"); //할인쿠폰받기
@@ -3400,10 +3555,11 @@
 		});
 
 		//팝업 - 카드혜택 > 자세히보기
-		$(document).on('click','#btn_bnfCard_pop',function(e){
-			$("#bnfCardPop").modal("show");
+		/* $(document).on('click','#btn_bnfCard_pop',function(e){
+			//$("#bnfCardPop").modal("show");
+			cfCardInfo();
 			return false;
-		});
+		}); */
 
 		//팝업 - 사이즈정보
 		$(document).on('click','#btn_infoSize_pop',function(e){
@@ -3536,6 +3692,192 @@
 		});
 
 	});
+	
+	//사이즈 클릭시
+	var jfViewStock = function(obj, goodsCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+		let $obj = $(obj);
+
+		var $target = $obj.parent().parent().children('input[name="rdi-optsize"]');
+		$target.prop("checked",true);
+		var addPrice  = $target.attr("addPrice");
+		var optCd  = $target.attr("optCd");
+		$("#selectOptCd1").html(optCd2);
+		if (Number(addPrice) > 0) $("#selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
+		$("#cartForm  input[name=optCd]").val(optCd);
+		$("#cartForm  input[name=optCd1]").val(optCd1);
+		$("#cartForm  input[name=optCd2]").val(optCd2);
+		$("#cartForm  input[name=addPrice]").val(addPrice);
+		$("#cartForm  input[name=ordQty]").val("");
+		var selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+
+		var maxCnt = maxOrdQty;
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		params.optCd = optCd;
+		params.optCd1 = optCd1;
+		params.optCd2 = optCd2;
+		params.selfGoodsYn = selfGoodsYn;
+
+		$.get("/goods/detail/ajaxGoodsStockQty", $.param(params), function(result) {
+			var itemCnt = eval(result); //해당 아이템에 선택되어진 사이즈의 수량
+
+			if (maxCnt > itemCnt) {
+				maxCnt = itemCnt;
+			}
+
+			if (minOrdQty > itemCnt) {
+				$target.prop("disabled", true);
+			}else{
+				$("#cartForm  input[name=ordQty]").val(minOrdQty);
+				$("#cartForm  input[name=maxOrdQty]").val(maxCnt);
+				$("#cartForm  input[name=minOrdQty]").val(minOrdQty);
+				$("#cartForm  input[name=cea]").val(minOrdQty);
+				$("#cartForm  input[name=cea]").attr("readonly",false);
+				$("#cartForm  input[name=stock]").val(itemCnt);
+
+				jfSetTotalPrice();
+			}
+
+		}, "text");
+	}
+	
+	// 수량 변경 클릭
+	var jfAdjustOrderEa = function(obj) {
+
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return false;
+			}
+		}else{
+			// 세트작업시 작업요망 eskim
+			/* var targetSize=$('.sizelist').length;	//구성품 갯수;
+			var itemSize = $('.option').find('.item').find('input[type=radio]:checked').length;	//사이즈 선택 상품수
+			if (targetSize > itemSize){
+				mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
+				return false;
+			} */
+		}
+
+		var $obj = $(obj);
+		var $target = $obj.parent().children('input[name="cea"]');
+		var minOrdQty = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		var ea =parseInt($target.val());
+
+		if ($obj.attr('adjust') == '-') --ea;
+		else ++ea;
+
+		//var maxOrdQty = $("#cartForm  input[name=maxOrdQty]").val();
+
+		//if (maxOrdQty && ea > maxOrdQty) ea = maxOrdQty;
+		if (ea.toString().length > parseInt($target.attr('maxlength'))) --ea;
+		if (ea < 1) ea = minOrdQty;
+
+		$target.val(ea);
+
+		jfChangeOrderEa();
+	}
+
+	//옵션 갯수 변경
+	var jfChangeOrderEa = function() {
+
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return false;
+			}
+		}else{
+			// 세트작업시 작업요망 eskim
+			/* var targetSize=$('.sizelist').length;	//구성품 갯수;
+			var itemSize = $('.option').find('.item').find('input[type=radio]:checked').length;	//사이즈 선택 상품수
+			if (targetSize > itemSize){
+				mcxDialog.alert("구성상품들의 사이즈를 선택하세요.");
+				return false;
+			} */
+		}
+
+		var f = document.cartForm;
+		var ea = parseInt($("#cartForm  input[name=cea]").val());
+		var buymin = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		var buymax = parseInt($("#cartForm  input[name=maxOrdQty]").val());
+		var alertMsg = '';
+		if (ea < buymin) {
+			alertMsg ="최소 주문 가능 수량은 "+buymin+"개 입니다.";
+			ea = buymin;
+		}
+
+		if (ea > buymax) {
+			alertMsg = "최대 주문 가능 수량은 "+buymax+"개 입니다.";
+			ea = buymax;
+		}
+
+		$("#cartForm  input[name=cea]").val(ea);
+		$("#cartForm  input[name=ordQty]").val(ea);
+
+		if (alertMsg != ''){
+			mcxDialog.alert(alertMsg);
+			//return;
+		}
+
+		jfSetTotalPrice();
+
+	}
+	
+	//합계 계산
+	var jfSetTotalPrice = function() {
+		var f = document.cartForm;
+
+		var totalEa = 0;
+		var totalPrice = 0;
+
+		$('input[name="cea"]').each(function() {
+			var ea = parseInt($(this).val());
+			var addPrice = parseInt($("#cartForm  input[name=addPrice]").val());
+			var goodsPrice = parseInt($(this).parent().find('input[name="coption"]').attr('price'));
+
+			totalEa += ea;
+			if (goodsPrice > 0) {
+				totalPrice += ((goodsPrice+addPrice) * ea);
+			}
+		});
+
+		$('#goodsTotalQty').html(totalEa.addComma());
+		$('#goodsTotalPrice').html(totalPrice.addComma());
+		
+	}
+	
+	//장바구니담기
+	var jfAddCart = function(btnType){
+		var params = [];
+		var goodsType = $("#cartForm  input[name=goodsType]").val();
+
+		if (goodsType == 'G056_N'){
+			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
+				
+				return;
+			}
+		
+			var obj = new Object();
+			obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
+			obj.optCd = $("#cartForm  input[name=optCd]").val();
+			obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
+			obj.goodsType = $("#cartForm  input[name=goodsType]").val();
+			//obj.dealGoodsCd = $("#cartForm  input[name=goodsType]").val();
+			obj.cartGb = btnType;
+			obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
+			obj.ithrCd =$("#cartForm  input[name=ithrCd]").val();
+			obj.contentsLoc =$("#cartForm  input[name=contentsLoc]").val();
+			obj.planDtlSq =$("#cartForm  input[name=planDtlSq]").val();
+			params.push(obj);
+
+		}else if (goodsType == 'G056_S'){  //수정요
+			alert("작업필요");
+		}
+		// 장바구니담기
+		cfnAddCart(params);
+	}
+
+	
 /*]]>*/
 </script>
 </th:block>

+ 139 - 39
src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html

@@ -37,17 +37,22 @@
 							</div>
 							<div class="my_tab coupon_tab">
 								<ul>
-									<li><a href="javascript:void(0);" id="fnSetSearchFullHistory">전체내역</a></li>
-									<li><a href="javascript:void(0);" class="on" id="fnSetSearchCollectHistory">적립내역</a></li>
-									<li><a href="javascript:void(0);" id="fnSetSearchUsedHistory">사용내역</a></li>
+									<li><a href="javascript:void(0);" id="SearchFullHistory">전체내역</a></li>
+									<li><a href="javascript:void(0);" id="SearchCollectHistory">적립내역</a></li>
+									<li><a href="javascript:void(0);" id="SearchUsedHistory">사용내역</a></li>
 								</ul>
+<!-- 								<div class="form_field"> -->
+<!-- 									<select id="searchDt" name="searchDt" onchange="fnSearchDate(this);"> -->
+<!-- 									</select>  -->
+<!-- 								</div> -->
 								<div class="form_field">
-									<select id="mounth" name="searchDt">
-										<option value="hide">2020년 10월</option>
-										<option value="Test_SELECT_OPTION_1" rel="icon-temperature">2020년 9월</option>
-										<option value="Test_SELECT_OPTION_2">2020년 8월</option>
-										<option value="Test_SELECT_OPTION_3">2020년 7월</option>
-									</select> 
+									<div class="select_custom type1">
+										<div class="combo">
+											<div class="select"></div> <!-- 셀렉박스 -->
+												<ul id="searchDt" class="list" style="width:200px; margin:0 auto">
+												</ul>
+										</div>
+									</div>
 								</div>
 							</div>
 							<div class="order_list">
@@ -64,7 +69,7 @@
 												<tr>
 													<th>사유</th>
 													<th>내용</th>
-													<th>차감</th>
+													<th id="plusMinus"></th>
 													<th>일자</th>
 												</tr>
 											</thead>
@@ -77,32 +82,122 @@
 						</div>
 					</div>
 <script th:inline="javascript">
+
+		// select 날짜 생성
+		var date = new Date();
+		var year = date.getFullYear();
+		var month = date.getMonth() + 1;
+		
+		var oneYearAgo = year -1;
+		var yearMonth = year;
+		var oneYearLater = year +1;
+		
+		for(var i = 1;i <= 12; i++){
+			if(i < 10 && i != month){
+				$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ yearMonth + "" + 0 + i +"'>"+ yearMonth + "년" + " " + i + "월" +"</li>");
+			}
+			else if(i < 10 && i == month){
+				$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ yearMonth + "" + 0 + i +"'>" + yearMonth + "년" + " " + i + "월" +"</li>");
+			}
+			else if(i > 9 && i != month){
+				$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ yearMonth + "" + i +"'>"+ yearMonth + "년" + " " + i + "월" +"</li>");
+			}
+			else if(i > 9 && i == month){
+				$("#searchDt").append("<li onclick='fnChangeDate(this);' class='selected' value='"+ yearMonth + "" + i +"'>"+ yearMonth + "년" + " " + i + "월" +"</li>");
+			}
+		}
+		
+	// 날짜변경 이벤트
+	var fnChangeDate = function(parm) {
+		
+		let url = '/mypage/allpoint/list';		
+		let data = {};
+				
+		data.searchDt = $('#searchDt').find('.selected').val();
+		console.log(data);
+
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
+			
+			if($("#SearchFullHistory").hasClass("on")){
+				$("#SearchFullHistory").click();
+			}else if($("#SearchCollectHistory").hasClass("on")){
+				$("#SearchCollectHistory").click();
+			}else if($("#SearchUsedHistory").hasClass("on")){
+				$("#SearchUsedHistory").click();
+			}
+		});
+	}
+
+		
 	// 전체내역 조회
-	$("#fnSetSearchFullHistory").click(function(){
-		// Class제거 추가
-		$("#fnSetSearchCollectHistory").removeClass("on");
-		$("#fnSetSearchUsedHistory").removeClass("on");
-		$("#fnSetSearchFullHistory").addClass("on");
+	$("#SearchFullHistory").click(function(){
+		// class제거 추가
+		$("#SearchCollectHistory").removeClass("on");
+		$("#SearchUsedHistory").removeClass("on");
+		$("#SearchFullHistory").addClass("on");
+		$("#plusMinus").text("증감/차감");
+		
+		let data = {};
 		
-		// 적립내역 + 사용내역(sum)으로 표시
+		data.searchDt = $('#searchDt').find('.selected').val();
 		
+		console.log(data);
+		var jsonData = JSON.stringify(data);
+		
+		$.ajax(
+				{
+					type 	 : "POST",
+					data	 : jsonData,
+					url 	 : '/mypage/allpoint/list',
+					contentType: 'application/json',
+  					dataType : 'json',
+					success  : function(result){
+						PointAllListInfo(result);
+					}
+				}
+		)
 	});
 	
+
+	
+	function PointAllListInfo(result) {
+		
+		let allPointList = result.allPointList;
+		
+		let tmtbHtml = "";
+		for(let i=0; i<allPointList.length; i++){
+			let point = allPointList[i];
+			tmtbHtml +='<tr>';
+			tmtbHtml +='<td>'+ point.occurGb + '</td>';
+			tmtbHtml += '<td class="t_l pl40">'+ point.occurDtlDesc + '</td>';
+			if(point.pntAmt > 0){
+				tmtbHtml += '<td class="c_blue">'+ point.pntAmt + '</td>';
+			}else{
+				tmtbHtml += '<td class="c_primary">'+ point.pntAmt + '</td>';
+			}
+			tmtbHtml += '<td>'+ point.pntUploadDt + '</td>';
+			tmtbHtml += '</tr>';
+		}
+		$("#pointAjaxList").html(tmtbHtml);
+	}
+
 	
 	// 적립내역 조회
-	$("#fnSetSearchCollectHistory").click(function(){
+	$("#SearchCollectHistory").click(function(){
 		// Class제거 추가
-		$("#fnSetSearchFullHistory").removeClass("on");
-		$("#fnSetSearchUsedHistory").removeClass("on");
-		$("#fnSetSearchCollectHistory").addClass("on");
+		$("#SearchFullHistory").removeClass("on");
+		$("#SearchUsedHistory").removeClass("on");
+		$("#SearchCollectHistory").addClass("on");
 		
 		// 적립내역 포인트 블루
 		$("#pntAmt").removeClass("c_primary");
 		$("#pntAmt").addClass("c_blue");
+		$("#plusMinus").text("증감");
 		
 		let data = {};
 		
-		data.searchDt = $('select[name=searchDt]').val();
+		data.searchDt = $('#searchDt').find('.selected').val();
 		
 		let jsonData = JSON.stringify(data);
 		
@@ -114,13 +209,13 @@
 					contentType: 'application/json',
   					dataType : 'json',
 					success  : function(result){
-						fnPointCollectListInfo(result);
+						PointCollectListInfo(result);
 					}
 				}
 		)
 	});
 	
-	function fnPointCollectListInfo(result) {
+	function PointCollectListInfo(result) {
 		
 		let pointList = result.accumulatePointList;
 		
@@ -137,21 +232,21 @@
 		$("#pointAjaxList").html(tmtbHtml);
 	}
 	
-	
 	// 사용내역 조회
-	$("#fnSetSearchUsedHistory").click(function(){
+	$("#SearchUsedHistory").click(function(){
 		// Class제거 추가
-		$("#fnSetSearchCollectHistory").removeClass("on");
-		$("#fnSetSearchFullHistory").removeClass("on");
-		$("#fnSetSearchUsedHistory").addClass("on");
+		$("#SearchCollectHistory").removeClass("on");
+		$("#SearchFullHistory").removeClass("on");
+		$("#SearchUsedHistory").addClass("on");
 		
 		// 사용내역 포인트 블루
 		$("#pntAmt").removeClass("c_blue");
 		$("#pntAmt").addClass("c_primary");
+		$("#plusMinus").text("차감");
 		
 		let data = {};
 		
-		data.searchDt = $('select[name=searchDt]').val();
+		data.searchDt = $('#searchDt').find('.selected').val();
 		
 		let jsonData = JSON.stringify(data);
 		
@@ -163,37 +258,42 @@
 					contentType: 'application/json',
   					dataType : 'json',
 					success  : function(result){
-						fnUsePointListInfo(result);
+						UsePointListInfo(result);
 					}
 				}
 		)
 	});
 	
-	function fnUsePointListInfo(result) {
+	function UsePointListInfo(result) {
 		
 		let usePointList = result.usePointList;
-		
 		let tmtbHtml = "";
 		for(let i=0; i<usePointList.length; i++){
-			let point = usePointList[i];
+			let usePoint = usePointList[i];
 			tmtbHtml +='<tr>';
-			tmtbHtml +='<td>'+ usePointList.occurGb + '</td>';
-			tmtbHtml += '<td class="t_l pl40">'+ usePointList.occurDtlDesc + '</td>';
-			tmtbHtml += '<td class="c_primary">'+  usePointList.pntAmt + '</td>';
-			tmtbHtml += '<td>'+ usePointList.pntUploadDt + '</td>';
+			tmtbHtml +='<td>'+ usePoint.occurGb + '</td>';
+			tmtbHtml += '<td class="t_l pl40">'+ usePoint.occurDtlDesc + '</td>';
+			tmtbHtml += '<td class="c_primary">'+  usePoint.pntAmt + '</td>';
+			tmtbHtml += '<td>'+ usePoint.pntUploadDt + '</td>';
 			tmtbHtml += '</tr>';
 		}
 		$("#pointAjaxList").html(tmtbHtml);
 	}
 
-	
 	$(document).ready(function() {
 		// 마이페이지 LNB 설정
 		fnSetMypageLnbList(5);
 		
 		// 마이페이지 location 설정
 		fnSetMypageLocation('STYLE24 포인트', '_PAGE_MYPAGE_POINT');
-
+		
+		// 전체내역
+		$("#SearchFullHistory").trigger('click');
+		
+		// 셀렉트박스 활성화
+		$('.select_custom.type1').each(function(index) {
+			var selecter01 = new sCombo($(this));
+		});
 	});
 
 </script>

+ 36 - 18
src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html

@@ -348,7 +348,6 @@
 		let chgReason = $('div[name=chgReason]').parent().find('li.selected').attr('value');
 		
 		if (!gagajf.isNull(chgReason)) {
-			let data = {};
 			let returnRequestList = [];
 
 			// 반품 수량 설정
@@ -359,12 +358,17 @@
 				let chgQty = $(item).val();
 				let ordDtlNo = $(item).attr('ordDtlNo');
 				let ordCanChgQty = $(item).attr('ordCanChgQty');
+				
+				console.log('chgQty >>> '+chgQty);
+				console.log('ordDtlNo >>> '+ordDtlNo);
+				console.log('ordCanChgQty >>> '+ordCanChgQty);
 
 				chgQtyArr.push(Number(chgQty));
 				ordDtlNoArr.push(Number(ordDtlNo));
 				ordCanChgQtyArr.push(Number(ordCanChgQty));
 			});
 			
+			// 환불포인트, 환불상품권 금액 계산
 			let refundPoint = fnCalculatePoint(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
 			let refundGiftCard = fnCalculateGiftCard(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr);
 
@@ -378,13 +382,19 @@
 			let jsonData = JSON.stringify(returnRequestList);
 			
 			gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-				let returnAmt = result.spanRefundAmt;													// 환불예정금액
-				let goodsCancelAmt = result.spanCnclRtnAmt;												// 상품취소금액
-				let deliveryFee = result.sumDeliveryFee + result.spanTotDeliveryFee;					// 배송비
-				let deductDcAmt = result.spanCpnDcAmt + result.spanTmtbDcAmt + result.spanPrePntDcAmt;	// 할인금액 차감(쿠폰+다다익선+선포인트)
-				let refundPayAmt = result.spanRealCnclRtnAmt + result.sumDeliveryFee;					// 결제금액 환불
-				//let refundPoint = result.spanPntDcAmt;													// 포인트 환불
-				//let refundGiftCard = result.spanGfcdUseAmt;												// 상품권 환불
+				let spanCnclRtnAmt = Number(result.spanCnclRtnAmt);
+				let sumDeliveryFee = Number(result.sumDeliveryFee);
+				let spanTotDeliveryFee = Number(result.spanTotDeliveryFee);
+				let spanCpnDcAmt = Number(result.spanCpnDcAmt);
+				let spanTmtbDcAmt = Number(result.spanTmtbDcAmt);
+				let spanPrePntDcAmt = Number(result.spanPrePntDcAmt);
+				let spanRefundAmt = Number(result.spanRefundAmt);
+				
+				let goodsCancelAmt = spanCnclRtnAmt;										// 상품취소금액
+				let deliveryFee = sumDeliveryFee - spanTotDeliveryFee;						// 배송비
+				let deductDcAmt = 0 - spanCpnDcAmt - spanTmtbDcAmt - spanPrePntDcAmt;		// 할인금액 차감(쿠폰+다다익선+선포인트)
+				let refundPayAmt = spanRefundAmt;											// 결제금액 환불
+				let returnAmt = refundPayAmt + refundPoint + refundGiftCard;				// 환불예정금액
 
 				// 금액 설정
 				$('#returnAmt').text(returnAmt.addComma());
@@ -413,36 +423,44 @@
 
 	// 환불 포인트 계산
 	var fnCalculatePoint = function(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr) {
-		let refundAmt = 0;
+		let refundPoint = 0;
 
 		$.each(usedPointInfo, function(idx, item) {
 			let index = ordDtlNoArr.indexOf(item.ordDtlNo);
 			let chgQty = chgQtyArr[index];
 			let ordCanChgQty = ordCanChgQtyArr[index];
 			
-			if (chgQty = ordCanChgQty) {
-				refundAmt += item.pntAmt;
-			} else {
-				refundAmt += item.pntAmt * (chgQty / ordCanChgQty);
+			if (chgQty > 0) {
+				if (chgQty == ordCanChgQty) {
+					refundPoint += item.pntAmt;
+				} else {
+					refundPoint += item.pntAmt * (chgQty / ordCanChgQty);
+				}
 			}
 		});
+		
+		return refundPoint;
 	}
 	
 	// 환불 상품권 계산
 	var fnCalculateGiftCard = function(chgQtyArr, ordDtlNoArr, ordCanChgQtyArr) {
-		let refundAmt = 0;
+		let refundGiftCard = 0;
 		
 		$.each(usedGiftCardInfo, function(idx, item) {
 			let index = ordDtlNoArr.indexOf(item.ordDtlNo);
 			let chgQty = chgQtyArr[index];
 			let ordCanChgQty = ordCanChgQtyArr[index];
 			
-			if (chgQty = ordCanChgQty) {
-				refundAmt += item.gfcdAmt;
-			} else {
-				refundAmt += item.pntAmt * (chgQty / ordCanChgQty);
+			if (chgQty > 0) {
+				if (chgQty == ordCanChgQty) {
+					refundGiftCard += item.gfcdAmt;
+				} else {
+					refundGiftCard += item.pntAmt * (chgQty / ordCanChgQty);
+				}
 			}
 		});
+		
+		return refundGiftCard;
 	}
 </script>
 

+ 65 - 0
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -24,6 +24,71 @@
 <script type="text/javascript" src="/ux/pc/js/jquery-ui.js"></script>
 
 <!-- xodud1202 -->
+	<script type="text/javascript">
+		/****************************************************************/
+		/* m_Completepayment  설명                                      */
+		/****************************************************************/
+		/* 인증완료시 재귀 함수                                         */
+		/* 해당 함수명은 절대 변경하면 안됩니다.                        */
+		/* 해당 함수의 위치는 payplus.js 보다먼저 선언되어여 합니다.    */
+		/* Web 방식의 경우 리턴 값이 form 으로 넘어옴                   */
+		/****************************************************************/
+		function m_Completepayment( FormOrJson, closeEvent )
+		{
+			var frm = document.order_info;
+
+			/********************************************************************/
+			/* FormOrJson은 가맹점 임의 활용 금지                               */
+			/* frm 값에 FormOrJson 값이 설정 됨 frm 값으로 활용 하셔야 됩니다.  */
+			/* FormOrJson 값을 활용 하시려면 기술지원팀으로 문의바랍니다.       */
+			/********************************************************************/
+			GetField( frm, FormOrJson );
+
+
+			if( frm.res_cd.value == "0000" )
+			{
+				alert("결제 승인 요청 전,\n\n반드시 결제창에서 고객님이 결제 인증 완료 후\n\n리턴 받은 ordr_chk 와 업체 측 주문정보를\n\n다시 한번 검증 후 결제 승인 요청하시기 바랍니다."); //업체 연동 시 필수 확인 사항.
+				/*
+					가맹점 리턴값 처리 영역
+				*/
+
+				frm.submit();
+			} else {
+				alert( "[" + frm.res_cd.value + "] " + frm.res_msg.value );
+				closeEvent();
+			}
+		}
+	</script>
+
+	<script type="text/javascript" th:src="${@environment.getProperty('pg.kcp.js.url')}" src=""></script>
+
+	<script type="text/javascript">
+		/* 표준웹 실행 */
+		function jsf__pay( form ) {
+			try {
+				KCP_Pay_Execute( form );
+			} catch (e) {
+				/* IE 에서 결제 정상종료시 throw로 스크립트 종료 */
+			}
+		}
+
+		$(document).on("click", "#buyBtn", function() {
+			$.ajax( {
+				type: "POST",
+				url : '/order/create/order',
+				dataType : 'html',
+				data : {cartSq : 8},
+				success : function(result) {
+					$("#order_info").html(result);
+					jsf__pay(document.order_info);
+				}
+			});
+		});
+	</script>
+
+	<form id="order_info" name="order_info" method="post" action="/order/pay/result/response" >
+		<input type="button" id="buyBtn" value="테스트버튼" style="width:200px; height:200px;"/>
+	</form>
 
 <!-- // xodud1202 -->
 

+ 51 - 0
src/main/webapp/WEB-INF/views/web/pg/kcpOrderWeb.html

@@ -0,0 +1,51 @@
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
+	<!-- 선택, 상점이름(영문으로 작성권장) -->
+	<input type="hidden" name="site_name" th:value="${@environment.getProperty('pg.kcp.site.name')}" />
+	<!-- 필수, 상점코드 -->
+	<input type="hidden" name="site_cd" th:value="${@environment.getProperty('pg.kcp.site.cd')}" />
+
+	<input type="hidden" name="payco_redirect"	value="Y" />				<!-- 페이코 진행시 -->
+	<input type="hidden" name="pay_mthod"		value="100000000000" />		<!-- 페이코 진행시 -->
+	<input type="hidden" name="req_tx"			value="pay" />				<!-- 필수, 요청의 종류를 구분하는 변수 결제요청페이지의 경우 ‘pay’로 설정 -->
+	<input type="hidden" name="ordr_idxx"		value="100" />				<!-- 필수, 상점 관리 주문번호 (유니크한 값 설정 권장) -->
+	<input type="hidden" name="pay_method"		value="100000000000" />		<!-- 필수, 결제수단코드(신용카드 : 100000000000, 계좌이체 : 010000000000, 가상계좌 : 001000000000, 포인트 : 000100000000, 휴대폰 : 000010000000, 상품권 : 000000001000, ARS : 000000000010) -->
+	<input type="hidden" name="good_name"		value="TEST NAME" />		<!-- 필수, 상품명 -->
+	<input type="hidden" name="good_mny"		value="2000" />				<!-- 필수, 주문요청금액 (※ 화폐단위가 ‘USD’ 일 경우, Cent까지 설정 ex ) $10.55 일 경우 콤마를 뺀 1055, $100 일 경우 10000로 설정 -->
+	<input type="hidden" name="buyr_name"		value="LTY" />				<!-- 필수, 주문자 이름 -->
+	<input type="hidden" name="buyr_mail"		value="test@test.com" />	<!-- 선택, 주문자 이메일 -->
+	<input type="hidden" name="buyr_tel1"		value="" />					<!-- 선택, 주문자 전화번호 -->
+	<input type="hidden" name="buyr_tel2"		value="010-7111-4489" />	<!-- 필수, 주문자 휴대폰번호 -->
+	<input type="hidden" name="currency"		value="WON" />				<!-- 필수, 원화 : WON / 달러 : USD -->
+	<input type="hidden" name="shop_user_id"	value="xodud1202" />		<!-- 필수, 쇼핑몰회원ID 기관에 따라 RM 조치를 위해 쇼핑몰 관리 ID를 필수로 요청 -->
+
+	<input type="hidden" name="quotaopt"        value="12"/>				<!-- 최대 할부 개월 수(0 ~ 18까지 설정 가능) -->
+
+	<!--
+		  ※ 필 수
+			  필수 항목 : 표준웹에서 값을 설정하는 부분으로 반드시 포함되어야 합니다
+			  값을 설정하지 마십시오
+	-->
+	<input type="hidden" name="res_cd"          value=""/>
+	<input type="hidden" name="res_msg"         value=""/>
+	<input type="hidden" name="enc_info"        value=""/>
+	<input type="hidden" name="enc_data"        value=""/>
+	<input type="hidden" name="ret_pay_method"  value=""/>
+	<input type="hidden" name="tran_cd"         value=""/>
+	<input type="hidden" name="use_pay_method"  value=""/>
+
+	<!-- 주문정보 검증 관련 정보 : 표준웹 에서 설정하는 정보입니다 -->
+	<input type="hidden" name="ordr_chk"        value=""/>
+
+	<!--  현금영수증 관련 정보 : 표준웹 에서 설정하는 정보입니다 -->
+	<input type="hidden" name="cash_yn"         value=""/>
+	<input type="hidden" name="cash_tr_code"    value=""/>
+	<input type="hidden" name="cash_id_info"    value=""/>
+
+	<!-- 2012년 8월 18일 전자상거래법 개정 관련 설정 부분 -->
+	<!-- 제공 기간 설정 0:일회성 1:기간설정(ex 1:2012010120120131)  -->
+	<input type="hidden" name="good_expr" value="0">
+
+	<!-- 표준웹 설정 정보입니다(변경 불가) -->
+	<input type="hidden" name="module_type" th:value="${@environment.getProperty('pg.kcp.module.type')}" />
+
+</html>

+ 131 - 23
src/main/webapp/ux/style24_link.js

@@ -22,11 +22,11 @@ const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";
 const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/form?goodsCd=";		// 상품 상세
 //const _PAGE_GOODS_DETAIL = _frontUrl + "/goods/detail/coupon/layer?goodsCd=";		// 쿠폰레이어
 const _PAGE_SHOPPING_BENEFIT = _frontUrl + "/goods/shopping/benefit/layer";		// 쇼핑혜택레이어
-const _PAGE_CARD_PROMOTION = _frontUrl + "/goods/card/promotion/layer";		// 카드혜택레이어
-const _PAGE_GOODS_SIZEINFO = _frontUrl + "/goods/sizeInfo/layer?goodsCd=";		// 사이즈정보레이어
-const _PAGE_GOODS_COUNSEL = _frontUrl + "/goods/counsel/layer?goodsCd=";		// 상품문의레이어
-const _PAGE_GOODS_DELIVERY = _frontUrl + "/goods/delivery/layer?goodsCd=";		// 배송/교환/반품 레이어
-const _PAGE_GOODS_REVIEW = _frontUrl + "/goods/review/layer?goodsCd=";		// 상품평 레이어
+const _PAGE_CARD_PRMT_LAYER = _frontUrl + "/goods/card/prmt/layer";		// 카드혜택레이어
+const _PAGE_GOODS_SIZEINFO_LAYER = _frontUrl + "/goods/sizeInfo/layer?goodsCd=";		// 사이즈정보레이어
+const _PAGE_GOODS_COUNSEL_LAYER = _frontUrl + "/goods/counsel/layer?goodsCd=";		// 상품문의레이어
+const _PAGE_GOODS_DELIVERY_LAYER = _frontUrl + "/goods/delivery/layer?goodsCd=";		// 배송/교환/반품 레이어
+const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer?goodsCd=";		// 상품평 레이어
 
 //== 장바구니 ==/
 
@@ -38,9 +38,9 @@ const _PAGE_MYPAGE_ORDER_LIST = _frontUrl + "/mypage/order/list/form";			// 마
 const _PAGE_MYPAGE_ORDER_DETAIL = _frontUrl + "/mypage/order/detail/form/";		// 마이페이지 > 주문/배송 상세
 const _PAGE_MYPAGE_CRS_LIST = _frontUrl + "/mypage/crs/list/form";				// 마이페이지 > 취소/교환/반품 목록
 const _PAGE_MYPAGE_RESTOCK = _frontUrl + "/mypage/restock/form";				// 마이페이지 > 재입고 알림 내역
-const _PAGE_MYPAGE_COUPON = _frontUrl + "/mypage/coupon/form";					// 마이페이지 > 재입고 알림 내역
-const _PAGE_MYPAGE_POINT = _frontUrl + "/mypage/point/form";					// 마이페이지 > 재입고 알림 내역
-const _PAGE_MYPAGE_GIFTCARD = _frontUrl + "/mypage/gift/card/form";				// 마이페이지 > 재입고 알림 내역
+const _PAGE_MYPAGE_COUPON = _frontUrl + "/mypage/coupon/form";					// 마이페이지 > 쿠폰
+const _PAGE_MYPAGE_POINT = _frontUrl + "/mypage/point/form";					// 마이페이지 > 포인트
+const _PAGE_MYPAGE_GIFTCARD = _frontUrl + "/mypage/gift/card/form";				// 마이페이지 > 상품권
 const _PAGE_MYPAGE_REVIEW = _frontUrl + "/mypage/review/form";					// 마이페이지 > 리뷰
 const _PAGE_MYPAGE_DELIVERY_ADDR = _frontUrl + "/mypage/delivery/addr/form";	// 마이페이지 > 배송지 관리
 const _PAGE_MYPAGE_WISHLIST = _frontUrl + "/mypage/wish/list/form";				// 마이페이지 > 위시리스트
@@ -145,9 +145,9 @@ var cfnOpenIpinCertify = function (redirectUrl) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 장바구니 등록
+ * @desc   : 장바구니 등록  temp.cartGb :C 장바구니, O:바로구매
  * <pre>
- *		cfnOpenIpinCertify(cartList);
+ *		cfnAddCart(cartList);
  *		cartList는 Array로 등록해주셔야합니다.
  *		ex) 일반 & deal 상품 장바구니 등록 (일반&딜 상품도 배열에 담아서 전송해주세요.)
  *			let compsList = [];
@@ -216,11 +216,11 @@ function cfnAddCart(cartList) {
  * @author : jsshin
  */
 var cfnLoginNaver = function (requestGb, chkRememberMe) {
-	var actionUrl = _frontUrl + '/signin/naverlogin?rememberMe=' + chkRememberMe;
-	var popupHeight = 800;
-	var popupWidth = 600;
-	var popupX = (window.screen.width / 2) - (popupWidth / 2);
-	var popupY = (window.screen.height / 3) - (popupHeight / 3);
+	let actionUrl = _frontUrl + '/signin/naverlogin?rememberMe=' + chkRememberMe;
+	let popupHeight = 800;
+	let popupWidth = 600;
+	let popupX = (window.screen.width / 2) - (popupWidth / 2);
+	let popupY = (window.screen.height / 3) - (popupHeight / 3);
 	if ('P' === _frontGb) {
 		window.open(actionUrl, 'naverLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
 	} else {
@@ -242,15 +242,41 @@ var cfnLoginNaver = function (requestGb, chkRememberMe) {
  * @author : jsshin
  */
 var cfnLoginKakao = function (requestGb, chkRememberMe) {
-	var actionUrl = _frontUrl + '/signin/kakologin?rememberMe=' + chkRememberMe;
-	var popupWidth = 450;
-	var popupHeight = 700;
-	var popupX = (window.screen.width / 2) - (popupWidth / 2);
-	var popupY = (window.screen.height / 3) - (popupHeight / 3);
+	let actionUrl = _frontUrl + '/signin/kakologin?rememberMe=' + chkRememberMe;
+	let popupWidth = 450;
+	let popupHeight = 700;
+	let popupX = (window.screen.width / 2) - (popupWidth / 2);
+	let popupY = (window.screen.height / 3) - (popupHeight / 3);
 	if ('P' === _frontGb) {
-		window.open(actionUrl, 'kakaoLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
+		//window.open(actionUrl, 'kakaoLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
 	} else {
-		document.location.href = actionUrl + '&requestGb=' + requestGb;
+		//document.location.href = actionUrl + '&requestGb=' + requestGb;
+	}
+};
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : Yes24 로그인
+ * <pre>
+ *     cfnLoginYes24();
+ *     호출된 페이지에서
+ *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *     MO :
+ * </pre>
+ * @since  : 2021/02/23
+ * @author : jsshin
+ */
+var cfnLoginYes24 = function (requestGb, chkRememberMe) {
+	let actionUrl = _frontUrl + '/signin/yes24login?rememberMe=' + chkRememberMe;
+	let popupWidth = 484;
+	let popupHeight = 390;
+	let popupX = (window.screen.width / 2) - (popupWidth / 2);
+	let popupY = (window.screen.height / 3) - (popupHeight / 3);
+	if ('P' === _frontGb) {
+		//window.open(actionUrl, 'yes24Login', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
+	} else {
+		//document.location.href = actionUrl + '&requestGb=' + requestGb;
 	}
 };
 
@@ -267,11 +293,93 @@ var cfnLoginKakao = function (requestGb, chkRememberMe) {
  * @since  : 2021/03/02
  * @author : eskim
  */
-var cfnGoToGoodsDetail = function (goodsCd, ithrCd, contentsLoc, planDtlSq) {
+var cfnGoToGoodsDetail = function (goodsCd, colorCd, ithrCd, contentsLoc, planDtlSq) {
 	var params = goodsCd;
+	params += "&colorCd=" + colorCd;
 	if (typeof (ithrCd) != 'undefined') params += "&ithrCd=" + ithrCd;
 	if (typeof (contentsLoc) != 'undefined' && contentsLoc != "") params += "&contentsLoc=" + contentsLoc;
 	if (typeof (planDtlSq) != 'undefined') params += "&planDtlSq=" + planDtlSq;
 	cfnGoToPage(_PAGE_GOODS_DETAIL + params);
 }
 
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 레이어 띄우기
+ * <pre>
+ *     cfOpenLayer(_PAGE_CARD_LAYER, 'layer_card_benefit');
+ * </pre>
+ * @param  : page - page. 필수
+ * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
+ * @param  : oParam - Parameter Object. 옵션
+ * @param  : callbackFnc - 콜백함수. 옵션
+ */
+function cfOpenLayer(page, tgt, oParam, callbackFnc) {
+    if (!oParam) oParam = new Object();
+
+    $.post(page
+        , oParam
+        , function (result) {
+            $('#' + tgt).html(result);
+            $('#' + tgt).modal("show");
+            //$('#' + tgt).show();
+            //layerPop_resize(tgt);
+            if (callbackFnc && $.isFunction(callbackFnc))
+                callbackFnc();
+        }
+        , "html");
+    return false;
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 레이어 위치 조정
+ * <pre>
+ *     layerPop_resize('layer_card_benefit');
+ * </pre>
+ * @param  : tgt - 레이어가 표시될 위치(예, div 태크의 ID). 필수
+ */
+function layerPop_resize(tgt) {
+    var thisH = $("#" + tgt).find(".modal").outerHeight();
+    var thisT = ($(window).height() / 2) - (thisH / 2);
+    $("#" + tgt).find(".modal").css('top', thisT + 'px');
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 공통 레이어 닫기(레이어 숨기기)
+ * <pre>
+ *     cfCloseLayer("layer_card_benefit");
+ * </pre>
+ * @param  : tgt - 숨길 레이어 ID(예, div 태크의 ID). 필수
+ */
+function cfCloseLayer(tgt) {
+	if (_frontGb == "M"){
+		btnClose(tgt);
+	}else{
+		$('#' + tgt).hide();
+		$('#' + tgt).remove();
+	}
+	return false;
+}
+
+/**
+* @type   : function
+* @access : public
+* @desc   : 카드혜택보기
+* <pre>
+*		cfCardInfo();
+* </pre>
+*/
+function cfCardInfo() {
+	var str = '<div class="modal fade pd_pop bnf_card_pop" id="layer_card_benefit" tabindex="-1" role="dialog" aria-labelledby="bnfCardLabel" aria-hidden="true"></div>';
+
+	if ($('#layer_card_benefit').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenLayer(_PAGE_CARD_PRMT_LAYER, 'layer_card_benefit');
+}