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

Merge branch 'develop' into bin2107

bin2107 5 лет назад
Родитель
Сommit
d307a64119
22 измененных файлов с 2312 добавлено и 554 удалено
  1. 9 0
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  2. 29 5
      src/main/java/com/style24/admin/biz/dao/TsaMailTemplateDao.java
  3. 35 0
      src/main/java/com/style24/admin/biz/dao/TsaPlanDao.java
  4. 17 0
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  5. 109 38
      src/main/java/com/style24/admin/biz/service/TsaMailTemplateService.java
  6. 56 11
      src/main/java/com/style24/admin/biz/service/TsaPlanService.java
  7. 15 2
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  8. 112 28
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  9. 8 0
      src/main/java/com/style24/persistence/domain/CustomerSearch.java
  10. 10 4
      src/main/java/com/style24/persistence/domain/MktmailManagement.java
  11. 3 2
      src/main/java/com/style24/persistence/domain/MktmailManagementGoods.java
  12. 9 3
      src/main/java/com/style24/persistence/domain/Plan.java
  13. 30 2
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  14. 2 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaGoods.xml
  15. 85 43
      src/main/java/com/style24/persistence/mybatis/shop/TsaMailTemplate.xml
  16. 65 40
      src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml
  17. 378 157
      src/main/webapp/WEB-INF/views/marketing/MktmailmanagementDetailForm.html
  18. 38 10
      src/main/webapp/WEB-INF/views/marketing/MktmailmanagementForm.html
  19. 64 0
      src/main/webapp/WEB-INF/views/marketing/MktmailmanagementPreviewForm.html
  20. 296 130
      src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html
  21. 2 2
      src/main/webapp/WEB-INF/views/marketing/PlanListForm.html
  22. 940 76
      src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html

+ 9 - 0
src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java

@@ -225,6 +225,15 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Customer> getCustomerDormantList(CustomerSearch customerSearch);
 
+	/**
+	 * 휴대전화 번호 조회
+	 * @param customerSearch - 검색조건
+	 * @return int - 고객 수
+	 * @author jsshin
+	 * @since 2021. 02. 23
+	 */
+	int getCustomerFindByCellPhone(CustomerSearch customerSearch);
+
 	void createException();
 
 	void updateCutomerEncodeData(Customer customer);

+ 29 - 5
src/main/java/com/style24/admin/biz/dao/TsaMailTemplateDao.java

@@ -62,12 +62,12 @@ public interface TsaMailTemplateDao {
 	 */
 	MktmailManagement getMktmailManagementDetail(Integer mailtSq);
 	Collection<MktmailManagementTc> getMktmailManagementTCList(MktmailManagementTc mktmailManagementTc);
-	Collection<MktmailManagementGoods> getMktmailManagementGoodsList(MktmailManagementGoods mktmailManagementGoods);
+	Collection<MktmailManagementGoods> getMktmailManagementGoodsList(MktmailManagementTc mktmailManagementTc);
 	/**
 	 * MKT메일 등록수정
 	 * @param  mailtemplate - 메일관련 정보
 	 * @author csh9191
-	 * @since 2021. 02. 03
+	 * @since 2021. 02. 13
 	 */
 	void saveMktMailDetail(MktmailManagement mktMailManagement);
 	
@@ -87,7 +87,7 @@ public interface TsaMailTemplateDao {
 	Collection<Goods> getMailGoodsInfo(Goods goods);
 	
 	/**
-	 * 메일헤더푸터 관리 목록
+	 * MKT메일 관리 목록
 	 * @param mailtemplate - 메일관련 정보
 	 * @return
 	 * @author csh9191
@@ -95,11 +95,35 @@ public interface TsaMailTemplateDao {
 	 */
 	Collection<MktmailManagement> getMktMailList(MktmailManagement mktMailManagement);
 	/**
-	 * 메일헤더푸터 리스트 삭제
-	 * @param  mailtemplate - 메일관련 정보
+	 * MKT메일 리스트 삭제
+	 * @param  mktmailManagement - 메일관련 정보
 	 * @author csh9191
 	 * @since 2021. 02. 15
 	 */
 	void deleteMktmailList(MktmailManagement mktMailManagement);
+	/**
+	 * MKT메일 구분자 삭제
+	 * @param  mktmailManagement - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 22
+	 */
+	void deleteMktCorner(MktmailManagementTc mktmailManagementTc);
+	/**
+	 * MKT메일 상품 삭제
+	 * @param  mktmailManagement - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 22
+	 */
+	void deleteMktGoodsList(MktmailManagementGoods mktmailManagementGoods);
+	/**
+	 * MKT 메일 미리보기
+	 * @param mktmailManagement - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 19
+	 */
+	MktmailManagement getMktmailPreviewHeader(Integer mktMailManagement);
+	MktmailManagement getMktmailPreviewFooter(Integer mktMailManagement);
+	MktmailManagement getMktmailPreviewContent(Integer mktMailManagement);
 
 }

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

@@ -279,6 +279,41 @@ public interface TsaPlanDao {
 	 */
 	void createPlanGoodsCopy(Plan param);
 
+	/**
+	 * 기획전 회원구분 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 2. 23
+	 */
+	void createPlanCustGb(Plan param);
+	
+	/**
+	 * 기획전 회원등급 등록
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 2. 23
+	 */
+	void createPlanCustGrade(Plan param);
+	
+	/**
+	 * 기획전 회원구분 조회
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 2. 23
+	 */
+	Collection<Plan> getPlanCustGbList(Plan param);
+	
+	/**
+	 * 기획전 회원등급 조회
+	 *
+	 * @param
+	 * @author sowon
+	 * @since 2021. 2. 23
+	 */
+	Collection<Plan> getPlanCustGradeList(Plan param);
 
 
 }

+ 17 - 0
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -133,6 +133,7 @@ public class TsaCustomerService {
 		Integer userNo = TsaSession.getInfo().getUserNo();
 		customer.setRegNo(userNo);
 		customer.setUpdNo(userNo);
+		customer.encryptData();
 		coreCustomerService.createCustomerHistory(customer);
 		customerDao.updateCustomerCellPhnno(customer);
 	}
@@ -372,4 +373,20 @@ public class TsaCustomerService {
 	public String getTemporaryPassword(int length) {
 		return coreCustomerService.getTemporaryPassword(length);
 	}
+
+	/**
+	 * 휴대전화 번호 조회
+	 * @param  cellPhnno - 고객 번호
+	 * @return int - 고객 수
+	 * @author jsshin
+	 * @since 2021. 02. 23
+	 */
+	public int getCustomerFindByCellPhone(String cellPhnno) {
+		CustomerSearch customerSearch = new CustomerSearch();
+		customerSearch.setSiteCd(TscConstants.Site.STYLE24.value());
+		customerSearch.setCellPhnno(cellPhnno);
+		customerSearch.encryptData();
+		return customerDao.getCustomerFindByCellPhone(customerSearch);
+	}
+
 }

+ 109 - 38
src/main/java/com/style24/admin/biz/service/TsaMailTemplateService.java

@@ -101,8 +101,8 @@ public class TsaMailTemplateService {
 		return mailtempletDao.getMktmailManagementDetail(mailtSq);
 	}
 	/**
-	 * MKT메일관리 상세화면
-	 * @param mktmailManagement
+	 * MKT메일관리 구분자 상세화면
+	 * @param mktmailManagementTc
 	 * @return
 	 * @author csh9191
 	 * @since 2021. 02. 16
@@ -110,27 +110,32 @@ public class TsaMailTemplateService {
 	public Collection<MktmailManagementTc> getMktmailManagementTCList(Integer mailtSq) {
 		MktmailManagementTc mktmailManagementTc = new MktmailManagementTc();
 		mktmailManagementTc.setMailtSq(mailtSq);
+		
 		return mailtempletDao.getMktmailManagementTCList(mktmailManagementTc);
 	}
 	/**
-	 * MKT메일관리 상세화면
-	 * @param mktmailManagement
+	 * MKT메일관리 상품 상세화면
+	 * @param mktmailManagementTc
 	 * @return
 	 * @author csh9191
 	 * @since 2021. 02. 16
 	 */
 	public Collection<MktmailManagementGoods> getMktmailManagementGoodsList(Integer mailtcSq) {
-		MktmailManagementGoods mktmailManagementGoods = new MktmailManagementGoods();
-		mktmailManagementGoods.setMailtcSq(mailtcSq);
-		return mailtempletDao.getMktmailManagementGoodsList(mktmailManagementGoods);
+		MktmailManagementTc mktmailManagementTc = new MktmailManagementTc();
+		mktmailManagementTc.setMailtcSq(mailtcSq);
+		
+		log.info("mktmailManagementTc {}",mktmailManagementTc);
+		
+		return mailtempletDao.getMktmailManagementGoodsList(mktmailManagementTc);
 	}
 	
 	/**
 	 * MKT 상세 등록/수정
-	 * @param mailtemplate - 메일관련 정보
+	 * @param mktmailManagement - 메일관련 정보
 	 * @author csh9191
 	 * @since 2021. 02. 13
 	 */
+	@Transactional("shopTxnManager")
 	public GagaMap saveMktMailTemplate (MktmailManagement mktMailManagement) {
 		GagaMap result = new GagaMap();
 		
@@ -139,22 +144,27 @@ public class TsaMailTemplateService {
 		String mailtNm = mktMailManagement.getMailtNm();
 		String mailtGb = mktMailManagement.getMailtGb();
 		String mailContent = mktMailManagement.getMailContent();
-		
+		log.info("mailtSq {}",mktMailManagement.getMailtSq());
 		MktmailManagement mktmail = new MktmailManagement();
+
 		mktmail.setMktHeader(mailHsq);
 		mktmail.setMktFooter(mailFsq);
 		mktmail.setMailtNm(mailtNm);
 		mktmail.setMailtGb(mailtGb);
 		mktmail.setMailContent(mailContent);
+		mktmail.setRegNo(TsaSession.getInfo().getUserNo());
+		mktmail.setUpdNo(TsaSession.getInfo().getUserNo());
+		mktmail.setMailtSq(mktMailManagement.getMailtSq());
 		
-		//메일 헤더 푸터 타이틀 내용 등록
-		mailtempletDao.saveMktmailform(mktMailManagement); 
-		mktMailManagement.getMailtSq();
-		mktMailManagement.getMailtcSq();
+		log.info("mktmail : {}", mktMailManagement.getMailtSq());
 		
+		//메일 헤더 푸터 타이틀 내용 등록
+		mailtempletDao.saveMktmailform(mktmail); 
+
 		//구분자1 등록
 		for(MktmailManagementTc mktmailManagementTc : mktMailManagement.getMktmailManagementTc()) {
 			if(!StringUtils.isEmpty(mktmailManagementTc.getMailtcNm())) {
+				
 				String mailtcNm = mktmailManagementTc.getMailtcNm();
 				String mailtcLink = mktmailManagementTc.getMailtcLink();
 				int goodsCpr = mktmailManagementTc.getGoodsCpr();
@@ -166,13 +176,15 @@ public class TsaMailTemplateService {
 				mktmailtc.setMailtcNm(mailtcNm);
 				mktmailtc.setMailtcLink(mailtcLink);
 				mktmailtc.setGoodsCpr(goodsCpr);
-				mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+				mktmailtc.setMailtSq(mktmail.getMailtSq());
+				mktmailtc.setMailtcSq(mktmailManagementTc.getMailtcSq());	
+				
+				log.info("구분자1.getMailtcSq() : {}", mktmailManagementTc.getMailtcSq());
 				
 				mailtempletDao.saveMailTc(mktmailtc);
 				//grid1
 				for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods()) {
 					
-					
 					String goodsCd = mktmailManagementGoods.getGoodsCd();
 					int dispOrd = mktmailManagementGoods.getDispOrd();
 	
@@ -183,6 +195,8 @@ public class TsaMailTemplateService {
 					mktmailGoods.setDispOrd(dispOrd);
 					mktmailGoods.setGoodsCd(goodsCd);
 					mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+					
+					log.info("그리드1.getMailtcSq() : {}", mktmailManagementTc.getMailtcSq());
 					//grid 데이터 등록
 					mailtempletDao.saveMailGoods(mktmailGoods);
 				}
@@ -196,7 +210,7 @@ public class TsaMailTemplateService {
 				String mailtcNm = mktmailManagementTc.getMailtcNm();
 				String mailtcLink = mktmailManagementTc.getMailtcLink();
 				int goodsCpr = mktmailManagementTc.getGoodsCpr();
-	
+
 				MktmailManagement mktmailtc = new MktmailManagement();
 	
 				mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
@@ -204,8 +218,11 @@ public class TsaMailTemplateService {
 				mktmailtc.setMailtcNm(mailtcNm);
 				mktmailtc.setMailtcLink(mailtcLink);
 				mktmailtc.setGoodsCpr(goodsCpr);
-				mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
-	
+				mktmailtc.setMailtSq(mktmail.getMailtSq());
+				mktmailtc.setMailtcSq(mktmailManagementTc.getMailtcSq());	
+				
+				log.info("구분자2.getMailtcSq() : {}", mktmailManagementTc.getMailtcSq());
+				
 				mailtempletDao.saveMailTc(mktmailtc);
 				//grid2
 				for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods2()) {
@@ -220,6 +237,8 @@ public class TsaMailTemplateService {
 					mktmailGoods.setDispOrd(dispOrd);
 					mktmailGoods.setGoodsCd(goodsCd);
 					mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+					
+					log.info("그리드2.getMailtcSq() : {}", mktmailtc.getMailtcSq());
 					//grid 데이터 등록
 					mailtempletDao.saveMailGoods(mktmailGoods);
 				}
@@ -232,7 +251,7 @@ public class TsaMailTemplateService {
 			String mailtcNm = mktmailManagementTc.getMailtcNm();
 			String mailtcLink = mktmailManagementTc.getMailtcLink();
 			int goodsCpr = mktmailManagementTc.getGoodsCpr();
-
+			
 			MktmailManagement mktmailtc = new MktmailManagement();
 
 			mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
@@ -240,8 +259,11 @@ public class TsaMailTemplateService {
 			mktmailtc.setMailtcNm(mailtcNm);
 			mktmailtc.setMailtcLink(mailtcLink);
 			mktmailtc.setGoodsCpr(goodsCpr);
-			mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
-
+			mktmailtc.setMailtSq(mktmail.getMailtSq());
+			mktmailtc.setMailtcSq(mktmailManagementTc.getMailtcSq());	
+							
+			log.info("mktmailManagementTc : {}",mktmailManagementTc.getMailtcSq());
+			
 			mailtempletDao.saveMailTc(mktmailtc);
 			//grid3
 			for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods3()) {
@@ -256,7 +278,8 @@ public class TsaMailTemplateService {
 				mktmailGoods.setDispOrd(dispOrd);
 				mktmailGoods.setGoodsCd(goodsCd);
 				mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
-				//grid 데이터 등록
+				
+				log.info("그리드3.getMailtcSq() : {}", mktmailManagementTc.getMailtcSq());//grid 데이터 등록
 				mailtempletDao.saveMailGoods(mktmailGoods);
 			}
 			}
@@ -276,7 +299,11 @@ public class TsaMailTemplateService {
 			mktmailtc.setMailtcNm(mailtcNm);
 			mktmailtc.setMailtcLink(mailtcLink);
 			mktmailtc.setGoodsCpr(goodsCpr);
-			mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+			mktmailtc.setMailtSq(mktmail.getMailtSq());
+			mktmailtc.setMailtcSq(mktmailManagementTc.getMailtcSq());	
+							
+			log.info("mktmailManagementTc : {}",mktmailManagementTc.getMailtcSq());
+			
 			
 			mailtempletDao.saveMailTc(mktmailtc);
 			//grid4
@@ -284,19 +311,16 @@ public class TsaMailTemplateService {
 				
 				String goodsCd = mktmailManagementGoods.getGoodsCd();
 				int dispOrd = mktmailManagementGoods.getDispOrd();
-				
-				MktmailManagementTc mailTc = new MktmailManagementTc();
-				
-				int mailtcSq = mailTc.getMailtcSq();
-				log.info("mailtcSq={}", mailtcSq);
+
 				MktmailManagement mktmailGoods = new MktmailManagement();
 				
-				mktmailGoods.setMailtcSq(mailtcSq);
 				mktmailGoods.setRegNo(TsaSession.getInfo().getUserNo());
 				mktmailGoods.setUpdNo(TsaSession.getInfo().getUserNo());
 				mktmailGoods.setDispOrd(dispOrd);
 				mktmailGoods.setGoodsCd(goodsCd);
 				mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+				
+				log.info("그리드4.getMailtcSq() : {}", mktmailManagementTc.getMailtcSq());
 				//grid 데이터 등록
 				mailtempletDao.saveMailGoods(mktmailGoods);
 			}
@@ -309,7 +333,7 @@ public class TsaMailTemplateService {
 			String mailtcNm = mktmailManagementTc.getMailtcNm();
 			String mailtcLink = mktmailManagementTc.getMailtcLink();
 			int goodsCpr = mktmailManagementTc.getGoodsCpr();
-
+			
 			MktmailManagement mktmailtc = new MktmailManagement();
 
 			mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
@@ -317,8 +341,12 @@ public class TsaMailTemplateService {
 			mktmailtc.setMailtcNm(mailtcNm);
 			mktmailtc.setMailtcLink(mailtcLink);
 			mktmailtc.setGoodsCpr(goodsCpr);
-			mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
-
+			mktmailtc.setMailtSq(mktmail.getMailtSq());
+			mktmailtc.setMailtcSq(mktmailManagementTc.getMailtcSq());	
+							
+			log.info("mktmailManagementTc : {}",mktmailManagementTc.getMailtcSq());
+			
+			
 			mailtempletDao.saveMailTc(mktmailtc);
 			
 			//grid5
@@ -334,6 +362,8 @@ public class TsaMailTemplateService {
 				mktmailGoods.setDispOrd(dispOrd);
 				mktmailGoods.setGoodsCd(goodsCd);
 				mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+				
+				log.info("그리드5.getMailtcSq() : {}", mktmailManagementTc.getMailtcSq());
 				//grid 데이터 등록
 				mailtempletDao.saveMailGoods(mktmailGoods);
 			}
@@ -346,14 +376,14 @@ public class TsaMailTemplateService {
 		return result;
 	}
 	
-	/* MKT 메일 전시 */
+	/* MKT 메일 상품전시 */
 	public Collection<Goods> getMailGoodsInfo(Goods goods) {
 		return mailtempletDao.getMailGoodsInfo(goods);
 	}
 	
 	/**
 	 * MKT메일관리 목록
-	 * @param mailtemplate - 메일관련 정보
+	 * @param mktmailManagement - 메일관련 정보
 	 * @return
 	 * @author csh9191
 	 * @since 2021. 02. 13
@@ -363,8 +393,8 @@ public class TsaMailTemplateService {
 	}
 	
 	/**
-	 * 메일헤더푸터 리스트 삭제
-	 * @param mailtemplate - 메일관련 정보
+	 * MKT메일 목록 삭제
+	 * @param mktmailManagement - 메일관련 정보
 	 * @author csh9191
 	 * @since 2021. 02. 15
 	 */
@@ -378,6 +408,47 @@ public class TsaMailTemplateService {
 			mailtempletDao.deleteMktmailList(mktmailManagement);
 		}
 	}
+	/**
+	 * MKT메일 구분자 삭제
+	 * @param mktmailManagementGoods 메일전시상품
+	 * @author csh9191
+	 * @since 2021. 02. 22
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteMktCorner(Collection<MktmailManagementTc> mktmailManagementTcList) {
+		for(MktmailManagementTc mktmailManagementTc : mktmailManagementTcList) {
+			mailtempletDao.deleteMktCorner(mktmailManagementTc);
+		}
+	}
 	
-
-}
+	/**
+	 * MKT메일 상품 삭제
+	 * @param mktmailManagementGoods 메일전시상품
+	 * @author csh9191
+	 * @since 2021. 02. 22
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteMktGoodsList(Collection<MktmailManagementGoods> mktmailManagementGoodsList) {
+		for(MktmailManagementGoods mktmailManagementGoods : mktmailManagementGoodsList) {
+			mailtempletDao.deleteMktGoodsList(mktmailManagementGoods);
+		}
+	}
+	
+	/**
+	 * MKT메일 미리보기
+	 * @param mktmailManagement - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 19
+	 */
+	public MktmailManagement getMktmailPreviewHeader(Integer mktMailManagement) {
+		return mailtempletDao.getMktmailPreviewHeader(mktMailManagement);
+	}
+	public MktmailManagement getMktmailPreviewFooter(Integer mktMailManagement) {
+		return mailtempletDao.getMktmailPreviewFooter(mktMailManagement);
+	}
+	public MktmailManagement getMktmailPreviewContent(Integer mktMailManagement) {
+		return mailtempletDao.getMktmailPreviewContent(mktMailManagement);
+	}
+	
+}

+ 56 - 11
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -69,7 +69,7 @@ public class TsaPlanService {
 		String[] brand = param.getMultiBrand();
 		// 기획전 브랜드 insert
 		for (int j = 0; j < brand.length; j++) {
-			plan.setBrandCd(brand[j]);
+			plan.setBrandGroupNo(brand[j]);
 			plan.setPlanSq(param.getPlanSq());
 			plan.setRegNo(TsaSession.getInfo().getUserNo());
 			plan.setUpdNo(TsaSession.getInfo().getUserNo());
@@ -85,6 +85,24 @@ public class TsaPlanService {
 			plan.setUpdNo(TsaSession.getInfo().getUserNo());
 			planDao.createPlanCate(plan);
 		}
+		
+		// 기획전 회원구분 insert
+		String[] custGb = param.getUsableCustGbArr();
+		for (int j = 0; j < custGb.length; j++) {
+			plan.setCustGb(custGb[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanCustGb(plan);
+		}
+		
+		// 기획전 회원등급 insert
+		String[] custGrade = param.getUsableCustGradeArr();
+		for (int j = 0; j < custGrade.length; j++) {
+			plan.setCustGrade(custGrade[j]);
+			plan.setPlanSq(param.getPlanSq());
+			plan.setRegNo(TsaSession.getInfo().getUserNo());
+			planDao.createPlanCustGrade(plan);
+		}
 
 		log.debug("planSq : {}", param.getPlanSq());
 
@@ -370,14 +388,15 @@ public class TsaPlanService {
 		}
 
 		if (("Y").equals(param.getOrgReplyImgDelYn())) {
-			param.setReplyImg(null);
+			//param.setReplyImg(null);
 			deleteFile(targetPath, param.getOrgReplyImg());
 		}
 
 		// 기존 기획전 카테고리 삭제 
-		for (int i = 0; i < param.getMultiCate().length; i++) {
-			planDao.deletePlanCate(param);
-		}
+		planDao.deletePlanCate(param);
+//		for (int i = 0; i < param.getMultiCate().length; i++) {
+//			planDao.deletePlanCate(param);
+//		}
 		
 		String[] cate = param.getMultiCate();
 		// 기획전 카테고리insert
@@ -389,15 +408,17 @@ public class TsaPlanService {
 			planDao.createPlanCate(plan);
 		}
 		
-		// 기존 기획전 카테고리 삭제 
-		for (int i = 0; i < param.getMultiCate().length; i++) {
-			planDao.deletePlanCate(param);
-		}
+		// 기존 기획전 카테고리 삭제
+		planDao.deletePlanCate(param);
+//		for (int i = 0; i < param.getMultiCate().length; i++) {
+//			planDao.deletePlanCate(param);
+//		}
+		
 		
 		String[] brand = param.getMultiBrand();
 		// 기획전 브랜드 insert
 		for (int j = 0; j < brand.length; j++) {
-			plan.setBrandCd(brand[j]);
+			plan.setBrandGroupNo(brand[j]);
 			plan.setPlanSq(param.getPlanSq());
 			plan.setRegNo(TsaSession.getInfo().getUserNo());
 			plan.setUpdNo(TsaSession.getInfo().getUserNo());
@@ -463,7 +484,7 @@ public class TsaPlanService {
 		
 		for(Plan brandCd : brandList){
 			plan.setPlanSq(param.getPlanSq());
-			plan.setBrandCd(brandCd.getBrandCd());
+			plan.setBrandGroupNo(brandCd.getBrandGroupNo());
 			plan.setCopyPlanSq(param.getCopyPlanSq()); 
 			planDao.createPlanBrandCopy(plan);
 		}
@@ -800,5 +821,29 @@ public class TsaPlanService {
 			savePlanCornerGoods(goods);
 		}
 	}
+	
+	/**
+	 * 기획전 회원구분 조회
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 23
+	 */
+	public Collection<Plan> getPlanCustGbList(Plan param) {
+		return planDao.getPlanCustGbList(param);	
+	}
+	
+	/**
+	 * 기획전 회원등급 조회
+	 *
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 23
+	 */
+	public Collection<Plan> getPlanCustGradeList(Plan param) {
+		return planDao.getPlanCustGradeList(param);	
+	}
 
 }

+ 15 - 2
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -4,7 +4,6 @@ import java.util.Collection;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.security.GagaPasswordEncoder;
-import com.gagaframework.web.util.GagaCryptoUtil;
 import com.gagaframework.web.util.GagaStringUtil;
 import com.style24.admin.biz.service.TsaCustomerService;
 import com.style24.admin.biz.service.TsaKakaoService;
@@ -312,7 +311,12 @@ public class TsaCustomerController extends TsaBaseController {
 	@ResponseBody
 	public GagaMap getCustomerActiveList(@RequestBody CustomerSearch customerSearch) {
 		GagaMap result = new GagaMap();
-		customerSearch.setRegNo(TsaSession.getInfo().getUserNo()); // 엑셀조회시 로그인 사용자의 엑셀 상품조회시 사용
+		// 회원명, 이메일 암호화
+		if ("custNm".equals(customerSearch.getSearchGb()) || "email".equals(customerSearch.getSearchGb())) {
+			customerSearch.setSearchTxt(CryptoUtils.encryptAES(customerSearch.getSearchTxt()));
+		}
+		customerSearch.encryptData();	//데이터 암호화 필요
+		customerSearch.setRegNo(TsaSession.getInfo().getUserNo());
 		customerSearch.setPageable(new TscPageRequest(customerSearch.getPageNo()-1, customerSearch.getPageSize()));
 		customerSearch.getPageable().setTotalCount(customerService.getCustomerActiveListCount(customerSearch));
 		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
@@ -549,10 +553,19 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/certno/send")
 	@ResponseBody
 	public GagaResponse sendCustomerCertNo(@RequestBody Customer customer) {
+
+		// 1.기존 사용하고 있는 고객이 있는지 확인
+		int custCnt = customerService.getCustomerFindByCellPhone(customer.getCellPhnno());
+
+		if (custCnt > 0) {
+			throw new IllegalStateException("해당 휴대전화번호로 사용하고 있는 고객이 있습니다.");
+		}
+
 		String certNo = GagaStringUtil.getRandomNumber(6);
 		TsaSession.setAttribute("certNo", certNo);
 		TsaSession.setAttribute("cellPhnno", customer.getCellPhnno());
 
+
 		Customer custInfo = customerService.getCustomerInfo(customer.getCustNo());
 		customer.setCustNm(custInfo.getCustNm());
 		customer.setCertNo(certNo);

+ 112 - 28
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -1095,20 +1095,9 @@ public class TsaMarketingController extends TsaBaseController {
 	 * @since 2021. 02. 08
 	 */
 	@GetMapping("/mktmailmanagement/detail/form")
-	public ModelAndView mktmailManagementDetailForm(MktmailManagement mktmailManagement) {
-		
-		ModelAndView mav = new ModelAndView();
-		
-		MktmailManagementTc mktmailManagementTc = new MktmailManagementTc();
-		
-		Integer mailtSq = mktmailManagement.getMailtSq();
-		Integer mailtcSq = mktmailManagementTc.getMailtcSq();
-		
-		log.info("mailtcSq : {}",mailtcSq);
-		log.info("mailtSq : {}",mailtSq);
-		
-		String mode = mktmailManagement.getMode();
+	public ModelAndView mktmailManagementDetailForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "mailtSq", required = false) Integer mailtSq, @RequestParam(value = "mailtcSq", required = false) Integer mailtcSq) {
 		
+		ModelAndView mav = new ModelAndView();		
 		MailTemplate param = new MailTemplate();
 		
 		param.setMailhfGb("H");
@@ -1117,16 +1106,32 @@ public class TsaMarketingController extends TsaBaseController {
 		param.setMailhfGb("F");
 		mav.addObject("mailFsqList", mailTemplateService.getmailHFList(param));
 		
+		// 판매상태
+		String[] mailCds = {"G008_00"};		
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", mailCds));
+		
 		mav.addObject("mode", mode);
 		
 		if ("U".equals(mode)) {
 			
 			mav.addObject("mktmailInfo", mailTemplateService.getMktmailManagementDetail(mailtSq));
-			mav.addObject("mktmailTCInfo", mailTemplateService.getMktmailManagementTCList(mailtSq));
-			mav.addObject("mktmailGoodsInfo", mailTemplateService.getMktmailManagementGoodsList(mailtcSq));
 			
-			log.info("mktmailTCInfo : {}",mailTemplateService.getMktmailManagementTCList(mailtSq));
-			log.info("mktmailGoodsInfo : {}",mailTemplateService.getMktmailManagementGoodsList(mailtcSq));
+			Collection<GagaMap> mapList = new ArrayList();
+			Collection<MktmailManagementTc> tcList = mailTemplateService.getMktmailManagementTCList(mailtSq);
+			log.info("tcList {}",tcList);
+			for (MktmailManagementTc tmp : tcList) {
+				Collection<MktmailManagementGoods> goodsList = mailTemplateService.getMktmailManagementGoodsList(tmp.getMailtcSq());
+				
+				GagaMap map = new GagaMap();
+				map.set("goodsList", goodsList);
+				map.set("tc", tmp);
+				
+				log.info("goodsList {}",goodsList);
+				log.info("tc {}",tmp);
+				mapList.add(map);
+			}
+			
+			mav.addObject("mktmailTCInfo", mapList);
 		}
 		
 		mav.setViewName("marketing/MktmailmanagementDetailForm");
@@ -1144,7 +1149,7 @@ public class TsaMarketingController extends TsaBaseController {
 	
 	@PostMapping("/mktMailManagement/goods/info")
 	@ResponseBody
-	public Collection<Goods> getOrderSampleGoodsInfo(@RequestBody String[] arrGoodsCd) {
+	public Collection<Goods> getMailGoodsInfo(@RequestBody String[] arrGoodsCd) {
 		Goods goods = new Goods();
 		goods.setArrGoodsCd(arrGoodsCd);
 		
@@ -1160,13 +1165,13 @@ public class TsaMarketingController extends TsaBaseController {
 	 */
 	@PostMapping("/mktMailManagement/save")
 	@ResponseBody
-	public GagaMap saveMktMailTemplate(@RequestBody MktmailManagement mktmailManagement){
+	public GagaMap saveMktMailTemplate(@RequestBody MktmailManagement mktMailManagement){
 		GagaMap result = new GagaMap();
-		mktmailManagement.setRegNo(TsaSession.getInfo().getUserNo());
-		mktmailManagement.setUpdNo(TsaSession.getInfo().getUserNo());
+		
 		result.set("status", GagaResponseStatus.FAIL.getCode());
+		log.info("mailtSq {}",mktMailManagement.getMailtSq());
+		result = mailTemplateService.saveMktMailTemplate(mktMailManagement);
 
-		result = mailTemplateService.saveMktMailTemplate(mktmailManagement);
 		result.set("message", message.getMessage("SUCC_0001"));
 		return result;
 	}
@@ -1184,8 +1189,8 @@ public class TsaMarketingController extends TsaBaseController {
 		return mailTemplateService.getMktMailList(mktmailManagement);
 	}
 	/**
-	 * 메일헤더푸터 리스트 삭제
-	 * @param 메일헤더푸터관리 - 메일헤더푸더 정보
+	 * MKT메일관리 목록 삭제
+	 * @param 
 	 * @return
 	 * @author csh9191	
 	 * @since 2021. 02. 15
@@ -1197,6 +1202,83 @@ public class TsaMarketingController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0003"));
 	}
 	
+	/**
+	 * MKT메일관리 코너(구분) 삭제
+	 * @param 
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 22
+	 */
+	@PostMapping("/mktmailManagement/corner/delete")
+	@ResponseBody
+	public GagaMap deleteMktCorner(@RequestBody Collection<MktmailManagementTc> mktmailManagementTcList) {
+		GagaMap result = new GagaMap();
+		mailTemplateService.deleteMktCorner(mktmailManagementTcList);
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+		return result;
+
+	}
+
+	/**
+	 * MKT메일관리 상품 삭제
+	 * @param 
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 22
+	 */
+	@PostMapping("/mktmailManagement/goods/delete")
+	@ResponseBody
+	public GagaResponse deleteMktGoods(@RequestBody Collection<MktmailManagementGoods> mktmailManagementGoodsList) {		
+		mailTemplateService.deleteMktGoodsList(mktmailManagementGoodsList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+
+	
+	/**
+	 * MKT메일관리 미리보기
+	 * @param 
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 19
+	 */
+	@GetMapping("/mktmailmanagement/preview")
+	@ResponseBody
+	public ModelAndView MktmailmanagementPreview(@RequestParam(value = "mailtSq", required = false) Integer mailtSq) {
+
+		ModelAndView mav = new ModelAndView();
+		
+		//헤더
+		mav.addObject("mktmailPreviewHeader", mailTemplateService.getMktmailPreviewHeader(mailtSq));
+		//푸터
+		mav.addObject("mktmailPreviewFooter", mailTemplateService.getMktmailPreviewFooter(mailtSq));
+		//내용
+		mav.addObject("mktmailPreviewContent", mailTemplateService.getMktmailPreviewContent(mailtSq));
+		
+		// 판매상태
+		String[] mailCds = {"G008_00"};		
+		mav.addObject("goodsStatList", rendererService.getCommonCodeList("G008", "Y", mailCds));		
+		
+		Collection<GagaMap> mapList = new ArrayList();
+		Collection<MktmailManagementTc> tcList = mailTemplateService.getMktmailManagementTCList(mailtSq);
+		log.info("tcList 1263LINE {}",tcList);
+			for (MktmailManagementTc tmp : tcList) {
+				Collection<MktmailManagementGoods> goodsList = mailTemplateService.getMktmailManagementGoodsList(tmp.getMailtcSq());
+				
+				GagaMap map = new GagaMap();
+				map.set("goodsList", goodsList);
+				map.set("tc", tmp);
+				
+				log.info("goodsList {}",goodsList);
+				log.info("tc {}",tmp);
+				mapList.add(map);
+			}
+		
+		mav.addObject("mktmailPreviewGoods", mapList);
+		
+		mav.setViewName("marketing/MktmailmanagementPreviewForm");
+
+		return mav;
+	}
 	/* // CSB 진행 */
 
 	/**
@@ -1605,9 +1687,11 @@ public class TsaMarketingController extends TsaBaseController {
 			// 상위제휴채널 조회
 			mav.addObject("upperAfLinkCdList", rendererService.getAvailCommonCodeList("G053"));
 
-			//mav.addObject("planQuestionList", planService.getPlanQuestionList(param));
-
-			//mav.addObject("brandList", rendererService.getSupplyCompanyBrandList("W"));
+			// 선택한 회원유형
+			mav.addObject("gbList", planService.getPlanCustGbList(param));
+			
+			// 선택한 회원등급
+			mav.addObject("gradeList", planService.getPlanCustGradeList(param));
 		}
 
 		// 사이트 목록
@@ -1631,7 +1715,7 @@ public class TsaMarketingController extends TsaBaseController {
 	}
 	
 	/**
-	 * 기획전 등록
+	 * 기획전 등록
 	 *
 	 * @return
 	 * @author sowon

+ 8 - 0
src/main/java/com/style24/persistence/domain/CustomerSearch.java

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.style24.core.support.util.CryptoUtils;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
 import lombok.Data;
@@ -42,4 +43,11 @@ public class CustomerSearch extends TscBaseDomain {
 	private int pageSize = 50;
 	private int pageUnit = 10;
 
+	// 암호화 대상 데이터 암호화 처리
+	public void encryptData () {
+		this.custNm = CryptoUtils.encryptAES(this.custNm);
+		this.cellPhnno = CryptoUtils.encryptAES(this.cellPhnno);
+		this.email = CryptoUtils.encryptAES(this.email);
+	}
+
 }

+ 10 - 4
src/main/java/com/style24/persistence/domain/MktmailManagement.java

@@ -1,6 +1,5 @@
 package com.style24.persistence.domain;
 
-import java.util.Collection;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -23,6 +22,8 @@ public class MktmailManagement extends TscBaseDomain{
 	private Integer mailtSq; 				// 메일템플릿 번호
 	private String mailtNm;					// 메일템플릿 명
 	private String mailtGb;					// 메일템플릿 구분
+	private Integer mailHsq;
+	private Integer mailFsq;	
 	private Integer mktHeader;				// 메일헤더 일련번호
 	private Integer mktFooter;				// 메일푸터 일련번호
 	private String mailContent;				// 메일 내용
@@ -55,6 +56,7 @@ public class MktmailManagement extends TscBaseDomain{
 	List<MktmailManagementTc> mktmailManagementTc4; 
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	List<MktmailManagementTc> mktmailManagementTc5; 
+	
 	// 메일 템플릿 코너 
 	private Integer mailtcSq;				// 메일템플릿 코너번호
 	private String mailtcNm;				// 메일템플릿 코너명
@@ -62,13 +64,17 @@ public class MktmailManagement extends TscBaseDomain{
 	private String mailtcLink;				// 메일템플릿 코너 링크
 	
 	//상품정보
-	private String brandKnm;				// 브랜드명
-	private String goodNms;					// 상품명
-	private String cdNm;					// 판매상태
+	private String brandEnm;				// 브랜드명
+	private String goodsNm;					// 상품명
+	private String goodsStat;				// 판매상태
 	private String listPrice;				// 정상가
 	private String currPrice;				// 판매가
 	private String goodsCd;					// 상품코드(상품)
 	private Integer dispOrd;				// 표시순서
+	
+	//미리보기
+	private String mailhfContent;			//메잃 헤더 푸터 정보
+	
 
 
 	

+ 3 - 2
src/main/java/com/style24/persistence/domain/MktmailManagementGoods.java

@@ -16,6 +16,7 @@ public class MktmailManagementGoods extends TscBaseDomain{
 	
 	// 메일 템플릿 코너 상품
 	private Integer mailtcSq;				// 메일템플릿코너 일련번호
+	private Integer mailtSq;				// 메일템플릿 일련번호
 	private String goodsCd;					// 상품코드(상품)
 	private Integer dispOrd;				// 표시순서
 	private String regDt;					// 등록일시
@@ -23,8 +24,8 @@ public class MktmailManagementGoods extends TscBaseDomain{
 	
 	//상품정보
 	private String brandEnm;				// 브랜드명
-	private String goodNms;					// 상품명
-	private String cdNm;					// 판매상태
+	private String goodsNm;					// 상품명
+	private String goodsStat;				// 판매상태
 	private String listPrice;				// 정상가
 	private String currPrice;				// 판매가
 

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

@@ -85,10 +85,10 @@ public class Plan extends TscBaseDomain{
 		private String copyBrandCd;	        //복사할 브랜드코드
 		private String adminPreview;	// 어드민미리보기 여부 (Y:미리보기)
 		// 기획전 브랜드
-		private String brandCd;		//기획전브랜드코드
+		private String brandGroupNo;	//기획전브랜드그룹번호
 		private String DispYn;      	//표시여부           
-		private String brandKnm;    // 브랜드명(한글)
-		private String brandEnm;    // 브랜드명(영문)
+		private String brandGroupKnm; 	// 브랜드 그룹명(한글)
+		private String brandGroupEnm; 	// 브랜드 그룹명(영어)
 		/* Multi CheckBox 항목*/
 		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 		private String[] multiBrand;
@@ -164,5 +164,11 @@ public class Plan extends TscBaseDomain{
 		@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 		private String[] conditionList;
 		
+		 // 사용가능고객등급
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	    private String[] usableCustGradeArr;
 		
+	    // 사용가능고객구분
+	    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	    private String[] usableCustGbArr;
 }

+ 30 - 2
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -70,7 +70,7 @@
 		AND    LOWER(CUST_NM) LIKE CONCAT('%',LOWER(#{custNm}),'%')
 		</if>
 		<if test="email != null and email != ''">
-		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{eamil}),'%')
+		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{email}),'%')
 		</if>
 		<if test="custId != null and custId != ''">
 		AND    CUST_ID = #{custId}
@@ -182,7 +182,7 @@
 		AND    LOWER(CUST_NM) LIKE CONCAT('%',LOWER(#{custNm}),'%')
 		</if>
 		<if test="email != null and email != ''">
-		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{eamil}),'%')
+		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{email}),'%')
 		</if>
 		<if test="custId != null and custId != ''">
 		AND    CUST_ID = #{custId}
@@ -972,4 +972,32 @@
 		WHERE  CUST_NO = #{custNo}
 	</update>
 
+	<!-- 휴대전화로 고객 조회 -->
+	<select id="getCustomerFindByCellPhone" parameterType="CustomerSearch" resultType="int">
+		/* TsaCustomer.getCustomerFindByCellPhone */
+		SELECT B.CNT
+		FROM (
+		      SELECT A.CNT
+		          , ROW_NUMBER() OVER (ORDER BY A.CNT DESC) AS NUMB
+		      FROM (
+		            SELECT COUNT(*) AS CNT
+		            FROM   TB_CUSTOMER
+		            WHERE  CUST_STAT = 'G104_10'   /* 활동회원*/
+		            AND    SITE_CD = #{siteCd}
+		            AND    CELL_PHNNO = #{cellPhnno}
+		            UNION ALL
+		            SELECT COUNT(*) AS CNT
+		            FROM   TB_SECEDE_CUST
+		            WHERE  SITE_CD = #{siteCd}
+		            AND    CELL_PHNNO = #{cellPhnno}
+		            UNION ALL
+		            SELECT COUNT(*) AS CNT
+		            FROM   TB_DORMANT_CUST
+		            WHERE  SITE_CD = #{siteCd}
+		            AND    CELL_PHNNO = #{cellPhnno}
+		          ) A
+		) B
+		WHERE NUMB = 1
+	</select>
+
 </mapper>

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

@@ -1316,7 +1316,7 @@
 		       REPLACE(G.GOODS_NM,' ',''),';',
 		       B.BRAND_ENM,';',
 		       B.BRAND_KNM,';',
-		       B.BRAND_GRP_NM,';',
+		       (CASE WHEN D.DISP_NM_LANG = 'EN' THEN D.BRAND_GROUP_ENM ELSE D.BRAND_GROUP_KNM END),';',
 		       IF(NULLIF(G.STYLE_YEAR,'') IS NULL, '' ,CONCAT(G.STYLE_YEAR,';')),
 		       IF(NULLIF(G.SEASON_CD, '') IS NULL, '' ,CONCAT(FN_GET_CODE_NM('G006',G.SEASON_CD),';')) ,
 		       IF(NULLIF( G.SEX_GB,'') IS NULL, '' ,CONCAT(FN_GET_CODE_NM('G007',G.SEX_GB),';')) ,
@@ -1325,6 +1325,7 @@
 		       )) AS GOODS_SNM
 		FROM TB_GOODS G
 		INNER JOIN TB_BRAND B ON G.BRAND_CD = B.BRAND_CD
+		INNER JOIN TB_BRAND_GROUP D ON B.BRAND_GROUP_NO  = D.BRAND_GROUP_NO
 		LEFT OUTER JOIN TB_ITEMKIND I ON G.ITEMKIND_CD = I.ITEMKIND_CD
 		LEFT OUTER JOIN TMP_COLOR_GOODS D ON G.GOODS_CD = D.GOODS_CD
 		WHERE G.GOODS_CD = #{goodsCd}

+ 85 - 43
src/main/java/com/style24/persistence/mybatis/shop/TsaMailTemplate.xml

@@ -52,7 +52,7 @@
 		     , NOW()
 		)
 		ON DUPLICATE KEY UPDATE
-		        MAILHF_SQ = #{mailhfSq}
+		       MAILHF_SQ = #{mailhfSq}
 		     , MAILHF_NM = #{mailhfNm}
 		     , MAILHF_GB = #{mailhfGb}
 		     , MAILHF_CONTENT = #{mailhfContent}
@@ -80,24 +80,12 @@
 		<select id="getMailGoodsInfo" parameterType="Goods" resultType="Goods">
 		/*메일 템플릿 상품 전시*/
 		SELECT GOODS_CD
-		     , GOODS_NM
 		     , BRAND_ENM 
-		     , STOCK_QTY_SUM
+		     , GOODS_NM
 	         , GOODS_STAT
-	         , STYLE_YEAR
-		     , SEASON_CD
 	         , LIST_PRICE
 	         , CURR_PRICE
-	         , PRICE_UPD_DT
-	         , ERP_STOCK_LINK_YN
-	         , FORMAL_GB
-	         , RETURNABLE_YN
-	         , REG_DT
-	         , REG_NM
-		     , UPD_DT
-	         , UPD_NM
-	         , REP_GOODS_CD
-		     , GROUP_CONCAT(OPT_CD2 ORDER BY DISP_ORD DESC, OPT_CD2 SEPARATOR ',')        AS SITE_CD
+		     , GROUP_CONCAT(OPT_CD2 ORDER BY DISP_ORD DESC, OPT_CD2 SEPARATOR ',')  AS SITE_CD
 	      FROM (
 		SELECT   GI.SYS_IMG_NM
 			   , G.GOODS_CD
@@ -141,8 +129,7 @@
 				   , UPD_DT, UPD_NM, REP_GOODS_CD
 		</select>
 	
-	
-		<insert id="saveMktmailform" parameterType="MktmailManagement" keyProperty="mailtSq">
+		<insert id="saveMktmailform" parameterType="mktMailManagement" keyProperty="mailtSq">
 		/* TsaMailTemplate.saveMktmailform   mkt메일 등록/수정 */
 		INSERT INTO TB_MAILT (
 				    MAILT_SQ
@@ -247,27 +234,27 @@
 		
 		<select id="getMktMailList" parameterType="MktmailManagement" resultType="MktmailManagement">
 		/* TsaMailTemplate.getMktMailList mkt메일 조회*/
-		SELECT MAILT_SQ
-			 , MAILT_GB
-			 , MAILT_NM
-			 , FN_GET_USER_NM(REG_NO)             AS REG_NM
-			 , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
-			 , FN_GET_USER_NM(UPD_NO)             AS UPD_NM
-			 , DATE_FORMAT(UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
-		FROM   TB_MAILT 
-		WHERE  USE_YN = 'Y'
+		SELECT 		   TM.MAILT_SQ
+					 , TM.MAILT_GB
+					 , TM.MAILT_NM
+					 , FN_GET_USER_NM(TM.REG_NO)             AS REG_NM
+					 , DATE_FORMAT(TM.REG_DT,'%Y%m%d%H%i%S') AS REG_DT
+					 , FN_GET_USER_NM(TM.UPD_NO)             AS UPD_NM
+					 , DATE_FORMAT(TM.UPD_DT,'%Y%m%d%H%i%S') AS UPD_DT
+		FROM    	   TB_MAILT TM
+		WHERE  		   TM.USE_YN = 'Y'
 		<if test="mktmailStdt != null and mktmailStdt != '' and mktmailEddt != null and mktmailEddt != ''">
-		AND  REG_DT BETWEEN STR_TO_DATE(#{mktmailStdt}, '%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{mktmailEddt}, '235959'),'%Y-%m-%d%H%i%S')
+		AND  TM.REG_DT BETWEEN STR_TO_DATE(#{mktmailStdt}, '%Y-%m-%d%H%i%S') AND STR_TO_DATE(CONCAT(#{mktmailEddt}, '235959'),'%Y-%m-%d%H%i%S')
 		</if> 
 		<if test="searchTxt != null and searchTxt != ''">
 			<if test="searchGb != null and searchGb == 'mailtSq'">
-				AND MAILT_SQ = #{searchTxt}
+				AND TM.MAILT_SQ = #{searchTxt}
 			</if>
 			<if test="searchGb != null and searchGb == 'mailtNm'">
-				AND MAILT_NM LIKE CONCAT('%',LOWER(#{searchTxt}), '%')
+				AND TM.MAILT_NM LIKE CONCAT('%',LOWER(#{searchTxt}), '%')
 			</if>
 		</if>
-		ORDER BY MAILT_SQ
+		ORDER BY TM.MAILT_SQ
 		</select>
 		
 		<select id="getMktmailManagementDetail" parameterType="Integer" resultType="MktmailManagement">
@@ -282,26 +269,39 @@
 		WHERE  MAILT_SQ = #{mailtSq}
 		</select>
 		
-		<select id="getMktmailManagementTCList" parameterType="Integer" resultType="MktmailManagement">
+		<select id="getMktmailManagementTCList" parameterType="MktmailManagementTc" resultType="MktmailManagementTc">
 		/* TsaMailTemplate.getMktmailManagementTCDetail */
-		SELECT MAILTC_SQ
-			 , MAILT_SQ	
-			 , MAILTC_NM
-			 , GOODS_CPR	
-			 , MAILTC_LINK
-		FROM   TB_MAILTC
-		WHERE  MAILT_SQ = #{mailtSq}
+		SELECT 		TC.MAILTC_SQ
+			 	  , TC.MAILT_SQ	
+			 	  , TC.MAILTC_NM
+			  	  , TC.GOODS_CPR	
+			 	  , TC.MAILTC_LINK
+		FROM   		TB_MAILTC TC
+		INNER JOIN 	TB_MAILT TM
+		ON 			TM.MAILT_SQ = TC.MAILT_SQ 
+		WHERE  		TC.MAILT_SQ = #{mailtSq}
+		AND	  		TC.USE_YN = "Y"
 		</select>
 		
-		<select id="getMktmailManagementGoodsList" parameterType="Integer" resultType="MktmailManagement">
+		<select id="getMktmailManagementGoodsList" parameterType="MktmailManagementTc" resultType="MktmailManagementGoods">
 		/* TsaMailTemplate.getMktmailManagementGoodsList */
-		SELECT  	TG.MAILTC_SQ,
-					TG.GOODS_CD,
-					TG.DISP_ORD
+		 SELECT		TG.MAILTC_SQ
+				  , TG.GOODS_CD
+			      , TBRAND.BRAND_ENM 
+			      , tbg.GOODS_NM 
+			      , TBG.GOODS_STAT
+			      , TBG.LIST_PRICE 
+			      , TBG.CURR_PRICE
+			      , TG.DISP_ORD
 		FROM 		TB_MAILTC_GOODS TG
 		INNER JOIN  TB_MAILTC TC
-		ON 			TG.MAILTC_SQ = TC.MAILTC_SQ 
+		ON 			TC.MAILTC_SQ = TG.MAILTC_SQ 
+		INNER JOIN  tb_goods TBG
+		ON 			TBG.GOODS_CD = TG.GOODS_CD 
+		INNER JOIN 	tb_brand TBRAND
+		ON		    TBRAND.BRAND_CD = TBG.BRAND_CD
 		WHERE 		TC.MAILTC_SQ = #{mailtcSq}
+		ORDER  BY 	TG.DISP_ORD
 		</select>
 		
 		<update id='deleteMktmailList' parameterType='MktmailManagement'>
@@ -310,5 +310,47 @@
 	  	SET     USE_YN = 'N'
 		WHERE   MAILT_SQ = #{mailtSq}
 		</update>
+		
+		<delete id="deleteMktCorner" parameterType='MktmailManagementTc'>
+		/* TsaMailTemplate.deleteMktCorner 코너 삭제*/
+		UPDATE  TB_MAILTC
+		SET		USE_YN = 'N'
+		WHERE	MAILTC_SQ = #{mailtcSq}
+		</delete>
+		
+		<delete id="deleteMktGoodsList" parameterType='MktmailManagementGoods'>
+		/* TsaMailTemplate.deleteMktGoods 상품 삭제*/
+		DELETE 	
+		FROM	TB_MAILTC_GOODS
+		WHERE	MAILTC_SQ = #{mailtcSq}
+		</delete>
+		
+		<select id="getMktmailPreviewHeader" parameterType="Integer" resultType="MktmailManagement">
+		/* TsaMailTemplate.getMktmailPreviewHeader */
+		SELECT 		HF.MAILHF_CONTENT
+		FROM   		TB_MAILT TM
+		INNER JOIN  TB_MAILHF HF
+		ON 	  		TM.MAILH_SQ = HF.MAILHF_SQ
+		WHERE 		HF.MAILHF_GB = 'H'
+		AND 		TM.MAILT_SQ = #{mailtSq}
+		</select>
+		
+		<select id="getMktmailPreviewFooter" parameterType="Integer" resultType="MktmailManagement">
+		/* TsaMailTemplate.getMktmailPreviewFooter */
+		SELECT 		HF.MAILHF_CONTENT
+		FROM   		TB_MAILT TM
+		INNER JOIN  TB_MAILHF HF
+		ON 	  		TM.MAILF_SQ = HF.MAILHF_SQ
+		WHERE 		HF.MAILHF_GB = 'F'
+		AND 		TM.MAILT_SQ = #{mailtSq}
+		</select>
+		
+		<select id="getMktmailPreviewContent" parameterType="MktmailManagement" resultType="MktmailManagement">
+		/* TsaMailTemplate.getMktmailPreviewContent */
+		SELECT 		MAILT_NM
+				  , MAIL_CONTENT
+		FROM		TB_MAILT
+		WHERE 		MAILT_SQ =   #{mailtSq}
+		</select>
 	
 </mapper>

+ 65 - 40
src/main/java/com/style24/persistence/mybatis/shop/TsaPlan.xml

@@ -12,10 +12,6 @@
 		       PLAN_SQ               
 		     , PLAN_NM               
 		     , PLAN_GB               
-		     <!-- , CUST_GB -->
-		    <!--  , CUST_GRADE -->
-		     <!-- , PLAN_SNM -->
-		     , TEMPLATE_TYPE         
 		     , SITE_CD               
 		     , FRONT_GB              
 		     , DISP_STDT             
@@ -25,16 +21,12 @@
 		     , DTL_PIMG              
 		     , DTL_MIMG              
 		     , DTL_TITLE1            
-		     <!-- , DTL_TITLE2 -->          
-		     <!-- , CATE_CD               
-		     , CATE_DISP_YN   -->        
 		     , REPLY_YN              
 		     , REPLY_LOC           
 		     , REPLY_IMG           
 		     , REPLY_TITLE1        
 		     , REPLY_TITLE2        
 		     , POLL_SQ             
-		     <!-- , PRIVACY_POLICY -->
 		     , DEV_URL             
 		     , CORNER_NM_DISP_YN   
 		     , GOODS_LIMIT_YN      
@@ -54,10 +46,6 @@
 		       #{planSq}
 		     , #{planNm}
 		     , #{planGb}
-		    <!--  , #{custGb} -->
-		     <!-- , #{custGrade} -->
-		     <!-- , #{planSnm} -->
-		     , #{templateType}
 		     , #{siteCd}
 		     , #{frontGb}
 		     , DATE_FORMAT(#{dispStdt} , '%Y-%m-%d %H:%i:%s')
@@ -67,15 +55,12 @@
 		     , #{dtlPimg}
 		     , #{dtlMimg}
 		     , #{dtlTitle1}
-		     <!-- , #{cateCd}
-		     , NVL(#{cateDispYn}, 'N') -->
 		     , #{replyYn}
 		     , #{replyLoc}
 		     , #{replyImg}
 		     , #{replyTitle1}
 		     , #{replyTitle2}
 		     , #{pollSq}
-		     <!-- , #{privacyPolicy} -->
 		     , #{devUrl}
 		     , #{cornerNmDispYn}
 		     , IFNULL(#{goodsLimitYn}, 'N')
@@ -105,10 +90,6 @@
 					SELECT PLAN_SQ                
 					     , PLAN_NM                
 					     , PLAN_GB                
-					     <!-- , CUST_GB -->
-					     <!-- , CUST_GRADE -->
-					     <!-- , PLAN_SNM -->
-					     , TEMPLATE_TYPE          
 					     , SITE_CD                
 					     , FRONT_GB               
 					     , DISP_STDT    
@@ -118,16 +99,12 @@
 					     , DTL_PIMG               
 					     , DTL_MIMG               
 					     , DTL_TITLE1             
-					     <!-- , DTL_TITLE2 -->
-					     <!-- , CATE_CD -->
-					     <!-- , CATE_DISP_YN -->           
 					     , REPLY_YN               
 					     , REPLY_TITLE1           
 					     , REPLY_TITLE2           
 					     , REPLY_LOC              
 					     , REPLY_IMG              
 					     , POLL_SQ                
-					     <!-- , PRIVACY_POLICY -->
 					     , DEV_URL                
 					     , CORNER_NM_DISP_YN      
 					     , GOODS_LIMIT_YN         
@@ -201,9 +178,6 @@
 		<if test="planGb != null and planGb != ''">
 		AND    PLAN_GB = #{planGb}
 		</if>
-		<if test="templateType != null and templateType != ''">
-		AND    TEMPLATE_TYPE = #{templateType}
-		</if>
 		<if test="dispStdt != null and dispStdt != ''">
 		AND    DISP_EDDT <![CDATA[>=]]> DATE_FORMAT(#{dispStdt}, '%Y-%m-%d %H:%i:%S')
 		</if>
@@ -304,7 +278,6 @@
 		     <!-- , CUST_GB = #{custGb} -->
 		     <!-- , CUST_GRADE = #{custGrade} -->
 		     <!-- , PLAN_SNM = #{planSnm} -->
-		     , TEMPLATE_TYPE = #{templateType}
 		     , FRONT_GB = #{frontGb}
 		     , PLAN_NM = #{planNm}
 		     , DISP_STDT = DATE_FORMAT(#{dispStdt} , '%Y-%m-%d %H:%i:%s')
@@ -376,7 +349,6 @@
 		          <!-- , CUST_GB -->
 		          <!-- , CUST_GRADE -->
 		          <!-- , PLAN_SNM -->
-		          , TEMPLATE_TYPE
 		          , SITE_CD
 		          , FRONT_GB
 		          , DISP_STDT
@@ -416,7 +388,6 @@
 		             <!-- , CUST_GB -->
 		             <!-- , CUST_GRADE -->
 		             <!-- , PLAN_SNM -->
-		             , TEMPLATE_TYPE
 		             , SITE_CD
 		             , FRONT_GB
 		             , DISP_STDT
@@ -458,7 +429,7 @@
 		/* TsaMarketing.createPlanBrand */
 		INSERT INTO TB_PLAN_BRAND
 			(
-				BRAND_CD
+				BRAND_GROUP_NO
 			  , PLAN_SQ
 			  , DISP_YN
 			  , REG_NO
@@ -468,7 +439,7 @@
 			)
 		VALUES
 		   (
-			  #{brandCd}
+			  #{brandGroupNo}
 			, #{planSq}
 			,'Y'
 			, #{regNo}
@@ -488,14 +459,14 @@
 	<select id="getPlanBrandList" parameterType="Plan" resultType="Plan">
 		/* TsaMarketing.getPlanBrandList */
 		SELECT TP.PLAN_NM AS PLAN_NM
-		     , TP.PLAN_SQ AS PLAN_SQ
-		     , TB.BRAND_ENM AS BRAND_ENM
-		     , TB.BRAND_CD AS BRAND_CD
-		     , TB.BRAND_KNM AS BRAND_KNM
+				     , TP.PLAN_SQ AS PLAN_SQ
+				     , TB.BRAND_GROUP_ENM AS BRAND_GROUP_ENM
+				     , TB.BRAND_GROUP_NO AS BRAND_GROUP_NO
+				     , TB.BRAND_GROUP_KNM AS BRAND_GROUP_KNM
 		FROM TB_PLAN TP  LEFT OUTER JOIN TB_PLAN_BRAND TPB 
 							   ON TP.PLAN_SQ = TPB.PLAN_SQ 
-		            	 LEFT OUTER JOIN  TB_BRAND TB 
-		   					   ON TPB.BRAND_CD = TB.BRAND_CD 
+		            	 LEFT OUTER JOIN  TB_BRAND_GROUP TB
+		   					   ON TPB.BRAND_GROUP_NO = TB.BRAND_GROUP_NO 
 		WHERE 1=1
 		 	AND TP.PLAN_SQ = TPB.PLAN_SQ 
 		 	AND TP.PLAN_SQ = #{planSq}
@@ -507,14 +478,14 @@
 			INSERT INTO
 					 TB_PLAN_BRAND 
 					 (
-			           BRAND_CD
+			           BRAND_GROUP_NO
 					  ,PLAN_SQ 
 					  ,DISP_YN 
 					  ,REG_NO  
 					  ,REG_DT  
 					  ,UPD_NO  
 					  ,UPD_DT  
-     			      ) SELECT 	BRAND_CD
+     			      ) SELECT 	BRAND_GROUP_NO
 						  , ${planSq} 
 						  , DISP_YN 
 						  , REG_NO  
@@ -524,7 +495,7 @@
 	        	   FROM   TB_PLAN_BRAND
 	        	   WHERE 1=1
 					 AND PLAN_SQ = #{copyPlanSq}
-	        	     AND BRAND_CD = #{brandCd}
+	        	     AND BRAND_GROUP_NO = #{brandGroupNo}
 	</insert>
 	
 	<insert id="createPlanCate" parameterType="Plan">
@@ -894,6 +865,60 @@
 		       )
 	</insert>
 	
+	<insert id="createPlanCustGb" parameterType="Plan">
+		/* TsaMarketing.createPlanCustGb */
+		INSERT INTO TB_PLAN_CUST_DIVISION
+						(
+							PLAN_SQ
+						  , CUST_GB
+						  , REG_NO
+						  , REG_DT
+						)
+				VALUES(
+						   #{planSq}
+						,  #{custGb}
+					    ,  #{regNo}
+					   , CURRENT_TIMESTAMP
+					  )
+	</insert>
+	
+	<insert id="createPlanCustGrade" parameterType="Plan">
+		/* TsaMarketing.createPlanCustGrade */
+		INSERT INTO TB_PLAN_CUST_GRADE
+				(
+					PLAN_SQ
+				  , CUST_GRADE
+				  , REG_NO
+				  , REG_DT
+				)
+			VALUES(
+					#{planSq}
+				  , #{custGrade}
+				  , #{regNo}
+				  , CURRENT_TIMESTAMP
+				 )
+	</insert>
+	
+	<select id="getPlanCustGbList" parameterType="Plan" resultType="Plan">
+		/* TsaMarketing.createPlanCustGrade */
+		SELECT CUST_GB 
+			  ,PLAN_SQ 
+			  ,REG_DT 
+			  ,REG_NO 
+		FROM TB_PLAN_CUST_DIVISION
+		WHERE PLAN_SQ = #{planSq}
+	</select>
+	
+	<select id="getPlanCustGradeList" parameterType="Plan" resultType="Plan">
+		/* TsaMarketing.getPlanCustGradeList */
+		SELECT CUST_GRADE 
+		      ,PLAN_SQ 
+		      ,REG_DT 
+		      ,REG_NO 
+		FROM TB_PLAN_CUST_GRADE
+		WHERE PLAN_SQ = #{planSq}
+	</select>
+	
 	
 	
 </mapper>

+ 378 - 157
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementDetailForm.html

@@ -36,9 +36,13 @@
 					<tbody>
 						<tr>
 							<th>메일번호</th>
-							<td>
+							<td class="left"  th:if="${mode  == 'N' }">
+								<input type="text" name="mailtSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
+							</td>
+							<td class="left"  th:if="${mode  == 'U' }">
 								<input type="text" name="mailtSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
 							</td>
+							
 						</tr>
 						<tr>
 							<th>메일구분</th>
@@ -51,8 +55,8 @@
 							<th>헤더</th>
 							<td>
 								<select name="mailHsq">
-									<option>선택하기 ▼</option>
-									<option th:if="${mailHsqList}" th:each="oneData, status : ${mailHsqList}" th:value="|${oneData.mailhfSq}|" th:text="|${oneData.mailhfNm}|" selected="selected"></option>
+									<option value="0">선택하기 ▼</option>
+									<option th:if="${mailHsqList}" th:each="oneData, status : ${mailHsqList}" th:value="|${oneData.mailhfSq}|" th:text="|${oneData.mailhfNm}|"></option>
 								</select>
 							</td>
 						</tr>
@@ -60,8 +64,8 @@
 							<th>푸터</th>
 							<td>
 								<select name="mailFsq">
-										<option>선택하기 ▼</option>
-										<option th:if="${mailFsqList}" th:each="oneData, status : ${mailFsqList}" th:value="|${oneData.mailhfSq}|" th:text="|${oneData.mailhfNm}|" selected="selected"></option>
+										<option value="0">선택하기 ▼</option>
+										<option th:if="${mailFsqList}" th:each="oneData, status : ${mailFsqList}" th:value="|${oneData.mailhfSq}|" th:text="|${oneData.mailhfNm}|"></option>
 								</select>
 							</td>
 						</tr>
@@ -100,13 +104,13 @@
 							<p>상품은 구분자 당 최대 40 개 까지만 등록하실 수 있습니다.</p>
 						</li>
 						<li class="right">
-							<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddGrid" onclick="btnAddGrid();">구분추가하기</button>
+							<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddGrid">구분추가하기</button>
 						</li>
 					</ul>
 						<!-- 구분 1 -->
 						<div class="inner-panelContent" id="btnAddGridNum" style="display:none;">
-							<input type="hidden" name="btnAddGridNumUseYn"  value ="Y">
-							<input type="hidden" name="mailtcSq">
+							<input type="hidden" name="mailtcSq" th:value="${mailtcSq}">
+							<input type="hidden" name="mailtSq" th:value="${mailtSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -115,7 +119,7 @@
 									</colgroup>
 									<tr>
 										<th>상품 구분 1<br>
-											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum();">구분 삭제</button>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum('');">구분 삭제</button>
 										</th>
 										<td>
 											<div class="">
@@ -123,13 +127,13 @@
 													<tr>
 														<th class="w100">구분자 명</th>
 														<td>
-															<input type="text" name="mailtcNm"/>								
+															<input type="text" name="mailtcNm" maxlength="50"/>
 														</td>
 													</tr>
 													<tr>
 														<th>링크</th>
 														<td>
-															<input type="text" name="mailtcLink"/>								
+															<input type="text" name="mailtcLink"/>
 														</td>
 													</tr>
 													<tr>
@@ -170,7 +174,8 @@
 						
 						<!-- 구분2 -->
 						<div class="inner-panelContent" id="btnAddGridNum2" style="display:none;">
-							<input type="hidden" name="btnAddGridNum2UseYn" value="Y">
+							<input type="hidden" name="mailtSq" th:value="${mailtSq}">
+							<input type="hidden" name="mailtcSq2" th:value="${mailtcSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -187,7 +192,7 @@
 													<tr>
 														<th class="w100">구분자 명</th>
 														<td>
-															<input type="text" name="mailtcNm2"/>
+															<input type="text" name="mailtcNm2" maxlength="50"/>
 														</td>
 													</tr>
 													<tr>
@@ -227,7 +232,7 @@
 						
 						<!-- 구분3 -->
 						<div class="inner-panelContent" id="btnAddGridNum3" style="display:none;">
-							<input type="hidden" name="btnAddGridNum3UseYn" value="Y">
+							<input type="hidden" name="mailtcSq3" th:value="${mailtcSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -236,7 +241,7 @@
 									</colgroup>
 									<tr>
 										<th>상품 구분 3<br><br>
-											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum3('gridOptions_c3');">구분 삭제</button>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum3();">구분 삭제</button>
 										</th>
 										<td>
 											<div class="">
@@ -244,7 +249,7 @@
 													<tr>
 														<th class="w100">구분자 명</th>
 														<td>
-															<input type="text" name="mailtcNm3"/>								
+															<input type="text" name="mailtcNm3" maxlength="50"/>								
 														</td>
 													</tr>
 													<tr>
@@ -284,7 +289,7 @@
 						
 						<!-- 구분4 -->
 						<div class="inner-panelContent" id="btnAddGridNum4" style="display:none;">
-							<input type="hidden" name="btnAddGridNum4UseYn" value="Y">
+							<input type="hidden" name="mailtcSq4" th:value="${mailtcSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -293,7 +298,7 @@
 									</colgroup>
 									<tr>
 										<th>상품 구분 4<br><br>
-											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum4('gridOptions_c4');">구분 삭제</button>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum4();">구분 삭제</button>
 										</th>
 										<td>
 											<div class="">
@@ -301,7 +306,7 @@
 													<tr>
 														<th class="w100">번호</th>
 														<td>
-															<input type="text" name="mailtcNm4"/>								
+															<input type="text" name="mailtcNm4" maxlength="50"/>								
 														</td>
 													</tr>
 													<tr>
@@ -341,7 +346,7 @@
 						
 						<!-- 구분5 -->
 						<div class="inner-panelContent" id="btnAddGridNum5" style="display:none;">
-							<input type="hidden" name="btnAddGridNum5UseYn" value="Y">
+						<input type="hidden" name="mailtcSq5" th:value="${mailtcSq}">
 							<div class="panelContent">
 								<table class="frmStyle">
 									<colgroup>
@@ -350,7 +355,7 @@
 									</colgroup>
 									<tr>
 										<th>상품 구분 5<br><br>
-											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum5('gridOptions_c5');">구분 삭제</button>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum5();">구분 삭제</button>
 										</th>
 										<td>
 											<div class="">
@@ -358,7 +363,7 @@
 													<tr>
 														<th class="w100">구분자 명</th>
 														<td>
-															<input type="text" name="mailtcNm5"/>								
+															<input type="text" name="mailtcNm5" maxlength="50"/>								
 														</td>
 													</tr>
 													<tr>
@@ -414,7 +419,7 @@
 		<!-- //버튼 배치 영역 -->
 				</form>
 		</div>
-	</div>//
+	</div>
 </div>
 
 <script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
@@ -425,7 +430,7 @@
 		let mode = [[${mode}]]; 
 		let mktmailInfo = [[${mktmailInfo}]];
 		let mktmailTCInfo = [[${mktmailTCInfo}]];
-		let mktmailGoodsInfo = [[${mktmailGoodsInfo}]];
+		let goodsStatList = gagajf.convertToArray([[${goodsStatList}]]);
 		
 		//팝업창 삭제버튼
 		$('#btndeleteMktmail').on('click', function() {
@@ -438,17 +443,22 @@
 			});
 		});
 		
-		//상품 전시 그리드 그리기
+		//그리드 그리기
 		var columnDefs = [
 			{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
 			{headerName: "Product ID", field: "goodsCd" , width: 120, cellClass: 'text-center'},
 			{headerName: "브랜드명", field: "brandEnm" , width: 200, cellClass: 'text-center'},
-			{headerName: "상품명", field: "goodNms" , width: 200, cellClass: 'text-center'},
-			{headerName: "판매상태", field: "cdNm" , width: 100, cellClass: 'text-center'	},
+			{headerName: "상품명", field: "goodsNm" , width: 200, cellClass: 'text-center'},
+			{headerName: "판매상태", field: "goodsStat" , width: 100, cellClass: 'text-center',
+				cellEditorParams: { values: gagaAgGrid.extractValues(goodsStatList) },
+				valueFormatter: function (params) { return gagaAgGrid.lookupValue(goodsStatList, params.value); },
+				valueParser: function (params) { return gagaAgGrid.lookupKey(goodsStatList, params.newValue); }
+			},
 			{headerName: "정상가", field: "listPrice" , width: 120, cellClass: 'text-center'},
 			{headerName: "판매가", field: "listPrice" , width: 120, cellClass: 'text-center'},
 			{headerName: "순번", field: "dispOrd" , width: 120, cellClass: 'text-center'}
-		]
+		];
+		
 		
 		// Add on options
 		var gridOptions_c1 = gagaAgGrid.getGridOptions(columnDefs);
@@ -463,6 +473,13 @@
 		gridOptions_c3.defaultColDef.editable = true;
 		gridOptions_c4.defaultColDef.editable = true;
 		gridOptions_c5.defaultColDef.editable = true;
+		//중복선택
+		gridOptions_c1.rowSelection = 'multiple';
+		gridOptions_c2.rowSelection = 'multiple';
+		gridOptions_c3.rowSelection = 'multiple';
+		gridOptions_c4.rowSelection = 'multiple';
+		gridOptions_c5.rowSelection = 'multiple';
+		
 		gridOptions_c1.suppressRowClickSelection = true;
 		gridOptions_c2.suppressRowClickSelection = true;
 		gridOptions_c3.suppressRowClickSelection = true;
@@ -471,7 +488,7 @@
 		
 		///저장
 		$('#btnSaveMktMail').on('click', function() {
-		
+			
 			//타이틀 길이 제한 2자 이상 50자미만
 			var check = $('#mailManagementForm input[name=mailtNm]').val();
 
@@ -486,35 +503,74 @@
 			let arrayData4 = gagaAgGrid.getAllRowData(gridOptions_c4)
 			let arrayData5 = gagaAgGrid.getAllRowData(gridOptions_c5)
 			
-			let mailTc = {};
-	
-			mailTc.mailtcNm = $('#mailManagementForm input[name=mailtcNm]').val();
-			mailTc.mailtcLink = $('#mailManagementForm input[name=mailtcLink]').val();
-			mailTc.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr]:checked').val();
-			
- 			let mailTc2 = {};
-			
-			mailTc2.mailtcNm = $('#mailManagementForm input[name=mailtcNm2]').val();
-			mailTc2.mailtcLink = $('#mailManagementForm input[name=mailtcLink2]').val();
-			mailTc2.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr2]:checked').val();
+
+			//상품 등록 CHECK
+			if(arrayData.length == 0 && $('#btnAddGridNum').css('display') != 'none'){
+				mcxDialog.alert('구분자1의 상품을 등록해주세요.');
+				return false;
+			}
+			if(arrayData2.length == 0 && $('#btnAddGridNum2').css('display') != 'none'){
+				mcxDialog.alert('구분자2의 상품을 등록해주세요.');
+				return false;
+			}
+			if(arrayData3.length == 0 && $('#btnAddGridNum3').css('display') != 'none'){
+				mcxDialog.alert('구분자3의 상품을 등록해주세요.');
+				return false;
+			}
+			if(arrayData4.length == 0 && $('#btnAddGridNum4').css('display') != 'none'){
+				mcxDialog.alert('구분자4의 상품을 등록해주세요.');
+				return false;
+			}
+			if(arrayData5.length == 0 && $('#btnAddGridNum5').css('display') != 'none'){
+				mcxDialog.alert('구분자5의 상품을 등록해주세요.');
+				return false;
+			}
 			
+			let check1 = $('#mailManagementForm input[name=mailtcNm]').val();
+			let check2 = $('#mailManagementForm input[name=mailtcNm2]').val();
+			let check3 = $('#mailManagementForm input[name=mailtcNm3]').val();
+			let check4 = $('#mailManagementForm input[name=mailtcNm4]').val();
+			let check5 = $('#mailManagementForm input[name=mailtcNm5]').val();
+
+			let mailTc = {};
+			let mailTc2 = {};
 			let mailTc3 = {};
-			
-			mailTc3.mailtcNm = $('#mailManagementForm input[name=mailtcNm3]').val();
-			mailTc3.mailtcLink = $('#mailManagementForm input[name=mailtcLink3]').val();
-			mailTc3.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr3]:checked').val();
-			
 			let mailTc4 = {};
-			
-			mailTc4.mailtcNm = $('#mailManagementForm input[name=mailtcNm4]').val();
-			mailTc4.mailtcLink = $('#mailManagementForm input[name=mailtcLink4]').val();
-			mailTc4.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr4]:checked').val();
-			
 			let mailTc5 = {};
 			
-			mailTc5.mailtcNm = $('#mailManagementForm input[name=mailtcNm5]').val();
-			mailTc5.mailtcLink = $('#mailManagementForm input[name=mailtcLink5]').val();
-			mailTc5.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr5]:checked').val();
+			if(check1 != null && check1 != '') {
+				mailTc.mailtcNm = $('#mailManagementForm input[name=mailtcNm]').val();
+				mailTc.mailtcLink = $('#mailManagementForm input[name=mailtcLink]').val();
+				mailTc.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr]:checked').val();
+				mailTc.mailtSq = $('#mailManagementForm input[name=mailtSq]').val();
+				mailTc.mailtcSq = $('#mailManagementForm input[name=mailtcSq]').val();
+			} if(check2 != null && check2 != '') {
+				mailTc2.mailtcNm = $('#mailManagementForm input[name=mailtcNm2]').val();
+				mailTc2.mailtcLink = $('#mailManagementForm input[name=mailtcLink2]').val();
+				mailTc2.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr2]:checked').val();
+				mailTc2.mailtcSq = $('#mailManagementForm input[name=mailtcSq2]').val();
+
+			} if(check3 != null && check3 != '') {
+				mailTc3.mailtcNm = $('#mailManagementForm input[name=mailtcNm3]').val();
+				mailTc3.mailtcLink = $('#mailManagementForm input[name=mailtcLink3]').val();
+				mailTc3.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr3]:checked').val();
+				mailTc3.mailtcSq = $('#mailManagementForm input[name=mailtcSq3]').val();
+
+			} if(check4 != null && check4 != '') {
+				mailTc4.mailtcNm = $('#mailManagementForm input[name=mailtcNm4]').val();
+				mailTc4.mailtcLink = $('#mailManagementForm input[name=mailtcLink4]').val();
+				mailTc4.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr4]:checked').val();
+				mailTc4.mailtcSq = $('#mailManagementForm input[name=mailtcSq4]').val();
+
+				
+			} if(check5!= null && check5 != '') {
+				mailTc5.mailtcNm = $('#mailManagementForm input[name=mailtcNm5]').val();
+				mailTc5.mailtcLink = $('#mailManagementForm input[name=mailtcLink5]').val();
+				mailTc5.goodsCpr = $('#mailManagementForm input:radio[name=goodsCpr5]:checked').val();
+				mailTc5.mailtcSq = $('#mailManagementForm input[name=mailtcSq5]').val();
+
+			}
+		 	
 			
 			//헤더 선택체크 내용 체크
 			if(!gagajf.validation('#mailManagementForm'))
@@ -524,39 +580,35 @@
 				mcxDialog.alert('내용을 입력해 주세요.');
 				return false;
 			}
-			
-			if($('#btnAddGridNum').css('display') != 'none'){
-				if(gagajf.isNull($('#mailManagementForm input[name=mailtcNm]').val())){
-					mcxDialog.alert('구분자명을 입력해 주세요.');
-					return false;
-				}
-				var check = $('#mailManagementForm input[name=mailtcNm]').val();
-				
-				if(check.length < 2){
-					mcxDialog.alert('구분자명은 2자 이상 50자 미만으로 입력하세요.');
-					return false;
-				}
-				
-			}else if($('#btnAddGridNum2').css('display') != 'none'){
-				if(gagajf.isNull($('#mailManagementForm input[name=mailtcNm2]').val())){
-					mcxDialog.alert('구분자명을 입력해 주세요.');
-					return false;
-				}
-				var check = $('#mailManagementForm input[name=mailtcNm2]').val();
-				
-				if(check.length < 2){
-					mcxDialog.alert('구분자명은 2자 이상 50자 미만으로 입력하세요.');
-					return false;
-				}
-			}
 						
+			//구분자명 CHECK
+			if($('#btnAddGridNum').css('display') != 'none' && check1.length < 2){
+				mcxDialog.alert('구분자1명은 2자 이상 50자 미만으로 입력하세요.');
+				return false;
+			}
+			if($('#btnAddGridNum2').css('display') != 'none' && check2.length < 2){
+				mcxDialog.alert('구분자2명은 2자 이상 50자 미만으로 입력하세요.');
+				return false;
+			}
+			if($('#btnAddGridNum3').css('display') != 'none' && check3.length < 2){
+				mcxDialog.alert('구분자3명은 2자 이상 50자 미만으로 입력하세요.');
+				return false;
+			}
+			if($('#btnAddGridNum4').css('display') != 'none' && check4.length < 2){
+				mcxDialog.alert('구분자4명은 2자 이상 50자 미만으로 입력하세요.');
+				return false;
+			}
+			if($('#btnAddGridNum5').css('display') != 'none' && check5.length < 2){
+				mcxDialog.alert('구분자5명은 2자 이상 50자 미만으로 입력하세요.');
+				return false;
+			}
+			
+			
 			mcxDialog.confirm("내용을 등록 하시겠습니까?", {
 				cancelBtnText: "취소",
 				sureBtnText: "확인",
 				sureBtnClick: function() {
-					
-					let data = {
-					};
+					let data = {};
 					
 					data.mktmailManagementTc = mailTc;
 					data.mktmailManagementTc2 = mailTc2;
@@ -570,6 +622,11 @@
 					data.mktmailManagementGoods4 = arrayData4;
 					data.mktmailManagementGoods5 = arrayData5;
 					
+					//업데이트 일 경우 처리
+					if($('#mailManagementForm input[name=mailtSq]').val() != null && $('#mailManagementForm input[name=mailtSq]').val() != ''){
+						data.mailtSq = mktmailInfo.mailtSq;
+					}
+					
 					data.mktHeader = $('#mailManagementForm select[name=mailHsq]').val();
 					data.mktFooter = $('#mailManagementForm select[name=mailFsq]').val();
 					data.mailtNm = $('#mailManagementForm input[name=mailtNm]').val();
@@ -577,10 +634,10 @@
 					data.mailContent = $('#mailManagementForm textarea[name=mailContent]').val();
 					
 					let jsonData = JSON.stringify(data);
-					console.log(jsonData);
 					
 					gagajf.ajaxJsonSubmit($('#mailManagementForm').prop('action'), jsonData, function(data){
 						uifnPopupClose('popupMktMail');
+						$('#btnSearch').trigger('click');
 					});
 				
 				}
@@ -627,7 +684,6 @@
 				AddgridRow = gridOptions_c5;
 				break;
 			}
-			
 			cfnOpenGoodsPopup('fnFetchGoods');
 		}
 
@@ -635,7 +691,6 @@
 		var fnFetchGoods = function(goodsData) {
 			
 			if (goodsData.length < 1) return;
-			
 			// 기존상품
 			var oldGoodsSetList = gagaAgGrid.getAllRowData(AddgridRow);
 			var index = oldGoodsSetList.length+1;
@@ -667,8 +722,8 @@
 						var data = {
 							   goodsCd : item.goodsCd
 						   ,  brandEnm : item.brandEnm
-						   ,   goodNms : item.goodsNm
-						   ,      cdNm : item.goodsStat
+						   ,   goodsNm : item.goodsNm
+						   , goodsStat : item.goodsStat
 						   , listPrice : item.listPrice
 						   , currPrice : item.currPrice
 						   ,   dispOrd : index
@@ -704,119 +759,285 @@
 			}
 			
 			var selectedData = gagaAgGrid.selectedRowData(AddgridRow);
-		
+			var removedData = gagaAgGrid.removeRowData(AddgridRow);
+			
 			if (selectedData.length == 0) {
 				mcxDialog.alert('선택된 행이 없습니다.');
 				return false;
-			}		
-			//화면에서 삭제
-			gagaAgGrid.removeRowData(AddgridRow, false);
+			}
+			
+			//상세보기에서 삭제처리
+			if(mode == 'U') {
+				mcxDialog.confirm('해당 상품을 삭제하시겠습니까?', {
+					cancelBtnText: "취소",
+					sureBtnText: "확인",
+					sureBtnClick: function(){
+						
+						//화면에서 삭제
+						gagaAgGrid.removeRowData(AddgridRow, false);
+						var deleteData = [];
+						$.each(removedData, function(idx, item) {
+							deleteData.push(item);
+						})
+						
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('marketing/mktmailManagement/goods/delete', jsonData);
+					}
+				});
+			}
 		}
-		
-		
-		// 상품 구분 삭제 버튼  삭제는 해당 하는 폼이 삭제
+
+		// 상품 구분 폼 삭제
 		function btnDeleteGridNum(param){
 			if($('#btnAddGridNum').css('display') !='none'){
+				//구분자 DB 삭제
+				if(mode == "U" && $('#mailManagementForm input[name=mailtcNm]').val() != null && $('#mailManagementForm input[name=mailtcNm]').val() != ''){
+					var deleteData = [];
+					var corner = {};
+						corner.mailtcSq = $('#mailManagementForm input[name=mailtcSq]').val();
+						corner.useYn = 'N';
+						deleteData.push(corner);
+					var jsonData = JSON.stringify(deleteData);
+					gagajf.ajaxJsonSubmit('marketing/mktmailManagement/corner/delete', jsonData);
+				}
+				//상품전시 삭제
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c1);
+				if(mode == "U" && selectedData.length != 0){
+						//상세보기에서 삭제처리
+						var deleteData = [];
+						$.each(selectedData, function(idx, item) {
+							deleteData.push(item);
+						})
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('marketing/mktmailManagement/goods/delete', jsonData);
+				}
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c1);
+				selectedData.forEach(function(item, index) {
+					gridOptions_c1.api.updateRowData({remove: [item]});
+				});
+				$('#mailManagementForm input[name=mailtcNm]').val('');
+				$('#mailManagementForm input[name=mailtcLink]').val('');
+				$('#mailManagementForm input:radio[name="goodsCpr"]:radio[value="3"]').prop('checked', true);
 				$('#btnAddGridNum').hide();
-				$('#btnAddGridNum')[0].reset();
 			}
-		}		
+		}
+
 		function btnDeleteGridNum2(param){
 			if($('#btnAddGridNum2').css('display') !='none'){
+				//구분자 DB 삭제
+				if(mode == "U" && $('#mailManagementForm input[name=mailtcNm2]').val() != null && $('#mailManagementForm input[name=mailtcNm2]').val() != ''){
+					var deleteData = [];
+					var corner = {};
+						corner.mailtcSq = $('#mailManagementForm input[name=mailtcSq2]').val();
+						corner.useYn = 'N';
+						deleteData.push(corner);
+					var jsonData = JSON.stringify(deleteData);
+					gagajf.ajaxJsonSubmit('marketing/mktmailManagement/corner/delete', jsonData);
+				}
+				//상품전시 삭제
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c2);
+				if(mode == "U" && selectedData.length != 0){
+						//상세보기에서 삭제처리
+						var deleteData = [];
+						$.each(selectedData, function(idx, item) {
+							deleteData.push(item);
+						})
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('marketing/mktmailManagement/goods/delete', jsonData);
+				}
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c2);
+				selectedData.forEach(function(item, index) {
+					gridOptions_c1.api.updateRowData({remove: [item]});
+				});
+				$('#mailManagementForm input[name=mailtcNm2]').val('');
+				$('#mailManagementForm input[name=mailtcLink2]').val('');
+				$('#mailManagementForm input:radio[name="goodsCpr2"]:radio[value="3"]').prop('checked', true);
 				$('#btnAddGridNum2').hide();
-				$('#searchForm2')[0].reset();
-			}			
-		}			
+			}
+		}
+		
 		function btnDeleteGridNum3(param){
-			if ($('#btnAddGridNum3').css('display') !='none'){
+			if($('#btnAddGridNum3').css('display') !='none'){
+				//구분자 DB 삭제
+				if(mode == "U" && $('#mailManagementForm input[name=mailtcNm3]').val() != null && $('#mailManagementForm input[name=mailtcNm3]').val() != ''){
+					var deleteData = [];
+					var corner = {};
+						corner.mailtcSq = $('#mailManagementForm input[name=mailtcSq3]').val();
+						corner.useYn = 'N';
+						deleteData.push(corner);
+					var jsonData = JSON.stringify(deleteData);
+					gagajf.ajaxJsonSubmit('marketing/mktmailManagement/corner/delete', jsonData);
+				}
+				//상품전시 삭제
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c3);
+				if(mode == "U" && selectedData.length != 0){
+						//상세보기에서 삭제처리
+						var deleteData = [];
+						$.each(selectedData, function(idx, item) {
+							deleteData.push(item);
+						})
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('marketing/mktmailManagement/goods/delete', jsonData);
+				}
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c3);
+				selectedData.forEach(function(item, index) {
+					gridOptions_c1.api.updateRowData({remove: [item]});
+				});
+				$('#mailManagementForm input[name=mailtcNm3]').val('');
+				$('#mailManagementForm input[name=mailtcLink3]').val('');
+				$('#mailManagementForm input:radio[name="goodsCpr3"]:radio[value="3"]').prop('checked', true);
 				$('#btnAddGridNum3').hide();
-				$('#searchForm3')[0].reset();
-			}			
+			}
 		}		
+		
 		function btnDeleteGridNum4(param){
 			if ($('#btnAddGridNum4').css('display') !='none'){
+				
+				//구분자 DB 삭제
+				if(mode == "U" && $('#mailManagementForm input[name=mailtcNm4]').val() != null && $('#mailManagementForm input[name=mailtcNm4]').val() != ''){
+					var deleteData = [];
+					var corner = {};
+						corner.mailtcSq = $('#mailManagementForm input[name=mailtcSq4]').val();
+						corner.useYn = 'N';
+						deleteData.push(corner);
+					var jsonData = JSON.stringify(deleteData);
+					gagajf.ajaxJsonSubmit('marketing/mktmailManagement/corner/delete', jsonData);
+				}
+				//상품전시 삭제
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c4);
+				if(mode == "U" && selectedData.length != 0){
+						//상세보기에서 삭제처리
+						var deleteData = [];
+						$.each(selectedData, function(idx, item) {
+							deleteData.push(item);
+						})
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('marketing/mktmailManagement/goods/delete', jsonData);
+				}
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c4);
+				selectedData.forEach(function(item, index) {
+					gridOptions_c1.api.updateRowData({remove: [item]});
+				});
+				$('#mailManagementForm input[name=mailtcNm4]').val('');
+				$('#mailManagementForm input[name=mailtcLink4]').val('');
+				$('#mailManagementForm input:radio[name="goodsCpr4"]:radio[value="3"]').prop('checked', true);
 				$('#btnAddGridNum4').hide();
-				$('#searchForm3')[0].reset();
-			}			
+			}
 		}
 		function btnDeleteGridNum5(param){
 			if ($('#btnAddGridNum5').css('display') !='none'){
+				
+				//구분자 DB 삭제
+				if(mode == "U" && $('#mailManagementForm input[name=mailtcNm5]').val() != null && $('#mailManagementForm input[name=mailtcNm5]').val() != ''){
+					var deleteData = [];
+					var corner = {};
+						corner.mailtcSq = $('#mailManagementForm input[name=mailtcSq5]').val();
+						corner.useYn = 'N';
+						deleteData.push(corner);
+					var jsonData = JSON.stringify(deleteData);
+					gagajf.ajaxJsonSubmit('marketing/mktmailManagement/corner/delete', jsonData);
+				}
+				//상품전시 삭제
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c5);
+				if(mode == "U" && selectedData.length != 0){
+						//상세보기에서 삭제처리
+						var deleteData = [];
+						$.each(selectedData, function(idx, item) {
+							deleteData.push(item);
+						})
+						var jsonData = JSON.stringify(deleteData);
+						gagajf.ajaxJsonSubmit('marketing/mktmailManagement/goods/delete', jsonData);
+				}
+				var selectedData = gagaAgGrid.getAllRowData(gridOptions_c5);
+				selectedData.forEach(function(item, index) {
+					gridOptions_c1.api.updateRowData({remove: [item]});
+				});	
+				$('#mailManagementForm input[name=mailtcNm5]').val('');
+				$('#mailManagementForm input[name=mailtcLink5]').val('');
+				$('#mailManagementForm input:radio[name="goodsCpr5"]:radio[value="3"]').prop('checked', true);
 				$('#btnAddGridNum5').hide();
-				$('#searchForm5')[0].reset();
 			}
 		} 
 
 	$(document).ready(function() {
+		gagaAgGrid.createGrid("gridSectionGbList1", gridOptions_c1);
+		gagaAgGrid.createGrid("gridSectionGbList2", gridOptions_c2);
+		gagaAgGrid.createGrid("gridSectionGbList3", gridOptions_c3);
+		gagaAgGrid.createGrid("gridSectionGbList4", gridOptions_c4);
+		gagaAgGrid.createGrid("gridSectionGbList5", gridOptions_c5);
 		
 		if (mode == 'U') {
 			
+			$('#mailManagementForm input[name=mailtSq]').val(mktmailInfo.mailtSq);
+			$('#mailManagementForm select[name=mailHsq]').val(mktmailInfo.mailHsq);
+			$('#mailManagementForm select[name=mailFsq]').val(mktmailInfo.mailFsq);
 			$('#mailManagementForm input[name=mailtNm]').val(mktmailInfo.mailtNm);
 			$('#mailManagementForm textarea[name=mailContent]').val(mktmailInfo.mailContent);
-
+			
 			if(mktmailInfo.mailtGb == "A"){
 				$('#mailManagementForm input:radio[name="mailtGb"]:radio[value="A"]').prop('checked', true);
 			}
 			
-//   		alert(mktmailTCInfo.length);
-//   		alert(mktmailGoodsInfo.length);
-//   	   	alert(mktmailGoodsInfo[1]);
-
-	   		
-			if(mktmailTCInfo != null && mktmailTCInfo.length > 0){				
-				//구분자1
-				if($('#mailManagementForm input[name=mailtcNm]')){
-					$('#mailManagementForm input[name=mailtcNm]').val(mktmailTCInfo[0].mailtcNm);
-					$('#mailManagementForm input[name=mailtcLink]').val(mktmailTCInfo[0].mailtcLink);
-					
-
+			$.each(mktmailTCInfo, function(idx, item) {
+				
+				if (idx == 0) {
+					$('#mailManagementForm input[name=mailtcNm]').val(item.tc.mailtcNm);						
+					$('#mailManagementForm input[name=mailtcSq]').val(item.tc.mailtcSq);
+					$('#mailManagementForm input[name=mailtcLink]').val(item.tc.mailtcLink);
+					if(mktmailTCInfo[idx].tc.goodsCpr == 1){
+						$('#mailManagementForm input:radio[name=goodsCpr]:input[value="1"]').prop('checked', true);
+					}else if(mktmailTCInfo[idx].tc.goodsCpr == 2){
+						$('#mailManagementForm input:radio[name=goodsCpr]:input[value="2"]').prop('checked', true);
+					}else if(mktmailTCInfo[idx].tc.goodsCpr == 3){
+						$('#mailManagementForm input:radio[name=goodsCpr]:input[value="3"]').prop('checked', true);
+					}else if(mktmailTCInfo[idx].tc.goodsCpr == 4){
+						$('#mailManagementForm input:radio[name=goodsCpr]:input[value="4"]').prop('checked', true);
+					}else if(mktmailTCInfo[idx].tc.goodsCpr == 5){
+						$('#mailManagementForm input:radio[name=goodsCpr]:input[value="5"]').prop('checked', true);
+					}
 					$('#btnAddGridNum').show();
-
-					//구분자2
-					if(mktmailTCInfo.length >= 2){
-						$('#mailManagementForm input[name=mailtcNm2]').val(mktmailTCInfo[1].mailtcNm);
-						$('#mailManagementForm input[name=mailtcLink2]').val(mktmailTCInfo[1].mailtcLink);
-						$('#btnAddGridNum2').show();
-						//구분자3
-						if(mktmailTCInfo.length >= 3){
-							$('#mailManagementForm input[name=mailtcNm3]').val(mktmailTCInfo[2].mailtcNm);
-							$('#mailManagementForm input[name=mailtcLink3]').val(mktmailTCInfo[2].mailtcLink);
-							$('#btnAddGridNum3').show();
-							//구분자4
-							if(mktmailTCInfo.length >= 4){
-								$('#mailManagementForm input[name=mailtcNm4]').val(mktmailTCInfo[3].mailtcNm);
-								$('#mailManagementForm input[name=mailtcLink4]').val(mktmailTCInfo[3].mailtcLink);
-								$('#btnAddGridNum4').show();
-								//구분자5
-								if(mktmailTCInfo.length == 5){
-									$('#mailManagementForm input[name=mailtcNm5]').val(mktmailTCInfo[4].mailtcNm);
-									$('#mailManagementForm input[name=mailtcLink5]').val(mktmailTCInfo[4].mailtcLink);
-									$('#btnAddGridNum5').show();
-								}
-							}
+				} else {
+					$('#mailManagementForm input[name=mailtcNm' + (idx + 1) + ']').val(item.tc.mailtcNm);
+					$('#mailManagementForm input[name=mailtcLink' + (idx + 1) + ']').val(item.tc.mailtcLink);
+					$('#mailManagementForm input[name=mailtcSq' + (idx + 1) + ']').val(item.tc.mailtcSq);
+						if(mktmailTCInfo[idx].tc.goodsCpr == 1){
+							$('#mailManagementForm input:radio[name=goodsCpr' + (idx + 1) + ']:input[value="1"]').prop('checked', true);
+						}else if(mktmailTCInfo[idx].tc.goodsCpr == 2){
+							$('#mailManagementForm input:radio[name=goodsCpr' + (idx + 1) + ']:input[value="2"]').prop('checked', true);
+						}else if(mktmailTCInfo[idx].tc.goodsCpr == 3){
+							$('#mailManagementForm input:radio[name=goodsCpr' + (idx + 1) + ']:input[value="3"]').prop('checked', true);
+						}else if(mktmailTCInfo[idx].tc.goodsCpr == 4){
+							$('#mailManagementForm input:radio[name=goodsCpr' + (idx + 1) + ']:input[value="4"]').prop('checked', true);
+						}else if(mktmailTCInfo[idx].tc.goodsCpr == 5){
+							$('#mailManagementForm input:radio[name=goodsCpr' + (idx + 1) + ']:input[value="5"]').prop('checked', true);
 						}
-					}
+					$('#btnAddGridNum' + (idx + 1)).show();
 				}
-			}
-			
+				
+				switch(idx) {
+				case 0:
+					gridOptions_c1.api.setRowData(item.goodsList);
+					break;
+				case 1:
+					gridOptions_c2.api.setRowData(item.goodsList);
+					break;
+				case 2:
+					gridOptions_c3.api.setRowData(item.goodsList);
+					break;
+				case 3:
+					gridOptions_c4.api.setRowData(item.goodsList);
+					break;
+				case 4:
+					gridOptions_c5.api.setRowData(item.goodsList);
+					break;
+				}
+			});
 			
 		}//end of mode
-		
-		gagaAgGrid.createGrid("gridSectionGbList1", gridOptions_c1);
-		gagaAgGrid.createGrid("gridSectionGbList2", gridOptions_c2);
-		gagaAgGrid.createGrid("gridSectionGbList3", gridOptions_c3);
-		gagaAgGrid.createGrid("gridSectionGbList4", gridOptions_c4);
-		gagaAgGrid.createGrid("gridSectionGbList5", gridOptions_c5);
 
 		// Create a summernote
 		let snOptions = gagaSn.getToolbarOptions();
-		
-
-		gridOptions_c1.api.setRowData(mktmailGoodsInfo);
-		gridOptions_c2.api.setRowData(mktmailGoodsInfo);
-		gridOptions_c3.api.setRowData(mktmailGoodsInfo);
-		gridOptions_c4.api.setRowData(mktmailGoodsInfo);
-		gridOptions_c5.api.setRowData(mktmailGoodsInfo);
-		
+				
 		gagaSn.createSummernote(snOptions, '#mailContent');
 
 	});

+ 38 - 10
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementForm.html

@@ -23,6 +23,7 @@
 		<div class="infoBox menu-desc"></div>
 
 		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/mktmailManagement/list'}"  onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<input type="hidden" name="mailtcSq" th:value="${mailtcSq}">
 			<!-- 검색조건 영역 -->
 			<div class="panelStyle" >
 				<!-- //TITLE -->
@@ -91,7 +92,11 @@
 			}
 		},
 		{	//미리보기 
-			headerName: "미리보기", width: 150, cellClass: 'text-center'
+			headerName: "", field:"preview" , width: 150, cellClass: 'text-center',
+			cellRenderer: function(params) {
+				return '<button="javascript:void(0);" class="btn btn-info btn-sm">'+ '미리보기' +'</button>'
+			}
+		
 		},
 		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
 		{
@@ -115,19 +120,17 @@
 	// Get GridOptions
 	var gridOptions = gagaAgGrid.getGridOptions(columnDefs);
 	
-	//검색 조건 확인
-	//TODO
-	
-	
 	// 다중 선택 추가
 	gridOptions.rowSelection = 'multiple';	
 	
 	//셀 클릭 이벤트 -> 팝업창
 	gridOptions.onCellClicked = function(event) {
-		if (event.colDef.field != 'mailtNm')
-			return;
-		
-		fnOpenMailHFPopup('U', event.data.mailtSq);
+		if (event.colDef.field == 'mailtNm'){
+			fnOpenMailHFPopup('U', event.data.mailtSq);
+		}else if(event.colDef.field == 'preview'){
+			fnOpenMailPreviewPopup(event.data.mailtSq);
+		}
+			
 	}
 	
 	// grid row Delete
@@ -151,7 +154,6 @@
 					updatedData.push(item);
 				});
 				
-				
 				var jsonData = JSON.stringify(updatedData);
 				gagajf.ajaxJsonSubmit('/marketing/mktmailManagement/delete', jsonData, function() {
 					$('#btnSearch').trigger('click');
@@ -162,18 +164,44 @@
 	
 	// 조회버튼 - 검색
 	$('#btnSearch').on('click', function() {
+		if(!dateCheck()) return;
 		var formId = "#searchForm";
 		gagaAgGrid.fetch($(formId).prop('action'), gridOptions, formId);
 	});
 	
+	// 조회검색 조건 CHECK
+		var dateCheck = function(){
+		var fromDate = $('#mktmailStdt').val();
+		var toDate = $('#mktmailEddt').val();
+
+			if (gagajf.isNull(fromDate)) {
+				mcxDialog.alert('시작 기간을 입력하세요.');
+				return;
+			}
+			if (gagajf.isNull(toDate)) {
+				mcxDialog.alert('종료 기간을 입력하세요.');
+				return;
+			}
+			return true;
+	}
 	
 	// 등록/상세 팝업
 	var fnOpenMailHFPopup = function(mode, mailtSq) {
+		let data = gridOptions.api.getSelectedRows();
 		var actionUrl = '/marketing/mktmailmanagement/detail/form' + '?mode=' + mode;
 		if (!gagajf.isNull(mailtSq)) actionUrl += '&mailtSq=' + mailtSq;
 		cfnOpenModalPopup(actionUrl, 'popupMktMail');
 	}
 	
+	//미리보기
+	var fnOpenMailPreviewPopup = function(mailtSq) {
+		let data = gridOptions.api.getSelectedRows();
+		var actionUrl = '/marketing/mktmailmanagement/preview';
+		if (!gagajf.isNull(mailtSq)) actionUrl += '?mailtSq=' + mailtSq;
+		cfnOpenModalPopup(actionUrl, 'popupMktMailPreview');
+	}
+	
+	
 	$(document).ready(function() {
 	
 		cfnCreateCalendar('#sellTerms', 'mktmailStdt', 'mktmailEddt', true);

+ 64 - 0
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementPreviewForm.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MktmailmanagementPreviewForm.html
+ * @desc    : MktmailmanagementPreviewForm MKT메일 미리보기 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021. 02. 19   csh9191     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupMktMailPreview">
+	<div class="panelStyle" style="height:700px;width:800px; overflow-y:scroll; max-height:700px;">
+		<!-- 팝업창 타이틀 -->
+		<div class="panelTitle">
+			<strong>메일 미리보기</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupMktMailPreview');"><em class="fa fa-times"></em></button>
+		</div>
+			<!-- Header  -->
+ 			<div th:if="${mktmailPreviewHeader}">
+					<p th:text="${mktmailPreviewHeader.mailhfContent}"></p>
+			</div>
+			
+			<!-- content -->
+			<div th:if="${mktmailPreviewContent}">
+			 	<p th:text="${mktmailPreviewContent.mailtNm}"></p> 
+ 				<p th:text="${mktmailPreviewContent.mailContent}"></p> 
+			</div>
+			
+			<!-- Footer -->
+			 <div th:if="${mktmailPreviewFooter}">
+					<p th:text="${mktmailPreviewFooter.mailhfContent}"></p>
+			</div>
+	</div>
+</div>
+<script th:inline="javascript">
+	let mktmailPreviewHeader = [[${mktmailPreviewHeader}]];
+	let mktmailPreviewContent = [[${mktmailPreviewContent}]];
+	let mktmailPreviewFooter = [[${mktmailPreviewFooter}]];
+	let mktmailPreviewGoods = [[${mktmailPreviewGoods}]];
+	
+	console.log(mktmailPreviewContent);
+	console.log(mktmailPreviewGoods);
+	
+	$(document).ready(function() {
+		
+		$.each(mktmailPreviewGoods, function(idx, item) {
+			if (idx == 0) {
+				$('#mailtcNm').text(item.tc.mailtcNm);						
+				$('#mailtcLink').text(item.tc.mailtcLink);
+			}else {
+				$('#mailtcNm'+ idx).text(item.tc.mailtcNm);
+				$('#mailtcLink' + idx).text(item.tc.mailtcLink);
+			} 
+		});
+	});
+</script>
+
+</html>

+ 296 - 130
src/main/webapp/WEB-INF/views/marketing/PlanDetailPopupForm.html

@@ -14,7 +14,7 @@
  * 1.0  2020.02.04   sowon   최초 작성
  *******************************************************************************
  -->
-<div class="modalPopup" data-width="1100" id="planRegisterFormDiv">
+<div class="modalPopup" data-width="1160" id="planRegisterFormDiv">
 	<div class="panelStyle">
 		<div class="panelTitle">
 			<h2 th:text="${'기획전 ' + (mode == 'N' ? '등록' : '수정')}"></h2>
@@ -37,23 +37,23 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th>기획전구분<i class="star"></i></th>
+						<th>사이트</th>
+						<td>
+							<select name="siteCd" th:field="*{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>기획전구분<em class="required" title="필수"></em></th>
 						<td>
 							<select name="planGb" id="planGb" th:field="*{planGb}" onchange="fnChangePlanGb(this);">
 								<option value="P">기획전</option>
 								<option value="E">이벤트</option>
 							</select>
 						</td>
-						<th>기획전탬플릿유형<i class="star"></i></th>
-						<td colspan="3">
-							<select name="templateType" th:field="*{templateType}">
-								<option value="H">HTML</option>
-								<option value="T">TEXT</option>
-							</select>
-						</td>
 					</tr>
 					<tr>
-						<th>프론트 구분<i class="star"></i></th>
+						<th>프론트 구분<em class="required" title="필수"></em></th>
 						<td>
 							<select name="frontGb" id="frontGb" th:field="*{frontGb}">
 								<option value="A">전체</option>
@@ -61,14 +61,24 @@
 								<option value="M">모바일</option>
 							</select>
 						</td>
-						<th>기획전명<i class="star"></i></th>
-						<td colspan="3">
-							<input type="text" name="planNm" id="planNm" th:field="*{planNm}"/>
+						<th>전시순서</th>
+						<td>
+							<input type="text" name="dispOrd" class="w100 aR" th:value="*{dispOrd}"/>
 						</td>
 					</tr>
 					<tr>
-						<th>진행기간<i class="star"></i></th>
+						<th>기획전명<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="planNm" id="planNm" th:field="*{planNm}"/>
+						</td>
+						<th>서브제목<em class="required" title="필수"></em></th>
 						<td>
+							<input type="text" name="dtlTitle1" id="dtlTitle1" th:value="*{dtlTitle1}"/>
+						</td>
+					</tr>
+					<tr>
+						<th>진행기간<em class="required" title="필수"></em></th>
+						<td colspan="3">
 							<input type="text" class="schDate w100" name="startSearchDate" maxlength="10" required="required" data-valid-name="노출기간" th:field="*{startSearchDate}"/>
 							<select name="startSearchHour" required="required" data-valid-name="진행기간 시작시간">
 								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
@@ -95,19 +105,16 @@
 							<input type="hidden" name="dispStdt" id="dispStdt"/>
 							<input type="hidden" name="dispEddt" id="dispEddt"/>
 						</td>
-						<th>서브제목</th>
-						<td colspan="3">
-							<input type="text" name="dtlTitle1" id="dtlTitle1" th:value="*{dtlTitle1}"/>
-						</td>
+						
 					</tr>
 					<tr>
-						<th>코너명노출 여부<i class="star"></i></th>
+						<th>코너명노출 여부<em class="required" title="필수"></em></th>
 						<td>
 							<select name="cornerNmDispYn" th:field="*{cornerNmDispYn}">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
-						<th>오픈여부<i class="star"></i></th>
+						<th>오픈여부<em class="required" title="필수"></em></th>
 						<td>
 							<select name="openYn" th:field="*{openYn}">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
@@ -115,17 +122,6 @@
 						</td>
 					</tr>
 					<tr>
-						<th>사이트<i class="star"></i></th>
-						<td>
-							<select name="siteCd" th:field="*{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>
-							<input type="text" name="dispOrd" class="w100 aR" th:value="*{dispOrd}"/>
-						</td>
 					</tr>
 					<tr>
 						<th>사용고객등급구분<em class="required" title="필수"></em></th>
@@ -143,18 +139,12 @@
 					</tr>
 					<tr>
 						<th>제휴채널<em class="required" title="필수"></em></th>
-						<td>
+						<td colspan="3">
 							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
 								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
 							</label>
   						</td>
-						<th>댓글여부</th>
-						<td>
-							<select name="replyYn" th:field="*{replyYn}">
-								<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>PC 메인 이미지<i id="pMimgStar"></i><br/>[삭제여부<label class="chkBox"><input type="checkbox" name="orgMainPimgDelYn" value="Y"/></label>]</th>
@@ -188,6 +178,56 @@
 							</div>
 						</td>
 					</tr>
+					<tr>
+						<th>댓글여부</th>
+						<td colspan="3">
+							<select name="replyYn" th:field="*{replyYn}">
+								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|"></option>
+							</select>
+						</td>
+					</tr>
+					<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="댓글제목" th:field="*{replyTitle1}"/>
+						</td>
+						
+						<th>댓글서브제목<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="replyTitle2" id="replyTitle2" maxlength="50" required="required" data-valid-name="댓글서브제목" th:field="*{replyTitle2}"/>
+						</td>
+					
+					</tr>
+					<tr style="display:none" id="append2">
+						<th>댓글위치<em class="required" title="필수"></em></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>
+						<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>
+						<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;"/>
+							</div>
+						</td>
+						<td colspan="5">
+							<div class="uFile w400">
+								<input id="registerReplyImg" name="registerReplyImg" type="file" accept="image/*" class="uFileInput w400"/>
+								<label for="registerReplyImg" class="uFileLabel w400">파일선택</label>
+								<input type="hidden" name="orgReplyImg" id="orgReplyImg" th:value="*{replyImg}"/>
+								<input type="hidden" name="replyImg" id="replyImg" th:value="*{replyImg}"/>
+							</div>
+						</td>
+					
+					</tr>
 				</tbody>
 				<tbody>
 					<!-- <tr>
@@ -207,10 +247,11 @@
 						</td>
 					</tr> -->
 				</table>
+				
 				<div class="panelStyle" style="margin: unset;">
 						<!-- TITLE -->
 						<div class="panelTitle">
-							<h2>카테고리 / 브랜드 등록</h2>
+							<h2>기획전 컨텐츠 등록</h2>
 							<span class="panelControl"> <i
 								class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
 							</span>
@@ -224,7 +265,7 @@
 										<col width="90%" />
 									</colgroup>
 									<tr>
-										<th>카테고리/브랜드</th>
+										<th> &nbsp;기획전 &nbsp; 컨텐츠&nbsp;</th>
 										<td>
 											<!-- 수정시 프로모션명 입력 : before -->
 											<div class="padding10"
@@ -234,31 +275,8 @@
 													<span class="buttonSpan">
 														<button type="button"
 															class="btn btnRight btn-success btn-lg"
-															id="btnAddCate">카테고리 추가</button>
-														<button type="button"
-															class="btn btnRight btn-success btn-lg"
-															id="btnDeleteCate">선택삭제</button>
+															onclick="fnPlanTemplatePopup();">기획전 템플릿</button>
 													</span> <br />
-													<div id="gridFGCateList"
-														style="width: 100%; height: 200px;"
-														class="ag-theme-balham"></div>
-												</div>
-											</div>
-											<div class="padding10"
-												style="display: inline-block; width: 49%;">
-												<!--<span>브랜드 설정</span>-->
-												<div class="padding10 inner-tb-solid">
-													<span class="buttonSpan">
-														<button type="button"
-															class="btn btnRight btn-success btn-lg" id="btnAddBrand">브랜드
-															추가</button>
-														<button type="button"
-															class="btn btnRight btn-success btn-lg"
-															id="btnDeleteBrand">선택삭제</button>
-													</span> <br />
-													<div id="gridFGBrandList"
-														style="width: 100%; height: 200px;"
-														class="ag-theme-balham"></div>
 												</div>
 											</div>
 										</td>
@@ -267,6 +285,64 @@
 							</div>
 						</div>
 					</div>
+				<div class="panelStyle" style="margin: unset;">
+						<!-- TITLE -->
+						<div class="panelTitle">
+							<h2>카테고리 / 브랜드 등록</h2>
+							<span class="panelControl"> <i
+								class="fa inner-fa-chevron-up"></i> <!-- 열림/닫힘 화살표 -->
+							</span>
+						</div>
+						<!-- //TITLE -->
+						<div class="panelContent">
+							<table class="frmStyle">
+								<colgroup>
+									<col width="10%" />
+									<col width="90%" />
+								</colgroup>
+								<tr>
+									<th>카테고리/브랜드</th>
+									<td>
+										<!-- 수정시 프로모션명 입력 : before -->
+										<div class="padding10"
+											style="display: inline-block; width: 49%;">
+											<!--<span>공급업체 설정</span>-->
+											<div class="padding10 inner-tb-solid">
+												<span class="buttonSpan">
+													<button type="button"
+														class="btn btnRight btn-success btn-lg"
+														id="btnAddCate">카테고리 추가</button>
+													<button type="button"
+														class="btn btnRight btn-success btn-lg"
+														id="btnDeleteCate">선택삭제</button>
+												</span> <br />
+												<div id="gridFGCateList"
+													style="width: 100%; height: 200px;"
+													class="ag-theme-balham"></div>
+											</div>
+										</div>
+										<div class="padding10"
+											style="display: inline-block; width: 49%;">
+											<!--<span>브랜드 설정</span>-->
+											<div class="padding10 inner-tb-solid">
+												<span class="buttonSpan">
+													<button type="button"
+														class="btn btnRight btn-success btn-lg" id="btnAddBrand">브랜드
+														추가</button>
+													<button type="button"
+														class="btn btnRight btn-success btn-lg"
+														id="btnDeleteBrand">선택삭제</button>
+												</span> <br />
+												<div id="gridFGBrandList"
+													style="width: 100%; height: 200px;"
+													class="ag-theme-balham"></div>
+											</div>
+										</div>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
 			</div>
 			<div style='margin: 13px;'>
 			<ul class="panelBar">
@@ -286,7 +362,7 @@
 			<div>
 				<table class="frmStyle">
 					<colgroup>
-						<col style="width:13%;"/>
+						<col style="width:12.5%;"/>
 						<col/>
 					</colgroup>
 					<tr>
@@ -314,24 +390,22 @@
 						<col/>
 					</colgroup>
 					<tr>
-						<th>기획전구분<i class="star"></i></th>
+						<th>사이트<i class="star"></i></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>기획전구분<em class="required" title="필수"></em></th>
 						<td>
 							<select name="planGb" required="required" data-valid-name="기획전구분" onchange="fnChangePlanGb(this);">
 								<option value="P">기획전</option>
 								<option value="E">이벤트</option>
 							</select>
 						</td>
-						<th>기획전탬플릿유형<i class="star"></i></th>
-						<td colspan="3">
-							<button type="button" class="btn btn-default btn-lg" onclick="fnPlanTemplatePopup();">템플릿</button>
-							<!-- <select name="templateType" required="required" data-valid-name="기획전탬플릿유형">
-								<option value="H">HTML</option>
-								<option value="T">TEXT</option>
-							</select> -->
-						</td>
 					</tr>
 					<tr>
-						<th>프론트 구분<i class="star"></i></th>
+						<th>프론트 구분<em class="required" title="필수"></em></th>
 						<td>
 							<select name="frontGb" id="frontGb" required="required" data-valid-name="프론트 구분">
 								<option value="A">전체</option>
@@ -339,14 +413,24 @@
 								<option value="M">모바일</option>
 							</select>
 						</td>
-						<th>기획전명<i class="star"></i></th>
-						<td colspan="3">
-							<input type="text" name="planNm" id="planNm" maxlength="50" required="required" data-valid-name="기획전명"/>
+						<th>전시순서</th>
+						<td>
+							<input type="text" class="w100 aR" name="dispOrd"/>
 						</td>
 					</tr>
 					<tr>
-						<th>진행기간<i class="star"></i></th>
+						<th>기획전명<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="planNm" id="planNm" maxlength="50" required="required" data-valid-name="기획전명"/>
+						</td>
+						<th>서브제목<em class="required" title="필수"></em></th>
 						<td>
+							<input type="text" name="dtlTitle1" id="dtlTitle1"/>
+						</td>
+					</tr>
+					<tr>
+						<th>진행기간<em class="required" title="필수"></em></th>
+						<td colspan="3">
 							<input type="text" class="schDate w100" id="viewStartDtNew" name="startSearchDate" maxlength="10" required="required" data-valid-name="노출기간" />
 							<select name="startSearchHour" required="required" data-valid-name="진행기간 시작시간">
 								<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
@@ -373,19 +457,16 @@
 							<input type="hidden" name="dispStdt" id="dispStdt"/>
 							<input type="hidden" name="dispEddt" id="dispEddt"/>
 						</td>
-						<th>서브제목</th>
-						<td colspan="3">
-							<input type="text" name="dtlTitle1" id="dtlTitle1"/>
-						</td>
+						
 					</tr>
 					<tr>
-						<th>코너명노출 여부<i class="star"></i></th>
+						<th>코너명노출 여부<em class="required" title="필수"></em></th>
 						<td>
 							<select name="cornerNmDispYn" required="required" data-valid-name="코너명노출 여부">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
 							</select>
 						</td>
-						<th>오픈여부<i class="star"></i></th>
+						<th>오픈여부<em class="required" title="필수"></em></th>
 						<td colspan="3">
 							<select name="openYn" required="required" data-valid-name="오픈여부">
 								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'Y'" th:text="|${oneData.cdNm}|"></option>
@@ -393,16 +474,7 @@
 						</td>
 					</tr>
 					<tr>
-						<th>사이트<i class="star"></i></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 colspan="3">
-							<input type="text" class="w100 aR" name="dispOrd"/>
-						</td>
+						
 					</tr>
 					<tr>
 						<th>사용고객등급구분<em class="required" title="필수"></em></th>
@@ -420,17 +492,11 @@
 					</tr>
 					<tr>
 						<th>제휴채널<em class="required" title="필수"></em></th>
-						<td>
+						<td colspan="3">
 							<label class="chkBox" th:if="${upperAfLinkCdList}" th:each="oneData, status : ${upperAfLinkCdList}">
 								<input type="checkbox" name="upperAfLinkCdArr" th:value="${oneData.cd}" th:text="${oneData.cdNm}"/>
 							</label>
   						</td>
-						<th>댓글여부</th>
-						<td colspan="5">
-							<select name="replyYn">
-								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'N'" th:text="|${oneData.cdNm}|"></option>
-							</select>
-						</td>
 					</tr>
 					<tr>
 						<th>PC 메인 이미지<i id="pMimgStar"></i></th>
@@ -452,26 +518,52 @@
 							</div>
 						</td>
 					</tr>
-				</tbody>
-				<tbody>
-					<!-- <tr>
-						<th>웹용소스</th>
+					<tr>
+						<th>댓글여부<em class="required" title="필수"></em></th>
 						<td colspan="5">
-							<div style="margin-top:5px;">
-								<textarea name="fsrcPc" id="fsrcPcRegister" rows="15" cols="95" style="width:1280px;"></textarea>
-								<textarea class="textareaR4" id="fsrcPcDetail" name="fsrcPc"></textarea>
-							</div>
+							<select name="replyYn">
+								<option th:if="${useYnList}" th:each="oneData, status : ${useYnList}" th:value="${oneData.cd}" th:selected="${oneData.cd} == 'N'" th:text="|${oneData.cdNm}|"></option>
+							</select>
 						</td>
 					</tr>
-					<tr>
-						<th>모바일용소스</th>
+					<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="댓글제목"/>
+						</td>
+						
+						<th>댓글서브제목<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="replyTitle2" id="replyTitle3" maxlength="50" required="required" data-valid-name="댓글서브제목"/>
+						</td>
+					
+					</tr>
+					<tr style="display:none" id="append2">
+						<th>댓글위치<em class="required" title="필수"></em></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>
+						<td>
+							<input type="text" class="w100 aR" name="pollSq"/>
+						</td>
+					
+					</tr>
+					<tr style="display:none" id="append3">
+						<th>댓글이미지<em class="required" title="필수"></em></th>
 						<td colspan="5">
-							<div style="margin-top:5px;">
-								<textarea name="fsrcMobile" id="fsrcMobileRegister" rows="15" cols="95" style="width:1280px;"></textarea>
-								<textarea class="textareaR4" id="fsrcMobileDetail" name="fsrcMobile"></textarea>
+							<div class="uFile w400">
+								<input id="registerReplyImg" name="registerReplyImg" type="file" accept="image/*" class="uFileInput w400"/>
+								<label for="registerReplyImg" class="uFileLabel w400">파일선택</label>
+								<input type="hidden" name="replyImg" id="replyImg" value=""/>
 							</div>
 						</td>
-					</tr> -->
+					
+					</tr>
+				</tbody>
+				<tbody>
 				</table>
 					<div class="panelStyle" style="margin: unset;">
 						<!-- TITLE -->
@@ -556,6 +648,8 @@
 	var fsrcMobile = [[${fsrcMobile}]];
 	var planBrandList = [[${planBrandList}]];
 	var planCateList = [[${planCateList}]];
+	var custGbList = [[${gbList}]];
+	var custGradeList =	[[${gradeList}]]; 
 	var snOptions;
 
 	// 카테고리 전시 여부
@@ -598,6 +692,60 @@
 		$("#searchTxt").val("[" + result[0].planSq + "] " +result[0].planNm);
 		
 	}
+	
+	// 댓글여부에 입력창 추가
+	$('select[name=replyYn]').on('change', function() {
+		if($('select[name=replyYn]').val() == 'Y'){
+			$("#append1").removeAttr('style');
+			$("#append2").removeAttr('style');
+			$("#append3").removeAttr('style');
+		}else{
+			$("#append1").css('display','none');
+			$("#append2").css('display','none');
+			$("#append3").css('display','none');
+		}
+	})
+	
+	// 불러오기 댓글
+	if($('#planUpdateForm select[name=replyYn]').val()=='Y'){
+			$("#append1").removeAttr('style');
+			$("#append2").removeAttr('style');
+			$("#append3").removeAttr('style');
+			
+			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');
+						}
+					}
+				}
+			}
+	}else{
+		$("#append1").css('display','none');
+		$("#append2").css('display','none');
+		$("#append3").css('display','none');
+	}
+	
+	
 
 	// 기획전 복사
 	var fnPlanCopyPopup = function() {
@@ -659,15 +807,15 @@
 		$(formId + ' input[name=dispStdt]').val(stDate + ' ' + $(formId + ' select[name=startSearchHour]').val() + ':' + $(formId + ' select[name=startSearchMin]').val() + ':00');
 		$(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())) {
@@ -708,7 +856,7 @@
 				$(formId + ' input[name=dtlMimg]').val($(formId + ' input[name=orgDtlMimg]').val());
 			}
 
-			if ((!$('input[name=orgReplyImgYn]').is(':checked') ? true : false) &&
+			if ((!$('input[name=orgReplyImgDelYn]').is(':checked') ? true : false) &&
 				(gagajf.isNull($(formId + ' input[name=replyImg]').val()) == true) ) {
 				$(formId + ' input[name=replyImg]').val($(formId + ' input[name=orgReplyImg]').val());
 			}
@@ -730,7 +878,7 @@
 		let allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
 		var multiBrand = [];
 		$.each(allBrandData, function(idx, item) {
-			multiBrand.push(item.brandCd);
+			multiBrand.push(item.brandGroupNo);
 		});
 		
 		let allCateData = gagaAgGrid.getAllRowData(gridOptionsFGCateList);
@@ -739,6 +887,18 @@
 			multiCate.push(item.cateNo);
 		});
 		
+		var usableCustGradeArr = [];
+		var chkCustGrade = $('#planRegisterForm input:checkbox[name=usableCustGradeArr]:checked');
+		for(let i=0; i< chkCustGrade.length; i++){
+			usableCustGradeArr.push(chkCustGrade.eq(i).val());
+		}
+		
+		var usableCustGbArr = [];
+		var chkCustGb = $('#planRegisterForm input:checkbox[name=usableCustGbArr]:checked');
+		for(let i=0; i< chkCustGb.length; i++){
+			usableCustGbArr.push(chkCustGb.eq(i).val());
+		}
+		
 		// 기획전 등록
 		if (formId == '#planRegisterForm') {
 			mcxDialog.confirm('등록 하시겠습니까?', {
@@ -751,10 +911,11 @@
 							,brandList : allBrandData
 							,multiCate : multiCate
 							,CateList : allCateData
+							,usableCustGradeArr : usableCustGradeArr
+							,usableCustGbArr : usableCustGbArr
 						    ,mode : $('#planRegisterForm input[name=mode]').val()
 						    ,planSq : $('#planRegisterForm input[name=planSq]').val()
 							,planGb	: $('#planRegisterForm select[name=planGb]').val()
-							,templateType :	$('#planRegisterForm select[name=templateType]').val()
 							,frontGb : $('#planRegisterForm select[name=frontGb]').val()
 							,planNm : $('#planRegisterForm input[name=planNm]').val()
 							,startSearchDate : $('#planRegisterForm input[name=startSearchDate]').val()
@@ -775,6 +936,12 @@
 							,mainMimg : $('#planRegisterForm input[name=mainMimg]').val()
 							,fsrcPc :  $('#planRegisterForm input[name=fsrcPc]').val()
 							,fsrcMobile : $('#planRegisterForm input[name=fsrcMobile]').val()
+							,replyImg : $('#planRegisterForm input[name=replyImg]').val()
+							,replyLoc : $('#planRegisterForm input:radio[name="replyLoc"]:checked').val()
+							,replyTitle1 : $('#planRegisterForm input[name=replyTitle1]').val()
+							,replyTitle2 : $('#planRegisterForm input[name=replyTitle2]').val()
+							,pollSq : $('#planRegisterForm input[name=pollSq]').val()
+							 
 						}	
 					
 					var jsonData =  JSON.stringify(data);
@@ -798,7 +965,6 @@
 						    ,mode : $('#planUpdateForm input[name=mode]').val()
 						    ,planSq : $('#planUpdateForm input[name=planSq]').val()
 							,planGb	: $('#planUpdateForm select[name=planGb]').val()
-							,templateType :	$('#planUpdateForm select[name=templateType]').val()
 							,frontGb : $('#planUpdateForm select[name=frontGb]').val()
 							,planNm : $('#planUpdateForm input[name=planNm]').val()
 							,startSearchDate : $('#planUpdateForm input[name=startSearchDate]').val()
@@ -912,9 +1078,9 @@
 	// 브랜드 리스트 설정
 	var columnBrandList = [
 		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
-		{headerName: "브랜드ID", field: "brandCd", width: 110, cellClass: 'text-center'},
-		{headerName: "브랜드명", field: "brandEnm", width: 120, cellClass: 'text-center'},
-		{headerName: "브랜드그룹명", field: "brandGrpNm", width: 150, cellClass: 'text-center'},
+		{headerName: "브랜드그룹NO", field: "brandGroupNo", width: 110, cellClass: 'text-center'},
+		{headerName: "브랜드그룹명", field: "brandGroupKnm", width: 120, cellClass: 'text-center'},
+		{headerName: "브랜드영문명", field: "brandGroupEnm", width: 150, cellClass: 'text-center'},
 		{headerName: "", field: "brandKnm", width: 150, cellClass: 'text-center'},
 		/* {headerName: "적용대상", field: "targetGb", width: 150, cellClass: 'text-center', hide: true},
 		{headerName: "시퀀스", field: "tmtbGoodsSq", width: 150, cellClass: 'text-center', hide: true},
@@ -928,7 +1094,7 @@
 	
 	// 브랜드 추가 버튼 클릭시 (복수 브랜드때 수정 필요)
 	$('#btnAddBrand').on('click', function() {
-		cfnOpenBrandListPopup("fnSetPopupBrandInfo", "M");
+		cfnOpenBrandGroupListPopup("fnSetPopupBrandInfo", "S", "C");
 	});
 	
 	 // 브랜드 설정 선택삭제 버튼 클릭시
@@ -943,12 +1109,12 @@
 
 			// 받아온 data for
 			for(let j = 0 ; j < gridListValue.length ; j++) {
-				if(gridListValue[j].brandCd == result[i].brandCd) {	addChk = false;	}					// 중복체크
+				if(gridListValue[j].brandGroupNo == result[i].brandGroupNo) {	addChk = false;	}					// 중복체크
 			}
 
 			// 중복되지 않은 데이터 리스트에 추가
 			if(addChk) {
-				gagaAgGrid.addRowData(gridOptionsFGBrandList, {"brandCd" : result[i].brandCd, "brandEnm" : result[i].brandEnm, "brandKnm" : result[i].brandKnm});
+				gagaAgGrid.addRowData(gridOptionsFGBrandList, {"brandGroupNo" : result[i].brandGroupNo, "brandGroupKnm" : result[i].brandGroupKnm, "brandGroupEnm" : result[i].brandGroupEnm});
 			}
 		}
 	};

+ 2 - 2
src/main/webapp/WEB-INF/views/marketing/PlanListForm.html

@@ -81,12 +81,12 @@
 								<option value="P">기획전</option>
 								<option value="E">이벤트</option>
 						</select></td>
-						<th>기획전템플릿유형</th>
+						<!-- <th>기획전템플릿유형</th>
 						<td colspan="1"><select name="templateType">
 								<option value="">전체</option>
 								<option value="H">HTML</option>
 								<option value="T">TEXT</option>
-						</select></td>
+						</select></td> -->
 					</tr>
 
 					<tr>

Разница между файлами не показана из-за своего большого размера
+ 940 - 76
src/main/webapp/WEB-INF/views/marketing/PlanTemplatePopupForm.html


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