gagamel 5 лет назад
Родитель
Сommit
c322e9f2e1

+ 75 - 53
src/main/java/com/style24/front/biz/dao/TsfPlanningDao.java

@@ -1,10 +1,8 @@
 package com.style24.front.biz.dao;
 
-import java.util.ArrayList;
 import java.util.Collection;
 
 import com.style24.core.support.annotation.ShopDs;
-import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Plan;
 import com.style24.persistence.domain.Review;
@@ -17,17 +15,26 @@ import com.style24.persistence.domain.Review;
  */
 @ShopDs
 public interface TsfPlanningDao {
-	
+
 	/**
-	 * 기획전 카테고리 1deth 조회
-	 * 
-	 * @param Cate4Srch
-	 * @return Collection<Cate4Srch>
-	 * @author sowon
-	 * @since 2021.03.05
+	 * 기획전 카테고리 목록
+	 * @param plan - 기획전 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 29
 	 */
-	Collection<Cate4Srch> getPlanCate1(Cate4Srch Cate);
-	
+	Collection<Plan> getPlanningCategoryList(Plan plan);
+
+//	/**
+//	 * 기획전 카테고리 1deth 조회
+//	 * 
+//	 * @param Cate4Srch
+//	 * @return Collection<Cate4Srch>
+//	 * @author sowon
+//	 * @since 2021.03.05
+//	 */
+//	Collection<Cate4Srch> getPlanCate1(Cate4Srch Cate);
+
 	/**
 	 * 기획전 갯수 조회
 	 * 
@@ -37,27 +44,64 @@ public interface TsfPlanningDao {
 	 * @since 2021.03.05
 	 */
 	int getPlanAllCount(Plan plan);
-	
+
 	/**
 	 * 기획전 목록
-	 *
-	 * @param
+	 * @param plan - 기획전 정보
 	 * @return
-	 * @author sowon
-	 * @date 2021. 3. 8
+	 * @author gagamel
+	 * @date 2021. 3. 29
 	 */
-	Collection<Plan> getPlanList(Plan plan);
-	
+	Collection<Plan> getPlanningList(Plan plan);
+
 	/**
 	 * 기획전 상품 목록
-	 *
 	 * @param
 	 * @return
-	 * @author sowon
-	 * @date 2021. 3. 8
+	 * @author gagamel
+	 * @since 2021. 3. 29
 	 */
-	Collection<Plan> getPlanGoodsList(Plan plan);
-	
+	Collection<Plan> getPlanningGoodsList(Plan plan);
+
+//	/**
+//	 * 기획전 목록 + 상품
+//	 *
+//	 * @param
+//	 * @return
+//	 * @author bin2107
+//	 * @since 2021. 3. 26
+//	 */
+//	Collection<Plan> getPlanningList(Plan plan);
+//
+//	/**
+//	 * 기획전 목록 + 상품
+//	 *
+//	 * @param
+//	 * @return
+//	 * @author bin2107
+//	 * @since 2021. 3. 26
+//	 */
+//	Collection<Plan> getPlanningGoodsList(Plan plan);
+
+//	/**
+//	 * 기획전 목록
+//	 * @param
+//	 * @return
+//	 * @author sowon
+//	 * @date 2021. 3. 8
+//	 */
+//	Collection<Plan> getPlanList(Plan plan);
+//
+//	/**
+//	 * 기획전 상품 목록
+//	 *
+//	 * @param
+//	 * @return
+//	 * @author sowon
+//	 * @date 2021. 3. 8
+//	 */
+//	Collection<Plan> getPlanGoodsList(Plan plan);
+
 	/**
 	 * 기획전 접근 가능 등급 고객
 	 *
@@ -67,8 +111,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 19
 	 */
 	Collection<Plan> accessCustGrade(Plan plan);
-	
-	
+
 	/**
 	 * 기획전 상세정보
 	 *
@@ -78,7 +121,6 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 19
 	 */
 	Plan getPlanDetailInfo(Plan plan);
-	
 
 	/**
 	 * 기획전 상세 프론트 소스 
@@ -89,7 +131,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 22
 	 */
 	Plan getPlanFsrcInfo(Plan plan);
-	
+
 	/**
 	 * 기획전 템플릿 순서
 	 *
@@ -99,7 +141,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 22
 	 */
 	Collection<Plan> templateDispOrdInfo(Plan plan);
-	
+
 	/**
 	 * 기획전 템플릿 리뷰
 	 *
@@ -109,7 +151,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 22
 	 */
 	Collection<Plan> getPlanReviewInfo(Review review);
-	
+
 	/**
 	 * 기획전 템플릿 쿠폰
 	 *
@@ -119,7 +161,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 22
 	 */
 	Collection<Plan> getPlanCouponInfo(Coupon coupon);
-	
+
 	/**
 	 * 기획전 템플릿 이미지
 	 *
@@ -129,7 +171,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 22
 	 */
 	Collection<Plan> getPlanImageInfo(Plan plan);
-	
+
 	/**
 	 * 기획전 템플릿 상품 1열
 	 *
@@ -139,7 +181,7 @@ public interface TsfPlanningDao {
 	 * @date 2021. 3. 23
 	 */
 	Collection<Plan> getPlanGoods1Info(Plan plan);
-	
+
 	/**
 	 * 이벤트 갯수 조회
 	 * 
@@ -149,7 +191,7 @@ public interface TsfPlanningDao {
 	 * @since 2021.03.08
 	 */
 	int getEventAllCount(Plan plan);
-	
+
 	/**
 	 * 이벤트 목록
 	 *
@@ -160,24 +202,4 @@ public interface TsfPlanningDao {
 	 */
 	Collection<Plan> getPlanEventList(Plan plan);
 
-	/**
-	 * 기획전 목록 + 상품
-	 *
-	 * @param
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 3. 26
-	 */
-	Collection<Plan> getPlanningList(Plan plan);
-
-	/**
-	 * 기획전 목록 + 상품
-	 *
-	 * @param
-	 * @return
-	 * @author bin2107
-	 * @since 2021. 3. 26
-	 */
-	Collection<Plan> getPlanningGoodsList(Plan plan);
-
 }

+ 84 - 57
src/main/java/com/style24/front/biz/service/TsfPlanningService.java

@@ -1,25 +1,15 @@
 package com.style24.front.biz.service;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.style24.core.support.env.TscConstants;
 import com.style24.front.biz.dao.TsfPlanningDao;
-import com.style24.front.support.env.TsfConstants;
 import com.style24.front.support.security.session.TsfSession;
-import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Coupon;
-import com.style24.persistence.domain.Goods;
-import com.style24.persistence.domain.Login;
 import com.style24.persistence.domain.Plan;
-import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
 
 import lombok.extern.slf4j.Slf4j;
@@ -36,21 +26,32 @@ public class TsfPlanningService {
 
 	@Autowired
 	private TsfPlanningDao planningDao;
-	
+
 	@Autowired
 	private TsfCouponService couponService;
-	
+
 	/**
-	 * 기획전 카테고리 1deth 조회
-	 *
-	 * @param Cate4Srch
-	 * @author sowon
-	 * @since 2021. 03. 05
-	 */	
-	public Collection<Cate4Srch> getPlanCate1(Cate4Srch cate) {
-		return planningDao.getPlanCate1(cate);
+	 * 기획전 카테고리 목록
+	 * @param plan - 기획전 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 29
+	 */
+	public Collection<Plan> getPlanningCategoryList(Plan plan) {
+		return planningDao.getPlanningCategoryList(plan);
 	}
-	
+
+//	/**
+//	 * 기획전 카테고리 1deth 조회
+//	 *
+//	 * @param Cate4Srch
+//	 * @author sowon
+//	 * @since 2021. 03. 05
+//	 */
+//	public Collection<Cate4Srch> getPlanCate1(Cate4Srch cate) {
+//		return planningDao.getPlanCate1(cate);
+//	}
+
 	/**
 	 * 기획전 갯수 조회
 	 * 
@@ -61,33 +62,61 @@ public class TsfPlanningService {
 	public int getPlanAllCount(Plan plan) {
 		return planningDao.getPlanAllCount(plan);
 	}
-	
+
 	/**
 	 * 기획전 목록
-	 *
-	 * @param
+	 * @param plan - 기획전 정보
 	 * @return
-	 * @author sowon
-	 * @since 2021. 3. 8
+	 * @author gagamel
+	 * @since 2021. 3. 29
 	 */
-	public Collection<Plan> getPlanList(Plan plan) {
-		//plan.setSiteCd(TsfConstants.SITE_CD);
-		return planningDao.getPlanList(plan);
+	public Collection<Plan> getPlanningList(Plan plan) {
+		return planningDao.getPlanningList(plan);
 	}
-	
+
+//	/**
+//	 * 기획전 목록
+//	 * @param
+//	 * @return
+//	 * @author sowon
+//	 * @since 2021. 3. 8
+//	 */
+//	public Collection<Plan> getPlanList(Plan plan) {
+//		//plan.setSiteCd(TsfConstants.SITE_CD);
+//		return planningDao.getPlanList(plan);
+//	}
+//
+//	/**
+//	 * 기획전 상품 목록
+//	 *
+//	 * @param
+//	 * @return
+//	 * @author sowon
+//	 * @since 2021. 3. 8
+//	 */
+//	public Collection<Plan> getPlanGoodsList(Plan plan) {
+//		//plan.setSiteCd(TsfConstants.SITE_CD);
+//		return planningDao.getPlanGoodsList(plan);
+//	}
+
 	/**
-	 * 기획전 상품 목록
-	 *
-	 * @param
+	 * 기획전 메인 목록
+	 * @param plan - 기획전 정보
 	 * @return
-	 * @author sowon
-	 * @since 2021. 3. 8
+	 * @author gagamel
+	 * @since 2021. 3. 29
 	 */
-	public Collection<Plan> getPlanGoodsList(Plan plan) {
-		//plan.setSiteCd(TsfConstants.SITE_CD);
-		return planningDao.getPlanGoodsList(plan);
+	public Collection<Plan> getPlanningMainList(Plan plan) {
+		Collection<Plan> planningList = planningDao.getPlanningList(plan);
+
+		for (Plan tPlan : planningList) {
+			plan.setPlanSq(tPlan.getPlanSq());
+			tPlan.setPlanningGoodsList(planningDao.getPlanningGoodsList(plan));
+		}
+
+		return planningList;
 	}
-	
+
 	/**
 	 * 기획전 고객등급 목록
 	 *
@@ -96,13 +125,13 @@ public class TsfPlanningService {
 	 * @author sowon
 	 * @since 2021. 3. 9
 	 */
-	public void accessCustGrade(Plan plan){
+	public void accessCustGrade(Plan plan) {
 		if (!TsfSession.isLogin()) {
 			throw new IllegalArgumentException("로그인 후 접근이 가능합니다.");
 		}
-		
+
 	}
-	
+
 	/**
 	 * 기획전 상세 정보
 	 *
@@ -114,7 +143,7 @@ public class TsfPlanningService {
 	public Plan getPlanDetailInfo(Plan plan) {
 		return planningDao.getPlanDetailInfo(plan);
 	}
-	
+
 	/**
 	 * 기획전 상세 프론트소스
 	 *
@@ -126,7 +155,7 @@ public class TsfPlanningService {
 	public Plan getPlanFsrcInfo(Plan plan) {
 		return planningDao.getPlanFsrcInfo(plan);
 	}
-	
+
 	/**
 	 * 기획전 템플릿 순서
 	 *
@@ -138,7 +167,7 @@ public class TsfPlanningService {
 	public Collection<Plan> templateDispOrdInfo(Plan plan) {
 		return planningDao.templateDispOrdInfo(plan);
 	}
-	
+
 	/**
 	 * 기획전 템플릿 리뷰
 	 *
@@ -150,7 +179,7 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanReviewInfo(Review review) {
 		return planningDao.getPlanReviewInfo(review);
 	}
-	
+
 	/**
 	 * 기획전 템플릿 쿠폰
 	 *
@@ -163,7 +192,7 @@ public class TsfPlanningService {
 		coupon.setCustNo(TsfSession.getInfo().getCustNo());
 		return planningDao.getPlanCouponInfo(coupon);
 	}
-	
+
 	/**
 	 * 기획전 템플릿 이미지
 	 *
@@ -175,7 +204,7 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanImageInfo(Plan plan) {
 		return planningDao.getPlanImageInfo(plan);
 	}
-	
+
 	/**
 	 * 기획전 템플릿 상품1열
 	 *
@@ -187,7 +216,7 @@ public class TsfPlanningService {
 	public Collection<Plan> getPlanGoods1Info(Plan plan) {
 		return planningDao.getPlanGoods1Info(plan);
 	}
-	
+
 	/**
 	 * 상품 쿠폰 다운 처리
 	 *
@@ -201,8 +230,6 @@ public class TsfPlanningService {
 		return couponService.getPlanCouponInfo(coupon);
 	}
 
-
-
 	/**
 	 * 이벤트 갯수 조회
 	 * 
@@ -213,7 +240,7 @@ public class TsfPlanningService {
 	public int getEvnetAllCount(Plan plan) {
 		return planningDao.getEventAllCount(plan);
 	}
-	
+
 	/**
 	 * 이벤트 목록
 	 *
@@ -234,11 +261,11 @@ public class TsfPlanningService {
 	 * @author bin2107
 	 * @since 2021. 3. 26
 	 */
-	public Collection<Plan> getPlanningListForGoods(Plan plan){
-		Collection<Plan> planningList = planningDao.getPlanningList(plan);
-		for(Plan tempPlan : planningList){
-			tempPlan.setPlanningGoodsList(planningDao.getPlanningGoodsList(tempPlan));
-		}
+	public Collection<Plan> getPlanningListForGoods(Plan plan) {
+//		Collection<Plan> planningList = planningDao.getPlanningList(plan);
+//		for (Plan tempPlan : planningList) {
+//			tempPlan.setPlanningGoodsList(planningDao.getPlanningGoodsList(tempPlan));
+//		}
 		return null;
 	}
 }

+ 79 - 63
src/main/java/com/style24/front/biz/web/TsfPlanningController.java

@@ -1,11 +1,7 @@
 package com.style24.front.biz.web;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -16,24 +12,22 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
-import com.gagaframework.web.parameter.GagaMap;
-import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
-import com.style24.front.biz.service.TsfCouponService;
 import com.style24.front.biz.service.TsfPlanningService;
 import com.style24.front.support.controller.TsfBaseController;
 import com.style24.front.support.security.session.TsfSession;
-import com.style24.persistence.domain.Cate4Srch;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
-import com.style24.persistence.domain.Goods;
 import com.style24.persistence.domain.Plan;
 import com.style24.persistence.domain.Review;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+
 /**
  * 기획전 Controller
  * 
@@ -50,38 +44,61 @@ public class TsfPlanningController extends TsfBaseController {
 
 	@Autowired
 	private TsfPlanningService planningService;
-	
+
 	@Autowired
 	private TscCustomerService coreCustomerService;
-	
+
 	/**
 	 * 기획전 메인 화면
-	 * 
+	 * @param cateNo - 카테고리번호
 	 * @return
 	 * @author sowon
 	 * @since 2021. 3. 5
 	 */
 	@GetMapping("/main/form")
-	public ModelAndView PlanningMainForm(Plan plan) throws Exception {
-		ModelAndView mav = new ModelAndView();
-		Cate4Srch cate = new Cate4Srch();
-			
-		// 카테고리 
-		mav.addObject("categoryList", planningService.getPlanCate1(cate));
-		mav.addObject("cateNo", plan.getCateNo());		
-		
-		// 각 카테고리 기획전 갯수
-		mav.addObject("planCount",planningService.getPlanAllCount(plan));
-		
-		cate.setCate1No(plan.getCateNo());
-		mav.addObject("cateNm", planningService.getPlanCate1(cate).iterator().next().getCate1Nm());			
-				
-		mav.addObject("planList", planningService.getPlanList(plan));
-		mav.addObject("goodsList", planningService.getPlanGoodsList(plan));
-		mav.setViewName(super.getDeviceViewName("planning/PlanningMainForm"));
+	public ModelAndView planningMainForm(@RequestParam(value = "cateNo", required = false) Integer cateNo) {
+		ModelAndView mav = new ModelAndView(super.getDeviceViewName("planning/PlanningMainForm"));
+
+		Plan plan = new Plan();
+		plan.setSiteCd(TscConstants.Site.STYLE24.value());
+		plan.setFrontGb(TsfSession.getFrontGb());
+
+		// 기획전 카테고리 목록
+		mav.addObject("cateList", planningService.getPlanningCategoryList(plan));
+
+		mav.addObject("cateNo", cateNo);
+
+//		// 각 카테고리 기획전 갯수
+//		mav.addObject("planCount", planningService.getPlanAllCount(plan));
+//
+//		cate.setCate1No(plan.getCateNo());
+//		mav.addObject("cateNm", planningService.getPlanCate1(cate).iterator().next().getCate1Nm());
+//
+//		mav.addObject("planList", planningService.getPlanList(plan));
+//		mav.addObject("goodsList", planningService.getPlanGoodsList(plan));
+
 		return mav;
 	}
-	
+
+	/**
+	 * 기획전 메인 목록
+	 * @param plan - 기획전 정보
+	 * @return
+	 * @author gagamel
+	 * @since 2021. 3. 29
+	 */
+	@GetMapping("/main/list")
+	@ResponseBody
+	public Collection<Plan> getPlanningMainList(Plan plan) {
+		plan.setSiteCd(TscConstants.Site.STYLE24.value());
+		plan.setFrontGb(TsfSession.getFrontGb());
+		plan.setCustGb(TsfSession.getCustGb());
+		plan.setCustNo(TsfSession.isLogin() ? TsfSession.getInfo().getCustNo() : 0);
+		plan.setMaxRow(2);
+
+		return planningService.getPlanningMainList(plan);
+	}
+
 	/**
 	 * 기획전 접근확인
 	 * 
@@ -99,7 +116,7 @@ public class TsfPlanningController extends TsfBaseController {
 
 		return result;
 	}
-	
+
 	/**
 	 * 기획전 상세화면
 	 *
@@ -109,62 +126,62 @@ public class TsfPlanningController extends TsfBaseController {
 	 */
 	@GetMapping("/detail/form")
 	@ResponseBody
-	public ModelAndView PlanningDetailForm(@RequestParam(value="planSq") int planSq) throws Exception {
-		
+	public ModelAndView PlanningDetailForm(@RequestParam(value = "planSq") int planSq) throws Exception {
+
 		ModelAndView mav = new ModelAndView();
 		Plan plan = new Plan();
 		Review review = new Review();
 		Coupon coupon = new Coupon();
-		
+
 		// 기본 set
 		plan.setPlanSq(planSq);
 		review.setPlanSq(planSq);
 		coupon.setPlanSq(planSq);
-		
+
 		planningService.accessCustGrade(plan);
 		// 이거 access로 옮겨야 하나..?
 		//plan.setSiteCd(TscConstants.Site.STYLE24.value());
 		plan.setFrontGb(TsfSession.getFrontGb());
-		
+
 		Plan planInfo = planningService.getPlanDetailInfo(plan);
 		mav.addObject("planInfo", planInfo);
 
-		mav.addObject("planCount",planningService.getPlanAllCount(plan));
-		
+		mav.addObject("planCount", planningService.getPlanAllCount(plan));
+
 		// 상단소스
 		plan.setFrontGb("T");
 		mav.addObject("fsrcInfoTop", planningService.getPlanFsrcInfo(plan));
-		
+
 		// 하단소스
 		plan.setFrontGb("B");
 		mav.addObject("fsrcInfoBtm", planningService.getPlanFsrcInfo(plan));
-		
+
 		// 템플릿 순서
-		mav.addObject("templateOrd",planningService.templateDispOrdInfo(plan));
-		
+		mav.addObject("templateOrd", planningService.templateDispOrdInfo(plan));
+
 		// 리뷰
-		mav.addObject("reviewInfo",planningService.getPlanReviewInfo(review));
-		
+		mav.addObject("reviewInfo", planningService.getPlanReviewInfo(review));
+
 		// 쿠폰
-		mav.addObject("couponInfo",planningService.getPlanCouponInfo(coupon));
-		
+		mav.addObject("couponInfo", planningService.getPlanCouponInfo(coupon));
+
 		// 이미지
-		mav.addObject("imageInfo",planningService.getPlanImageInfo(plan));
-		
+		mav.addObject("imageInfo", planningService.getPlanImageInfo(plan));
+
 		// 상품1열 전시
 		plan.setTmplType("G082_50");
-		mav.addObject("goods1Info",planningService.getPlanGoods1Info(plan));
-		
+		mav.addObject("goods1Info", planningService.getPlanGoods1Info(plan));
+
 		// 상품2열 전시
 		plan.setTmplType("G082_51");
-		mav.addObject("goods2Info",planningService.getPlanGoods1Info(plan));
-		
+		mav.addObject("goods2Info", planningService.getPlanGoods1Info(plan));
+
 		//상품4열 전시
 		plan.setTmplType("G082_52");
-		mav.addObject("goods4Info",planningService.getPlanGoods1Info(plan));
-				
+		mav.addObject("goods4Info", planningService.getPlanGoods1Info(plan));
+
 		// 다른기획전 보기 
-		mav.addObject("planList", planningService.getPlanList(plan));
+		mav.addObject("planList", planningService.getPlanningList(plan));
 //
 //		mav.addObject("couponList", planningService.getPlusCouponList(plan));
 //
@@ -189,7 +206,7 @@ public class TsfPlanningController extends TsfBaseController {
 		mav.setViewName(super.getDeviceViewName("planning/PlanningDetailForm"));
 		return mav;
 	}
-	
+
 	/**
 	 * 기획전 쿠폰 다운로드. 고객이 상품쿠폰 다운로드 시 발급됨.
 	 *
@@ -230,7 +247,6 @@ public class TsfPlanningController extends TsfBaseController {
 		return result;
 	}
 
-	
 	/**
 	 * 이벤트 메인 화면
 	 * 
@@ -241,16 +257,16 @@ public class TsfPlanningController extends TsfBaseController {
 	@GetMapping("/event/main/form")
 	public ModelAndView PlanningEventMainForm(Plan plan) throws Exception {
 		ModelAndView mav = new ModelAndView();
-		
+
 		// 디바이스 set
 		//plan.setFrontGb(TsfSession.getFrontGb());
-		
+
 		// 이벤트 갯수
-		mav.addObject("cnt",planningService.getEvnetAllCount(plan));
-		
+		mav.addObject("cnt", planningService.getEvnetAllCount(plan));
+
 		// 이벤트 목록
-		mav.addObject("evnetList",planningService.getPlanEventList(plan));		
-		
+		mav.addObject("evnetList", planningService.getPlanEventList(plan));
+
 		mav.setViewName(super.getDeviceViewName("planning/PlanningEventMainForm"));
 		return mav;
 	}

+ 286 - 282
src/main/java/com/style24/persistence/domain/Plan.java

@@ -1,6 +1,5 @@
 package com.style24.persistence.domain;
 
-
 import java.util.Collection;
 import java.util.List;
 
@@ -19,286 +18,291 @@ import lombok.Data;
 
 @SuppressWarnings("serial")
 @Data
-public class Plan extends TscBaseDomain{
+public class Plan extends TscBaseDomain {
+
 	// 기획전
-		private Integer planSq;				//기획전일련번호(SeqPlan sequence)
-		private String planNm;				//기획전명
-		private String planGb;				//기획전구분(P:기획전private String  E:이벤트)
-		private String custGb;				//고객구분
-		private String custGrade;			//회원등급
-		private String planSnm;				//검색어
-		private String templateType;		//템플릿유형(H:Htmlprivate String  T:텍스트)
-		private String siteCd;				//사이트코드(공통코드g000)
-		private String frontGb;				//프론트구분(A:All, P:웹, M:모바일)
-		private String dispStdt;			//기획전 시작일시
-		private String dispEddt;			//기획전 종료일시
-		private String mainPimg;			//메인이미지(Pc)
-		private String mainMimg;			//메인이미지(모바일)
-		private String dtlPimg;				//상세이미지(Pc)
-		private String dtlMimg;				//상세이미지(모바일)
-		private String orgMainPimg;			//원본메인이미지(Pc)
-		private String orgMainMimg;			//원본메인이미지(모바일)
-		private String orgDtlPimg;			//원본상세이미지(Pc)
-		private String orgDtlMimg;			//원본상세이미지(모바일)
-		private String orgMainPimgDelYn;	//원본메인이미지(Pc) 삭제여부
-		private String orgMainMimgDelYn;	//원본메인이미지(모바일) 삭제여부
-		private String orgDtlPimgDelYn;		//원본상세이미지(Pc) 삭제여부
-		private String orgDtlMimgDelYn;		//원본상세이미지(모바일) 삭제여부
-		private String dtlTitle1;			//상세제목1
-		private String dtlTitle2;			//상세제목2
-		private String cateCd;				//카테고리코드(대/중/소/세카테고리)
-		private String cateDispYn;			//카테고리전시여부(Y:전시)
-		private String replyYn;				//댓글여부(Y:댓글)
-		private String replyLoc;			//댓글위치(U:상품리스트상단 D:상품리스트하단)
-		private String replyImg;			//댓글이미지
-		private String orgReplyImg;			//원본댓글이미지
-		private String replyTitle1;			//댓글제목1
-		private String replyTitle2;			//댓글제목2
-		private String devUrl;				//호출 URL
-		private String orgReplyImgDelYn;	//원본댓글이미지 삭제여부
-		private String cornerNmDispYn;		//코너명노출여부(Y:노출)
-		private String goodsLimitYn;		//상품등록제한여부(Y:상품등록제한)
-		private String goodsLimitQty;		//상품등록제한수(상품등록제한여부가 "Y"일 떄)
-		private String delYn;				//삭제여부(Y:삭제)
-		private String openYn;				//오픈여부(Y:오픈)
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private long[] dispOrdArr;			// 표시순서 배열
-		private long dispOrd;				//표시순서
-		private long readCnt;				//조회수
-		private Integer pollSq;				//투표일련번호
-		private String badgeNm;				//뱃지이름
-		private String badgeFcolor;			//뱃지글자컬러
-		private String badgeBcolor;			//뱃지배경컬러
-		private String privacyPolicy;		//개인정보수집동의정책
-
-		// 기획전 소스
-		private Integer seq;					//일련번호
-		private String fsrcPc;				//프론트소스(pc)	/ 화면용
-		private String fsrcMob;			//프론트소스(모바일)	/ 화면용
-		private String locGb;			//위치구분(T:상단 / B:하단)
-
-		// 기획전 상세
-		private Integer planDtlSq;				//기획전상세일련번호(SEQ_PLAN_DTL sequence)
-		private Integer copyPlanDtlSq;			//복사할 상세 일련번호
-		private Integer copyPlanSq;			//복사할 일련번호
-		private String copyMode;			//복사 선택(CORNER:코너복사, PLAN:기획전복사)
-		private String cornerDispType;		//코너노출유형(공통코드G045) (2:2컷 , 3:3컷, 4:4컷)
-		private String cornerNm;			//코너 명
-		private String planDtlStat;			//기획전상세상태(공통코드G044)
-		private String copyBrandCd;	        //복사할 브랜드코드
-		private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
-		// 기획전 브랜드
-		private String brandGroupNo;	//기획전브랜드그룹번호
-		private String DispYn;      	//표시여부           
-		private String brandGroupKnm; 	// 브랜드 그룹명(한글)
-		private String brandGroupEnm; 	// 브랜드 그룹명(영어)
-		/* Multi CheckBox 항목*/
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiBrand;
-		private String[] multiCate;
-		
-		// 코너
-		private String cateGb;		// 카테고리구분
-		private String cateNm;		// 카테고리명
-		private Integer cateNo;		// 카테고리번호
-		
-		// 고객등급
-		private String custGradeName;	// 접근가능고객 등급 네임
-		
-		
-		// 기획전 응모
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] planQtitle;
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] attachYn;
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] planAnswerSq;
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] answer;
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] sysFileNm;
-
-		//private Collection<TsaPlanQuestAnswer> planQuestAnswerList; // 고시항목
-
-		// 검색
-		private String startSearchDate;		// 진행기간 시작일
-		private String startSearchTime;		// 진행기간 시작시간
-		private String endSearchDate;		// 진행기간 종료일
-		private String endSearchTime;		// 진행기간 종료시간
-		private String excelFileNm;			// 엑셀 파일 명
-		//private int startRow;				// 페이징 시작
-		//private int endRow;					// 피이징 종료
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] siteCds;			// 사이트
-
-		// 코너 상품
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] goodsCdArr;		// 상품 코드 배열
-		private String goodsCd;				// 상품 코드
-		private String goodsNm;				// 상품 명
-		private String goodsStat;			// 제품상태
-		private String imgType;				// 이미지 타입
-		private String imgPath1;			// 이미지 경로1
-		private String imgPath2;			// 이미지 경로2
-		private String imgPath4;			// 이미지 경로4
-		private String imgPath5;			// 이미지 경로5
-		private String imgPath6;			// 이미지 경로6
-		private String dcRate;				// 할인율
-		private String listPrice;			// 최소 소비자가
-		private String tagPrice;			// tag 가
-		private String currPrice;			// 판매가
-		private String supplyCompCd;		// 업체코드
-		private String supplyCompNm;		// 업체명
-		private String formalGb;			// 정상/이월 여부
-		private String currStockQty;		// 재고
-		private String pageYn;				// 페이징 사용 여부
-		private String changeGb;			// 순서변경 updown 구분
-		private int stockQtySum;			// 재고
-		private String afLinkCd;			// 제휴채널
-		private String afChannel;			// 제휴채널 공통코드
-		private String afLinkNm;			// 제휴채널 명
-
-		// 기획전 팝업
-		private String callBackFun;			// 콜백함수명
-		private String popupDispStdt;		//기획전 시작일시
-		private String popupDispEddt;		//기획전 종료일시
-		
-		//기획전 템플릿
-		private Integer planContSq;			// 기획전 컨텐츠 일련번호
-		private String tmplType;			//템플릿 유형(공통코드 G082)
-		private String title;				//타이틀
-		private String linkUrl;				//링크url
-		private String dispYn;				//표시여부
-		private Integer planContItemSq;		//기획전 컨텐프 아이템 일련번호
-		private String itemVal;				//아이템값(상품코드, 이미지파일명 등)
-		private String reviewDispStdt;		//리뷰노출시작일시
-		private String reviewDispEddt;		//리뷰노툴종료일시
-		
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanReview;		//리뷰상품목록
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanReviewStartD;		//리뷰시작날짜
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanReviewStartT;		//리뷰시작시간
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanReviewEndD;		//리뷰종료날짜
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanReviewEndT;		//리뷰종료시간
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanCoupon;		//쿠폰목록
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiPlanFile;			//이미지목록
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] multiChannel;			//제휴채널목록
-		
-
-		
-		// 템플릿 저장하기 위한 임시 변수
-		private String reTitle;				//리뷰타이틀
-		private String mode;				//모드
-		private long reDispOrd;				//리뷰전시순서
-		private String reItemVal;			//리뷰아이템
-		private String reDispYn;			//리뷰전시여부
-		private String reItemNm;			//리뷰상품이름
-		private Integer rePlanContSq;		//리뷰 컨텐츠일련번호
-		
-		private String cuTitle;				//쿠폰타이틀
-		private long cuDispOrd;				//쿠폰전시순서
-		private String cuDispYn;			//쿠폰전시여부
-		private String cuItemVal;			//쿠폰 아이템
-		private String cuItemNm;			//쿠폰 아이템 이름
-		private Integer cuPlanContSq;		//쿠폰 컨텐츠일련번호
-		
-		private String fileItemVal;			//파일아이템
-		private String fileDispYn;			//파일전시여부
-		private long fileDispOrd;			//파일전시순서
-		private Integer filePlanContSq;		//파일 컨텐츠일련번호
-		
-		private String topFsrcDispYn;		//html상단 전시여부
-		private String BtmFsrcDispYn;		//html하단 전시여부
-		private long   topFsrcDispOrd;		//html상단 전시순서
-		private long   btmFsrcDispOrd;		//html하단 전시순서
-		private String fsrcPcTop;			//html상단 내용(pc)
-		private String fsrcMobileTop;	    //html상단 내용(mobile)
-		private String fsrcPcBtm;			//html하단 내용(pc)
-		private String fsrcMobileBtm;		//html하단 내용(pc)
-		
-		private String goodsTitle;			//상품타이틀
-		private String goodsUrl;			//상품 url
-		private String goodsDispYn;			//상품전시여부
-		private long goodsDispOrd;			//상품 전시순서
-		private String goodsType;			//상품노출순서
-		private String goodsItemVal;		//상품아이템
-		private String brandEnm;			//브랜드명
-		private Integer goodsPlanContSq;	//상품 컨텐츠일련번호
-		
-		private String brand;				// 기획전 리스트 (브랜드 명 외)
-		private String newPlan;				// 기획전 new 확인
-		private int cnt;					// 기획전 브랜드 카운트;
-		private String brandKnm;
-		
-		private String sysImgNm;			// 상품 이미지
-		// Pagination
-		private TscPageRequest pageable;
-		private int pageNo = 1;
-		private int pageSize = 50;
-		private int pageUnit = 10;
-		
-		private String condition; // 키워드 종류
-		private String search; // 검색어
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		private String[] conditionList;
-		
-		 // 사용가능고객등급
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	    private String[] usableCustGradeArr;
-		
-	    // 사용가능고객구분
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-	    private String[] usableCustGbArr;
-	    
-	    
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent1; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent2; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent3; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent4; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent5; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent6; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent7; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent8; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent9; 
-	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContent10; 
-	    
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal1; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal2; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal3; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal4; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal5; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal6; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal7; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal8; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal9; 
-		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
-		List<Plan> multiPlanGoodsContentVal10;
-
-		Collection<Plan> planningGoodsList;	//베너별 상품목록
+	private Integer planSq;			//기획전일련번호(SeqPlan sequence)
+	private String planNm;			//기획전명
+	private String planGb;			//기획전구분(P:기획전, E:이벤트)
+	private Integer custNo;			//고객번호
+	private String custGb;			//고객구분
+	private String custGrade;		//회원등급
+	private String planSnm;			//검색어
+	private String templateType;	//템플릿유형(H:Html, T:텍스트)
+	private String siteCd;			//사이트코드(공통코드g000)
+	private String frontGb;			//프론트구분(A:All, P:웹, M:모바일)
+	private String dispStdt;		//기획전 시작일시
+	private String dispEddt;		//기획전 종료일시
+	private String mainImg;			//메인이미지
+	private String mainPimg;		//메인이미지(Pc)
+	private String mainMimg;		//메인이미지(모바일)
+	private String dtlPimg;			//상세이미지(Pc)
+	private String dtlMimg;			//상세이미지(모바일)
+	private String orgMainPimg;		//원본메인이미지(Pc)
+	private String orgMainMimg;		//원본메인이미지(모바일)
+	private String orgDtlPimg;		//원본상세이미지(Pc)
+	private String orgDtlMimg;		//원본상세이미지(모바일)
+	private String orgMainPimgDelYn;//원본메인이미지(Pc) 삭제여부
+	private String orgMainMimgDelYn;//원본메인이미지(모바일) 삭제여부
+	private String orgDtlPimgDelYn;	//원본상세이미지(Pc) 삭제여부
+	private String orgDtlMimgDelYn;	//원본상세이미지(모바일) 삭제여부
+	private String dtlTitle1;		//상세제목1
+	private String dtlTitle2;		//상세제목2
+	private String cateCd;			//카테고리코드(대/중/소/세카테고리)
+	private String cateDispYn;		//카테고리전시여부(Y:전시)
+	private String replyYn;			//댓글여부(Y:댓글)
+	private String replyLoc;		//댓글위치(U:상품리스트상단 D:상품리스트하단)
+	private String replyImg;		//댓글이미지
+	private String orgReplyImg;		//원본댓글이미지
+	private String replyTitle1;		//댓글제목1
+	private String replyTitle2;		//댓글제목2
+	private String devUrl;			//호출 URL
+	private String orgReplyImgDelYn;//원본댓글이미지 삭제여부
+	private String cornerNmDispYn;	//코너명노출여부(Y:노출)
+	private String goodsLimitYn;	//상품등록제한여부(Y:상품등록제한)
+	private String goodsLimitQty;	//상품등록제한수(상품등록제한여부가 "Y"일 떄)
+	private String delYn;			//삭제여부(Y:삭제)
+	private String openYn;			//오픈여부(Y:오픈)
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private long[] dispOrdArr;		//표시순서 배열
+	private long dispOrd;			//표시순서
+	private long readCnt;			//조회수
+	private Integer pollSq;			//투표일련번호
+	private String badgeNm;			//뱃지이름
+	private String badgeFcolor;		//뱃지글자컬러
+	private String badgeBcolor;		//뱃지배경컬러
+	private String privacyPolicy;	//개인정보수집동의정책
+
+	// 기획전 소스
+	private Integer seq;			//일련번호
+	private String fsrcPc;			//프론트소스(pc)	/ 화면용
+	private String fsrcMob;			//프론트소스(모바일)	/ 화면용
+	private String locGb;			//위치구분(T:상단 / B:하단)
+
+	// 기획전 상세
+	private Integer planDtlSq;		//기획전상세일련번호(SEQ_PLAN_DTL sequence)
+	private Integer copyPlanDtlSq;	//복사할 상세 일련번호
+	private Integer copyPlanSq;		//복사할 일련번호
+	private String copyMode;		//복사 선택(CORNER:코너복사, PLAN:기획전복사)
+	private String cornerDispType;	//코너노출유형(공통코드G045) (2:2컷 , 3:3컷, 4:4컷)
+	private String cornerNm;		//코너 명
+	private String planDtlStat;		//기획전상세상태(공통코드G044)
+	private String copyBrandCd;		//복사할 브랜드코드
+	private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
+
+	// 기획전 브랜드
+	private Integer brandGroupNo;	//기획전브랜드그룹번호
+	private String DispYn;      	//표시여부           
+	private String brandGroupKnm; 	//브랜드 그룹명(한글)
+	private String brandGroupEnm; 	//브랜드 그룹명(영어)
+	/* Multi CheckBox 항목*/
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;
+	private String[] multiCate;
+
+	// 코너
+	private String cateGb;			// 카테고리구분
+	private String cateNm;			// 카테고리명
+	private Integer cateNo;			// 카테고리번호
+
+	// 고객등급
+	private String custGradeName;	// 접근가능고객 등급 네임
+
+	// 기획전 응모
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] planQtitle;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] attachYn;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] planAnswerSq;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] answer;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] sysFileNm;
+
+	//private Collection<TsaPlanQuestAnswer> planQuestAnswerList; // 고시항목
+
+	// 검색
+	private String startSearchDate;		// 진행기간 시작일
+	private String startSearchTime;		// 진행기간 시작시간
+	private String endSearchDate;		// 진행기간 종료일
+	private String endSearchTime;		// 진행기간 종료시간
+	private String excelFileNm;			// 엑셀 파일 명
+	//private int startRow;				// 페이징 시작
+	//private int endRow;					// 피이징 종료
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] siteCds;			// 사이트
+
+	// 코너 상품
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] goodsCdArr;		// 상품 코드 배열
+	private String goodsCd;				// 상품 코드
+	private String goodsNm;				// 상품 명
+	private String goodsStat;			// 제품상태
+	private String imgType;				// 이미지 타입
+	private String imgPath1;			// 이미지 경로1
+	private String imgPath2;			// 이미지 경로2
+	private String imgPath4;			// 이미지 경로4
+	private String imgPath5;			// 이미지 경로5
+	private String imgPath6;			// 이미지 경로6
+	private String dcRate;				// 할인율
+	private String listPrice;			// 최소 소비자가
+	private String tagPrice;			// tag 가
+	private String currPrice;			// 판매가
+	private String supplyCompCd;		// 업체코드
+	private String supplyCompNm;		// 업체명
+	private String formalGb;			// 정상/이월 여부
+	private String currStockQty;		// 재고
+	private String pageYn;				// 페이징 사용 여부
+	private String changeGb;			// 순서변경 updown 구분
+	private int stockQtySum;			// 재고
+	private String afLinkCd;			// 제휴채널
+	private String afChannel;			// 제휴채널 공통코드
+	private String afLinkNm;			// 제휴채널 명
+
+	// 기획전 팝업
+	private String callBackFun;			// 콜백함수명
+	private String popupDispStdt;		//기획전 시작일시
+	private String popupDispEddt;		//기획전 종료일시
+
+	//기획전 템플릿
+	private Integer planContSq;			// 기획전 컨텐츠 일련번호
+	private String tmplType;			//템플릿 유형(공통코드 G082)
+	private String title;				//타이틀
+	private String linkUrl;				//링크url
+	private String dispYn;				//표시여부
+	private Integer planContItemSq;		//기획전 컨텐프 아이템 일련번호
+	private String itemVal;				//아이템값(상품코드, 이미지파일명 등)
+	private String reviewDispStdt;		//리뷰노출시작일시
+	private String reviewDispEddt;		//리뷰노툴종료일시
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanReview;		//리뷰상품목록
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanReviewStartD;		//리뷰시작날짜
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanReviewStartT;		//리뷰시작시간
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanReviewEndD;		//리뷰종료날짜
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanReviewEndT;		//리뷰종료시간
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanCoupon;		//쿠폰목록
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiPlanFile;			//이미지목록
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiChannel;			//제휴채널목록
+
+	// 템플릿 저장하기 위한 임시 변수
+	private String reTitle;				//리뷰타이틀
+	private String mode;				//모드
+	private long reDispOrd;				//리뷰전시순서
+	private String reItemVal;			//리뷰아이템
+	private String reDispYn;			//리뷰전시여부
+	private String reItemNm;			//리뷰상품이름
+	private Integer rePlanContSq;		//리뷰 컨텐츠일련번호
+
+	private String cuTitle;				//쿠폰타이틀
+	private long cuDispOrd;				//쿠폰전시순서
+	private String cuDispYn;			//쿠폰전시여부
+	private String cuItemVal;			//쿠폰 아이템
+	private String cuItemNm;			//쿠폰 아이템 이름
+	private Integer cuPlanContSq;		//쿠폰 컨텐츠일련번호
+
+	private String fileItemVal;			//파일아이템
+	private String fileDispYn;			//파일전시여부
+	private long fileDispOrd;			//파일전시순서
+	private Integer filePlanContSq;		//파일 컨텐츠일련번호
+
+	private String topFsrcDispYn;		//html상단 전시여부
+	private String BtmFsrcDispYn;		//html하단 전시여부
+	private long topFsrcDispOrd;		//html상단 전시순서
+	private long btmFsrcDispOrd;		//html하단 전시순서
+	private String fsrcPcTop;			//html상단 내용(pc)
+	private String fsrcMobileTop;	    //html상단 내용(mobile)
+	private String fsrcPcBtm;			//html하단 내용(pc)
+	private String fsrcMobileBtm;		//html하단 내용(pc)
+
+	private String goodsTitle;			//상품타이틀
+	private String goodsUrl;			//상품 url
+	private String goodsDispYn;			//상품전시여부
+	private long goodsDispOrd;			//상품 전시순서
+	private String goodsType;			//상품노출순서
+	private String goodsItemVal;		//상품아이템
+	private String brandEnm;			//브랜드명
+	private Integer goodsPlanContSq;	//상품 컨텐츠일련번호
+
+	private String brand;				// 기획전 리스트 (브랜드 명 외)
+	private String newYn;				// 기획전 신규여부
+	private int endDays;				// 종료임박일수
+	private int cnt;					// 기획전 브랜드 카운트;
+	private String brandKnm;
+
+	private String sysImgNm;			// 상품 이미지
+	// Pagination
+	private TscPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
+	private String condition; // 키워드 종류
+	private String search; // 검색어
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] conditionList;
+
+	// 사용가능고객등급
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] usableCustGradeArr;
+
+	// 사용가능고객구분
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] usableCustGbArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent1;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent2;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent3;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent4;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent5;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent6;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent7;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent8;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent9;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContent10;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal1;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal2;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal3;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal4;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal5;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal6;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal7;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal8;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal9;
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<Plan> multiPlanGoodsContentVal10;
+
+	Collection<Plan> planningGoodsList;	//베너별 상품목록
+
+	private String likeIt;	// 위시리스트담은상품
+	private int maxRow;		// 최대ROW수
+
 }

+ 199 - 202
src/main/java/com/style24/persistence/mybatis/shop/TsfPlanning.xml

@@ -14,21 +14,35 @@
 		WHERE  NUMB BETWEEN #{pageable.startRow} AND #{pageable.endRow}
 	</sql>
 	
-	<select id="getPlanCate1" resultType="Cate4Srch" parameterType="Cate4Srch">
-		/* TsfPlanning.getPlanCate1 */
-		SELECT CATE1_NO 
-      		  ,CATE1_NM 
-		      ,CATE_GB 
-		      ,CATE_TYPE 
-		      ,CONTENTS_LOC 
-		      ,FORMAL_GB 
-		      ,DISP_ORD 
-		      ,DISP_YN 
-	   FROM TB_CATE1
-	   WHERE 1=1
-	   	<if test="cate1No != null and cate1No != ''">
-	   	AND CATE1_NO = #{cate1No}
-	   	</if>
+	<!-- 기획전 카테고리 목록 -->
+	<select id="getPlanningCategoryList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanningCategoryList */
+		SELECT PL.CATE_NO             /*카테고리번호*/
+		     , C1.CATE1_NM AS CATE_NM /*카테고리명*/
+		FROM   TB_PLAN P
+		     , TB_PLAN_CATE PL
+		     , TB_CATE1 C1
+		WHERE  P.PLAN_SQ = PL.PLAN_SQ
+		AND    PL.CATE_NO = C1.CATE1_NO
+		AND    P.PLAN_GB = 'P' /*기획전*/
+		AND    P.SITE_CD = #{siteCd}
+		<if test="frontGb != null and frontGb != ''">
+		    <if test='frontGb == "P"'> <!-- PC웹 -->
+		AND    P.FRONT_GB IN ('A','P')
+		    </if>
+		    <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
+		AND    P.FRONT_GB IN ('A','M')
+		    </if>
+		</if>
+		AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
+		AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
+		AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
+		AND    PL.DISP_YN = 'Y' /*전시하는 기획전카테고리*/
+		AND    C1.SITE_CD = #{siteCd}
+		AND    C1.CATE_GB = 'G032_101' /*BYITEM*/
+		AND    C1.CATE_TYPE = 'G031_10' /*상품카테고리*/
+		AND    C1.DISP_YN = 'Y' /*전시하는 카테고리*/
+		ORDER  BY C1.DISP_ORD
 	</select>
 	
 	<select id="getPlanAllCount" resultType="int" parameterType="Plan">
@@ -51,137 +65,177 @@
 	</select>
 	
 	<!-- 기획전 목록 -->
-	<select id="getPlanList" parameterType="Plan" resultType="Plan">
-		/* TsfPlanning.getPlanList */
-		SELECT P1.PLAN_SQ 
-		      ,P1.PLAN_NM 
-		      ,P1.DTL_TITLE1 
-		      ,P1.PLAN_GB 
-		      ,P1.FRONT_GB 
-		      ,P1.MAIN_PIMG 
-		      ,P1.MAIN_MIMG 
-		      ,P1.DISP_ORD
-		      ,P1.NEW_PLAN
-		      ,P1.DISP_STDT
-		      ,P1.DISP_EDDT
-		      ,P1.REG_NO 
-		      ,P2.BRAND
-		      ,P2.CNT
-		FROM 
-		(
-			SELECT P.PLAN_SQ 
-			      ,P.PLAN_NM 
-			      ,P.DTL_TITLE1 
-			      ,P.PLAN_GB 
-			      ,P.FRONT_GB 
-			      ,P.MAIN_PIMG 
-			      ,P.MAIN_MIMG 
-			      ,P.DISP_ORD 
-			      ,P.REG_NO 
-			      ,CASE WHEN DATE(P.REG_DT) BETWEEN DATE_ADD(NOW(),INTERVAL -3 DAY ) AND NOW() THEN 'NEW' END AS 'NEW_PLAN'   /*등록일 기준 3일 */
-			      ,P.DISP_EDDT 
-			      ,P.DISP_STDT 
-			      ,P.DEL_YN 
-			      ,P.OPEN_YN 
-			FROM TB_PLAN P
-			GROUP BY  P.PLAN_SQ 
-			      ,P.PLAN_NM 
-			      ,P.DTL_TITLE1 
-			      ,P.PLAN_GB 
-			      ,P.FRONT_GB 
-			      ,P.MAIN_PIMG 
-			      ,P.MAIN_MIMG 
-			      ,P.DISP_ORD 
-			      ,P.REG_NO
-		)P1 LEFT JOIN (
-						SELECT  PB.PLAN_SQ 
-						      , COUNT(PLAN_SQ) AS CNT
-						      ,CASE WHEN COUNT(PLAN_SQ) = 1 THEN MAX(TBG.BRAND_GROUP_KNM) ELSE MAX(TBG.BRAND_GROUP_KNM)END AS BRAND
-						FROM TB_PLAN_BRAND PB INNER JOIN TB_BRAND_GROUP TBG  ON PB.BRAND_GROUP_NO = TBG.BRAND_GROUP_NO
-						GROUP BY PB.PLAN_SQ
-						)P2 ON P1.PLAN_SQ = P2.PLAN_SQ
-		WHERE 1=1
-		  AND P1.DEL_YN = 'N'
-		  AND P1.PLAN_GB = 'P'
-		  AND P1.OPEN_YN = 'Y'
-		  AND NOW() BETWEEN P1.DISP_STDT AND P1.DISP_EDDT
-	   	<if test="planSq != null and planSq != ''">
-			AND P1.PLAN_SQ != #{planSq}
-		</if>
-		 <!--  AND P1.FRONT_GB IN (#{frontGb}, 'A') -->
-		  <if test="cateNo != null and cateNo != ''">
-		  AND P1.PLAN_SQ IN (
-				   						SELECT PLAN_SQ 
-				   						FROM TB_PLAN_CATE 
-				   						
-				   						WHERE CATE_NO = #{cateNo}
-				   						
-				   					)
-		 </if>
-		ORDER BY P1.NEW_PLAN DESC, ABS(DATEDIFF(P1.DISP_EDDT,NOW())) 
+	<select id="getPlanningList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanningList */
+		SELECT PLAN_SQ
+		     , PLAN_NM
+		     , DTL_TITLE1
+		     , MAIN_IMG
+		     , NEW_YN
+		     , END_DAYS
+		FROM   (
+		        SELECT P.PLAN_SQ                                        /*기획전번호*/
+		             , P.PLAN_NM                                        /*기획전명*/
+		             , P.DTL_TITLE1                                     /*상세제목1*/
+		             , CASE WHEN #{frontGb} IN ('A','M') THEN P.MAIN_MIMG
+		                    ELSE P.MAIN_PIMG
+		               END                                  AS MAIN_IMG /*메인이미지*/
+		             , CASE WHEN TIMESTAMPDIFF(DAY,P.REG_DT,NOW()) <![CDATA[<=]]> 3 THEN
+		                        'Y'
+		                    ELSE
+		                        'N'
+		               END                                  AS NEW_YN   /*신규여부(등록일기준3일)*/
+		             , TIMESTAMPDIFF(DAY,NOW(),P.DISP_EDDT) AS END_DAYS /*종료임박일수*/
+		        FROM   TB_PLAN P
+		        WHERE  P.PLAN_GB = 'P' /*기획전*/
+		        AND    P.SITE_CD = #{siteCd}
+		        <if test="frontGb != null and frontGb != ''">
+		            <if test='frontGb == "P"'> <!-- PC웹 -->
+		        AND    P.FRONT_GB IN ('A','P')
+		            </if>
+		            <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
+		        AND    P.FRONT_GB IN ('A','M')
+		            </if>
+		        </if>
+		        AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
+		        AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
+		        AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
+		        <if test="cateNo != null and cateNo != ''">
+		        AND    P.PLAN_SQ IN (SELECT PLAN_SQ
+		                             FROM   TB_PLAN_CATE
+		                             WHERE  CATE_NO = #{cateNo}
+		                             AND    DISP_YN = 'Y' /*전시하는 기획전카테고리*/
+		                            )
+		        </if>
+		        <if test="brandGroupNo != null and brandGroupNo != ''"> <!-- 브랜드메인에서 사용 -->
+		        AND    P.PLAN_SQ IN (SELECT PLAN_SQ
+		                             FROM   TB_PLAN_BRAND
+		                             WHERE  BRAND_GROUP_NO = #{brandGroupNo}
+		                             AND    DISP_YN = 'Y' /*전시하는브랜드기획전*/
+		                            )
+		        </if>
+		       ) Z
+		ORDER  BY NEW_YN DESC, END_DAYS
 	</select>
 	
-		<!-- 기획전 상품 목록 -->
-	<select id="getPlanGoodsList" parameterType="Plan" resultType="Plan">
-			SELECT F.*
-			FROM
-			(
-				SELECT Z.* 
-				     , (CASE WHEN Z.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = Z.GOODS_CD) 
-							ELSE (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = Z.GOODS_CD) 
-							END) AS STOCK_QTY_SUM
-				     , ROW_NUMBER() OVER(PARTITION BY Z.PLAN_SQ ORDER BY Z.PLAN_SQ) AS RNUM
-				     , (SELECT MAX(SYS_IMG_NM) FROM TB_GOODS_IMG  WHERE GOODS_CD = Z.GOODS_CD AND DEFAULT_IMG_YN = 'Y' ) AS SYS_IMG_NM
-				FROM
-				(	
-					SELECT P.PLAN_SQ 
-					      ,P.PLAN_NM 
-					      ,PD.CORNER_NM 
-					      ,PD.DISP_STDT 
-					      ,PD.DISP_EDDT 
-					      ,PD.DISP_YN 
-					      ,PD.PLAN_DTL_SQ 
-					      ,PD.DISP_ORD 
-					      ,PG.GOODS_CD 
-					      ,PG.DEL_YN 
-					      ,TG.GOODS_TYPE 
-					      ,TG.GOODS_NM 
-					      ,TG.LIST_PRICE 
-					      ,TG.CURR_PRICE                                                                 
-					      ,TG.DC_RATE
-					      ,CASE TG.FORMAL_GB WHEN 'G009_20' THEN '이월' ELSE '정상' END AS FORMAL_GB                                                                 
-						  ,TG.SEASON_CD       
-						  , (SELECT SUPPLY_COMP_NM
-						 	 FROM   TB_SUPPLY_COMPANY
-						     WHERE  SUPPLY_COMP_CD = TG.SUPPLY_COMP_CD
-							) AS SUPPLY_COMP_NM                                                           
-						  ,TG.ERP_STOCK_LINK_YN                                                          
-						  ,TG.ERP_PRICE_LINK_YN                                                                                                                  
-						  ,TG.NEW_CUST_ORD_YN                                                            
-						  ,TG.DELV_FEE_CD                                                                
-						  ,TG.FRST_CFRM_DT                  
-						  ,TG.PRICE_UPD_DT             
-					FROM TB_PLAN P INNER JOIN TB_PLAN_DETAIL PD ON P.PLAN_SQ = PD.PLAN_SQ 
-					               INNER JOIN TB_PLAN_GOODS PG ON PD.PLAN_DTL_SQ = PG.PLAN_DTL_SQ 
-					               INNER JOIN TB_GOODS TG  ON PG.GOODS_CD = TG.GOODS_CD 
-					WHERE 1=1
-					 AND NOW() BETWEEN PD.DISP_STDT AND PD.DISP_EDDT 
-					 AND PD.DISP_YN = 'Y'
-					 AND PG.DEL_YN = 'N'
-					 AND P.PLAN_GB = 'P'
-					 <if test="cateNo != null and cateNo != ''">
-				     AND P.PLAN_SQ IN (
-				   						SELECT PLAN_SQ 
-				   						FROM TB_PLAN_CATE 
-				   						 
-				   						WHERE CATE_NO = #{cateNo}
-				   						
-				   	 					)
-				   	 </if>
-				)Z
-				ORDER BY Z.DISP_ORD ASC, STOCK_QTY_SUM DESC
-			)F
-			WHERE F.RNUM IN (1,2)
+	<!-- 기획전 상품 목록 -->
+	<select id="getPlanningGoodsList" parameterType="Plan" resultType="Plan">
+		/* TsfPlanning.getPlanningGoodsList */
+		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 != ''">
+		        <if test='frontGb == "P"'> <!-- PC웹 -->
+		    AND    P.FRONT_GB IN ('A','P')
+		        </if>
+		        <if test='frontGb == "A" or frontGb == "M"'> <!-- 모바일 -->
+		    AND    P.FRONT_GB IN ('A','M')
+		        </if>
+		    </if>
+		    AND    NOW() BETWEEN P.DISP_STDT AND P.DISP_EDDT
+		    AND    P.DEL_YN = 'N' /*삭제안된 기획전*/
+		    AND    P.OPEN_YN = 'Y' /*오픈된 기획전*/
+		    <if test="cateNo != null and cateNo != ''">
+		    AND    P.PLAN_SQ IN (SELECT PLAN_SQ
+		                         FROM   TB_PLAN_CATE
+		                         WHERE  CATE_NO = #{cateNo}
+		                         AND    DISP_YN = 'Y' /*전시하는 기획전카테고리*/
+		                        )
+		    </if>
+		    <if test="brandGroupNo != null and brandGroupNo != ''"> <!-- 브랜드메인에서 사용 -->
+		    AND    P.PLAN_SQ IN (SELECT PLAN_SQ
+		                         FROM   TB_PLAN_BRAND
+		                         WHERE  BRAND_GROUP_NO = #{brandGroupNo}
+		                         AND    DISP_YN = 'Y' /*전시하는브랜드기획전*/
+		                        )
+		    </if>
+		    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'
+		)
+		, 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,'','','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>
 	</select>
 	
 	<!-- 기획전 상세정보 -->
@@ -612,61 +666,4 @@
 		 )Z
 	</select>
 
-	<select id="getPlanningList" parameterType="Plan" resultType="Plan">
-		/* TsfPlanning.getPlanningList */
-		SELECT    A.PLAN_SQ
-			 , B.BRAND_GROUP_NO
-			 , A.PLAN_NM
-			 , A.PLAN_GB
-			 , A.FRONT_GB
-			 , A.DISP_STDT
-			 , A.DISP_EDDT
-			 , A.MAIN_PIMG
-			 , A.MAIN_MIMG
-			 , A.DTL_PIMG
-			 , A.DTL_MIMG
-			 , A.DTL_TITLE1
-			 , A.DTL_TITLE2
-			 , A.DEL_YN
-			 , A.OPEN_YN
-		FROM	TB_PLAN A
-		LEFT OUTER JOIN	TB_PLAN_BRAND B
-		ON	A.PLAN_SQ = B.PLAN_SQ
-		WHERE	1=1
-		  AND A.DISP_STDT <![CDATA[<=]]> NOW()
-		  AND A.DISP_EDDT <![CDATA[>=]]> NOW()
-		  AND A.PLAN_GB = 'P'
-		  AND A.DEL_YN = 'N'
-		  AND A.OPEN_YN = 'Y'
-		  AND B.BRAND_GROUP_NO = #{brandGroupNo}
-	</select>
-
-	<select id="getPlanningGoodsList" parameterType="Plan" resultType="Plan">
-		SELECT	B.PLAN_SQ
-			 , B.PLAN_DTL_SQ
-			 , B.CORNER_NM
-			 , B.DISP_ORD
-			 , B.DISP_STDT
-			 , B.DISP_EDDT
-			 , B.DISP_YN
-			 , C.GOODS_CD
-		FROM	TB_PLAN A
-		JOIN	TB_PLAN_DETAIL B
-		  ON	A.PLAN_SQ = B.PLAN_SQ
-		LEFT JOIN TB_PLAN_GOODS C
-		  ON	B.PLAN_DTL_SQ = C.PLAN_DTL_SQ
-		WHERE	1=1
-		  AND	A.PLAN_GB = 'P'
-		  AND	A.FRONT_GB = 'A'
-		  AND	A.DISP_STDT <![CDATA[<=]]> NOW()
-		  AND	A.DISP_EDDT <![CDATA[>=]]> NOW()
-		  AND	A.DEL_YN = 'N'
-		  AND	A.OPEN_YN = 'Y'
-		  AND	B.DISP_STDT <![CDATA[<=]]> NOW()
-		  AND	B.DISP_EDDT <![CDATA[>=]]> NOW()
-		  AND	B.DISP_YN = 'Y'
-		  AND	C.DEL_YN = 'N'
-		ORDER BY B.PLAN_SQ, B.PLAN_DTL_SQ, B.DISP_ORD, C.DISP_ORD
-	</select>
-
-</mapper>
+</mapper>

+ 160 - 100
src/main/webapp/WEB-INF/views/web/planning/PlanningMainFormWeb.html

@@ -17,122 +17,182 @@
  *******************************************************************************
  -->
 <body>
+
 <th:block layout:fragment="content">
-<!--  container -->
+	<!--  container -->
 	<div id="container" class="container dp" th:with="frontUrl=${@environment.getProperty('domain.front')}, goodsView=${@environment.getProperty('upload.goods.view')}">
 		<div class="breadcrumb"> 
 			<ul>
 				<li class="bread_home"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_MAIN);">홈</a></li>
-				<li class="bread_2depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">기획전</a></li>
-				<th:block th:if="${cateNo != null}">
-				<li class="bread_3depth"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN+'?cateNo='+[[${cateNo}]]);">[[${cateNm}]]</a></li>
-				</th:block>
+				<li class="bread_2depth">기획전</li>
 			</ul> 
 		</div>
 		<div class="wrap">
 			<div class="content dp_Exhibition"> <!-- 페이지특정 클래스 = dp_Exhibition -->
 				<div class="cont_head">
 					<div>
-                        <h3>기획전</h3>
-                    </div>
+						<h3>기획전</h3>
+					</div>
 				</div>
 				<div class="cont_body">
-                    <div class="taps">
-                        <div>
-                            <ul>
-                                 <li th:class="${cateNo == null ? 'active' : ''}"><a href="javascript:;" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체</a></li>
-                            	 <th:block th:each="CategoryData, CategoryStat : ${categoryList}">
-                            	 <li th:class="${CategoryData.cate1No == cateNo ? 'active' : '' }" ><a href="javascript:;" th:onclick="|cfnGoToPage(_PAGE_PLANNING_MAIN+'?cateNo=*{CategoryData.cate1No}');|">[[${CategoryData.cate1Nm}]]</a></li>
-						    	</th:block>
-                            </ul>
-                        </div>
-                    </div>
-                    <div class="ui_row">
-                        <div class="ui_col_12">
-                            <div class="form_count">
-                                <p><span th:text="${planCount}"></span>개의 기획전</p>
-                            </div>
-                        </div>
-                    </div> 
-                    <div class="exhi_list"> <!-- 데이터 없을시 클래스 nodata 추가 -->
-                    	<th:block th:if="${planCount < 1}">
-                    	 <div class="list_content nodata">
-	                     	 <div class="list_defult">
-	                            <div>
-	                                <img src="/images/pc/ico_content_find.png" alt="">
-	                                <p>등록된 기획전이 없습니다.</p>
-	                            </div>
-	                            <div class="ui_row">
-	                                <button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);"><span>홈으로 가기</span></button>
-	                            </div>
-	                        </div>
-                        </div>
-                       </th:block>
-                        <div class="itemsGrp" id="planListDiv">
-                       	  <th:block th:each="PlanData, PlanStat : ${planList}">
-                            <div class="exhi_item">
-                                <div class="exhi_item_img">
-                                    <a th:onclick="planDetailSearch([[${PlanData.planSq}]])">
-                                        <div class="shape ranker" th:if="${PlanData.newPlan != null}"><span>NEW</span></div>
-                                        <img th:src="${@environment.getProperty('domain.image')+'/planning/'+PlanData.mainPimg}"  alt=""> <!-- 430x430 사이즈 최적 -->
-                                        <div class="exhi_detail">
-                                            <p class="brand" th:if="${PlanData.cnt > 1}" th:text="${PlanData.brand}+' 외'"></p>
-                                            <p class="brand" th:unless="${PlanData.cnt > 1}" th:text="${PlanData.brand}"></p>
-                                            <h3 class="tit" th:text="${PlanData.planNm}"></h3>
-                                            <p class="sale" th:text="${PlanData.dtlTitle1}"></p>
-                                        </div>
-                                    </a>
-                                </div>
-                                <div class="exhi_item_pr">
-                                    <ul class="prod_list clear">
-                                     <th:block th:each="goodsList, k : ${goodsList}">
-                                      <th:block th:if="${PlanData.planSq} == ${goodsList.planSq} and ${goodsList.goodsCd} != null">
-                                        <li th:onclick="fnPlanDetailSearch([[${goodsList.goodsCd}]])">
-                                            <div class="item_prod">
-                                                <div class="item_state">
-                                                    <a href="javascript:void(0);" class="itemLink">
-                                                        <div class="itemPic">
-                                                            <img alt="" class="vLHTC pd_img" th:src="${goodsView + '/' + goodsList.sysImgNm}">
-                                                        </div>
-                                                        <div class="itemName" th:text="${goodsList.goodsNm}"></div>
-                                                        <p class="itemPrice" th:text="${#numbers.formatInteger(goodsList.currPrice, 0,'COMMA')} + '원'"></p>
-                                                    </a>
-                                                </div>
-                                            </div>
-                                        </li>
-                                       </th:block>
-                                     </th:block>
-                                   
-                                    </ul>
-                                </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-		    </div>
-        </div>
-    </div>
-	<!-- // container -->	
+					<div class="taps">
+						<div>
+							<ul>
+								<li th:class="${cateNo == null ? 'active' : ''}"><a href="javascript:void(0);" onclick="cfnGoToPage(_PAGE_PLANNING_MAIN);">전체</a></li>
+								<li th:each="oneData, stat : ${cateList}" th:class="${oneData.cateNo == cateNo ? 'active' : '' }" ><a href="javascript:void(0);" th:onclick="|cfnGoToPage(_PAGE_PLANNING_MAIN + '?cateNo=${oneData.cateNo}');|">[[${oneData.cateNm}]]</a></li>
+							</ul>
+						</div>
+					</div>
+					<div class="ui_row">
+						<div class="ui_col_12">
+							<div class="form_count">
+								<p id="planningTotCnt"></p>
+<!-- 								<p><span th:text="${planCount}"></span>개의 기획전</p> -->
+							</div>
+						</div>
+					</div>
+					<div class="list_content nodata" style="display: none;" id="divPlanningNoData"> <!-- 데이터 없을시 클래스 nodata 추가 -->
+						<div class="list_defult">
+							<div>
+								<img src="/images/pc/ico_content_find.png" alt=""/>
+								<p>등록된 기획전이 없습니다.</p>
+							</div>
+							<div class="ui_row">
+								<button type="button" class="btn btn_default" onclick="cfnGoToPage(_PAGE_MAIN);"><span>홈으로 가기</span></button>
+							</div>
+						</div>
+					</div>
+					<div class="exhi_list" style="display: none;" id="divPlanningList">
+						<!-- <div class="itemsGrp">
+							<div class="exhi_item">
+								<div class="exhi_item_img">
+									<a>
+										<div class="shape ranker"><span>NEW</span></div>
+										<img src="/images/pc/thumb/ev_list_img01.jpg" alt="">
+										<div class="exhi_detail">
+											<p class="brand">TBJ 외</p>
+											<h3 class="tit">ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션 ATTENTION! 20FW HOLIDAY TBJ 주목할 홀리데이 TBJ 컬렉션</h3>
+											<p class="sale">신상 15%쿠폰할인</p>
+										</div>
+									</a>
+								</div>
+								<div class="exhi_item_pr">
+									<ul class="prod_list clear">
+										<li>
+											<div class="item_prod">
+												<div class="item_state">
+													<a href="javascript:void(0);" class="itemLink">
+														<div class="itemPic">
+															<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/dp_slide_Item01.png">
+														</div>
+														<div class="itemName">남성 로고 자카드 방풍 패딩</div>
+														<p class="itemPrice">80,100</p>
+													</a>
+												</div>
+											</div>
+										</li>
+										<li>
+											<div class="item_prod">
+												<div class="item_state">
+													<a href="#none" class="itemLink">
+														<div class="itemPic">
+															<img alt="" class="vLHTC pd_img" src="/images/pc/thumb/tmp_pdTogether1.jpg"/>
+														</div>
+														<div class="itemName">남성 로고 자카드 방풍 패딩</div>
+														<p class="itemPrice">80,100</p>
+													</a>
+												</div>
+											</div>
+										</li>
+									</ul>
+								</div>
+							</div>
+						</div> -->
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+	<!-- // container -->
+
 <script th:inline="javascript">
-function planDetailSearch(obj) {
-	var planSq = obj;
-	let data = {planSq : planSq};
-	var jsonData = JSON.stringify(data);
+/*<![CDATA[*/
+	let fnGetPlanningList = function(cateNo) {
+		let actionUrl = '/planning/main/list';
+		if (!gagajf.isNull(cateNo)) actionUrl += '?cateNo=' + cateNo;
+		
+		$.getJSON(actionUrl
+			, function(result, status) {
+				if (status == 'success') {
+					if (result.length > 0) {
+						$('#planningTotCnt').html('<span>' + result.length.addComma() + '</span>개의 기획전');
+						
+						$('#divPlanningList').html('');
+						
+						let tag = '<div class="itemsGrp">\n';
+						
+						$.each(result, function(idx, item) {
+							tag += '	<div class="exhi_item">\n';
+							tag += '		<div class="exhi_item_img">\n';
+							tag += '			<a>\n';
+							
+							if (item.newYn == 'Y') {
+								tag += '				<div class="shape ranker"><span>NEW</span></div>\n';
+							}
+							
+							tag += '				<img src="' + _uploadImageUrl + '/planning/' + item.mainImg + '" alt="">\n';
+							tag += '				<div class="exhi_detail">\n';
+// 							tag += '					<p class="brand">TBJ 외</p>\n'; // 브랜드 검색조건 삭제에 따라 필요 없어 주석 처리
+							tag += '					<h3 class="tit">' + item.planNm + '</h3>\n';
+							tag += '					<p class="sale">' + item.dtlTitle1 + '</p>\n';
+							tag += '				</div>\n';
+							tag += '			</a>\n';
+							tag += '		</div>\n';
+							
+							if (item.planningGoodsList.length > 0) {
+								tag += '			<div class="exhi_item_pr">\n';
+	 							tag += '				<ul class="prod_list clear">\n';
 
-	
-	gagajf.ajaxJsonSubmit(
-			'/planning/access', jsonData,
-			function() {
-				cfnGoToPage(_PAGE_PLANNING_DETAIL + "?planSq=" + planSq);
+	 							$.each(item.planningGoodsList, function(idx2, goods) {
+		 							tag += '				<li>\n';
+		 							tag += '					<div class="item_prod">\n';
+		 							tag += '						<div class="item_state">\n';
+		 							tag += '							<a href="javascript:void(0);" class="itemLink" onclick="cfnGoToGoodsDetail(\'' + goods.goodsCd + '\');">\n';
+		 							tag += '								<div class="itemPic">\n';
+		 							tag += '									<img alt="" class="vLHTC pd_img" src="' + _uploadGoodsUrl + '/' + goods.sysImgNm + '">\n';
+		 							tag += '								</div>\n';
+		 							tag += '								<div class="itemName">' + goods.goodsNm + '</div>\n';
+		 							tag += '								<p class="itemPrice">' + goods.currPrice.addComma() + '</p>\n';
+		 							tag += '							</a>\n';
+		 							tag += '						</div>\n';
+		 							tag += '					</div>\n';
+		 							tag += '				</li>\n';
+								});
+		 						
+								tag += '			</ul>\n';
+		 						tag += '		</div>\n';
+							}
+							
+							tag += '	</div>\n';
+						});
+						
+						tag += '</div>\n';
+						$('#divPlanningList').html(tag);
+						
+						$('#divPlanningNoData').hide();
+						$('#divPlanningList').show();
+					} else {
+						$('#divPlanningNoData').show();
+						$('#divPlanningList').hide();
+					}
+				}
 			});
-
-}
-
-var fnPlanDetailSearch = function(obj) {
-	var goodsCd = obj;
-	cfnGoToPage(_PAGE_GOODS_DETAIL +  goodsCd);
-}
+	}
+	
+	$(document).ready(function() {
+		fnGetPlanningList([[${cateNo}]]);
+	});
+/*]]>*/
 </script>
 
 </th:block>