Переглянути джерело

Merge branch 'develop' into bin2107

bin2107 5 роки тому
батько
коміт
4e6ed1c83d

+ 10 - 0
src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java

@@ -417,6 +417,7 @@ public interface TsaPlanDao {
 	 */
 	void deletePlanContentItem(Integer planContSq);
 	
+	
 	/**
 	 * 기획전템플릿 이미지파일 삭제
 	 * @param 
@@ -425,6 +426,15 @@ public interface TsaPlanDao {
 	 */
 	void deletePlanTemplateFile(Plan plan);
 	
+	/**
+	 * 기획전템플릿 상품 삭제
+	 * @param 
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	void deletePlanContentItemGoods(Integer planContSq);
+	
+	
 
 
 }

+ 49 - 0
src/main/java/com/style24/admin/biz/dao/TsaSocialDao.java

@@ -0,0 +1,49 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import org.springframework.stereotype.Repository;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Social;
+
+/**
+ * 소셜관리 Dao
+ *
+ * @author sowon
+ * @since 2021. 3. 3
+ */
+
+@ShopDs
+@Repository
+public interface TsaSocialDao {
+
+	/**
+	 * 소셜 저장
+	 *
+	 * @param 소셜 정보
+	 * @author sowon
+	 * @since 2021. 3. 3 
+	 */
+	void saveSocial(Social param);
+	
+	/**
+	 * 쇼셜 목록
+	 *
+	 * @param 
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	Collection<Social> getSocialList(Social params);
+	
+	/**
+	 * 쇼셜 갯수확인
+	 *
+	 * @param 
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	int getSocialCount(Social params);
+}

+ 165 - 178
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -203,22 +203,22 @@ public class TsaPlanService {
 	 * @author sowon
 	 * @since 2021. 2. 8
 	 */
-	public Plan getPlanFsrcPcList(Plan param) {
-		param.setFrontGb("P");
-		Collection<Plan> planFsrcList = planDao.getPlanFsrcList(param);
-		Plan planPc = new Plan();
-
-		for (Plan pcTemp : planFsrcList) {
-			if (StringUtils.isNotBlank(planPc.getFsrc())) {
-				planPc.setFsrc(planPc.getFsrc() + pcTemp.getFsrc());
-			} else {
-				planPc.setFsrc(pcTemp.getFsrc());
-			}
-
-		}
-		log.debug("fsrcPc = {}", planPc.getFsrcPc());
-		return planPc;
-	}
+//	public Plan getPlanFsrcPcList(Plan param) {
+//		param.setFrontGb("P");
+//		Collection<Plan> planFsrcList = planDao.getPlanFsrcList(param);
+//		Plan planPc = new Plan();
+//
+//		for (Plan pcTemp : planFsrcList) {
+//			if (StringUtils.isNotBlank(planPc.getFsrc())) {
+//				planPc.setFsrc(planPc.getFsrc() + pcTemp.getFsrc());
+//			} else {
+//				planPc.setFsrc(pcTemp.getFsrc());
+//			}
+//
+//		}
+//		log.debug("fsrcPc = {}", planPc.getFsrcPc());
+//		return planPc;
+//	}
 
 	/**
 	 * 기획전 모바일용 소스 조회
@@ -228,22 +228,22 @@ public class TsaPlanService {
 	 * @author sowon
 	 * @since 2021. 2. 8
 	 */
-	public Plan getPlanFsrcMobileList(Plan param) {
-		param.setFrontGb("M");
-		Collection<Plan> planFsrcList = planDao.getPlanFsrcList(param);
-		Plan planMobile = new Plan();
-
-		for (Plan mobileTemp : planFsrcList) {
-			if (StringUtils.isNotBlank(planMobile.getFsrc())) {
-				planMobile.setFsrc(planMobile.getFsrc() + mobileTemp.getFsrc());
-			} else {
-				planMobile.setFsrc(mobileTemp.getFsrc());
-			}
-		}
-
-		return planMobile;
-	}
-	
+//	public Plan getPlanFsrcMobileList(Plan param) {
+//		param.setFrontGb("M");
+//		Collection<Plan> planFsrcList = planDao.getPlanFsrcList(param);
+//		Plan planMobile = new Plan();
+//
+//		for (Plan mobileTemp : planFsrcList) {
+//			if (StringUtils.isNotBlank(planMobile.getFsrc())) {
+//				planMobile.setFsrc(planMobile.getFsrc() + mobileTemp.getFsrc());
+//			} else {
+//				planMobile.setFsrc(mobileTemp.getFsrc());
+//			}
+//		}
+//
+//		return planMobile;
+//	}
+//	
 	/**
 	 * 기획전 웹 수정
 	 *
@@ -283,10 +283,9 @@ public class TsaPlanService {
 		}
 
 		// 기존 기획전 카테고리 삭제 
-		planDao.deletePlanCate(param);
-//		for (int i = 0; i < param.getMultiCate().length; i++) {
-//			planDao.deletePlanCate(param);
-//		}
+		for (int i = 0; i < param.getMultiCate().length; i++) {
+			planDao.deletePlanCate(param);
+		}
 		
 		String[] cate = param.getMultiCate();
 		// 기획전 카테고리insert
@@ -299,10 +298,9 @@ public class TsaPlanService {
 		}
 		
 		// 기존 기획전 카테고리 삭제
-		planDao.deletePlanCate(param);
-//		for (int i = 0; i < param.getMultiCate().length; i++) {
-//			planDao.deletePlanCate(param);
-//		}
+		for (int i = 0; i < param.getMultiBrand().length; i++) {
+			planDao.deletePlanBrand(param);;
+		}
 		
 		
 		String[] brand = param.getMultiBrand();
@@ -707,7 +705,7 @@ public class TsaPlanService {
 		// 리뷰 등록
 		Plan rePlan = new Plan();
 		//리뷰 등록 - tb_plan_contents
-		if(param.getReTitle() != "" || param.getMultiPlanReview().length>0) {
+		if(param.getReTitle() != "" || !StringUtils.isAllEmpty(param.getMultiPlanReview())) {
 			rePlan.setRegNo(regNo);
 			rePlan.setUpdNo(regNo);
 			rePlan.setTmplType("G082_10");
@@ -768,7 +766,7 @@ public class TsaPlanService {
 		
 		//이미지등록
 		Plan filePlan = new Plan();
-		if(param.getMultiPlanFile().length>=0) {
+		if(!StringUtils.isAllEmpty(param.getMultiPlanFile()) || param.getFileDispOrd() >=0) {
 			filePlan.setRegNo(regNo);
 			filePlan.setUpdNo(regNo);
 			filePlan.setTmplType("G082_30");
@@ -783,61 +781,33 @@ public class TsaPlanService {
 			/* planDao.deletePlanContentItem(param.getFilePlanContSq()); */
 			
 			//파일아이템 등록
-			if(param.getMultiPlanFile().length>0) {
-				String[] fileItemVal = param.getMultiPlanFile();
-				
-				// 기획전 브랜드 insert
-				for (int j = 0; j < fileItemVal.length; j++) {
-					filePlan.setItemVal(fileItemVal[j]);
-					planDao.createPlanContentsItem(filePlan);
-				}
+			String[] fileItemVal = param.getMultiPlanFile();
+			
+			// 기획전 브랜드 insert
+			for (int j = 0; j < fileItemVal.length; j++) {
+				filePlan.setItemVal(fileItemVal[j]);
+				planDao.createPlanContentsItem(filePlan);
 			}
 		}
 		
-		//HTML[상단] 등록
-		Plan fsrcTop = new Plan();
+		//HTML[PC] 상단 하단 등록
 		if(param.getFsrcMobileTop() != "" || param.getFsrcPcTop() != "") {
-			//tb_plan_contents 등록
-			fsrcTop.setRegNo(regNo);
-			fsrcTop.setUpdNo(regNo);
-			fsrcTop.setTmplType("G082_40");
-			fsrcTop.setPlanSq(param.getPlanSq());
-			fsrcTop.setDispYn(param.getTopFsrcDispYn());
-			fsrcTop.setDispOrd(param.getTopFsrcDispOrd());
-			
-			planDao.createPlanContents(fsrcTop);
+
 			
 			// 웹용 상단PC 등록
 			if (StringUtils.isNotBlank(param.getFsrcPcTop())) {
 				createPlanFsrcPcTop(param);
 			}
-			// 웹용 상단MOBILE 등록
-			if (StringUtils.isNotBlank(param.getFsrcMobileTop())) {
-				createPlanFsrcMobileTop(param);
-			}
 		}
-		
 		//HTML[하단] 등록
-		Plan fsrcBtm = new Plan();
 		if(param.getFsrcMobileBtm() != "" || param.getFsrcPcBtm() != "") {
-			//tb_plan_contents 등록
-			fsrcBtm.setRegNo(regNo);
-			fsrcBtm.setUpdNo(regNo);
-			fsrcBtm.setTmplType("G082_41");
-			fsrcBtm.setPlanSq(param.getPlanSq());
-			fsrcBtm.setDispYn(param.getBtmFsrcDispYn());
-			fsrcBtm.setDispOrd(param.getBtmFsrcDispOrd());
 			
-			planDao.createPlanContents(fsrcBtm);
 			
 			// 웹용 상단PC 등록
 			if (StringUtils.isNotBlank(param.getFsrcPcBtm())) {
 				createPlanFsrcPcBtm(param);
 			}
-			// 웹용 상단MOBILE 등록
-			if (StringUtils.isNotBlank(param.getFsrcMobileBtm())) {
-				createPlanFsrcMobileBtm(param);
-			}
+
 		}
 		
 		//상품 등록 -- 1
@@ -849,6 +819,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent1.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent1.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent1.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent1.getGoodsPlanContSq();
 				
 				Plan goods1 = new Plan();
 				goods1.setRegNo(regNo);
@@ -859,9 +830,13 @@ public class TsaPlanService {
 				goods1.setDispYn(goodsDispYn);
 				goods1.setTmplType(goodsType);
 				goods1.setLinkUrl(goodsUrl);
+				goods1.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods1);
 				
+				// 기존  상품1 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal1 : param.getMultiPlanGoodsContentVal1()) {
 					if(param.getMultiPlanGoodsContentVal1().size()>0) {
 						goods1.setItemVal(multiPlanGoodsContentVal1.getGoodsItemVal());
@@ -881,6 +856,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent2.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent2.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent2.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent2.getGoodsPlanContSq();
 				
 				Plan goods2 = new Plan();
 				goods2.setRegNo(regNo);
@@ -891,9 +867,13 @@ public class TsaPlanService {
 				goods2.setDispYn(goodsDispYn);
 				goods2.setTmplType(goodsType);
 				goods2.setLinkUrl(goodsUrl);
+				goods2.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods2);
 				
+				// 기존  상품2 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal2 : param.getMultiPlanGoodsContentVal2()) {
 					if(param.getMultiPlanGoodsContentVal2().size()>0) {
 						goods2.setItemVal(multiPlanGoodsContentVal2.getGoodsItemVal());
@@ -913,6 +893,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent3.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent3.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent3.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent3.getGoodsPlanContSq();
 				
 				Plan goods3 = new Plan();
 				goods3.setRegNo(regNo);
@@ -923,9 +904,13 @@ public class TsaPlanService {
 				goods3.setDispYn(goodsDispYn);
 				goods3.setTmplType(goodsType);
 				goods3.setLinkUrl(goodsUrl);
+				goods3.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods3);
 				
+				// 기존  상품3 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal3 : param.getMultiPlanGoodsContentVal3()) {
 					if(param.getMultiPlanGoodsContentVal3().size()>0) {
 						goods3.setItemVal(multiPlanGoodsContentVal3.getGoodsItemVal());
@@ -945,6 +930,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent4.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent4.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent4.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent4.getGoodsPlanContSq();
 				
 				Plan goods4 = new Plan();
 				goods4.setRegNo(regNo);
@@ -955,9 +941,13 @@ public class TsaPlanService {
 				goods4.setDispYn(goodsDispYn);
 				goods4.setTmplType(goodsType);
 				goods4.setLinkUrl(goodsUrl);
+				goods4.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods4);
 				
+				// 기존  상품4 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal4 : param.getMultiPlanGoodsContentVal4()) {
 					if(param.getMultiPlanGoodsContentVal4().size()>0) {
 						goods4.setItemVal(multiPlanGoodsContentVal4.getGoodsItemVal());
@@ -977,6 +967,8 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent5.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent5.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent5.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent5.getGoodsPlanContSq();
+
 				
 				Plan goods5 = new Plan();
 				goods5.setRegNo(regNo);
@@ -987,9 +979,13 @@ public class TsaPlanService {
 				goods5.setDispYn(goodsDispYn);
 				goods5.setTmplType(goodsType);
 				goods5.setLinkUrl(goodsUrl);
+				goods5.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods5);
 				
+				// 기존  상품5 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal5 : param.getMultiPlanGoodsContentVal5()) {
 					if(param.getMultiPlanGoodsContentVal5().size()>0) {
 						goods5.setItemVal(multiPlanGoodsContentVal5.getGoodsItemVal());
@@ -1009,6 +1005,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent6.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent6.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent6.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent6.getGoodsPlanContSq();
 				
 				Plan goods6 = new Plan();
 				goods6.setRegNo(regNo);
@@ -1019,9 +1016,13 @@ public class TsaPlanService {
 				goods6.setDispYn(goodsDispYn);
 				goods6.setTmplType(goodsType);
 				goods6.setLinkUrl(goodsUrl);
+				goods6.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods6);
 				
+				// 기존  상품6 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal6 : param.getMultiPlanGoodsContentVal6()) {
 					if(param.getMultiPlanGoodsContentVal6().size()>0) {
 						goods6.setItemVal(multiPlanGoodsContentVal6.getGoodsItemVal());
@@ -1041,6 +1042,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent7.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent7.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent7.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent7.getGoodsPlanContSq();
 				
 				Plan goods7 = new Plan();
 				goods7.setRegNo(regNo);
@@ -1051,9 +1053,13 @@ public class TsaPlanService {
 				goods7.setDispYn(goodsDispYn);
 				goods7.setTmplType(goodsType);
 				goods7.setLinkUrl(goodsUrl);
+				goods7.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods7);
 				
+				// 기존  상품7 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal7 : param.getMultiPlanGoodsContentVal7()) {
 					if(param.getMultiPlanGoodsContentVal7().size()>0) {
 						goods7.setItemVal(multiPlanGoodsContentVal7.getGoodsItemVal());
@@ -1073,6 +1079,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent8.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent8.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent8.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent8.getGoodsPlanContSq();
 				
 				Plan goods8 = new Plan();
 				goods8.setRegNo(regNo);
@@ -1083,9 +1090,13 @@ public class TsaPlanService {
 				goods8.setDispYn(goodsDispYn);
 				goods8.setTmplType(goodsType);
 				goods8.setLinkUrl(goodsUrl);
+				goods8.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods8);
 				
+				// 기존  상품8 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal8 : param.getMultiPlanGoodsContentVal8()) {
 					if(param.getMultiPlanGoodsContentVal8().size()>0) {
 						goods8.setItemVal(multiPlanGoodsContentVal8.getGoodsItemVal());
@@ -1105,6 +1116,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent9.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent9.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent9.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent9.getGoodsPlanContSq();
 				
 				Plan goods9 = new Plan();
 				goods9.setRegNo(regNo);
@@ -1115,9 +1127,13 @@ public class TsaPlanService {
 				goods9.setDispYn(goodsDispYn);
 				goods9.setTmplType(goodsType);
 				goods9.setLinkUrl(goodsUrl);
+				goods9.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods9);
 				
+				// 기존  상품9 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal9 : param.getMultiPlanGoodsContentVal9()) {
 					if(param.getMultiPlanGoodsContentVal9().size()>0) {
 						goods9.setItemVal(multiPlanGoodsContentVal9.getGoodsItemVal());
@@ -1137,6 +1153,7 @@ public class TsaPlanService {
 				String goodsType = multiPlanGoodsContent10.getGoodsType();
 				long goodsDispOrd = multiPlanGoodsContent10.getGoodsDispOrd();
 				String goodsDispYn = multiPlanGoodsContent10.getGoodsDispYn();
+				Integer goodsPlanContSq = multiPlanGoodsContent10.getGoodsPlanContSq();
 				
 				Plan goods10 = new Plan();
 				goods10.setRegNo(regNo);
@@ -1147,9 +1164,13 @@ public class TsaPlanService {
 				goods10.setDispYn(goodsDispYn);
 				goods10.setTmplType(goodsType);
 				goods10.setLinkUrl(goodsUrl);
+				goods10.setPlanContSq(goodsPlanContSq);
 				
 				planDao.createPlanContents(goods10);
 				
+				// 기존  상품10 삭제
+				planDao.deletePlanContentItem(goodsPlanContSq); 
+				
 				for (Plan multiPlanGoodsContentVal10 : param.getMultiPlanGoodsContentVal10()) {
 					if(param.getMultiPlanGoodsContentVal10().size()>0) {
 						goods10.setItemVal(multiPlanGoodsContentVal10.getGoodsItemVal());
@@ -1248,20 +1269,22 @@ public class TsaPlanService {
 	
 	
 	/*
-	 * 기획전 템플릿 HTML[상단] PC 소스 등록
+	 * 기획전 템플릿 HTML[상단] PC 모바일 소스 등록
 	 */
 	@Transactional("shopTxnManager")
 	public Plan createPlanFsrcPcTop(Plan param) {
 		Plan fsrcTop = new Plan();
 		int fsrcPcTotalCnt = param.getFsrcPcTop().toCharArray().length;
+		int fsrcMobileTotalCnt = param.getFsrcMobileTop().toCharArray().length;
 		int byteCnt = 1500;
 		
 		
-		fsrcTop.setFrontGb("P");                 
+		fsrcTop.setLocGb("T");                 
 		fsrcTop.setRegNo(param.getRegNo());      
 		fsrcTop.setPlanSq(param.getPlanSq());    
+		fsrcTop.setDispYn(param.getTopFsrcDispYn());
 		
-		if (fsrcPcTotalCnt > byteCnt) { // 4000 바이트 이상 일 때 파싱.
+		if (fsrcPcTotalCnt > byteCnt || fsrcMobileTotalCnt > byteCnt) { // 4000 바이트 이상 일 때 파싱.
 			StringBuilder sbStr = new StringBuilder(4000);
 
 			int cnt = 0;
@@ -1274,85 +1297,60 @@ public class TsaPlanService {
 
 				if (getCnt == tempCnt || getCnt == fsrcPcTotalCnt) {
 					fsrcTop.setSeq(cnt + 1);
-					fsrcTop.setFsrcTop(sbStr.toString());
+					fsrcTop.setFsrcPc(sbStr.toString());
 
 					// 초기화
 					sbStr.delete(0, tempCnt);
 					cnt++;
 					tempCnt += byteCnt;
 
-					planDao.savePlanFsrcInfo(fsrcTop);
+					//planDao.savePlanFsrcInfo(fsrcTop);
 				}
-
 			}
-		} else {
-			fsrcTop.setSeq(1);
-			fsrcTop.setFsrcTop(param.getFsrcPcTop());
-
-			planDao.savePlanFsrcInfo(fsrcTop);
-		}
-		return param;
-	}
-
-	/*
-	 * 기획전 템플릿 HTML[상단] mobile 소스 등록
-	 */
-	@Transactional("shopTxnManager")
-	public Plan createPlanFsrcMobileTop(Plan param) {
-		Plan fsrcMobile = new Plan();
-		
-		int fsrcMobileTotalCnt = param.getFsrcMobileTop().toCharArray().length;
-		int byteCnt = 1500;
-
-		fsrcMobile.setFrontGb("M");
-		fsrcMobile.setRegNo(param.getRegNo());
-		fsrcMobile.setPlanSq(param.getPlanSq());
 		
-		if (fsrcMobileTotalCnt > byteCnt) { // 4000 바이트 이상 일 때 파싱.
-			StringBuilder sbStr = new StringBuilder(4000);
-
-			int cnt = 0;
-			int getCnt = 0;
-			int tempCnt = 1500;
-
 			for (char ch : param.getFsrcMobileTop().toCharArray()) {
 				getCnt++;
 				sbStr.append(ch);
 
-				if (getCnt == tempCnt || getCnt == fsrcMobileTotalCnt) {
-					
-					fsrcMobile.setSeq(cnt+1);
-					fsrcMobile.setFsrcTop(sbStr.toString());
+				if (getCnt == tempCnt || getCnt == fsrcPcTotalCnt) {
+					fsrcTop.setSeq(cnt + 1);
+					fsrcTop.setFsrcMob(sbStr.toString());
 
 					// 초기화
 					sbStr.delete(0, tempCnt);
 					cnt++;
 					tempCnt += byteCnt;
-
-					planDao.savePlanFsrcInfo(fsrcMobile);
+					
 				}
-			}
-		} else {
-			fsrcMobile.setSeq(1);
-			fsrcMobile.setFsrcTop(param.getFsrcMobileTop());
-			planDao.savePlanFsrcInfo(fsrcMobile);
+			}		
+			planDao.savePlanFsrcInfo(fsrcTop);
+		} 
+		else {
+			fsrcTop.setSeq(1);
+			fsrcTop.setFsrcPc(param.getFsrcPcTop());
+			fsrcTop.setFsrcMob(param.getFsrcMobileTop());
+
+			planDao.savePlanFsrcInfo(fsrcTop);
 		}
 		return param;
 	}
-	
+
+
 	/*
-	 * 기획전 템플릿 HTML[하단] PC 소스 등록
+	 * 기획전 템플릿 HTML[하단] PC 모바일 소스 등록
 	 */
 	@Transactional("shopTxnManager")
 	public Plan createPlanFsrcPcBtm(Plan param) {
 		Plan fsrcBtm = new Plan();
 		int fsrcPcTotalCnt = param.getFsrcPcBtm().toCharArray().length;
+		int fsrcMobileTotalCnt = param.getFsrcMobileBtm().toCharArray().length;
 		int byteCnt = 1500;
 		
 		
-		fsrcBtm.setFrontGb("P");                 
+		fsrcBtm.setLocGb("B");                 
 		fsrcBtm.setRegNo(param.getRegNo());      
 		fsrcBtm.setPlanSq(param.getPlanSq());    
+		fsrcBtm.setDispYn(param.getBtmFsrcDispYn());
 		
 		if (fsrcPcTotalCnt > byteCnt) { // 4000 바이트 이상 일 때 파싱.
 			StringBuilder sbStr = new StringBuilder(4000);
@@ -1367,72 +1365,44 @@ public class TsaPlanService {
 
 				if (getCnt == tempCnt || getCnt == fsrcPcTotalCnt) {
 					fsrcBtm.setSeq(cnt + 1);
-					fsrcBtm.setFsrcBtm(sbStr.toString());
+					fsrcBtm.setFsrcPc(sbStr.toString());
 
 					// 초기화
 					sbStr.delete(0, tempCnt);
 					cnt++;
 					tempCnt += byteCnt;
 
-					planDao.savePlanFsrcInfo(fsrcBtm);
 				}
 
 			}
-		} else {
-			fsrcBtm.setSeq(1);
-			fsrcBtm.setFsrcBtm(param.getFsrcPcBtm());
-
-			planDao.savePlanFsrcInfo(fsrcBtm);
-		}
-		return param;
-	}
-
-	/*
-	 * 기획전 템플릿 HTML[하단] mobile 소스 등록
-	 */
-	@Transactional("shopTxnManager")
-	public Plan createPlanFsrcMobileBtm(Plan param) {
-		Plan fsrcMobile = new Plan();
-		
-		int fsrcMobileTotalCnt = param.getFsrcMobileBtm().toCharArray().length;
-		int byteCnt = 1500;
-
-		fsrcMobile.setFrontGb("M");
-		fsrcMobile.setRegNo(param.getRegNo());
-		fsrcMobile.setPlanSq(param.getPlanSq());
-		
-		if (fsrcMobileTotalCnt > byteCnt) { // 4000 바이트 이상 일 때 파싱.
-			StringBuilder sbStr = new StringBuilder(4000);
-
-			int cnt = 0;
-			int getCnt = 0;
-			int tempCnt = 1500;
-
+			
 			for (char ch : param.getFsrcMobileBtm().toCharArray()) {
 				getCnt++;
 				sbStr.append(ch);
 
-				if (getCnt == tempCnt || getCnt == fsrcMobileTotalCnt) {
-					
-					fsrcMobile.setSeq(cnt+1);
-					fsrcMobile.setFsrcBtm(sbStr.toString());
+				if (getCnt == tempCnt || getCnt == fsrcPcTotalCnt) {
+					fsrcBtm.setSeq(cnt + 1);
+					fsrcBtm.setFsrcMob(sbStr.toString());
 
 					// 초기화
 					sbStr.delete(0, tempCnt);
 					cnt++;
 					tempCnt += byteCnt;
-
-					planDao.savePlanFsrcInfo(fsrcMobile);
+					
 				}
-			}
+			}		
+			
+			planDao.savePlanFsrcInfo(fsrcBtm);
 		} else {
-			fsrcMobile.setSeq(1);
-			fsrcMobile.setFsrcBtm(param.getFsrcMobileBtm());
-			planDao.savePlanFsrcInfo(fsrcMobile);
+			fsrcBtm.setSeq(1);
+			fsrcBtm.setFsrcPc(param.getFsrcPcBtm());
+			fsrcBtm.setFsrcMob(param.getFsrcMobileBtm());
+
+			planDao.savePlanFsrcInfo(fsrcBtm);
 		}
 		return param;
 	}
-	
+
 	
 	/**
 	 * 기획전 템플릿 목록 카운트 조회
@@ -1444,19 +1414,36 @@ public class TsaPlanService {
 	public int getPlanContentsCount(Plan param) {
 		return planDao.getPlanContentsCount(param);
 	}
+
+	/**
+	 * 기획전 템플릿 상품목록 삭제
+	 * @param  
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	@Transactional("shopTxnManager")
+	public void deletePlanContentItemGoods(Integer planContSq) {
+		
+		planDao.deletePlanContentItemGoods(planContSq);
 	
+	}
+
 	/**
-	 * 기획전 템플릿 아이템 등록
-	 *
-	 * @param
-	 * @return
+	 * 기획전 템플릿 컨텐츠 삭제
+	 * @param  
+	 * @return 
 	 * @author sowon
-	 * @since 2021. 2. 25
+	 * @since 2021. 3. 3
 	 */
-	void createPlanContentsItem(Plan param) {
+
+	@Transactional("shopTxnManager")
+	public void deletePlanContentItem(Integer planContSq) {
+		planDao.deletePlanContentItem(planContSq);
+		
 	}
-	
 
 	
 
+
 }

+ 68 - 0
src/main/java/com/style24/admin/biz/service/TsaSocialService.java

@@ -0,0 +1,68 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaSocialDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Plan;
+import com.style24.persistence.domain.Social;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 소셜관리 Service
+ * 
+ * @author sowon
+ * @since 2021. 03. 03
+ */
+@Service
+@Slf4j
+public class TsaSocialService {
+	
+	@Autowired
+	private TsaSocialDao socialDao;
+	
+	/**
+	 * 소셜 저장
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	@Transactional("shopTxnManager")
+	public void saveSocial(Social param) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		param.setRegNo(userNo);
+		param.setUpdNo(userNo);
+
+		socialDao.saveSocial(param);
+	}
+	
+	
+	/**
+	 * 쇼셜 목록
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	public Collection<Social> getSocialList(Social params) {
+		return socialDao.getSocialList(params);
+	}
+	
+	/**
+	 * 소셜 목록 카운트 조회
+	 * @param  param
+	 * @return int
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	public int getSocialCount(Social param) {
+		return socialDao.getSocialCount(param);
+	}
+
+}

+ 111 - 5
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -33,6 +33,7 @@ import com.style24.admin.biz.service.TsaPlanService;
 import com.style24.admin.biz.service.TsaPollService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaReviewService;
+import com.style24.admin.biz.service.TsaSocialService;
 import com.style24.admin.biz.service.TsaSystemService;
 import com.style24.admin.support.controller.TsaBaseController;
 import com.style24.admin.support.security.session.TsaSession;
@@ -102,6 +103,9 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TscCouponService coreCouponService;
 	
+	@Autowired
+	private TsaSocialService socialService;
+	
 	@Value("${upload.default.target.path}")
 	private String uploadTargetPath;
 
@@ -1645,9 +1649,9 @@ public class TsaMarketingController extends TsaBaseController {
 		} else if(param.getMode().equals("U")){ // 상세 일 때
 			mav.addObject("planInfo", planService.getPlanDetailInfo(param));
 
-			mav.addObject("fsrcPc", planService.getPlanFsrcPcList(param));
+			//mav.addObject("fsrcPc", planService.getPlanFsrcPcList(param));
 
-			mav.addObject("fsrcMobile", planService.getPlanFsrcMobileList(param));
+			//mav.addObject("fsrcMobile", planService.getPlanFsrcMobileList(param));
 			
 			// 등록했던 브랜드
 			mav.addObject("planBrandList", planService.getPlanBrandList(param));
@@ -2066,11 +2070,11 @@ public class TsaMarketingController extends TsaBaseController {
 			mav.addObject("fileList", planService.getPlanContentFileList(param));
 			
 			//html 리스트 - 상단
-			param.setTmplType("G082_40");
+			param.setLocGb("T");
 			mav.addObject("fsrcListTop", planService.getPlanContentFsrcList(param));
 			
 			//html 리스트 - 하단
-			param.setTmplType("G082_41");
+			param.setLocGb("B");
 			mav.addObject("fsrcListBtm", planService.getPlanContentFsrcList(param));
 			
 			//상품 리스트
@@ -2082,7 +2086,6 @@ public class TsaMarketingController extends TsaBaseController {
 			while (iter.hasNext()) {
 				
 				Integer planContSq = iter.next().getPlanContSq();
-				System.out.println("planContSq:"+planContSq);
 				param.setPlanContSq(planContSq);
 				mav.addObject("goodsDetailList" + i, planService.getPlanContentGoodsDetailList(param));
 				i++;
@@ -2126,6 +2129,30 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0003"));
 	}
 	
+	/**
+	 * 기회전템플릿 상품 삭제
+	 * @param plan_content - 기획전템플릿 상품삭제
+	 * @return
+	 * @throws IOException
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	@PostMapping("/planning/detail/template/goods/delete")
+	@ResponseBody
+	public GagaMap deletePlanTemplateGoods(@RequestBody Collection<Plan> param) throws IOException {
+		GagaMap result = new GagaMap();
+		Integer planContSq = null;
+		Iterator<Plan> list = param.iterator();
+		while (list.hasNext()) {
+			planContSq = list.next().getPlanContSq();
+		}
+		planService.deletePlanContentItemGoods(planContSq);
+		planService.deletePlanContentItem(planContSq);
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		return result;
+	}
+
+	
 	/**
 	 * 기획전 템플릿 저장
 	 *
@@ -2234,6 +2261,85 @@ public class TsaMarketingController extends TsaBaseController {
 		mav.setViewName("marketing/PollVoteRatePopupForm");
 		return mav;
 	}
+	
+	/**
+	 *   poll 작업 종료 - sowon
+	 */
+	
+	
+	/**
+	 *   소셜관리 작업 시작 - sowon
+	 */
+	
+	/**
+	 * 소셜쇼핑관리 화면
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 3. 3 
+	 */
+	@GetMapping(value = "/social/form")
+	@ResponseBody
+	public ModelAndView socialShoppingListForm() {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트코드 G000
+		mav.addObject("siteList", rendererService.getAvailCommonCodeList("G000"));
+
+		// 사용여부 G002
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+
+		// 소셜 유형 G062
+		mav.addObject("socialTypeList", rendererService.getAvailCommonCodeList("G062"));
+
+		// 기획전 전체 목록
+		Plan plan = new Plan();
+		mav.addObject("planList", planService.getPlanAllList(plan));
+
+		mav.setViewName("marketing/SocialShoppingListForm");
+		return mav;
+	}
+	
+	/**
+	 * 소셜 저장
+	 *
+	 * @param 소셜 정보
+	 * @return
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	@PostMapping("/social/save")
+	@ResponseBody
+	public GagaResponse saveSocial(@RequestBody Social param) {
+		log.debug("param : {}", param);
+		socialService.saveSocial(param);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
+	/**
+	 * 소셜 목록
+	 *
+	 * @param 
+	 * @return 
+	 * @author sowon
+	 * @since 2021. 3. 3
+	 */
+	@PostMapping("/social/list")
+	@ResponseBody
+	public GagaMap getSocialList(@RequestBody Social params) {
+		GagaMap result = new GagaMap();
+		
+		Collection<Social> socialList = socialService.getSocialList(params);
+		
+		params.setPageable(new TscPageRequest(params.getPageNo() - 1, params.getPageSize()));
+		params.getPageable().setTotalCount(socialService.getSocialCount(params));
+
+		result.set("pageing", params);
+		result.set("socialList", socialList);
+		return result;
+	}
+	
 
 
 

+ 3 - 4
src/main/java/com/style24/persistence/domain/Plan.java

@@ -74,11 +74,9 @@ public class Plan extends TscBaseDomain{
 
 		// 기획전 소스
 		private Integer seq;					//일련번호
-		private String fsrc;				//프론트소스
-		private String fsrcTop;				//프론트 상단소스
-		private String fsrcBtm;				//프론트 하단소스
 		private String fsrcPc;				//프론트소스(pc)	/ 화면용
-		private String fsrcMobile;			//프론트소스(모바일)	/ 화면용
+		private String fsrcMob;			//프론트소스(모바일)	/ 화면용
+		private String locGb;			//위치구분(T:상단 / B:하단)
 
 		// 기획전 상세
 		private Integer planDtlSq;				//기획전상세일련번호(SEQ_PLAN_DTL sequence)
@@ -223,6 +221,7 @@ public class Plan extends TscBaseDomain{
 		private String goodsType;			//상품노출순서
 		private String goodsItemVal;		//상품아이템
 		private String brandEnm;			//브랜드명
+		private Integer goodsPlanContSq;	//상품 컨텐츠일련번호
 		
 		// Pagination
 		private TscPageRequest pageable;

+ 72 - 0
src/main/java/com/style24/persistence/domain/Social.java

@@ -0,0 +1,72 @@
+package com.style24.persistence.domain;
+
+
+import com.style24.persistence.TscBaseDomain;
+import com.style24.persistence.TscPageRequest;
+
+import lombok.Data;
+
+/**
+ * 소셜관리 Domain
+ *
+ * @author sowon
+ * @since 2021. 03. 03
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class Social extends TscBaseDomain{
+		// SOCIAL
+		private Integer socialSq;			// 소셜일련번호
+		private String socialNm;		// 소셜명
+		private String socialType;		// 소셜유형
+		private String siteCd;			// 사이트코드
+		private String frontGb;			// 프론튿구분
+		private String socialStdt;		// 소셜시작시간
+		private String socialEddt;		// 소셜종료시간
+		private String socialTnm;		// 소셜타이틀명
+		private String useYn;			// 사용여부
+		private String applyGb;			// 적용구분
+		
+		private String regNm;
+		// PLAN
+		private Integer planSq;			// 기획전 일련번호
+		
+		
+
+		// SOCIAL GOODS
+		private Integer scgoodsSq;		// 소셜상품일련번호(SEQ_SCGOODS sequence)
+		private String goodsCd;			// 상품코드(상품)
+		private String currBprice;		// 변경전현재판매가
+		private String currAprice;		// 변경후현재판매가
+		private String dcBrate;			// 변경전할인율
+		private String dcArate;			// 변경후할인율
+		private String pntBprate;		// 변경전포인트적립율(PC)
+		private String pntAprate;		// 변경후포인트적립율(PC)
+		private String pntBmrate;		// 변경전포인트적립율(모바일)
+		private String pntAmrate;		// 변경후포인트적립율(모바일)
+		private String erpPriceLinkYn;	// erp가격연계여부(자사품만 사용, y연계)
+		private String dispOrd;			// 표시순서
+		private String delYn;			// 삭제여부(Y:삭제)
+
+		// GOODS
+		private String currPrice;		// 현재 판매가
+		private String dcRate;			// 할인율
+		private String pntPrate;		// PC 포인트 적립율
+		private String pntMrate;		// MOBILE 포인트 적립율
+
+		
+
+		private String excelFileNm;		// 엑셀파일명
+		// 검색
+		private String stDate;	// 시작일시
+		private String edDate;	// 종료일시
+		
+		
+		// Pagination
+		private TscPageRequest pageable;
+		private int pageNo = 1;
+		private int pageSize = 50;
+		private int pageUnit = 10;
+		
+}

+ 33 - 24
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -231,9 +231,10 @@
 		         INSERT INTO
 				      TB_PLAN_FSRC (
 				          PLAN_SQ
-				          , FRONT_GB
-				          , FSRC_TOP
-				          , FSRC_BTM
+				          , LOC_GB
+				          , FSRC_PC
+				          , FSRC_MOB
+				          , DISP_YN
 				          , REG_NO
 				          , REG_DT
 				          , UPD_NO
@@ -241,9 +242,10 @@
 				      )
 				   VALUES (
 				    	  #{planSq}
-				          , #{frontGb}
-				          , #{fsrcTop}
-				          , #{fsrcBtm}
+				    	  , #{locGb}
+				          , #{fsrcPc}
+				          , #{fsrcMob}
+				          , #{dispYn}
 				          , #{regNo}
 				          , now()
 				          , #{regNo}
@@ -252,8 +254,9 @@
 				   ON
 				      DUPLICATE KEY
 				   UPDATE
-				       FSRC_TOP = #{fsrcTop}
-			         , FSRC_BTM = #{fsrcBtm}
+				       FSRC_PC = #{fsrcPc}
+			         , FSRC_MOB = #{fsrcMob}
+			         , DISP_YN = #{dispYn}
 		         	 , UPD_NO = #{regNo}
 		         	 , UPD_DT = now()
 	</insert>
@@ -939,6 +942,7 @@
 			     DUPLICATE KEY 
 			 UPDATE 
 			 	   TITLE=#{title}
+			 	 , TMPL_TYPE = #{tmplType}
 			   	 , LINK_URL=#{linkUrl}
 			     , DISP_YN=#{dispYn}
 			     , DISP_ORD=#{dispOrd}
@@ -1048,20 +1052,19 @@
 	
 	<select id="getPlanContentFsrcList" parameterType="Plan" resultType="Plan">
 		/* TsaPlan.getPlanContentFsrcList */
-		SELECT A.PLAN_CONT_SQ 
-		  	 ,A.PLAN_SQ 
-		     ,A.TMPL_TYPE 
-		     ,A.TITLE 
-		     ,A.LINK_URL 
-		     ,A.DISP_YN 
-		     ,A.DISP_ORD 
-		     ,A.REG_NO 
-		     ,B.FRONT_GB 
-		     ,B.FSRC_BTM 
-		     ,B.FSRC_TOP 
-		FROM TB_PLAN_CONTENTS A LEFT JOIN TB_PLAN_FSRC B ON A.PLAN_SQ = B.PLAN_SQ 
-		WHERE A.PLAN_SQ = #{planSq} AND A.TMPL_TYPE = #{tmplType} 
-		ORDER BY FRONT_GB DESC
+		SELECT 
+		  	  B.PLAN_SQ
+		     ,B.LOC_GB
+		     ,B.DISP_YN 
+		     ,B.FSRC_MOB 
+		     ,B.FSRC_PC 
+		     ,B.REG_NO
+		     ,B.REG_DT
+		     ,B.UPD_NO
+		     ,B.UPD_DT
+		FROM TB_PLAN_FSRC B
+		WHERE B.PLAN_SQ = #{planSq}
+			AND B.LOC_GB = #{locGb}  
 	</select>
 	
 	<select id="getPlanContentGoodsList" parameterType="Plan" resultType="Plan">
@@ -1081,6 +1084,7 @@
 	<select id="getPlanContentGoodsDetailList" parameterType="Plan" resultType="Plan">
 		/* TsaPlan.getPlanContentGoodsDetailList */	
 		SELECT  B.PLAN_CONT_SQ 
+		      ,B.PLAN_CONT_ITEM_SQ
 		      ,B.ITEM_VAL as goodsItemVal
 		      ,C.GOODS_NM
 		      ,C.LIST_PRICE 
@@ -1099,13 +1103,18 @@
 	</select>
 	
 	<delete id="deletePlanContentItem" parameterType="Plan">
-		/* TsaPlan.getPlanContentGoodsDetailList */	
+		/* TsaPlan.deletePlanContentItem */	
 		DELETE 
 		FROM TB_PLAN_CONTENTS_ITEM
 		WHERE PLAN_CONT_SQ = #{planContSq}
 	</delete>
 	
-	
+	<delete id="deletePlanContentItemGoods" parameterType="Plan">
+		/* TsaPlan.deletePlanContentItemGoods */	
+		DELETE 
+		FROM TB_PLAN_CONTENTS
+		WHERE PLAN_CONT_SQ = #{planContSq}
+	</delete>
 </mapper>
 
 

+ 130 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaSocial.xml

@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaSocialDao">
+	<!-- 소셜 저장 -->
+	<insert id="saveSocial" parameterType="Social">
+		/* TsaSocial.saveSocial */
+		INSERT INTO TB_SOCIAL
+				(
+				  SOCIAL_NM
+				, SOCIAL_TYPE
+				, SITE_CD
+				, FRONT_GB
+				, SOCIAL_STDT
+				, SOCIAL_EDDT
+				, SOCIAL_TNM
+				, USE_YN
+				, APPLY_GB
+				, PLAN_SQ
+				, REG_NO
+				, REG_DT
+				, UPD_NO
+				, UPD_DT
+				)
+		VALUES(
+				#{socialNm}
+		      , #{socialType}
+		      , #{siteCd}
+		      , #{frontGb}
+		      , #{socialStdt}
+		      , #{socialEddt}
+		      , #{socialTnm}
+		      , #{useYn}
+		      , #{applyGb}
+		      , #{planSq}
+		      , #{regNo}
+		      , now()
+		      , #{updNo}
+		      , now()
+		     )
+		   ON
+		     DUPLICATE KEY 
+		UPDATE 
+		   SOCIAL_NM=#{socialNm}
+		 , SOCIAL_TYPE=#{socialType}
+		 , SITE_CD=#{siteCd}
+		 , FRONT_GB=#{frontGb}
+		 , SOCIAL_STDT=  #{socialStdt}
+		 , SOCIAL_EDDT= #{socialEddt}
+		 , SOCIAL_TNM= #{socialTnm}
+		 , USE_YN= #{useYn}
+		 , APPLY_GB=#{applyGb}
+		 , PLAN_SQ=#{planSq}
+		 , UPD_NO=#{updNo}
+		 , UPD_DT=now()
+	</insert>
+	
+		<!-- 쇼셜 목록 -->
+	<select id="getSocialList" parameterType="Social" resultType="Social">
+		/* TsaSocial.getSocialList */
+		SELECT Z.*
+		FROM (
+				 SELECT @rownum := @rownum + 1 AS RNUM
+				 	         ,A.*
+				 	   FROM (
+								SELECT SOCIAL_SQ                                                    
+								     , SOCIAL_NM                                                    
+								     , SOCIAL_TNM                                                   
+								     , SOCIAL_TYPE                                                  
+								     , SITE_CD                                                      
+								     , FRONT_GB                                                     
+								     , SOCIAL_STDT													
+								     , SOCIAL_EDDT 
+								     , PLAN_SQ                                                      
+								     , USE_YN  
+								     , APPLY_GB 
+								     , REG_DT
+								     , REG_NO
+								     , FN_GET_USER_NM(REG_NO)                AS REG_NM
+								FROM   TB_SOCIAL JOIN ( SELECT @rownum := 0) R
+								WHERE  1 = 1
+								<include refid="getPlanListCondition_sql"/>
+								ORDER  BY SOCIAL_SQ DESC
+			<include refid="getListPagingCondition_sql"/>
+	</select>
+	
+	<select id="getSocialCount" parameterType="Social" resultType="int">
+		/* TsaSocial.getSocialCount */
+		SELECT count(*) AS CNT
+		FROM TB_SOCIAL	
+	</select>
+	
+	<sql id="getPlanListCondition_sql">
+		<if test ="siteCd != null and siteCd !=''">
+		AND    SITE_CD = #{siteCd}
+		</if>
+		<if test="useYn != null and useYn != ''">
+		AND    USE_YN = #{useYn}
+		</if>
+		<if test="socialSq != null and socialSq != ''">
+		AND    SOCIAL_SQ = #{socialSq}
+		</if>
+		<if test="socialType != null and socialType != ''">
+		AND    SOCIAL_TYPE = #{socialType}
+		</if>	
+		<if test="frontGb != null and frontGb != ''">
+		AND    FRONT_GB = #{frontGb}
+		</if>
+		<if test="socialStdt != null and socialStdt != ''">
+		AND    DISP_EDDT <![CDATA[>=]]> DATE_FORMAT(#{socialStdt}, '%Y-%m-%d %H:%i:%S')
+		</if>
+		<if test="socialEddt != null and socialEddt != ''">
+		AND    DISP_STDT <![CDATA[<=]]> DATE_FORMAT(#{socialEddt}, '%Y-%m-%d %H:%i:%S')
+		</if>
+	</sql>
+	
+	<sql id="getListPagingCondition_sql">
+		<choose>
+			<when test="pageable != null">
+				) A
+				)Z
+				WHERE RNUM BETWEEN  #{pageable.startRow} AND #{pageable.endRow}
+			</when>
+			<otherwise>
+				) A
+				)Z
+			</otherwise>
+		</choose>
+	</sql>
+
+</mapper>

+ 68 - 49
src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html

@@ -187,32 +187,32 @@
 						</td>
 					</tr>
 					<tr style="display:none" id="append1">
-						<th>댓글제목<em class="required" title="필수"></em></th>
+						<th>댓글제목</th>
 						<td>
-							<input type="text" name="replyTitle1" id="replyTitle1" maxlength="50" required="required" data-valid-name="댓글제목" th:field="*{replyTitle1}"/>
+							<input type="text" name="replyTitle1" id="replyTitle1" maxlength="50" required="required" th:field="*{replyTitle1}"/>
 						</td>
 						
-						<th>댓글서브제목<em class="required" title="필수"></em></th>
+						<th>댓글서브제목</th>
 						<td>
-							<input type="text" name="replyTitle2" id="replyTitle2" maxlength="50" required="required" data-valid-name="댓글서브제목" th:field="*{replyTitle2}"/>
+							<input type="text" name="replyTitle2" id="replyTitle2" maxlength="50" required="required" th:field="*{replyTitle2}"/>
 						</td>
 					
 					</tr>
 					<tr style="display:none" id="append2">
-						<th>댓글위치<em class="required" title="필수"></em></th>
+						<th>댓글위치</th>
 						<td>
 							<label class="rdoBtn"><input type="radio" name="replyLoc" value="U" />상품리스트 상단</label>
 							<label class="rdoBtn"><input type="radio" name="replyLoc" value="D"/>상품리스트 하단</label>
 						</td>
 						
-						<th>투표일련번호<em class="required" title="필수"></em></th>
+						<th>투표일련번호</th>
 						<td>
 							<input type="text" class="w100 aR" name="pollSq" th:field="*{pollSq}"/>
 						</td>
 					
 					</tr>
 					<tr style="display:none" id="append3">
-						<th>댓글이미지<em class="required" title="필수"></em><br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgReplyImgDelYn" value="Y"/></label>]</th>
+						<th>댓글이미지<br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgReplyImgDelYn" value="Y"/></label>]</th>
 						<td>
 							<div th:if=*{replyImg} id="replyImgView" style="float:left;">
 								<img id="replyImgUrl" th:src="${@environment.getProperty('upload.image.view') + '/planning/'} + *{replyImg}" style="max-width:720px;"/>
@@ -228,24 +228,7 @@
 						</td>
 					
 					</tr>
-				</tbody>
-				<tbody>
-					<!-- <tr>
-						<th>웹용소스</th>
-						<td colspan="5">
-							<div style="margin-top:5px;">
-								<textarea name="fsrcPc" id="fsrcPcDetail" rows="15" cols="95" style="width:1280px;"></textarea>
-							</div>
-						</td>
-					</tr>
-					<tr>
-						<th>모바일용소스</th>
-						<td colspan="5">
-							<div style="margin-top:5px;">
-								<textarea name="fsrcMobile" id="fsrcMobileDetail" rows="15" cols="95" style="width:1280px;"></textarea>
-							</div>
-						</td>
-					</tr> -->
+				</tbody>				
 				</table>
 				
 				<div class="panelStyle" style="margin: unset;">
@@ -357,7 +340,7 @@
 	
 		<!-- 기획전 웹 등록 -->
 		<div class="panelContent" th:if="${mode == 'N'}">
-			<form id="planRegisterForm" name="planRegisterForm" action="#" th:action="@{'/system/user/save'}" th:method="post">
+			<form id="planRegisterForm" name="planRegisterForm" th:method="post">
 			<input type="hidden" name="mode" th:value="${mode}"/>
 			<div>
 				<table class="frmStyle">
@@ -368,10 +351,6 @@
 					<tr>
 						<th>기존 기획전</th>
 						<td>
-							<!-- <select name="planSq" id="planSq">
-								<option value="">선택</option>
-								<option th:if="${planList}" th:each="oneData, status : ${planList}" th:value="${oneData.planSq}" th:text="|[${oneData.planSq}]  ${oneData.planNm}|"></option>
-							</select> -->
 							<input type="text" class="w100" name="searchTxt" id="searchTxt" maxlength="20" readonly="readonly"/>
 							<input type="hidden" class="w100" name="planSq_Hideen" id="planSq_Hideen" maxlength="20"/>
 							<button type="button" class="btn icn" id="btnPopupSearchPlan"><i class="fa fa-search"></i></button>
@@ -529,30 +508,30 @@
 					<tr style="display:none" id="append1">
 						<th>댓글제목<em class="required" title="필수"></em></th>
 						<td>
-							<input type="text" name="replyTitle1" id="replyTitle1" maxlength="50" required="required" data-valid-name="댓글제목"/>
+							<input type="text" name="replyTitle1" id="replyTitle1" maxlength="50" required="required"/>
 						</td>
 						
 						<th>댓글서브제목<em class="required" title="필수"></em></th>
 						<td>
-							<input type="text" name="replyTitle2" id="replyTitle3" maxlength="50" required="required" data-valid-name="댓글서브제목"/>
+							<input type="text" name="replyTitle2" id="replyTitle3" maxlength="50" required="required"/>
 						</td>
 					
 					</tr>
 					<tr style="display:none" id="append2">
-						<th>댓글위치<em class="required" title="필수"></em></th>
+						<th>댓글위치</th>
 						<td>
 							<label class="rdoBtn"><input type="radio" name="replyLoc" value="U"/>상품리스트 상단</label>
 							<label class="rdoBtn"><input type="radio" name="replyLoc" value="D"/>상품리스트 하단</label>
 						</td>
 						
-						<th>투표일련번호<em class="required" title="필수"></em></th>
+						<th>투표일련번호</th>
 						<td>
 							<input type="text" class="w100 aR" name="pollSq"/>
 						</td>
 					
 					</tr>
 					<tr style="display:none" id="append3">
-						<th>댓글이미지<em class="required" title="필수"></em></th>
+						<th>댓글이미지</th>
 						<td colspan="5">
 							<div class="uFile w400">
 								<input id="registerReplyImg" name="registerReplyImg" type="file" accept="image/*" class="uFileInput w400"/>
@@ -712,6 +691,12 @@
 			$("#append2").removeAttr('style');
 			$("#append3").removeAttr('style');
 			
+			if(planInfo.replyLoc == "D"){
+				$('#planUpdateForm input:radio[name=replyLoc]:radio[value="D"]').prop('checked', true);
+			}else {
+				$('#planUpdateForm input:radio[name=replyLoc]:radio[value="U"]').prop('checked', true);
+			}
+			
 			if(custGbList.length > 0){
 				var chkboxCnt = $('#planUpdateForm input:checkbox[name=usableCustGbArr]').length;
 				var dataCnt = custGbList.length;
@@ -743,6 +728,40 @@
 		$("#append1").css('display','none');
 		$("#append2").css('display','none');
 		$("#append3").css('display','none');
+		
+		if(planInfo.replyLoc == "D"){
+			$('#planUpdateForm input:radio[name=replyLoc]:radio[value="D"]').prop('checked', true);
+		}else {
+			$('#planUpdateForm input:radio[name=replyLoc]:radio[value="U"]').prop('checked', true);
+		}
+		
+		if(custGbList.length > 0){
+			var chkboxCnt = $('#planUpdateForm input:checkbox[name=usableCustGbArr]').length;
+			var dataCnt = custGbList.length;
+			for(let i=0; i<chkboxCnt; i++){
+				for(let j=0; j<dataCnt; j++){
+					var data = custGbList[j].custGb;
+					if($('#planUpdateForm input:checkbox[name=usableCustGbArr]').eq(i).val() == data){
+						$('#planUpdateForm input:checkbox[name=usableCustGbArr]').eq(i).prop('checked', true);
+						$("#planUpdateForm input:checkbox[name=usableCustGbArr]").eq(i).parent().addClass('checked');
+					}
+				}
+			}
+		}
+		
+		if(custGradeList.length > 0){
+			var chkboxCnt = $('#planUpdateForm input:checkbox[name=usableCustGradeArr]').length;
+			var dataCnt = custGradeList.length;
+			for(let i=0; i<chkboxCnt; i++){
+				for(let j=0; j<dataCnt; j++){
+					var data = custGradeList[j].custGrade;
+					if($('#planUpdateForm input:checkbox[name=usableCustGradeArr]').eq(i).val() == data){
+						$('#planUpdateForm input:checkbox[name=usableCustGradeArr]').eq(i).prop('checked', true);
+						$("#planUpdateForm input:checkbox[name=usableCustGradeArr]").eq(i).parent().addClass('checked');
+					}
+				}
+			}
+		}
 	}
 	
 	
@@ -778,9 +797,9 @@
 		cfnOpenModalPopup(actionUrl,'popupPlan');
 	}
 
-	var fnPlanSave = function(formId) {
-		if (!gagajf.validation(formId))
-			return;
+	 var fnPlanSave = function(formId) {
+		/* if (!gagajf.validation(formId))
+			return;  */
 
 		// 날짜 유효성 체크
 		var stDate = $(formId + ' input[name=startSearchDate]').val().replaceAll("-", "");
@@ -808,25 +827,24 @@
 		$(formId + ' input[name=dispEddt]').val(edDate + ' ' + $(formId + ' select[name=endSearchHour]').val() + ':' + $(formId + ' select[name=endSearchMin]').val() + ':59');
 
 		
-	/* 	if ($('#replyYn').val() == 'Y') {
+		if ($('#replyYn').val() == 'Y') {
 			var replyLoc = $(':radio[name="replyLoc"]:checked').val();
 
 			if (typeof replyLoc == 'undefined') {
 				mcxDialog.alert('댓글 사용 시 댓글위치를 선택해야합니다.');
 				return;
 			}
-		}  */
+		} 
 
 		// poll 관리일련번호 유효성 체크
-		/* if (!gagajf.isNull($(formId + ' input[name=pollSq]').val())) {
+		if (!gagajf.isNull($(formId + ' input[name=pollSq]').val())) {
 			gagajf.ajaxFormSubmit('/marketing/poll/list', formId, function(result) {
-				console.log(result);
 				if (result.length < 1) {
 					mcxDialog.alert('입력하신 투표 일련번호가 존재 하지않습니다.');
 					return;
 				}
 			});
-		} */
+		} 
 
 		var privacyPolicy = '';
 		var frontGb = $('#frontGb').val();
@@ -868,10 +886,10 @@
 			//}
 		}
 
-		if(!gagajf.isNull($(formId + ' input[name=planQtitle]').val()) && gagajf.isNull(privacyPolicy.replace(/<br>/gi, '').replace(/<p>/gi, '').replace(/<\/\p>/gi, ''))){
+		/* if(!gagajf.isNull($(formId + ' input[name=planQtitle]').val()) && gagajf.isNull(privacyPolicy.replace(/<br>/gi, '').replace(/<p>/gi, '').replace(/<\/\p>/gi, ''))){
 			mcxDialog.alert('입력항목 등록 시 개인정보 수집동의를 입력해 주세요.');
 			return;
-		}
+		} */
 
 		//var jsonData = JSON.stringify($("#planRegisterForm").serializeObject());
 		
@@ -985,6 +1003,11 @@
 							,mainMimg : $('#planUpdateForm input[name=mainMimg]').val()
 							,fsrcPc :  $('#planUpdateForm input[name=fsrcPc]').val()
 							,fsrcMobile : $('#planUpdateForm input[name=fsrcMobile]').val()
+							,replyImg : $('#planUpdateForm input[name=replyImg]').val()
+							,replyLoc : $('#planUpdateForm input:radio[name="replyLoc"]:checked').val()
+							,replyTitle1 : $('#planUpdateForm input[name=replyTitle1]').val()
+							,replyTitle2 : $('#planUpdateForm input[name=replyTitle2]').val()
+							,pollSq : $('#planUpdateForm input[name=pollSq]').val()
 						}	
 					
 					
@@ -1207,10 +1230,6 @@
 				$('#planDetailForm input[name=goodsLimitQty]').show();
 			}
 
-			// 썸머노트 값 설정
-			$('#fsrcPcDetail').summernote('code', fsrcPc.fsrc);
-			$('#fsrcMobileDetail').summernote('code', fsrcMobile.fsrc);
-
 			if($("#planGb").val()!='E'){
 				$("#questionEventInsert").hide();
 				$("#questionEventUpdate").hide();

+ 159 - 35
src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html

@@ -29,6 +29,16 @@
 			<input type="hidden" name="rePlanContSq">
 			<input type="hidden" name="cuPlanContSq">
 			<input type="hidden" name="filePlanContSq">
+			<input type="hidden" name="goodsPlanContSq1">
+			<input type="hidden" name="goodsPlanContSq2">
+			<input type="hidden" name="goodsPlanContSq3">
+			<input type="hidden" name="goodsPlanContSq4">
+			<input type="hidden" name="goodsPlanContSq5">
+			<input type="hidden" name="goodsPlanContSq6">
+			<input type="hidden" name="goodsPlanContSq7">
+			<input type="hidden" name="goodsPlanContSq8">
+			<input type="hidden" name="goodsPlanContSq9">
+			<input type="hidden" name="goodsPlanContSq10">
 			<div class="cardArea" style="height: 700px; margin: 3px;">
 
 				<div class="panelContent">
@@ -200,8 +210,8 @@
 										<col width="90%" />
 									</colgroup>
 									<tr>
-										<th>전시순서<br/>[전시여부<label class="chkBox"><input type="checkbox" name="topFsrcDispYn" value="N"/></label>]</th>	
-										<td><input type="text" name ="topFsrcDispOrd" value="" class="w100 aR" data-valid-type="numeric"></td>
+										<th>[전시여부<label class="chkBox"><input type="checkbox" name="topFsrcDispYn" value="N"/></label>]</th>	
+										<!-- <td><input type="text" name ="topFsrcDispOrd" value="" class="w100 aR" data-valid-type="numeric"></td> -->
 									</tr>
 									<tr>
 										<th>웹용소스</th>
@@ -244,8 +254,8 @@
 										<col width="90%" />
 									</colgroup>
 									<tr>
-										<th>전시순서<br/>[전시여부<label class="chkBox"><input type="checkbox" name="btmFsrcDispYn" value="N"/></label>]</th>	
-										<td><input type="text" name ="btmFsrcDispOrd" value="" class="w100 aR" data-valid-type="numeric"></td>
+										<th>[전시여부<label class="chkBox"><input type="checkbox" name="btmFsrcDispYn" value="N"/></label>]</th>	
+										<!-- <td><input type="text" name ="btmFsrcDispOrd" value="" class="w100 aR" data-valid-type="numeric"></td> -->
 									</tr>
 									<tr>
 										<th>웹용소스</th>
@@ -432,7 +442,7 @@
 															<td>
 																<label class="rdoBtn"><input type="radio" name="goodsType3" value="G082_50" />1개</label> 
 																<label class="rdoBtn"><input type="radio" name="goodsType3" value="G082_51" />2개</label> 
-																<label class="rdoBtn"><input type="radio" name="goodsType4" value="G082_52" />4개</label>
+																<label class="rdoBtn"><input type="radio" name="goodsType3" value="G082_52" />4개</label>
 															</td>
 														</tr>
 														<tr>
@@ -1214,61 +1224,171 @@
 	function btnDeleteGridNum1(param){
 		if($('#btnAddGridNum1').css('display') !='none'){
 			$('#btnAddGridNum1').hide();
-			$('#btnAddGridNum1')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq1]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle1]").val('');
+			$("#planTemplateForm input[name=goodsUrl1]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd1]").val('');
+			$('#planTemplateForm input:radio[name=goodsType1]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn1]').prop('checked', false);
+			gridOptions_p1.api.updateRowData();
 		}
 	}		
 	function btnDeleteGridNum2(param){
 		if($('#btnAddGridNum2').css('display') !='none'){
 			$('#btnAddGridNum2').hide();
-			$('#searchForm2')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq2]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle2]").val('');
+			$("#planTemplateForm input[name=goodsUrl2]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd2]").val('');
+			$('#planTemplateForm input:radio[name=goodsType2]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn2]').prop('checked', false);
+			gridOptions_p2.api.updateRowData();
 		}			
 	}			
 	function btnDeleteGridNum3(param){
 		if ($('#btnAddGridNum3').css('display') !='none'){
 			$('#btnAddGridNum3').hide();
-			$('#searchForm3')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq3]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle3]").val('');
+			$("#planTemplateForm input[name=goodsUrl3]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd3]").val('');
+			$('#planTemplateForm input:radio[name=goodsType3]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn3]').prop('checked', false);
+			gridOptions_p3.api.updateRowData();
 		}			
 	}		
 	function btnDeleteGridNum4(param){
 		if ($('#btnAddGridNum4').css('display') !='none'){
 			$('#btnAddGridNum4').hide();
-			$('#searchForm3')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq4]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle4]").val('');
+			$("#planTemplateForm input[name=goodsUrl4]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd4]").val('');
+			$('#planTemplateForm input:radio[name=goodsType4]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn4]').prop('checked', false);
+			gridOptions_p4.api.updateRowData();
 		}			
 	}
 	function btnDeleteGridNum5(param){
 		if ($('#btnAddGridNum5').css('display') !='none'){
 			$('#btnAddGridNum5').hide();
-			$('#searchForm5')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq5]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle5]").val('');
+			$("#planTemplateForm input[name=goodsUrl5]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd5]").val('');
+			$('#planTemplateForm input:radio[name=goodsType5]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn5]').prop('checked', false);
+			gridOptions_p5.api.updateRowData();
 		}
 	} 
 	function btnDeleteGridNum6(param){
 		if ($('#btnAddGridNum6').css('display') !='none'){
 			$('#btnAddGridNum6').hide();
-			$('#searchForm6')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq6]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle6]").val('');
+			$("#planTemplateForm input[name=goodsUrl6]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd6]").val('');
+			$('#planTemplateForm input:radio[name=goodsType6]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn6]').prop('checked', false);
+			gridOptions_p6.api.updateRowData();
 		}
 	} 
 	function btnDeleteGridNum7(param){
 		if ($('#btnAddGridNum7').css('display') !='none'){
 			$('#btnAddGridNum7').hide();
-			$('#searchForm7')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq7]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle7]").val('');
+			$("#planTemplateForm input[name=goodsUrl7]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd7]").val('');
+			$('#planTemplateForm input:radio[name=goodsType7]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn7]').prop('checked', false);
+			gridOptions_p7.api.updateRowData();
 		}
 	} 
 	function btnDeleteGridNum8(param){
 		if ($('#btnAddGridNum8').css('display') !='none'){
 			$('#btnAddGridNum8').hide();
-			$('#searchForm8')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq8]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle8]").val('');
+			$("#planTemplateForm input[name=goodsUrl8]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd8]").val('');
+			$('#planTemplateForm input:radio[name=goodsType8]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn8]').prop('checked', false);
+			gridOptions_p8.api.updateRowData();
 		}
 	} 
 	function btnDeleteGridNum9(param){
 		if ($('#btnAddGridNum9').css('display') !='none'){
 			$('#btnAddGridNum9').hide();
-			$('#searchForm9')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq9]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle9]").val('');
+			$("#planTemplateForm input[name=goodsUrl9]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd9]").val('');
+			$('#planTemplateForm input:radio[name=goodsType9]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn9]').prop('checked', false);
+			gridOptions_p9.api.updateRowData();
 		}
 	} 
 	function btnDeleteGridNum10(param){
 		if ($('#btnAddGridNum10').css('display') !='none'){
 			$('#btnAddGridNum10').hide();
-			$('#searchForm10')[0].reset();
+			var deleteData = [];
+			var data = {};
+				data.planContSq = $('#planTemplateForm input[name=goodsPlanContSq10]').val();
+				deleteData.push(data);
+			var jsonData = JSON.stringify(deleteData);
+			gagajf.ajaxJsonSubmit('marketing/planning/detail/template/goods/delete', jsonData);
+			$("#planTemplateForm input[name=goodsTitle10]").val('');
+			$("#planTemplateForm input[name=goodsUrl10]").val('');
+			$("#planTemplateForm input[name=goodsDispOrd10]").val('');
+			$('#planTemplateForm input:radio[name=goodsType10]').prop('checked', false);
+			$('#planTemplateForm input:checkbox[name=goodsDispYn10]').prop('checked', false);
+			gridOptions_p10.api.updateRowData();
 		}
 	} 	
 	
@@ -1485,11 +1605,6 @@
 		// html 상단 전시 클릭했을 경우
 		if($("input:checkbox[name=topFsrcDispYn]").prop("checked")){
 			$("input:checkbox[name=topFsrcDispYn]").val('Y');
-			
-			if($("input[name=topFsrcDispOrd]").val()==''){
-				mcxDialog.alert('HTML[상단] 전시순서를 입력하세요.');
-				return;
-			}
 			if($("textarea[name=fsrcMobileTop]").val()=='' && $("textarea[name=fsrcPcTop]").val()==''){
 				mcxDialog.alert('HTML[상단] 내용을  입력하세요.');
 				return;
@@ -1501,11 +1616,6 @@
 		// html 하단 전시 클릭했을 경우
 		if($("input:checkbox[name=btmFsrcDispYn]").prop("checked")){
 			$("input:checkbox[name=btmFsrcDispYn]").val('Y');
-			
-			if($("input[name=btmFsrcDispOrd]").val()==''){
-				mcxDialog.alert('HTML[하단] 전시순서를 입력하세요.');
-				return;
-			}
 			if($("textarea[name=fsrcMobileBtm]").val()=='' && $("textarea[name=fsrcPcBtm]").val()==''){
 				mcxDialog.alert('HTML[하단] 내용을  입력하세요.');
 				return;
@@ -1745,60 +1855,70 @@
 		goodsTemp1.goodsType = $('#planTemplateForm input:radio[name=goodsType1]:checked').val();
 		goodsTemp1.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd1]').val();
 		goodsTemp1.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn1]').val();
+		goodsTemp1.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq1]').val();
 		
 		goodsTemp2.goodsTitle = $('#planTemplateForm input[name=goodsTitle2]').val();
 		goodsTemp2.goodsUrl = $('#planTemplateForm input[name=goodsUrl2]').val();
 		goodsTemp2.goodsType = $('#planTemplateForm input:radio[name=goodsType2]:checked').val();
 		goodsTemp2.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd2]').val();
 		goodsTemp2.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn2]').val();
+		goodsTemp2.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq2]').val();
 		
 		goodsTemp3.goodsTitle = $('#planTemplateForm input[name=goodsTitle3]').val();
 		goodsTemp3.goodsUrl = $('#planTemplateForm input[name=goodsUrl3]').val();
 		goodsTemp3.goodsType = $('#planTemplateForm input:radio[name=goodsType3]:checked').val();
 		goodsTemp3.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd3]').val();
 		goodsTemp3.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn3]').val();
+		goodsTemp3.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq3]').val();
 		
 		goodsTemp4.goodsTitle = $('#planTemplateForm input[name=goodsTitle4]').val();
 		goodsTemp4.goodsUrl = $('#planTemplateForm input[name=goodsUrl4]').val();
 		goodsTemp4.goodsType = $('#planTemplateForm input:radio[name=goodsType4]:checked').val();
 		goodsTemp4.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd4]').val();
 		goodsTemp4.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn4]').val();
+		goodsTemp4.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq4]').val();
 		
 		goodsTemp5.goodsTitle = $('#planTemplateForm input[name=goodsTitle5]').val();
 		goodsTemp5.goodsUrl = $('#planTemplateForm input[name=goodsUrl5]').val();
 		goodsTemp5.goodsType = $('#planTemplateForm input:radio[name=goodsType5]:checked').val();
 		goodsTemp5.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd5]').val();
 		goodsTemp5.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn5]').val();
+		goodsTemp5.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq5]').val();
 		
 		goodsTemp6.goodsTitle = $('#planTemplateForm input[name=goodsTitle6]').val();
 		goodsTemp6.goodsUrl = $('#planTemplateForm input[name=goodsUrl6]').val();
 		goodsTemp6.goodsType = $('#planTemplateForm input:radio[name=goodsType6]:checked').val();
 		goodsTemp6.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd6]').val();
 		goodsTemp6.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn6]').val();
+		goodsTemp6.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq6]').val();
 		
 		goodsTemp7.goodsTitle = $('#planTemplateForm input[name=goodsTitle7]').val();
 		goodsTemp7.goodsUrl = $('#planTemplateForm input[name=goodsUrl7]').val();
 		goodsTemp7.goodsType = $('#planTemplateForm input:radio[name=goodsType7]:checked').val();
 		goodsTemp7.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd7]').val();
 		goodsTemp7.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn7]').val();
+		goodsTemp7.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq7]').val();
 		
 		goodsTemp8.goodsTitle = $('#planTemplateForm input[name=goodsTitle8]').val();
 		goodsTemp8.goodsUrl = $('#planTemplateForm input[name=goodsUrl8]').val();
 		goodsTemp8.goodsType = $('#planTemplateForm input:radio[name=goodsType8]:checked').val();
 		goodsTemp8.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd8]').val();
 		goodsTemp8.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn8]').val();
+		goodsTemp8.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq8]').val();
 		
 		goodsTemp9.goodsTitle = $('#planTemplateForm input[name=goodsTitle9]').val();
 		goodsTemp9.goodsUrl = $('#planTemplateForm input[name=goodsUrl9]').val();
 		goodsTemp9.goodsType = $('#planTemplateForm input:radio[name=goodsType9]:checked').val();
 		goodsTemp9.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd9]').val();
 		goodsTemp9.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn9]').val();
+		goodsTemp9.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq9]').val();
 		
 		goodsTemp10.goodsTitle = $('#planTemplateForm input[name=goodsTitle10]').val();
 		goodsTemp10.goodsUrl = $('#planTemplateForm input[name=goodsUrl10]').val();
 		goodsTemp10.goodsType = $('#planTemplateForm input:radio[name=goodsType10]:checked').val();
 		goodsTemp10.goodsDispOrd = $('#planTemplateForm input[name=goodsDispOrd10]').val();
 		goodsTemp10.goodsDispYn = $('#planTemplateForm input:checkbox[name=goodsDispYn10]').val();
+		goodsTemp10.goodsPlanContSq = $('#planTemplateForm input[name=goodsPlanContSq10]').val();
 		
 		mcxDialog.confirm('기획전 템플릿을 등록 하시겠습니까?', {
 			cancelBtnText: "취소",
@@ -1920,7 +2040,10 @@ $(document).ready(function() {
 					$('#planTemplateForm input:checkbox[name="reDispYn"]').prop('checked', true);
 				}
 				
-				gridOptionsPlanReviewList.api.setRowData(reviewList);
+				if(typeof reviewList[0].reItemVal != 'undefined' && reviewList[0].reItemVal != null){
+					gridOptionsPlanReviewList.api.setRowData(reviewList);	
+				}
+				
 				
 			}
 			if(typeof couponList[0] != 'undefined'){
@@ -1961,7 +2084,7 @@ $(document).ready(function() {
 					$('#planTemplateForm input:checkbox[name="fileDispYn"]').prop('checked', true);
 				}
 				
-				if(fileList.length > 0)
+				if(fileList.length > 0 && fileList[0].fileItemVal != null)
 				{
 					for (var i = 0; i <fileList.length; i++) {
 						var tag = '';
@@ -1982,10 +2105,9 @@ $(document).ready(function() {
 				if (fsrcListBtm[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="btmFsrcDispYn"]').prop('checked', true);
 				}
-				if(fsrcListBtm[0].frontGb == 'P')
-					$('#fsrcPcBtm').summernote('code', fsrcListBtm[0].fsrcBtm);
-				if(fsrcListBtm[1].frontGb == 'M')
-					$('#fsrcMobileBtm').summernote('code', fsrcListBtm[1].fsrcBtm);
+			
+				$('#fsrcPcBtm').summernote('code', fsrcListBtm[0].fsrcPc);
+				$('#fsrcMobileBtm').summernote('code', fsrcListBtm[0].fsrcMob);
 			}
 			
 			//html(상단)
@@ -1995,10 +2117,9 @@ $(document).ready(function() {
 				if (fsrcListTop[0].dispYn == 'Y') {
 					$('#planTemplateForm input:checkbox[name="topFsrcDispYn"]').prop('checked', true);
 				}
-				if(fsrcListTop[0].frontGb == 'P')
-					$('#fsrcPcTop').summernote('code', fsrcListTop[0].fsrcTop);
-				if(fsrcListTop[1].frontGb == 'M')
-					$('#fsrcMobileTop').summernote('code', fsrcListTop[1].fsrcTop);
+			
+				$('#fsrcPcTop').summernote('code', fsrcListTop[0].fsrcPc);
+				$('#fsrcMobileTop').summernote('code', fsrcListTop[0].fsrcMob);
 			}
 			
 			//상품
@@ -2009,6 +2130,8 @@ $(document).ready(function() {
 					$('#planTemplateForm input[name=goodsTitle'+(i+1)+']').val(goodsList[i].title);						
 					$('#planTemplateForm input[name=goodsUrl'+(i+1)+']').val(goodsList[i].linkUrl);
 					$('#planTemplateForm input[name=goodsDispOrd'+(i+1)+']').val(goodsList[i].dispOrd);
+					$('#planTemplateForm input[name=goodsPlanContSq'+(i+1)+']').val(goodsList[i].planContSq);
+					$('#planTemplateForm input[name=goodsPlanContItemSq'+(i+1)+']').val(goodsList[i].planContItemSq);
 					
 					if (goodsList[0].dispYn == 'Y') {
 						$('#planTemplateForm input:checkbox[name=goodsDispYn'+(i+1)+']').prop('checked', true);
@@ -2024,6 +2147,7 @@ $(document).ready(function() {
 					
 					$('#btnAddGridNum' + (i + 1)).show();
 					
+					
 					gridOptions_p1.api.setRowData(goodsDetailList1);
 					gridOptions_p2.api.setRowData(goodsDetailList2);
 					gridOptions_p3.api.setRowData(goodsDetailList3);

+ 750 - 0
src/main/webapp/WEB-INF/views/marketing/SocialShoppingListForm.html

@@ -0,0 +1,750 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PlanListForm.html
+ * @desc    : 기획전관리 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.3.3   	 sowon		   최초 작성
+ *******************************************************************************
+ -->
+<div id="main">
+	<div class="main-title">
+	</div>
+
+	<div class="panelStyle">
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/social/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<table class="frmStyle">
+				<colgroup>
+					<col style="width:5%;"/>
+					<col style="width:20%;"/>
+					<col style="width:5%;"/>
+					<col style="width:20%;"/>
+					<col style="width:5%;"/>
+					<col style="width:10%;"/>
+					<col style="width:5%;"/>
+					<col style="width:10%;"/>
+					<col/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>진행기간</th>
+						<td colspan="7" id="terms"></td>
+					</tr>
+					<tr>
+						<th>소셜번호</th>
+						<td>
+							<input type="text" name="socualSq" id="socualSq"/>
+						</td>
+
+						<th>등록자</th>
+						<td>
+							<input type="text" name="regId" id="regId"/>
+						</td>
+
+						<th>사용여부</th>
+						<td>
+							<select name="useYn">
+								<option value="">전체</option>
+								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd">
+								<option value="">선택</option>
+								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+							</select>
+						</td>
+						<th>웹/모바일구분</th>
+						<td>
+							<select name="frontGb">
+								<option value="A">ALL</option>
+								<option value="P">웹</option>
+								<option value="M">모바일</option>
+							</select>
+						</td>
+
+						<th>소셜유형</th>
+						<td>
+							<select name="socialType">
+								<option value="">선택</option>
+								<option th:if="${socialTypeList}" th:each="oneData, status : ${socialTypeList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+							</select>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+			<ul class="panelBar">
+				<li class="center">
+					<input type="button" value="초기화" class="btn btn-gray btn-lg" id="btnReset" onclick="fnReset();"/>
+				<input type="button" value="조회" class="btn btn-base btn-lg" id="btnSearch" onclick="fnSearch();"/>
+				</li>
+			</ul>
+		
+
+
+			<div class="panelContent">
+				<ul class="panelBar">
+					<li class="right">
+						 검색결과 : <strong><span id="gridRowTotalCount">0</span> 건</strong>&nbsp; 쪽번호 <span id="pgNo">0</span>/
+								<strong id="endPgNo">0</strong>&nbsp;&nbsp; <select id="pageSize" name="pageSize">
+									<option value="50" selected="selected">50개씩 보기</option>
+									<option value="100">100개씩 보기</option>
+									<option value="500">500개씩 보기</option>
+									<option value="1000">1000개씩 보기</option>
+								</select> <input type="hidden" name="pageNo" id="pageNo" value="1" />
+					</li>
+				</ul>
+			
+				<div id="gridList" style="width: 100%; height: 500px;" class="ag-theme-balham"></div>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<div class="tablePaging" id="socialListPagination"></div>
+					</li>
+				</ul>
+			</div>
+	</form>
+</div>
+
+	<!-- TABS AREA -->
+	<div class="tabs">
+		<ul class="tabsNav">
+			<li class="on"><a href="#tab-1">기본정보</a></li>
+			<li class="off"><a href="#tab-2">소셜상품</a></li>
+		</ul>
+
+		<ul class="tabsCont">
+			<!-- 기본 정보 -->
+			<li class="tab on" id="tab-1">
+					<div class="panelStyle">
+						<!-- 버튼 배치 영역 -->
+						<ul class="panelBar">
+							<li class="right">
+								<button type="button" class="btn btn-info btn-lg" onclick="$('#detailForm')[0].reset(); $('.tabsNav li').eq(1).addClass('off');">신규</button>
+							<button type="button" class="btn btn-success btn-lg" onclick="fnSocialSaveValid();">저장</button>
+							</li>
+						</ul>
+						<!-- //버튼 배치 영역 -->
+						
+					</div>
+
+					<div class="panelStyle" style="border-top: #fff">
+						<form id="detailForm" name="detailForm" action="#" th:action="@{'/marketing/event/save'}">
+							<table class="frmStyle">
+								<colgroup>
+									<col style="width:''">
+									<col style="width:''">
+									<col style="width:''">
+									<col style="width:''">
+									<col style="width:''">
+									<col style="width:''">
+									<col style="width:''">
+									<col style="width:''">
+								</colgroup>
+								<tr>
+									<th>소셜번호</th>
+									<td>
+										<input type="text" name="socialSq" id="socialSq" readonly="readonly"/>
+									</td>
+									
+									<th>사이트</th>
+									<td>
+										<select name="siteCd" required="required" data-valid-name="사이트">
+											<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+										</select>
+									</td>
+									
+									<th>사용여부</th>
+									<td>
+										<select name="useYn" required="required" data-valid-name="사용여부">
+											<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+										</select>
+									</td>
+
+									<th>웹/모바일구분</th>
+									<td>
+										<select name="frontGb" required="required" data-valid-name="웹/모바일구분">
+											<option value="A">ALL</option>
+											<option value="P">웹</option>
+											<option value="M">모바일</option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<th>소셜명</th>
+									<td colspan="3">
+										<input type="text" name="socialNm" id="socialNm" required="required" data-valid-name="소셜명"/>
+									</td>
+									<th>소셜타이틀명</th>
+									<td colspan="3">
+										<input type="text" name="socialTnm" id="socialTnm"/>
+									</td>
+								</tr>
+								<tr>
+									<th>소셜유형</th>
+									<td colspan="3">
+										<select name="socialType" required="required" data-valid-name="소셜유형">
+											<option th:if="${socialTypeList}" th:each="oneData, status : ${socialTypeList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+										</select>
+										 <span id="planSpan">
+											<button type="button" class="btn btn-base btn-lg" id="btnSearchPlan">기획전 조회</button>
+											<input type="text" name="socialPlanSq" readonly="readonly"/>
+											<input type="hidden" name="planSq"/>
+										</span>
+									</td>
+									
+									<th>진행기간</th>
+									<td>
+										<input name="stDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="진행시작일자" />
+										<select id="stTimeHour" required="required" data-valid-name="진행기간 시작시간">
+											<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+											<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
+											</th:block>
+										</select>
+										 ~ 
+										<input name="edDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="진행종료일자" />
+										<select id="edTimeHour" required="required" data-valid-name="진행기간 종료시간">
+											<th:block th:each="num: ${#numbers.sequence(0,23)}">
+											<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시</option>
+											</th:block>
+										</select>
+										
+										<input type="hidden" name="socialStdt"/>
+										<input type="hidden" name="socialEddt"/>
+									</td>
+									
+									<th>적용구분</th>
+									<td>
+										<select name="applyGb" required="required" data-valid-name="적용구분">
+											<option value="P">대기</option>
+											<option value="A">적용</option>
+											<option value="F">종료</option>
+										</select>
+									</td>
+									
+								</tr>
+							</table>
+						</form>
+					</div>			
+					<div class="panelStyle" style="border-top: #fff">		
+					
+					</div>
+				</li>
+			
+			<!-- 소셜 상품 -->
+			<li class="tab" id="tab-2">
+				<div class="panelStyle">	
+						<span class="btnLeft">
+							<select name="priceGb" id="priceGb">
+								<option value="">선택</option>
+								<option value="currAprice">판매가</option>
+								<option value="dcArate">할인율</option>
+								<option value="pntAprate">PC 포인트</option>
+								<option value="pntAmrate">MOBILE 포인트</option>
+							</select>
+							
+							<input type="text" class="w100 aR" id="price" name="price" data-valid-type="numeric"/>
+							
+							<button type="button" class="btn btn-default btn-lg" onclick="fnPriceApply();">일괄적용</button>
+						</span> 
+						<ul class="panelBar">
+							<li class="right">
+								<button type="button" class="btn btn-default btn-lg" onclick="fnOpenGoodsPopup();">상품추가</button>
+								<button type="button" class="btn btn-default btn-lg" onclick="fnDeleteGoods();">상품삭제</button>
+								<button type="button" class="btn btn-default btn-lg" onclick="fnSocialGoodsExcelUpload();">엑셀상품추가</button>
+								<button type="button" class="btn btn-default btn-lg" onclick="cfnDownloadSampleFile('SF011');">엑셀상품추가 양식 다운로드</button>
+								<button type="button" class="btn btn-success btn-lg" onclick="fnSocialGoodsSave();">저장</button>
+								<button type="button" class="btn btn-success btn-lg" onclick="fnSocialSaveValid();">저장</button>
+							</li>
+						</ul>
+					<div class="panelStyle">	
+						<div id="gridGoodsList" style="width: 100%; height: 500px;"  class="ag-theme-balham"></div>
+					</div>
+					
+					
+					<!-- <li class="boxContentBtnB" style="margin-top: 10px;">
+						<span class="btnRight">
+							<button type="button" class="btn btn-success btn-lg" onclick="">즉시적용</button>
+						</span>
+					</li> -->
+				</div>
+			</li>
+
+		</ul>
+	</div>
+
+</div>
+
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+
+	var siteList = gagajf.convertToArray([[${siteList}]]);
+	var socialTypeList = ([[${socialTypeList}]]);
+	var wmGbList = {"A":"ALL", "P":"웹", "M":"모바일"};
+	var applyList = {"P":"대기", "A":"적용", "F":"종료"};
+
+	var columnDefs = [
+		{headerName: "사이트"		, field:'siteCd'		, width:100, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(siteList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(siteList, params.newValue); }
+		},
+		{headerName: "소셜번호"		, field:'socialSq'		, width:100, cellClass: 'text-center'},
+		{headerName: "소셜명"		, field:'socialNm'		, width:300, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: "소셜타이틀명"	, field:'socialTnm'		, width:200, cellClass: 'text-center'},
+		{headerName: "진행시작일시"	, field:'socialStdt'	, width:150, cellClass: 'text-center'},
+		{headerName: "진행종료일시"	, field:'socialEddt'	, width:150, cellClass: 'text-center'},
+		{headerName: "프론트구분"	, field:'frontGb'		, width:120, cellClass: 'text-center',
+			 valueFormatter: function (params) { return gagaAgGrid.lookupValue(wmGbList, params.value); }
+		},
+		{headerName: "소셜유형"		, field:'socialType'	, width:150, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(socialTypeList, params.value); }
+		},
+		{headerName: "사용여부"		, field:'useYn'			, width:80 , cellClass: 'text-center'},
+		{headerName: "적용구분"	, field:'applyGb'	, width:100, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(applyList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(applyList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(applyList, params.newValue); }
+		},
+		{headerName: "등록자"		, field:'regNm'			, width:100, cellClass: 'text-center'},
+		{headerName: "등록일"		, field:'regDt'			, width:150, cellClass: 'text-center'},
+	];
+
+	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
+
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'socialNm')
+			return;
+
+		$('.tabsNav li').eq(0).trigger('click');
+		fnBindDetail(event.data); // 바인딩
+	}
+
+	// 바인딩
+	var fnBindDetail = function(data) {
+		fnSearchSocialGoodsList(data.socialSq);
+		fnSetDate(data);
+	}
+	
+	// 데이터 설정
+	var fnSetDate = function(data) {
+		var formId = '#detailForm';
+		
+		$('.tabsNav li').eq(1).removeClass('off');
+		
+		// 기본정보 입력
+		$(formId + ' input[name=socialSq]').val(data.socialSq);
+		$(formId + ' input[name=socialNm]').val(data.socialNm);
+		$(formId + ' input[name=socialTnm]').val(data.socialTnm);
+		$(formId + ' select[name=siteCd]').val(data.siteCd);
+		$(formId + ' select[name=useYn]').val(data.useYn);
+		$(formId + ' select[name=frontGb]').val(data.frontGb);
+		$(formId + ' select[name=socialType]').val(data.socialType);
+		$(formId + ' select[name=planSq]').val(data.planSq);
+		$(formId + ' select[name=socialType]').trigger('change');
+		
+		// 진행 기간 설정
+		var stDate = data.socialStdt.split(" ")[0];
+		var edDate = data.socialEddt.split(" ")[0];
+		var stTime = data.socialStdt.split(" ")[1].replaceAll(":", "");
+		var edTime = data.socialEddt.split(" ")[1].replaceAll(":", "");
+		
+		// 진행 시작 기간 설정
+		$(formId + ' input[name=stDate]').val(stDate);
+		$('#stTimeHour').val(stTime.substring(0,2));
+		
+		// 진행 종료 기간 설정
+		$(formId + ' input[name=edDate]').val(edDate);
+		$('#edTimeHour').val(edTime.substring(0,2));
+	}
+	
+	// 소셜 기본정보 저장
+	var fnSocialSaveValid = function() {
+		var formId = '#detailForm';
+		
+		if (!gagajf.validation(formId))
+			return;
+		
+		// 날짜 유효성 체크
+		var stDate = $(formId + ' input[name=stDate]').val().replaceAll("-", "");
+		var edDate = $(formId + ' input[name=edDate]').val().replaceAll("-", "");
+		var stTime = $('#stTimeHour').val().replaceAll(":", "");
+		var edTime = $('#edTimeHour').val().replaceAll(":", "");
+		var toDate = _today.replaceAll("-", "");
+		
+		var socialSq = $(formId + ' input[name=socialSq]').val();
+		var planSq = $(formId + ' input[name=planSq]').val();
+		
+		var msg = '저장';
+		if (gagajf.isNull(socialSq)) {
+			msg = '등록';
+			// 신규
+			if (Number(stDate) < Number(toDate)) {
+				mcxDialog.alert('시작일자는 오늘포함 이후로 등록해주세요.');
+				return;
+			}
+			
+			if (Number(edDate) < Number(toDate)) {
+				mcxDialog.alert('종료일자는 오늘포함 이후로 등록해주세요.');
+				return;
+			}
+		}
+		
+		if (Number(stDate) > Number(edDate)) {
+			mcxDialog.alert('종료일자는 시작일자 보다 클 수 없습니다.');
+			return;
+		}
+		
+		if (Number(stDate) == Number(edDate)) {
+			if (Number(stTime) > Number(edTime)) {
+				mcxDialog.alert('시작시간은 종료시간보다 클 수 없습니다.');
+				return;
+			}
+			
+			if (Number(stTime) == Number(edTime)) {
+				mcxDialog.alert('같은 날 시작시간과 종료시간은 같을 수 없습니다.');
+				return;
+			}
+		}
+		
+		$(formId + ' input[name=socialStdt]').val($(formId + ' input[name=stDate]').val() + ' ' + stTime);
+		$(formId + ' input[name=socialEddt]').val($(formId + ' input[name=edDate]').val() + ' ' + edTime);
+		
+		//fnPlanCheck(planSq, msg);
+		fnSocialSave(msg);
+	}
+	
+	// 기획전 체크
+	var fnPlanCheck = function(planSq, msg) {
+		if (gagajf.isNull(planSq)) {
+			fnSocialSave(msg);
+			return;
+		}
+		
+		var params = new Object();
+		params.planSq = planSq;
+		var jsonData = JSON.stringify(params);
+		
+		gagajf.ajaxJsonSubmit('marketing/social/list', jsonData, function(result) {
+			if (result.length > 0) {
+				
+				var checkFlag = false;
+				var socialSq = $('#detailForm input[name=socialSq]').val();
+				$(result).each(function(idx, data) {
+					if (data.socialSq != socialSq) checkFlag = true;
+				});
+				
+				if (checkFlag) {
+					mcxDialog.alert('선택한 기획전은 이미 다른 소셜에 적용되어있습니다.');
+					return;
+				}
+			} 
+			fnSocialSave(msg);
+		});
+	}
+	
+	// 소셜 저장
+	var fnSocialSave = function(msg) {
+		mcxDialog.confirm(msg +' 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var actionUrl = '/marketing/social/save';
+				gagajf.ajaxFormSubmit(actionUrl, '#detailForm', function() {
+					fnSearch();
+				});
+			}
+		});
+	}
+
+	// 검색
+	var fnSearch = function() {
+		$('.tabsNav li').eq(1).addClass('off');
+		$('.tabsNav li').eq(0).trigger('click');
+		
+		gagaPaging.init('searchForm', fnSearchCallBack, 'socialListPagination', $('#pageSize').val());
+		gagaPaging.load($("#searchForm input[name=pageNo]").val());
+	}
+	
+	var fnSearchCallBack = function(result){
+		$('#searchForm').find('#gridRowTotalCount').html(result.pageing.pageable.totalCount.addComma());
+		$('#searchForm').find('#pageNo').val(result.pageing.pageable.pageNo.addComma());
+		$('#searchForm').find('#pgNo').html(result.pageing.pageable.pageNo.addComma());
+		$('#searchForm').find('#endPgNo').html(result.pageing.pageable.totalPage.addComma());
+		gridOptions.api.setRowData(result.socialList);
+		
+		gagaPaging.createPagination(result.pageing.pageable);
+	}
+	
+	var columnDefsGoods = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "상품코드"				, field:'goodsCd'	, width:300 , cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: '적용 판매가'			, field:'currAprice', width:200 , cellClass: 'text-right', cellEditor: 'numericCellEditor', hide : true
+			, editable: function(params) { return gagajf.isNull(params.data.dcArate) ? true : false; } 
+			, cellRenderer: function(params) { return gagajf.isNull(params.value) ? '' : params.value.addComma(); }
+		}, // 변경 후 현재판매가
+		{headerName: '적용 할인율'			, field:'dcArate'	, width:200 , cellClass: 'text-right', cellEditor: 'numericCellEditor', hide : true
+			, editable: function(params) { return gagajf.isNull(params.data.currAprice) ? true : false; }
+		}, // 변경 후 할인율
+		{headerName: '적용 PC 포인트'		, field:'pntAprate'	, width:200 , cellClass: 'text-right', editable : true, cellEditor: 'numericCellEditor', hide : true }, // 변경 후 포인트적립율(PC)
+		{headerName: '적용 MOBILE 포인트'	, field:'pntAmrate'	, width:200 , cellClass: 'text-right', editable : true, cellEditor: 'numericCellEditor', hide : true }, // 변경 후 포인트적립율(모바일)
+		{headerName: '표시순서'				, field:'dispOrd'	, width:100 , cellClass: 'text-center', editable : true, cellEditor: 'numericCellEditor', hide : true},
+		{headerName: '삭제여부'				, field:'delYn'		, width:100 , cellClass: 'text-center', hide : true},
+	];
+
+	var gridOptionsGoods = gagaAgGrid.getGridOptions(columnDefsGoods);
+	gridOptionsGoods.rowSelection = 'multiple';
+	
+	// 소셜 상품 목록 검색
+	var fnSearchSocialGoodsList = function(socialSq) {
+		var actionUrl = 'marketing/social/goods/list';
+		var params = new Object();
+		params.socialSq = typeof socialSq == 'object' ? $('#detailForm input[name=socialSq]').val() : socialSq;
+		
+		var jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit(actionUrl, jsonData, function(result) {
+			gridOptionsGoods.api.setRowData(result);
+		});
+	}
+	
+	// 적용가격 일괄적용
+	var fnPriceApply = function() {
+		var priceGb = $('#priceGb').val();
+		var price = $('#price').val();
+		var msg = '';
+		
+		// 선택 된 상품
+		var selectedGoodsList = gagaAgGrid.selectedRowData(gridOptionsGoods);
+		if (selectedGoodsList.length < 1) {
+			mcxDialog.alert('선택한 상품이 존재 하지않습니다.');
+			return;
+		}
+		
+		if (gagajf.isNull(priceGb)) {
+			mcxDialog.alert('일괄적용을 선택 하세요.');
+			$('#priceGb').focus();
+			return;
+		}
+		
+		if (gagajf.isNull(price)) {
+			mcxDialog.alert('할인 금액 및 율을 입력하세요.');
+			$('#price').focus();
+			return;
+		}
+
+		var msg = $("#priceGb option:selected").text() + '을(를) ' + $('#price').val() + '값으로 ';
+		mcxDialog.confirm(msg +'일괄적용 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$(selectedGoodsList).each(function(idx, goods) {
+					
+					if (priceGb == 'currAprice') { // 판매가
+						goods.currAprice = price;
+						goods.dcArate = null;
+					} else if (priceGb == 'dcArate') { // 할인율
+						goods.dcArate = price;
+						goods.currAprice = null;
+					} else if (priceGb == 'pntAprate') { // pc 할인율
+						goods.pntAprate = price;
+					} else if (priceGb == 'pntAmrate') { // mobile 할인율
+						goods.pntAmrate = price;
+					}
+				});
+				
+				gridOptionsGoods.api.updateRowData({update: selectedGoodsList});
+			}
+		});
+	}
+	
+	// 상품 추가
+	var fnOpenGoodsPopup = function() {
+		var edDate = $('#detailForm input[name=socialEddt]').val().replaceAll("-", "");;
+		var toDate = _today.replaceAll("-", "");
+		
+		if (Number(toDate) < Number(edDate)) {
+			mcxDialog.alert("진행종료일자 전에만 상품추가가 가능합니다.");
+			return;
+		}
+		cfnOpenGoodsPopup('fnCreateGoods');
+	}
+	
+	// 상품 추가 콜백
+	var fnCreateGoods = function(result) {
+		if (result.length < 1) return;
+		
+		// 기존상품
+		var oldGoodsList = gagaAgGrid.getAllRowData(gridOptionsGoods);
+		var socialSq = $('#detailForm input[name=socialSq]').val();
+		
+		// 중복체크
+		var check = true;
+		var checkData = [];
+		$(oldGoodsList).each(function(idx) {
+			
+			$(result).each(function(newIdx) {
+				
+				if (oldGoodsList[idx].goodsCd == result[newIdx].goodsCd) {
+					check = false;
+					checkData.push(result[newIdx].goodsCd);
+				}
+			});
+		});
+		
+		if (!check) {
+			mcxDialog.alert('아래 중복상품이 존재 합니다.<br/>' + checkData.join(","));
+			return;
+			
+		} else {
+			if (gagajf.isNull(socialSq)) {
+				mcxDialog.alert('소셜을 선택 해주세요.');
+				return;
+			}
+			
+			for (var disp = 0; disp < result.length; disp++) {
+				var goods = { socialSq : Number(socialSq) ,
+							  scgoodsSq : Number(0) ,
+							  goodsCd : result[disp].goodsCd };
+				oldGoodsList.unshift(goods);
+			}
+		}
+		
+		gridOptionsGoods.api.setRowData(oldGoodsList);
+	}
+	
+	// 상품 삭제
+	var fnDeleteGoods = function() {
+		// 선택 상품
+		var selectedGoodsList = gagaAgGrid.selectedRowData(gridOptionsGoods);
+		
+		if (selectedGoodsList.length < 1) {
+			mcxDialog.alert('선택된 상품이 존재 하지않습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm('선택하신 상품을 삭제하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				$(selectedGoodsList).each(function(idx, goods) {
+					goods.delYn = 'Y';
+				});
+				
+				var jsonData = JSON.stringify(selectedGoodsList);
+				gagajf.ajaxJsonSubmit('/marketing/social/goods/delete', jsonData, fnSearchSocialGoodsList);
+			}
+		});
+	}
+	
+	var fnSocialGoodsExcelUpload = function() {
+		cfnExcelUploadPopup('socialGoodsExcelUpload', 'socialGoodsExcelUpload');
+	}
+	
+	// 상품 엑셀 업로드
+	var socialGoodsExcelUpload = function(result) {
+		var data = {procJob : result.procJob
+					,excelFileNm : result.excelFileNm
+					,socialSq : Number($('#detailForm input[name=socialSq]').val())
+					};
+		
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/marketing/social/goods/excelupload', jsonData, fnSearchSocialGoodsList);
+	}
+	
+	// 소셜 상품 저장
+	var fnSocialGoodsSave = function() {
+		var goodsList = gagaAgGrid.getAllRowData(gridOptionsGoods);
+		
+		if (goodsList.length < 1) {
+			mcxDialog.alert('상품이 존재 하지않습니다.');
+			return;
+		}
+		
+		var checkData = [];
+		var msg = '';
+		/* $(goodsList).each(function(idx, goods) {
+			if (goods.dcArate > 100) {
+				msg = '할인율은 100을 넘을 수 없습니다.';
+				return false;
+			}
+			
+			if (gagajf.isNull(goods.currAprice) && gagajf.isNull(goods.dcArate)) {
+				msg = '상품코드 : ' + goods.goodsCd + '<br/>판매가와 할인율 모두 값이 존재하지않습니다.';
+				return false;
+			}
+			
+		});
+		
+		if (!gagajf.isNull(msg)) {
+			mcxDialog.alert(msg);
+			return;
+		} */
+		
+		mcxDialog.confirm('저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				var jsonData = JSON.stringify(goodsList);
+				gagajf.ajaxJsonSubmit('/marketing/social/goods/save', jsonData, fnSearchSocialGoodsList);
+			}
+		});
+	}
+	
+	
+	$('#btnSearchPlan').on('click', function() {
+		cfnOpenPlanPopup('popupPlan');
+	});
+	
+	var popupPlan = function(result) {
+		$('#detailForm input[name=socialPlanSq]').val("[" + result[0].planSq + "] " +result[0].planNm);
+		$('#detailForm input[name=planSq]').val(result[0].planSq);
+	}
+	
+	$(document).ready(function() {
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', false);
+
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		gagaAgGrid.createGrid('gridGoodsList', gridOptionsGoods);
+		//uifnFitGrid();
+		
+	});
+	
+	// copylight 처리
+	$('.tabsNav li').eq(1).on('click', function() {
+		timer = setInterval(function() { fnCheckClass(1); }, 50); 
+	});
+	
+	$('.tabsNav li').eq(0).on('click', function() {
+		timer = setInterval(function() { fnCheckClass(0); }, 50); 
+	});
+	
+	var fnCheckClass = function(flag) {
+		var tabClass = $('.tabsNav li').eq(flag).attr('class');
+		if (tabClass == 'on') {
+			/*  uifnFitGrid(); */
+			clearInterval(timer);
+		}
+	}
+	
+/*]]>*/
+</script>
+
+</html>