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

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

card007 5 лет назад
Родитель
Сommit
c70a4a2946
42 измененных файлов с 4538 добавлено и 1088 удалено
  1. 18 0
      src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java
  2. 1 1
      src/main/java/com/style24/front/biz/dao/TsfDisplayDao.java
  3. 1 1
      src/main/java/com/style24/front/biz/dao/TsfGoodsDao.java
  4. 0 10
      src/main/java/com/style24/front/biz/dao/TsfOrderDao.java
  5. 55 7
      src/main/java/com/style24/front/biz/dao/TsfPointDao.java
  6. 106 0
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  7. 2 2
      src/main/java/com/style24/front/biz/service/TsfDisplayService.java
  8. 1 1
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  9. 0 9
      src/main/java/com/style24/front/biz/service/TsfOrderService.java
  10. 60 10
      src/main/java/com/style24/front/biz/service/TsfPointService.java
  11. 1 1
      src/main/java/com/style24/front/biz/web/TsfCustomerController.java
  12. 39 1
      src/main/java/com/style24/front/biz/web/TsfDisplayController.java
  13. 99 6
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  14. 185 38
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  15. 2 0
      src/main/java/com/style24/persistence/domain/Contents.java
  16. 0 6
      src/main/java/com/style24/persistence/domain/GoodsCompose.java
  17. 1 0
      src/main/java/com/style24/persistence/domain/MainLayout.java
  18. 58 0
      src/main/java/com/style24/persistence/mybatis/shop/TsfCustomer.xml
  19. 10 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml
  20. 51 57
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  21. 0 53
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  22. 118 46
      src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml
  23. 7 0
      src/main/webapp/WEB-INF/views/web/SigninFormWeb.html
  24. 323 2
      src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html
  25. 226 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDescFormWeb.html
  26. 914 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  27. 211 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealListFormWeb.html
  28. 10 11
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  29. 331 0
      src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html
  30. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsOtherFormWeb.html
  31. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html
  32. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewFormWeb.html
  33. 53 23
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustConfirmFormWeb.html
  34. 399 213
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html
  35. 147 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustSecedeCompleteFormWeb.html
  36. 267 158
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustSecedeFormWeb.html
  37. 275 0
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustSnsJoinInitPwdFormWeb.html
  38. 59 59
      src/main/webapp/WEB-INF/views/web/mypage/MypagePointFormWeb.html
  39. 4 3
      src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html
  40. 1 1
      src/main/webapp/ux/pc/css/common.css
  41. 478 363
      src/main/webapp/ux/pc/css/layout.css
  42. 22 0
      src/main/webapp/ux/style24_link.js

+ 18 - 0
src/main/java/com/style24/front/biz/dao/TsfCustomerDao.java

@@ -133,4 +133,22 @@ public interface TsfCustomerDao {
 	 * @since 2021. 03. 15
 	 */
 	int updateCustomerAuth(Customer customer);
+
+	/**
+	 * 이메일 유효성 확인
+	 * @param customer - 고객정보
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 15
+	 */
+	int getCustomerByEmail(Customer customer);
+
+	/**
+	 * 고객정보- 마케팅 정보 수정
+	 * @param customer - 고객정보
+	 * @return int - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 22
+	 */
+	int updateCustomerInfo(Customer customer);
 }

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

@@ -103,7 +103,7 @@ public interface TsfDisplayDao {
 	 * @author bin2107
 	 * @date 2021. 3. 16
 	 */
-	Collection<MainLayout> getMainLayout(String cateNo);
+	Collection<MainLayout> getMainLayout(MainLayout mainLayout);
 
 	/**
 	 * 카테고리 4srch 조회

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

@@ -104,7 +104,7 @@ public interface TsfGoodsDao {
 	 * @author eskim
 	 * @date 2021. 2. 9
 	 */
-	Collection<GoodsCompose> getGoodsDealComposeList(Goods goods);
+	Collection<Goods> getGoodsDealComposeList(Goods goods);
 
 	/**
 	 * 상품 옵션1 목록

+ 0 - 10
src/main/java/com/style24/front/biz/dao/TsfOrderDao.java

@@ -26,16 +26,6 @@ public interface TsfOrderDao {
 	 */
 	Collection<Order> getOrderListForMypage(Order order);
 
-	/**
-	 * 주문 상태 별 수량 조회
-	 *
-	 * @param Order
-	 * @return Order
-	 * @author card007
-	 * @since 2021. 02. 08
-	 */
-	Order getOrderStatCount(Order order);
-
 	/**
 	 * 마이페이지 주문목록 페이징 처리 주문번호 수 조회
 	 *

+ 55 - 7
src/main/java/com/style24/front/biz/dao/TsfPointDao.java

@@ -15,25 +15,73 @@ import com.style24.persistence.domain.Point;
 public interface TsfPointDao {
 	
 	/**
-	 * 마이페이지 STYLE24 포인트정보 조회
+	 * 사용가능 포인트조회
 	 *
-	 * @param Point
+	 * @param point
+	 * @return int - 사용가능포인트
 	 * @author csh9191
 	 * @since 2021. 02. 25
 	 */	
-	Point getUsablePointInfo(Point point);
-	Point getExpectedPointInfo(Point point);
-	Point getExtinctPointInfo(Point point);
+	int getUsablePointInfo(Point point);
+
+	/**
+	 * 적립예정 포인트조회
+	 *
+	 * @param point
+	 * @return int - 적립예정 포인트
+	 * @author csh9191
+	 * @since 2021. 02. 25
+	 */
+	int getExpectedPointInfo(Point point);
+
+	/**
+	 * 30일이내 소멸예정 포인트조회
+	 *
+	 * @param point
+	 * @return int - 30일 이내 소멸예정포인트
+	 * @author csh9191
+	 * @since 2021. 02. 25
+	 */
+	int getExtinctPointInfo(Point point);
 	
 	/**
-	 * 마이페이지 STYLE24 포인트 전체,적립,사용내역
+	 * 마이페이지 STYLE24 포인트 전체
 	 *
-	 * @param Point
+	 * @param point
+	 * @return Collection<Point> - 전체
 	 * @author csh9191
 	 * @since 2021. 03. 03
 	 */
 	Collection<Point> getAllPointList(Point point);
+
+	/**
+	 * 마이페이지 STYLE24 포인트 적립
+	 *
+	 * @param point
+	 * @return Collection<Point> - 적립내역
+	 * @author csh9191
+	 * @since 2021. 03. 03
+	 */
 	Collection<Point> getAccumulatePointList(Point point);
+
+	/**
+	 * 마이페이지 STYLE24 포인트 사용내역
+	 *
+	 * @param point
+	 * @return Collection<Point> - 사용내역
+	 * @author csh9191
+	 * @since 2021. 03. 03
+	 */
 	Collection<Point> getUsePointList(Point point);
 
+	/**
+	 * 마이페이지 > 회원탈퇴 > 고객 포인트 정보
+	 *
+	 * @param point - 고객번호 , 사이트코드
+	 * @return Point - 고객 포인트 정보
+	 * @author jsshin
+	 * @since 2021. 03. 23
+	 */
+	Point getCustomerPoint(Point point);
+
 }

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

@@ -12,6 +12,7 @@ import com.style24.front.biz.dao.TsfCustomerDao;
 import com.style24.front.support.security.TsfLoginDetails;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.CustSnsInfo;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.Login;
@@ -786,6 +787,108 @@ public class TsfCustomerService {
 		return result;
 	}
 
+
+	/**
+	 * 고객계좌 정보
+	 * @param  custNo - 고객번호
+	 * @return CustAccount - 고객계과 정보
+	 * @author jsshin
+	 * @since 2021. 03. 18
+	 */
+	public CustAccount getCustomerAccuontInfo(Integer custNo) {
+		return coreCustomerService.getCustomerAccuontInfo(custNo);
+	}
+
+
+	/**
+	 * 고객정보 수정
+	 * @param  customer - 고객정보
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 19
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap saveCustomerInfo(Customer customer) {
+		GagaMap result = new GagaMap();
+		Integer custNo = TsfSession.getInfo().getCustNo();
+		customer.setCustNo(custNo);
+		customer.setRegNo(custNo);
+		customer.setUpdNo(custNo);
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+
+		// 1. 이메일 변경여부 체크 및 변경시 유효성 체크
+		if ("Y".equals(customer.getEmailModifyYn())) {
+			customer.encryptData();
+			boolean isFind = getCustomerByEmail(customer);
+			if (isFind) {
+				result.setBoolean("isSuccess", false);
+				result.setString("resultType", "DUP_EMAIL");
+				return result;
+			}
+		}
+
+		// 2. 계좌정보 수정여부 체크
+		if ("Y".equals(customer.getAccountModifyYn())) {
+			// 계좌 유효성 체크
+			String resultCode = "000";
+			if (!"000".equals(resultCode)) {
+				result.setBoolean("isSuccess", false);
+				result.setString("resultType", "INVALID_ACCOUNT");
+				return result;
+			}
+			CustAccount custAccount = new CustAccount();
+			custAccount.setCustNo(custNo);
+			custAccount.setRegNo(custNo);
+			custAccount.setUpdNo(custNo);
+			custAccount.setAccountNo(customer.getAccountNo());
+			custAccount.setAccountNm(customer.getAccountNm());
+			custAccount.setBankCd(customer.getBankCd());
+			coreCustomerService.saveCustomerAccountInfo(custAccount);
+		}
+
+		// 3. 마케팅 수정 여부 체크
+		if ("Y".equals(customer.getMarketingModifyYn())) {
+			coreCustomerService.createCustomerMarketHst(customer);
+		}
+
+		// 4. 고객이력 생성
+		coreCustomerService.createCustomerHistory(customer);
+		// 5. 고객정보 수정
+		customerDao.updateCustomerInfo(customer);
+
+		result.setBoolean("isSuccess", true);
+		return result;
+	}
+
+	/**
+	 * 이메일 유효성 체크 -
+	 * 본인이 사용하고 있는 이메일 제외 하고 다른 사람이
+	 * 변경하려는 이메일 사용하느지 체크
+	 * @param  customer - 이메일, 고객번호
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 19
+	 */
+	public boolean getCustomerByEmail(Customer customer) {
+		customer.encryptData();
+		int resultCnt = customerDao.getCustomerByEmail(customer);
+		return resultCnt > 0;
+	}
+
+	/**
+	 * 회원탈퇴 처리
+	 * @param  customer - 고객번호
+	 * @return GagaMap - 결과
+	 * @author jsshin
+	 * @since 2021. 03. 24
+	 */
+	public GagaMap saveCustomerSecede(Customer customer) {
+		GagaMap result = new GagaMap();
+
+		return coreCustomerService.saveCustomerSecede(customer);
+	}
+
+
 	/**
 	 * KCP 계좌인증 처리
 	 *
@@ -919,4 +1022,7 @@ public class TsfCustomerService {
 		ByteBuffer bbuffer = utf8charset.encode(cbuffer);
 		return new String(bbuffer.array());
 	}
+
+
+
 }

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

@@ -255,8 +255,8 @@ public class TsfDisplayService {
 	 * @author bin2107
 	 * @date 2021. 3. 16
 	 */
-	public Collection<MainLayout> getMainLayout(String cateNo){
-		return displayDao.getMainLayout(cateNo);
+	public Collection<MainLayout> getMainLayout(MainLayout mainLayout){
+		return displayDao.getMainLayout(mainLayout);
 	}
 
 	/**

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

@@ -298,7 +298,7 @@ public class TsfGoodsService {
 	 * @author eskim
 	 * @since 2021. 2. 9
 	 */
-	public Collection<GoodsCompose> getGoodsDealComposeList(Goods goods) {
+	public Collection<Goods> getGoodsDealComposeList(Goods goods) {
 		return goodsDao.getGoodsDealComposeList(goods);
 	}
 

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

@@ -351,15 +351,6 @@ public class TsfOrderService {
 		return orderDao.updatePaymentForOrderFinished(param);
 	}
 
-	/**
-	 * 주문 상태 별 수량 조회
-	 *
-	 * @param Order
-	 * @return Order
-	 * @author card007
-	 * @since 2021. 02. 08
-	 */
-	public Order getOrderStatCount(Order order) { return orderDao.getOrderStatCount(order); }
 
 	/**
 	 * 마이페이지 주문목록 페이징 처리 주문번호 수 조회

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

@@ -23,41 +23,91 @@ public class TsfPointService {
 
 	@Autowired
 	private TsfPointDao pointDao;
-	
+
 	/**
-	 *  마이페이지 STYLE24 포인트 정보 조회
+	 * 사용가능 포인트조회
 	 *
-	 * @param Point
+	 * @param point
+	 * @return int - 사용가능포인트
 	 * @author csh9191
 	 * @since 2021. 02. 25
-	 */	
-	public Point getUsablePointInfo(Point point) {
+	 */
+	public int getUsablePointInfo(Point point) {
 		return pointDao.getUsablePointInfo(point);
 	}
-	
-	public Point getExpectedPointInfo(Point point) {
+
+	/**
+	 * 적립예정 포인트조회
+	 *
+	 * @param point
+	 * @return int - 적립예정 포인트
+	 * @author csh9191
+	 * @since 2021. 02. 25
+	 */
+	public int getExpectedPointInfo(Point point) {
 		return pointDao.getExpectedPointInfo(point);
 	}
-	public Point getExtinctPointInfo(Point point) {
+
+	/**
+	 * 30일이내 소멸예정 포인트조회
+	 *
+	 * @param point
+	 * @return int - 30일 이내 소멸예정포인트
+	 * @author csh9191
+	 * @since 2021. 02. 25
+	 */
+	public int getExtinctPointInfo(Point point) {
 		return pointDao.getExtinctPointInfo(point);
 	}
 	
 	/**
-	 * 마이페이지 STYLE24 포인트 전체,적립,사용내역
+	 * 마이페이지 STYLE24 포인트 전체
 	 *
-	 * @param Point
+	 * @param point
+	 * @return Collection<Point>
 	 * @author csh9191
 	 * @since 2021. 03. 03
 	 */	
 	public Collection<Point> getAllPointList(Point point) {
 		return pointDao.getAllPointList(point);
 	}
+
+	/**
+	 * 마이페이지 STYLE24 포인트 적립
+	 *
+	 * @param point
+	 * @return Collection<Point>
+	 * @author csh9191
+	 * @since 2021. 03. 03
+	 */
 	public Collection<Point> getAccumulatePointList(Point point) {
 		return pointDao.getAccumulatePointList(point);
 	}
+
+	/**
+	 * 마이페이지 STYLE24 포인트 사용내역
+	 *
+	 * @param point
+	 * @return Collection<Point>
+	 * @author csh9191
+	 * @since 2021. 03. 03
+	 */
 	public Collection<Point> getUsePointList(Point point) {
 		return pointDao.getUsePointList(point);
 	}
 
 
+	/**
+	 * 마이페이지 STYLE24 포인트 사용내역
+	 *
+	 * @param point - 고객번호
+	 * @return Point
+	 * @author jsshin
+	 * @since 2021. 03. 23
+	 */
+	public Point getCustomerPoint(Point point) {
+		return pointDao.getCustomerPoint(point);
+	}
+
+
 }

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

@@ -240,7 +240,7 @@ public class TsfCustomerController extends TsfBaseController {
 			custNo = TscSession.getAttribute("custNo");
 		}
 
-		if ("temp".equals(pageGb)) { // 비밀번호 변경 캠페인, 임시비밀번호로 로그인시 사용
+		if ("temp".equals(pageGb)) { // 비밀번호 변경 캠페인, 임시비밀번호로 로그인시 사용, 마이페이지 내정보 관리-비밀번호 수정
 			custNo = String.valueOf(TsfSession.getInfo().getCustNo());
 		}
 

+ 39 - 1
src/main/java/com/style24/front/biz/web/TsfDisplayController.java

@@ -66,7 +66,10 @@ public class TsfDisplayController extends TsfBaseController {
 		} else {
 			mainCateNo = "1700";
 		}
-		Collection<MainLayout> mainLayoutCollection = displayService.getMainLayout(mainCateNo);
+		MainLayout mallMainLayout = new MainLayout();
+		mallMainLayout.setCateNo(Integer.parseInt(mainCateNo));
+		Collection<MainLayout> mainLayoutCollection = displayService.getMainLayout(mallMainLayout);
+
 		Collection<MainLayout> mainLayoutList = new ArrayList<MainLayout>();
 		//mav.addObject("preview", paramMap.get("preview"));
 		//mav.addObject("viewDt", paramMap.get("viewDt"));
@@ -186,6 +189,41 @@ public class TsfDisplayController extends TsfBaseController {
 		// 브랜드그룹 정보
 		mav.addObject("brandGroupInfo", displayService.getGnbBrandGroup(Integer.parseInt(paramMap.get("brandGroupNo"))));
 
+		// 브랜드 레이아웃
+		MainLayout mainLayout = new MainLayout();
+		String mainCateNo = "";
+		if (device.isMobile() || "Y".equals(paramMap.get("mobileYn"))) {
+			mainCateNo = "1721";
+		} else {
+			mainCateNo = "1711";
+		}
+		mainLayout.setCateNo(Integer.parseInt(mainCateNo));
+		mainLayout.setBrandGroupNo(Integer.parseInt(paramMap.get("brandGroupNo")));
+		Collection<MainLayout> mainLayoutCollection = displayService.getMainLayout(mainLayout);
+		Collection<MainLayout> brandMainLayoutList = new ArrayList<MainLayout>();
+
+		for (MainLayout brandMain : mainLayoutCollection) {
+			String contentsLoc = brandMain.getContentsLoc();
+			Contents contents = new Contents();
+
+			contents.setContentsLoc(contentsLoc);
+			contents.setPreview(paramMap.get("preview"));
+			contents.setViewDt(paramMap.get("viewDt"));
+			contents.setCateNo(Integer.parseInt(mainCateNo));
+			contents.setBrandGroupNo((brandMain.getBrandGroupNo()).toString());
+
+			Cate4Srch cate4Srch = new Cate4Srch();
+			cate4Srch.setContentsLoc(contentsLoc);
+			cate4Srch = displayService.getCate4srch(cate4Srch);
+			brandMain.setCate4Srch(cate4Srch);
+
+			if ("C".equals(brandMain.getContentsYn())) {
+				brandMain.setContentsList(displayService.getContentsList(contents));
+			}
+			brandMainLayoutList.add(brandMain);
+		}
+		log.info("brandMainLayoutList::{}", brandMainLayoutList);
+		mav.addObject("brandMainLayoutList", brandMainLayoutList);
 		mav.setViewName(super.getDeviceViewName("display/BrandMainForm"));
 
 		return mav;

+ 99 - 6
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -128,6 +128,7 @@ public class TsfGoodsController extends TsfBaseController {
 		// 조회색상이 없으면 메인컬러 설정
 		if (StringUtils.isEmpty(paramsGoods.getColorCd())) {
 			paramsGoods.setColorCd(goods.getMainColorCd());
+			paramsGoods.setOptCd1(goods.getMainColorCd());
 		}
 		paramsGoods.setSelfGoodsYn(goods.getSelfGoodsYn());
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType()) || TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {
@@ -161,7 +162,6 @@ public class TsfGoodsController extends TsfBaseController {
 
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {	// 딜상품
 			// 딜 구성상품 정보
-			paramsGoods.setGoodsComposeSearchYn("Y");
 			mav.addObject("goodsDealComposeList", goodsService.getGoodsDealComposeList(paramsGoods));
 		} else {
 			if (TscConstants.GoodsType.NORMAL.value().equals(goods.getGoodsType())) {	// 일반상품
@@ -234,9 +234,9 @@ public class TsfGoodsController extends TsfBaseController {
 
 		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {
 			if ("Y".equals(mobileYn)) {
-				mav.setViewName("mob/goods/GoodsDealFormMob");
+				mav.setViewName("mob/goods/GoodsDealDetailFormMob");
 			} else {
-				mav.setViewName(super.getDeviceViewName("goods/GoodsDealForm"));
+				mav.setViewName(super.getDeviceViewName("goods/GoodsDealDetailForm"));
 			}
 		} else {
 			if ("Y".equals(mobileYn)) {
@@ -257,8 +257,7 @@ public class TsfGoodsController extends TsfBaseController {
 	 * @since 2021. 2. 09.
 	 */
 	private void setGoods(Goods goods) {
-		//goods.setFrontGb(TsfSession.getFrontGb());
-		goods.setFrontGb("true".equals(TsfSession.getAttribute("isApp")) ? "A" : TsfSession.getFrontGb());
+		goods.setFrontGb(TsfSession.getFrontGb());
 		goods.setIsApp(TsfSession.getAttribute("isApp"));	//앱여부 true
 		goods.setSiteCd(TscConstants.Site.STYLE24.value());
 		goods.setAfLinkCd(TsfSession.getAttribute("afLinkCd"));
@@ -272,7 +271,7 @@ public class TsfGoodsController extends TsfBaseController {
 			goods.setCustNo(TsfSession.getInfo().getCustNo());
 			goods.setCustGrade(TsfSession.getInfo().getCustGrade());
 		} else {
-			goods.setCustGb("G100_10");
+			goods.setCustGb(TsfSession.getCustGb());
 			goods.setCustNo(0);
 			goods.setCustGrade(""); //?  확인해보자
 		}
@@ -924,6 +923,23 @@ public class TsfGoodsController extends TsfBaseController {
 		return result;
 	}
 
+	/**
+	 * 상품 옵션1 목록
+	 * @param goods
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 24
+	 */
+	@PostMapping("/detail/option1/list")
+	@ResponseBody
+	public GagaMap getGoodsOption1List(@RequestBody Goods goods) {
+
+		GagaMap result = new GagaMap();
+		result.set("dataList",  goodsService.getGoodsOption1List(goods));
+
+		return result;
+	}
+	
 	/**
 	 * 상품 옵션2 목록
 	 * @param goods
@@ -974,4 +990,81 @@ public class TsfGoodsController extends TsfBaseController {
 		return recentlyGoodsList;
 	}
 	
+	/**
+	 * 딜상품상세 -  구성상품 상세정보 레이어
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 24
+	 */
+	@PostMapping("/deal/detail/layer/{goodsCd}/{compsGoodsCd}")
+	public ModelAndView goodsDealDetailForm(@PathVariable String goodsCd, @PathVariable String compsGoodsCd) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		Goods paramsGoods = new Goods();
+		paramsGoods.setGoodsCd(goodsCd);
+		setGoods(paramsGoods);
+		// 1. 딜상품코드 적용
+		mav.addObject("goodsDealComposeList", goodsService.getGoodsDealComposeList(paramsGoods));
+		
+		// 2.구상상품코드 적용
+		paramsGoods.setGoodsCd(compsGoodsCd);
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+		
+		GagaMap params = new GagaMap();
+		params.set("goodsCd", goodsCd);
+		params.set("compsGoodsCd", compsGoodsCd);
+		
+		mav.addObject("params", params);
+
+		mav.setViewName(super.getDeviceViewName("goods/GoodsDealListForm"));
+		return mav;
+	}
+	
+	/**
+	 * 딜상품상세 -  ajax 구성상품 상세정보
+	 * @return
+	 * @author eskim
+	 * @since 2021. 3. 24
+	 */
+	@PostMapping("/deal/detail/info/frame")
+	public ModelAndView goodsDealDetailInfoForm(Goods paramsGoods) {
+		ModelAndView mav = new ModelAndView();
+		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
+		setGoods(paramsGoods);
+		
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		// 상품 상세
+		goods = goodsService.getGoodsDesc(goods);
+
+		// 조회색상이 없으면 메인컬러 설정
+		if (StringUtils.isEmpty(paramsGoods.getColorCd())) {
+			paramsGoods.setColorCd(goods.getMainColorCd());
+			paramsGoods.setOptCd1(goods.getMainColorCd());
+		}
+		paramsGoods.setSelfGoodsYn(goods.getSelfGoodsYn());
+		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType()) || TscConstants.GoodsType.SET.value().equals(goods.getGoodsType())) {
+			paramsGoods.setColorCd("XX");
+		}
+		// 상품 기본정보
+		mav.addObject("goodsInfo", goods);
+		// 상품 이미지정보
+		mav.addObject("goodsImgList", goodsService.getGoodsImgList(paramsGoods));
+		// 상품 동영상정보
+		mav.addObject("goodsVideoList", goodsService.getVideoList(paramsGoods.getGoodsCd()));
+		// 상품 공지
+		mav.addObject("goodsNoticeList", goodsService.getGoodsNoticeList(paramsGoods));
+		// 상품 고시정보
+		mav.addObject("goodsNotiList", goodsService.getGoodsNotiList(goods));
+		// 상품 안전인증 정보
+		mav.addObject("goodsSafeNo", goodsService.getGoodsSafeNo(goods));
+
+		mav.addObject("params", paramsGoods);
+
+		mav.setViewName(super.getDeviceViewName("goods/GoodsDealDescForm"));
+		return mav;
+	}
+	
+	
 }

+ 185 - 38
src/main/java/com/style24/front/biz/web/TsfMypageController.java

@@ -1,24 +1,5 @@
 package com.style24.front.biz.web;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.ModelAndView;
-
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
 import com.gagaframework.web.rest.server.GagaResponseStatus;
@@ -44,14 +25,31 @@ import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CustAccount;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.GiftCard;
 import com.style24.persistence.domain.Order;
 import com.style24.persistence.domain.OrderChange;
 import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.WishList;
-
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * 마이페이지 Controller
@@ -154,7 +152,7 @@ public class TsfMypageController extends TsfBaseController {
 		mav.addObject("rmGfcdAmt", coreOrderService.getGiftcardInfo(order));
 
 		// 주문 상태 별 수량 조회
-		mav.addObject("orderCount", orderService.getOrderStatCount(order));
+		mav.addObject("orderCount", coreOrderService.getOrderStatCount(order));
 
 		// 주문상세상태코드 설정
 		mav.addObject("ordDtlStatList", rendererService.getCommonCodeList("G013", "Y", new String[] {"G013_25", "G013_35", "G013_55", "G013_97", "G013_98", "G013_99"}));
@@ -235,15 +233,19 @@ public class TsfMypageController extends TsfBaseController {
 	@PostMapping("/order/list")
 	@ResponseBody
 	public GagaMap getOrderList(@RequestBody Order order) {
-		GagaMap result = new GagaMap();
+		GagaMap map = new GagaMap();
+		ModelAndView mav = new ModelAndView();
 
 		// 페이징 처리 설정
+		// order.setPageable(new TscPageRequest(order.getPageNo() - 1, 5));
 		TscPageRequest pageable = new TscPageRequest((order.getPageNo() > 0 ? order.getPageNo() - 1 : 0), order.getPageSize(), order.getPageUnit());
 		pageable.setTotalCount(orderService.getPagingOrdNoListCount(order));
 		order.setPageable(pageable);
+		log.info("pageable: {}", pageable);
+		log.info("totalCount {}", pageable.getTotalCount());
+		log.info("order >>> {}", order);
 
 		// 페이징 처리 및 주문정보 조회
-		Collection<GagaMap> orderList = new ArrayList<>();
 		List<Integer> ordNoList = new ArrayList<>();
 
 		for (Order tmpOrder : orderService.getPagingOrdNoList(order)) {
@@ -252,13 +254,16 @@ public class TsfMypageController extends TsfBaseController {
 
 		if (ordNoList.size() > 0) {
 			order.setOrdNoList(ordNoList.stream().mapToInt(Integer::intValue).toArray());
-			orderList = orderService.getOrderListForMypage(order);
 		}
 
-		result.set("orderList", orderList);
-		result.set("orderInfo", order);
+		mav.addObject("orderList", orderService.getOrderListForMypage(order));
+		mav.addObject("orderInfo", order);
 
-		return result;
+		mav.setViewName(super.getDeviceViewName("mypage/MypageOrderList"));
+
+		map.set("mav", mav);
+		map.set("pageable", order.getPageable());
+		return map;
 	}
 
 	/**
@@ -445,7 +450,7 @@ public class TsfMypageController extends TsfBaseController {
 		GagaMap result = new GagaMap();
 
 		// 쿠폰정보 조회
-		result.set("orderCount", orderService.getOrderStatCount(order));
+		result.set("orderCount", coreOrderService.getOrderStatCount(order));
 
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 
@@ -620,11 +625,11 @@ public class TsfMypageController extends TsfBaseController {
 		int custNo = TsfSession.getInfo().getCustNo();
 		point.setCustNo(custNo);
 		// 잔여포인트
-		mav.addObject("pointInfo", pointService.getUsablePointInfo(point));
+		mav.addObject("rmPntAmt", pointService.getUsablePointInfo(point));
 		// 적립예정포인트 expectedPntAmt
-		mav.addObject("expectedpointInfo", pointService.getExpectedPointInfo(point));
+		mav.addObject("expectedPntAmt", pointService.getExpectedPointInfo(point));
 		// 한달 이내 소멸 예정 포인트
-		mav.addObject("extinctpointInfo", pointService.getExtinctPointInfo(point));
+		mav.addObject("expectedExpirePntAmt", pointService.getExtinctPointInfo(point));
 		// 전체내역 조회
 		mav.addObject("allPointList", pointService.getAllPointList(point));
 		// 적립내역 조회
@@ -834,8 +839,19 @@ public class TsfMypageController extends TsfBaseController {
 	@GetMapping("/customer/confirm/form")
 	public ModelAndView getCustomerConfirmForm() {
 		ModelAndView mav = new ModelAndView();
-		mav.addObject("custId", TsfSession.getInfo().getCustId());
-		mav.setViewName(super.getDeviceViewName("mypage/MypageCustConfirmForm"));
+		Customer customer = customerService.getCustomerFindByCustNo(TsfSession.getInfo().getCustNo());
+
+		mav.addObject("custId", customer.getCustId());
+
+		mav.addObject("snsType", customer.getSnsType());
+
+		// 1.간편가입인데 처음 마이페지로 진입 했을떄
+		if (StringUtils.isNotBlank(customer.getSnsType()) && StringUtils.isBlank(customer.getPasswd())) {
+			mav.setViewName(super.getDeviceViewName("mypage/MypageCustSnsJoinInitPwdForm"));
+		} else {
+			mav.setViewName(super.getDeviceViewName("mypage/MypageCustConfirmForm"));
+		}
+
 		return mav;
 	}
 
@@ -883,7 +899,6 @@ public class TsfMypageController extends TsfBaseController {
 		}
 
 		mav.addObject("bankList", rendererService.getCommonCodeList("G940", "Y"));
-		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007", "Y"));
 
 		mav.setViewName(super.getDeviceViewName("/mypage/MypageCustModifyForm"));
 		return mav;
@@ -896,7 +911,7 @@ public class TsfMypageController extends TsfBaseController {
 	 * @author jsshin
 	 * @since 2021. 03. 15
 	 */
-	@PostMapping("/customer/info")
+	@GetMapping("/customer/info")
 	@ResponseBody
 	public Customer getCustomerInfo() {
 		Integer custNo = TsfSession.getInfo().getCustNo();
@@ -904,7 +919,21 @@ public class TsfMypageController extends TsfBaseController {
 	}
 
 	/**
-	 * 마이페이지 - 개명본인인증, 휴대폰 변경
+	 * 마이페이지 - 계좌정보
+	 *
+	 * @return Customer - 고객정보
+	 * @author jsshin
+	 * @since 2021. 03. 15
+	 */
+	@GetMapping("/customer/account/info")
+	@ResponseBody
+	public CustAccount getCustomerAccuontInfo() {
+		Integer custNo = TsfSession.getInfo().getCustNo();
+		return customerService.getCustomerAccuontInfo(custNo);
+	}
+
+	/**
+	 * 마이페이지 - 개명본인인증, 휴대폰 본인인증
 	 *
 	 * @return GagaMap - 결과
 	 * @param customer - 본인인증 값
@@ -923,6 +952,21 @@ public class TsfMypageController extends TsfBaseController {
 		return customerService.updateCustomerAuth(customer);
 	}
 
+
+	/**
+	 * 마이페이지 - 확인(수정)
+	 *
+	 * @return GagaMap - 결과
+	 * @param customer - 수정 데이터
+	 * @author jsshin
+	 * @since 2021. 03. 15
+	 */
+	@PostMapping("/customer/info/save")
+	@ResponseBody
+	public GagaMap updateCustomerInfo(@RequestBody Customer customer) {
+		return customerService.saveCustomerInfo(customer);
+	}
+
 	/**
 	 * 마이페이지 - 계좌인증
 	 *
@@ -933,9 +977,112 @@ public class TsfMypageController extends TsfBaseController {
 	@RequestMapping("/account/check")
 	@ResponseBody
 	public GagaMap getAccountCheck(HttpServletRequest request, HttpServletResponse response) throws Exception {
-		log.info("request2 accountHolder {}", request.getParameter("accountHolder"));
-		GagaMap result = customerService.checkAccount(request);
+		GagaMap result = new GagaMap();
+		boolean isValid = true;
+		//isValid = customerService.checkAccount(request);
+		result.setBoolean("isValid", true);
 		return result;
 	}
+
+	/**
+	 * 마이페이지 - 회원탈퇴 화면
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 03. 16
+	 */
+	@GetMapping("/customer/secede/form")
+	public ModelAndView getCustomerSecedeForm() {
+		ModelAndView mav = new ModelAndView();
+
+		Order order = new Order();
+		order.setCustNo(TsfSession.getInfo().getCustNo());
+
+		Point point = new Point();
+		point.setCustNo(TsfSession.getInfo().getCustNo());
+
+		// 주문 상태 별 수량 조회
+		mav.addObject("orderStatInfo", coreOrderService.getOrderStatCount(order));
+
+		// 포인트정보
+		mav.addObject("pointInfo", pointService.getCustomerPoint(point));
+
+		// 상품권 정보 조회
+		mav.addObject("rmGfcdAmt", coreOrderService.getGiftcardInfo(order));
+
+		// 쿠폰정보 조회
+		mav.addObject("couponCnt", coreOrderService.getCouponInfo(order));
+
+		Customer customer = customerService.getCustomerFindByCustNo(TsfSession.getInfo().getCustNo());
+
+		mav.addObject("snsType", customer.getSnsType());
+
+		mav.addObject("custId", customer.getCustId());
+
+		mav.addObject("custNm", customer.getCustNm());
+
+		mav.setViewName(super.getDeviceViewName("/mypage/MypageCustSecedeForm"));
+
+		return mav;
+	}
+
+	/**
+	 * 마이페이지 - 회원탈퇴
+	 *
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 03. 16
+	 */
+	@PostMapping("/customer/secede/complete/form")
+	public ModelAndView getCustomerSecedeCompleteForm() {
+		ModelAndView mav = new ModelAndView();
+		Integer custNo = TsfSession.getInfo().getCustNo();
+
+		Order order = new Order();
+		order.setCustNo(custNo);
+
+		Point point = new Point();
+		point.setCustNo(custNo);
+
+		// 주문 상태 별 수량 조회
+		mav.addObject("orderStatInfo", coreOrderService.getOrderStatCount(order));
+
+		// 포인트정보
+		mav.addObject("pointInfo", pointService.getCustomerPoint(point));
+
+		// 상품권 정보 조회
+		mav.addObject("rmGfcdAmt", coreOrderService.getGiftcardInfo(order));
+
+		// 쿠폰정보 조회
+		mav.addObject("couponCnt", coreOrderService.getCouponInfo(order));
+
+		mav.addObject("custNm", TsfSession.getInfo().getCustNm());
+
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setRegNo(custNo);
+		customer.setUpdNo(custNo);
+		customer.setSiteCd(TscConstants.Site.STYLE24.value());
+
+		GagaMap result = customerService.saveCustomerSecede(customer);
+
+		boolean isSuccess = result.getBoolean("isSuccess");
+		if (isSuccess) {
+			try {
+				// TODO:회원탈퇴 메일 발송 2020-03-24
+			} catch (Exception e) {
+
+			}
+			TsfSession.invalidate(TsfSession.getHttpServletRequest());
+		} else {
+			mav.setViewName("redirect:/mypage/customer/secede/form");
+			return mav;
+		}
+
+		mav.setViewName(super.getDeviceViewName("/mypage/MypageCustSecedeCompleteForm"));
+
+		return mav;
+	}
+
 	/*신주승 끝*/
 }

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

@@ -60,6 +60,8 @@ public class Contents extends TscBaseDomain {
 	private int planBrandGroupNo;
 	private String planBrandGroupNm;
 
+	//private String contentsTitle;		// 메인 타이틀(md가 설정한)
+
 	private Collection<Cate1> cateList;	// 카테고리목록
 
 }

+ 0 - 6
src/main/java/com/style24/persistence/domain/GoodsCompose.java

@@ -38,12 +38,6 @@ public class GoodsCompose extends TscBaseDomain {
 	private String compsGoodsFullNm;
 	private String colorCd;
 
-//	private String optionTitle;
-//	private String optionNm;
-//	private String optionInfo;
-//	private String setDetail;
-//	private int level;
-
 	private String selfGoodsYn;
 	private String supplyCompCd;
 

+ 1 - 0
src/main/java/com/style24/persistence/domain/MainLayout.java

@@ -17,6 +17,7 @@ public class MainLayout extends TscBaseDomain {
     private Integer contentsSq;
     private Integer cateNo;
     private String contentsLoc;
+    private Integer brandGroupNo;
     private String contentsYn;
     private int dispOrd;
     private int colCnt;

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

@@ -181,6 +181,8 @@
 		     , EMAIL
 		     , EMAIL_AGREE_YN
 		     , EMAIL_AGREE_DT
+		     , MK_AGREE_YN
+		     , MK_AGREE_DT
 		     , HOME_ZIPCODE
 		     , HOME_BASE_ADDR
 		     , HOME_DTL_ADDR
@@ -231,6 +233,11 @@
 		            NOW()
 		       ELSE NULL
 		       END                                 AS EMAIL_AGREE_DT
+		     , IFNULL(#{mkAgreeYn}, 'N')           AS MK_AGREE_YN
+		     , CASE WHEN #{mkAgreeYn} = 'Y' THEN
+		            NOW()
+		            ELSE NULL
+		       END                                 AS MK_AGREE_DT
 		     , #{homeZipcode}                      AS HOME_ZIPCODE
 		     , #{encodedHomeBaseAddr}              AS HOME_BASE_ADDR
 		     , #{encodedHomeDtlAddr}               AS HOME_DTL_ADDR
@@ -545,4 +552,55 @@
 		WHERE  CUST_NO = #{custNo}
 	</update>
 
+	<!--이메일 유효성 체크-->
+	<select id="getCustomerByEmail" parameterType="Customer">
+		/* TsfCustomer.getCustomerByEmail */
+		SELECT B.CNT
+		FROM (
+		       SELECT A.CNT
+		       , ROW_NUMBER() OVER (ORDER BY A.CNT DESC) AS NUMB
+		       FROM (
+		       SELECT COUNT(*) AS CNT
+		       FROM   TB_CUSTOMER
+		       WHERE  CUST_STAT = 'G104_10'   /* 활동회원*/
+		       AND    SITE_CD = #{siteCd}
+		       AND    CUST_NO != #{custNo}
+		       AND    EMAIL = #{encodedEmail}
+
+		       UNION ALL
+
+		       SELECT COUNT(*) AS CNT
+		       FROM   TB_SECEDE_CUST
+		       WHERE  SITE_CD = #{siteCd}
+		       AND    CUST_NO != #{custNo}
+		       AND    EMAIL = #{encodedEmail}
+
+		       UNION ALL
+
+		       SELECT COUNT(*) AS CNT
+		       FROM   TB_DORMANT_CUST
+		       WHERE  SITE_CD = #{siteCd}
+		       AND    CUST_NO != #{custNo}
+		       AND    EMAIL = #{encodedEmail}
+		       ) A
+		) B
+		WHERE NUMB = 1
+	</select>
+
+	<!--고객정보 수정-->
+	<update id="updateCustomerInfo" parameterType="Customer">
+		/* TsfCustomer.updateCustomerInfo */
+		UPDATE TB_CUSTOMER
+		SET    UPD_NO = #{updNo}
+		    ,  UPD_DT = NOW()
+		    <if test='emailModifyYn == "Y" '>
+		    ,  EMAIL = #{encodedEmail}
+		    </if>
+		    ,  SMS_AGREE_DT = CASE WHEN #{smsAgreeYn} != SMS_AGREE_YN THEN NOW() ELSE SMS_AGREE_DT END
+		    ,  SMS_AGREE_YN = #{smsAgreeYn}
+		    ,  EMAIL_AGREE_DT = CASE WHEN #{emailAgreeYn} != EMAIL_AGREE_YN THEN NOW() ELSE EMAIL_AGREE_DT END
+		    ,  EMAIL_AGREE_YN = #{emailAgreeYn}
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
 </mapper>

+ 10 - 3
src/main/java/com/style24/persistence/mybatis/shop/TsfDisplay.xml

@@ -87,7 +87,7 @@
 		    </otherwise>
 		</choose>
 		WHERE  GTAB_GB = #{gtabGb}
-		<if test='brandGroupNo != null and brandGroupNo == ""'>
+		<if test='brandGroupNo != null and brandGroupNo != ""'>
 		AND    BRAND_GROUP_NO = #{brandGroupNo}
 		</if>
 		AND    USE_YN = 'Y'
@@ -218,6 +218,9 @@
 		        <if test="cateNo != null and cateNo != ''">
 		        AND    A.CATE_NO = #{cateNo}
 		        </if>
+				<if test="brandGroupNo != null and brandGroupNo !=''">
+				AND    A.BRAND_GROUP_NO  = #{brandGroupNo}
+				</if>
 		        <choose>
 		            <when test='preview != null and preview == "Y"'>
 		        AND    IFNULL((SELECT DISP_EDDT
@@ -430,10 +433,11 @@
 	</select>
 
 	<!-- 메인 레이아웃 목록 -->
-	<select id="getMainLayout" parameterType="String" resultType="MainLayout">
+	<select id="getMainLayout" parameterType="MainLayout" resultType="MainLayout">
 		/* TsfDisplay.getMainLayout */
 		SELECT CATE_NO
 			 , CONTENTS_LOC
+		     , BRAND_GROUP_NO
 			 , DISP_ORD
 			 , CONTENTS_YN
 			 , CONTENTS_TITLE
@@ -441,7 +445,10 @@
 			 , COL_NO
 		FROM TB_MAIN_LAYOUT
 		WHERE CATE_NO = #{cateNo}
-		AND 	CONTENTS_LOC IN ('SMM001','SMM002','SMM005','SMM008')
+		<if test="brandGroupNo != null and brandGroupNo !=''">
+			AND    BRAND_GROUP_NO  = #{brandGroupNo}
+		</if>
+		AND 	CONTENTS_LOC IN ('SMM001','SMM002','SMM005','SMM008','SBM004','SBM005','SBM006')
 		ORDER BY DISP_ORD, COL_NO
 	</select>
 

+ 51 - 57
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -246,24 +246,27 @@
 	<!-- 상품 옵션1 목록 - 자사용 -->
 	<select id="getGoodsOption1List" parameterType="Goods" resultType="GoodsStock">
 		/* TsfGoods.getGoodsOption1List */
-		SELECT *
+		SELECT A.*
+		    , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = A.GOODS_CD AND COLOR_CD = IF(A.SELF_GOODS_YN ='Y', A.OPT_CD1, 'XX') AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
 		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
+		           , G.MIN_ORD_QTY
+		           , G.MAX_ORD_QTY
 		           , O.OPT_CD1
-		           , O.DISP_ORD
-		           , RANK() OVER(PARTITION BY O.GOODS_CD , O.OPT_CD1 ORDER BY O.DISP_ORD) ROWNUM
+		           , SUM(CASE WHEN O.SOLDOUT_YN = 'Y' THEN 0
+		                      WHEN VS.CURR_STOCK_QTY  <![CDATA[<=]]> 0 THEN 0
+		                      WHEN VS.CURR_STOCK_QTY - G.MIN_ORD_QTY >= 0 THEN VS.CURR_STOCK_QTY
+		                      ELSE 0 END) AS STOCK_QTY
 		      FROM TB_GOODS G
 		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
-		                             AND O.DISP_YN = 'Y' 
+		                             AND O.DISP_YN = 'Y'
+		       INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
+		                          AND O.OPT_CD = VS.OPT_CD
 		      WHERE G.GOODS_CD =  #{goodsCd}
 		      AND G.GOODS_TYPE = 'G056_N' -- 일반상품
-		      <if test='adminYn == null or adminYn != "Y"'>
-		      AND G.GOODS_STAT = 'G008_90'
-		      </if>
+		      GROUP BY G.GOODS_CD , G.SELF_GOODS_YN , G.MIN_ORD_QTY, G.MAX_ORD_QTY, O.OPT_CD1
 		) A
-		WHERE ROWNUM = 1
 	</select>
 		
 	<!-- 상품 옵션2 목록  - 자사용-->
@@ -288,7 +291,7 @@
 		           , 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
+		           , G.MIN_ORD_QTY
 		      FROM TB_GOODS G
 		      INNER JOIN TB_OPTION O ON G.GOODS_CD = O.GOODS_CD
 		                             AND O.OPT_CD1 = #{optCd1}
@@ -296,9 +299,6 @@
 		      INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
 		                          AND O.OPT_CD = VS.OPT_CD
 		      WHERE G.GOODS_CD = #{goodsCd}
-		      <if test='adminYn == null or adminYn != "Y"'>
-		      AND G.GOODS_STAT = 'G008_90'
-		      </if>
 		     ) B
 		ORDER BY DISP_ORD
 	</select>
@@ -333,9 +333,6 @@
 		      INNER JOIN VW_STOCK VS ON O.GOODS_CD = VS.GOODS_CD
 		                          AND O.OPT_CD = VS.OPT_CD
 		      WHERE G.GOODS_CD = #{goodsCd}
-		      <if test='adminYn == null or adminYn != "Y"'>
-		      AND G.GOODS_STAT = 'G008_90'
-		      </if>
 		     ) B
 		ORDER BY DISP_ORD
 	</select>
@@ -388,55 +385,50 @@
 	</select>
 	
 	<!-- 딜상품 구성상품정보 조회 -->
-	<select id="getGoodsDealComposeList"  parameterType="Goods" resultType="GoodsCompose">
+	<select id="getGoodsDealComposeList"  parameterType="Goods" resultType="Goods">
 		/* TsfGoods.getGoodsDealComposeList */
-		SELECT E.GOODS_CD
-		     , E.COMPS_GOODS_CD
-		     , E.DISP_ORD
-		     , E.COMPS_GOODS_OPT_NM
+		SELECT Z.* 
+		     , 100 - ROUND((CURR_PRICE / LIST_PRICE) * 100 ,0) AS DC_RATE 
+		     , CONCAT(IF(IFNULL(GOODS_GB,'') IN ('G073_11','G073_15', ''), '',IFNULL(CONCAT('[',FN_GET_CODE_NM('G073',GOODS_GB),']'),'') )
+		             ,IF(FOREIGN_BUY_YN='Y','[해외구매대행]','' )
+		             ,IF(PARALLEL_IMPORT_YN = 'Y','[병행수입]','')
+		             ,IF(ORDER_MADE_YN='Y','[주문제작]','')
+		             ,GOODS_NM ) AS GOODS_FULL_NM
+		FROM (
+		SELECT C.GOODS_CD
+		     , C.COMPS_GOODS_CD
+		     , C.DISP_ORD
+		     , G.GOODS_NM
+		     , G.GOODS_GB
+		     , G.FOREIGN_BUY_YN
+		     , G.PARALLEL_IMPORT_YN
+		     , G.ORDER_MADE_YN
 		     , G.LIST_PRICE
-		     , BP.CURR_PRICE
-		     , 100 - ROUND((BP.CURR_PRICE / G.LIST_PRICE) * 100 ,0) AS DC_RATE
-		     , G.DELV_FEE
-		     , G.MIN_ORD_AMT
-		     , G.MIN_ORD_QTY
-		     , G.MAX_ORD_QTY
-		     , G.DAY_MAX_ORD_QTY
-		     , (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
-		     , G.BRAND_CD
-		     , (CASE WHEN B.DISP_NM_LANG = 'EN' THEN B.BRAND_ENM ELSE B.BRAND_KNM END) AS BRAND_NM
-		     , G.SUPPLY_COMP_CD
+		     , G.GOODS_STAT
+		     , FN_GET_BENEFIT_PRICE(#{frontGb},G.GOODS_CD, G.CURR_PRICE,#{custGb}) AS CURR_PRICE
+		     , (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END) AS BRAND_GROUP_NM
 		     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG WHERE GOODS_CD = G.GOODS_CD AND COLOR_CD = G.MAIN_COLOR_CD AND DEFAULT_IMG_YN = 'Y') AS SYS_IMG_NM
-		     , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
-		                                                               ELSE CURR_STOCK_QTY
-		                                                               END) ,0)
-		                                                FROM  VW_STOCK
-		                                                WHERE GOODS_CD = G.GOODS_CD
-		                                                GROUP BY GOODS_CD )
-		            ELSE (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
-		                                      ELSE CURR_STOCK_QTY
-		                                      END) ,0)
-		                  FROM  VW_STOCK_COMPOSE
-		                  WHERE GOODS_CD= G.GOODS_CD
-		                  GROUP BY GOODS_CD )
-		            END) AS STOCK_QTY
-		FROM TB_GOODS G
-		INNER JOIN TB_GOODS_COMPOSE E ON G.GOODS_CD = E.COMPS_GOODS_CD 
-		                              AND E.GOODS_TYPE = 'D'
-		                              AND E.USE_YN = 'Y'
+		     , (SELECT IFNULL(MAX(CASE WHEN SOLDOUT_YN = 'Y' THEN 0
+		                          ELSE CURR_STOCK_QTY
+		                          END) ,0)
+		        FROM  VW_STOCK
+		        WHERE GOODS_CD = G.GOODS_CD
+		        GROUP BY GOODS_CD 
+		        ) AS STOCK_QTY
+		FROM TB_GOODS_COMPOSE C
+		INNER JOIN TB_GOODS G ON C.COMPS_GOODS_CD = G.GOODS_CD  
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
 		                      AND B.USE_YN = 'Y'
 		INNER JOIN TB_SITE_BRAND SB ON B.BRAND_CD = SB.BRAND_CD
 		                            AND SB.USE_YN = 'Y'
 		                            AND SB.SITE_CD = #{siteCd}
-		INNER JOIN (SELECT GOODS_CD, 
-		            FN_GET_BENEFIT_PRICE(#{frontGb},GOODS_CD, CURR_PRICE,#{custGb}) AS CURR_PRICE 
-		            FROM TB_GOODS
-		            WHERE GOODS_CD = #{goodsCd}) BP ON G.GOODS_CD = BP.GOODS_CD
-		WHERE E.GOODS_CD = #{goodsCd}
-		AND G.SELF_MALL_YN = 'Y' -- 자사몰 노출
-		ORDER BY E.DISP_ORD
+		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO = D.BRAND_GROUP_NO
+		                            AND D.USE_YN = 'Y'
+		WHERE C.GOODS_CD = #{goodsCd}
+		AND C.GOODS_TYPE = 'G056_D'
+		AND C.USE_YN = 'Y'
+		ORDER BY C.DISP_ORD
+		) Z
 	</select>
 	
 	<!-- 구성 상품 정보 -->
@@ -823,6 +815,7 @@
 		             ,G.GOODS_NM ) AS COMPS_GOODS_FULL_NM
 		     , A.QTY
 		     , G.BRAND_CD
+		     , G.GOODS_STAT
 		     , G.MAIN_COLOR_CD AS COLOR_CD
 		     , G.ITEMKIND_CD
 		     , (SELECT TI.SIZE_GB FROM TB_ITEMKIND TI WHERE TI.ITEMKIND_CD = G.ITEMKIND_CD) AS SIZE_GB
@@ -835,6 +828,7 @@
 		                            AND SB.USE_YN = 'Y'
 		                            AND SB.SITE_CD = #{siteCd}
 		WHERE A.GOODS_CD = #{goodsCd}
+		AND A.GOODS_TYPE = 'G056_S'
 		AND A.USE_YN = 'Y'
 		ORDER BY A.DISP_ORD
 	</select>

+ 0 - 53
src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml

@@ -191,59 +191,6 @@
 		ORDER BY Z.ORD_NO DESC, Z.ORD_DTL_STAT, Z.SELF_GOODS_YN DESC, Z.SHOT_DELV_YN DESC, Z.SUPPLY_COMP_CD, Z.DELV_FEE_CD
 	</select>
 
-	<!-- 마이페이지 주문 상태 별 수량 조회 -->
-	<select id="getOrderStatCount" parameterType="Order" resultType="Order">
-		/* TsfOrder.getOrderStatCount */
-		SELECT SUM(Z.ORDER_RECEIPT)                          AS ORDER_RECEIPT_COUNT
-		     , SUM(Z.PAYMENT_COMPLETE)                       AS PAYMENT_COMPLETE_COUNT
-		     , SUM(Z.GOODS_PREPARE)                          AS GOODS_PREPARE_COUNT
-		     , SUM(Z.SHIP_PREPARE)                           AS SHIP_PREPARE_COUNT
-		     , SUM(Z.SHIPPING)                               AS SHIPPING_COUNT
-		     , SUM(Z.SHIP_COMPLETE)                          AS SHIP_COMPLETE_COUNT
-		     , SUM(Z.CANCEL_COUNT)                           AS CANCEL_COUNT
-		     , SUM(Z.EXCHANGE_COUNT + Z.EXCHANGE_WAIT_COUNT) AS EXCHANGE_COUNT
-		     , SUM(Z.RETURN_COUNT)                           AS RETURN_COUNT
-		  FROM (SELECT IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_00' THEN 1
-							   END, 0) AS ORDER_RECEIPT
-					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_20' THEN 1
-							   END, 0) AS PAYMENT_COMPLETE
-					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_30' THEN 1
-							   END, 0) AS GOODS_PREPARE
-					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_40' THEN 1
-							   END, 0) AS SHIP_PREPARE
-					 , IFNULL(CASE OD.ORD_DTL_STAT WHEN 'G013_50' THEN 1
-							   END, 0) AS SHIPPING
-					 , IFNULL(CASE WHEN OD.ORD_DTL_STAT = 'G013_60'
-								    AND O.ORD_DT >= DATE_FORMAT(CURRENT_DATE - INTERVAL 1 WEEK, '%Y-%m-%d') THEN 1
-							   END, 0) AS SHIP_COMPLETE
-					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_20' THEN 1
-							   END, 0) AS CANCEL_COUNT
-					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_30' THEN 1
-							   END, 0) AS EXCHANGE_COUNT
-					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_33' THEN 1
-							   END, 0) AS EXCHANGE_WAIT_COUNT
-					 , IFNULL(CASE OCD.CHG_STAT WHEN 'G685_40' THEN 1
-							   END, 0) AS RETURN_COUNT
-				  FROM TB_ORDER O
-				 INNER JOIN TB_ORDER_DETAIL OD
-					ON O.ORD_NO = OD.ORD_NO
-				  LEFT OUTER JOIN TB_ORDER_CHANGE_DETAIL OCD
-					ON OD.ORD_DTL_NO = OCD.ORD_DTL_NO
-		<where>
-			<choose>
-				<when test='custNo != null and custNo != ""'>
-				   AND O.CUST_NO  =  #{custNo}
-				</when>
-				<otherwise>
-				   AND O.ORD_NO = #{ordNo}
-				   AND O.ORD_NM = #{orderNm}
-				</otherwise>
-			</choose>
-		</where>
-				   AND O.DISP_YN = 'Y'
-		) AS Z
-	</select>
-
 	<!-- 마이페이지 주문목록 페이징 처리 주문번호 수 조회 -->
 	<select id="getPagingOrdNoListCount" parameterType="Order" resultType="int">
 		/* TsfOrder.getPagingOrdNoListCount */

+ 118 - 46
src/main/java/com/style24/persistence/mybatis/shop/TsfPoint.xml

@@ -15,62 +15,76 @@
 	</sql>
 	
 	<!-- 사용가능 포인트조회-->
-	<select id="getUsablePointInfo" parameterType="Point" resultType="Point">
-	/* TsfPoint.getUsablePointInfo */
-		SELECT SUM(RM_PNT_AMT) AS RM_PNT_AMT
+	<select id="getUsablePointInfo" parameterType="Point" resultType="int">
+		/* TsfPoint.getUsablePointInfo */
+		SELECT IFNULL(SUM(RM_PNT_AMT), 0) AS RM_PNT_AMT
 		FROM   TB_CUST_POINT
 		WHERE  CUST_NO = #{custNo}
-		AND    EXP_BE_DT <![CDATA[>]]> NOW();
+		AND    EXP_BE_DT > NOW();
 	</select>
 	
 	<!-- 적립예정 포인트조회-->
-	<select id="getExpectedPointInfo" parameterType="Point" resultType="Point">
-	/* TsfPoint.getExpectedPointInfo */
-		SELECT IFNULL(SUM(PNT_AMT),0) AS expectedPntAmt
-		FROM   tb_cust_point_hst
-		WHERE  CUST_NO = #{custNo}
-		AND    PNT_UPLOAD_STAT = 'G070_10'
-		AND    PNT_AMT <![CDATA[>]]> 0
-		AND    SWITCH_DUE_DT <![CDATA[>]]> NOW()
+	<select id="getExpectedPointInfo" parameterType="Point" resultType="int">
+		/* TsfPoint.getExpectedPointInfo */
+		SELECT IFNULL(SUM(A.PNT_AMT + B.PNT_AMT),0) AS EXPECTED_PNT_AMT
+		FROM (
+		      SELECT SUM(PNT_AMT) AS PNT_AMT
+		           , ORD_NO
+		      FROM   TB_CUST_POINT_HST
+		      WHERE  OCCUR_GB = 'G069_12' -- 적립예정
+		      AND    PNT_UPLOAD_STAT = 'G070_10'
+		      AND    CUST_NO = #{custNo}
+		      GROUP BY ORD_NO
+		      ) A
+		   , (
+		      SELECT SUM(PNT_AMT) AS PNT_AMT
+		           , ORD_NO
+		      FROM   TB_CUST_POINT_HST
+		      WHERE  OCCUR_GB = 'G069_13' -- 적립예정취소
+		      AND    PNT_UPLOAD_STAT = 'G070_20'
+		      AND    CUST_NO = #{custNo}
+		      GROUP BY ORD_NO
+		      ) B
+		WHERE A.ORD_NO = B.ORD_NO
 	</select>
 	
 	<!-- 한달 이내 소멸예정 포인트조회-->
-	<select id="getExtinctPointInfo" parameterType="Point" resultType="Point">
-	/* TsfPoint.getExtinctPointInfo */
-		SELECT IFNULL(SUM(RM_PNT_AMT),0) AS expectedExpirePntAmt
+	<select id="getExtinctPointInfo" parameterType="Point" resultType="int">
+		/* TsfPoint.getExtinctPointInfo */
+		SELECT IFNULL(SUM(RM_PNT_AMT),0) AS EXPECTED_EXPIRE_PNT_AMT
 		FROM   TB_CUST_POINT
 		WHERE  CUST_NO = #{custNo}
-		AND    NOW()  BETWEEN DATE_ADD(EXP_BE_DT,INTERVAL -1 MONTH ) AND EXP_BE_DT;
+		AND    EXP_CMP_DT > NOW()
+		AND    EXP_BE_DT <![CDATA[<]]> DATE_ADD(NOW(),INTERVAL 31 DAY)
 	</select>
 	
 	<!-- 적립내역 조회-->
 	<select id="getAccumulatePointList" parameterType="Point" resultType="Point">
 	/* TsfPoint.getAccumulatePointList */
-	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   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
+		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 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 PNT_AMT
+		      , TCHP.UPD_DT                                 AS PNT_UPLOAD_DT
 		FROM TB_CUST_POINT_HST TCHP
-		LEFT JOIN 
-		(
-			SELECT REVIEW_SQ
-				 , ORD_NO 
-				 , ORD_DTL_NO 
-		         , GOODS_CD
-			FROM TB_REVIEW TR
-			WHERE TR.PNT_GIVE_STAT = 'G043_30' 														/* 리뷰조건 : 포인트지급반영*/
-		) TR
+		LEFT JOIN
+		    (
+		     SELECT REVIEW_SQ
+		          , ORD_NO
+		          , ORD_DTL_NO
+		          , GOODS_CD
+		     FROM   TB_REVIEW TR
+		     WHERE  TR.PNT_GIVE_STAT = 'G043_30'            /* 리뷰조건 : 포인트지급반영*/
+		    ) TR
 		ON TCHP.REVIEW_SQ = TR.REVIEW_SQ
 		AND (TCHP.ORD_NO = TR.ORD_NO AND TCHP.ORD_DTL_NO = TR.ORD_DTL_NO)
 		LEFT JOIN TB_ORDER_DETAIL TOD
@@ -79,16 +93,15 @@
 		LEFT JOIN TB_GOODS TG
 		ON (TG.GOODS_CD = TOD.GOODS_CD OR TG.GOODS_CD = TR.GOODS_CD)
 		WHERE TCHP.CUST_NO = #{custNo}
-		AND CASE 																					/* 상품평조건 */
-			WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NULL THEN 1
-			WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NOT NULL AND NULLIF(TR.REVIEW_SQ, 0) IS NOT NULL THEN 1
-		END > 0	
+		AND CASE WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NULL THEN 1
+		         WHEN NULLIF(TCHP.REVIEW_SQ, 0) IS NOT NULL AND NULLIF(TR.REVIEW_SQ, 0) IS NOT NULL THEN 1 /* 상품평조건 */
+		    END > 0
 		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
 		AND DATE_FORMAT(TCHP.UPD_DT,'%Y%m') = #{searchDt}
-		GROUP BY tchp.REVIEW_SQ,TCHP.OCCUR_GB, PNT_AMT, GOODS_NM, TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT
-	ORDER BY TCHP.UPD_DT DESC;
+		GROUP BY TCHP.REVIEW_SQ,TCHP.OCCUR_GB, PNT_AMT, GOODS_NM, TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT
+		ORDER BY TCHP.UPD_DT DESC;
 	</select>
 	
 	<!-- 사용내역 조회-->
@@ -184,4 +197,63 @@
 		GROUP BY TCHP.REVIEW_SQ, TCHP.OCCUR_GB, PNT_AMT, GOODS_NM, TCHP.OCCUR_DTL_DESC, TCHP.UPD_DT
 	ORDER BY TCHP.UPD_DT DESC;
 	</select>
+
+	<!-- 고객 포인트 내역 -->
+	<select id="getCustomerPoint" parameterType="Integer" resultType="Point">
+		/* TsfCustomer.getCustomerPoint */
+		SELECT IFNULL((
+		               SELECT SUM(RM_PNT_AMT)
+		               FROM   TB_CUST_POINT
+		               WHERE  CUST_NO = C.CUST_NO
+		               AND    EXP_BE_DT > NOW()
+		               AND    EXP_CMP_DT IS NULL
+		              ), 0)                           AS RM_PNT_AMT -- 가용포인트
+		     , IFNULL((
+		               SELECT SUM(GV_PNT_AMT)
+		               FROM   TB_CUST_POINT
+		               WHERE  CUST_NO = C.CUST_NO
+		               ), 0)                           AS GV_PNT_AMT -- 누적포인트
+		     , IFNULL((
+		               SELECT SUM(US_PNT_AMT)
+		               FROM   TB_CUST_POINT
+		               WHERE  CUST_NO = C.CUST_NO
+		              ), 0)                           AS US_PNT_AMT -- 사용포인트
+		     , IFNULL((
+		               SELECT SUM(RM_PNT_AMT)
+		               FROM   TB_CUST_POINT
+		               WHERE  CUST_NO = C.CUST_NO
+		               AND    EXP_BE_DT <![CDATA[<]]> NOW()
+		               AND    EXP_CMP_DT IS NOT NULL
+		               ), 0)                           AS EXPIRE_PNT_AMT -- 소멸포인트
+		     , IFNULL((
+		               SELECT SUM(A.PNT_AMT + B.PNT_AMT) AS PNT_AMT
+		               FROM (
+		                   SELECT SUM(PNT_AMT) AS PNT_AMT
+		                        , ORD_NO
+		                   FROM   TB_CUST_POINT_HST
+		                   WHERE  OCCUR_GB = 'G069_12' -- 적립예정
+		                   AND    PNT_UPLOAD_STAT = 'G070_10' -- 포인트반영
+		                   AND    CUST_NO = #{custNo}
+		                   GROUP BY ORD_NO
+		               ) A
+		               , (
+		                  SELECT SUM(PNT_AMT) AS PNT_AMT
+		                       , ORD_NO
+		                  FROM   TB_CUST_POINT_HST
+		                  WHERE  OCCUR_GB = 'G069_13' -- 적립예정취소
+		                  AND    PNT_UPLOAD_STAT = 'G070_20' -- 포인트반영전취소
+		                  AND    CUST_NO = #{custNo}
+		                  GROUP BY ORD_NO
+		                ) B
+		                 WHERE A.ORD_NO = B.ORD_NO
+		                ), 0)                           AS EXPECTED_PNT_AMT -- 적립예정포인트
+		     , IFNULL((
+		                SELECT SUM(RM_PNT_AMT) AS RM_PNT_AMT
+		                FROM  TB_CUST_POINT
+		                WHERE EXP_BE_DT > NOW()
+		                AND   EXP_BE_DT <![CDATA[<]]> DATE_ADD(NOW(),INTERVAL 31 DAY)
+		               ), 0)                          AS EXPECTED_EXPIRE_PNT_AMT -- 소멸예정포인트(30일)
+		FROM   TB_CUSTOMER C
+		WHERE  C.CUST_NO = #{custNo}
+	</select>
 </mapper>

+ 7 - 0
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -306,6 +306,13 @@
 		}
 	};
 
+	//엔터키 확인
+	$('#loginForm input[name=passwd]').keypress(function (event) {
+		if (event.which === 13) {
+			event.preventDefault();
+			fnValidConfirm();
+		}
+	});
 
 
 	$(document).ready(function() {

+ 323 - 2
src/main/webapp/WEB-INF/views/web/display/BrandMainFormWeb.html

@@ -20,12 +20,333 @@
 
 <th:block layout:fragment="content">
 <div id="container" class="container brand_main">
-	<h1>브랜드 메인</h1>
+	<div class="wrap ">
+		<th:block th:if="${brandMainLayoutList}" th:each="brandMainLayoutData, mainStat : ${brandMainLayoutList}" th:with="contentsLoc=${#strings.replace(brandMainLayoutData.contentsLoc,'SBM','')},contentsTitle=${brandMainLayoutData.contentsTitle}">
+			<th:block th:if="${brandMainLayoutData.ContentsList != null and !brandMainLayoutData.ContentsList.empty}">
+				<th:block th:if="${contentsLoc=='004'}">
+					<!-- 1. 비주얼 슬라이드 -->
+					<div class="content wide main_visual brand_visual">
+						<div class="cont_head dpnone">
+							<p class="t_c">비주얼 슬라이드</p>
+						</div>
+						<div class="cont_body">
+							<div class="swiper-container post-visual">
+								<div class="swiper-wrapper">
+									<th:block th:each="ContentsData, ContentsStat : ${brandMainLayoutData.ContentsList}">
+										<div class="swiper-slide">
+											<th:block th:if="${ContentsData.imgPath1!=null && ContentsData.imgPath1!=''}">
+												<div class="txtWrap">
+													<dl class="w">
+														<dd th:text="${ContentsData.strTitle1}"></dd>
+														<dd class="txt_xs" th:text="${ContentsData.subText1}"></dd>
+													</dl>
+													<a th:href="${ContentsData.strVar1}"><button type="button" class="btn"><span>VIEW MORE</span></button></a>
+												</div>
+												<img th:src="${@environment.getProperty('domain.image')+ContentsData.imgPath1}">
+											</th:block>
+										</div>
+									</th:block>
+								</div>
+								<!-- If we need pagination -->
+								<div class="swiper-controls">
+									<div class="swiper-pagination"></div>
+									<div class="slide-curb">
+										<div class="slide-curb-play sbtn01_play">슬라이드 재생</div>
+										<div class="slide-curb-pause sbtn01_stop">슬라이드 정지</div>
+									</div>
+								</div>
+							</div>
+							<!-- If we need navigation buttons -->
+							<div class="swiper-button-prev sbtn01_lb"></div>
+							<div class="swiper-button-next sbtn01_rb"></div>
+						</div>
+					</div>
+				</th:block>
+
+				<th:block th:if="${contentsLoc=='005'}">
+					<!-- brand_info -->
+					<th:block th:each="ContentsData, ContentsStat : ${brandMainLayoutData.ContentsList}">
+						<div class="content brand_info">
+							<div class="cont_body clear">
+								<div class="brand_tit">
+									<p th:text="${contentsTitle}"></p>
+									<a th:href="${ContentsData.strVar1}">브랜드 사이트</a>
+								</div>
+								<div class="brand_desc">
+									<p class="cate" th:text="${ContentsData.strTitle1}"></p>
+									<p class="desc" th:text="${ContentsData.subText1}"></p>
+								</div>
+							</div>
+						</div>
+					</th:block>
+				</th:block>
+
+				<!-- 가로 긴 배너 슬라이드 -->
+				<!-- 브랜드 배너 -->
+				<th:block th:if="${contentsLoc=='006'}">
+					<div class="content wide main_1stage">
+						<div class="cont_head dpnone">
+							<p class="t_c">배너 슬라이드</p>
+						</div>
+						<div class="cont_body">
+							<div class="swiper-container post-bnnWide">
+								<div class="swiper-wrapper ">
+									<th:block th:each="ContentsData, ContentsStat : ${brandMainLayoutData.ContentsList}">
+										<div class="swiper-slide">
+											<a th:href="${ContentsData.strVar1}">
+												<div class="bnnbox" style="background:#e3e7ea;">
+													<div class="txtWrap">
+														<p th:text="${ContentsData.strTitle1}"></p>
+														<!--<p>아우터 + 이너 단독세일</p>-->
+														<button type="button" class="btn">VIEW MORE</button>
+													</div>
+													<img alt="BLUE-a" class=" vLHTC pd_img" th:src="${@environment.getProperty('domain.image')+ContentsData.imgPath1}">
+												</div>
+											</a>
+										</div>
+									</th:block>
+								</div>
+								<div class="swiper-button-prev "></div>
+								<div class="swiper-button-next "></div>
+							</div>
+						</div>
+					</div>
+				</th:block>
+
+			</th:block>
+		</th:block>
+	</div>
 </div>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
-	
+var brandMainLayoutList = [[${brandMainLayoutList}]];
+console.log('brandMainLayoutList::'+brandMainLayoutList);
+
+$(document).ready( function() {
+
+	// 컨텐츠 호출
+	$("#br_header").load("br_head.html");
+	$("#footer").load("foot.html");
+
+	/* SLIDE - BRAND_VISUAL */
+	var br_post_slide = new Swiper('.brand_main .brand_visual .post-visual', {
+		loop: true,
+		spaceBetween: 60,
+		speed : 1000,
+		autoplay: {
+			delay: 3000,
+			disableOnInteraction: false,
+		},
+		navigation: {
+			nextEl: '.brand_main .brand_visual .swiper-button-next',
+			prevEl: '.brand_main .brand_visual .swiper-button-prev',
+		},
+		pagination: {
+			el: '.brand_main .brand_visual .swiper-pagination',
+			clickable: true,
+		},
+
+		on: {
+			slideChangeTransitionStart: function () {
+				//$('.brand_main .post-visual .swiper-slide-prev .txtWrap').hide();
+			},
+		},
+	});
+
+	//VISUAL SLIDE Control - PAUSE
+	$(document).on('click','.brand_main .brand_visual .slide-curb-pause',function(e){
+		br_post_slide.autoplay.stop();
+		$(this).hide();
+		$('.brand_main .brand_visual .slide-curb-play').show();
+	});
+
+	//VISUAL SLIDE Control - PLAY
+	$(document).on('click','.brand_main .brand_visual .slide-curb-play',function(e){
+		br_post_slide.autoplay.start();
+		$(this).hide();
+		$('.brand_main .brand_visual .slide-curb-pause').show();
+	});
+
+
+	/* SLIDE - NEW ITEMS */
+	var br_trendy_slide = new Swiper('.brand_main .new_item .swiper-container', {
+		watchSlidesProgress: true,
+		watchSlidesVisibility: true,
+		allowTouchMove: false,
+		speed : 1000,
+		autoplay: {
+			delay: 3000,
+			disableOnInteraction:false,
+		},
+		navigation: {
+			nextEl: '.new_item .swiper-button-next',
+			prevEl: '.new_item .swiper-button-prev',
+		},
+		pagination: {
+			el: '.new_item .swiper-pagination',
+			clickable: true,
+		},
+		slidesPerView: 'auto',
+		spaceBetween: 22,
+	});
+
+	br_trendy_slide.on('slideChange', function () {
+		var newitemIndex = br_trendy_slide.activeIndex;
+		var slideWidth = $(".new_item .swiper-slide-visible").eq(0).width() + 22;
+
+		$(".new_item .swiper-slide").removeClass('scaleBig');
+		$(".new_item .swiper-slide-visible").eq(0).addClass('scaleBig');
+		$(".new_item .swiper-slide-visible").eq(3).addClass('scaleBig');
+
+		$(".new_item .swiper-wrapper").css("transform","translateX(-"+ (slideWidth * newitemIndex) +"px)");
+	});
+
+	br_trendy_slide.on('reachEnd', function () {
+		var newitemIndex = br_trendy_slide.activeIndex + 1;
+		var slideWidth = $(".new_item .swiper-slide-visible").eq(0).width() + 22;
+
+		$(".new_item .swiper-slide").removeClass('scaleBig');
+		$(".new_item .swiper-slide-visible").eq(1).addClass('scaleBig');
+		$(".new_item .swiper-slide-visible").eq(4).addClass('scaleBig');
+
+		$(".new_item .swiper-wrapper").css("transform","translateX(-"+ (slideWidth * newitemIndex) +"px)");
+	});
+
+
+	/* SLIDE - WIDE BANNER */
+	var br_bn_slide = new Swiper ('.brand_main .main_1stage .post-bnnWide', {
+		loop: true,
+		slidesPerView: 1,
+		speed : 1500,
+		navigation: {
+			nextEl: '.main_1stage .swiper-button-next',
+			prevEl: '.main_1stage .swiper-button-prev',
+		},
+	});
+
+
+	/* SLIDE - BEST ITEMS */
+	var br_best_slide = new Swiper('.brand_main .best_item .swiper-container', {
+		navigation: {
+			nextEl: '.best_item .swiper-button-next',
+			prevEl: '.best_item .swiper-button-prev',
+		},
+		slidesPerView: 5,
+		spaceBetween: 22,
+		pagination: {
+			el: '.best_item .swiper-pagination',
+			clickable: true,
+		},
+	});
+
+
+	/* SLIDE - MD’S PICK */
+	var br_md_slide = new Swiper('.brand_main .md_item .swiper-container', {
+		navigation: {
+			nextEl: '.md_item .swiper-button-next',
+			prevEl: '.md_item .swiper-button-prev',
+		},
+		slidesPerView: 5,
+		spaceBetween: 22,
+		pagination: {
+			el: '.md_item .swiper-pagination',
+			clickable: true,
+		},
+	});
+
+
+	/* SLIDE - SPECIAL SHOP */
+	$('.brand_main .special_shop .spe_pr_list .spe_sl').hide();
+	$('.brand_main .special_shop .spe_pr_list .spe_sl').eq(0).show();
+
+	var br_special_left_slide = new Swiper('.brand_main .special_shop .spe_thumb .swiper-container', {
+		navigation: {
+			nextEl: '.brand_main .special_shop .swiper-button-next',
+			prevEl: '.brand_main .special_shop .swiper-button-prev',
+		},
+		on: {
+			slideChangeTransitionStart: function () {
+				$('.brand_main .spe_pr_list .spe_sl').hide();
+				$('.brand_main .spe_pr_list .spe_sl').eq(br_special_left_slide.activeIndex).show();
+			},
+		}
+	});
+
+	$(".brand_main .special_shop .spe_pr_list .spe_sl .swiper-container").each(function(index, element){
+		var $this = $(this);
+		$this.addClass('spe' + index);
+
+		var br_special_right_slide = new Swiper('.spe' + index, {
+			observer: true,
+			observeParents: true,
+			watchSlidesProgress: true,
+			watchSlidesVisibility: true,
+			slidesPerView: 'auto',
+			freeMode: true,
+			spaceBetween: 20,
+			scrollbar: {
+				el: $('.spe' + index).siblings('.swiper-scrollbar'),
+				hide: false,
+			},
+			watchOverflow: true,
+		});
+
+		br_special_right_slide.on('slideChange', function () {
+			$(".special_shop .spe_sl .spe" + index).find(".swiper-slide").removeClass('view');
+			$(".special_shop .spe_sl .spe" + index).find(".swiper-slide-visible").eq(0).addClass('view');
+			$(".special_shop .spe_sl .spe" + index).find(".swiper-slide-visible").eq(1).addClass('view');
+			$(".special_shop .spe_sl .spe" + index).find(".swiper-slide-visible").eq(2).addClass('view');
+		});
+
+	});
+
+	/* SLIDE - BRAND_LOOKBOOK */
+	var br_lookbook_slide = new Swiper('.brand_main .br_lookbook .swiper-container', {
+		loop: true,
+		slidesPerView: 'auto',
+		spaceBetween: 20,
+		speed : 800,
+		autoWidth: true,
+		autoHeight: true,
+		centeredSlides: true,
+		autoplay: false,
+		navigation: {
+			nextEl: '.brand_main .br_lookbook .swiper-button-next',
+			prevEl: '.brand_main .br_lookbook .swiper-button-prev',
+		},
+		pagination: {
+			el: '.brand_main .br_lookbook .swiper-pagination',
+			clickable: true,
+		},
+	});
+
+
+	// BRAND_LOOKBOOK > picker - 룩북_피커_상품정보 팝업
+	$(document).on('click','#btn_lookbook_picker01',function(e){
+		$("#brLookbookPopup").modal("show");
+		return false;
+	});
+
+
+	/* SLIDE - BRAND_TV */
+	var br_tv_slide = new Swiper ('.brand_main .main_tv .post-tv', {
+		loop: true,
+		slidesPerView: 'auto',
+		spaceBetween: 60,
+		centeredSlides: true,
+		autoplay: false,
+		navigation: {
+			nextEl: '.brand_main .main_tv .swiper-button-next',
+			prevEl: '.brand_main .main_tv .swiper-button-prev',
+		},
+		pagination: {
+			el: '.main_tv .swiper-pagination',
+			clickable: true,
+		},
+	});
+
+});
 /*]]>*/
 </script>
 

+ 226 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDescFormWeb.html

@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsDetailDescFormWeb.html
+ * @desc	: 딜 구상상품상세 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR		 DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.24   eskim	   최초 작성
+ *******************************************************************************
+ -->
+ <div class="cont_head">
+	<h3 class="sr-only">상품상세정보</h3>
+</div>
+<div class="cont_body" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
+	<!-- 상품설명 노출 -->
+	<div class="descrp_box">
+		<div class="desc_simple"> <!-- 상품 간략설명-->
+			<span class="tit_desc" th:if="${goodsInfo.goodsTitle  != null  and !goodsInfo.goodsTitle.empty}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsTitle))}">사이드 밴딩으로 편안한 만능 슬랙스!</span>
+			<p class="ptxt01"th:if="${goodsInfo.goodsTitleDesc}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsTitleDesc))}">
+				슬림핏에 사이드 밴딩으로 편안함을 더해준 슬랙스입니다. 
+			</p>
+		</div>
+		<div class="desc_character" th:if="${goodsInfo.goodsSpecialDesc != null  and !goodsInfo.goodsSpecialDesc.empty}"> <!-- 상품특징 -->
+			<span class="tit_desc">상품특징</span>
+			<p class="ptxt01" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsSpecialDesc))}">
+				- 지퍼플러 장식을 더해 완성도를 높여줌
+			</p>
+		</div>
+	</div>
+	<!-- //상품설명 노출 -->
+	<!-- 관리자 에디터입력 내용   공지 html -->
+		<th:block th:if="${goodsNoticeList != null and !goodsNoticeList.empty}" >
+	<div class="mdhtml_box" th:each="goodsNotice, status : ${goodsNoticeList}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsNotice.noticeContent))}"></div>
+		</th:block>
+	<!-- 관리자 에디터입력 내용   공지 html -->
+	<!-- 관리자 에디터입력 내용 노출  상단 html -->
+	<div class="mdhtml_box" th:if="${goodsInfo.goodsTopDesc != null  and !goodsInfo.goodsTopDesc.empty}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsTopDesc))}"></div>
+		
+	<!-- 착용컷 노출 -->
+	<div class="view_outfit_box" th:if="${#strings.contains(goodsImgList,'_M1.') 
+										or #strings.contains(goodsImgList,'_M2.')
+										or #strings.contains(goodsImgList,'_M3.')
+										or #strings.contains(goodsImgList,'_M4.')
+										or #strings.contains(goodsImgList,'_M5.')}">
+		<span class="tit_view">OUTFIT VIEW</span>
+		<span class="model_info">(모델정보 : 185cm / 78kg / XL 착용)</span>
+		<div class="view">
+			<th:block th:each="goodsImg, status : ${goodsImgList}" th:if="${#strings.contains(goodsImg.sysImgNm,'_M1.') 
+																		or #strings.contains(goodsImg.sysImgNm,'_M2.')
+																		or #strings.contains(goodsImg.sysImgNm,'_M3.')
+																		or #strings.contains(goodsImg.sysImgNm,'_M4.')
+																		or #strings.contains(goodsImg.sysImgNm,'_M5.')}">
+			<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="">
+			</th:block>
+		</div>
+	</div>
+	
+	<!-- //착용컷 노출 -->
+	<!-- 상품컷 노출 -->
+	<div class="view_detail_box" th:if="${#strings.contains(goodsImgList,'_01.') 
+										or #strings.contains(goodsImgList,'_02.')
+										or #strings.contains(goodsImgList,'_D1.')
+										or #strings.contains(goodsImgList,'_D2.')
+										or #strings.contains(goodsImgList,'_D3.')
+										or #strings.contains(goodsImgList,'_D4.')
+										or #strings.contains(goodsImgList,'_D5.')}">
+		<span class="tit_view">PRODUCT VIEW</span>
+		<div class="view">
+			<th:block th:each="goodsImg, status : ${goodsImgList}" th:if="${#strings.contains(goodsImg.sysImgNm,'_01.') 
+																		or #strings.contains(goodsImg.sysImgNm,'_02.')
+																		or #strings.contains(goodsImg.sysImgNm,'_D1.')
+																		or #strings.contains(goodsImg.sysImgNm,'_D2.')
+																		or #strings.contains(goodsImg.sysImgNm,'_D3.')
+																		or #strings.contains(goodsImg.sysImgNm,'_D4.')
+																		or #strings.contains(goodsImg.sysImgNm,'_D5.')}">
+			<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="">
+			</th:block>
+		</div>
+	</div>
+	<!-- //상품컷 노출 -->
+	<!-- 원단 노출 -->
+	<div class="view_fabric_box" th:if="${#strings.contains(goodsImgList,'_S1.')}">
+		<span class="tit_view">FABRIC</span>
+		<div class="view">
+			<th:block th:each="goodsImg, status : ${goodsImgList}" th:if="${#strings.contains(goodsImg.sysImgNm,'_S1.')}">
+			<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="">
+			</th:block>
+		</div>
+	</div>
+	<!-- //원단 노출 -->
+	<!-- 라벨 노출 -->
+	<div class="view_label_box" th:if="${#strings.contains(goodsImgList,'_L1.') 
+										or #strings.contains(goodsImgList,'_L2.')}">
+		<span class="tit_view">LABEL INFO</span>
+		<div class="view">
+			<span>
+				<th:block th:each="goodsImg, status : ${goodsImgList}" th:if="${#strings.contains(goodsImg.sysImgNm,'_L1.') 
+																		or #strings.contains(goodsImg.sysImgNm,'_L2.')}">
+				<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="">
+				</th:block>
+			</span>
+		</div>
+	</div>
+	<!-- //라벨 노출 -->
+	
+	<div class="view_detail_box" th:if="${not #strings.contains(goodsImgList,'_01.')}">
+		<div class="view">
+			<th:block th:each="goodsImg, status : ${goodsImgList}" >
+				<img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="">
+				</th:block>
+		</div>
+	</div>
+	
+		<th:block th:if="${goodsInfo.goodsDesc != null  and !goodsInfo.goodsDesc.empty}" >
+	<!-- 상세 html 이 존재하면  -->
+	<div class="mdhtml_box" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsDesc))}"></div>
+		</th:block>
+		
+	<!-- 관리자 에디터입력 내용 노출  하다단 html -->
+	<div class="mdhtml_box" th:if="${goodsInfo.goodsDownDesc != null  and !goodsInfo.goodsDownDesc.empty}" th:utext="${#strings.unescapeJava(#strings.escapeJava(goodsInfo.goodsDownDesc))}"></div>
+		
+	<!-- 브랜드 노출 -->
+	<div class="brand_box">
+		<p class="name" th:text="${goodsInfo.brandGroupNm}">TBJ 티비제이</p>
+		<a href="javascript:void(0);" class="btn btn_default" th:onclick="cfnGoToBrandMain([[${goodsInfo.brandGroupNo}]])" ><span>브랜드 홈 바로가기</span></a>
+	</div>
+	<!-- //브랜드 노출 -->
+	<!-- 상품필수정보 노출 -->
+	<div class="required_box" >
+		<div class="area_infotbl" th:if="${goodsInfo.goodsType == 'G056_N' and goodsNotiList != null and !goodsNotiList.empty}">
+			<span class="title">상품고시정보</span>
+			<div class="tbl type1 mt30">
+				<table>
+					<tbody>
+						<tr  th:each="goodsNoti, status : ${goodsNotiList}" >
+							<th th:text="${goodsNoti.niItemNm}">스타일</th>
+							<td th:text="${goodsNoti.niContent}">F94U-MD01XA60F0</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
+		</div>
+		<div class="area_infotbl" th:if="${goodsInfo.goodsType == 'G056_S' and goodsComposeList != null and !goodsComposeList.empty}">
+			<span class="title">상품고시정보</span>
+			<th:block th:each="goodsCompose, status : ${goodsComposeList}">
+			<div class="tbl type1 mt30">
+				<table>
+					<tbody>
+						<tr  th:each="goodsNoti, status : ${goodsCompose.goodsNotiList}" >
+							<th th:text="${goodsNoti.niItemNm}">스타일</th>
+							<td th:text="${goodsNoti.niContent}">F94U-MD01XA60F0</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
+			</th:block>
+		</div>
+		<div class="area_kcl" th:if="${goodsSafeNo != null}">
+			<i class="ico ico_kcl"></i>
+			<p class="tit normal" th:text="${goodsSafeNo.certDiv}">
+				어린이제품 안전인증 / 한국건설생활시험연구원(KCL)
+			</p>
+			<p class="normal" >
+				<th:block th:if="${not #strings.isEmpty(goodsSafeNo.isCertNum)}" >
+				 인증번호: :CB123A123-1234
+				<a th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsSafeNo.certNum})}" target="_blank" class="linktxt3">상세보기</a>
+				</th:block>
+				<th:block th:unless="${goodsSafeNo.isCertNum}">
+				해당사항 없음
+				</th:block>
+			</p>
+			<p class="t_info dot_info">
+				해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
+			</p>
+		</div>
+		<div class="area_infotbl">
+			<span class="title">상품기본정보</span>
+			<div class="tbl type1 mt30">
+				<table>
+					<tbody>
+						<tr>
+							<th>상품코드</th>
+							<td th:text="${goodsInfo.goodsCd}">14443216</td>
+						</tr>
+						<tr>
+							<th>상품구분</th>
+							<td th:text="${goodsInfo.goodsGbNm}">병행수입</td>
+						</tr>
+						<tr>
+							<th>브랜드</th>
+							<td th:text="${goodsInfo.brandGroupNm}">TBJ</td>
+						</tr>
+						<tr>
+							<th>상품명</th>
+							<td th:text="${goodsInfo.goodsNm}">남성 테이퍼드 핏 겨울 기모면 스판 올 밴딩 팬츠</td>
+						</tr>
+						<tr>
+							<th>제조자</th>
+							<td >한세엠케이(주)==============>노출필요성 확인</td>
+						</tr>
+						<tr>
+							<th>제조국</th>
+							<td th:text="${goodsInfo.originNm}">베트남</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
+			<p class="t_info dot_info mt20">
+				주문제작 상품의 경우 주문 후 제작되어 판매되는 상품으로 제작 시점부터 반품/교환이 어려울 수 있습니다.
+			</p>
+		</div>
+	</div>
+	<!-- //상품필수정보 노출 -->
+	</div>
+	<div class="btn_more_box covered">
+		<button type="button" class="btn btn_default btn_md">
+			<span>상세정보 더보기</span>
+		</button>
+	</div>
+</html>

+ 914 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -0,0 +1,914 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="web/common/layout/DefaultLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : GoodsDetailFormWeb.html
+ * @desc	: 딜 상품상세 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR	     DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.02   eskim       최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+<script src="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.3.1/js/ion.rangeSlider.min.js"></script>
+<div id="container" class="container pd deal" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
+	<div class="wrap">
+		<!-- 상품 대표설명 -->
+		<div class="content pd_detail">
+			<div class="cont_head">
+				<h3 class="sr-only">상품 대표설명</h3>
+			</div>
+			<div class="cont_body">
+				<!-- CONT-BODY -->
+				<div class="item_detail">
+					<div class="area_pic">
+						<div class="thumb_nav_wrap"  th:if="${goodsImgList != null and !goodsImgList.empty}" >
+							<div class="thumbnav">
+									<div class="swiper-container">
+										<div class="swiper-wrapper">
+										<th:block th:each="goodsImg, status : ${goodsImgList}">
+											<div class="swiper-slide" th:classappend="${status.first}? 'on' : ''" 
+													th:if="${ not (#strings.contains(goodsImg.sysImgNm,'_S1.') 
+															or #strings.contains(goodsImg.sysImgNm,'_L1.')
+															or #strings.contains(goodsImg.sysImgNm,'_L2.'))}">
+											<a th:href="${'#navLocate'+ status.count}"><span class="thumb"><img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'"></span></a></div>
+										</th:block>	
+										</div>
+									</div>
+									<div class="swiper-button-next"></div>
+									<div class="swiper-button-prev"></div>
+								</div>
+						</div>
+						<div class="thumb_list_wrap"  th:if="${goodsImgList != null and !goodsImgList.empty}" >
+							<ul>
+								<th:block th:each="goodsImg, status : ${goodsImgList}">
+								<li th:id="${'navLocate'+ status.count}"  th:classappend="${status.first}? 'on' : ''" 
+									th:if="${ not (#strings.contains(goodsImg.sysImgNm,'_S1.') 
+												or #strings.contains(goodsImg.sysImgNm,'_L1.')
+												or #strings.contains(goodsImg.sysImgNm,'_L2.'))}">
+									<a href="javascript:void(0);"><span class="thumb"><img th:src="${imgGoodsUrl+'/'+goodsImg.sysImgNm}" alt="" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'"></span></a></li>
+								</th:block>
+							</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="adminYn" th:value="${params.adminYn}" />
+					<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" style="display:none;">
+								<p>
+									<span class="tit">남은시간</span>
+									<span class="timer">
+										<em id="d-days">0</em>
+										<em id="d-hours">0</em>
+										<em id="d-minutes">0</em>
+										<em id="d-seconds">0</em>
+									</span>
+								</p>
+							</div>
+							<div class="descript_box">
+								<div class="desc_top">
+									<button type="button" class="itemShare">상품 공유하기</button>
+									<button type="button" class="itemLike">관심상품 추가</button>
+								</div>
+								<div class="desc_info">
+									<div class="title_blk">
+										<span class="comment" th:text="${goodsInfo.goodsTnm}">
+											#본사 직영 인기캐주얼 특가전
+										</span>
+										<span class="name" th:text="${goodsInfo.goodsFullNm}">
+											[NBA외] 본사 직영~ 봄 신상 야구모자/백팩 외 99종 무료배송!
+										</span>
+									</div>
+									<div class="price_blk">
+										<span class="sale_price">
+											<em th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}">134,100</em>원 ~ 
+										</span>
+										<button type="button" id="btn_saleCoupon_pop" class="btn btn_primary btn_sm btn_coupon"  th:if="${goodsCouponList != null and !goodsCouponList.empty}" th:onclick="cfGoodsCouponInfo([[${goodsInfo.goodsCd}]])"><span>쿠폰받기</span></button>
+									</div>
+								</div>
+							</div>
+							<div class="benefit_box" th:if="${(cardInfoList != null and !cardInfoList.empty) or
+																(goodsCouponList != null and !goodsCouponList.empty)
+															}" >
+								<dl>
+									<div class="bnf_shopping" th:if="${goodsCouponList != null and !goodsCouponList.empty}">
+										<dt>쇼핑혜택</dt>
+										<!------------ 색상 강조 텍스트 영역 <em class="c_primary"></em> 사용요청 ------------>
+										<dd>
+											<span th:if="${goodsCouponList != null and !goodsCouponList.empty}">
+											<th:block th:each="goodsCoupon, status : ${goodsCouponList}" th:if="${status.first}">
+											최대 <em class="c_primary" >
+												<th:block th:if="${goodsCoupon.dcWay == 'G240_10'}" th:text="|${#numbers.formatInteger(goodsCoupon.dcVal, 0,'COMMA')}원|"></th:block>
+												<th:block th:unless="${goodsCoupon.dcWay == 'G240_10'}" th:text="|${goodsCoupon.dcVal}%|"></th:block>
+											</em> 쿠폰 할인
+											</th:block>
+											</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" th:onclick="cfGoodsShopBenefitInfo([[${goodsInfo.goodsCd}]])"><span>자세히</span></button>
+										</dd>
+									</div>
+									<div class="bnf_card" th:if="${cardInfoList != null and !cardInfoList.empty}">
+										<dt>카드혜택</dt>
+										<dd>
+											<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_select">
+									<form class="form_wrap">
+										<div class="form_field">
+											<div class="select_custom deal_opt_item">
+												<div class="combo">
+													<div class="select">
+														<div class="item_prod">
+															<div class="item_state">
+																<a href="javascript:void(0);" class="itemLink">
+																	<div class="itemPic">
+																		<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+																	</div>
+																	<div class="itemName">선택</div>
+																</a>
+															</div>
+														</div>
+													</div>
+													<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+														<th:block th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
+														<li th:onclick="fnOption1('Up', [[${goodsInfo.compsGoodsCd}]]);">
+															<div class="item_prod">
+																<div class="item_state" >
+																	<a href="javascript:void(0);" class="itemLink" >
+																		<div class="itemPic">
+																			<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+																		</div>
+																		<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+																		<div class="itemName" ><span class="tit_option" th:text="${'[상품'+status.count+']'}">[상품1]</span><th:block th:text="${goodsInfo.goodsFullNm}"></th:block></div>
+																		<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+																			<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+																			<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+																		</p>
+																	</a>
+																</div>
+															</div>
+														</li>
+														</th:block> 
+													</ul>
+												</div>
+											</div>
+										</div>
+										<div class="form_field">
+											<div class="select_custom deal_opt1" disabled>
+												<div class="combo">
+													<div class="select">선택</div>
+													<ul class="list" id="goodsDealOptUp1">
+														<!--  옵션 1 -->
+													</ul>
+												</div>
+											</div>
+										</div>
+										<div class="form_field">
+											<div class="select_custom deal_opt2" disabled>
+												<div class="combo">
+													<div class="select">선택</div>
+													<ul class="list" id="goodsDealOptUp2">
+														<!--  옵션 2 -->
+													</ul>
+												</div>
+											</div>
+										</div>
+									</form>
+								</div>
+								<div class="opt_result">
+									<div class="result_item">
+										<div class="opt_header">
+											<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
+											<span class="item_option">다크그레이/XXL</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>
+										</div>
+										<div class="item_price">
+											<p><em>99,999,999</em>원</p>
+										</div>
+										<button type="button" class="btn_delete_item"><span>삭제</span></button>
+									</div>
+								</div>
+							</div>
+							<div class="price_box">
+								<p class="number">
+									총&nbsp;<span id="goodsTotalQty">0</span>개
+								</p>
+								<p class="price">
+									<span>
+										<b id="goodsTotalPrice">0</b><em>원</em>
+									</span>
+								</p>
+							</div>
+							<div class="btn_box">
+								<div class="btn_group_block ui_row">
+									<div class="ui_col_6">
+										<button type="button" class="btn btn_dark btn_block" id="btnGoodsWish" onclick="fnAddCart('C');"><span>쇼핑백</span></button>
+									</div>
+									<div class="ui_col_6">
+										<button type="button" class="btn btn_primary btn_block" id="btnGoodsCart" onclick="fnAddCart('O');"><span>바로구매</span></button>
+									</div>
+								</div>
+								<div class="btn_group_block ui_row">
+									<div class="ui_col_12">
+										<button type="button" class="btn btn_dark btn_block" disabled><span>SOLD OUT</span></button>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+					</form>
+				</div>
+			</div>
+		</div>
+		<!-- 상품 대표설명 -->
+		
+		<th:block th:include="~{web/goods/GoodsIncludeFormWeb :: goodsDealComposeForm}"></th:block>
+		<!-- //***** 상품소개영역 ***** -->
+		<!-- 이 상품과 함께 본 상품 -->
+		<div class="content wide pd_clickother" id="goodsTogetherbArea">
+		</div>
+		<!-- // 이 상품과 함께 본 상품 -->
+	</div>
+	<!-- 상품썸네일 크게보기 팝업 -->
+	<div class="pd_pop full_pop pd_itemthumb_pop" id="pdItemThumbPop"> 
+		<div class="full_popup_wrap">
+			<h5 class="sr-only">상품썸네일 크게보기</h5>
+			<div class="btn_close">
+				<a href="" id="btn_close_itemThumbPop">닫기버튼</a>
+			</div>
+			<div class="full_pop_container">
+				<!-- 배송교환반품안내 리스트 내용 -->
+			</div>
+		</div>		
+	</div>
+	<!-- //상품썸네일 크게보기 팝업 -->
+</div>
+ 
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	var cateNm = "";
+	
+	// 함께본 상품
+	var fnGoodsTogetherSearch = function(params) {
+		gagajf.ajaxSubmit("/goods/detail/together/frame", "html", "goodsTogetherbArea", params);
+	}
+	
+	// 옵션1 조회
+	var fnOption1 = function(flag, goodsCd){
+		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+		let data = {goodsCd : goodsCd
+					};
+		let jsonData = JSON.stringify(data);
+	
+		gagajf.ajaxJsonSubmit('/goods/detail/option1/list', jsonData, function(result) {
+			
+			if (result.dataList != null && result.dataList.length > 0) {
+				let tag = "";
+				let $objUp = null;
+				let $objDown = null;
+				let qty = 1;
+				$.each(result.dataList, function(idx, item) {
+					if (idx == 0){
+						$objUp = $('#goodsDealOptUp1');
+						$objUp.append('');
+						$objDown = $('#goodsDealOptDown1');
+						$objDown.append('');
+						
+						$('.form_field .select_custom.deal_opt1').attr('disabled', false)
+						tag += '<li class="selected" id="goodsOpt1">선택</li>\n';	
+					}
+					let soldoutYn = ""; 
+					if (item.stockQty <= 0) soldoutYn = "true";
+					tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnOption2(\''+flag+'\', \''+ item.goodsCd+'\' , \''+ item.optCd1+'\' , \''+ qty+'\', \''+ item.minOrdQty+'\', \''+ item.maxOrdQty+'\')">\n';
+					tag += '<div>'+ item.optCd1+'</div>\n';
+					if (item.addPrice > 0){
+						tag += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
+					}
+					tag += '<input type="hidden" name="opt1" value="'+ item.goodsCd+'|'+item.optCd1 +'|'+qty +'" addPrice="'+item.addPrice+'"  optCd1="'+item.optCd1+'" />\n';
+					tag += '</li>\n';
+				});
+				
+				$objUp.append(tag);
+				$objDown.append(tag);
+				var detail_deal_option02 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt1');
+				var desc_option02 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt1');
+				//var pop_desc_option02 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt1');
+			}
+			
+			let $obj = null;
+			let $taget = null;
+			// 하단 우측 상품선택영역  Up/ Down
+			if (flag  == "Up"){
+				$obj = $('.pd_detail .opt_select .select_custom.deal_opt_item').find('.combo .select'); 
+				$taget = $('.pd_desc_wrap .opt_select .select_custom.deal_opt_item').find('.combo .select');
+			}else if (flag  == "Down"){
+				$taget = $('.pd_detail .opt_select .select_custom.deal_opt_item').find('.combo .select');
+				$obj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt_item').find('.combo .select');
+			}
+			let goodsDealInfo = $obj.html();
+			$taget.html(goodsDealInfo);
+			
+		});
+		
+	}
+	
+	// 옵션2 조회
+	var fnOption2 = function(flag, goodsCd, optCd1, qty, minOrdQty, maxOrdQty ){
+		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+		let data = {goodsCd : goodsCd
+					,optCd1 : optCd1
+					};
+		let jsonData = JSON.stringify(data);
+	
+		gagajf.ajaxJsonSubmit('/goods/detail/option2/list', jsonData, function(result) {
+			
+			if (result.dataList != null && result.dataList.length > 0) {
+				let tag = "";
+				let $objUp = null;
+				let $objDown = null;
+				$.each(result.dataList, function(idx, item) {
+					if (idx == 0){
+						$objUp = $('#goodsDealOptUp2');
+						$objUp.append('');
+						$objDown = $('#goodsDealOptDown2');
+						$objDown.append('');
+						$('.form_field .select_custom.deal_opt2').attr('disabled', false)
+						tag += '<li class="selected" id="goodsOpt2">선택</li>\n';	
+					}
+					let soldoutYn = ""; 
+					if ("Y" == item.soldoutYn || item.stockQty <= 0)soldoutYn = "true";
+					tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \''+ flag +'\' , \''+ item.goodsCd+'\' , \''+ item.optCd+'\' , \''+ item.optCd1+'\' , \''+ item.optCd2+'\', \''+ minOrdQty+'\', \''+ maxOrdQty+'\')">\n';
+					tag += '<div>'+ item.optCd2+'</div>\n';
+					if (item.addPrice > 0){
+						tag += '<div>'+ item.addPrice.addComma() +'원</div>\n';	
+					}
+					tag += '<input type="hidden" name="opt2" value="'+ item.goodsCd+'|'+item.optCd +'|'+qty +'" id="'+item.optCd+'" addPrice="'+item.addPrice+'"  optCd="'+item.optCd+'"  optCd1="'+item.optCd1+'"  optCd2="'+item.optCd2+'"  />\n';
+					tag += '</li>\n';
+				});
+				
+				$objUp.append(tag);
+				$objDown.append(tag);
+				var detail_deal_option03 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt2');
+				var desc_option03 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt2');
+				//var pop_desc_option03 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt2');
+				
+			}
+			
+			let $obj = null;
+			let $taget = null;
+			// 하단 우측 상품선택영역  Up/ Down
+			if (flag  == "Up"){
+				$obj = $('.pd_detail .opt_select .select_custom.deal_opt1').find('.combo .select'); 
+				$taget = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1').find('.combo .select');
+			}else if (flag  == "Down"){
+				$taget = $('.pd_detail .opt_select .select_custom.deal_opt1').find('.combo .select');
+				$obj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt1').find('.combo .select');
+			}
+			
+			let goodsDealInfo = $obj.html();
+			$taget.html(goodsDealInfo);
+			
+		});	
+	}
+	
+	//사이즈 클릭시 - 단품
+	var fnViewStock = function(obj, flag, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+		let $obj = $(obj);
+		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
+		let $target = null;
+		if (selfGoodsYn == "Y"){
+			$target = $obj.parent().parent().children('input[name="opt"]');
+			$target.prop("checked",true);
+			$("#selectOptCd1").html(optCd2);
+		}else{
+			$target = $obj.find('input[name="opt2"]');
+		}
+		let addPrice  = $target.attr("addPrice");
+		$("#selectOptCd1addPrice").html('');
+		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("");
+		
+		let maxCnt = maxOrdQty;
+		let 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) {
+			let 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);
+
+				fnSetTotalPrice();
+			}
+			
+			
+			// opt_result
+			/* <div class="result_item">
+				<div class="opt_header">
+					<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
+					<span class="item_option">다크그레이/XXL</span>
+				</div>
+				<div class="number_count">
+					<span class="minus min_val"><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>
+				</div>
+				<div class="item_price">
+					<p><em>99,999,999</em>원</p>
+				</div>
+				<button type="button" class="btn_delete_item"><span>삭제</span></button>
+			</div> */
+			let $obj = null;
+			let $taget = null;
+			// 하단 우측 상품선택영역  Up/ Down
+			if (flag  == "Up"){
+				$obj = $('.pd_detail .opt_select .select_custom.deal_opt2').find('.combo .select'); 
+				$taget = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2').find('.combo .select');
+			}else if (flag  == "Down"){
+				$taget = $('.pd_detail .opt_select .select_custom.deal_opt2').find('.combo .select');
+				$obj = $('.pd_desc_wrap .opt_select .select_custom.deal_opt2').find('.combo .select');
+			}
+			
+			let goodsDealInfo = $obj.html();
+			$taget.html(goodsDealInfo);
+			
+			
+		}, "text");
+	}
+	
+	// 수량 변경 클릭
+	var fnAdjustOrderEa = function(obj) {
+
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return false;
+			}
+		}else{
+			let target=$('.select_custom.item_opt2');
+			let targetSize = target.length;	//구성품 갯수
+			let itemSize = 0;
+			target.each(function(){
+				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
+					itemSize ++;
+				}
+			});
+			
+			if (targetSize != itemSize){
+				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+				return false;
+			}
+		}
+
+		let $obj = $(obj);
+		let $target = $obj.parent().children('input[name="cea"]');
+		let minOrdQty = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		let 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);
+
+		fnChangeOrderEa();
+	}
+
+	//옵션 갯수 변경
+	var fnChangeOrderEa = function() {
+
+		if("G056_N" == $("#cartForm  input[name=goodsType]").val()){
+			if(gagajf.isNull($("#cartForm  input[name=optCd2]").val())){
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return false;
+			}
+		}else{
+			
+			let target=$('.select_custom.item_opt2');
+			let targetSize = target.length;	//구성품 갯수
+			let itemSize = 0;
+			target.each(function(){
+				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
+					itemSize ++;
+				}
+			});
+			
+			if (targetSize != itemSize){
+				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+				return false;
+			}
+		}
+
+		//let f = document.cartForm;
+		let ea = parseInt($("#cartForm  input[name=cea]").val());
+		let buymin = parseInt($("#cartForm  input[name=minOrdQty]").val());
+		let buymax = parseInt($("#cartForm  input[name=maxOrdQty]").val());
+		let 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;
+		}
+
+		fnSetTotalPrice();
+	}
+	
+	//합계 계산
+	var fnSetTotalPrice = function() {
+		//let f = document.cartForm;
+
+		let totalEa = 0;
+		let totalPrice = 0;
+		
+		$('input[name="cea"]').each(function() {
+			let ea = parseInt($(this).val());
+			let addPrice = 0;
+			let target=$('.select_custom.item_opt2');
+			target.each(function() {
+				if (typeof ($(this).find('input[name=opt2]').val()) != 'undefined' && !gagajf.isNull($(this).find('input[name=opt2]').val())){
+					addPrice += Number($(this).find('input[name=opt2]').attr('addPrice'));	
+				}
+			});	
+			
+			let 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 fnAddCart = function(btnType){
+		
+		// 바로구매는 로그인여부 확인
+		if (btnType == "O" && !cfCheckLogin()) {
+			
+			let btn = ["비회원 구매", "로그인후 구매"]; //버튼명[좌,우]
+			mcxDialog.confirmC("로그인 후 구매 시 다양한 혜택을 받으실 수 있습니다.", { //내용
+				btn: btn,
+				btnClick: function(index){
+					if (index == 1){ //button1 일때 처리문
+						// 비회원 URL
+						ALERT('비회원');
+					} else {	//button2 일때 처리문
+						cfnGoToPage(_PAGE_LOGIN);
+					}
+				}
+			});
+			return false;
+		}
+		
+		let params = [];
+		let goodsType = $("#cartForm  input[name=goodsType]").val();
+
+		if (goodsType == 'G056_N'){
+			if (gagajf.isNull($("#cartForm  input[name=optCd2]").val())) {
+				mcxDialog.alert("사이즈를 선택하세요.");
+				return;
+			}
+		
+			let 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.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'){  //수정요
+		
+			let target=$('.select_custom.item_opt2');
+			let targetSize = target.length;	//구성품 갯수
+			let itemSize = 0;
+			target.each(function(){
+				if (typeof ($(this).find('.select').find('input[name=opt2]').val()) != 'undefined' &&  !gagajf.isNull($(this).find('.select').find('input[name=opt2]').val())){
+					itemSize ++;
+				}
+			});
+			
+			if (targetSize != itemSize){
+				mcxDialog.alert("구성상품들의 옵션을 선택하세요.");
+				return false;
+			}
+			
+			target.each(function() {
+				var arrInfo = $(this).find('input[name=opt2]').val().split('|');	// 상품코드|사이즈|구성수량
+				
+				var obj = new Object();
+				obj.cartGb = btnType;
+				obj.goodsType = $("#cartForm  input[name=goodsType]").val();
+				obj.goodsCd = $("#cartForm  input[name=goodsCd]").val();
+				obj.itemCd = arrInfo[0];
+				obj.optCd = arrInfo[1];
+				obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
+				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);
+				
+			});
+		}
+		
+		// 장바구니담기
+		cfnAddCart(params);
+	}
+	
+	$(document).ready( function() {
+		
+		$('.timer_box').css('display', 'none');
+		
+		var params = new Object();
+		params.goodsCd = [[${params.goodsCd}]];
+		params.viewDt = [[${params.viewDt}]];
+		params.preview = [[${params.preview}]];
+		params.adminYn = [[${params.adminYn}]];
+		params.goodsType = [[${params.goodsType}]];
+		params.supplyCompCd = [[${params.supplyCompCd}]];
+		params.brandGroupNm = [[${goodsInfo.brandGroupNm}]];
+		
+		// 함께본 상품(ajax html)
+		params.goodsOtherGb = "together";
+		params.ithrCd = "tmtb";
+		params.contentsLoc = "tmtb";
+		fnGoodsTogetherSearch(params);
+
+		if (!gagajf.isNull([[${goodsInfo.socialSq}]])){
+			$('.timer_box').css('display', 'block');
+			/* 행사 남은시간 */
+			function promotionTimer() {
+				var endTime = new Date([[${goodsInfo.socialEddt}]]); // 남은시간 지정	30 March 2021 9:56:00 GMT+0900	
+					endTime = (Date.parse(endTime) / 1000);
+	
+					var now = new Date();
+					now = (Date.parse(now) / 1000);
+	
+					var timeLeft = endTime - now;
+	
+					var days = Math.floor(timeLeft / 86400); 
+					var hours = Math.floor((timeLeft - (days * 86400)) / 3600);
+					var minutes = Math.floor((timeLeft - (days * 86400) - (hours * 3600 )) / 60);
+					var seconds = Math.floor((timeLeft - (days * 86400) - (hours * 3600) - (minutes * 60)));
+	
+					if (hours < '10') { hours = '0' + hours; }
+					if (minutes < '10') { minutes = '0' + minutes; }
+					if (seconds < '10') { seconds = '0' + seconds; }
+	
+					if (Number(days) > 0 ){
+						$('#d-days').html(days);	
+					}else{
+						$('#d-days').css('display','none');
+					}
+					$('#d-hours').html(hours);
+					$('#d-minutes').html(minutes);
+					$('#d-seconds').html(seconds);		
+			}
+			setInterval(function() { promotionTimer(); }, 1000);
+		}
+
+		//상품 대표설명 > 우측 상품정보 
+		/* 딜 옵션선택 후 다음 옵션 활성화 */
+		var detail_deal_option01 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt_item');
+		//var detail_deal_option02 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt1');
+		//var detail_deal_option03 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt2');
+		/* $('.pd_detail .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;
+		}); */
+
+		// 하단 우측 상품선택영역
+		/* 딜 옵션선택 후 다음 옵션 활성화 */
+		var desc_option01 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt_item');
+		//var desc_option02 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt1');
+		//var desc_option03 = new sCombo('.pd_desc_wrap .opt_select .select_custom.deal_opt2');
+		/* $('.pd_desc_wrap .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;
+		});	 */		
+
+		// 상품선택 옵션 : 하단 상품정보 영역  
+		var tab_review_item = new sCombo('.tab_detail_cont .select_custom.deal_opt_item.forReview');
+		var tab_qna_item = new sCombo('.tab_detail_cont .select_custom.deal_opt_item.forQna');
+		var tab_exinfo_item = new sCombo('.tab_detail_cont .select_custom.deal_opt_item.forExinfo');
+
+		// 상품선택 옵션 : 상세정보 > 상품 > 팝업
+		var pop_desc_option01 = new sCombo('.pd_descrp_pop .select_custom.deal_opt_item');
+		//var pop_desc_option02 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt1');
+		//var pop_desc_option03 = new sCombo('.pd_detail .opt_select .select_custom.deal_opt2');
+
+		/* 상품옵션변경 팝업 > 수량조절 */
+		//수량1개 이하 감소버튼 비활성화 
+		var valItemCount = $('.option_box .result_item .number_count input').val();
+		if ( valItemCount == 1 ) {
+			$(' .option_box .result_item .number_count .minus').addClass('min_val');
+		} 
+
+		//상품상세정보 더보기
+		$(document).on('click','.pd_descrp_pop .btn_more_box button',function(e){
+			$('.pd_descrp_pop .cont_body').toggleClass('on'); 
+			$(this).toggleClass('active');
+			$(this).parent('.btn_more_box').toggleClass('covered');
+			var descrpToggle = $(this).find('span');
+			$(descrpToggle).text($(descrpToggle).text() == '상세정보 더보기' ? '상세정보 접기' : '상세정보 더보기');
+			return false;
+		}); 
+
+		//상품상세정보 탭
+		$(document).on('click','.pd.deal .tab_detail_nav ul li',function(e){
+			$(this).addClass('active').siblings().removeClass('active');
+			$('.pd.deal .tab_detail_cont').hide();		
+			$('.pd.deal .tab_detail_cont').eq($(this).index()).show();
+			
+			//상품상세정보 호출
+			//$('.pd_review .cont_body').load('pd_review_pop.html');
+			//$('.pd_qnalist .cont_body').load('pd_qnalist_pop.html');
+			//$('.pd_delivery .cont_body').load('pd_delivery_pop.html');
+			
+			return false;
+		});						
+					
+		//슬라이드 - 이 상품과 함께 본 상품 
+		var otherItemSwiper = new Swiper('.pd .pd_clickother .area_slider .swiper-container', {
+			slidesPerView: 5,
+			spaceBetween: 20,
+			navigation: {
+				nextEl: '.pd_clickother .swiper-button-next',
+				prevEl: '.pd_clickother .swiper-button-prev',
+			},
+			pagination: {
+				el: '.pd_clickother .swiper-pagination',
+				clickable: true,
+			},
+		});
+
+		// 광고 스크립트용
+		var goodsNavigation = [[${goodsNavigation}]];
+		var cate1Nm = "";
+		var cate2Nm = "";
+		var cate3Nm = "";
+		var cate4Nm = "";
+		var cate5Nm = "";
+		if (!gagajf.isNull(goodsNavigation)) {
+			cate1Nm = goodsNavigation.cate1Nm;
+			cate2Nm = goodsNavigation.cate2Nm;
+			cate3Nm = goodsNavigation.cate3Nm;
+			cate4Nm = goodsNavigation.cate4Nm;
+			cate5Nm = goodsNavigation.cate3Nm;
+			
+			if (!gagajf.isNull(cate1Nm)) {
+				cateNm += cate1Nm;
+			}
+			if (!gagajf.isNull(cate2Nm)) {
+				cateNm += ' > ' + cate2Nm;
+			}
+			if (!gagajf.isNull(cate3Nm)) {
+				cateNm += ' > ' + cate3Nm;
+			}
+			if (!gagajf.isNull(cate4Nm)) {
+				cateNm += ' > ' + cate4Nm;
+			}
+			if (!gagajf.isNull(cate5Nm)) {
+				cateNm += ' > ' + cate5Nm;
+			}
+		}
+		// 광고 스크립트용
+		
+		var snsGoodsImg = _uploadGoodsUrl + [[${goodsInfo.sysImgNm}]];
+		var snsUrl = location.protocol + _PAGE_GOODS_DETAIL + params.goodsCd +'&colorCd =' + params.colorCd  ;
+		var snsGoodsFullNm = [[${goodsInfo.goodsFullNm}]];
+		
+		<!-- 페이스북 카카오스토리 연동 관련 메타태그 -->
+		$("meta[property='og:url']").attr('content', snsUrl);
+		$("meta[property='og:title']").attr('content', snsGoodsFullNm);
+		$("meta[property='og:description']").attr('content', snsGoodsFullNm);
+		$("meta[property='og:image']").attr('content', snsGoodsImg);
+
+		<!-- 트위터 관련 메타태그 -->
+		$("meta[name='twitter:url']").attr('content', snsUrl);
+		$("meta[name='twitter:title']").attr('content', snsGoodsFullNm);
+		$("meta[name='twitter:description']").attr('content', snsGoodsFullNm);
+		$("meta[name='twitter:image']").attr('content', snsGoodsImg);
+
+		// 추천솔류션 meta 설정
+		$("meta[property='eg:type']").attr('content',"product");
+		$("meta[property='eg:cuid']").attr('content',eglqueueCuid);
+		$("meta[property='eg:itemId']").attr('content', [[${goodsInfo.goodsCd}]] );
+		$("meta[property='eg:itemName']").attr('content',[[${goodsInfo.goodsFullNm}]] );
+		$("meta[property='eg:itemImage']").attr('content', snsGoodsImg);
+		$("meta[property='eg:itemUrl']").attr('content',snsUrl);
+		$("meta[property='eg:originalPrice']").attr('content',[[${goodsInfo.listPrice}]]);
+		$("meta[property='eg:salePrice']").attr('content',[[${goodsInfo.currPrice}]]);
+		$("meta[property='eg:category1']").attr('content',cate1Nm);
+		$("meta[property='eg:category2']").attr('content',cate2Nm);
+		$("meta[property='eg:category3']").attr('content',cate3Nm);
+		$("meta[property='eg:category4']").attr('content',cate4Nm);
+		$("meta[property='eg:category5']").attr('content',cate5Nm);
+		$("meta[property='eg:brandId']").attr('content',[[${goodsInfo.brandGroupNo}]]);
+		$("meta[property='eg:brandName']").attr('content',[[${goodsInfo.brandGroupNm}]]);
+		$("meta[property='eg:regDate']").attr('content',[[${goodsInfo.regDt}]].toDate("YYYYMMDDHHmmss").format("YYYY-MM-DDTHH:mm:ssZ"));
+		$("meta[property='eg:updateDate']").attr('content',[[${goodsInfo.updDt}]].toDate("YYYYMMDDHHmmss").format("YYYY-MM-DDTHH:mm:ssZ"));
+		$("meta[property='eg:stock']").attr('content',"");
+		$("meta[property='eg:state']").attr('content',[[${goodsInfo.goodsStatNm}]]);
+		$("meta[property='eg:description']").attr('content',null);
+		$("meta[property='eg:extraImage']").attr('content',null);
+		$("meta[property='eg:locale']").attr('content',"KR");
+		$("meta[property='eg:isNew']").attr('content',([[${goodsInfo.formalGb}]] == 'G009_10')? 'True' :'False');
+		$("meta[property='eg:etc1']").attr('content', [[${goodsInfo.selfGoodsYn}]]);
+	});
+	
+/*]]>*/
+</script>
+<!-- 광고 스크립트 -->
+<!-- <th:block th:replace="~{web/common/advertisements/GoodsDetailScriptsWeb :: scripts}"></th:block> -->
+<!-- //광고 스크립트 -->
+
+</th:block>
+
+</body>
+</html>

+ 211 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsDealListFormWeb.html

@@ -0,0 +1,211 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : GoodsDealListForm.html
+ * @desc	: 딜 구성상품 상세정보 팝업
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE		 AUTHOR	  DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.24   eskim		최초 작성
+ *******************************************************************************
+ -->
+<div class="full_popup_wrap" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}">
+	<h5 class="sr-only">개별상품 상세정보 안내</h5>
+	<div class="btn_close">
+		<a href="javascript:void(0)" onclick="cfCloseFullLayer('layer_goods_deal_detail');">닫기버튼</a>
+	</div>
+	<div class="full_pop_header">
+		<!-- 아이템선택 -->
+		<div class="form_field">
+			<div class="select_custom deal_opt_item">
+				<div class="combo">
+					<div class="select">
+						<div class="item_prod">
+							<div class="item_state">
+								<a href="javascript:void(0);" class="itemLink">
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+									</div>
+									<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+									<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+									<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+										<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+										<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+									</p>
+								</a>
+							</div>
+						</div>
+					</div>
+					<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+						<li class="selected" th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
+							<div class="item_prod">
+								<div class="item_state">
+									<a href="javascript:void(0);" class="itemLink" th:onclick="fnGoodsDealDesc([[${goodsInfo.compsGoodsCd}]])">
+										<div class="itemPic">
+											<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+										</div>
+										<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+										<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+										<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+											<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+											<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+										</p>
+									</a>
+								</div>
+							</div>
+						</li> 
+					</ul>
+				</div>
+			</div>
+		</div>
+		<!-- //아이템선택 -->
+	</div>
+	<div class="full_pop_container" id="goodsDealDetail">
+		<!-- 개별상품 상세정보 팝업 내용 -->
+	</div>
+	<div class="full_pop_fix_r">
+		<div class="option_box">
+			<div class="opt_select">
+				<form class="form_wrap">
+					<div class="form_field">
+						<div class="select_custom deal_opt1">
+							<div class="combo">
+								<div class="select">선택</div>
+								<ul class="list">
+									<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+									<li class="selected">선택</li> 
+									<li>상품옵션01</li>
+									<li>상품옵션02</li>
+									<li>상품옵션03</li>
+									<li aria-disabled="true">
+										<div>상품옵션05</div>
+										<div>120,000원</div>
+									</li>
+									<li>상품옵션06</li>
+									<li aria-disabled="true" data-soldout="true">
+										<div>상품옵션07</div>
+										<div>120,000원</div>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+					<div class="form_field">
+						<div class="select_custom deal_opt2" disabled>
+							<div class="combo">
+								<div class="select">선택</div>
+								<ul class="list">
+									<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+									<li class="selected">선택</li> 
+									<li>상품옵션11</li>
+									<li>상품옵션12</li>
+									<li>상품옵션13</li>
+									<li aria-disabled="true">
+										<div>상품옵션15</div>
+										<div>120,000원</div>
+									</li>
+									<li>상품옵션16</li>
+									<li aria-disabled="true" data-soldout="true">
+										<div>상품옵션17</div>
+										<div>120,000원</div>
+									</li>
+								</ul>
+							</div>
+						</div>
+					</div>
+				</form>
+			</div>
+			<div class="opt_result">
+				<div class="result_item">
+					<div class="opt_header">
+						<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
+						<span class="item_option">다크그레이/XXL</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>
+					</div>
+					<div class="item_price">
+						<p><em>99,999,999</em>원</p>
+					</div>
+					<button type="button" class="btn_delete_item"><span>삭제</span></button>
+				</div>
+				<div class="result_item">
+					<div class="opt_header">
+						<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
+						<span class="item_option">블루그레이/S</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>
+					</div>
+					<div class="item_price">
+						<p><em>99,999,999</em>원</p>
+					</div>
+					<button type="button" class="btn_delete_item"><span>삭제</span></button>
+				</div>
+			</div>
+		</div>
+		<div class="price_box">
+			<p class="number">
+				총&nbsp;<span>99</span>개
+			</p>
+			<p class="price">
+				<span>
+					99,999,999<em>원</em>
+				</span>
+			</p>
+		</div>
+		<div class="btn_box">
+			<div class="btn_group_block ui_row">
+				<div class="ui_col_6">
+					<button id="btn_add_cart" class="btn btn_dark btn_block" ><span>쇼핑백</span></button>
+				</div>
+				<div class="ui_col_6">
+					<button class="btn btn_primary btn_block" id=""><span>바로구매</span></button>
+				</div>
+			</div>
+			<div class="btn_group_block ui_row">
+				<div class="ui_col_12">
+					<button class="btn btn_dark btn_block" id="" disabled><span>SOLD OUT</span></button>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	var pop_desc_option01 = new sCombo('.pd_descrp_pop .select_custom.deal_opt_item');
+	
+	// 구성 상품 상세 
+	var fnGoodsDealDetail = function(params) {
+		gagajf.ajaxSubmit("/goods/deal/detail/info/frame", "html", "goodsDealDetail", params);
+	}
+	
+	// 상품선택시
+	var fnGoodsDealDesc = function(goodsCd){
+		var params = new Object();
+		params.goodsCd = goodsCd;
+		fnGoodsDealDetail(params);  // ajax html
+	}
+	
+	$(document).ready( function() {
+
+		var params = new Object();
+		params.goodsCd = [[${params.compsGoodsCd}]];
+		fnGoodsDealDetail(params);  // ajax html
+	});
+	
+	
+/*]]>*/
+</script>
+
+ </html>

+ 10 - 11
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -190,7 +190,7 @@
 										<div  th:each="goodsOption2, status : ${goodsOption2List}">
 											<input type="radio" name="opt"  th:id="${goodsOption2.optCd}" th:disabled="${goodsOption2.soldoutYn == 'Y' or goodsOption2.stockQty <= 0}" 
 													th:attr="addPrice=${goodsOption2.addPrice}, optCd1=${goodsOption2.optCd1}, optCd2=${goodsOption2.optCd2}, optCd=${goodsOption2.optCd}">
-											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" th:onclick="fnViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
+											<label th:for="${goodsOption2.optCd}"><span th:text="${goodsOption2.optCd2}" th:onclick="fnViewStock(this, [[${goodsInfo.goodsCd}]],[[${goodsOption2.optCd}]],[[${goodsOption2.optCd1}]],[[${goodsOption2.optCd2}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]] )">100</span></label>
 										</div>
 									</div>
 								</div>
@@ -211,7 +211,9 @@
 												<ul class="list">
 													<th:block th:each="goodsOption, optionStatus : ${goodsCompose.goodsOption1List}" >
 													<li class="selected" th:id="|selfGoodsOpt1${goodsCompose.compsGoodsCd}|" th:if=${optionStatus.first}>선택</li> 
-													<li th:onclick="fnOption2([[${status.count}]], [[${goodsOption.goodsCd}]],[[${goodsOption.optCd1}]],[[${goodsCompose.qty}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]])">
+													<li th:onclick="fnOption2([[${status.count}]], [[${goodsOption.goodsCd}]],[[${goodsOption.optCd1}]],[[${goodsCompose.qty}]],[[${goodsInfo.minOrdQty}]], [[${goodsInfo.maxOrdQty}]])"
+														th:attr="aria-disabled=${(goodsCompose.goodsStat != 'G008_90')? 'true':''}, data-soldout=${(goodsCompose.goodsStat != 'G008_90')? 'true':''}"
+														>
 														<div th:text="${goodsOption.optCd1}">상품옵션</div>
 														<div th:if="${goodsOption.addPrice > 0}" th:text="|${#numbers.formatInteger(goodsOption.addPrice, 0,'COMMA')}원|">0원</div>
 														<input type="hidden" name="opt" th:attr="addPrice=${goodsOption.addPrice}, optCd1=${goodsOption.optCd1},optCd2=${goodsOption.optCd2}, optCd=${goodsOption.optCd}"/>
@@ -310,7 +312,7 @@
 								</th:block>
 								<th:block  th:unless="${goodsInfo.stockQty > 0}">
 									<div class="ui_col_12">
-										<button type="button" class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
+										<button type="button" class="btn btn_dark btn_block" disabled=""><span>SOLD OUT</span></button>
 									</div>
 								</th:block>
 								</div>
@@ -782,7 +784,7 @@
 	}
 	
 	//사이즈 클릭시 - 단품
-	var fnViewStock = function(obj, goodsCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
+	var fnViewStock = function(obj, goodsCd, optCd, optCd1, optCd2,  minOrdQty, maxOrdQty) {
 		let $obj = $(obj);
 		let selfGoodsYn = $("#cartForm  input[name=selfGoodsYn]").val();
 		let $target = null;
@@ -794,7 +796,7 @@
 			$target = $obj.find('input[name="opt2"]');
 		}
 		let addPrice  = $target.attr("addPrice");
-		let optCd  = $target.attr("optCd");
+		// let optCd  = $target.attr("optCd");
 		$("#selectOptCd1addPrice").html('');
 		if (Number(addPrice) > 0) $("#selectOptCd1addPrice").html("(+" + addPrice.addComma() + ")");
 		
@@ -1087,7 +1089,6 @@
 				obj.itemCd = arrInfo[0];
 				obj.optCd = arrInfo[1];
 				obj.goodsQty = $("#cartForm  input[name=ordQty]").val();
-				//obj.itemQty = Number(arrInfo[2]);
 				obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
 				obj.ithrCd =$("#cartForm  input[name=ithrCd]").val();
 				obj.contentsLoc =$("#cartForm  input[name=contentsLoc]").val();
@@ -1119,7 +1120,6 @@
 				obj.optCd = $(this).attr("optCd");
 				obj.goodsQty = $(this).attr("minOrdQty");
 				obj.goodsType = $(this).attr("goodsType");
-				//obj.dealGoodsCd = $("#cartForm  input[name=goodsType]").val();
 				obj.cartGb = btnType;
 				obj.afLinkCd =$("#cartForm  input[name=afLinkCd]").val();
 				obj.ithrCd = $(this).attr("ithrCd");
@@ -1178,7 +1178,7 @@
 					if (selfGoodsYn == "Y"){
 						tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStockSet(this, \''+ item.goodsCd+'\' , \''+ item.optCd1+'\' , \''+ item.optCd2+'\', \''+ minOrdQty+'\', \''+ maxOrdQty+'\')">\n';	
 					}else{
-						tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \''+ item.goodsCd+'\' , \''+ item.optCd1+'\' , \''+ item.optCd2+'\', \''+ minOrdQty+'\', \''+ maxOrdQty+'\')">\n';
+						tag += '<li aria-disabled="'+soldoutYn+'" data-soldout="'+soldoutYn +'" onclick="fnViewStock(this, \''+ item.goodsCd+'\' , \''+ item.optCd+'\' , \''+ item.optCd1+'\' , \''+ item.optCd2+'\', \''+ minOrdQty+'\', \''+ maxOrdQty+'\')">\n';
 					}
 					tag += '<div>'+ item.optCd2+'</div>\n';
 					if (item.addPrice > 0){
@@ -1214,7 +1214,7 @@
 		
 		$('.timer_box').css('display', 'none');
 		
-		let params = new Object();
+		var params = new Object();
 		params.goodsCd = [[${params.goodsCd}]];
 		params.viewDt = [[${params.viewDt}]];
 		params.preview = [[${params.preview}]];
@@ -1381,8 +1381,7 @@
 			setInterval(function() { promotionTimer(); }, 1000);
 		}
 
-		/* 상품옵션변경 팝업 > 수량조절 */
-//		
+		
 		
 		//스타일링 추천 picker	
 		$(document).on('mouseenter','.pd_recommend .area_slider .item_picker button',function(e){

+ 331 - 0
src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html

@@ -73,4 +73,335 @@
 </div>
 </th:block>
 
+<!-- 딜 상품 상품소개영역 -->
+<th:block  th:fragment="goodsDealComposeForm">
+<!-- ***** 상품소개영역 ***** -->
+<div class="content pd_desc_wrap" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}">
+	<div class="cont_body">
+		<div class="item_descrp">
+			<div class="area_list">
+				<!-- 상품소개 탭 -->
+				<div class="tab_detail_nav">
+					<ul>
+						<li class="active"><a href="javascript:void(0)">상세정보</a></li>
+						<li><a href="javascript:void(0)">리뷰<em>(9,999+)</em></a></li>
+						<li><a href="javascript:void(0)">문의<em>(9,999+)</em></a></li>
+						<li><a href="javascript:void(0)">배송/교환/반품</em></a></li>
+					</ul>
+				</div>
+				<!-- //상품소개 탭 -->
+				<!-- 상품상세정보 -->
+				<div class="tab_detail_cont pd_dealitem" style="display:block;" >
+					<div class="itemsGrp" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+						<!--  반복 -->
+						<div class="item_prod" th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
+							<div class="item_state">
+								<a href="javascript:void(0);" class="itemLink" th:onclick="cfGoodsDeailDetail([[${goodsInfo.goodsCd}]],[[${goodsInfo.compsGoodsCd}]])">
+									<div class="rank detail">
+										<span>상품<em class="number" th:text="${#numbers.formatInteger(status.count,2)}">01</em></span>
+									</div>
+									<div class="itemPic">
+										<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+									</div>
+									<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>
+									<div class="itemName" th:text="${goodsInfo.goodsFullNm}">남성 </div>
+									<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+										<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+										<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+									</p>
+								</a>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- //상품상세정보 -->
+				<!-- 상품리뷰 리스트 -->
+				<div class="tab_detail_cont pd_review">
+					<div class="cont_head">
+						<h3 class="sr-only">상품리뷰 목록</h3>
+						<!-- 아이템선택 -->
+						<div class="form_field">
+							<div class="select_custom deal_opt_item forReview">
+								<div class="combo">
+									<div class="select">
+										<div class="item_prod">
+											<div class="item_state">
+												<a href="javascript:void(0)" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+													</div>
+													<div class="itemName">선택</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<ul class="list">
+										<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+										<li class="selected">
+											<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_pdDetail1.jpg">
+														</div>
+														<p class="itemBrand">NBA 키즈</p>
+														<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+														<p class="itemPrice">134,100
+															<span class="itemPrice_original">149,000</span>
+															<span class="itemPercent">30%</span>
+														</p>
+													</a>
+												</div>
+											</div>
+										</li> 
+									</ul>
+								</div>
+							</div>
+						</div>
+						<!-- //아이템선택 -->
+					</div>
+					<div class="cont_body">
+						아이템별 상품리뷰 목록
+					</div>
+				</div>
+				<!-- //상품리뷰 리스트 -->
+				<!-- 상품문의 리스트 -->
+				<div class="tab_detail_cont pd_qnalist">
+					<div class="cont_head">
+						<h3 class="sr-only">상품문의 목록</h3>
+						<!-- 아이템선택 -->
+						<div class="form_field">
+							<div class="select_custom deal_opt_item forQna">
+								<div class="combo">
+									<div class="select">
+										<div class="item_prod">
+											<div class="item_state">
+												<a href="javascript:void(0)" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+													</div>
+													<div class="itemName">선택</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<ul class="list">
+										<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+										<li class="selected">
+											<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_pdDetail1.jpg">
+														</div>
+														<p class="itemBrand">NBA 키즈</p>
+														<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+														<p class="itemPrice">134,100
+															<span class="itemPrice_original">149,000</span>
+															<span class="itemPercent">30%</span>
+														</p>
+													</a>
+												</div>
+											</div>
+										</li> 
+										
+									</ul>
+								</div>
+							</div>
+						</div>
+						<!-- //아이템선택 -->
+					</div>
+					<div class="cont_body">
+						아이템별 상품문의 목록
+					</div>
+				</div>
+				<!-- //상품문의 리스트 -->
+				<!-- 배송/교환/반품 정보 -->
+				<div class="tab_detail_cont pd_delivery">
+					<div class="cont_head">
+						<h3 class="sr-only">배송/교환/반품 정보</h3>
+						<!-- 아이템선택 -->
+						<div class="form_field">
+							<div class="select_custom deal_opt_item forExinfo">
+								<div class="combo">
+									<div class="select">
+										<div class="item_prod">
+											<div class="item_state">
+												<a href="javascript:void(0)" class="itemLink">
+													<div class="itemPic">
+														<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdDetail1.jpg">
+													</div>
+													<div class="itemName">선택</div>
+												</a>
+											</div>
+										</div>
+									</div>
+									<ul class="list">
+										<!-- 선택처리 class="selected" / 선택불가 aria-disabled="true" / 품절표기 data-soldout="true" 추가  -->
+										<li class="selected">
+											<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_pdDetail1.jpg">
+														</div>
+														<p class="itemBrand">NBA 키즈</p>
+														<div class="itemName">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>
+														<p class="itemPrice">134,100
+															<span class="itemPrice_original">149,000</span>
+															<span class="itemPercent">30%</span>
+														</p>
+													</a>
+												</div>
+											</div>
+										</li> 
+									</ul>
+								</div>
+							</div>
+						</div>
+						<!-- //아이템선택 -->
+					</div>
+					<div class="cont_body">
+						아이템별 배송/교환/반품 정보
+					</div>
+				</div>
+				<!-- //배송/교환/반품 정보 -->
+			</div>
+			<div class="area_option">
+				<div class="opt_wrap">
+					<div class="option_box">
+						<div class="opt_select">
+								<div class="form_field">
+									<div class="select_custom deal_opt_item">
+										<div class="combo">
+											<div class="select">
+												<div class="item_prod">
+													<div class="item_state">
+														<a href="javascript:void(0)" class="itemLink">
+															<div class="itemPic">
+																<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+															</div>
+															<div class="itemName">선택</div>
+														</a>
+													</div>
+												</div>
+											</div>
+											<ul class="list" th:if="${goodsDealComposeList  != null and !goodsDealComposeList.empty}">
+												<th:block th:each="goodsInfo, status : ${goodsDealComposeList}" th:attr="aria-disabled=${(goodsInfo.goodsStat != 'G008_90' or goodsInfo.stockQty <= 0)? 'true':''}, data-soldout=${(goodsInfo.stockQty <= 0)? 'true':''}">
+												<li  th:onclick="fnOption1('Down', [[${goodsInfo.compsGoodsCd}]]);">
+													<div class="item_prod">
+														<div class="item_state">
+															<a href="javascript:void(0);" class="itemLink">
+																<div class="itemPic">
+																	<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
+																</div>
+																<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
+																<div class="itemName" ><span class="tit_option" th:text="${'[상품'+status.count+']'}">[상품1]</span><th:block th:text="${goodsInfo.goodsFullNm}"></th:block></div>
+																<p class="itemPrice"><th:block th:text="${#numbers.formatInteger(goodsInfo.currPrice, 0,'COMMA')}"> 134,100</th:block>
+																	<span class="itemPrice_original" th:if="${goodsInfo.listPrice > goodsInfo.currPrice}" th:text="${#numbers.formatInteger(goodsInfo.listPrice, 0,'COMMA')}">149,000</span>
+																	<span class="itemPercent" th:if="${goodsInfo.dcRate > 0}" th:text="|${#numbers.formatDecimal(goodsInfo.dcRate,0,0)}%|">30%</span>
+																</p>
+															</a>
+														</div>
+													</div>
+												</li>
+												</th:block> 
+											</ul>
+										</div>
+									</div>
+								</div>
+								<div class="form_field">
+									<div class="select_custom deal_opt1" disabled>
+										<div class="combo">
+											<div class="select">선택</div>
+											<ul class="list" id="goodsDealOptDown1">
+												<!--  옵션 1 -->
+											</ul>
+										</div>
+									</div>
+								</div>
+								<div class="form_field">
+									<div class="select_custom deal_opt2" disabled>
+										<div class="combo">
+											<div class="select">선택</div>
+											<ul class="list" id="goodsDealOptDown2">
+												<!--  옵션 2 -->
+											</ul>
+										</div>
+									</div>
+								</div>
+						</div>
+						<div class="opt_result">
+							<div class="result_item">
+								<div class="opt_header">
+									<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
+									<span class="item_option">다크그레이/XXL</span>
+								</div>
+								<div class="number_count">
+									<span class="minus min_val"><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>
+								</div>
+								<div class="item_price">
+									<p><em>99,999,999</em>원</p>
+								</div>
+								<button type="button" class="btn_delete_item"><span>삭제</span></button>
+							</div>
+							<div class="result_item">
+								<div class="opt_header">
+									<span class="item_name">[상품1] 남성 테이퍼드핏 기모면 올밴딩 팬트</span>
+									<span class="item_option">블루그레이/S</span>
+								</div>
+								<div class="number_count">
+									<span class="minus min_val"><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>
+								</div>
+								<div class="item_price">
+									<p><em>99,999,999</em>원</p>
+								</div>
+								<button type="button" class="btn_delete_item"><span>삭제</span></button>
+							</div>
+						</div>
+					</div>
+					<div class="price_box">
+						<p class="number">
+							총&nbsp;<span>99</span>개
+						</p>
+						<p class="price">
+							<span>
+								99,999,999<em>원</em>
+							</span>
+						</p>
+					</div>
+					<div class="btn_box">
+						<div class="btn_group_block ui_row">
+							<div class="ui_col_6">
+								<button type="button" id="btn_add_cart" class="btn btn_dark btn_block"><span>쇼핑백</span></button>
+							</div>
+							<div class="ui_col_6">
+								<button type="button"  class="btn btn_primary btn_block" id=""><span>바로구매</span></button>
+							</div>
+						</div>
+						<div class="btn_group_block ui_row">
+							<div class="ui_col_12">
+								<button type="button" class="btn btn_dark btn_block" id="" disabled=""><span>SOLD OUT</span></button>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+		
+	
+/*]]>*/
+</script>
+
+		
+</th:block>
+
 </html>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsOtherFormWeb.html

@@ -34,7 +34,7 @@
 							<button type="button" class="itemLike" th:classappend="${goodsInfo.wishYn == 'Y'}? 'active' : ''"  onclick="cfnPutWishList(this);" th:attr="goodsCd=${goodsInfo.goodsCd}, ithrCd=${params.ithrCd}, contentsLoc=${params.contentsLoc}, planDtlSq=''">관심상품 추가</button>
 							<a href="javascript:void(0);" onclick="cfnGoToGoodsDetail([[${goodsInfo.goodsCd}]], '',[[${params.ithrCd}]],'[[${params.contentsLoc}]]','','pc_detail');" class="itemLink" >
 								<div class="itemPic">
-									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}">
+									<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 									
 								</div>
 								<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">BRAND NAME1</p>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsQnaFormWeb.html

@@ -25,7 +25,7 @@
 			<div class="item_state">
 				<a href="javascript:void(0);" class="itemLink">
 					<div class="itemPic">
-						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}">
+						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 					</div>
 					<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
 					<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>

+ 1 - 1
src/main/webapp/WEB-INF/views/web/goods/GoodsReviewFormWeb.html

@@ -25,7 +25,7 @@
 			<div class="item_state">
 				<a href="javascript:void(0);" class="itemLink">
 					<div class="itemPic">
-						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}">
+						<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm}" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'">
 					</div>
 					<p class="itemBrand" th:text="${goodsInfo.brandGroupNm}">NBA 키즈</p>
 					<div class="itemName" th:text="${goodsInfo.goodsFullNm}">유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업 유니 삼단블록 플리스 집업</div>

+ 53 - 23
src/main/webapp/WEB-INF/views/web/mypage/MypageCustConfirmFormWeb.html

@@ -19,44 +19,74 @@
 
 <body>
 <th:block layout:fragment="content">
-	<div class="my_cont">
-		<div class="sec_head">
-			<h3>내정보 관리</h3>
-			<p class="sec_desc">
-				정보를 안전하게 보호하기 위하여 비밀번호를 다시 확인 합니다.
-			</p>
-		</div>
-		<div class="sec_body mypage_body">
-			<form id="confirmForm" class="form_wrap" role="form" method="post">
-				<div class="order_list">
-					<section class="order_row">
-						<div class="order_tit">
-							<h3 class="subH3">회원정보 확인</h3>
-						</div>
-						<div class="tbl type1 info_tbl">
+	<div class="content myManageEntry"> <!-- 페이지특정 클래스 = myManageEntry -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">내 정보 관리</h3>
+					<p class="text">정보를 안전하게 보호하기 위하여 비밀번호를 다시 확인 합니다.</p>
+				</div>
+				<form id="confirmForm" class="form_wrap" role="form" method="post">
+					<div class="sec_body">
+						<div class="tbl type1">
 							<table>
 								<colgroup>
-									<col width="200">
+									<col width="210">
 									<col width="*">
 								</colgroup>
 								<tbody>
-									<tr>
+									<tr th:if="${snsType ==''}">
 										<th>아이디</th>
 										<td>
-											<input type="text" id="custId" name="custId" class="form_control" th:value="${custId}" readonly="readonly"/>
+											<div class="form_field">
+												<div class="input_wrap">
+													<input type="text" id="custId" name="custId" class="form_control" th:value="${custId}" readonly="readonly"/>
+												</div>
+											</div>
+										</td>
+									</tr>
+									<tr th:unless="${snsType ==''}">
+										<th>아이디</th>
+										<td>
+											<div class="form_field">
+												<div class="input_wrap">
+													<th:block th:if="${snsType == 'NV'}">
+														<span>네이버 간편가입회원</span>
+													</th:block>
+													<th:block th:if="${snsType == 'KK'}">
+														<span>카카오 간편가입회원</span>
+													</th:block>
+													<th:block th:if="${snsType == 'YS'}">
+														<span>YES24 간편가입회원</span>
+													</th:block>
+												</div>
+											</div>
 										</td>
 									</tr>
 									<tr>
 										<th>비밀번호</th>
 										<td>
-											<input type="password" id="passwd" name="passwd" class="form_control" placeholder="비밀번호를 입력해주세요."/>
+											<div class="form_field">
+												<div class="input_wrap">
+												<input type="password" id="passwd" name="passwd" class="form_control" placeholder="비밀번호를 입력해주세요."/>
+												</div>
+											</div>
 										</td>
 									</tr>
 								</tbody>
 							</table>
 						</div>
-					</section>
-					<div class="btn_wrap half mt60">
+					</div>
+					<div class="btn_footer_area">
 						<button type="button" class="btn btn_default cancle_btn" onclick="cfnGoToPage(_PAGE_MAIN);">
 							<span>취소</span>
 						</button>
@@ -64,8 +94,8 @@
 							<span>확인</span>
 						</button>
 					</div>
-				</div>
-			</form>
+				</form>
+			</div>
 		</div>
 	</div>
 <script th:inline="javascript">

+ 399 - 213
src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html

@@ -5,7 +5,7 @@
 	  layout:decorator="web/common/layout/MypageLayoutWeb">
 <!--
  *******************************************************************************
- * @source  : MypageCustModifyForm.html
+ * @source  : MypageCustModifyFormWeb.html
  * @desc    : 마이페이지 > 회원정보 수정 Page
  *============================================================================
  * STYLE24
@@ -19,210 +19,259 @@
 <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
 <body>
 <th:block layout:fragment="content">
-	<div class="my_cont">
-		<div class="sec_head">
-			<h3>회원정보 수정</h3>
-		</div>
-		<div class="sec_body mypage_body">
-			<form id="custModiFyForm" class="form_wrap" role="form" method="post" action="/mypage/account/check" accept-charset="EUC-KR" onsubmit="document.charset='euc-kr';">
-				<div class="order_list">
-					<section class="order_row">
-						<div class="order_tit">
-							<h3 class="subH3">회원정보</h3>
-							<button type="button" class="btn_popup" onclick="cfnOpenCellphoneCertify();">개명 본인인증</button>
-						</div>
-						<div class="tbl type1 info_tbl">
-							<!-- 인증회원 -->
-							<table>
-								<colgroup>
-									<col width="200">
-									<col width="*">
-								</colgroup>
-								<tr>
-									<th>이름(성별)</th>
-									<td id="custNm" name="custNm"></td>
-								</tr>
-								<tr>
-									<th>생년월일</th>
-									<td id="birthYmd" name="birthYmd"></td>
-								</tr>
-							</table>
-							<!-- //인증회원 -->
-						</div>
-						<p class="alert_t">본인인증을 통해 자동으로 수집되는 정보 입니다.</p>
-					</section>
-					<section class="order_row">
-						<div class="tbl type1 info_tbl ">
-							<table>
-								<colgroup>
-									<col width="200">
-									<col width="*">
-								</colgroup>
-								<tbody>
-									<tr>
-										<th>아이디</th>
-										<td>
-											<input type="text" id="custId" name="custId" class="form_control" placeholder="" readonly="readonly"/>
-										</td>
-									</tr>
-									<tr>
-										<th>비밀번호</th>
-										<td>
-											<div class="password_btn">
-												<button type="button" class="btn btn_dark"><span>변경하기</span></button>
-											</div>
-										</td>
-									</tr>
+	<div class="content myManage"> <!-- 페이지특정 클래스 = myManage -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">내 정보 관리</h3>
+				</div>
+				<form id="custModiFyForm" class="form_wrap" role="form" method="post" action="/mypage/account/check" accept-charset="EUC-KR" onsubmit="document.charset='euc-kr';">
+					<div class="sec_body">
+						<div class="modify_box">
+							<h4 class="subH3">회원정보</h4>
+							<button type="button" class="btn btn_default btn_sm" onclick="cfnOpenCellphoneCertify();"><span>개명 본인인증</span></button>
+							<div class="tbl type1">
+								<table>
+									<colgroup>
+										<col width="210">
+										<col width="*">
+									</colgroup>
 									<tr>
-										<th>이메일</th>
-										<td>
-											<input type="text" id="email" name="email" class="form_control" placeholder="" readonly="readonly"/>
-										</td>
+										<th>이름</th>
+										<td id="custNm" name="custNm"></td>
 									</tr>
 									<tr>
-										<th>휴대폰 번호</th>
-										<td>
-											<input type="text" id="cellPhnno" name="cellPhnno" class="form_control" placeholder="" readonly="readonly"/>
-											<button type="button" class="btn btn_default btn_sm" onclick="cfnOpenCellphoneCertify();">
-												<span>휴대폰 인증</span>
-											</button>
-										</td>
+										<th>생년월일</th>
+										<td id="birthYmd" name="birthYmd"></td>
 									</tr>
-								</tbody>
-							</table>
-						</div>
-					</section>
-					<section class="order_row">
-						<div class="order_tit">
-							<h3 class="subH3">환불계좌 정보</h3>
+								</table>
+							</div>
+							<div class="txt_info">
+								<ul>
+									<li>
+										본인 인증을 통해 자동으로 수집되는 정보 입니다.
+									</li>
+								</ul>
+							</div>
 						</div>
-						<div class="tbl type1 info_tbl ">
-							<table>
-								<colgroup>
-									<col width="200">
-									<col width="*">
-								</colgroup>
-								<tbody>
-									<tr>
-										<th class="ver_top">예금주</th>
-										<td>
-											<input type="text" id="accountHolder" name="accountHolder" class="form_control" placeholder="" readonly="readonly"/>
-											<p class="alert_t02">회원명 본인이 예금주인 통장으로만 환불이 가능합니다.</p>
-										</td>
-									</tr>
-									<tr>
-										<th>은행명</th>
-										<td>
-											<div class="form_field">
-												<select id="bankList" name="bankList">
-													<option value="">선택</option>
-													<option th:if="${bankList}" th:each="oneData, status : ${bankList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
-												</select>
-											</div>
-										</td>
-									</tr>
-									<tr>
-										<th>계좌번호</th>
-										<td>
-											<input type="text" id="accountNumber" name="accountNumber" class="form_control" value="27560104388848" placeholder=""/>
-										</td>
-										<button type="button" id="btnAccountCheck" class="btn btn_dark submit_btn">
-											<span>계좌인증</span>
-										</button>
-									</tr>
-								</tbody>
-							</table>
+						<div class="modify_box">
+							<h4 class="sr-only">회원정보 수정</h4>
+							<div class="tbl type1">
+								<table>
+									<colgroup>
+										<col width="210">
+										<col width="*">
+									</colgroup>
+									<tbody>
+										<tr>
+											<th>
+												<span>아이디</span>
+											</th>
+											<td>
+												<div class="form_field">
+													<div class="input_wrap">
+														<input type="text" id="custId" name="custId" class="form_control" placeholder="" readonly="readonly"/>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												<span>비밀번호</span>
+											</th>
+											<td>
+												<button type="button" class="btn btn_primary_line" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_CHANGE_TEMP);">
+													<span>변경하기</span>
+												</button>
+											</td>
+										</tr>
+										<tr>
+											<th>이메일</th>
+											<td>
+												<div class="form_field">
+													<div class="input_wrap">
+														<input type="text" id="email" name="email" class="form_control" placeholder=""/>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>휴대폰 번호</th>
+											<td>
+												<div class="form_field">
+													<div class="input_wrap">
+														<input type="text" id="cellPhnno" name="cellPhnno" class="form_control" placeholder="휴대폰 인증을 해주세요" readonly="readonly"/>
+													</div>
+													<button type="button" class="btn btn_dark" onclick="cfnOpenCellphoneCertify();">
+														<span>휴대폰 인증</span>
+													</button>
+												</div>
+											</td>
+										</tr>
+									</tbody>
+								</table>
+							</div>
 						</div>
-					</section>
-					<section class="order_row">
-						<div class="order_tit">
-							<h3 class="subH3">마케팅 정보 수신설정</h3>
-							<span class="desc">특가상품, 할인쿠폰, 이벤트 소식 수신 동의</span>
+						<div class="modify_box">
+							<h4 class="subH3">환불계좌 정보</h4>
+							<div class="tbl type1">
+								<table>
+									<colgroup>
+										<col width="210">
+										<col width="*">
+									</colgroup>
+									<tbody>
+										<tr>
+											<th class="ver_top">예금주</th>
+											<td>
+												<div class="form_field">
+													<div class="input_wrap">
+														<input type="text" id="accountNm" name="accountNm" class="form_control" placeholder="" readonly="readonly"/>
+													</div>
+												</div>
+												<div class="txt_info">
+													<ul>
+														<li>
+															회원명 본인이 예금주인 통장으로만 환불이 가능합니다.
+														</li>
+													</ul>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												<span>은행명</span>
+											</th>
+											<td>
+												<div class="form_field">
+													<div class="select_custom select_bank">
+														<div class="combo">
+															<div class="select">선택</div>
+															<ul class="list">
+																<li id="bankCd_" class="selected">
+																	<div text="선택"></div>
+																	<input type="hidden" name="bankCd" value=""/>
+																</li>
+																<th:block th:if="${bankList}" th:each="oneData, status : ${bankList}">
+																<li th:id="|bankCd_${oneData.cd}|" th:with="cd = ${oneData.cd}">
+																	<div th:text="${oneData.cdNm}"></div>
+																	<input type="hidden" name="bankCd" th:value="${cd}"/>
+																</li>
+																</th:block>
+															</ul>
+														</div>
+													</div>
+												</div>
+											</td>
+										</tr>
+										<tr>
+											<th>
+												<span>계좌번호</span>
+											</th>
+											<td>
+												<div class="form_field">
+													<div class="input_wrap">
+														<input type="text" id="accountNo" name="accountNo" class="form_control" maxlength="20" data-valid-type="numeric"  placeholder="계좌번호를 입력해 주세요"/>
+													</div>
+													<button type="button" id="btnAccountCheck" class="btn btn_dark">
+														<span>계좌인증</span>
+													</button>
+												</div>
+											</td>
+										</tr>
+									</tbody>
+								</table>
+							</div>
 						</div>
-						<div class="tbl type1 info_tbl">
-							<table>
-								<colgroup>
-									<col width="200">
-									<col width="*">
-								</colgroup>
-								<tbody>
+						<div class="modify_box">
+							<h4 class="subH3">
+								마케팅 정보 수신설정
+								<span class="tit_info">특가상품, 할인쿠폰, 이벤트 소식 수신 동의</span>
+							</h4>
+							<div class="tbl type1">
+								<table>
+									<colgroup>
+										<col width="210">
+										<col width="*">
+									</colgroup>
 									<tr>
 										<th>수신설정</th>
 										<td>
-											<div class="form_field review_radio">
-												<div class="radio_li">
+											<div class="form_field">
+												<div>
 													<input type="checkbox" id="emailAgreeYn" name="emailAgreeYn" value="Y"/><label for="emailAgreeYn"><span>이메일</span></label>
 												</div>
-												<div class="radio_li">
+												<div>
 													<input type="checkbox" id="smsAgreeYn" name="smsAgreeYn" value="Y"/><label for="smsAgreeYn"><span>SMS</span></label>
 												</div>
 											</div>
 										</td>
 									</tr>
-								</tbody>
-							</table>
+								</table>
+							</div>
+							<div class="txt_info">
+								<ul>
+									<li>
+										회원 정보, 구매 정보 및 서비스 주요 정책 관련 내용은 수신 동의 여부와 관계없이 발송됩니다.
+									</li>
+								</ul>
+							</div>
+						</div>
+						<div class="btn_footer_area">
+							<button type="button" id="btnConfirm" class="btn btn_dark btn_md">
+								<span>확인</span>
+							</button>
 						</div>
-						<p class="alert_t"> 회원정보, 구매정보 및 서비스 주요 정책 관련 내용은 수신동의 여부와 관계없이 발송됩니다.</p>
-					</section>
-					<div class="btn_wrap half mt60">
-						<button type="button" id="btnConfirm" class="btn btn_dark submit_btn">
-							<span>확인</span>
-						</button>
 					</div>
-				</div>
-			</form>
+				</form>
+			</div>
 		</div>
 	</div>
 <script th:inline="javascript">
 	/*<![CDATA[*/
-
-	var fnConvertToArray = function(data, isCodeDisplay) {
-		if (data.length == 0)
-			return [];
-
-		if (typeof(isCodeDisplay) == 'undefined')
-			isCodeDisplay = false;
-
-		var arrValue = {};
-
-		$.each(data, function(idx, item) {
-			arrValue[item.cd] = (isCodeDisplay ? '[' + item.cd + '] ' : '') + item.cdNm;
-		});
-
-		return arrValue;
-	};
-
-	var fnLookupValue = function(mappings, key) {
-		return mappings[key];
-	};
-
-	const genderGbList = fnConvertToArray([[${genderGbList}]]);				//성별
-
+	let orgCustInfo;
+	let orgAccountInfo;
+	let accountCheck = false;
 
 	// 고객정보
 	var fnGetCustInfo = function () {
-		let jsonData = JSON.stringify({});
-		gagajf.ajaxJsonSubmit("/mypage/customer/info", jsonData , fnGetCustInfoCallback);
+		$.get('/mypage/customer/info', fnGetCustInfoCallback);
 	}
 
 	// 고객정보 데이터
 	var fnGetCustInfoCallback = function (custInfo) {
-		let genderGb = fnLookupValue(genderGbList, custInfo.sexGb);
-		let gender = '';
-		if (!gagajf.isNull(genderGb)) {
-			gender = custInfo.custNm + '('+ genderGb +')';
-		} else {
-			gender = genderGb;
-		}
-		$('#custModiFyForm td[name=custNm]').text(gender);
+		orgCustInfo = custInfo; // 원본 데이터저장 수정시 비교 작업
+		$('#custModiFyForm td[name=custNm]').text(custInfo.custNm);
 		$('#custModiFyForm td[name=birthYmd]').text(custInfo.birthYmd);
-		$('#custModiFyForm input[name=custId]').val(custInfo.custId);
+		let custId = custInfo.custId;
+		if (custInfo.snsType === 'NV') {
+			custId = '네이버 간편가입회원'
+		}
+		if (custInfo.snsType === 'KK') {
+			custId = '카카오 간편가입회원'
+		}
+		if (custInfo.snsType === 'YS') {
+			custId = 'YES24 간편가입회원'
+		}
+		$('#custModiFyForm input[name=custId]').val(custId);
 		$('#custModiFyForm input[name=email]').val(custInfo.email);
 		$('#custModiFyForm input[name=cellPhnno]').val(custInfo.cellPhnno);
-		$('#custModiFyForm input[name=accountHolder]').val(custInfo.custNm);
+		$('#custModiFyForm input[name=accountNm]').val(custInfo.custNm);
 
 		fnDisplayEmailAgree(custInfo.emailAgreeYn);
 		fnDisplaySmsAgree(custInfo.smsAgreeYn);
+
+		// 회원(고객) 계좌 조회
+		fnGetCustAccountInfo();
 	}
 
 	// 이메일 수신동의
@@ -247,17 +296,47 @@
 
 	};
 
+	// 고객계좌정보
+	var fnGetCustAccountInfo = function () {
+		$.get('/mypage/customer/account/info', fnGetCustAccountInfoCallback);
+	}
+
+	// 고객계좌 정보 데이터
+	var fnGetCustAccountInfoCallback = function (result) {
+		orgAccountInfo = {};
+		var $accountNm = $('#custModiFyForm input[name=accountNm]');
+		if (!gagajf.isNull(result)) {
+			orgAccountInfo.accountNo = result.accountNo;
+			orgAccountInfo.bankCd = result.bankCd;
+			//1. 고객명과 환불계좌 예금주가 다른 경우 현재 고객명을 적어주고 계좌번호, 은행코드 초기화 처리
+			let $bankCd = '';
+			if ($accountNm.val() === result.accountNm) {
+				$('#custModiFyForm input[name=accountNo]').val(result.accountNo);
+				$bankCd = '#bankCd_'+result.bankCd;
+
+			} else {
+				$('#custModiFyForm input[name=accountNo]').val('');
+				$bankCd = '#bankCd_';
+
+			}
+			$($bankCd).trigger('click'); // 셀렉트 박스 트리거
+		} else {
+			orgAccountInfo.accountNo = '';
+			orgAccountInfo.bankCd ='';
+		}
+	}
+
 	// 나이스 본인인증 후 콜백
 	var fnNiceCallBack = function(encData) {
 		if (!gagajf.isNull(encData)) {
 			let custInfo = {};
 			custInfo.encData = encData;
 			let jsonData = JSON.stringify(custInfo);
-			gagajf.ajaxJsonSubmit('/mypage/customer/auth/update', jsonData, fnInfoConfirmCallBack);
+			gagajf.ajaxJsonSubmit('/mypage/customer/auth/update', jsonData, fnUpdateAuthInfoCallback);
 		}
 	};
 
-	var fnInfoConfirmCallBack = function (result) {
+	var fnUpdateAuthInfoCallback = function (result) {
 		if (result.iSsuccess) {
 			fnGetCustInfo();
 			mcxDialog.alert("본인인증을 통해 정보가 변경 되었습니다.");
@@ -266,71 +345,178 @@
 			mcxDialog.alert("실패하였습니다.<br/>고객센터에 문의하시 바랍니다.");
 			return;
 		}
-
 	}
 
-	$('#btnConfirm').on('click', function () {
-		let jsonData = JSON.stringify($('#custModiFyForm').serializeObject());
-		console.log('jsonData', jsonData);
-	});
-
+	// 계좌인증
 	$('#btnAccountCheck').on('click', function () {
+		if (!fnGetAccountValidation()) {
+			return;
+		}
 		let custInfo = {};
 		let jsonData = JSON.stringify(custInfo)
-		//gagajf.ajaxJsonSubmit('/mypage/account/check', jsonData, fnAccountCheckCallback);
+		gagajf.ajaxJsonSubmit('/mypage/account/check', jsonData, fnAccountCheckCallback);
 		//ajaxSubmit('/mypage/account/check','html','accountHolder')
-		$('#custModiFyForm').submit();
 	});
 
+	// 계좌인증 콜백
 	var fnAccountCheckCallback = function (result) {
-		console.log('result', result);
+		let msg = '계좌인증에 성공했습니다.'
+		if (result.isValid) { // 유효하면 true
+			accountCheck = true;
+		} else {
+			accountCheck = false;
+			msg = '계좌정보를 다시 확인해주세요.'
+		}
+		mcxDialog.alertC(msg ,{
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+			}
+		});
+	};
+	
+	// 수정 버튼
+	$('#btnConfirm').on('click', function () {
+		let custModiFy =  $('#custModiFyForm').serializeObject();
+		let marketingModifyYn = 'N';
+		let accountModifyYn = 'N';
+		let emailModifyYn = 'N';
+		let smsAgreeYn;
+		let emailAgreeYn;
+
+		if (gagajf.isNull(custModiFy.email)) {
+			mcxDialog.alertC('이메일 주소를 입력해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custModiFyForm input[name=email]').focus();
+				}
+			});
+		}
 
-	}
+		if (orgCustInfo.email != custModiFy.email) {
+			emailModifyYn = 'Y';
+		}
+
+		if (!fnGetAccountValidation()) {
+			return;
+		}
+		custModiFy.bankCd = $('.combo .select').find('input[name=bankCd]').val();
+
+		// 은행코드가 바꼈는지
+		if (orgAccountInfo.bankCd != custModiFy.bankCd) {
+			accountModifyYn = 'Y';
+		}
 
-	var ajaxSubmit = function(actionUrl, type, callback, params) {
-		$.ajax({
-			type : "POST",
-			url : actionUrl,
-			data : $('#custModiFyForm').serialize(),
-			dataType : type,
-			contentType: 'application/x-www-form-urlencoded;charset=euc-kr',
-			beforeSend : function(xhr) {
-				// Button disabled
-				xhr.overrideMimeType('application/x-www-form-urlencoded;charset=euc-kr');
-				// ProgressBar show
-			},
-			complete : function() {
-				// Button enabled
-
-				// ProgressBar hide
-			},
-			success : function(result) {
-				console.log(result);
-				if (type === "html") {
-					if (!gagajf.isNull(callback))
-						$(document.getElementById(callback)).html(result);
-				} else {
-					// Callback 함수 호출
-					if (typeof(callback) === "function")
-						callback.call(this, result);
+		if (orgAccountInfo.accountNo != custModiFy.accountNo) {
+			accountModifyYn = 'Y';
+		}
+
+		if (accountModifyYn === 'Y') { // 환불계좌정보 변경 됐으면
+			if (!gagajf.isNull(custModiFy.accountNo) && !gagajf.isNull(custModiFy.bankCd)) {
+				if (!accountCheck) {
+					mcxDialog.alertC('계좌인증이 필요합니다.',{
+						sureBtnText: "확인",
+						sureBtnClick: function() {
+						}
+					});
+					return;
 				}
-			},
-			error : function() {
-				alert("오류로 인해 처리되지 않았습니다.");
 			}
-		});
+		}
+
+		if (gagajf.isNull(custModiFy.smsAgreeYn)) {
+			custModiFy.smsAgreeYn = 'N';
+		}
+
+		if (gagajf.isNull(custModiFy.emailAgreeYn)) {
+			custModiFy.emailAgreeYn = 'N';
+		}
+
+		// SMS 수신여부
+		if (orgCustInfo.smsAgreeYn != custModiFy.smsAgreeYn) {
+			marketingModifyYn = 'Y';
+		}
+
+		// 이메일 수신여부
+		if (orgCustInfo.emailAgreeYn != custModiFy.emailAgreeYn) {
+			marketingModifyYn = 'Y';
+		}
+
+		custModiFy.emailModifyYn = emailModifyYn ;
+		custModiFy.marketingModifyYn = marketingModifyYn;
+		custModiFy.accountModifyYn = accountModifyYn;
+
+		let jsonData = JSON.stringify(custModiFy);
+		// console.log('jsonData',jsonData);
+		gagajf.ajaxJsonSubmit('/mypage/customer/info/save', jsonData, fnSaveCustomerInfoCallback)
+	});
+
+	// 수정 콜백
+	var fnSaveCustomerInfoCallback = function (result) {
+		if (result.isSuccess) {
+			mcxDialog.alert("회원정보가 수정되었습니다.");
+			return;
+		} else {
+			mcxDialog.alert("실패하였습니다.<br/>고객센터에 문의하시 바랍니다.");
+			return;
+		}
+		fnGetCustInfo();
 	}
 
+
+	// 은행계좌 유효성체크
+	var fnGetAccountValidation = function () {
+		let custModiFy =  $('#custModiFyForm').serializeObject();
+
+		if (gagajf.isNull(custModiFy.bankCd) && !gagajf.isNull(custModiFy.accountNo)) {
+			mcxDialog.alertC('은행을 선택해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custModiFyForm select[name=bankCd]').focus();
+				}
+			});
+			return false
+		}
+		if (!gagajf.isNull(custModiFy.bankCd) && gagajf.isNull(custModiFy.accountNo)) {
+			mcxDialog.alertC('계좌번호를 입력해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custModiFyForm input[name=accountNo]').focus();
+				}
+			});
+			return false;
+		}
+		return true;
+	}
+
+	// 코드 -> 코드명 변경
+	var fnConvertToValue = function(data, cd, isCodeDisplay) {
+		if (data.length === 0) {
+			return "";
+		}
+		if (typeof(isCodeDisplay) == 'undefined') {
+			isCodeDisplay = false;
+		}
+		let arrValue = {};
+		$.each(data, function(idx, item) {
+			arrValue[item.cd] = (isCodeDisplay ? '[' + item.cd + '] ' : '') + item.cdNm;
+		});
+		return arrValue[cd];
+	};
+
 	$(document).ready(function() {
+		var return_bank_selecter = new sCombo('.modify_box .select_custom.select_bank');
+
 		// 마이페이지 LNB 설정
 		fnSetMypageLnbList(10);
 
 		// 마이페이지 location 설정
-		fnSetMypageLocation('회원정보 수정');
+		fnSetMypageLocation('내정보 관리','_PAGE_MYPAGE_CUSTOMER','회원정보 수정');
 
-		// 회원정보 조회
+		// 회원(고객) 조회
 		fnGetCustInfo();
 
+
+
 	});
 
 

+ 147 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCustSecedeCompleteFormWeb.html

@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org"
+	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	  layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageCustSecedeCompleteFormWeb.html
+ * @desc    : 마이페이지 > 회원탈퇴 완료 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.24   jsshin      최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<!--  container -->
+<th:block layout:fragment="content">
+	<div class="content myMbLeave"> <!-- 페이지특정 클래스 = myMbLeave -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">회원탈퇴</h3>
+				</div>
+				<div class="sec_body">
+						<div class="mb_leave_complete">
+							<span th:text="${custNm}"></span> 고객님의 STYLE24 회원탈퇴가 정상적으로 처리되었습니다.
+						</div>
+					<div class="tbl type5">
+						<table>
+							<colgroup>
+								<col width="25%">
+								<col width="25%">
+								<col width="25%">
+								<col width="25%">
+							</colgroup>
+							<thead>
+							<tr>
+								<th scope="col">진행중(주문/취소/반품/교환)</th>
+								<th scope="col">포인트(보유/적립예정)</th>
+								<th scope="col">상품권 잔여금액</th>
+								<th scope="col">쿠폰</th>
+							</tr>
+							</thead>
+							<tbody>
+							<tr>
+								<td>
+									<span class="hold_order">
+										<em id="ordCnt">0</em>&nbsp;/&nbsp;
+										<em id="cnclCnt">0</em>&nbsp;/&nbsp;
+										<em id="rtnCnt">0</em>&nbsp;/&nbsp;
+										<em id="exCnt">0</em>
+									</span>
+								</td>
+								<td>
+									<span class="hold_point">
+										<em id="pntAmt" th:text="|${#numbers.formatDecimal(pointInfo.rmPntAmt, 0, 'COMMA', 0, 'POINT')}P|">0P</em>&nbsp;/&nbsp;
+										<em id="expAmt" th:text="|${#numbers.formatDecimal(pointInfo.expectedPntAmt, 0, 'COMMA', 0, 'POINT')}P|">0P</em>
+									</span>
+								</td>
+								<td>
+									<span class="hold_voucher">
+										<em id="giftAmt" th:text="|${#numbers.formatDecimal(rmGfcdAmt, 0, 'COMMA', 0, 'POINT')}원|">0원</em>
+									</span>
+								</td>
+								<td>
+									<span class="hold_coupon">
+										<em id="cpnCnt" th:text="|${#numbers.formatDecimal(couponCnt, 0, 'COMMA', 0, 'POINT')}장|">0장</em>
+									</span>
+								</td>
+							</tr>
+							</tbody>
+						</table>
+					</div>
+					<div class="com_info_txt">
+						<p class="tit">회원 탈퇴 안내</p>
+						<ul>
+							<li>탈퇴시 소유하고 있는 포인트, 쿠폰등은 모두 소멸 됩니다.</li>
+							<li>거래정보가 있는 경우, 전자상거래 등에서의 소비자 보호에 관한 법률에 따라 계약 또는 청약철회에 관한 기록, 대금결제 및 재화 등의 공급에 관한 기록은 5년동안 보존됩니다.</li>
+							<li>보유하셨던 상품권 금액은 탈퇴와 함께 삭제되며 환불되지 않습니다.</li>
+							<li>회원 탈퇴 후 STYLE24에 입력하신 상품문의 및 후기,댓글은 삭제되지 않으며,회원정보 삭제로 인해 작성자 본인을 확인 할 수 없어<br>편집 및 삭제처리가 원천적으로 불가능 합니다. 상품문의 및 후기, 댓글 삭제를 원하시는 경우에는 먼저 해당 게시물을 삭제하신 후 탈퇴를 신청하시기 바랍니다.</li>
+							<li>진행중인 주문/취소/반품/교환건이 있을 경우에는 탈퇴가 되지 않습니다.</li>
+						</ul>
+					</div>
+				</div>
+				<div class="btn_footer_area">
+					<button type="button" id="btnConfirm" class="btn btn_dark btn_md hide" onclick="cfnGoToPage(_PAGE_MAIN);">
+						<span>확인</span>
+					</button>
+				</div>
+			</div>
+		</div>
+	</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const orderStatInfo = [[${orderStatInfo}]];
+
+	var fnOrderStatInit = function () {
+
+		// 진행중인 주문건
+		let orderTotal = orderStatInfo.depositWaitingCount + orderStatInfo.waitingAddPaymentCount
+			+ orderStatInfo.paymentCompleteCount + orderStatInfo.goodsPrepareCount
+			+ orderStatInfo.shipPrepareCount + orderStatInfo.shippingCount;
+		let total = orderTotal + orderStatInfo.cancelCount + orderStatInfo.returnCount + orderStatInfo.exchangeCount;
+
+		$('#ordCnt').text(orderTotal.addComma());
+		// 진행중인 취소건
+		$('#cnclCnt').text(orderStatInfo.cancelCount.addComma());
+		// 진행중인 반품건
+		$('#rtnCnt').text(orderStatInfo.returnCount.addComma());
+		// 진행중인 교환건
+		$('#exCnt').text(orderStatInfo.exchangeCount.addComma());
+		// 토탈 건수
+		$('#totalCnt').text(total);
+
+	}
+
+	$(document).ready( function() {
+		fnOrderStatInit();
+
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(11);
+
+		// 마이페이지 location 설정
+		fnSetMypageLocation('회원탈퇴');
+
+	});
+	/*]]>*/
+</script>
+</th:block>
+</body>
+</html>
+
+

+ 267 - 158
src/main/webapp/WEB-INF/views/web/mypage/MypageCustSecedeFormWeb.html

@@ -1,179 +1,288 @@
 <!DOCTYPE html>
-<html lang="ko">
-<head>
-<title>STYLE24 | 회원탈퇴 | Publishing</title>
-<meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> 
-<meta name="Title" th:content="" content=""/>
-<meta name="description" th:content="" content=""/>
-<meta name="keywords" th:content="" content=""/>
-<meta property="og:type" content="website"/>
-<meta property="og:image" th:content="" content=""/>
-<meta property="og:url" th:content="" content=""/>
-<meta property="og:title" th:content="" content=""/>
-<meta property="og:description" th:content="" content=""/>
-<meta property="og:locale" content="ko_KR"/>
-<meta property="og:site_name" th:content="" content=""/>
-
-<link rel="icon" href="favicon.ico" type="image/x-icon">
-<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
-<link rel="apple-touch-icon" href="/images/pc/apple-touch-icon.png" sizes="180x180">
-<link rel="icon" href="/images/pc/favicon-32x32.png" sizes="32x32" type="image/png">
-<link rel="icon" href="/images/pc/favicon-16x16.png" sizes="16x16" type="image/png">
-
-<!-- <link rel="stylesheet" type="text/css" href="css/test-common.css" /> -->
-<link rel="stylesheet" type="text/css" href="css/common.css" />
-<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
-<script src="js/jquery.ellipsis.js"></script>
-<script src="js/jquery-ui.js"></script>
-<script src="js/common-ui.js"></script>
-</head>
-
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org"
+	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	  layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageCustSecedeFormWeb.html
+ * @desc    : 마이페이지 > 회원탈퇴 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.15   jsshin      최초 작성
+ *******************************************************************************
+ -->
 <body>
 
-	
-	<div class="skipComment">
-		<a href="#content">본문 바로가기</a>
-		<a href="#gnb">주메뉴 바로가기</a>
-		<a href="#footer">하단메뉴 바로가기</a>
-	</div>
-
-	<header id="header"></header>
-	<!--  container -->
-	<div id="container" class="container my">
-		<div class="breadcrumb">
-			<ul>
-				<li class="bread_home"><a href="index.html">홈</a></li>
-				<li class="bread_2depth">마이페이지</li>
-				<li class="bread_3depth">회원탈퇴</li>
-			</ul>
-		</div>
-		<div class="wrap">
-			<div class="content">
-				<div class="cont_head" style="display: none;">
-					CONT-HEAD
-					<div class="tit">my_center</div>
-					<div class="tit my_tit">my_tit</div>
+<!--  container -->
+<th:block layout:fragment="content">
+	<div class="content myMbLeave"> <!-- 페이지특정 클래스 = myMbLeave -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
 				</div>
-				<div class="cont_body mypage">
-					<!-- CONT-BODY -->
-					<div class="my_lnb">
-						<div class="lnb_tit">
-							<h2>마이페이지</h2>
-						</div>
-						<div class="lnb_list">
-							<ul>
-								<li><a href="/ux/pc/my_order_1.html">주문확인/배송조회</a></li>
-								<li><a href="/ux/pc/my_return_1.html">취소/반품/환불내역</a></li>
-								<li><a href="/ux/pc/my_restock_1.html">재입고 알림 내역</a></li>
-								<li><a href="/ux/pc/my_coupon_1.html">쿠폰</a></li>
-								<li><a href="/ux/pc/my_point_1.html">STYLE24 포인트</a></li>
-								<li><a href="/ux/pc/my_gift_1.html">상품권</a></li>
-								<li><a href="/ux/pc/my_review_1.html">리뷰</a></li>
-								<li><a href="/ux/pc/my_delivery_1.html">배송지 관리</a></li>
-								<li><a href="/ux/pc/my_wishlist_1.html">위시리스트</a></li>
-								<li><a href="/ux/pc/my_mypage_1.html">내정보 관리</a></li>
-								<li><a href="/ux/pc/my_leave_1.html" class="on">회원 탈퇴</a></li>
-							</ul>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">회원탈퇴</h3>
+				</div>
+				<div class="sec_body">
+					<div id="leaveIncomplete" class="highlight_area hide">
+						<div class="mb_leave_incomplete">
+							<p class="txt_primary">고객님께서는 진행중인 주문/취소/반품/교환건이 <span id="totalCnt"></span>건 이상 확인되어 탈퇴요청이 불가능 합니다.</p>
+							<p class="txt_sub">진행중인 건이 종료된 후 다시 시도해 주세요.</p>
 						</div>
 					</div>
-					<div class="my_cont">
-						<div class="sec_head">
-							<h3>회원탈퇴</h3>
-						</div>
-						<div class="sec_body mypage_body">
-							<div class="com_info_txt">
-								<p class="tit">회원 탈퇴 안내</p>
-								<ul>
-									<li>탈퇴시 소유하고 있는 포인트, 쿠폰등은 모두 소멸 됩니다.</li>
-									<li>거래정보가 있는 경우, 전자상거래 등에서의 소비자 보호에 관한 법류에 따라 계약 또는 청약철회에 관한 기록,<br>대금결제 및 재화 등의 공급에 관한 기록은 5년동안 보존됩니다.</li>
-									<li>보유하셨던 상품권 금액은 탈퇴와 함께 삭제되며 환불되지 않습니다.</li>
-									<li>회원 탈퇴 후 STYLE24에 입력하신 상품문의 및 후기,댓글은 삭제되지 않으며,회원정보 삭제로 인해 작성자 본인을 확인 할 수 없어<br>편집 및 삭제처리가 원천적으로 불가능 합니다.</li>
-									<li>상품권은 현금성 결제 수단에 포함되어 주문시 포인트 적립이 가능합니다.</li>
-								</ul>
-								<div class="chk_box">
-									<div class="form_field">
-										<div class="">
-											<input id="chk-1" type="checkbox"><label for="chk-1"><span>상기 STYLE24 회원탈퇴 시 처리사항 안내를 확인하였음에 동의합니다.</span></label>
-										</div>
-									</div>
-								</div>
-							</div>
-							<form class="form_wrap" role="form">
-								<div class="order_list">
-									<section class="order_row">
-										<div class="tbl track_tbl type2">
-											<table>
-												<colgroup>
-													<col width="25%">
-													<col width="25%">
-													<col width="25%">
-													<col width="25%">
-												</colgroup>   
-												<thead>
-													<tr>
-														<th>진행중(주문/취소/반품/교환)</th>
-														<th>마일리지(보유/적립예정)</th>
-														<th>상품권 잔여금액</th>
-														<th>쿠폰</th>
-													</tr>
-												</thead>
-												<tbody>
-													<tr>
-														<td>0 / 0 / 0 / 0</td>
-														<td class="c_primary">500P / 60P</td>
-														<td class="c_primary">20,000원</td>
-														<td class="c_primary">20장</td>
-													</tr>
-												</tbody>
-											</table>
-										</div>
-									</section>
-									<section class="order_row">
-										<div class="order_tit"> 
-											<h3 class="subH3">보안을 위해 회원님의 아이디 및 비밀번호를 다시 확인합니다.</h3>
+					<div class="tbl type5">
+						<table>
+							<colgroup>
+								<col width="25%">
+								<col width="25%">
+								<col width="25%">
+								<col width="25%">
+							</colgroup>
+							<thead>
+							<tr>
+								<th scope="col">진행중(주문/취소/반품/교환)</th>
+								<th scope="col">포인트(보유/적립예정)</th>
+								<th scope="col">상품권 잔여금액</th>
+								<th scope="col">쿠폰</th>
+							</tr>
+							</thead>
+							<tbody>
+							<tr>
+								<td>
+									<span class="hold_order">
+										<em id="ordCnt">0</em>&nbsp;/&nbsp;
+										<em id="cnclCnt">0</em>&nbsp;/&nbsp;
+										<em id="rtnCnt">0</em>&nbsp;/&nbsp;
+										<em id="exCnt">0</em>
+									</span>
+								</td>
+								<td>
+									<span class="hold_point">
+										<em id="pntAmt" th:text="|${#numbers.formatDecimal(pointInfo.rmPntAmt, 0, 'COMMA', 0, 'POINT')}P|">0P</em>&nbsp;/&nbsp;
+										<em id="expAmt" th:text="|${#numbers.formatDecimal(pointInfo.expectedPntAmt, 0, 'COMMA', 0, 'POINT')}P|">0P</em>
+									</span>
+								</td>
+								<td>
+									<span class="hold_voucher">
+										<em id="giftAmt" th:text="|${#numbers.formatDecimal(rmGfcdAmt, 0, 'COMMA', 0, 'POINT')}원|">0원</em>
+									</span>
+								</td>
+								<td>
+									<span class="hold_coupon">
+										<em id="cpnCnt" th:text="|${#numbers.formatDecimal(couponCnt, 0, 'COMMA', 0, 'POINT')}장|">0장</em>
+									</span>
+								</td>
+							</tr>
+							</tbody>
+						</table>
+					</div>
+					<h4 class="subH3">
+						보안을 위해 회원님의 아이디 및 비밀번호를 다시 확인합니다.
+					</h4>
+					<form id="secedeCustForm" class="form_wrap" action="/mypage/customer/secede/complete/form" method="post">
+						<div class="tbl type1">
+							<table>
+								<colgroup>
+									<col width="210">
+									<col width="*">
+								</colgroup>
+								<tr>
+									<th>아이디</th>
+									<td>
+										<div class="form_field">
+											<div class="input_wrap">
+												<input type="text" id="custId" name="custId" class="form_control" readonly="readonly"/>
+											</div>
 										</div>
-										<div class="tbl type1 info_tbl">
-											<table>
-												<colgroup>
-													<col width="200">
-													<col width="*">
-												</colgroup>   
-												<tbody>
-													<tr>
-														<th>아이디</th>
-														<td><input type="text" class="form_control" value="gunuid" placeholder="" readonly></td>
-													</tr>
-													<tr>
-														<th>비밀번호</th>
-														<td><input type="password" class="form_control" placeholder="비밀번호를 입력해주세요."></td>
-													</tr>
-												</tbody>
-											</table>
+									</td>
+								</tr>
+								<tr>
+									<th>
+										비밀번호
+									</th>
+									<td>
+										<div class="form_field">
+											<div class="input_wrap">
+												<input type="password" id="passwd" name="passwd" class="form_control" placeholder="비밀번호를 입력해주세요."/>
+											</div>
 										</div>
-									</section>
-									<div class="btn_wrap half mt60">
-										<button tyep="submit" class="btn btn_dark submit_btn"><span>회원탈퇴</span></button>
+									</td>
+								</tr>
+							</table>
+						</div>
+						<div class="com_info_txt">
+							<p class="tit">회원 탈퇴 안내</p>
+							<ul>
+								<li>탈퇴시 소유하고 있는 포인트, 쿠폰등은 모두 소멸 됩니다.</li>
+								<li>거래정보가 있는 경우, 전자상거래 등에서의 소비자 보호에 관한 법률에 따라 계약 또는 청약철회에 관한 기록, 대금결제 및 재화 등의 공급에 관한 기록은 5년동안 보존됩니다.</li>
+								<li>보유하셨던 상품권 금액은 탈퇴와 함께 삭제되며 환불되지 않습니다.</li>
+								<li>회원 탈퇴 후 STYLE24에 입력하신 상품문의 및 후기,댓글은 삭제되지 않으며,회원정보 삭제로 인해 작성자 본인을 확인 할 수 없어<br>편집 및 삭제처리가 원천적으로 불가능 합니다. 상품문의 및 후기, 댓글 삭제를 원하시는 경우에는 먼저 해당 게시물을 삭제하신 후 탈퇴를 신청하시기 바랍니다.</li>
+								<li>진행중인 주문/취소/반품/교환건이 있을 경우에는 탈퇴가 되지 않습니다.</li>
+							</ul>
+							<div class="check_box">
+								<div class="form_field">
+									<div>
+										<input type="checkbox" id="checkSecede" name="checkSecede" value="Y"/>
+										<label for="checkSecede">
+											<span>상기 STYLE24 회원탈퇴 시 처리사항 안내를 확인하였음에 동의합니다.</span>
+										</label>
 									</div>
 								</div>
-							</form>
+							</div>
 						</div>
-					</div>
-					<!-- // CONT-BODY -->					
+					</form>
+				</div>
+				<div class="btn_footer_area">
+					<button type="button" id="btnSaveSecede" class="btn btn_dark btn_md hide">
+						<span>회원탈퇴</span>
+					</button>
+					<button type="button" id="btnConfirm" class="btn btn_dark btn_md hide" onclick="cfnGoToPage(_PAGE_MAIN);">
+						<span>확인</span>
+					</button>
 				</div>
 			</div>
 		</div>
 	</div>
-	<!-- // container -->	
-	<footer id="footer"></footer>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const orderStatInfo = [[${orderStatInfo}]];
+	const snsType = [[${snsType}]];
+	const custId = [[${custId}]];
+
+
+	var fnOrderStatInit = function () {
+		let $leaveIncomplete = $('#leaveIncomplete');
+		let $btnSaveSecede = $('#btnSaveSecede');
+		let $btnConfirm = $('#btnConfirm');
+
+		let isPossible = true;
+
+		// 진행중인 주문건
+		let orderTotal = orderStatInfo.depositWaitingCount + orderStatInfo.waitingAddPaymentCount
+			+ orderStatInfo.paymentCompleteCount + orderStatInfo.goodsPrepareCount
+			+ orderStatInfo.shipPrepareCount + orderStatInfo.shippingCount;
+		let total = orderTotal + orderStatInfo.cancelCount + orderStatInfo.returnCount + orderStatInfo.exchangeCount;
+
+		$('#ordCnt').text(orderTotal.addComma());
+		// 진행중인 취소건
+		$('#cnclCnt').text(orderStatInfo.cancelCount.addComma());
+		// 진행중인 반품건
+		$('#rtnCnt').text(orderStatInfo.returnCount.addComma());
+		// 진행중인 교환건
+		$('#exCnt').text(orderStatInfo.exchangeCount.addComma());
+		// 토탈 건수
+		$('#totalCnt').text(total);
+
+		let custIdText = custId;
+		if (snsType === 'NV') {
+			custIdText = '네이버 간편가입회원'
+		}
+		if (snsType === 'KK') {
+			custIdText = '카카오 간편가입회원'
+		}
+		if (snsType === 'YS') {
+			custIdText = 'YES24 간편가입회원'
+		}
+		$('#secedeCustForm input[name=custId]').val(custIdText);
+
+		if (orderTotal > 0) {
+			isPossible = false
+		}
+
+		if (orderStatInfo.cancelCount > 0) {
+			isPossible = false
+		}
+
+		if (orderStatInfo.returnCount > 0) {
+			isPossible = false
+		}
+
+		if (orderStatInfo.exchangeCount > 0) {
+			isPossible = false
+		}
+
+		if (isPossible) {
+			$btnConfirm.hide();
+			$leaveIncomplete.hide();
+			$btnSaveSecede.show();
+		} else {
+			$btnSaveSecede.hide();
+			$leaveIncomplete.show();
+			$btnConfirm.show();
+		}
+
+
+
+	}
+
+	$('#btnSaveSecede').on('click', function () {
+		let secedeCustInfo = $('#secedeCustForm').serializeObject();
+
+		if (gagajf.isNull(secedeCustInfo.passwd)) {
+			mcxDialog.alertC('비밀번호를 입력해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#secedeCustForm input[name=passwd]').focus();
+				}
+			});
+			return;
+		}
+
+		if (gagajf.isNull(secedeCustInfo.checkSecede)) {
+			mcxDialog.alertC('회원탈퇴 처리사항 안내에 동의해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+				}
+			});
+			return;
+		}
+		let params = {};
+		params.passwd = secedeCustInfo.passwd;
+		let jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit('/mypage/customer/password/confirm', jsonData, fnConfirmPassword)
+	});
+
+	var fnConfirmPassword = function (result) {
+		if (result.isMatch) {
+			$("#secedeCustForm").submit();
+		} else {
+			mcxDialog.alertC('비밀번호를 다시 입력해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#secedeCustForm input[name=passwd]').focus();
+				}
+			});
+			return;
+		}
+	}
+
+
 
-	<script type="text/javascript">
-	// 컨텐츠 호출
 	$(document).ready( function() {
-		$("#header").load("head.html");
-		$("#footer").load("foot.html");
+		fnOrderStatInit();
+
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(11);
+
+		// 마이페이지 location 설정
+		fnSetMypageLocation('회원탈퇴');
+
 	});
-	</script>
+	/*]]>*/
+</script>
+</th:block>
 </body>
 </html>
 

+ 275 - 0
src/main/webapp/WEB-INF/views/web/mypage/MypageCustSnsJoinInitPwdFormWeb.html

@@ -0,0 +1,275 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org"
+	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	  layout:decorator="web/common/layout/MypageLayoutWeb">
+<!--
+ *******************************************************************************
+ * @source  : MypageCustSnsJoinInitPwdFormWeb.html
+ * @desc    : 마이페이지 > 내 정보 관리 비밀번호 최초설정 Page
+ *            소셜 간편가입을 하신 회원님은
+ *            최초 비밀번호 설정하는 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.15   jsshin      최초 작성
+ *******************************************************************************
+ -->
+
+<body>
+<th:block layout:fragment="content">
+	<div class="content myManage"> <!-- 페이지특정 클래스 = myManageEntry -->
+		<div class="cont_body">
+			<!-- CONT-BODY -->
+			<div class="lnb">
+				<div class="lnb_tit">
+					<h2>마이페이지</h2>
+				</div>
+				<div class="lnb_list">
+					<ul id="mypageLnbList"></ul>
+				</div>
+			</div>
+			<div class="cont">
+				<div class="sec_head">
+					<h3 class="subH1">내 정보 관리</h3>
+					<p class="text">소셜 간편가입을 하신 회원님은 최초 비밀번호 설정하신 후 변경 가능합니다.</p>
+				</div>
+				<form id="resetPasswordForm" name="resetPasswordForm" class="form_wrap">
+					<input type="hidden" name="custId" th:value="${custId}"/>
+					<div class="sec_body">
+						<div class="modify_box">
+							<div class="tbl type1">
+								<table>
+									<colgroup>
+										<col width="210">
+										<col width="*">
+									</colgroup>
+									<tr>
+										<th>
+											비밀번호
+										</th>
+										<td>
+											<div class="form_field">
+												<div class="input_wrap">
+													<input type="password" id="passwd" name="passwd" class="form_control" placeholder="비밀번호를 입력해주세요." minlength="8" maxlength="20"/>
+												</div>
+											</div>
+											<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+											<div class="help_block">
+												<!-- 사용불가 비밀번호일경우 -->
+												<p>
+													<span id="firstFailed" class="c_gray">
+														<i class="ico ico_check gray"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br/>
+													</span>
+													<span id="secondFailed" class="c_gray">
+														<i class="ico ico_check gray"></i>4개이상 연속되거나 동일한 문자/숫자 제외<br/>
+													</span>
+													<span id="thirdFailed" class="c_gray">
+														<i class="ico ico_check gray"></i>아이디 제외
+													</span>
+												</p>
+												<!-- //사용불가 비밀번호일경우 -->
+												<!-- 사용가능한 비밀번호일경우 -->
+												<p id="avlPwd" class="hide">
+													<span class="c_black2">
+														<i class="ico ico_check black"></i>사용 가능한 비밀번호입니다
+													</span>
+												</p>
+												<!-- //사용가능한 비밀번호일경우 -->
+											</div>
+											<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+										</td>
+									</tr>
+									<tr>
+										<th>
+											비밀번호 확인
+										</th>
+										<td>
+											<div class="form_field">
+												<div class="input_wrap">
+													<input type="password" id="confirmPassword" name="confirmPassword" class="form_control" placeholder="비밀번호를 동일하게 입력해주세요." minlength="8" maxlength="20" />
+												</div>
+											</div>
+											<div class="help_block">
+												<!-- 비밀번호확인 틀렸을경우 -->
+												<p d="misPwd" class="hide">
+													<span class="t_err">
+														새 비밀번호가 일치하지 않습니다.
+													</span>
+												</p>
+												<!-- //비밀번호확인 틀렸을경우 -->
+												<!-- 비밀번호 일치할경우 -->
+												<p id="avlConPwd" class="hide">
+													<span class="c_black2"><i class="ico ico_check black"></i>새 비밀번호가 일치합니다.</span>
+												</p>
+												<!-- //비밀번호 일치할경우 -->
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+					</div>
+					<div class="btn_footer_area">
+						<button type="button" class="btn btn_default btn_md" onclick="cfnGoToPage(_PAGE_MYPAGE);"><span>취소</span></button>
+						<button type="button" id="btnSavePassword" class="btn btn_dark btn_md" disabled="disabled"><span>확인</span></button>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	// 비밀번호 입력
+	$('#resetPasswordForm input[name=passwd]').on('focusout keyup keydown', function () {
+		fnCheckPassword();
+	});
+
+	// 비밀번호 확인 입력
+	$('#resetPasswordForm input[name=confirmPassword]').on('focusout keyup keydown', function () {
+		fnCheckConfirmPassword();
+	});
+
+	// 비밀번호 확인
+	var fnCheckPassword = function () {
+		const $firstFailed = $('#firstFailed');
+		const $secondFailed = $('#secondFailed');
+		const $thirdFailed = $('#thirdFailed');
+		const $avlPwd = $('#avlPwd');
+		const red = 'c_red2';
+		const gray = 'c_gray';
+		let custId = $('#resetPasswordForm input[name=custId]').val();
+		let password = $('#resetPasswordForm input[name=passwd]').val();
+		let confirmPassword = $('#resetPasswordForm input[name=confirmPassword]').val();
+		let pwdCheck = true;
+
+		// 영문, 숫자, 특수문자 2종 이상 혼용 || 길이
+		if (fnValidtaionPwdMixedWord(password) || fnValidationPwdLength(password)) {
+			pwdCheck = false;
+			$firstFailed.removeClass(gray);
+			$firstFailed.addClass(red);
+		} else {
+			$firstFailed.removeClass(red);
+			$firstFailed.addClass(gray);
+		}
+
+		// 동일한 문자/숫자 4자이상 || 연속된 문자가 4자이상
+		if (fnValidationPwdSameWord(password) || fnValidtaionPwdCntnsWord(password)) {
+			pwdCheck = false;
+			$secondFailed.removeClass(gray);
+			$secondFailed.addClass(red);
+		} else {
+			$secondFailed.removeClass(red);
+			$secondFailed.addClass(gray);
+		}
+
+		// 아이디 포함
+		if (fnValidationPwdSameId(password, custId)) {
+			pwdCheck = false;
+			$thirdFailed.removeClass(gray);
+			$thirdFailed.addClass(red);
+		} else {
+			$thirdFailed.removeClass(red);
+			$thirdFailed.addClass(gray);
+		}
+
+		if (pwdCheck) {
+			$firstFailed.hide();
+			$secondFailed.hide();
+			$thirdFailed.hide();
+			$avlPwd.show();
+		} else {
+			$firstFailed.show();
+			$secondFailed.show();
+			$thirdFailed.show();
+			$avlPwd.hide();
+		}
+
+		if (!gagajf.isNull(confirmPassword)) {
+			fnCheckConfirmPassword();
+		}
+
+	};
+
+	// 비밀번호체크
+	var fnCheckConfirmPassword = function () {
+		const $misPwd = $('#misPwd');
+		const $avlConPwd = $('#avlConPwd');
+		const $btnSavePassword = $('#btnSavePassword');
+		let password = $('#resetPasswordForm input[name=passwd]').val();
+		let confirmPassword = $('#resetPasswordForm input[name=confirmPassword]').val();
+		if (!gagajf.isNull(password) && !gagajf.isNull(confirmPassword)) {
+			if (fnValidationPwdSameConfirmPwd(password, confirmPassword)) {
+				$avlConPwd.hide();
+				$misPwd.show();
+				$btnSavePassword.attr('disabled', true);
+			} else {
+				$misPwd.hide();
+				$avlConPwd.show();
+				$btnSavePassword.attr('disabled', false);
+			}
+		}
+
+
+	};
+
+	// 패스워드 저장
+	$('#btnSavePassword').on('click', function () {
+		let resetPasswordForm = $('#resetPasswordForm').serializeObject();
+
+		if (gagajf.isNull(resetPasswordForm.passwd)) {
+			mcxDialog.alert('신규 비밀번호를 입력하신 후 다시 시도해주세요.');
+			return;
+		}
+
+		if (gagajf.isNull(resetPasswordForm.confirmPassword)) {
+			mcxDialog.alert('비밀번호 확인을 입력하신 후 다시 시도해주세요.');
+			return;
+		}
+
+		if (resetPasswordForm.passwd != resetPasswordForm.confirmPassword) {
+			mcxDialog.alert('비밀번호가 일치하지 않습니다. 다시 확인해주세요.');
+			return;
+		}
+
+		fnCheckPassword();
+		fnCheckConfirmPassword();
+		let jsonData = JSON.stringify(resetPasswordForm);
+		gagajf.ajaxJsonSubmit('/customer/password/reset', jsonData, fnSavePasswordCallback);
+	});
+
+	var fnSavePasswordCallback = function (result) {
+		if (result.isSuccess) {
+			mcxDialog.alertC('비밀번호 변경이 완료 되었습니다.', {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_MYPAGE_CUSTOMER);
+				}
+			});
+		} else {
+			mcxDialog.alert('비밀번호 변경이 실패 되었습니다.')
+		}
+	};
+
+	$(document).ready(function() {
+		// 마이페이지 LNB 설정
+		fnSetMypageLnbList(10);
+
+		// 마이페이지 location 설정
+		fnSetMypageLocation('내정보 관리');
+
+	});
+
+	/*]]>*/
+</script>
+
+</th:block>
+
+</body>
+</html>
+
+

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

@@ -20,68 +20,68 @@
 
 <th:block layout:fragment="content">
 	<div class="my_cont">
-						<div class="sec_head">
-							<h3>STYLE24 포인트</h3>
-						</div>
-						<div class="sec_body">
-							<div class="save_area mypage_coupon">
-								<p>사용 가능한 보유 포인트<strong th:text="${#numbers.formatDecimal(pointInfo.rmPntAmt, 0, 'COMMA', 0, 'POINT')}"></strong>P</p>
-								<ul>
-									<li>적립 예정 포인트 <span>
-										<th:block th:text="${#numbers.formatDecimal(expectedpointInfo.expectedPntAmt, 0, 'COMMA', 0, 'POINT')}"></th:block>P
-									</span></li>
-									<li>한달 이내 소멸 예정 <span>
-										<th:block th:text="${#numbers.formatDecimal(extinctpointInfo.expectedExpirePntAmt, 0, 'COMMA', 0, 'POINT')}"></th:block>P
-									</span></li>
-								</ul>
-							</div>
-							<div class="my_tab coupon_tab">
-								<ul>
-									<li><a href="javascript:void(0);" id="allPointList">전체내역</a></li>
-									<li><a href="javascript:void(0);" id="accumulatePointList">적립내역</a></li>
-									<li><a href="javascript:void(0);" id="usePointList">사용내역</a></li>
+		<div class="sec_head">
+			<h3>STYLE24 포인트</h3>
+		</div>
+		<div class="sec_body">
+			<div class="save_area mypage_coupon">
+				<p>사용 가능한 보유 포인트<strong th:text="${#numbers.formatDecimal(rmPntAmt, 0, 'COMMA', 0, 'POINT')}"></strong>P</p>
+				<ul>
+					<li>적립 예정 포인트 <span>
+						<th:block th:text="${#numbers.formatDecimal(expectedPntAmt, 0, 'COMMA', 0, 'POINT')}"></th:block>P
+					</span></li>
+					<li>한달 이내 소멸 예정 <span>
+						<th:block th:text="${#numbers.formatDecimal(expectedExpirePntAmt, 0, 'COMMA', 0, 'POINT')}"></th:block>P
+					</span></li>
+				</ul>
+			</div>
+			<div class="my_tab coupon_tab">
+				<ul>
+					<li><a href="javascript:void(0);" id="allPointList">전체내역</a></li>
+					<li><a href="javascript:void(0);" id="accumulatePointList">적립내역</a></li>
+					<li><a href="javascript:void(0);" id="usePointList">사용내역</a></li>
+				</ul>
+	<!-- 								<div class="form_field"> -->
+	<!-- 									<select id="searchDt" name="searchDt" onchange="fnSearchDate(this);"> -->
+	<!-- 									</select>  -->
+	<!-- 								</div> -->
+				<div class="form_field">
+					<div class="select_custom type1">
+						<div class="combo">
+							<input type="hidden" name="pointDate" value="0"/>
+							<div class="select"></div> <!-- 셀렉박스 -->
+								<ul id="searchDt" class="list" style="width:200px; margin:0 auto">
 								</ul>
-<!-- 								<div class="form_field"> -->
-<!-- 									<select id="searchDt" name="searchDt" onchange="fnSearchDate(this);"> -->
-<!-- 									</select>  -->
-<!-- 								</div> -->
-								<div class="form_field">
-									<div class="select_custom type1">
-										<div class="combo">
-											<input type="hidden" name="pointDate" value="0"/> 
-											<div class="select"></div> <!-- 셀렉박스 -->
-												<ul id="searchDt" class="list" style="width:200px; margin:0 auto">
-												</ul>
-										</div>
-									</div>
-								</div>
-							</div>
-							<div class="order_list">
-								<section class="order_row">
-									<div class="tbl point_tbl track_tbl type2">
-										<table>
-											<colgroup>
-												<col width="150px">
-												<col width="660px">
-												<col width="*">
-												<col width="200px">
-											</colgroup>   
-											<thead>
-												<tr>
-													<th>사유</th>
-													<th>내용</th>
-													<th id="plusMinus"></th>
-													<th>일자</th>
-												</tr>
-											</thead>
-											<tbody id="pointAjaxList">
-											</tbody>
-										</table>
-									</div>
-								</section>
-							</div>
 						</div>
 					</div>
+				</div>
+			</div>
+			<div class="order_list">
+				<section class="order_row">
+					<div class="tbl point_tbl track_tbl type2">
+						<table>
+							<colgroup>
+								<col width="150px">
+								<col width="660px">
+								<col width="*">
+								<col width="200px">
+							</colgroup>
+							<thead>
+								<tr>
+									<th>사유</th>
+									<th>내용</th>
+									<th id="plusMinus"></th>
+									<th>일자</th>
+								</tr>
+							</thead>
+							<tbody id="pointAjaxList">
+							</tbody>
+						</table>
+					</div>
+				</section>
+			</div>
+		</div>
+	</div>
 <script th:inline="javascript">
 	let accumulatePointList = [[${accumulatePointList}]];
 	let usePointList = [[${usePointList}]];

+ 4 - 3
src/main/webapp/WEB-INF/views/web/planning/PlanningDetailFormWeb.html

@@ -69,6 +69,8 @@
 								</th:block>
 								
 							</th:block>
+							
+						
 							<div class="coner_front">
 								<div class="promotion_visual" th:if="${fsrcInfoBtm != null}" th:utext="${fsrcInfoBtm.fsrcPc}"></div>
 								<!-- 하단배너 -->
@@ -336,8 +338,7 @@ if(coupon != null || coupon != ''){
 			html += '					</button>';			
 		}
 		html += '				</div>';
-		html += '				<button type="button" class="btn_underline"';
-		html += '					id="btn_cpinfo_pop">';
+		html += '				<button type="button" class="btn_underline"	id="btn_cpinfo_pop" onclick="useInfoCoupon('+coupon[i].cpnId+')">';
 		html += '					<span>사용안내</span>';
 		html += '				</button>';
 		html += '			</li>';
@@ -606,7 +607,7 @@ return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
                     clickable: true,
                 },
             });
-
+            
             
             //내부앵커이동
             $(".bullet_sticky_nav li a").on("click", function(){

+ 1 - 1
src/main/webapp/ux/pc/css/common.css

@@ -1222,7 +1222,7 @@ input[type="file"] {
 .quick_menu_group .area > div:first-child span:first-child a{margin-left:0}
 .quick_menu_group .area > div:first-child span:first-child a:after{display:none}
 .quick_menu_group .area > div:first-child span a:after{position:absolute;top:13px;left:0;width:1px;height:13px;background:#959596;content:''}
-.quick_menu_group .inr a{margin-left:16px;color:#eeeeee;}*/
+.quick_menu_group .inr a{margin-left:16px;color:#eeeeee;}
 
 
 

Разница между файлами не показана из-за своего большого размера
+ 478 - 363
src/main/webapp/ux/pc/css/layout.css


+ 22 - 0
src/main/webapp/ux/style24_link.js

@@ -22,6 +22,8 @@ const _PAGE_CUSTOMER_PWD_CHANGE_FIND = _frontUrl + "/customer/password/change/fo
 const _PAGE_CUSTOMER_PWD_CHANGE_TEMP = _frontUrl + "/customer/password/change/form?pageGb=temp";	// 고객 > 임시비밀번호 로그인 > 비밀번호 변경 화면
 const _PAGE_CUSTOMER_DORMANT = _frontUrl + "/customer/dormant/certify/form";						// 고객 > 휴면회원
 const _PAGE_CUSTOMER_DORMANT_COMPLETE = _frontUrl + "/customer/dormant/certify/complete/form";		// 고객 > 휴면회원 > 완료페이지
+const _PAGE_CUSTOMER_SECEDE = _frontUrl + "/customer/secede/form";									// 고객 > 회원탈퇴
+const _PAGE_CUSTOMER_SECEDE_COMPLETE = _frontUrl + "/customer/secede/complete/form";				// 고객 > 회원탈퇴 > 완료페이지
 const _PAGE_CUSTOMER_CERTIFICATION = _frontUrl + "/customer/certification/form"						// 고객 > 본인인증화면
 const _PAGE_USE_TERMS = _frontUrl + "/customer/use/terms/form";										// Footer > 이용약관
 const _PAGE_PRIVACY_POLICY = _frontUrl + "/customer/privacy/policy/form";							// Footer > 개인정보취급방침
@@ -40,6 +42,7 @@ const _PAGE_GOODS_REVIEW_LAYER = _frontUrl + "/goods/review/layer/";								// 
 const _PAGE_GOODS_REVIEW_DETAIL_LAYER = _frontUrl + "/goods/review/detail/layer";					// 상품평- 상세(베스트, 포토)
 const _PAGE_GOODS_REVIEW_PHTO_LIST_LAYER = _frontUrl + "/goods/review/photo/layer/";				// 상품평- 포토/영상 리뷰 (list)
 const _PAGE_GOODS_CPN_DOWNLOAD = "/goods/coupon/download";											// 상품쿠폰다운로드
+const _PAGE_DEAL_GOODS_DETAIL_LAYER = _frontUrl + "/goods/deal/detail/layer/";						// 딜상품 상세레이어
 
 //== 장바구니 ==/
 const _PAGE_CART = _frontUrl + "/cart/list/form";								// 장바구니
@@ -673,6 +676,25 @@ function cfGoodsReview(goodsCd) {
 	cfOpenFullLayer(_PAGE_GOODS_REVIEW_LAYER + goodsCd, 'layer_goods_review',null , fnReviewLayerCollBack);
 }
 
+/**
+* @type   : function
+* @access : public
+* @desc   : 딜구성상품상세 full 팝업
+* <pre>
+*		cfGoodsDeailDetail();
+* </pre>
+*/
+function cfGoodsDeailDetail(goodsCd, compsGoodsCd) {
+	var Param = new Object();
+	var str = '<div class="pd_pop full_pop pd_descrp_pop" id="layer_goods_deal_detail"></div>';
+
+	if ($('#layer_goods_deal_detail').length == 0) {
+		$('body').append(str);
+	}
+
+	cfOpenFullLayer(_PAGE_DEAL_GOODS_DETAIL_LAYER + goodsCd +'/'+compsGoodsCd, 'layer_goods_deal_detail');
+}
+
 /**
  * @type   : function
  * @access : public

Некоторые файлы не были показаны из-за большого количества измененных файлов