Przeglądaj źródła

Merge branch 'develop' into bin2107

김지철 5 lat temu
rodzic
commit
62ac9ede42
40 zmienionych plików z 978 dodań i 366 usunięć
  1. 20 0
      src/main/java/com/style24/front/biz/service/TsfCartService.java
  2. 0 7
      src/main/java/com/style24/front/biz/service/TsfCustomerService.java
  3. 3 1
      src/main/java/com/style24/front/biz/service/TsfGoodsService.java
  4. 82 4
      src/main/java/com/style24/front/biz/web/TsfCartController.java
  5. 56 10
      src/main/java/com/style24/front/biz/web/TsfGoodsController.java
  6. 16 1
      src/main/java/com/style24/front/biz/web/TsfMypageController.java
  7. 6 1
      src/main/java/com/style24/persistence/domain/Goods.java
  8. 1 0
      src/main/java/com/style24/persistence/domain/GoodsCompose.java
  9. 16 9
      src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml
  10. 3 3
      src/main/java/com/style24/persistence/mybatis/shop/TsfCoupon.xml
  11. 41 8
      src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml
  12. 21 1
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrder.xml
  13. 31 17
      src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml
  14. 141 102
      src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml
  15. 29 15
      src/main/webapp/WEB-INF/views/mob/mypage/MypageCustModifyFormMob.html
  16. 76 76
      src/main/webapp/WEB-INF/views/mob/mypage/MypageCustPwdModifyFormMob.html
  17. 5 1
      src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListInfoMob.html
  18. 3 3
      src/main/webapp/WEB-INF/views/mob/order/OrderDeliveryAddrInfoMob.html
  19. 58 5
      src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html
  20. 3 3
      src/main/webapp/WEB-INF/views/mob/order/OrderFreegiftInfoMob.html
  21. 2 4
      src/main/webapp/WEB-INF/views/web/cart/CartDelvFeeSaveGoodsPopupWeb.html
  22. 6 3
      src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html
  23. 37 7
      src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html
  24. 109 0
      src/main/webapp/WEB-INF/views/web/cart/CartTmtbSalesGoodsPopupWeb.html
  25. 27 15
      src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html
  26. 30 3
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html
  27. 0 4
      src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html
  28. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsIncludeFormWeb.html
  29. 1 1
      src/main/webapp/WEB-INF/views/web/goods/GoodsReviewDetailFormWeb.html
  30. 2 2
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustConfirmFormWeb.html
  31. 31 14
      src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html
  32. 8 8
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html
  33. 8 8
      src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html
  34. 1 1
      src/main/webapp/WEB-INF/views/web/mypage/MypageReturnFormWeb.html
  35. 4 4
      src/main/webapp/WEB-INF/views/web/order/OrderDeliveryAddrInfoWeb.html
  36. 57 10
      src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html
  37. 3 3
      src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html
  38. 1 1
      src/main/webapp/ux/pc/css/layout.css
  39. 31 6
      src/main/webapp/ux/pc/js/common-ui.js
  40. 8 4
      src/main/webapp/ux/style24_link.js

+ 20 - 0
src/main/java/com/style24/front/biz/service/TsfCartService.java

@@ -1,6 +1,7 @@
 package com.style24.front.biz.service;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -1287,4 +1288,23 @@ public class TsfCartService {
 		order.setChgQty(cartDao.updateCartGoodsQty(param));
 		return order;
 	}
+
+	public Collection<Order> selectTmtbSalesValueList(Goods param) {
+		List<Integer> arr = Arrays.asList(param.getArrTmtbSq());
+		return cartDao.selectTmtbSectionValList(arr);
+	}
+
+	public Collection<Goods> selectTmtbSalesGoodsOptCd(Goods param) {
+		Goods goods = new Goods();
+		if(TsfSession.isLogin()) {
+			goods.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			goods.setCustNo(0);
+		}
+
+		goods.setFrontGb(TsfSession.getFrontGb());
+		goods.setGoodsCd(param.getGoodsCd());
+
+		return goodsDao.getDelvFeeSaveGoodsList(goods);
+	}
 }

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

@@ -837,13 +837,6 @@ public class TsfCustomerService {
 
 		// 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);

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

@@ -79,7 +79,7 @@ public class TsfGoodsService {
 			} else {
 				goodsViewHst.setReferer(referer);
 			}
-		}
+		} 
 
 		if (TsfSession.getInfo() != null) {
 			goodsViewHst.setCustNo(TsfSession.getInfo().getCustNo());
@@ -702,6 +702,8 @@ public class TsfGoodsService {
 			goodsExtend.setGoodsNotiList(goodsDao.getGoodsNotiList(tmpGoods));
 			// 이미지 정보
 			goodsExtend.setGoodsImgList(goodsDao.getGoodsImgList(tmpGoods));
+			// 상품 안전인증 정보
+			goodsExtend.setGoodsSafeNo(goodsDao.getGoodsSafeNo(tmpGoods));
 
 		}
 		return getGoodsSetComposeList;

+ 82 - 4
src/main/java/com/style24/front/biz/web/TsfCartController.java

@@ -1,16 +1,19 @@
 package com.style24.front.biz.web;
 
+import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
+import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -25,11 +28,13 @@ import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.front.biz.service.TsfCartService;
 import com.style24.front.biz.service.TsfCouponService;
+import com.style24.front.biz.service.TsfGoodsService;
 import com.style24.front.biz.service.TsfOrderService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
 import com.style24.persistence.domain.Cart;
 import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Order;
 
@@ -52,6 +57,9 @@ public class TsfCartController extends TsfBaseController {
 	@Autowired
 	private TsfCartService cartService;
 
+	@Autowired
+	private TsfGoodsService goodsService;
+
 	@Autowired
 	private TsfCouponService couponService;
 
@@ -152,10 +160,61 @@ public class TsfCartController extends TsfBaseController {
 	}
 
 	@PostMapping("/delv/fee/save/goods/list")
-	public ModelAndView selectCartAddGoodsList(Order param, Model model) {
+	public ModelAndView selectCartAddGoodsList(Order param) {
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("goodsList", cartService.getDelvFeeSaveGoodsList(param));
-		mav.setViewName(super.getDeviceViewName("cart/CartAddGoodsPopup"));
+		mav.setViewName(super.getDeviceViewName("cart/CartDelvFeeSaveGoodsPopup"));
+		return mav;
+	}
+
+	@PostMapping("/tmtb/sales/goods/list")
+	public ModelAndView selectTmtbSalesGoodsList(@RequestBody Goods param) {
+		log.info("CHECK PARAM :::: {}", param.getArrTmtbSq()[0]);
+		ModelAndView mav = new ModelAndView();
+		param.setFrontGb(TsfSession.getFrontGb());
+		param.setSiteCd(TscConstants.Site.STYLE24.value());
+		param.setMaxRownum(20);
+
+		// 회원 구분
+		if (TsfSession.getInfo() != null) {
+			param.setCustGb(TsfSession.getInfo().getCustGb());
+			param.setCustNo(TsfSession.getInfo().getCustNo());
+		} else {
+			param.setCustGb(TsfSession.getCustGb());
+			param.setCustNo(0);
+		}
+
+		// 수량 및 금액 다다익선 최소 조건 조회
+		DecimalFormat format = new DecimalFormat("###,###");
+		List<Order> tmtbSalesValueList = (ArrayList<Order>) cartService.selectTmtbSalesValueList(param);
+		// 조건 멘트 적용
+		List<StringBuilder> tmtbDcDescList = new ArrayList<StringBuilder>();
+		for(Order tmtbDcValue : tmtbSalesValueList) {
+			if(!StringUtils.isEmpty(tmtbDcValue.getDefaultYn()) && "Y".equals(tmtbDcValue.getDefaultYn())) {
+				StringBuilder tmtbDcDesc = new StringBuilder();
+				if(TscConstants.ApplyGb.QTY.value().equals(tmtbDcValue.getSectionGb())) {
+					tmtbDcDesc.append(tmtbDcValue.getSectionVal()).append("개 이상 구매시 ");
+				} else if (TscConstants.ApplyGb.AMT.value().equals(tmtbDcValue.getSectionGb())) {
+					tmtbDcDesc.append(format.format(tmtbDcValue.getSectionVal())).append("원 이상 구매시 ");
+				}
+
+				if(TscConstants.DcWay.AMT.value().equals(tmtbDcValue.getDcWay())) {
+					tmtbDcDesc.append(format.format(tmtbDcValue.getDcVal())).append("원 할인");
+				} else if(TscConstants.DcWay.RATE.value().equals(tmtbDcValue.getDcWay())) {
+					tmtbDcDesc.append(tmtbDcValue.getDcVal()).append("% 할인");
+				}
+
+				tmtbDcDescList.add(tmtbDcDesc);
+			}
+		}
+
+		// 다다익선 조건
+		mav.addObject("tmtbDcDescList", tmtbDcDescList);
+
+		// 다다익선 상품 조회 (수량, 금액 섞어서)
+		mav.addObject("goodsList", goodsService.getTmtbGoodsList(param));
+
+		mav.setViewName(super.getDeviceViewName("cart/CartTmtbSalesGoodsPopup"));
 		return mav;
 	}
 
@@ -293,8 +352,8 @@ public class TsfCartController extends TsfBaseController {
 	/**
 	 * 퀵메뉴 장바구니 리스트
 	 * @return
-	 * @author sowon
-	 * @since 2021. 4. 1
+	 * @author xodud1202
+	 * @since 2021. 04. 02
 	 */
 	@GetMapping("/quick/cart/list")
 	@ResponseBody
@@ -320,4 +379,23 @@ public class TsfCartController extends TsfBaseController {
 
 		return cart;
 	}
+
+	/**
+	 * 상품 품절 제외 옵션 조회
+	 * @param param
+	 * @return
+	 */
+	@ResponseBody
+	@PostMapping("/tmtb/sales/goods/optcd")
+	public Goods selectTmtbSalesGoodsOptCd(@RequestBody Goods param) {
+		Collection<Goods> goodsList = cartService.selectTmtbSalesGoodsOptCd(param);
+		Goods result = new Goods();
+		for(Goods goods : goodsList) {
+			result = goods;		// goodsList는 상품정보 1라인만 조회됨
+		}
+
+		log.info("CHECK MY RESULT ::::: {} / {} / {}", goodsList.size(), result.getGoodsCd(), result.getOptCd());
+
+		return result;
+	}
 }

+ 56 - 10
src/main/java/com/style24/front/biz/web/TsfGoodsController.java

@@ -190,23 +190,29 @@ public class TsfGoodsController extends TsfBaseController {
 			mav.addObject("goodsDealComposeList", goodsDealComposeList);
 
 			Collection<Coupon> goodsCouponList = new ArrayList<Coupon>();
+			ArrayList<String> arrGoodsList = new ArrayList<>();
 			// 상품쿠폰
 			if (goodsDealComposeList != null && !goodsDealComposeList.isEmpty()) {
-
-				ArrayList<String> arrGoodsList = new ArrayList<>();
 				for (Goods goodsCompose : goodsDealComposeList) {
-
 					arrGoodsList.add(goodsCompose.getCompsGoodsCd());
 				}
 
 				String[] arrGoodsCd = arrGoodsList.stream().toArray(String[]::new);
 
 				paramsGoods.setArrGoodsCd(arrGoodsCd);
-				paramsGoods.setMaxRownum(1);
-				goodsCouponList = couponService.getGoodsCouponList(paramsGoods);
 			}
+			paramsGoods.setMaxRownum(1);
+			goodsCouponList = couponService.getGoodsCouponList(paramsGoods);
 			mav.addObject("goodsCouponList", goodsCouponList);
+			
+			// 다다익선
+			paramsGoods.setMaxRownum(1);
+			mav.addObject("tmtbList", goodsService.getTmtbList(paramsGoods));
 
+			// 사은품
+			paramsGoods.setMaxRownum(1);
+			mav.addObject("freeGoodsList", goodsService.getFreeGoodsList(paramsGoods));
+			
 			// 딜용 상품평건수
 			Review review = new Review();
 			review.setGoodsCd(goods.getGoodsCd());
@@ -590,6 +596,21 @@ public class TsfGoodsController extends TsfBaseController {
 		setGoods(paramsGoods);
 		Goods goods = goodsService.getGoodsInfo(paramsGoods);
 
+		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) {	// 딜상품
+			Collection<Goods> goodsDealComposeList = goodsService.getGoodsDealComposeList(paramsGoods);
+			Collection<Coupon> goodsCouponList = new ArrayList<Coupon>();
+			ArrayList<String> arrGoodsList = new ArrayList<>();
+			// 상품쿠폰
+			if (goodsDealComposeList != null && !goodsDealComposeList.isEmpty()) {
+				for (Goods goodsCompose : goodsDealComposeList) {
+					arrGoodsList.add(goodsCompose.getCompsGoodsCd());
+				}
+
+				String[] arrGoodsCd = arrGoodsList.stream().toArray(String[]::new);
+
+				paramsGoods.setArrGoodsCd(arrGoodsCd);
+			}
+			}
 		// 쿠폰정보
 		paramsGoods.setMaxRownum(1);
 		mav.addObject("goodsCouponList", couponService.getGoodsCouponList(paramsGoods));
@@ -1104,19 +1125,44 @@ public class TsfGoodsController extends TsfBaseController {
 	 */
 	@PostMapping(value = "/coupon/download")
 	@ResponseBody
-	public GagaMap createGoodsCoupon(@RequestBody Goods goods) throws Exception {
+	public GagaMap createGoodsCoupon(@RequestBody Goods paramsGoods) throws Exception {
 
 		GagaMap result = new GagaMap();
 
 		// 상품관련 기본값 설정(회원 등급, 앱, PC/모바일 등)
-		setGoods(goods);
+		setGoods(paramsGoods);
+		log.info("createGoodsCoupon  paramsGoods {}", paramsGoods);
+
+		// 일반상품과 딜상품 구분
+		Goods goods = goodsService.getGoodsInfo(paramsGoods);
+		if (goods == null || StringUtils.isBlank(goods.getGoodsCd())) {
+			result.set("message", "발급가능 쿠폰이 없습니다.");
+			result.set("status", "200");
+			result.set("params", paramsGoods);
+			return result;
+		}
+		
 		log.info("createGoodsCoupon  goods {}", goods);
+		if (TscConstants.GoodsType.DEAL.value().equals(goods.getGoodsType())) { 
+			Collection<Goods> goodsDealComposeList = goodsService.getGoodsDealComposeList(paramsGoods);
+			// 상품쿠폰
+			if (goodsDealComposeList != null && !goodsDealComposeList.isEmpty()) {
 
+				ArrayList<String> arrGoodsList = new ArrayList<>();
+				for (Goods goodsCompose : goodsDealComposeList) {
+					arrGoodsList.add(goodsCompose.getCompsGoodsCd());
+				}
+
+				String[] arrGoodsCd = arrGoodsList.stream().toArray(String[]::new);
+				paramsGoods.setArrGoodsCd(arrGoodsCd);
+			}
+		}
+		
 		// 쿠폰발급
 		// ERROR_10: 발급가능 쿠폰없음, 20: 발급완료 쿠폰, 30: 발급받은 쿠폰
 		//죄송합니다. 쿠폰이 모두 소진되었습니다
 		//죄송합니다. 해당 쿠폰은 다운로드가 불가합니다.
-		String couponResult = goodsService.createGoodsCoupon(goods);
+		String couponResult = goodsService.createGoodsCoupon(paramsGoods);
 
 		result.set("status", GagaResponseStatus.SUCCESS.getCode());
 
@@ -1135,8 +1181,8 @@ public class TsfGoodsController extends TsfBaseController {
 
 		}
 		result.set("status", "200");
-		result.set("params", goods);
-		result.set("goodsCouponList", couponService.getGoodsCouponList(goods));
+		result.set("params", paramsGoods);
+		result.set("goodsCouponList", couponService.getGoodsCouponList(paramsGoods));
 		return result;
 	}
 

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

@@ -1904,6 +1904,21 @@ public class TsfMypageController extends TsfBaseController {
 	@PostMapping("/customer/info/save")
 	@ResponseBody
 	public GagaMap updateCustomerInfo(@RequestBody Customer customer) {
+		CustAccount custAccount = new CustAccount();
+		custAccount.setIpAddress(TsfSession.getIpAddress());
+		custAccount.setAccountNm(customer.getAccountNm());
+		custAccount.setAccountNo(customer.getAccountNo());
+		custAccount.setBankCd(customer.getBankCd());
+
+		if ("Y".equals(customer.getAccountModifyYn())) {
+			GagaMap result = coreKcpService.checkAccount(custAccount);
+			if (!"0000".equals(result.get("resCd"))) {
+				result.setBoolean("isSuccess", false);
+				result.setString("resultType", "INVALID_ACCOUNT");
+				return result;
+			}
+		}
+
 		return customerService.saveCustomerInfo(customer);
 	}
 
@@ -1916,7 +1931,7 @@ public class TsfMypageController extends TsfBaseController {
 	 */
 	@RequestMapping("/account/check")
 	@ResponseBody
-	public GagaMap getAccountCheck(@RequestBody CustAccount custAccount) throws Exception {
+	public GagaMap getAccountCheck(@RequestBody CustAccount custAccount) {
 		custAccount.setIpAddress(TsfSession.getIpAddress());
 		boolean isValid = false;
 		GagaMap result = coreKcpService.checkAccount(custAccount);

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

@@ -1,5 +1,7 @@
 package com.style24.persistence.domain;
 
+import java.util.List;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 
@@ -194,7 +196,10 @@ public class Goods extends TscBaseDomain {
 	private int[] arrCpnId;				// 쿠폰
 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	private String[] arrGoodsCd;			// 상품코드
+	private String[] arrGoodsCd;		// 상품코드
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private Integer[] arrTmtbSq;			// 다다익선 번호
 
 	private String goodsSql;	// 오늘본상품SQL
 

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

@@ -50,6 +50,7 @@ public class GoodsCompose extends TscBaseDomain {
 	private Collection<GoodsNotiInfo> goodsNotiList;
 	private Collection<GoodsStock> goodsSizeList;
 	private Collection<GoodsImg> goodsImgList;
+	private GoodsSafeNo goodsSafeNo;
 
 	//상품상세 구분(10:상품타이틀,20:상품타이틀내용,30:상품특징,40:상위컨텐츠,50:하위컨텐츠,60:상위컨텐츠-모바일,70:하위컨텐츠-모바일,80:상품상세(as-is,입점))
 	private String goodsTitle; 			// 10:상품타이틀

+ 16 - 9
src/main/java/com/style24/persistence/mybatis/shop/TsfCart.xml

@@ -451,18 +451,25 @@
 	<select id="selectTmtbSectionValList" parameterType="int" resultType="Order">
 		/* TsfCart.selectTmtbSectionValList : 다다익선 SECTION 적용 조건 조회 */
 		SELECT TC.SECTION_GB
-			 , TC.SECTION_VAL
-			 , TC.TMTB_SQ
-			 , TV.DC_WAY
-			 , TV.DC_VAL
+		     , TC.SECTION_VAL
+		     , TC.TMTB_SQ
+		     , TV.DC_WAY
+		     , TV.DC_VAL
+		     , CASE WHEN TS.TMTB_SQ IS NULL THEN 'N' ELSE 'Y' END AS DEFAULT_YN
 		FROM   TB_TMTB_SECTION TC
 		INNER  JOIN TB_TMTB_VAL TV
-		ON	 TC.TMTB_SECTION_SQ = TV.TMTB_SECTION_SQ
+		ON     TC.TMTB_SECTION_SQ = TV.TMTB_SECTION_SQ
+		LEFT   OUTER JOIN (SELECT TS.TMTB_SQ
+		                        , MIN(TS.SECTION_VAL) AS SECTION_VAL
+		                   FROM   TB_TMTB_SECTION TS
+		                   WHERE  TS.DEL_YN = 'N'
+		                   GROUP  BY TS.TMTB_SQ) TS
+		ON TC.TMTB_SQ = TS.TMTB_SQ
 		WHERE  1=1
-		AND	TC.DEL_YN = 'N'
-		AND	TV.DEL_YN = 'N'
+		AND	   TC.DEL_YN = 'N'
+		AND	   TV.DEL_YN = 'N'
 		<if test="list != null and list.size() > 0">
-		AND	TC.TMTB_SQ IN
+		AND	   TC.TMTB_SQ IN
 			<foreach collection="list" item="item" index="index"  open="(" close=")" separator=",">
 				#{item}
 			</foreach>
@@ -647,7 +654,7 @@
 		                        GROUP  BY  A.CART_SQ
 		               ) STOCK
 		        ON     C.CART_SQ = STOCK.CART_SQ
-		        LEFT   OUTER JOIN TB_GOODS_QUICK_DELEVERY_SKIP GQDS
+		        LEFT   OUTER JOIN TB_GOODS_SHOT_DELV_SKIP GQDS
 		        ON     G.GOODS_CD = GQDS.GOODS_CD
 		        WHERE  1=1
 		        <if test="custNo == 0">

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

@@ -201,13 +201,13 @@
 		     , A.FIRST_ORD_YN
 		     , A.BUY_STDT
 		     , A.BUY_EDDT
-		     , A.CURR_PRICE
+		    -- , A.CURR_PRICE
 		     , DATE_FORMAT(A.AVAIL_EDDT, '%Y-%m-%d') AS AVAIL_EDDT
 		     , IFNULL((SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = A.CPN_ID AND CUST_NO = #{custNo}),0) AS CUST_COUPON_CNT
 		     , (SELECT COUNT(1) FROM TB_CUST_COUPON WHERE CPN_ID = A.CPN_ID) AS TOT_COUPON_CNT
 		     , RNUM
 		FROM (
-		SELECT   CPN_ID
+		SELECT  DISTINCT CPN_ID
 		       , CPN_NM
 		       , DC_AMT
 		       , DC_VAL
@@ -226,7 +226,7 @@
 		       , FIRST_ORD_YN
 		       , BUY_STDT
 		       , BUY_EDDT
-		       , CURR_PRICE
+		      -- , CURR_PRICE
 		       , RANK() OVER(ORDER BY DC_AMT DESC)  AS RNUM   -- 할인금액순
 		FROM   (
 		        SELECT CP.CPN_ID                                              -- 쿠폰ID

+ 41 - 8
src/main/java/com/style24/persistence/mybatis/shop/TsfGoods.xml

@@ -187,7 +187,7 @@
 		                                     AND G.DELV_FEE_CD =  E.DELV_FEE_CD
 		LEFT OUTER JOIN TB_WISHLIST W ON G.GOODS_CD = W.GOODS_CD
 		                              AND IFNULL(#{custNo}, 0) = W.CUST_NO
-		LEFT OUTER JOIN TB_GOODS_QUICK_DELEVERY_SKIP DS ON G.GOODS_CD =DS.GOODS_CD
+		LEFT OUTER JOIN TB_GOODS_SHOT_DELV_SKIP DS ON G.GOODS_CD =DS.GOODS_CD
 		WHERE G.GOODS_CD = #{goodsCd}
 		AND NOW() BETWEEN SELL_STDT AND SELL_EDDT	/*판매기간 확인*/
 		<if test='adminYn == null or adminYn != "Y"'>
@@ -1031,13 +1031,33 @@
 		                               AND C.TMTB_SECTION_SQ  = D.TMTB_SECTION_SQ  
 		                               AND D.DEL_YN  = 'N'
 		      INNER JOIN TB_TMTB_APPLY_GOODS B ON A.TMTB_SQ = B.TMTB_SQ
+		                                       <choose>
+		                                           <when test="arrGoodsCd != null and arrGoodsCd != ''">
+		                                       AND B.GOODS_CD IN
+		                                           <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		                                           UPPER(#{item})
+		                                           </foreach>
+		                                           </when>
+		                                           <otherwise>
 		                                       AND B.GOODS_CD =  #{goodsCd}
+		                                           </otherwise>
+		                                       </choose>
 		                                       AND B.DEL_YN = 'N'
 		                                       AND B.GOODS_GB IN ( 'G800_10', 'G800_20')  -- 기본과 적용상품
 		      LEFT OUTER JOIN TB_TMTB_APPLY_GOODS E ON A.TMTB_SQ = E.TMTB_SQ
-		                                       AND E.GOODS_CD = #{goodsCd}
-		                                       AND E.DEL_YN = 'N'
-		                                       AND E.GOODS_GB = 'G800_30'  -- 제외상품 
+		                                            <choose>
+		                                                <when test="arrGoodsCd != null and arrGoodsCd != ''">
+		                                            AND E.GOODS_CD IN
+		                                                <foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+		                                                UPPER(#{item})
+		                                                </foreach>
+		                                                </when>
+		                                                <otherwise>
+		                                            AND E.GOODS_CD =  #{goodsCd}
+		                                                </otherwise>
+		                                            </choose>
+		                                            AND E.DEL_YN = 'N'
+		                                            AND E.GOODS_GB = 'G800_30'  -- 제외상품 
 		      WHERE NOW() BETWEEN A.TMTB_ST_DT AND A.TMTB_ED_DT
 		      AND A.TMTB_STAT ='G232_11'  -- 진행중
 		      AND A.DEL_YN = 'N'
@@ -1439,7 +1459,7 @@
 		     , G.LIST_PRICE
 		     , G.GOODS_NM
 		     , A.OPT_CD
-		     , (SELECT BRAND_ENM FROM TB_BRAND WHERE BRAND_CD = G.BRAND_CD) AS BRAND_NM
+		     , A.BRAND_NM
 		     , FN_GET_APPLY_CPN1_PRICE(G.GOODS_CD,  #{frontGb}) AS PRICE
 		     , CASE WHEN G.LIST_PRICE <![CDATA[ < ]]> G.CURR_PRICE THEN G.LIST_PRICE ELSE G.CURR_PRICE END AS CURR_PRICE
 		     , ROUND((((FN_GET_APPLY_CPN1_PRICE(G.GOODS_CD,  #{frontGb}) / G.LIST_PRICE) - 1) * 100) * - 1, 0) AS DC_RATE
@@ -1448,7 +1468,12 @@
 		FROM   TB_GOODS G
 		INNER  JOIN (SELECT G.GOODS_CD
 		                  , MIN(VS.OPT_CD) AS OPT_CD
+		                  , MIN(BR.BRAND_ENM) AS BRAND_NM
 		             FROM   TB_GOODS G
+		             INNER  JOIN TB_BRAND BR
+		             ON     G.BRAND_CD = BR.BRAND_CD
+		             INNER  JOIN TB_SUPPLY_COMPANY CM
+		             ON     G.SUPPLY_COMP_CD = CM.SUPPLY_COMP_CD
 		             INNER  JOIN VW_STOCK VS
 		             ON     G.GOODS_CD = VS.GOODS_CD
 		             WHERE  1=1
@@ -1456,14 +1481,22 @@
 		             AND    G.GOODS_TYPE = 'G056_N'
 		             AND    G.SELF_MALL_YN = 'Y'
 		             AND    G.MIN_ORD_QTY = 1
-		             AND    G.CURR_PRICE BETWEEN ${price} AND ${price} + 10000
+		             AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
 		             AND    VS.SOLDOUT_YN = 'N'
 		             AND    VS.CURR_STOCK_QTY > 0
+		             AND    BR.USE_YN = 'Y'
+		             AND    CM.USE_YN = 'Y'
+		             <if test="goodsCd != null and goodsCd != ''">
+		             AND    G.GOODS_CD = #{goodsCd}
+		             </if>
+		             <if test="price != null and price != ''">
+		             AND    G.CURR_PRICE BETWEEN ${price} AND ${price} + 10000
+		             </if>
 		             <if test="delvFeeCd != null and delvFeeCd != ''">
-		             AND G.DELV_FEE_CD = #{delvFeeCd}
+		             AND    G.DELV_FEE_CD = #{delvFeeCd}
 		             </if>
 		             <if test="selfGoodsYn != null and selfGoodsYn != ''">
-		             AND G.SELF_GOODS_YN = #{selfGoodsYn}
+		             AND    G.SELF_GOODS_YN = #{selfGoodsYn}
 		             </if>
 		             GROUP  BY G.GOODS_CD
 		             LIMIT  20 ) A

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

@@ -112,7 +112,9 @@
 					 , OD.CHANGEABLE_YN
 					 , OD.RETURNABLE_YN
 					 , G.SELF_GOODS_YN
-					 , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)							AS BRAND_NM
+		             , CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		                                    ELSE BG.BRAND_GROUP_KNM
+		                END                                                             AS BRAND_NM
 					 , FN_GET_CODE_NM('G013', OD.ORD_DTL_STAT)							AS ORD_DTL_STAT_NM
 					 , R.REVIEW_SQ
 					 , IF(NOW() <![CDATA[<]]> O.ORD_DT + INTERVAL 90 DAY, 'Y', 'N')		AS REVIEWABLE_YN
@@ -137,6 +139,10 @@
 				    ON OD.GOODS_CD = G.GOODS_CD
 				 INNER JOIN TB_BRAND B
 				    ON B.BRAND_CD = G.BRAND_CD
+				   AND B.USE_YN = 'Y'
+				 INNER JOIN TB_BRAND_GROUP BG
+				    ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+				   AND BG.USE_YN = 'Y'
 				 INNER JOIN TB_PAYMENT P
 				    ON O.ORD_NO = P.ORD_NO
 				   AND P.PAY_GB = 'O'
@@ -196,7 +202,14 @@
 				</foreach>
 			</if>
 			<if test="ordDtlStat != null and ordDtlStat != ''">
+				<choose>
+					<when test="ordDtlStat == 'G013_00'">
+		   AND OD.ORD_DTL_STAT = 'G013_10'
+					</when>
+					<otherwise>
 		   AND OD.ORD_DTL_STAT = #{ordDtlStat}
+					</otherwise>
+				</choose>
 			</if>
 		   AND O.DISP_YN = 'Y'
 		   AND OD.ORD_DTL_STAT <![CDATA[<>]]> 'G013_25'
@@ -265,7 +278,14 @@
 		   AND O.ORD_DT BETWEEN CONCAT(#{stDate}, ' 00:00:00') AND CONCAT(#{edDate}, ' 23:59:59')
 		</if>
 		<if test="ordDtlStat != null and ordDtlStat != ''">
+			<choose>
+				<when test="ordDtlStat == 'G013_00'">
+		   AND OD.ORD_DTL_STAT = 'G013_10'
+				</when>
+				<otherwise>
 		   AND OD.ORD_DTL_STAT = #{ordDtlStat}
+				</otherwise>
+			</choose>
 		</if>
 		<choose>
 			<when test="custNo > 0">

+ 31 - 17
src/main/java/com/style24/persistence/mybatis/shop/TsfOrderChange.xml

@@ -452,11 +452,13 @@
 		             , OD.ORD_NO
 		             , OCD.ORD_DTL_NO
 		             , G1.GOODS_CD
-		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		                                    ELSE BG.BRAND_GROUP_KNM
+		                END                                                             AS BRAND_NM
 		             , OD.SHOT_DELV_YN
 		             , G1.SELF_GOODS_YN
 		             , G1.GOODS_NM
-		             , IFNULL(C.COLOR_KNM, ODI.OPT_CD1)                                 AS COLOR_NM
+		             , IFNULL((SELECT COLOR_KNM FROM TB_COLOR C WHERE COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD ) AND USE_YN  = 'Y'), ODI.OPT_CD1) AS COLOR_NM
 		             , G2.GOODS_NM                                                      AS ITEM_NM
 		             , G1.GOODS_TYPE
 		             , ODI.ORD_DTL_ITEM_SQ
@@ -504,9 +506,10 @@
 		            ON ODI.ITEM_CD = G2.GOODS_CD
 		         INNER JOIN TB_BRAND B
 		            ON G1.BRAND_CD = B.BRAND_CD
-		          LEFT OUTER JOIN TB_COLOR C
-		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
-		           AND C.USE_YN = 'Y'
+		           AND B.USE_YN = 'Y'
+		         INNER JOIN TB_BRAND_GROUP BG
+		            ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		           AND BG.USE_YN = 'Y'
 		          LEFT OUTER JOIN TB_REFUND R
 		            ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
 		         WHERE OCD.DEL_YN = 'N'
@@ -603,6 +606,7 @@
 		            ON ODI.ITEM_CD = G2.GOODS_CD
 		         INNER JOIN TB_BRAND B
 		            ON G1.BRAND_CD = B.BRAND_CD
+		           AND B.USE_YN = 'Y'
 		         WHERE O.CUST_NO = #{custNo}
 		           AND O.DISP_YN = 'Y'
 		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
@@ -675,6 +679,7 @@
 		    ON ODI.ITEM_CD = G2.GOODS_CD
 		 INNER JOIN TB_BRAND B
 		    ON G1.BRAND_CD = B.BRAND_CD
+		   AND B.USE_YN = 'Y'
 		 WHERE O.CUST_NO = #{custNo}
 		   AND O.DISP_YN = 'Y'
 		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
@@ -836,7 +841,9 @@
 		             , OD.GFCD_USE_AMT
 		             , OCD.ORD_DTL_NO
 		             , G1.GOODS_CD
-		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		                                    ELSE BG.BRAND_GROUP_KNM
+		                END                                                             AS BRAND_NM
 		             , OD.SHOT_DELV_YN
 		             , G1.SELF_GOODS_YN
 		             , G1.GOODS_NM
@@ -893,9 +900,10 @@
 		            ON ODI.ITEM_CD = G2.GOODS_CD
 		         INNER JOIN TB_BRAND B
 		            ON G1.BRAND_CD = B.BRAND_CD
-		          LEFT OUTER JOIN TB_COLOR C
-		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
-		           AND C.USE_YN = 'Y'
+		           AND B.USE_YN = 'Y'
+		         INNER JOIN TB_BRAND_GROUP BG
+		            ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		           AND BG.USE_YN = 'Y'
 		          LEFT OUTER JOIN TB_REFUND R
 		            ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
 		         INNER JOIN TB_PAYMENT P
@@ -1009,7 +1017,9 @@
 		             , OD.GFCD_USE_AMT
 		             , OCD.ORD_DTL_NO
 		             , G1.GOODS_CD
-		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		                                    ELSE BG.BRAND_GROUP_KNM
+		                END                                                             AS BRAND_NM
 		             , OD.SHOT_DELV_YN
 		             , G1.SELF_GOODS_YN
 		             , G1.GOODS_NM
@@ -1073,9 +1083,10 @@
 		            ON ODI.ITEM_CD = G2.GOODS_CD
 		         INNER JOIN TB_BRAND B
 		            ON G1.BRAND_CD = B.BRAND_CD
-		          LEFT OUTER JOIN TB_COLOR C
-		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
-		           AND C.USE_YN = 'Y'
+		           AND B.USE_YN = 'Y'
+		         INNER JOIN TB_BRAND_GROUP BG
+		            ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		           AND BG.USE_YN = 'Y'
 		          LEFT OUTER JOIN TB_REFUND R
 		            ON R.ORD_CHG_SQ = OC.ORD_CHG_SQ
 		         INNER JOIN TB_PAYMENT P
@@ -1183,7 +1194,9 @@
 		             , OD.GFCD_USE_AMT
 		             , OCD.ORD_DTL_NO
 		             , G1.GOODS_CD
-		             , CONCAT(B.BRAND_ENM, ' ', B.BRAND_KNM)                            AS BRAND_NM
+		             , CASE BG.DISP_NM_LANG WHEN 'EN' THEN BG.BRAND_GROUP_ENM
+		                                    ELSE BG.BRAND_GROUP_KNM
+		                END                                                             AS BRAND_NM
 		             , OD.SHOT_DELV_YN
 		             , G1.SELF_GOODS_YN
 		             , G1.GOODS_NM
@@ -1245,9 +1258,10 @@
 		            ON ODI.ITEM_CD = G2.GOODS_CD
 		         INNER JOIN TB_BRAND B
 		            ON G1.BRAND_CD = B.BRAND_CD
-		          LEFT OUTER JOIN TB_COLOR C
-		            ON C.COLOR_CD = IFNULL(NULLIF(ODI.OPT_CD1,'') , G1.MAIN_COLOR_CD)
-		           AND C.USE_YN = 'Y'
+		           AND B.USE_YN = 'Y'
+		         INNER JOIN TB_BRAND_GROUP BG
+		            ON B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		           AND BG.USE_YN = 'Y'
 		          LEFT OUTER JOIN TB_PAYMENT P
 		            ON P.ORD_CHG_SQ = OC.ORD_CHG_SQ
 		           AND P.PAY_GB = 'D'

+ 141 - 102
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -929,111 +929,150 @@
 		ORDER BY PD.DISP_ORD 
 	</select>
 	
-	<!-- 기획전 상세 상품 목록 -->
+	<!-- 기획전코너상품 목록 -->
 	<select id="getPlanningCornerGoodsList" parameterType="Plan" resultType="Plan">
 		/* TsfPlanning.getPlanningCornerGoodsList */
 		SELECT Z.*
-		      ,100 - ROUND((Z.CURR_PRICE / Z.LIST_PRICE) * 100 ,0) AS DC_RATE 
-		FROM
-		(
-		WITH TAB_PLAN_GOODS AS (
-		    SELECT P.PLAN_SQ                                                /*기획전번호*/
-		         , PD.CORNER_NM                                             /*코너명*/
-		         , PG.DISP_ORD                                              /*상품노출순서*/
-		         , CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
-		                    BG.BRAND_GROUP_ENM
-		                ELSE
-		                    BG.BRAND_GROUP_KNM
-		           END                                    AS BRAND_GROUP_NM /*브랜드그룹명*/
-		         , G.GOODS_CD                                               /*상품코드*/
-		         , G.GOODS_NM                                               /*상품명*/
-		         , G.GOODS_GB                                               /*상품구분*/
-		         , G.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
-		         , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
-		         , G.ORDER_MADE_YN                                          /*주문제작여부*/
-		         , G.GOODS_TNM                                              /*상품타이틀명*/
-		         , G.MAIN_COLOR_CD                                          /*대표색상코드*/
-		         , G.LIST_PRICE                                             /*정상가(최초판매가)*/
-		         , G.CURR_PRICE                                             /*현재판매가*/
-		         , RANK() OVER(PARTITION BY P.PLAN_SQ
-		                       ORDER BY PG.DISP_ORD
-		                              , PG.GOODS_CD)      AS NUMB
-		    FROM   TB_PLAN P
-		         , TB_PLAN_DETAIL PD
-		         , TB_PLAN_GOODS PG
-		         , TB_GOODS G
-		         , TB_GOODS_STOCK GS
-		         , TB_BRAND B
-		         , TB_BRAND_GROUP BG
-		    WHERE  P.PLAN_SQ = PD.PLAN_SQ
-		    AND    PD.PLAN_DTL_SQ = PG.PLAN_DTL_SQ
-		    AND    PG.GOODS_CD = G.GOODS_CD
-		    AND    G.GOODS_CD = GS.GOODS_CD
-		    AND    G.BRAND_CD = B.BRAND_CD
-		    AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
-		    AND    P.PLAN_SQ = #{planSq}
-		    -- AND    P.PLAN_GB = 'P' /*기획전*/
-		    AND    P.SITE_CD = #{siteCd}
-		    <if test="frontGb != null and frontGb != ''">
-		    AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
-		    </if>
-		    AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
-		    AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
-		    AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
-		    AND    NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT
-		    AND    PD.DISP_YN = 'Y' /*전시하는코너*/
-		    AND    PG.DEL_YN = 'N' /*삭제안된상품*/
-		    AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
-		    AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
-		    AND    GS.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
-		    AND    B.USE_YN = 'Y'
-		    AND    BG.USE_YN = 'Y'
-		    AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT
-		)
-		, TAB_GOODS_IMG AS (
-		    /* 상품의 이미지 */
-		    SELECT PG.GOODS_CD
-		         , MAX(CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END)   AS SYS_IMG_NM
-		         , MAX(CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END) AS SYS_IMG_NM2
-		    FROM   TAB_PLAN_GOODS PG
-		         , TB_GOODS_IMG GI
-		    WHERE  PG.GOODS_CD = GI.GOODS_CD
-		    AND    PG.MAIN_COLOR_CD = GI.COLOR_CD
-		    AND    (GI.DEFAULT_IMG_YN = 'Y' OR GI.MOUSEOVER_IMG_YN = 'Y')
-		    GROUP  BY PG.GOODS_CD
-		)
-		SELECT PG.PLAN_SQ
-		     , PG.CORNER_NM
-		     , PG.DISP_ORD
-		     , PG.BRAND_GROUP_NM
-		     , PG.GOODS_CD
-		     , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
-		     , PG.GOODS_NM
-		     , PG.GOODS_TNM
-		     , PG.MAIN_COLOR_CD
-		     , PG.LIST_PRICE
-		     , FN_GET_BENEFIT_PRICE(#{frontGb},PG.GOODS_CD,PG.CURR_PRICE,#{custGb})                              AS CURR_PRICE    /*현재판매가*/
-		     , GI.SYS_IMG_NM
-		     , GI.SYS_IMG_NM2
-		     <choose>
-		         <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
-		     , IF(W.GOODS_CD IS NULL,'','likeit')                                                                AS LIKE_IT       /*위시리스트담긴상품*/
-		         </when>
-		         <otherwise>
-		     , ''                                                                                                AS LIKE_IT       /*위시리스트담긴상품*/
-		         </otherwise>
-		     </choose>
-		     
-		FROM   TAB_PLAN_GOODS PG
-		INNER JOIN TAB_GOODS_IMG GI ON PG.GOODS_CD = GI.GOODS_CD
-		<if test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
-		LEFT OUTER JOIN TB_WISHLIST W ON PG.GOODS_CD = W.GOODS_CD
-		                             AND W.CUST_NO = #{custNo}
-		</if>
-		<if test="maxRow != null and maxRow > 0">
-		WHERE  PG.NUMB <![CDATA[<=]]> #{maxRow}
-		</if>
-		)Z
+		     , 100 - ROUND((Z.CURR_PRICE / Z.LIST_PRICE) * 100 ,0) AS DC_RATE
+		FROM   (
+		        WITH TAB_PLAN_GOODS AS (
+		            SELECT P.PLAN_SQ                                                /*기획전번호*/
+		                 , PD.CORNER_NM                                             /*코너명*/
+		                 , PG.DISP_ORD                                              /*상품노출순서*/
+		                 , CASE WHEN BG.DISP_NM_LANG = 'EN' THEN
+		                            BG.BRAND_GROUP_ENM
+		                        ELSE
+		                            BG.BRAND_GROUP_KNM
+		                   END                                    AS BRAND_GROUP_NM /*브랜드그룹명*/
+		                 , G.GOODS_CD                                               /*상품코드*/
+		                 , G.GOODS_NM                                               /*상품명*/
+		                 , G.GOODS_GB                                               /*상품구분*/
+		                 , G.FOREIGN_BUY_YN                                         /*해외구매대행여부*/
+		                 , G.PARALLEL_IMPORT_YN                                     /*병행수입여부*/
+		                 , G.ORDER_MADE_YN                                          /*주문제작여부*/
+		                 , G.GOODS_TNM                                              /*상품타이틀명*/
+		                 , G.MAIN_COLOR_CD                                          /*대표색상코드*/
+		                 , G.LIST_PRICE                                             /*정상가(최초판매가)*/
+		                 , G.CURR_PRICE                                             /*현재판매가*/
+		                 , RANK() OVER(PARTITION BY P.PLAN_SQ
+		                               ORDER BY PG.DISP_ORD
+		                                      , PG.GOODS_CD)      AS NUMB
+		            FROM   TB_PLAN P
+		                 , TB_PLAN_DETAIL PD
+		                 , TB_PLAN_GOODS PG
+		                 , TB_GOODS G
+		                 , TB_GOODS_STOCK GS
+		                 , TB_BRAND B
+		                 , TB_BRAND_GROUP BG
+		            WHERE  P.PLAN_SQ = PD.PLAN_SQ
+		            AND    PD.PLAN_DTL_SQ = PG.PLAN_DTL_SQ
+		            AND    PG.GOODS_CD = G.GOODS_CD
+		            AND    PG.GOODS_CD = GS.GOODS_CD
+		            AND    G.BRAND_CD = B.BRAND_CD
+		            AND    B.BRAND_GROUP_NO = BG.BRAND_GROUP_NO
+		            AND    P.PLAN_SQ = #{planSq}
+		            -- AND    P.PLAN_GB = 'P' /*기획전*/
+		            AND    P.SITE_CD = #{siteCd}
+		            <if test="frontGb != null and frontGb != ''">
+		            AND    P.FRONT_GB LIKE CONCAT('%',#{frontGb},'%')
+		            </if>
+		            AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT /*현재 전시되는 기획전*/
+		            AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
+		            AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
+		            AND    NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT /*현재 전시되는 코너*/
+		            AND    PD.DISP_YN = 'Y' /*전시하는코너*/
+		            AND    PG.DEL_YN = 'N' /*삭제안된상품*/
+		            AND    G.GOODS_STAT = 'G008_90' /*승인완료상품*/
+		            AND    G.SELF_MALL_YN = 'Y'   /*몰노출상품*/
+		            AND    NOW() BETWEEN G.SELL_STDT AND G.SELL_EDDT /*현재 판매되는 상품*/
+		            AND    GS.STOCK_QTY <![CDATA[>]]> 0 /*재고있는상품*/
+		            AND    B.USE_YN = 'Y' /*사용하는 브랜드*/
+		            AND    BG.USE_YN = 'Y' /*사용하는 브랜드그룹*/
+		        )
+		        , TAB_GOODS_IMG AS (
+		            /* 상품의 이미지 */
+		            SELECT PG.GOODS_CD
+		                 , MAX(CASE WHEN GI.DEFAULT_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END)   AS SYS_IMG_NM
+		                 , MAX(CASE WHEN GI.MOUSEOVER_IMG_YN = 'Y' THEN GI.SYS_IMG_NM ELSE NULL END) AS SYS_IMG_NM2
+		            FROM   TAB_PLAN_GOODS PG
+		                 , TB_GOODS_IMG GI
+		            WHERE  PG.GOODS_CD = GI.GOODS_CD
+		            AND    PG.MAIN_COLOR_CD = GI.COLOR_CD
+		            AND    (GI.DEFAULT_IMG_YN = 'Y' OR GI.MOUSEOVER_IMG_YN = 'Y')
+		            GROUP  BY PG.GOODS_CD
+		        )
+		        , TAB_COLORCHIP AS (
+		            /* 상품 컬러칩 */
+		            SELECT PG.GOODS_CD
+		                 , GROUP_CONCAT(DISTINCT CONCAT(C.COLOR_CD,':',CC.CD_DESC) ORDER BY CC.DISP_ORD SEPARATOR ',') AS COLOR_CHIPS
+		            FROM   TAB_PLAN_GOODS PG
+		                 , TB_OPTION O
+		                 , TB_COLOR C
+		                 , TB_COMMON_CODE CC
+		            WHERE  PG.GOODS_CD = O.GOODS_CD
+		            AND    O.OPT_CD1 = C.COLOR_CD
+		            AND    C.COLOR_GRP_CD = CC.CD
+		            AND    O.DISP_YN = 'Y'
+		            AND    C.USE_YN = 'Y'
+		            AND    CC.USE_YN = 'Y'
+		            GROUP  BY PG.GOODS_CD
+		        )
+		        , TAB_GOODS_BENEFIT AS (
+		            /* 상품혜택 */
+		            SELECT GOODS_CD
+		                 , GROUP_CONCAT(CONCAT(BENEFIT_GB,':',BENEFIT_NM) ORDER BY NUMB SEPARATOR ',') AS ICON
+		            FROM   (
+		                    SELECT PG.GOODS_CD
+		                         , GB.BENEFIT_GB
+		                         , CASE WHEN GB.BENEFIT_GB = '10' THEN '쿠폰할인'
+		                                WHEN GB.BENEFIT_GB = '20' THEN '무료배송'
+		                                WHEN GB.BENEFIT_GB = '30' THEN '사은품'
+		                                ELSE '신상'
+		                           END                               AS BENEFIT_NM
+		                         , RANK() OVER(PARTITION BY PG.GOODS_CD
+		                                       ORDER BY GB.BENEFIT_GB
+		                                              , GB.GOODS_CD) AS NUMB
+		                    FROM   TAB_PLAN_GOODS PG
+		                         , TB_GOODS_BENEFIT GB
+		                    WHERE  PG.GOODS_CD = GB.GOODS_CD
+		                   ) Z
+		            GROUP  BY GOODS_CD
+		        )
+		        SELECT PG.PLAN_SQ
+		             , PG.CORNER_NM
+		             , PG.DISP_ORD
+		             , PG.BRAND_GROUP_NM
+		             , PG.GOODS_CD
+		             , FN_GET_GOODS_NM(PG.GOODS_NM,PG.GOODS_GB,PG.FOREIGN_BUY_YN,PG.PARALLEL_IMPORT_YN,PG.ORDER_MADE_YN) AS GOODS_FULL_NM /*상품FULL명*/
+		             , PG.GOODS_NM
+		             , PG.GOODS_TNM
+		             , PG.MAIN_COLOR_CD
+		             , PG.LIST_PRICE
+		             , FN_GET_BENEFIT_PRICE(#{frontGb},PG.GOODS_CD,PG.CURR_PRICE,#{custGb})                              AS CURR_PRICE    /*현재판매가*/
+		             , GI.SYS_IMG_NM
+		             , GI.SYS_IMG_NM2
+		             , C.COLOR_CHIPS                                                                                                      /*컬러칩*/
+		             , GB.ICON                                                                                                            /*혜택아이콘*/
+		             <choose>
+		                 <when test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+		             , IF(W.GOODS_CD IS NULL,'','likeit')                                                                AS LIKE_IT       /*위시리스트담긴상품*/
+		                 </when>
+		                 <otherwise>
+		             , ''                                                                                                AS LIKE_IT       /*위시리스트담긴상품*/
+		                 </otherwise>
+		             </choose>
+		        FROM   TAB_PLAN_GOODS PG
+		        LEFT OUTER JOIN TAB_GOODS_IMG GI ON PG.GOODS_CD = GI.GOODS_CD
+		        LEFT OUTER JOIN TAB_COLORCHIP C ON PG.GOODS_CD = C.GOODS_CD
+		        LEFT OUTER JOIN TAB_GOODS_BENEFIT GB ON PG.GOODS_CD = GB.GOODS_CD
+		        <if test="custNo != null and custNo > 0"> <!-- 로그인 했으면 -->
+		        LEFT OUTER JOIN TB_WISHLIST W ON PG.GOODS_CD = W.GOODS_CD
+		                                     AND W.CUST_NO = #{custNo}
+		        </if>
+		        <if test="maxRow != null and maxRow > 0">
+		        WHERE  PG.NUMB <![CDATA[<=]]> #{maxRow}
+		        </if>
+		       ) Z
 	</select>
 	
 	<!-- 총알배송 html 소스  -->

+ 29 - 15
src/main/webapp/WEB-INF/views/mob/mypage/MypageCustModifyFormMob.html

@@ -216,8 +216,9 @@
 	let authMethod = [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
 
 	let orgCustInfo;
-	let orgAccountInfo;
 	let accountCheck = false;
+	let orgBankCd;
+	let orgAccountNo;
 
 	// 고객정보
 	var fnGetCustInfo = function () {
@@ -247,8 +248,6 @@
 		fnDisplayEmailAgree(custInfo.emailAgreeYn);
 		fnDisplaySmsAgree(custInfo.smsAgreeYn);
 
-		// 회원(고객) 계좌 조회
-		fnGetCustAccountInfo();
 	}
 
 	// 이메일 수신동의
@@ -283,8 +282,8 @@
 		orgAccountInfo = {};
 		var $accountNm = $('#custModiFyForm input[name=accountNm]');
 		if (!gagajf.isNull(result)) {
-			orgAccountInfo.accountNo = result.accountNo;
-			orgAccountInfo.bankCd = result.bankCd;
+			orgAccountNo = result.accountNo;
+			orgBankCd = result.bankCd;
 			//1. 고객명과 환불계좌 예금주가 다른 경우 현재 고객명을 적어주고 계좌번호, 은행코드 초기화 처리
 			let $bankCd = '';
 			if ($accountNm.val() === result.accountNm) {
@@ -298,8 +297,8 @@
 			}
 			$($bankCd).trigger('click'); // 셀렉트 박스 트리거
 		} else {
-			orgAccountInfo.accountNo = '';
-			orgAccountInfo.bankCd ='';
+			orgAccountNo = '';
+			orgBankCd ='';
 		}
 	}
 
@@ -371,6 +370,17 @@
 					$('#custModiFyForm input[name=email]').focus();
 				}
 			});
+			return;
+		}
+
+		if (!fnCheckValidationEmail(custModiFy.email)) {
+			mcxDialog.alertC('이메일 형식에 맞게 입력해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custModiFyForm input[name=email]').focus();
+				}
+			});
+			return;
 		}
 
 		if (orgCustInfo.email !== custModiFy.email) {
@@ -383,11 +393,11 @@
 
 
 		// 은행코드가 바꼈는지
-		if (orgAccountInfo.bankCd !== $bankCd.val()) {
+		if (orgBankCd !== $bankCd.val()) {
 			accountModifyYn = 'Y';
 		}
 
-		if (orgAccountInfo.accountNo !== $accountNo.val()) {
+		if (orgAccountNo !== $accountNo.val()) {
 			accountModifyYn = 'Y';
 		}
 
@@ -434,12 +444,18 @@
 
 	// 수정 콜백
 	var fnSaveCustomerInfoCallback = function (result) {
+		accountCheck = false;
 		if (result.isSuccess) {
 			mcxDialog.alert("회원정보가 수정되었습니다.");
 			fnGetCustInfo();
+			fnGetCustAccountInfo();
 			return;
 		} else {
-			mcxDialog.alert("실패하였습니다.<br/>고객센터에 문의하시 바랍니다.");
+			let msg = '실패하였습니다.<br/>고객센터에 문의하시 바랍니다.'
+			if (result.resultType === 'INVALID_ACCOUNT') {
+				msg = '환불 계좌정보를 다시 확인하시고 계좌인증을 해주세요.'
+			}
+			mcxDialog.alert(msg);
 			return;
 		}
 	}
@@ -500,11 +516,6 @@
 		cfnOpenCellphoneCertify(_PAGE_MYPAGE_CUSTOMER_MODIFY+'?confirmYn=Y');
 	});
 
-	$(".btn_back").on("click", function () {
-		console.log("here");
-		cfnGoToPage(_PAGE_MYPAGE_CUSTOMER);
-	});
-
 	$(document).ready(function(){
 		if (!gagajf.isNull(sEncData)) {
 			fnNiceCallBack(sEncData, authMethod);
@@ -515,6 +526,9 @@
 		// 회원(고객) 조회
 		fnGetCustInfo();
 
+		// 회원(고객) 계좌 조회
+		fnGetCustAccountInfo();
+
 		//버튼 색
 		$(document).on('click','.popup_box .button_list button',function(){
 			$('.popup_box .button_list button').removeClass('on');

+ 76 - 76
src/main/webapp/WEB-INF/views/mob/mypage/MypageCustPwdModifyFormMob.html

@@ -17,90 +17,90 @@
 <style>
 	.hide{display: none;}
 </style>
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header htop">
-				<h5 class="modal-title" id="passwordChangeLabel">비밀번호 변경</h5>
-			</div>
-			<div class="modal-body">
-				<div class="pop_cont">
-					<div class="pass_confirm">
-						<form id="pwdModifyForm" class="form_wrap">
-							<input type="hidden" name="custId" th:value="${custId}"/>
-							<div class="form_field">
-								<label class="input_label sr-only">기존 비밀번호를 입력해주세요.</label>
-								<div class="ui_col_12">
-									<input type="password" id="orgPasswd" name="orgPasswd" placeholder="기존 비밀번호를 입력해주세요." class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="기존 비밀번호"/>
-								</div>
+<div class="modal-dialog" role="document">
+	<div class="modal-content">
+		<div class="modal-header htop">
+			<h5 class="modal-title" id="passwordChangeLabel">비밀번호 변경</h5>
+		</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<div class="pass_confirm">
+					<form id="pwdModifyForm" class="form_wrap">
+						<input type="hidden" name="custId" th:value="${custId}"/>
+						<div class="form_field">
+							<label class="input_label sr-only">기존 비밀번호를 입력해주세요.</label>
+							<div class="ui_col_12">
+								<input type="password" id="orgPasswd" name="orgPasswd" placeholder="기존 비밀번호를 입력해주세요." class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="기존 비밀번호"/>
 							</div>
-							<div class="form_field">
-								<label class="input_label sr-only">신규 비밀번호를 입력해주세요.</label>
-								<div class="ui_col_12">
-									<input type="password" id="passwd" name="passwd" placeholder="신규 비밀번호를 입력해주세요.(8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="신규 비밀번호"/>
-									<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
-									<div class="help_block">
-										<!-- 사용불가 비밀번호일경우 -->
-										<p class="mt10">
-											<span id="firstFailed" class="c_gray">
-												<i class="ico ico_check gray mr5"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br>
-											</span>
-											<span id="secondFailed" class="c_gray">
-												<i class="ico ico_check gray mr5"></i>4개이상연속되거나 동일한 문자, 숫자 제외<br>
-											</span>
-											<span id="thirdFailed" class="c_gray">
-												<i class="ico ico_check gray mr5"></i>아이디제외
-											</span>
-										</p>
-										<!-- //사용불가 비밀번호일경우 -->
-										<!-- 사용가능한 비밀번호일경우 -->
-										<p id="avlPwd" class="mt10 hide">
-											<span class="c_black2">
-												<i class="ico ico_check black mr5"></i>사용 가능한 비밀번호입니다.
-											</span>
-										</p>
-										<!-- //사용가능한 비밀번호일경우 -->
-									</div>
-									<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+						</div>
+						<div class="form_field">
+							<label class="input_label sr-only">신규 비밀번호를 입력해주세요.</label>
+							<div class="ui_col_12">
+								<input type="password" id="passwd" name="passwd" placeholder="신규 비밀번호를 입력해주세요.(8~20자 영문, 숫자, 특수문자 중 2가지 이상 조합)" class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="신규 비밀번호"/>
+								<!-- case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
+								<div class="help_block">
+									<!-- 사용불가 비밀번호일경우 -->
+									<p class="mt10">
+										<span id="firstFailed" class="c_gray">
+											<i class="ico ico_check gray mr5"></i>영문(대/소문자), 숫자, 특수문자 중 2가지 이상 조합(8~20자)<br>
+										</span>
+										<span id="secondFailed" class="c_gray">
+											<i class="ico ico_check gray mr5"></i>4개이상연속되거나 동일한 문자, 숫자 제외<br>
+										</span>
+										<span id="thirdFailed" class="c_gray">
+											<i class="ico ico_check gray mr5"></i>아이디제외
+										</span>
+									</p>
+									<!-- //사용불가 비밀번호일경우 -->
+									<!-- 사용가능한 비밀번호일경우 -->
+									<p id="avlPwd" class="mt10 hide">
+										<span class="c_black2">
+											<i class="ico ico_check black mr5"></i>사용 가능한 비밀번호입니다.
+										</span>
+									</p>
+									<!-- //사용가능한 비밀번호일경우 -->
 								</div>
+								<!-- //case (사용불가 비밀번호일경우,사용가능한 비밀번호일경우) -->
 							</div>
-							<div class="form_field">
-								<label class="input_label sr-only">신규 비밀번호를 다시 입력해주세요.</label>
-								<div class="ui_col_12">
-									<input type="password" id="confirmPassword" name="confirmPassword" placeholder="신규 비밀번호를 다시 입력해주세요." class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="신규 비밀번호 확인"/>
-									<div class="help_block">
-										<!-- 비밀번호확인 틀렸을경우 -->
-										<p id="misPwd" class="hide">
-											<span class="t_err">
-												새 비밀번호가 일치하지 않습니다.
-											</span>
-										</p>
-										<!-- //비밀번호확인 틀렸을경우 -->
-										<!-- 비밀번호 일치할경우 -->
-										<p id="avlConPwd" class=" hide">
-											<span class="c_black2">
-												<i class="ico ico_check black mr5"></i>새 비밀번호가 일치합니다.
-											</span>
-										</p>
-										<!-- //비밀번호 일치할경우 -->
-									</div>
+						</div>
+						<div class="form_field">
+							<label class="input_label sr-only">신규 비밀번호를 다시 입력해주세요.</label>
+							<div class="ui_col_12">
+								<input type="password" id="confirmPassword" name="confirmPassword" placeholder="신규 비밀번호를 다시 입력해주세요." class="form_control" minlength="8" maxlength="20" required="required" data-valid-name="신규 비밀번호 확인"/>
+								<div class="help_block">
+									<!-- 비밀번호확인 틀렸을경우 -->
+									<p id="misPwd" class="hide">
+										<span class="t_err">
+											새 비밀번호가 일치하지 않습니다.
+										</span>
+									</p>
+									<!-- //비밀번호확인 틀렸을경우 -->
+									<!-- 비밀번호 일치할경우 -->
+									<p id="avlConPwd" class=" hide">
+										<span class="c_black2">
+											<i class="ico ico_check black mr5"></i>새 비밀번호가 일치합니다.
+										</span>
+									</p>
+									<!-- //비밀번호 일치할경우 -->
 								</div>
 							</div>
-							<div class="btn_group_flex">
-								<div>
-									<button type="button" id="btnClose" class="btn btn_default"><span>취소</span></button>
-								</div>
-								<div>
-									<button type="button" id="btnSavePassword" class="btn btn_dark"><span>변경</span></button> <!-- 210409_추가 : btn_password_confirm id 추가 -->
-								</div>
+						</div>
+						<div class="btn_group_flex">
+							<div>
+								<button type="button" id="btnClose" class="btn btn_default"><span>취소</span></button>
+							</div>
+							<div>
+								<button type="button" id="btnSavePassword" class="btn btn_dark"><span>변경</span></button> <!-- 210409_추가 : btn_password_confirm id 추가 -->
 							</div>
-						</form>
-					</div>
+						</div>
+					</form>
 				</div>
 			</div>
-			<div class="modal-footer" style="display:none;"></div>
 		</div>
+		<div class="modal-footer" style="display:none;"></div>
 	</div>
-	<a href="#close-modal" rel="modal:close" id="passwordPop_close" class="close-modal">Close</a>
+</div>
+<a href="#close-modal" rel="modal:close" id="passwordPop_close" class="close-modal">Close</a>
 
 <script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
 <script th:inline="javascript">
@@ -282,7 +282,7 @@
 
 		checkPwd = '';
 		checkConfirmPwd = '';
-		$('.form_control').val('');
+		$('#pwdModifyForm .form_control').val('');
 	}
 
 	$(document).ready(function() {
@@ -292,4 +292,4 @@
 
 	/*]]>*/
 </script>
-</html>
+</html>

+ 5 - 1
src/main/webapp/WEB-INF/views/mob/mypage/MypageOrderListInfoMob.html

@@ -247,7 +247,11 @@
 								
 								<!-- 배송지등록후(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중) -->
 								<th:block th:if="${ordDtl.ordDtlStat} == 'G013_10' or ${ordDtl.ordDtlStat} == 'G013_20' or ${ordDtl.ordDtlStat} == 'G013_30' or ${ordDtl.ordDtlStat} == 'G013_35'">
-									<div><button type="button" class="btn btn_default btn_cncl_complete"><span>주문 취소</span></button></div>
+									<div>
+										<button type="button" class="btn btn_default btn_cncl_complete" th:ordNo="${ordDtl.ordNo}" th:ordDtlNo="${ordDtl.ordDtlNo}" th:ordCanChgQty="${ordDtl.ordCanChgQty}" th:delvFeeCd="${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'cancel');">
+											<span>주문 취소</span>
+										</button>
+									</div>
 								</th:block>
 								<!-- //배송지등록후(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중) -->
 								

+ 3 - 3
src/main/webapp/WEB-INF/views/mob/order/OrderDeliveryAddrInfoMob.html

@@ -116,8 +116,8 @@
 <!-- //배송지정보 -->
 
 <script th:inline="javascript">
-var dispYn = [[${order.dispYn}]]; // 노출여부
-var delvMemo = [[${deliveryAddrInfo.delvMemo}]]; // 노출여부
+var dispYn 		= [[${order.dispYn}]]; // 노출여부
+var delvMemo 	= [[${deliveryAddrInfo.delvMemo}]]; // 노출여부
 
 //화면노출
 var deliveryAddrInfoDispYn = function(temp) {
@@ -133,7 +133,7 @@ var deliveryAddrInfoDispYn = function(temp) {
 //컨텐츠 호출
 $(document).ready( function() {
 	// 화면펼침
-	deliveryAddrInfoDispYn(dispYn);
+	deliveryAddrInfoDispYn("Y");
 	
 	var delvMemoArr = ["문 앞", "직접 받고 부재 시 문 앞", "경비실", "택배함"];
 	var tempMemo = true;

+ 58 - 5
src/main/webapp/WEB-INF/views/mob/order/OrderFormMob.html

@@ -816,6 +816,17 @@ var freegiftInfoSet = function() {
 				$("#freegiftInfo").html(result);
 				var total_gift 		= 0;
 				var total_deduct 	= 0;
+				
+				// 2021.04.29 무료사은품 기본선택
+				$("#orderForm .freegiftRdo").each(function(index) {
+					var usepoint = parseInt($(this).attr("usepoint"));
+					var usepoint = parseInt($(this).attr("count"));
+					
+					// 첫번째 무료 선택 
+					if (usepoint == 0 && count == 1) {
+						$(this).trigger("click");
+					}
+				});
 
 				// 2.2 사은품선택 라디오 버튼 기능
 				$("#orderForm .freegiftRdo").on("click", function() {
@@ -852,6 +863,17 @@ var freegiftInfoSet = function() {
 					pntDcAmtReset();
 				});
 				
+				// 2021.04.29 무료사은품 기본선택
+				$("#orderForm .freegiftRdo").each(function(){
+					var usepoint 	= parseInt($(this).attr("usepoint"));
+					var count 		= parseInt($(this).attr("count"));
+					
+					// 첫번째 무료 선택 
+					if (usepoint == 0 && count == 1) {
+						$(this).trigger("click");
+					}
+				});
+
 				total_gift = 0;
 				
 				// 사은품테이블 그리기
@@ -867,6 +889,13 @@ var freegiftInfoSet = function() {
 						$("#orderForm .total_gift").text(total_gift);						// 사은품총선택개수
 					});
 				});
+				
+				// 2021.04.29 사은품동의 체크 기능
+				$("#orderForm #chk-agree_gift").on("click", function(){
+					if ($(this).is(":checked") == false) {
+						mcxDialog.alert("미동의시 사은품 지급이 되지 않습니다.");
+					}
+				});
 			}
 			
 			// 1.8 결제타입로드
@@ -982,6 +1011,15 @@ var paymentInfoSet = function() {
 							
 							orgEntryNo = $("#orderForm input[name=entryNo]").val();
 							
+							if (orgEntryNo.substr(0,1) != "P") {
+								mcxDialog.alert("개인통관고유부호가 유효하지 않습니다.");
+								$('#orderForm input[name=entryNo]').focus();
+								
+								// 배송정보화면노출
+								deliveryAddrInfoDispYn("Y");
+								return false;
+							}
+							
 							if (orgEntryNo.length < 13) {
 								mcxDialog.alert("개인통관고유부호가 유효하지 않습니다.");
 								$('#orderForm input[name=entryNo]').focus();
@@ -1004,7 +1042,7 @@ var paymentInfoSet = function() {
 					// 주문제작상품일때 주문제작정보동의
 					if (orderMadeYn == "Y") {
 						if (!$("#orderForm #chk-custom-agr1").is(":checked")) {
-							mcxDialog.alert("주문제작상품 정보 동의를 체크해주세요.");
+							mcxDialog.alert("주문제작상품에 대한 동의를 하지 않으실 경우 해당 상품을 쇼핑백에서 제외하신 후 다시 결제를 시도해주세요.");
 							
 							// 배송정보화면노출
 							madeInfoDispYn("Y");
@@ -1013,6 +1051,7 @@ var paymentInfoSet = function() {
 					}
 					
 					// 사은품지급할 경우 체크
+					/*
 					if ($("#orderAmtForm .freegiftValArr").text().length > 0) {
 						if (!$("#orderForm #chk-agree_gift").is(":checked")) {
 							mcxDialog.alert("사은품 지급 정보 동의를 체크해주세요.");
@@ -1022,6 +1061,7 @@ var paymentInfoSet = function() {
 							return false;
 						}
 					}
+					*/
 					
 					// 결재수단
 					if (gagajf.isNull(paynormal)) {
@@ -1106,6 +1146,19 @@ var paymentInfoSet = function() {
 						delvFeeCdList.push(delvFeeCdData);
 					});
 					
+					// 2021.04.29 상픈품 체크박스 미동의시 사은품 미지급
+					var freegiftValArr 			= $("#orderAmtForm .freegiftValArr").text().split(",");
+					var freegiftSqArr 			= $("#orderAmtForm .freegiftSqArr").text().split(",");
+					var freegiftGoodsArr 		= $("#orderAmtForm .freegiftGoodsArr").text().split(",");
+					var freegiftUsePointArr 	= $("#orderAmtForm .freegiftUsePointArr").text().split(",");
+					
+					if (!$("#orderForm #chk-agree_gift").is(":checked") == false) {
+						freegiftValArr 			= "";
+						freegiftSqArr 			= "";
+						freegiftGoodsArr 		= "";
+						freegiftUsePointArr 	= "";
+					}
+					
 					// 주문데이타 생성
 					var orderData = {
 						"custNm"				: $("#orderAmtForm .custNm").text()
@@ -1131,10 +1184,10 @@ var paymentInfoSet = function() {
 						,"ordPhnno"				: $("#orderAmtForm .cellPhnno").text()
 						,"goodsNm"				: $("#orderAmtForm .goodsNm").eq(0).text()
 						,"ordGoodsQty"			: ordGoodsQty
-						,"freegiftValArr"		: $("#orderAmtForm .freegiftValArr").text().split(",")
-						,"freegiftSqArr"		: $("#orderAmtForm .freegiftSqArr").text().split(",")
-						,"freegiftGoodsArr"		: $("#orderAmtForm .freegiftGoodsArr").text().split(",")
-						,"freegiftUsePointArr"	: $("#orderAmtForm .freegiftUsePointArr").text().split(",")
+						,"freegiftValArr"		: freegiftValArr
+						,"freegiftSqArr"		: freegiftSqArr
+						,"freegiftGoodsArr"		: freegiftGoodsArr
+						,"freegiftUsePointArr"	: freegiftUsePointArr
 						,"giftMsg"				: giftMsg
 					};
 					

+ 3 - 3
src/main/webapp/WEB-INF/views/mob/order/OrderFreegiftInfoMob.html

@@ -79,7 +79,7 @@
 									<th:block th:each="freegiftGoods, k : ${freegiftGoodsList}">
 										<th:block th:if="${freegift.freegiftSq} == ${freegiftGoods.freegiftSq}">
 											<div class="gift">
-												<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}" allYn="N">
+												<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}" allYn="N" th:count="${i.count}">
 												<label th:for="'rdi-gift'+${i.count}+${k.count}">
 													<span class="thumb"><img src="/images/pc/thumb/tmp_gift1.jpg" width="" alt=""></span>
 													<span class="name" th:text="${freegiftGoods.goodsNm}"></span> 
@@ -90,7 +90,7 @@
 										</th:block>
 									</th:block>
 									<div class="gift">
-										<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N" checked> 
+										<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N" count="100"> 
 										<label th:for="${i.count}+'0'">
 											<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width="" alt=""></span>
 											<span class="name">사은품 수령안함</span> <span class="deduct">수령거부</span>
@@ -105,7 +105,7 @@
 					<div class="form_field">
 						<div class="agree_gift">
 							<p>
-								<input id="chk-agree_gift" type="checkbox">
+								<input id="chk-agree_gift" type="checkbox" checked>
 								<label for="chk-agree_gift"><span>동의합니다</span></label>
 							</p>
 							<p class="txt">사은품 지금에 대한 내용을 확인하였으며, 이에 동의합니다.</p>

+ 2 - 4
src/main/webapp/WEB-INF/views/web/cart/CartAddGoodsPopupWeb.html → src/main/webapp/WEB-INF/views/web/cart/CartDelvFeeSaveGoodsPopupWeb.html

@@ -1,6 +1,6 @@
 <html lang="ko"
 	  xmlns:th="http://www.thymeleaf.org">
-<!-- 배송비 SAVE 상품보기, 다다익선 할인 상품 보기 -->
+<!-- 배송비 SAVE 상품보기 -->
 	<div class="modal-dialog" role="document" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
 		<div class="modal-content"><div class="modal-header">
 			<h5 class="modal-title" id="dlvrSaveLabel">배송비 SAVE 상품</h5>
@@ -27,8 +27,6 @@
 													</th:block>
 												</p>
 											</a>
-											<input type="text" th:value="${goods.goodsCd}">
-											<input type="text" th:value="${goods.optCd}">
 											<button type="button" class="btn btn_default btn_sm" th:onclick="fnAddCartDelvFeeSaveGoods([[${goods.goodsCd}]], [[${goods.optCd}]])"><span>쇼핑백 담기</span></button>
 										</div>
 									</div>
@@ -59,7 +57,7 @@
 		</div>
 	</div>
 	<a href="#close-modal" rel="modal:close" id="dlvrSavePop_close" class="close-modal">Close</a>
-	<!-- // 배송비 SAVE 상품보기, 다다익선 할인 상품 보기 -->
+	<!-- // 배송비 SAVE 상품보기 -->
 
 <script th:inline="javascript">
 	$(document).ready(function() {

+ 6 - 3
src/main/webapp/WEB-INF/views/web/cart/CartListAjaxFormWeb.html

@@ -94,6 +94,7 @@
 										<input type="hidden" name="soldoutYn" th:value="${cart.soldoutYn}" />
 										<input type="hidden" name="ordCanYn" th:value="${cart.ordCanYn}" />
 										<input type="hidden" name="cartSq" th:value="${cart.cartSq}" />
+										<input type="hidden" name="goodsCd" th:value="${cart.goodsCd}" />
 
 										<div class="order_desc">
 											<div class="form_box">
@@ -141,7 +142,7 @@
 												<div class="gd_exinfo">
 													<p th:if="${!#strings.isEmpty(cart.delvResDt)}"><span class="tag primary_line">총알배송</span><span th:text="|${cart.delvResDt} 배송예정|"></span></p>
 													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
+													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="javascript:void(0);" onclick="fnGetTmtbSalesGoods(this);" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 													<p th:if="${cart.soldoutYn.equals('Y') and cart.ordCanYn.equals('Y')}">품절된 상품입니다.</p>
 													<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 													<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y') and cart.goodsQty < cart.minOrdQty}" th:text="|해당 상품은 최소 ${cart.minOrdQty}개부터 구매 가능합니다.|"></p>
@@ -209,6 +210,7 @@
 										<input type="hidden" name="soldoutYn" th:value="${cart.soldoutYn}" />
 										<input type="hidden" name="ordCanYn" th:value="${cart.ordCanYn}" />
 										<input type="hidden" name="cartSq" th:value="${cart.cartSq}" />
+										<input type="hidden" name="goodsCd" th:value="${cart.goodsCd}" />
 
 										<div class="order_desc">
 											<div class="form_box">
@@ -249,7 +251,7 @@
 													<div class="gd_exinfo">
 														<p th:if="${!#strings.isEmpty(cart.delvResDt)}" th:text="|${cart.delvResDt} 배송예정|"></p>
 														<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-														<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
+														<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="javascript:void(0);" onclick="fnGetTmtbSalesGoods(this);" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 														<p th:if="${cart.soldoutYn.equals('Y') and cart.ordCanYn.equals('Y')}">품절된 상품입니다.</p>
 														<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 														<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y') and cart.goodsQty < cart.minOrdQty}" th:text="|해당 상품은 최소 ${cart.minOrdQty}개부터 구매 가능합니다.|"></p>
@@ -328,6 +330,7 @@
 										<input type="hidden" name="ordCanYn" th:value="${cart.ordCanYn}" />
 										<input type="hidden" name="tmtbDcAmt" th:value="${cart.tmtbDcAmt}" />
 										<input type="hidden" name="cartSq" th:value="${cart.cartSq}" />
+										<input type="hidden" name="goodsCd" th:value="${cart.goodsCd}" />
 
 										<div class="order_desc">
 											<div class="form_box">
@@ -367,7 +370,7 @@
 												<div class="gd_exinfo">
 													<p th:if="${!#strings.isEmpty(cart.delvResDt)}" th:text="|${cart.delvResDt} 배송예정|"></p>
 													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'Y') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'Y')}" class="applyTmtb"><span class="tag primary">SALE</span>다다익선 할인 적용</p>
-													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
+													<p th:if="${(cart.qtyTmtbSq > 0 and cart.applyQtySectionYn == 'N') or (cart.amtTmtbSq > 0 and cart.applyAmtSectionYn == 'N')}" class="notApplyTmtb"><a href="javascript:void(0);" onclick="fnGetTmtbSalesGoods(this);" class="btn_moresale"><span class="tag primary">SALE</span>다다익선 상품보기</a></p>
 													<p th:if="${cart.soldoutYn.equals('Y') and cart.ordCanYn.equals('Y')}">품절된 상품입니다.</p>
 													<p th:if="${cart.ordCanYn.equals('N')}">해당 상품은 구매 불가능한 상품입니다.</p>
 													<p th:if="${cart.soldoutYn.equals('N') and cart.ordCanYn.equals('Y') and cart.goodsQty < cart.minOrdQty}" th:text="|해당 상품은 최소 ${cart.minOrdQty}개부터 구매 가능합니다.|"></p>

+ 37 - 7
src/main/webapp/WEB-INF/views/web/cart/CartListFormWeb.html

@@ -260,6 +260,8 @@
 	<!-- 장바구니 배송비 SAVE 상품보기 팝업 -->
 	<div class="modal fade dlvrSave_pop" id="dlvrSavePop" tabindex="-1" role="dialog" aria-labelledby="dlvrSaveLabel" aria-hidden="true" style="display:none;"></div>
 
+	<div class="modal fade moresale_pop" id="moresalePop" tabindex="-1" role="dialog" aria-labelledby="moresaleLabel" aria-hidden="true" style="display:none;"></div>
+
 <script src="/ux/pc/js/swiper.min.js"></script>
 <link rel="stylesheet" type="text/css" href="/ux/pc/css/swiper.min.css" />
 
@@ -301,18 +303,46 @@
 	});
 
 	//팝업 - 다다익선 상품보기
-	$(document).on('click','#btn_moresale_pop',function(e){
-		$("#moresalePop .modal-content").load("popup_moresale.html");
-		// $("#moresalePop").modal("show");
-		return false;
-	});
+	function fnGetTmtbSalesGoods(obj) {
+		// 파라미터
+		let tmtbSqList = new Array();
+		let param = new Object();
+
+		// 다다익선 정보
+		let qtyTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
+		let amtTmtbSq = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=qtyTmtbSq]").val();
+		let qtyTmtbYn = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=applyQtySectionYn]").val();
+		let amtTmtbYn = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=applyAmtSectionYn]").val();
+		let goodsCd = $(obj).parent().parent().parent().parent().parent().parent().find("input[name=goodsCd]").val();
+
+		if(qtyTmtbYn == "N") {tmtbSqList.push(Number(qtyTmtbSq));}
+		if(amtTmtbYn == "N") {tmtbSqList.push(Number(amtTmtbSq));}
+		if(tmtbSqList.length < 1) {mcxDialog.alert("적용가능한 다다익선이 없습니다."); return false;}
+
+		let tmtb = JSON.stringify({goodsCd : goodsCd, arrTmtbSq : tmtbSqList});
+
+		$.ajax( {
+			type		: "POST",
+			url 		: '/cart/tmtb/sales/goods/list',
+			data		: tmtb,
+			dataType 	: 'html',
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			success 	: function(result) {
+				$("#moresalePop").html(result);
+			}
+		});
+	}
 	$("#moresalePop_close").click(function() {
-		$("#moresalePop > #dlvrSavePop").modal("hide");
+		$("#moresalePop").modal("hide");
 	});
 
 	//팝업 - 배송비 SAVE 상품보기
 	function fnGetDelvFeeSaveGoods(delvFeeCd, delvFeeSaveGoodsAmt) {
-		var param = new Object();
+		let param = new Object();
 		param.delvFeeCd = delvFeeCd;
 		param.delvFeeSaveGoodsAmt = delvFeeSaveGoodsAmt;
 

+ 109 - 0
src/main/webapp/WEB-INF/views/web/cart/CartTmtbSalesGoodsPopupWeb.html

@@ -0,0 +1,109 @@
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!-- 다다익선 할인 상품 보기 -->
+<div class="modal-dialog" role="document" th:with="imgGoodsUrl=${@environment.getProperty('upload.goods.view')}, uxImgUrl=${@environment.getProperty('domain.uximage')}, imgUrl=${@environment.getProperty('upload.image.view')}">
+	<div class="modal-content"><div class="modal-header">
+		<h5 class="modal-title" id="moresaleLabel">다다익선 상품</h5>
+	</div>
+		<div class="modal-body">
+			<div class="pop_cont">
+				<div class="area_benefit">
+					<span class="tag primary">SALE</span>
+					<p>
+						<span th:each="desc, index : ${tmtbDcDescList}" th:text="${desc}"></span>
+					</p>
+				</div>
+				<!-- -->
+				<div class="area_slider">
+					<div class="swiper-container swiper-container-initialized swiper-container-horizontal">
+						<div class="swiper-wrapper" style="transform: translate3d(0px, 0px, 0px);">
+
+							<div th:each="goods, status : ${goodsList}" class="swiper-slide swiper-slide-active" style="width: 150px; margin-right: 20px;">
+								<div class="item_prod">
+									<div class="item_state">
+										<a href="#none" class="itemLink">
+											<div class="itemPic">
+												<img class="vLHTC pd_img" th:src="${imgGoodsUrl} + '/' + ${goods.sysImgNm} + '?RS=150'" src="/" width="100%" th:onerror="'this.src=\''+@{${uxImgUrl}+ '/images/pc/thumb/bg_item_none.png'}+'\';'"  th:alt="${goods.sysImgNm}" alt="">
+											</div>
+											<p class="itemBrand" th:text="${goods.brandGroupNm}"></p>
+											<div class="itemName" th:text="${goods.goodsFullNm}"></div>
+											<p class="itemPrice">
+												<span th:text="${#numbers.formatInteger(goods.currPrice, 1, 'COMMA')}"></span>
+												<th:block th:if="${goods.listPrice != goods.currPrice}">
+													<span class="itemPrice_original" th:text="${#numbers.formatInteger(goods.listPrice, 1, 'COMMA')}"></span>
+													<span class="itemPercent" th:text="${goods.dcRate + '%'}"></span>
+												</th:block>
+											</p>
+										</a>
+										<button type="button" class="btn btn_default btn_sm" th:onclick="fnAddCartTmtbSalesGoods([[${goods.goodsCd}]])"><span>쇼핑백 담기</span></button>
+									</div>
+								</div>
+							</div>
+						</div>
+						<!-- Add Scrollbar -->
+						<div class="swiper-scrollbar" style="opacity: 0; transition-duration: 400ms;"><div class="swiper-scrollbar-drag" style="width: 514.104px; transform: translate3d(0px, 0px, 0px);"></div></div>
+						<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span></div>
+				</div>
+				<!-- -->
+			</div>
+		</div>
+
+		<script>
+			//팝업 - 다다익선 상품보기 > 슬라이드
+			var moreSaleSwiper = new Swiper('.moresale_pop .swiper-container', {
+				observer:true,
+				observeParents: true,
+				slidesPerView: 5,
+				spaceBetween: 20,
+				scrollbar: {
+					el: '.moresale_pop .swiper-scrollbar',
+					hide: true,
+				},
+			});
+		</script>
+	</div>
+</div>
+<a href="#close-modal" rel="modal:close" id="moresalePop_close" class="close-modal">Close</a>
+
+<script th:inline="javascript">
+	$(document).ready(function() {
+		var goodsListCnt = [[${goodsList.size()}]];
+		if(goodsListCnt < 1) {
+			mcxDialog.alert("다다익선 적용 가능한 다른 상품이 없습니다.");
+			$("#moresalePop_close").trigger("click");
+		} else {
+			$("#moresalePop").modal("show");
+		}
+	});
+
+	function fnAddCartTmtbSalesGoods(goodsCd) {
+		let data = JSON.stringify({goodsCd : goodsCd});
+		$.ajax( {
+			type		: "POST",
+			url 		: '/cart/tmtb/sales/goods/optcd',
+			data		: data,
+			dataType 	: 'json',
+			beforeSend : function(xhr, settings) {
+				xhr.setRequestHeader("AJAX"			, "true");
+				xhr.setRequestHeader('Accept'		, 'application/json');
+				xhr.setRequestHeader('Content-Type'	, 'application/json');
+			},
+			success 	: function(result) {
+				alert(result.goodsCd + " / " + result.optCd);
+
+				let compsList = [];
+				let temp 			= new Object;
+				temp.goodsCd 		= goodsCd;
+				temp.optCd 			= result.optCd;
+				temp.goodsQty 		= 1;
+				temp.goodsType 		= "G056_N";
+				temp.cartGb 		= "C";
+				temp.popupYn		= "Y";
+				compsList.push(temp);
+
+				cfnAddCart(compsList);
+			}
+		});
+	};
+</script>
+</html>

+ 27 - 15
src/main/webapp/WEB-INF/views/web/goods/GoodsDealDetailFormWeb.html

@@ -119,22 +119,30 @@
 																(goodsCouponList != null and !goodsCouponList.empty)
 															}" >
 								<dl>
-									<div class="bnf_shopping" th:if="${goodsCouponList != null and !goodsCouponList.empty}">
+									<div class="bnf_shopping" th:if="${(goodsCouponList != null and !goodsCouponList.empty) or
+																		(tmtbList != null and !tmtbList.empty) or
+																		(freeGoodsList != null and !freeGoodsList.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>
+											<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 th:if="${tmtbList != null and !tmtbList.empty}">
+												<th:block th:each="tmtb, status : ${tmtbList}" th:if="${status.first}">
+												<em class="c_primary"><th:block th:text="${#numbers.formatInteger(tmtb.sectionVal, 0,'COMMA')}"></th:block><th:block th:text="${(tmtb.sectionGb == 'G810_10')? '개':'금액'}"></th:block></em> 이상 구매 시 
+												<em class="c_primary"><th:block th:text="${#numbers.formatInteger(tmtb.dcVal, 0,'COMMA')}"></th:block><th:block th:text="${(tmtb.dcWay == 'G240_10')? '원':'%'}"></th:block></em></em> 할인
+												</th:block>
+												</span>
+												<span th:if="${freeGoodsList != null and !freeGoodsList.empty}">
+												<th:block th:each="freeGoods, status : ${freeGoodsList}" th:if="${status.first}">
+												<th:block th:text="${freeGoods.goodsNm}"></th:block> 증정 <th:block th:if="${freeGoods.allYn == 'N'}" th:text="외 택1"></th:block></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>
@@ -748,6 +756,10 @@
 		$('.price_box .number  span').html(totalEa.addComma());
 		$('.price_box .price > span').html(totalPrice.addComma());
 		
+		if ($('input[name="cea"]', document.cartForm).length <= 0 ) {
+			$('.price_box').hide();
+		}
+		
 	}
 	
 	//장바구니담기

+ 30 - 3
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailFormWeb.html

@@ -46,6 +46,7 @@
 												</th:block>
 												<th:block th:unless="${goodsVideo.videoGb == 'Y'}">
 												<iframe width="100%" height="100%" th:src="${kollusMediaUrl+'/'+goodsVideo.kmcKey +'?player_version=html5'}" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
+												
 												</th:block>
 												</span>
 											</a>
@@ -75,10 +76,10 @@
 								<li th:id="${'navLocate'+ status.count}"  th:classappend="${status.first}? 'on' : ''">
 									<div class="movbox">
 										<th:block th:if="${goodsVideo.videoGb == 'Y'}">
-										<iframe width="100%" height="100%" th:src="${'https://www.youtube.com/embed/'+goodsVideo.kmcKey+'?rel=0&autoplay=1&mute=1'}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
+										<iframe id="prodctThumbVideo" class="pd_mov" width="100%" height="100%" th:src="${'https://www.youtube.com/embed/'+goodsVideo.kmcKey+'?rel=0&autoplay=1&mute=1'}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
 										</th:block>
 										<th:block th:unless="${goodsVideo.videoGb == 'Y'}">
-										<iframe width="100%" height="100%" th:src="${kollusMediaUrl+'/'+goodsVideo.kmcKey +'?player_version=html5'}" frameborder="0" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
+										<iframe id="prodctThumbVideo" class="pd_mov" width="100%" height="100%" th:src="${kollusMediaUrl+'/'+goodsVideo.kmcKey +'?enable_initialize_focus=false&autoplay&mute&controls_activation=none'}" frameborder="0" allowfullscreen></iframe>
 										</th:block>
 									</div>
 								</li>
@@ -611,7 +612,7 @@
 						</div>
 						</th:block>
 					</div>
-					<div class="area_kcl" th:if="${goodsSafeNo != null}">
+					<div class="area_kcl" th:if="${goodsInfo.goodsType == 'G056_N' and goodsSafeNo != null}">
 						<i class="ico ico_kcl"></i>
 						<th:block th:if="${not #strings.contains(goodsSafeNo.certNum, '해당')}" >
 						<p class="tit normal" th:text="${goodsSafeNo.certDiv + ' / ' + goodsSafeNo.certOrganName}">
@@ -631,6 +632,32 @@
 							해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
 						</p>
 					</div>
+					<th:block th:if="${goodsInfo.goodsType == 'G056_S'}">
+					<th:block th:each="goodsCompose, status : ${goodsComposeList}">
+					<th:block th:if="${goodsCompose.goodsSafeNo != null}">
+						<div class="area_kcl" >
+						<i class="ico ico_kcl"></i>
+						<th:block th:if="${not #strings.contains(goodsCompose.goodsSafeNo.certNum, '해당')}" >
+						<p class="tit normal" th:text="${goodsCompose.goodsSafeNo.certDiv + ' / ' + goodsCompose.goodsSafeNo.certOrganName}">
+							어린이제품 안전인증 / 한국건설생활시험연구원(KCL)
+						</p>
+						</th:block>
+						<p class="normal" >
+							<th:block th:if="${#strings.contains(goodsCompose.goodsSafeNo.certNum, '해당')}" >
+							해당 없음 
+							</th:block>
+							<th:block th:unless="${#strings.contains(goodsCompose.goodsSafeNo.certNum, '해당')}" >
+							인증번호: <th:block th:text="${goodsCompose.goodsSafeNo.certNum}"></th:block>
+							<a th:href="@{http://www.safetykorea.kr/search/searchPop(certNum=${goodsCompose.goodsSafeNo.certNum})}" target="_blank" class="linktxt3">상세보기</a>
+							</th:block>
+						</p>
+						<p class="t_info dot_info">
+							해당 인증정보는 판매자가 등록한 것으로 등록정보에 대한 일체의 책임은 판매자에게 있습니다.
+						</p>
+					</div>
+					</th:block>
+					</th:block>
+					</th:block>
 					<div class="area_infotbl">
 						<span class="title">상품기본정보</span>
 						<th:block th:if="${goodsInfo.goodsType == 'G056_N'} ">

+ 0 - 4
src/main/webapp/WEB-INF/views/web/goods/GoodsDetailReviewFormWeb.html

@@ -303,10 +303,6 @@
 								<span class="thumb" th:classAppend="${(reviewAttach.fileGb == 'M') ? 'mov' :''}" th:style="${'background-image:url('+imgUrl+ reviewAttach.sysFileNm+');'}"></span><!-- 동영상의 썸네일일 경우 mov 클래스 추가 -->
 								</th:block>
 							</div>
-							<div class="pic" th:unless="${bestReview.reviewAttachList != null and !bestReview.reviewAttachList.empty}">
-								<span class="thumb" th:style="${'background-image:url('+imgGoodsUrl+ '/'+goodsInfo.sysImgNm+'?RS=162);'}">
-								</span>
-							</div>
 							<div class="star_score" th:with="starScore=${#numbers.formatDecimal((bestReview.iscore*100/5), 0,0)}">
 								<span class="star">
 									<em class="progbar" th:style="${'width:'+starScore+'%;' }"></em> <!-- 평점 style로 표기 -->

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

@@ -401,7 +401,7 @@
 													<img alt="" class="vLHTC pd_img" th:src="${imgGoodsUrl+'/'+goodsInfo.sysImgNm+'?RS=80'}" 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>
+												<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>

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

@@ -66,7 +66,7 @@
 				if (review.reviewAttachList != null && review.reviewAttachList.length > 0){
 					reviewClass = '';
 				}
-				tag +='<div class="review" class="'+reviewClass+'" >\n';  <!-- 첨부이미지 없을 시 empty_photo 클래스 추가 --> 
+				tag +='<div class="review '+reviewClass+'" >\n';  <!-- 첨부이미지 없을 시 empty_photo 클래스 추가 --> 
 				tag +='	<div class="pic">\n';
 				if (review.reviewAttachList != null && review.reviewAttachList.length > 0){
 					$.each(review.reviewAttachList, function(aIdx, reviewAttach){

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

@@ -82,10 +82,10 @@
 						</div>
 					</div>
 					<div class="btn_footer_area">
-						<button type="button" class="btn btn_default cancle_btn" onclick="cfnGoToPage(_PAGE_MAIN);">
+						<button type="button" class="btn btn_default btn_md" onclick="cfnGoToPage(_PAGE_MAIN);">
 							<span>취소</span>
 						</button>
-						<button type="button" id="btnConfirm" class="btn btn_dark submit_btn">
+						<button type="button" id="btnConfirm" class="btn btn_dark btn_md">
 							<span>확인</span>
 						</button>
 					</div>

+ 31 - 14
src/main/webapp/WEB-INF/views/web/mypage/MypageCustModifyFormWeb.html

@@ -98,7 +98,7 @@
 											<td>
 												<div class="form_field">
 													<div class="input_wrap">
-														<input type="text" id="email" name="email" class="form_control"/>
+														<input type="text" id="email" name="email" data-valid-type="email" class="form_control"/>
 													</div>
 												</div>
 											</td>
@@ -235,11 +235,14 @@
 			</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[*/
 	let orgCustInfo;
-	let orgAccountInfo;
 	let accountCheck = false;
+	let orgAccountNo;
+	let orgBankCd;
+
 
 	// 고객정보
 	var fnGetCustInfo = function () {
@@ -269,8 +272,6 @@
 		fnDisplayEmailAgree(custInfo.emailAgreeYn);
 		fnDisplaySmsAgree(custInfo.smsAgreeYn);
 
-		// 회원(고객) 계좌 조회
-		fnGetCustAccountInfo();
 	}
 
 	// 이메일 수신동의
@@ -302,11 +303,10 @@
 
 	// 고객계좌 정보 데이터
 	var fnGetCustAccountInfoCallback = function (result) {
-		orgAccountInfo = {};
 		var $accountNm = $('#custModiFyForm input[name=accountNm]');
 		if (!gagajf.isNull(result)) {
-			orgAccountInfo.accountNo = result.accountNo;
-			orgAccountInfo.bankCd = result.bankCd;
+			orgAccountNo = result.accountNo;
+			orgBankCd = result.bankCd;
 			//1. 고객명과 환불계좌 예금주가 다른 경우 현재 고객명을 적어주고 계좌번호, 은행코드 초기화 처리
 			let $bankCd = '';
 			if ($accountNm.val() === result.accountNm) {
@@ -320,8 +320,8 @@
 			}
 			$($bankCd).trigger('click'); // 셀렉트 박스 트리거
 		} else {
-			orgAccountInfo.accountNo = '';
-			orgAccountInfo.bankCd ='';
+			orgAccountNo = '';
+			orgBankCd ='';
 		}
 	}
 
@@ -393,6 +393,17 @@
 					$('#custModiFyForm input[name=email]').focus();
 				}
 			});
+			return;
+		}
+
+		if (!fnCheckValidationEmail(custModiFy.email)) {
+			mcxDialog.alertC('이메일 형식에 맞게 입력해주세요.',{
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$('#custModiFyForm input[name=email]').focus();
+				}
+			});
+			return;
 		}
 
 		if (orgCustInfo.email !== custModiFy.email) {
@@ -404,11 +415,11 @@
 		}
 
 		// 은행코드가 바꼈는지
-		if (orgAccountInfo.bankCd !== $bankCd.val()) {
+		if (orgBankCd !== $bankCd.val()) {
 			accountModifyYn = 'Y';
 		}
 
-		if (orgAccountInfo.accountNo !== $accountNo.val()) {
+		if (orgAccountNo !== $accountNo.val()) {
 			accountModifyYn = 'Y';
 		}
 
@@ -455,12 +466,18 @@
 
 	// 수정 콜백
 	var fnSaveCustomerInfoCallback = function (result) {
+		accountCheck = false;
 		if (result.isSuccess) {
 			mcxDialog.alert("회원정보가 수정되었습니다.");
 			fnGetCustInfo();
+			fnGetCustAccountInfo();
 			return;
 		} else {
-			mcxDialog.alert("실패하였습니다.<br/>고객센터에 문의하시 바랍니다.");
+			let msg = '실패하였습니다.<br/>고객센터에 문의하시 바랍니다.'
+			if (result.resultType === 'INVALID_ACCOUNT') {
+				msg = '환불 계좌정보를 다시 확인하시고 계좌인증을 해주세요.'
+			}
+			mcxDialog.alert(msg);
 			return;
 		}
 	}
@@ -519,13 +536,13 @@
 		// 회원(고객) 조회
 		fnGetCustInfo();
 
+		// 회원(고객) 계좌 조회
+		fnGetCustAccountInfo();
 
 
 	});
 
 
-
-
 	/*]]>*/
 </script>
 </th:block>

+ 8 - 8
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderDetailFormWeb.html

@@ -114,8 +114,8 @@
 															<p><button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${ordDtl.ordNo}" onclick="fnReSendSms(this);"><span>SMS 재발송</span></button></p>
 														</th:block>
 
-														<!-- 주문취소 버튼(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중) -->
-														<th:block th:if="${ordDtl.ordDtlStat == 'G013_10' or ordDtl.ordDtlStat == 'G013_20' or ordDtl.ordDtlStat == 'G013_30' or ordDtl.ordDtlStat == 'G013_35' or ordDtl.ordDtlStat == 'G013_40'}">
+														<!-- 주문취소 버튼(결제완료, 상품준비중, 출고처지정) -->
+														<th:block th:if="${ordDtl.ordDtlStat == 'G013_20' or ordDtl.ordDtlStat == 'G013_30' or ordDtl.ordDtlStat == 'G013_35'}">
 															<p><button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'cancel');"><span>주문 취소</span></button></p>
 														</th:block>
 														
@@ -131,8 +131,8 @@
 													</th:block>
 													<!-- 주문 -->
 													<th:block th:unless="${order.giftPackYn == 'Y'}">
-														<!-- 주문취소 버튼(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중) -->
-														<th:block th:if="${ordDtl.payStat != 'G016_00' && (ordDtl.ordDtlStat == 'G013_10' or ordDtl.ordDtlStat == 'G013_20' or ordDtl.ordDtlStat == 'G013_30' or ordDtl.ordDtlStat == 'G013_35' or ordDtl.ordDtlStat == 'G013_40')}">
+														<!-- 주문취소 버튼(결제완료, 상품준비중, 출고처지정) -->
+														<th:block th:if="${ordDtl.ordDtlStat == 'G013_20' or ordDtl.ordDtlStat == 'G013_30' or ordDtl.ordDtlStat == 'G013_35'}">
 															<p><button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, delvFeeCd=${ordDtl.delvFeeCd}" onclick="fnCreateChange(this, 'cancel');"><span>주문 취소</span></button></p>
 														</th:block>
 														
@@ -177,13 +177,13 @@
 															<p><button type="button" class="btn btn_primary_line btn_sm" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}, goodsCd=${ordDtl.goodsCd}" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></p>
 														</th:block>
 	
-														<!-- 쇼핑백담기 버튼(구매확정) -->
-														<th:block th:if="${ordDtl.ordDtlStat == 'G013_70'}">
+														<!-- 쇼핑백담기 버튼(입금대기, 배송준비중, 구매확정) -->
+														<th:block th:if="${ordDtl.ordDtlStat == 'G013_10' or ordDtl.ordDtlStat == 'G013_40' or ordDtl.ordDtlStat == 'G013_70'}">
 															<p><button type="button" class="btn btn_default btn_sm" th:attr="ordNo=${ordDtl.ordNo}, ordDtlNo=${ordDtl.ordDtlNo}" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></p>
 														</th:block>
 	
-														<!-- 1:1문의 버튼(구매확정) -->
-														<th:block th:if="${ordDtl.ordDtlStat == 'G013_70' and (ordDtl.reviewableYn == 'N' or ordDtl.reviewSq > 0)}">
+														<!-- 1:1문의 버튼(입금대기, 배송준비중, 구매확정) -->
+														<th:block th:if="${ordDtl.ordDtlStat == 'G013_10' or ordDtl.ordDtlStat == 'G013_40' or (ordDtl.ordDtlStat == 'G013_70' and (ordDtl.reviewableYn == 'N' or ordDtl.reviewSq > 0))}">
 															<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>
 														</th:block>
 													</th:block>

+ 8 - 8
src/main/webapp/WEB-INF/views/web/mypage/MypageOrderListFormWeb.html

@@ -387,7 +387,7 @@
 		let jsonData = JSON.stringify(data);
 		
 		gagajf.ajaxJsonSubmit(url, jsonData, function(result) {
-			$('#orderReceiptCount').text(result.orderCount.orderReceiptCount);
+			$('#orderReceiptCount').text(result.orderCount.depositWaitingCount);
 			$('#paymentCompleteCount').text(result.orderCount.paymentCompleteCount);
 			$('#goodsPrepareCount').text(result.orderCount.goodsPrepareCount);
 			$('#shipPrepareCount').text(result.orderCount.shipPrepareCount);
@@ -497,8 +497,8 @@
 							tag += '											<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" onclick="fnReSendSms(this);"><span>SMS 재발송</span></button></p>\n';
 						}
 
-						// 주문취소 버튼(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중)
-						if (ordDtl.ordDtlStat == 'G013_10' || ordDtl.ordDtlStat == 'G013_20' || ordDtl.ordDtlStat == 'G013_30' || ordDtl.ordDtlStat == 'G013_35' || ordDtl.ordDtlStat == 'G013_40') {
+						// 주문취소 버튼(결제완료, 상품준비중, 출고처지정)
+						if (ordDtl.ordDtlStat == 'G013_20' || ordDtl.ordDtlStat == 'G013_30' || ordDtl.ordDtlStat == 'G013_35') {
 							tag += '											<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" delvFeeCd="' + ordDtl.delvFeeCd + '" onclick="fnCreateChange(this, \'cancel\');"><span>주문 취소</span></button></p>\n';
 						}
 
@@ -512,8 +512,8 @@
 							tag += '											<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></p>\n';
 						}
 					} else {
-						// 주문취소 버튼(입금대기, 결제완료, 상품준비중, 출고처지정, 배송준비중)
-						if (ordDtl.payStat != 'G016_00' && (ordDtl.ordDtlStat == 'G013_10' || ordDtl.ordDtlStat == 'G013_20' || ordDtl.ordDtlStat == 'G013_30' || ordDtl.ordDtlStat == 'G013_35' || ordDtl.ordDtlStat == 'G013_40')) {
+						// 주문취소 버튼(결제완료, 상품준비중, 출고처지정)
+						if (ordDtl.ordDtlStat == 'G013_20' || ordDtl.ordDtlStat == 'G013_30' || ordDtl.ordDtlStat == 'G013_35') {
 							tag += '											<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" ordCanChgQty="' + ordDtl.ordCanChgQty + '" delvFeeCd="' + ordDtl.delvFeeCd + '" onclick="fnCreateChange(this, \'cancel\');"><span>주문 취소</span></button></p>\n';
 						}
 
@@ -555,13 +555,13 @@
 							tag += '											<p><button type="button" class="btn btn_primary_line btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" goodsCd="' + ordDtl.goodsCd + '" onclick="fnCreateReview(this);"><span>리뷰 쓰기</span></button></p>\n';
 						}
 
-						// 쇼핑백담기 버튼(구매확정)
-						if (ordDtl.ordDtlStat == 'G013_70') {
+						// 쇼핑백담기 버튼(입금대기, 배송준비중, 구매확정)
+						if (ordDtl.ordDtlStat == 'G013_10' || ordDtl.ordDtlStat == 'G013_40' || ordDtl.ordDtlStat == 'G013_70') {
 							tag += '											<p><button type="button" class="btn btn_default btn_sm" ordNo="' + ordDtl.ordNo + '" ordDtlNo="' + ordDtl.ordDtlNo + '" onclick="fnCreateCart(this);"><span>쇼핑백 담기</span></button></p>\n';
 						}
 
 						// 1:1문의 버튼(구매확정)
-						if (ordDtl.ordDtlStat == 'G013_70' && (ordDtl.reviewableYn == 'N' || ordDtl.reviewSq > 0)) {
+						if (ordDtl.ordDtlStat == 'G013_10' || ordDtl.ordDtlStat == 'G013_40' || (ordDtl.ordDtlStat == 'G013_70' && (ordDtl.reviewableYn == 'N' || ordDtl.reviewSq > 0))) {
 							tag += '											<p><button type="button" class="btn btn_default btn_sm" onclick="cfnGoToPage(_PAGE_ONETOONE_QNA_REG);"><span>1:1 문의</span></button></p>\n';
 						}
 					}

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

@@ -437,7 +437,7 @@
 
 		// 추가배송비 PG 처리
 		let addPayCost = $('#returnForm input[name=addPayCost]').val();
-		alert(addPayCost);
+
 		let data = {};
 		data.ordNo = oneData.ordNo;
 		data.ordChgSq = 0;

+ 4 - 4
src/main/webapp/WEB-INF/views/web/order/OrderDeliveryAddrInfoWeb.html

@@ -134,14 +134,14 @@
 					<dd>
 						<div class="form_field">
 							<div>
-								<input type="radio" name="rdi-overseas" id="rdi-overs1" value="Y"> 
+								<input type="radio" name="rdi-overseas" id="rdi-overs1" value="Y" checked> 
 								<label for="rdi-overs1"><span>받는사람 개인통관고유부호</span></label>
 							</div>
 							<div>
-								<input type="radio" name="rdi-overseas" id="rdi-overs2" value="N" checked> 
+								<input type="radio" name="rdi-overseas" id="rdi-overs2" value="N"> 
 								<label for="rdi-overs2"><span>입력 안 함</span></label>
 							</div>
-							<div class="info_box overs1" style="display:none;">
+							<div class="info_box overs1">
 								<div class="input_wrap">
 									<input type="text" name="entryNo" class="form_control" maxlength="13" placeholder="P로 시작하는 13자리">
 									<!-- 유효하지 않은 개인통관고유부호 일때 class명 'err' 추가 -->
@@ -214,7 +214,7 @@ var deliveryAddrInfoDispYn = function(temp) {
 //컨텐츠 호출
 $(document).ready( function() {
 	// 화면펼침
-	deliveryAddrInfoDispYn(dispYn);
+	deliveryAddrInfoDispYn("Y");
 });
 
 // 개인통관부호 유효성체크

+ 57 - 10
src/main/webapp/WEB-INF/views/web/order/OrderFormWeb.html

@@ -478,7 +478,11 @@
 			<div class="modal-body">
 				<div class="pop_cont">
 					<div class="cont_box">
-						사은품지급안내 내용입니다. 사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다. 사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다. 사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다. 사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다. 사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.사은품지급안내 내용입니다.
+						<ul>
+							<li>스타일포인트 차감 사은품을 선택하신 경우, 결제 시 고객님의 누적 포인트에서 차감됩니다.</li>
+							<li>보유한 포인트의 금액을 넘어선 사은품은 신청이 불가합니다.</li>
+							<li>사은품 신청 시 해외배송은 불가합니다. <br> <span class="t_info">(적립포인트 사은품 및 온라인 사은품 제외)</span></li>
+						</ul>
 					</div>
 				</div>
 			</div>
@@ -866,6 +870,17 @@ var freegiftInfoSet = function() {
 					pntDcAmtReset();
 				});
 				
+				// 2021.04.29 무료사은품 기본선택
+				$("#orderForm .freegiftRdo").each(function(){
+					var usepoint 	= parseInt($(this).attr("usepoint"));
+					var count 		= parseInt($(this).attr("count"));
+					
+					// 첫번째 무료 선택 
+					if (usepoint == 0 && count == 1) {
+						$(this).trigger("click");
+					}
+				});
+				
 				// 사은품테이블 그리기
 				$("#orderForm .gift_box").each(function(){
 					$(this).find(".freegiftRdo").each(function(){
@@ -875,6 +890,13 @@ var freegiftInfoSet = function() {
 						$("#orderForm .total_gift").text(total_gift);						// 사은품총선택개수
 					});
 				});
+				
+				// 2021.04.29 사은품동의 체크 기능
+				$("#orderForm #chk-agree_gift").on("click", function(){
+					if ($(this).is(":checked") == false) {
+						mcxDialog.alert("미동의시 사은품 지급이 되지 않습니다.");
+					}
+				});
 			}
 			
 			// 1.6 결제타입로드
@@ -957,6 +979,15 @@ var paymentInfoSet = function() {
 							
 							orgEntryNo = $("#orderForm input[name=entryNo]").val();
 							
+							if (orgEntryNo.substr(0,1) != "P") {
+								mcxDialog.alert("개인통관고유부호가 유효하지 않습니다.");
+								$('#orderForm input[name=entryNo]').focus();
+								
+								// 배송정보화면노출
+								deliveryAddrInfoDispYn("Y");
+								return false;
+							}
+							
 							if (orgEntryNo.length < 13) {
 								mcxDialog.alert("개인통관고유부호가 유효하지 않습니다.");
 								$('#orderForm input[name=entryNo]').focus();
@@ -979,7 +1010,7 @@ var paymentInfoSet = function() {
 					// 주문제작상품일때 주문제작정보동의
 					if (orderMadeYn == "Y") {
 						if (!$("#orderForm #chk-custom-agr1").is(":checked")) {
-							mcxDialog.alert("주문제작상품 정보 동의를 체크해주세요.");
+							mcxDialog.alert("주문제작상품에 대한 동의를 하지 않으실 경우 해당 상품을 쇼핑백에서 제외하신 후 다시 결제를 시도해주세요.");
 							
 							// 배송정보화면노출
 							deliveryAddrInfoDispYn("Y");
@@ -987,7 +1018,8 @@ var paymentInfoSet = function() {
 						}
 					}
 					
-					// 사은품지급할 경우 체크
+					// 사은품지급할 경우 체크 2020.04.29 사은품지급이 필수가 아닙니다.
+					/*
 					if ($("#orderAmtForm .freegiftValArr").text().length > 0) {
 						if (!$("#orderForm #chk-agree_gift").is(":checked")) {
 							mcxDialog.alert("사은품 지급 정보 동의를 체크해주세요.");
@@ -997,6 +1029,7 @@ var paymentInfoSet = function() {
 							return false;
 						}
 					}
+					*/
 					
 					// 결재수단
 					if (gagajf.isNull(paynormal)) {
@@ -1083,6 +1116,19 @@ var paymentInfoSet = function() {
 						delvFeeCdList.push(delvFeeCdData);
 					});
 					
+					// 2021.04.29 상픈품 체크박스 미동의시 사은품 미지급
+					var freegiftValArr 			= $("#orderAmtForm .freegiftValArr").text().split(",");
+					var freegiftSqArr 			= $("#orderAmtForm .freegiftSqArr").text().split(",");
+					var freegiftGoodsArr 		= $("#orderAmtForm .freegiftGoodsArr").text().split(",");
+					var freegiftUsePointArr 	= $("#orderAmtForm .freegiftUsePointArr").text().split(",");
+					
+					if (!$("#orderForm #chk-agree_gift").is(":checked") == false) {
+						freegiftValArr 			= "";
+						freegiftSqArr 			= "";
+						freegiftGoodsArr 		= "";
+						freegiftUsePointArr 	= "";
+					}
+					
 					// 주문데이타 생성
 					var orderData = {
 						"custNm"				: $("#orderAmtForm .custNm").text()
@@ -1108,10 +1154,10 @@ var paymentInfoSet = function() {
 						,"ordPhnno"				: $("#orderAmtForm .cellPhnno").text()
 						,"goodsNm"				: $("#orderAmtForm .goodsNm").eq(0).text()
 						,"ordGoodsQty"			: ordGoodsQty
-						,"freegiftValArr"		: $("#orderAmtForm .freegiftValArr").text().split(",")
-						,"freegiftSqArr"		: $("#orderAmtForm .freegiftSqArr").text().split(",")
-						,"freegiftGoodsArr"		: $("#orderAmtForm .freegiftGoodsArr").text().split(",")
-						,"freegiftUsePointArr"	: $("#orderAmtForm .freegiftUsePointArr").text().split(",")
+						,"freegiftValArr"		: freegiftValArr
+						,"freegiftSqArr"		: freegiftSqArr
+						,"freegiftGoodsArr"		: freegiftGoodsArr
+						,"freegiftUsePointArr"	: freegiftUsePointArr
 						,"giftMsg"				: ""
 					};
 					
@@ -1222,7 +1268,7 @@ var dcAmtInfoSet = function() {
 					success 	: function(result) {
 						$("#couponModifyPop").html(result);
 						
-						// 1.8.1 선포인트기능초기
+						// 1.8.1 선포인트기능초기
 						prePntDcAmtReset();
 						
 						// 1.8.2 쿠폰적용초기화(할인율최고)(상품,장바구니)
@@ -1905,7 +1951,8 @@ var prePntDcAmtReset = function() {
 	var rmPrePntAmt = 0;
 	
 	if ($("#orderForm input[name='rmPrePntAmt']") != null) {
-		parseInt($("#orderForm input[name='rmPrePntAmt']").val());
+		rmPrePntAmt = parseInt($("#orderForm input[name='rmPrePntAmt']").val());
+		$("#orderForm input[name='prePntDcAmt']").val(rmPrePntAmt);
 	}
 	
 	$("#orderForm input[name='prePntDcAmt']").val(rmPrePntAmt);
@@ -2099,7 +2146,7 @@ var custCpnSumAmtCal = function() {
 	});
 	
 	realOrdSumAmt = realOrdSumAmt + delvSumAmt;
-	
+		
 	$("#orderAmtForm .orgGoodsSumAmt").text(orgGoodsSumAmt);
 	$("#orderAmtForm .cpn1DcSumAmt").text(cpn1DcSumAmt);
 	$("#orderAmtForm .ordSumAmt").text(ordSumAmt);

+ 3 - 3
src/main/webapp/WEB-INF/views/web/order/OrderFreegiftInfoWeb.html

@@ -64,7 +64,7 @@
 						<th:block th:each="freegiftGoods, k : ${freegiftGoodsList}">
 							<th:block th:if="${freegift.freegiftSq} == ${freegiftGoods.freegiftSq}">
 								<div class="gift">
-									<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}"  allYn="N"> 
+									<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="'rdi-gift'+${i.count}+${k.count}" class="chk_img freegiftRdo" th:value="${freegiftGoods.freegiftValSq}" th:usepoint="${freegiftGoods.usePoint}" allYn="N" th:count="${i.count}">
 									<label th:for="'rdi-gift'+${i.count}+${k.count}"> 
 										<span class="thumb"><img src="http://ts5000.ipdisk.co.kr:89/images/pc/thumb/tmp_gift1.jpg" width="" alt=""></span>
 										<span class="name" th:text="${freegiftGoods.goodsNm}"></span> 
@@ -75,7 +75,7 @@
 							</th:block>
 						</th:block>
 						<div class="gift">
-							<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N" checked> 
+							<input type="radio" th:name="'rdi-gift'+${i.count}" th:id="${i.count}+'0'" class="chk_img freegiftRdo" value="noSel" usepoint="0" allYn="N" count="100"> 
 							<label th:for="${i.count}+'0'">
 								<span class="thumb"><img src="/images/pc/thumb/tmp_gift_empty.jpg" width=""alt=""></span> 
 								<span class="name">사은품 수령안함</span>
@@ -90,7 +90,7 @@
 		<div class="form_field">
 			<div class="agree_gift">
 				<p>
-					<input id="chk-agree_gift" type="checkbox"><label for="chk-agree_gift"><span>동의합니다</span></label>
+					<input id="chk-agree_gift" type="checkbox" chedked><label for="chk-agree_gift"><span>동의합니다</span></label>
 				</p>
 				<p class="txt">
 					사은품 지금에 대한 내용을 확인하였으며, 이에 동의합니다.

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

@@ -2789,7 +2789,7 @@ ul.maintabs li [class^='box_depth'] {display:none; position:absolute; left:100%;
 	.option_box [class^="opt_"] .select_custom .select:after {right:20px;}
 	.option_box [class^="opt_"] div[class*="item_set_"] .select .opt_price {display:none;}
 	.option_box .opt_select div[class*="item_set_"] .select .opt_price {display:none;}
-	.option_box [class^="opt_"] .select_custom .select .opt_price {padding-top: 10px;}
+	.option_box [class^="opt_"] .select_custom .select .opt_price {padding-top: 10px;display: none;}
 	.option_box [class^="opt_"] .select_custom[aria-disabled="true"] .select {color:#bbb; background:#f5f5f5;}
 	.option_box [class^="opt_"] .select_custom .combo .list {top:52px; padding:0}
 	.option_box [class^="opt_"] .select_custom .combo .list > li {padding:18px 18px; line-height:1; color:#666; font-size:16px; font-weight:200;}

+ 31 - 6
src/main/webapp/ux/pc/js/common-ui.js

@@ -79,6 +79,9 @@ $(document).ready(function() {
 		$("#fileAdd").on("change", function(e) {
 			var files = e.target.files,
 				filesLength = files.length;
+				console.log(filesLength);
+			var cmtLa = $('.cmt .cmt_thumb .form_field .imgUpload label');
+			var cmtIn = $('.cmt .cmt_thumb .form_field .imgUpload input');
 			for (var i = 0; i < filesLength; i++) {
 				var f = files[i]
 				var fileReader = new FileReader();
@@ -90,9 +93,24 @@ $(document).ready(function() {
 						"</span>").insertAfter("#fileAdd");
 					$(".removes").click(function(){
 						$(this).parent(".pics").remove();
+						cmtLa.css('display', 'block');
+						cmtIn.css('display', 'block');
+						$('#fileAdd').removeAttr("disabled");
 					});
 				});
 			fileReader.readAsDataURL(f);
+				var maxFileLength = 10; /* 최대 파일 갯수를 입력해 주세요 */
+				var imgFiles=$('.imgUpload .pics');
+				var cmtLa = $('.cmt .cmt_thumb .form_field .imgUpload label');
+				var cmtIn = $('.cmt .cmt_thumb .form_field .imgUpload input');
+				if (imgFiles.length >= maxFileLength-1) {
+					mcxDialog.alert('이미지는 최대' + maxFileLength +'장 까지 첨부 가능합니다.'); //210420_수정 : 시스템 alert -> dialog 변경.
+					$('#fileAdd').attr("disabled",true);
+					cmtLa.css('display', 'none');
+					cmtIn.css('display', 'none');
+				} else if(imgFiles.length < maxFileLength){
+					$('#fileAdd').removeAttr("disabled");
+				}
 			}
 		});
 	} else {
@@ -323,23 +341,30 @@ $(document).ready( function() {
 	});
 
 	/* 고객센터_accordion */
-	$(document).off('click').on('click','.cs .foldGroup .fold_head',function(e){
-		$('.cs .foldGroup .fold_head').removeClass('on');
-        $('.cs .foldGroup .fold_cont').slideUp(100);
-		$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
+	/* 210428_수정 : 아코디언 */
+	$(document).on('click','.cs .foldGroup .fold_head',function(){
 		$(this).toggleClass('on');
-		return false;
+		$(this).siblings('.fold_cont').slideToggle(100);
+		$(this).parents('li').siblings('li').find('.fold_head').removeClass('on');
+		$(this).parents('li').siblings('li').find('.fold_cont').slideUp(100);
 	});
+	/* //210428_수정 : 아코디언 */
 
 	/* 주문결제_accordion */
+	/* 210428_수정 : 아코디언 */
 	$(document).on('click','.od .foldGroup .fold_head .fold_tit',function(e){	
-		$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
+		//$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
+		//$(this).parents('.fold_head').toggleClass('on');
 		$(this).parents('.fold_head').toggleClass('on');
+		$(this).parents('.foldGroup li').find('.fold_cont').slideToggle(100);
+		$(this).parents('li').siblings('li').find('.fold_head').removeClass('on');
+		$(this).parents('li').siblings('li').find('.fold_cont').slideUp(100);
 		return false;
 	}).on('click','.od .foldGroup .fold_paymethod .fold_head .fold_tit',function(e){
 		$("#rdi-paymethod-quick").trigger("click");
 		return false;
 	});
+	/* //210428_수정 : 아코디언 */
 	
 	/* 아이디/비밀번호 찾기_accordion:open */
 	$(document).on('click','.mb .foldGroup.checkcase .fold_head',function(e){	

+ 8 - 4
src/main/webapp/ux/style24_link.js

@@ -252,6 +252,7 @@ var cfnOpenIpinCertify = function (redirectUrl, custParams) {
  * @author : xodud1202
  */
 function cfnAddCart(cartList) {
+	gagajf.showProgressbar(true);
 	let jsonData = JSON.stringify(cartList);
 	
 	$.ajax( {
@@ -260,6 +261,10 @@ function cfnAddCart(cartList) {
 		data : jsonData,
 		contentType: 'application/json',
 		dataType : 'json',
+		error : function(e) {
+			mcxDialog.alert("장바구니 등록이 실패했습니다.");
+			gagajf.showProgressbar(false);
+		},
 		success : function(result) {
 			if(result.message == "SUCCESS") {
 				if(result.cartGb == "C") {
@@ -317,6 +322,8 @@ function cfnAddCart(cartList) {
 			} else {
 				mcxDialog.alert(result.message);
 			}
+			
+			gagajf.showProgressbar(false);
 		}
 	});
 }
@@ -848,12 +855,9 @@ function cfnPasswordModify() {
 
 	if ($('#pswordModifyPop').length == 0) {
 		$('body').append(str);
-		cfOpenLayer(_PAGE_PASSWORD_MODIFY, 'pswordModifyPop');
-	} else {
-		$('#pswordModifyPop').modal("show");
 	}
 
-
+	cfOpenLayer(_PAGE_PASSWORD_MODIFY, 'pswordModifyPop');
 }
 
 /**