Sfoglia il codice sorgente

Revert "Revert "Merge branch 'csh9191' into develop""

This reverts commit 8ed34147496294c59fc81efe8accb66087033754.
ChoiSooHwan 5 anni fa
parent
commit
0e20817723

+ 110 - 0
src/main/java/com/style24/admin/biz/dao/TsaMailTemplateDao.java

@@ -0,0 +1,110 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.MailTemplate;
+import com.style24.persistence.domain.MktmailManagement;
+import com.style24.persistence.domain.MktmailManagementTc;
+import com.style24.persistence.domain.OrderSample;
+
+/**
+ * 메일헤더푸터관리 Dao
+ * 
+ * @author csh9191	 
+ * @since 2021. 02. 02
+ */
+@ShopDs
+public interface TsaMailTemplateDao {
+	
+	/**
+	 * 메일헤더푸터 관리 목록
+	 * @param mailtemplate - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 00
+	 */
+	Collection<MailTemplate> getmailHFList(MailTemplate mailtemplate);
+	
+	/**
+	 * 메일헤더푸터 상세
+	 * @param mailtemplate - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 02
+	 */
+	MailTemplate getMailHFDetail(Integer mailtemplate);
+
+	/**
+	 * 메일헤더푸터 등록수정
+	 * @param  mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 03
+	 */
+	void saveMailHF(MailTemplate mailtemplate);
+	
+	/**
+	 * 메일헤더푸터 리스트 삭제
+	 * @param  mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 03
+	 */
+	void deleteMailHFList(MailTemplate mailtemplate);
+	
+	/**
+	 * mkt메일관리 상세
+	 * @param mktmailManagement - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 05
+	 */
+	MktmailManagement getMktmailManagementDetail(Integer mktmailManagement);
+	/**
+	 * mkt메일관리 상세
+	 * @param mktmailManagement - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 15
+	 */
+	MktmailManagementTc getMktmailManagementTCDetail(Integer mktmailManagementTc);
+	/**
+	 * MKT메일 등록수정
+	 * @param  mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 03
+	 */
+	void saveMktMailDetail(MktmailManagement mktMailManagement);
+	
+	/**
+	 * MKT메일 등록수정
+	 * @param  mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 13
+	 */
+	void saveMktMailTemplate(MktmailManagement mktMailManagement);
+	int saveMktmailform(MktmailManagement mktMailManagement);
+	int saveMailTc(MktmailManagement mktMailManagement);
+	int saveMailGoods(MktmailManagement mktMailManagement);
+	
+	
+	/* MKT 메일 전시 */
+	Collection<Goods> getMailGoodsInfo(Goods goods);
+	
+	/**
+	 * 메일헤더푸터 관리 목록
+	 * @param mailtemplate - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 13
+	 */
+	Collection<MktmailManagement> getMktMailList(MktmailManagement mktMailManagement);
+	/**
+	 * 메일헤더푸터 리스트 삭제
+	 * @param  mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 15
+	 */
+	void deleteMktmailList(MktmailManagement mktMailManagement);
+
+}

+ 370 - 0
src/main/java/com/style24/admin/biz/service/TsaMailTemplateService.java

@@ -0,0 +1,370 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.gagaframework.web.parameter.GagaMap;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+import com.style24.admin.biz.dao.TsaMailTemplateDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.MailTemplate;
+import com.style24.persistence.domain.MktmailManagement;
+import com.style24.persistence.domain.MktmailManagementGoods;
+import com.style24.persistence.domain.MktmailManagementTc;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 메일헤더푸터관리 Service
+ *
+ * @author csh9191
+ * @since 2021. 02. 02
+ */
+
+@Service
+@Slf4j
+public class TsaMailTemplateService {
+
+	@Autowired
+	private TsaMailTemplateDao mailtempletDao;
+
+	/**
+	 * 메일헤더푸터관리 목록
+	 * @param mailtemplate - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 02
+	 */
+	public Collection<MailTemplate> getmailHFList(MailTemplate mailtemplate) {
+		return mailtempletDao.getmailHFList(mailtemplate);
+	}
+	
+	/**
+	 * 메일헤더푸터관리 상세화면
+	 * @param mailtemplate - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 02
+	 */
+	public MailTemplate getMailHFDetail(Integer mailtemplate) {
+		return mailtempletDao.getMailHFDetail(mailtemplate);
+	}
+	
+
+	/**
+	 * 메일헤더푸터 상세 등록/수정
+	 * @param mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 03
+	 */
+	@Transactional("shopTxnManager")
+	public void saveMailHF(MailTemplate mailtemplate) {
+		// 내용 유무 확인
+		if (StringUtils.isNotBlank(mailtemplate.getMailhfContent())) {
+			mailtemplate.setMailhfContent(mailtemplate.getMailhfContent().replaceAll("&lt;", "<").replaceAll("&gt;", ">"));
+		}
+
+		mailtempletDao.saveMailHF(mailtemplate);
+	
+	}
+	
+	/**
+	 * 메일헤더푸터 리스트 삭제
+	 * @param mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 03
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteMailHFList(Collection<MailTemplate> mailTemplateList) {
+		int userId = TsaSession.getInfo().getUserNo();
+		
+		for(MailTemplate mailtemplate : mailTemplateList) {
+			mailtemplate.setRegNo(userId);
+			mailtemplate.setUpdNo(userId);
+			mailtempletDao.deleteMailHFList(mailtemplate);
+		}
+	}
+	
+	/**
+	 * MKT메일관리 상세화면
+	 * @param mktmailManagement - 메일템플릿관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 05
+	 */
+	public MktmailManagement getMktmailManagementDetail(Integer mktmailManagement) {
+		return mailtempletDao.getMktmailManagementDetail(mktmailManagement);
+	}
+	/**
+	 * MKT메일관리 상세화면
+	 * @param mktmailManagement - 메일템플릿TC관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 05
+	 */
+	public MktmailManagementTc getMktmailManagementTCDetail(Integer mktmailManagementTc) {
+		return mailtempletDao.getMktmailManagementTCDetail(mktmailManagementTc);
+	}
+
+	
+	/**
+	 * MKT 상세 등록/수정
+	 * @param mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 13
+	 */
+	public GagaMap saveMktMailTemplate (MktmailManagement mktMailManagement) {
+		GagaMap result = new GagaMap();
+		
+		int mailHsq = mktMailManagement.getMktHeader();
+		int mailFsq = mktMailManagement.getMktFooter();
+		String mailtNm = mktMailManagement.getMailtNm();
+		String mailtGb = mktMailManagement.getMailtGb();
+		String mailContent = mktMailManagement.getMailContent();
+		
+		MktmailManagement mktmail = new MktmailManagement();
+		mktmail.setMktHeader(mailHsq);
+		mktmail.setMktFooter(mailFsq);
+		mktmail.setMailtNm(mailtNm);
+		mktmail.setMailtGb(mailtGb);
+		mktmail.setMailContent(mailContent);
+		
+		//메일 헤더 푸터 타이틀 내용 등록
+		mailtempletDao.saveMktmailform(mktMailManagement); 
+		mktMailManagement.getMailtSq();
+		mktMailManagement.getMailtcSq();
+		
+		//구분자1 등록
+		for(MktmailManagementTc mktmailManagementTc : mktMailManagement.getMktmailManagementTc()) {
+			if(!StringUtils.isEmpty(mktmailManagementTc.getMailtcNm())) {
+				String mailtcNm = mktmailManagementTc.getMailtcNm();
+				String mailtcLink = mktmailManagementTc.getMailtcLink();
+				int goodsCpr = mktmailManagementTc.getGoodsCpr();
+				
+				MktmailManagement mktmailtc = new MktmailManagement();
+				
+				mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
+				mktmailtc.setUpdNo(TsaSession.getInfo().getUserNo());
+				mktmailtc.setMailtcNm(mailtcNm);
+				mktmailtc.setMailtcLink(mailtcLink);
+				mktmailtc.setGoodsCpr(goodsCpr);
+				mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+				
+				mailtempletDao.saveMailTc(mktmailtc);
+				//grid1
+				for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods()) {
+					
+					
+					String goodsCd = mktmailManagementGoods.getGoodsCd();
+					int dispOrd = mktmailManagementGoods.getDispOrd();
+	
+					MktmailManagement mktmailGoods = new MktmailManagement();
+					
+					mktmailGoods.setRegNo(TsaSession.getInfo().getUserNo());
+					mktmailGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+					mktmailGoods.setDispOrd(dispOrd);
+					mktmailGoods.setGoodsCd(goodsCd);
+					mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+					//grid 데이터 등록
+					mailtempletDao.saveMailGoods(mktmailGoods);
+				}
+			}
+		}
+		
+
+		//구분자2 등록
+		for(MktmailManagementTc mktmailManagementTc : mktMailManagement.getMktmailManagementTc2()) {
+			if(!StringUtils.isEmpty(mktmailManagementTc.getMailtcNm())) {
+				String mailtcNm = mktmailManagementTc.getMailtcNm();
+				String mailtcLink = mktmailManagementTc.getMailtcLink();
+				int goodsCpr = mktmailManagementTc.getGoodsCpr();
+	
+				MktmailManagement mktmailtc = new MktmailManagement();
+	
+				mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
+				mktmailtc.setUpdNo(TsaSession.getInfo().getUserNo());
+				mktmailtc.setMailtcNm(mailtcNm);
+				mktmailtc.setMailtcLink(mailtcLink);
+				mktmailtc.setGoodsCpr(goodsCpr);
+				mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+	
+				mailtempletDao.saveMailTc(mktmailtc);
+				//grid2
+				for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods2()) {
+	
+					String goodsCd = mktmailManagementGoods.getGoodsCd();
+					int dispOrd = mktmailManagementGoods.getDispOrd();
+	
+					MktmailManagement mktmailGoods = new MktmailManagement();
+	
+					mktmailGoods.setRegNo(TsaSession.getInfo().getUserNo());
+					mktmailGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+					mktmailGoods.setDispOrd(dispOrd);
+					mktmailGoods.setGoodsCd(goodsCd);
+					mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+					//grid 데이터 등록
+					mailtempletDao.saveMailGoods(mktmailGoods);
+				}
+			}
+		}
+		
+		//구분자3 등록
+		for(MktmailManagementTc mktmailManagementTc : mktMailManagement.getMktmailManagementTc3()) {
+			if(!StringUtils.isEmpty(mktmailManagementTc.getMailtcNm())) {
+			String mailtcNm = mktmailManagementTc.getMailtcNm();
+			String mailtcLink = mktmailManagementTc.getMailtcLink();
+			int goodsCpr = mktmailManagementTc.getGoodsCpr();
+
+			MktmailManagement mktmailtc = new MktmailManagement();
+
+			mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
+			mktmailtc.setUpdNo(TsaSession.getInfo().getUserNo());
+			mktmailtc.setMailtcNm(mailtcNm);
+			mktmailtc.setMailtcLink(mailtcLink);
+			mktmailtc.setGoodsCpr(goodsCpr);
+			mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+
+			mailtempletDao.saveMailTc(mktmailtc);
+			//grid3
+			for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods3()) {
+
+				String goodsCd = mktmailManagementGoods.getGoodsCd();
+				int dispOrd = mktmailManagementGoods.getDispOrd();
+
+				MktmailManagement mktmailGoods = new MktmailManagement();
+
+				mktmailGoods.setRegNo(TsaSession.getInfo().getUserNo());
+				mktmailGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+				mktmailGoods.setDispOrd(dispOrd);
+				mktmailGoods.setGoodsCd(goodsCd);
+				mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+				//grid 데이터 등록
+				mailtempletDao.saveMailGoods(mktmailGoods);
+			}
+			}
+		}
+
+		//구분자4 등록
+		for(MktmailManagementTc mktmailManagementTc : mktMailManagement.getMktmailManagementTc4()) {
+			if(!StringUtils.isEmpty(mktmailManagementTc.getMailtcNm())) {
+			String mailtcNm = mktmailManagementTc.getMailtcNm();
+			String mailtcLink = mktmailManagementTc.getMailtcLink();
+			int goodsCpr = mktmailManagementTc.getGoodsCpr();
+			
+			MktmailManagement mktmailtc = new MktmailManagement();
+
+			mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
+			mktmailtc.setUpdNo(TsaSession.getInfo().getUserNo());
+			mktmailtc.setMailtcNm(mailtcNm);
+			mktmailtc.setMailtcLink(mailtcLink);
+			mktmailtc.setGoodsCpr(goodsCpr);
+			mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+			
+			mailtempletDao.saveMailTc(mktmailtc);
+			//grid4
+			for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods4()) {
+				
+				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());
+				//grid 데이터 등록
+				mailtempletDao.saveMailGoods(mktmailGoods);
+			}
+			}
+		}
+		
+		//구분자5 등록
+		for(MktmailManagementTc mktmailManagementTc : mktMailManagement.getMktmailManagementTc5()) {
+			if(!StringUtils.isEmpty(mktmailManagementTc.getMailtcNm())) {
+			String mailtcNm = mktmailManagementTc.getMailtcNm();
+			String mailtcLink = mktmailManagementTc.getMailtcLink();
+			int goodsCpr = mktmailManagementTc.getGoodsCpr();
+
+			MktmailManagement mktmailtc = new MktmailManagement();
+
+			mktmailtc.setRegNo(TsaSession.getInfo().getUserNo());
+			mktmailtc.setUpdNo(TsaSession.getInfo().getUserNo());
+			mktmailtc.setMailtcNm(mailtcNm);
+			mktmailtc.setMailtcLink(mailtcLink);
+			mktmailtc.setGoodsCpr(goodsCpr);
+			mktmailtc.setMailtSq(mktMailManagement.getMailtSq());
+
+			mailtempletDao.saveMailTc(mktmailtc);
+			
+			//grid5
+			for (MktmailManagementGoods mktmailManagementGoods : mktMailManagement.getMktmailManagementGoods5()) {
+				
+				String goodsCd = mktmailManagementGoods.getGoodsCd();
+				int dispOrd = mktmailManagementGoods.getDispOrd();
+				
+				MktmailManagement mktmailGoods = new MktmailManagement();
+				
+				mktmailGoods.setRegNo(TsaSession.getInfo().getUserNo());
+				mktmailGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+				mktmailGoods.setDispOrd(dispOrd);
+				mktmailGoods.setGoodsCd(goodsCd);
+				mktmailGoods.setMailtcSq(mktmailtc.getMailtcSq());
+				//grid 데이터 등록
+				mailtempletDao.saveMailGoods(mktmailGoods);
+			}
+			}
+		}
+
+
+		result.set("status", GagaResponseStatus.SUCCESS.getCode());
+
+		return result;
+	}
+	
+	/* MKT 메일 전시 */
+	public Collection<Goods> getMailGoodsInfo(Goods goods) {
+		return mailtempletDao.getMailGoodsInfo(goods);
+	}
+	
+	/**
+	 * MKT메일관리 목록
+	 * @param mailtemplate - 메일관련 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 13
+	 */
+	public Collection<MktmailManagement> getMktMailList(MktmailManagement mktmailManagement) {
+		return mailtempletDao.getMktMailList(mktmailManagement);
+	}
+	
+	/**
+	 * 메일헤더푸터 리스트 삭제
+	 * @param mailtemplate - 메일관련 정보
+	 * @author csh9191
+	 * @since 2021. 02. 15
+	 */
+	@Transactional("shopTxnManager")
+	public void deleteMktmailList(Collection<MktmailManagement> mktmailManagementList) {
+		int userId = TsaSession.getInfo().getUserNo();
+		
+		for(MktmailManagement mktmailManagement : mktmailManagementList) {
+			mktmailManagement.setRegNo(userId);
+			mktmailManagement.setUpdNo(userId);
+			mailtempletDao.deleteMktmailList(mktmailManagement);
+		}
+	}
+	
+
+}

+ 228 - 0
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -24,6 +24,7 @@ import org.springframework.web.servlet.ModelAndView;
 import com.style24.admin.biz.service.TsaCardPromotionService;
 import com.style24.admin.biz.service.TsaCommonService;
 import com.style24.admin.biz.service.TsaFreegiftPromotionService;
+import com.style24.admin.biz.service.TsaMailTemplateService;
 import com.style24.admin.biz.service.TsaMorebetterService;
 import com.style24.admin.biz.service.TsaPlanService;
 import com.style24.admin.biz.service.TsaRendererService;
@@ -36,10 +37,33 @@ import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.core.support.session.TscSession;
 import com.style24.persistence.TscPageRequest;
+
+import com.style24.persistence.domain.CardPromotion;
+import com.style24.persistence.domain.CardPromotionTarget;
+
+import com.style24.persistence.domain.CommonCode;
+import com.style24.persistence.domain.Coupon;
+import com.style24.persistence.domain.CouponRefval;
+import com.style24.persistence.domain.CustCoupon;
+import com.style24.persistence.domain.FreeGoodsPromotion;
+import com.style24.persistence.domain.Goods;
+import com.style24.persistence.domain.MailTemplate;
+import com.style24.persistence.domain.MktmailManagement;
+import com.style24.persistence.domain.MktmailManagementGoods;
+import com.style24.persistence.domain.MktmailManagementTc;
+import com.style24.persistence.domain.MoreBetter;
+import com.style24.persistence.domain.MoreBetterBurden;
+import com.style24.persistence.domain.MoreBetterGoods;
+import com.style24.persistence.domain.MoreBetterSection;
+import com.style24.persistence.domain.Point;
+import com.style24.persistence.domain.Review;
+import com.style24.persistence.domain.User;
+
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.rest.server.GagaResponse;
+import com.gagaframework.web.rest.server.GagaResponseStatus;
 import com.gagaframework.web.util.GagaDateUtil;
 
 /**
@@ -79,6 +103,11 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TscPointService corePointService;
 
+	@Autowired
+	private TsaMailTemplateService mailTemplateService;
+	
+
+
 	@Autowired
 	private TsaCardPromotionService cardPromotionService;
 	
@@ -88,6 +117,7 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TscCouponService coreCouponService;
 
+
 	/**
 	 * 상품평관리 화면
 	 * @return
@@ -952,7 +982,205 @@ public class TsaMarketingController extends TsaBaseController {
 
 		return super.ok(message.getMessage("SUCC_0001"));
 	}
+	
+	/* 최수환 진행 */
+	
+	/**
+	 * 메일 헤더푸터관리 화면
+	 * @param
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 01
+	 */
+	@GetMapping("/mailtemplate/form")
+	public ModelAndView mailheaderfooterForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("marketing/MailHeaderFooterForm");
+		return mav;
+	}
+	
+	/**
+	 * 메일헤더푸터관리 목록
+	 * @param 메일헤더푸터관리 - 메일 헤더푸터 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 01
+	 */
+	@PostMapping("/mailtemplate/list")
+	@ResponseBody
+	public Collection<MailTemplate> getMailHFList(@RequestBody MailTemplate mailTemplate) {
+		return mailTemplateService.getmailHFList(mailTemplate);
+	}
+	
+	/**
+	 * 메일헤더푸터관리 상세화면
+	 * @param mode - 모드(N:신규, U:상세)
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 01
+	 */
+	@GetMapping("/mailtemplate/detail/form")
+	public ModelAndView MailHeadeFooterDetailForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "mailhfSq", required = false) Integer mailhfSq) {
+		ModelAndView mav = new ModelAndView();
+	
+		// 모드 값
+		mav.addObject("mode", mode);
+
+		
+		if ("U".equals(mode)) {
+			mav.addObject("mailhfInfo", mailTemplateService.getMailHFDetail(mailhfSq));
+		}
+
+		mav.setViewName("marketing/MailHeaderFooterDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 메일헤더푸터 상세 등록/수정
+	 * @param 메일헤더푸터관리 - 메일헤더푸터 정보
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 01
+	 */
+	@PostMapping("/mailtemplate/save")
+	@ResponseBody
+	public GagaResponse saveMailHF(@RequestBody MailTemplate mailTemplate) {
+		mailTemplate.setRegNo(TsaSession.getInfo().getUserNo());
+		mailTemplate.setUpdNo(TsaSession.getInfo().getUserNo());
+		mailTemplateService.saveMailHF(mailTemplate);
+		return super.ok(message.getMessage("SUCC_0001"));
+
+	}
+	
+	/**
+	 * 메일헤더푸터 리스트 삭제
+	 * @param 메일헤더푸터관리 - 메일헤더푸더 정보
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 03
+	 */
+	@PostMapping("/mailtemplate/delete")
+	@ResponseBody
+	public GagaResponse deleteMailHFList(@RequestBody Collection<MailTemplate> mailTemplateList) {
+		mailTemplateService.deleteMailHFList(mailTemplateList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+	
+	/**
+	 * MKT 메일관리 화면
+	 * @param
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 05
+	 */
+	@GetMapping("/mktmailmanagement/form")
+	public ModelAndView mktmailManagementForm() {
+		ModelAndView mav = new ModelAndView();
+
+		mav.setViewName("marketing/MktmailmanagementForm");
+		return mav;
+	}
+	
+	/**
+	 * MKT 메일관리 상세화면
+	 * @param mode - 모드(N:신규, U:상세)
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 08
+	 */
+	@GetMapping("/mktmailmanagement/detail/form")
+	public ModelAndView mktmailManagementDetailForm(MktmailManagement mktmailManagement) {
+		ModelAndView mav = new ModelAndView();
+		
+		Integer mailtSq = mktmailManagement.getMailtSq();
+		String mode = mktmailManagement.getMode();
+		
+		MailTemplate param = new MailTemplate();
+		
+		param.setMailhfGb("H");
+		mav.addObject("mailHsqList", mailTemplateService.getmailHFList(param));
+		
+		param.setMailhfGb("F");
+		mav.addObject("mailFsqList", mailTemplateService.getmailHFList(param));
+		
+		mav.addObject("mode", mode);
+		
+		if ("U".equals(mode)) {
+			mav.addObject("mktmailInfo", mailTemplateService.getMktmailManagementDetail(mailtSq));
+			
+			log.info("mktmailInfo {}",mailTemplateService.getMktmailManagementDetail(mailtSq));
+		}
+		
+		mav.setViewName("marketing/MktmailmanagementDetailForm");
+
+		return mav;
+	}
+	
+	/**
+	 * MKT 메일관리 상품추가 팝업
+	 * @param 
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 09
+	 */
+	
+	@PostMapping("/mktMailManagement/goods/info")
+	@ResponseBody
+	public Collection<Goods> getOrderSampleGoodsInfo(@RequestBody String[] arrGoodsCd) {
+		Goods goods = new Goods();
+		goods.setArrGoodsCd(arrGoodsCd);
+		
+		return mailTemplateService.getMailGoodsInfo(goods);
+	}
+	
+	/**
+	 * MKT메일 상세 등록/수정
+	 * @param 메일헤더푸터관리 - 메일헤더푸터 정보
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 13
+	 */
+	@PostMapping("/mktMailManagement/save")
+	@ResponseBody
+	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());
+
+		result = mailTemplateService.saveMktMailTemplate(mktmailManagement);
+		result.set("message", message.getMessage("SUCC_0001"));
+		return result;
+	}
 
+	/**
+	 * MKT메일관리 목록
+	 * @param MKT메일관리관리 - MKT메일관리 정보
+	 * @return
+	 * @author csh9191
+	 * @since 2021. 02. 14
+	 */
+	@PostMapping("/mktmailManagement/list")
+	@ResponseBody
+	public Collection<MktmailManagement> getMktMailList(@RequestBody MktmailManagement mktmailManagement) {
+		return mailTemplateService.getMktMailList(mktmailManagement);
+	}
+	/**
+	 * 메일헤더푸터 리스트 삭제
+	 * @param 메일헤더푸터관리 - 메일헤더푸더 정보
+	 * @return
+	 * @author csh9191	
+	 * @since 2021. 02. 15
+	 */
+	@PostMapping("/mktmailManagement/delete")
+	@ResponseBody
+	public GagaResponse deleteMktmailList(@RequestBody Collection<MktmailManagement> mktmailManagementList) {
+		mailTemplateService.deleteMktmailList(mktmailManagementList);
+		return super.ok(message.getMessage("SUCC_0003"));
+	}
+	
 	/* // CSB 진행 */
 
 	/**

+ 34 - 0
src/main/java/com/style24/persistence/domain/MailTemplate.java

@@ -0,0 +1,34 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * 색상 Domain
+ *
+ * @author csh9191
+ * @since 2021. 01. 29.
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class MailTemplate extends TscBaseDomain{
+
+	//메일템플릿
+	private Integer mailtSq;		// 메일템플릿 일련번호
+	private Integer mailhfSq;		// 메일헤더푸터 일련번호
+	private String mailhfNm;		// 메일헤더푸터 타이틀명
+	private String mailhfGb;		// 메일헤더푸터 구분 H:헤더 F:푸터
+	private String mode;
+	private String mailhfContent;	// 메일헤더푸터 내용
+	private String useYn;			// 사용여부
+	private String regDt;			// 등록일시
+	private String updDt;			// 수정일시
+	
+	private String searchTxt;		//등로자 검색
+
+
+	}
+
+

+ 77 - 0
src/main/java/com/style24/persistence/domain/MktmailManagement.java

@@ -0,0 +1,77 @@
+package com.style24.persistence.domain;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * MKT메일관리 Domain
+ *
+ * @author csh9191
+ * @since 2021. 02. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class MktmailManagement extends TscBaseDomain{
+	// MKT 메일관리
+	private String mktmailStdt;				// 검색 시작일
+	private String mktmailEddt;				// 검색 마지막일
+	private Integer mailtSq; 				// 메일템플릿 번호
+	private String mailtNm;					// 메일템플릿 명
+	private String mailtGb;					// 메일템플릿 구분
+	private Integer mktHeader;				// 메일헤더 일련번호
+	private Integer mktFooter;				// 메일푸터 일련번호
+	private String mailContent;				// 메일 내용
+	private String useYn;					// 사용구분
+	private String regDt;					// 등록일시
+	private String updDt;					// 수정일시
+	private String mode;
+	
+	private String searchTxt;				// 검색어
+	private String searchGb; 				// 검색구분
+		
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementGoods> mktmailManagementGoods; //메일 전시
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementGoods> mktmailManagementGoods2; //메일 전시
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementGoods> mktmailManagementGoods3; //메일 전시
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementGoods> mktmailManagementGoods4; //메일 전시
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementGoods> mktmailManagementGoods5; //메일 전시
+	
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementTc> mktmailManagementTc; //메일템플릿 구분자
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementTc> mktmailManagementTc2; 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementTc> mktmailManagementTc3; 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementTc> mktmailManagementTc4; 
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	List<MktmailManagementTc> mktmailManagementTc5; 
+	// 메일 템플릿 코너 
+	private Integer mailtcSq;				// 메일템플릿 코너번호
+	private String mailtcNm;				// 메일템플릿 코너명
+	private Integer goodsCpr;				// 상품 노출건수
+	private String mailtcLink;				// 메일템플릿 코너 링크
+	
+	//상품정보
+	private String brandKnm;				// 브랜드명
+	private String goodNms;					// 상품명
+	private String cdNm;					// 판매상태
+	private String listPrice;				// 정상가
+	private String currPrice;				// 판매가
+	private String goodsCd;					// 상품코드(상품)
+	private Integer dispOrd;				// 표시순서
+
+
+	
+
+	
+}

+ 31 - 0
src/main/java/com/style24/persistence/domain/MktmailManagementGoods.java

@@ -0,0 +1,31 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * MKT메일관리 Domain
+ *
+ * @author csh9191
+ * @since 2021. 02. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class MktmailManagementGoods extends TscBaseDomain{
+	
+	// 메일 템플릿 코너 상품
+	private Integer mailtcSq;				// 메일템플릿코너 일련번호
+	private String goodsCd;					// 상품코드(상품)
+	private Integer dispOrd;				// 표시순서
+	private String regDt;					// 등록일시
+	private String updDt;					// 수정일시
+	
+	//상품정보
+	private String brandEnm;				// 브랜드명
+	private String goodNms;					// 상품명
+	private String cdNm;					// 판매상태
+	private String listPrice;				// 정상가
+	private String currPrice;				// 판매가
+
+}

+ 29 - 0
src/main/java/com/style24/persistence/domain/MktmailManagementTc.java

@@ -0,0 +1,29 @@
+package com.style24.persistence.domain;
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * MKT메일관리 Domain
+ *
+ * @author csh9191
+ * @since 2021. 02. 05
+ */
+@SuppressWarnings("serial")
+@Data
+public class MktmailManagementTc extends TscBaseDomain{
+	
+	// 메일 템플릿 코너 
+	private Integer mailtcSq;				// 메일템플릿 코너번호
+	private Integer mailtSq;				// 메일템플릿 일련번호
+	private String mailtcNm;				// 메일템플릿 코너명
+	private Integer goodsCpr;				// 상품 노출건수
+	private String mailtcLink;				// 메일템플릿 코너 링크
+	private String useYn;					// 사용구분
+	private String regDt;					// 등록일시
+	private String updDt;					// 수정일시
+
+
+
+}

+ 296 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaMailTemplate.xml

@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.style24.admin.biz.dao.TsaMailTemplateDao">
+
+		<select id="getmailHFList" parameterType="MailTemplate" resultType="MailTemplate">
+		/* TsaMailTemplate.getmailHFList */
+		SELECT MAILHF_SQ                                             /*메일헤더푸터 일련번호*/
+		   	 , MAILHF_NM                                             /*메일헤더푸터 명*/
+		     , MAILHF_GB                                             /*메일 헤더푸터 구분 H:헤더 F:푸터*/
+		     , MAILHF_CONTENT                                        /*메일 헤더푸터 내용*/
+		     , USE_YN                                                /*사용여부*/
+		     , 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_MAILHF
+		WHERE  USE_YN = 'Y'
+		<if test="mailhfNm != null and mailhfNm !='' ">
+		AND    LOWER(MAILHF_NM) LIKE CONCAT('%',LOWER(#{mailhfNm}),'%')
+		</if>
+		<if test="mailhfGb !=null and mailhfGb !='' ">
+		AND    MAILHF_GB = #{mailhfGb}
+		</if> 
+		<if test="searchTxt !=null and searchTxt !='' ">
+		AND    FN_GET_USER_NM(REG_NO) LIKE CONCAT('%',LOWER(#{searchTxt}), '%')
+		</if>
+		ORDER  BY MAILHF_SQ
+		</select>
+	
+		<insert id="saveMailHF" parameterType="MailTemplate">
+		/* TsaMailTemplate.saveMailHF 메일헤더푸터관리 등록/수정*/
+		INSERT INTO TB_MAILHF (
+			   MAILHF_SQ                                        /*메일헤더푸터 일련번호*/
+		     , MAILHF_NM                                        /*메일헤더푸터 명*/
+		     , MAILHF_GB                                        /*메일헤더푸터 구분 H:헤더 F:푸터*/
+		     , MAILHF_CONTENT                                   /* 메일헤더푸터 내용*/
+		     , USE_YN                                           /*사용여부*/
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+	     VALUES (
+		       #{mailhfSq}
+		     , #{mailhfNm}
+		     , #{mailhfGb}
+		     , #{mailhfContent}
+		     , IFNULL(#{useYn},'Y')
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		        MAILHF_SQ = #{mailhfSq}
+		     , MAILHF_NM = #{mailhfNm}
+		     , MAILHF_GB = #{mailhfGb}
+		     , MAILHF_CONTENT = #{mailhfContent}
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+		</insert>
+	
+		<select id="getMailHFDetail" parameterType="Integer" resultType="MailTemplate">
+		/* TsaMailTemplate.getMailHFDetail */
+		SELECT MAILHF_SQ
+		     , MAILHF_NM
+		     , MAILHF_GB
+		     , MAILHF_CONTENT
+		FROM   TB_MAILHF
+		WHERE  MAILHF_SQ = #{mailhfSq}
+		</select>
+	
+		<update id='deleteMailHFList' parameterType='MailTemplate'>
+		/* TsaMailTemplate.deleteMailHFList */
+		UPDATE TB_MAILHF
+		SET    USE_YN = 'N'
+		WHERE  MAILHF_SQ = #{mailhfSq}
+		</update>
+	
+		<select id="getMailGoodsInfo" parameterType="Goods" resultType="Goods">
+		/*메일 템플릿 상품 전시*/
+		SELECT GOODS_CD
+		     , GOODS_NM
+		     , BRAND_ENM 
+		     , STOCK_QTY_SUM
+	         , 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
+	      FROM (
+		SELECT   GI.SYS_IMG_NM
+			   , G.GOODS_CD
+			   , G.GOODS_NM
+			   , B.BRAND_ENM 
+			   , (CASE WHEN G.GOODS_TYPE = 'G056_N' THEN (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK WHERE GOODS_CD = G.GOODS_CD)
+		   ELSE  (SELECT IFNULL(SUM(CURR_STOCK_QTY - BASE_STOCK_QTY),0) FROM VW_STOCK_COMPOSE WHERE GOODS_CD = G.GOODS_CD)
+				 END) AS STOCK_QTY_SUM
+			   , G.GOODS_STAT
+			   , G.STYLE_YEAR
+			   , G.SEASON_CD
+			   , G.LIST_PRICE
+			   , G.CURR_PRICE
+			   , G.PRICE_UPD_DT
+			   , G.ERP_STOCK_LINK_YN
+			   , G.FORMAL_GB
+			   , G.RETURNABLE_YN
+			   , G.REG_DT
+			   , FN_GET_USER_NM(G.REG_NO) AS REG_NM
+			   , G.UPD_DT
+			   , FN_GET_USER_NM(G.UPD_NO) AS UPD_NM
+			   , IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) AS REP_GOODS_CD
+			   , OP.OPT_CD2
+			   , OP.DISP_ORD
+			FROM TB_GOODS G
+			LEFT OUTER JOIN TB_GOODS_COMPOSE GC
+			  ON G.GOODS_CD = GC.GOODS_CD
+		   INNER JOIN TB_OPTION OP
+			  ON IFNULL(GC.COMPS_GOODS_CD, G.GOODS_CD) = OP.GOODS_CD
+			LEFT OUTER JOIN TB_GOODS_IMG GI
+			  ON G.GOODS_CD = GI.GOODS_CD
+		   INNER JOIN TB_BRAND B
+			  ON G.BRAND_CD = B.BRAND_CD
+		   WHERE G.GOODS_CD IN
+		<foreach collection="arrGoodsCd" item="item" index="index"  open="(" close=")" separator=",">
+			 #{item}
+		</foreach>
+		  ) Z
+		    GROUP BY SYS_IMG_NM, GOODS_CD, GOODS_NM, STOCK_QTY_SUM, 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
+		</select>
+	
+	
+		<insert id="saveMktmailform" parameterType="MktmailManagement" keyProperty="mailtSq">
+		/* TsaMailTemplate.saveMktmailform   mkt메일 등록/수정 */
+		INSERT INTO TB_MAILT (
+				    MAILT_SQ
+				  , MAILT_NM
+				  , MAILT_GB
+				  , MAILH_SQ
+				  , MAILF_SQ
+				  , MAIL_CONTENT
+				  , USE_YN
+				  , REG_NO
+				  , REG_DT
+				  , UPD_NO
+				  , UPD_DT
+			)
+		     VALUES (
+				    #{mailtSq}
+				  , #{mailtNm}
+				  , #{mailtGb}
+				  , #{mktHeader}
+				  , IFNULL(#{mktFooter}, null )
+				  , #{mailContent}
+				  , IFNULL(#{useYn},'Y')
+				  , #{regNo}
+				  , NOW()
+				  , #{updNo}
+				  , NOW()
+			)
+		ON DUPLICATE KEY UPDATE
+			        MAILT_SQ = #{mailtSq}
+		          , MAILT_NM = #{mailtNm}
+		          , MAILT_GB = #{mailtGb}
+		          , MAILH_SQ = #{mktHeader}
+		          , MAILF_SQ = #{mktFooter}
+		          , MAIL_CONTENT = #{mailContent}
+		          , UPD_NO = #{updNo}
+		          , UPD_DT = NOW()
+		</insert>
+	
+		<insert id="saveMailTc" parameterType="MktmailManagement" keyProperty="mailtcSq">
+		/* TsaMailTemplate.saveMailTc 메일구분자 */
+		INSERT INTO TB_MAILTC ( 
+				    MAILTC_SQ
+				  , MAILT_SQ
+				  , MAILTC_NM
+				  , GOODS_CPR
+				  , MAILTC_LINK
+				  , USE_YN
+				  , REG_NO
+				  , REG_DT
+				  , UPD_NO
+				  , UPD_DT
+			)
+		     VALUES ( 
+				    #{mailtcSq}
+				  , #{mailtSq}
+				  , #{mailtcNm}
+				  , #{goodsCpr}
+				  , #{mailtcLink}
+				  , IFNULL(#{useYn},'Y')
+				  , #{regNo}
+				  , NOW()
+				  , #{updNo}
+				  , NOW()
+			)
+		ON DUPLICATE KEY UPDATE
+				    MAILTC_NM = #{mailtcNm}
+				  , GOODS_CPR = #{goodsCpr}
+				  , MAILTC_LINK = #{mailtcLink}
+				  , UPD_NO = #{updNo}
+				  , UPD_DT = NOW()
+		</insert>
+	
+		<insert id="saveMailGoods" parameterType="MktmailManagement">
+		/* TsaMailTemplate.saveMailGoods 메일 전시상품등록 */
+		INSERT INTO TB_MAILTC_GOODS (
+				    MAILTC_SQ
+				  , GOODS_CD
+				  , DISP_ORD
+				  , REG_NO
+				  , REG_DT
+				  , UPD_NO
+				  , UPD_DT
+			)
+		     VALUES (
+				    #{mailtcSq}
+				  , #{goodsCd}
+				  , #{dispOrd}
+				  , #{regNo}
+				  , NOW()
+				  , #{updNo}
+				  , NOW()
+			)
+		ON DUPLICATE KEY UPDATE
+				    MAILTC_SQ = #{mailtcSq}
+				  , GOODS_CD = #{goodsCd}
+				  , DISP_ORD = #{dispOrd}
+				  , UPD_NO = #{updNo}
+				  , UPD_DT = NOW()
+		</insert>
+		
+		<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'
+		<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')
+		</if> 
+		<if test="searchTxt != null and searchTxt != ''">
+			<if test="searchGb != null and searchGb == 'mailtSq'">
+				AND MAILT_SQ = #{searchTxt}
+			</if>
+			<if test="searchGb != null and searchGb == 'mailtNm'">
+				AND MAILT_NM LIKE CONCAT('%',LOWER(#{searchTxt}), '%')
+			</if>
+		</if>
+		ORDER BY MAILT_SQ
+		</select>
+		
+		<select id="getMktmailManagementDetail" parameterType="Integer" resultType="MktmailManagement">
+		/* TsaMailTemplate.getMktmailManagementDetail */
+		SELECT MAILT_SQ
+			 , MAILT_GB
+			 , MAILH_SQ
+			 , MAILF_SQ
+			 , MAILT_NM
+			 , MAIL_CONTENT
+		FROM   TB_MAILT
+		WHERE  MAILT_SQ = #{mailtSq}
+		</select>
+		
+		<select id="getMktmailManagementTCDetail" parameterType="Integer" resultType="MktmailManagement">
+		/* TsaMailTemplate.getMktmailManagementDetail */
+
+		</select>
+	
+		
+		<update id='deleteMktmailList' parameterType='MktmailManagement'>
+		/* TsaMailTemplate.deleteMailHFList 리스트 삭제*/
+		UPDATE  TB_MAILT
+	  	SET     USE_YN = 'N'
+		WHERE   MAILT_SQ = #{mailtSq}
+		</update>
+	
+</mapper>

+ 150 - 0
src/main/webapp/WEB-INF/views/marketing/MailHeaderFooterDetailForm.html

@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MailHeaderFooterDetailForm.html
+ * @desc    : MailHeaderFooter 등록/수정 상세 팝업화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021. 02. 02   csh9191     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupMailHF">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${'메일 헤더/푸터 ' + (mode == 'N' ? '등록' : '상세')}">메일 헤더/푸터</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupMailHF');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<form id="mailHFForm" name="mailHFForm" action="#" th:action="@{'/marketing/mailtemplate/save'}" th:method="post">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>번호</th>
+							<td>
+								<input type="text" name="mailhfSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>								
+							</td>							
+						</tr>
+						<tr>
+							<th>구분<em class="required" title="필수"></em></th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="mailhfGb" value="H" checked="checked"/>헤더</label>
+								<label class="rdoBtn"><input type="radio" name="mailhfGb" value="F"/>푸터</label>
+							</td>
+						</tr>
+						<tr>
+							<th>타이틀<em class="required" title="필수"></em></th>
+							<td>
+								<input type="text" name="mailhfNm" maxlength="50" required="required" data-valid-name="타이틀"/>
+							</td>
+						</tr>
+						<tr>
+							<th>내용<em class="required" title="필수"></em></th>
+							<td>
+								<textarea class="textareaR4" id="mailhfContent" name="mailhfContent" data-valid-name="내용"></textarea>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="left"  th:if="${mode  == 'N' }">
+				<button type="button" class="btn btn-danger btn-lg" id="btndeleteMailHF">삭제</button>
+			</li>
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveMailHF">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+	</div>
+</div>
+
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	let mailhfInfo = [[${mailhfInfo}]];
+	let mode = [[${mode}]]; 
+
+	//팝업창 삭제버튼
+	$('#btndeleteMailHF').on('click', function() {
+		mcxDialog.confirm("등록하신 내용을 삭제하시겠습니까?<br>삭제한 내용은 복원하실 수 없습니다.", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				uifnPopupClose('popupMailHF'); //팝업 창 닫기
+			}
+		});
+	});
+	
+	// 저장
+	$('#btnSaveMailHF').on('click', function() {
+		// 입력 값 체크
+		if (!gagajf.validation('#mailHFForm'))
+			return false;
+		
+		if (gagajf.isNull($('#mailhfContent').val())) {
+			mcxDialog.alert('내용을 입력해 주세요.');
+			return false;
+		}
+		
+		//타이틀 길이 제한 2자 이상 50자 미만
+		var check = $('#mailHFForm input[name=mailhfNm]').val();
+
+		if(check.length < 2){
+			mcxDialog.alert('타이틀은 2자 이상 50자 미만으로 입력하세요.');
+			return false;
+		}
+		
+		mcxDialog.confirm("내용을 등록 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				gagajf.ajaxFormSubmit($('#mailHFForm').prop('action'), '#mailHFForm', function() {
+					uifnPopupClose('popupMailHF');
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	
+
+	$(document).ready(function() {
+		if (mode == 'U') {
+			$('#mailHFForm input[name=mailhfSq]').val(mailhfInfo.mailhfSq);
+			$('#mailHFForm input[name=mailhfNm]').val(mailhfInfo.mailhfNm);
+			$('#mailHFForm textarea[name=mailhfContent]').val(mailhfInfo.mailhfContent);
+			
+			if (mailhfInfo.mailhfGb == 'F') {
+				$('#mailHFForm input:radio[name="mailhfGb"]:radio[value="F"]').prop('checked', true);
+			}
+		}
+		
+		// Create a summernote
+		let snOptions = gagaSn.getToolbarOptions();
+		gagaSn.createSummernote(snOptions, '#mailhfContent');
+	});
+/*]]>*/
+</script>
+
+</html>

+ 190 - 0
src/main/webapp/WEB-INF/views/marketing/MailHeaderFooterForm.html

@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MailHeaderFooter.html
+ * @desc    : MailHeaderFooter 관리 화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021. 02. 01   csh9191     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title">
+		</div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc">
+		</div>
+		<!-- //메뉴 설명 -->
+		
+		<!-- 검색조건 영역 -->
+		<div class="panelStyle">
+			<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/mailtemplate/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle" aria-describedby="검색조건">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>구분</th>
+						<td>
+							<select name="mailhfGb">
+								<option value="">[전체]</option>
+								<option value="H">헤더</option>
+								<option value="F">푸터</option>
+							</select>
+						</td>
+						<th>타이틀 명</th>
+						<td>
+							<input type="text" name="mailhfNm" class="w200"/>
+						</td>
+						<th>등록자</th>
+						<td>
+							<input type="text" name="searchTxt" class="w200"/>
+						</td>
+					</tr>
+				</table>
+				
+				<ul class="panelBar">
+					<li class="center">
+						<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();">초기화</button>
+						<button type="button" class="btn btn-info btn-lg" id="btnSearch">조회</button>
+					</li>
+				</ul>
+			</form>
+		</div>
+		<!-- 검색조건 영역 -->
+			
+		<!-- 리스트 영역 -->
+			<div class="panelStyle">
+				<!-- 버튼 배치 영역 -->
+				<ul class="panelBar">
+					<li class="left">
+						<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">선택삭제</button>	
+					</li>
+					<li class="right">
+						<button type="button" class="btn btn-info btn-lg" onclick="fnOpenMailHFPopup('N');">메일헤더푸터 등록</button>
+					</li>
+				</ul>
+				<!-- //버튼 배치 영역 -->
+				<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+			</div>
+		<!-- //리스트 영역 -->
+	
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	//헤더 푸터 구분 표시
+	let mailhfGb = { "H":"헤더", "F":"푸터" };
+
+	// specify the columns
+	let columnDefs = [
+		{
+			width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false
+		},
+		{
+		 	headerName: "구분", field: "mailhfGb", width: 100, cellClass: 'text-center',
+		 	valueFormatter: function (params) { return gagaAgGrid.lookupValue(mailhfGb, params.value); }
+		},
+		{	headerName: "타이틀", field: "mailhfNm", width: 300, cellClass: 'text-center',
+			cellRenderer: function(params) { 
+				return '<a href="javascript:void(0);">' + params.value + '</a>'; 
+			}
+		},
+		{
+			headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "등록일시", field: "regDt", width: 200, cellClass: 'text-center',
+			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		},
+		{
+			headerName: "수정자", field: "updNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "수정일시", field: "updDt", width: 200, cellClass: 'text-center', 
+			cellRenderer: function(params) { return gagaAgGrid.toDateTimeFormat(params.value); }
+		}
+	];
+
+	// Get GridOptions
+	let gridOptions = gagaAgGrid.getGridOptions(columnDefs); 
+
+	// Add on options
+	gridOptions.rowSelection = 'multiple';	//셀렉박스 다중 선택
+	
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field != 'mailhfNm')
+			return;
+		
+		fnOpenMailHFPopup('U', event.data.mailhfSq);
+	}
+	
+	// 조회버튼 - 검색
+	$('#btnSearch').on('click', function() {
+		var formId = "#searchForm";
+		gagaAgGrid.fetch($(formId).prop('action'), gridOptions, formId);
+	});
+	
+	// 선택삭제
+	$('#btnDeleteRow').on('click', function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+		
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("삭제하시겠습니까?", {
+			sureBtnText: "확인",
+			cancelBtnText: "취소",
+			sureBtnClick: function() {
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값으로 처리
+				var updatedData = [];
+				
+				$.each(removedData, function(idx, item) {
+					item.useYn = 'N';
+					updatedData.push(item);
+				});
+				
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/marketing/mailtemplate/delete', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 등록/상세 팝업
+	var fnOpenMailHFPopup = function(mode, mailhfSq) {
+		var actionUrl = '/marketing/mailtemplate/detail/form' + '?mode=' + mode;
+		if (!gagajf.isNull(mailhfSq)) actionUrl += '&mailhfSq=' + mailhfSq;
+		cfnOpenModalPopup(actionUrl, 'popupMailHF');
+	}
+	
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);		
+		gagaAgGrid.hideStatusBar('gridList');
+	});
+	
+/*]]>*/
+</script>
+
+
+</html>

+ 773 - 0
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementDetailForm.html

@@ -0,0 +1,773 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MktmailmanagementDetailForm.html
+ * @desc    : MktmailmanagementDetailForm 등록/수정 상세 팝업화면
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021. 02. 05   csh9191     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200" id="popupMktMail">
+	<div class="panelStyle" style="max-height:700px;overflow-y:scroll;">
+		<!-- 팝업창 타이틀 -->
+		<div class="panelTitle">
+			<strong th:text="${'이메일' + (mode == 'N' ? '등록' : '상세')}">이메일</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupMktMail');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- 팝업창 타이틀 -->
+		
+		<!-- 팝업창 상단부분 시작-->
+		<div class="panelContent">
+			<form id="mailManagementForm" name="mailManagementForm" action="#" th:action="@{'/marketing/mktMailManagement/save'}" th:method="post">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>메일번호</th>
+							<td>
+								<input type="text" name="mailtSq" maxlength="20" placeholder="자동생성" readonly="readonly"/>
+							</td>
+						</tr>
+						<tr>
+							<th>메일구분</th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="mailtGb" value="M" checked="checked"/>마케팅</label>
+								<label class="rdoBtn"><input type="radio" name="mailtGb" value="A"/>자동</label>
+							</td>
+						</tr>
+						<tr>
+							<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>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<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>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th>타이틀<em class="required" title="필수"></em></th>
+							<td><input type="text" name="mailtNm" maxlength="50" required="required" data-valid-name="타이틀" /></td>
+						</tr>
+						
+						<tr>
+							<th>HTML / 이미지 설정<em class="required" title="필수"></em></th>
+							<td>
+								<textarea class="textareaR4" id="mailContent" name="mailContent" data-valid-name="내용"></textarea>
+							</td>
+						</tr>
+					</tbody>
+					
+				</table>
+		<!-- 팝업창 상단부분 끝-->
+		
+		<!-- 팡업창 하단부분 시작 -->
+		
+		<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>
+				<!-- //상품 전시 설정 -->
+				<div class="inner-panelContent">
+					<div class="panelContent">
+					<ul class="panelBar">
+						<li class="left">
+							<p>최대 5개 까지 상품 전시 구분을 추가하실 수 있습니다.</p>
+							<p>상품은 구분자 당 최대 40 개 까지만 등록하실 수 있습니다.</p>
+						</li>
+						<li class="right">
+							<button type="button" class="btn btnRight btn-success btn-lg" id="btnAddGrid" onclick="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">
+							<div class="panelContent">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="10%"/>
+										<col width="90%"/>
+									</colgroup>
+									<tr>
+										<th>상품 구분 1<br>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum();">구분 삭제</button>
+										</th>
+										<td>
+											<div class="">
+												<table  class="frmStyle">
+													<tr>
+														<th class="w100">구분자 명</th>
+														<td>
+															<input type="text" name="mailtcNm"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>링크</th>
+														<td>
+															<input type="text" name="mailtcLink"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>상품 노출 기준
+															<div class="iconTooltip">
+																	<i class="fa fa-info" aria-hidden="true"></i>
+																	<span class="left aL" style="width:230px;">
+																		<em>1열 에 노출될 상품 개수를 뜻합니다.</em>
+																	</span>
+															</div>
+														</th>
+														<td>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr" value="1"/>1개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr" value="2"/>2개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr" value="3" checked/>3개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr" value="4"/>4개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr" value="5"/>5개</label>
+														</td>
+													</tr>
+												</table>
+												<ul class="panelBar">
+													<li class="left">
+														<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow('gridOptions_c1');">상품삭제</button>
+													</li>
+													<li class="right">
+														<button type="button" class="btn btn-info btn-lg" onclick="fnOpenGoodsPopup('gridOptions_c1');">상품추가</button>
+													</li>													
+												</ul>
+												<!-- Agrid -->
+												<div id="gridSectionGbList1" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+						<!-- 구분 1 -->
+						
+						<!-- 구분2 -->
+						<div class="inner-panelContent" id="btnAddGridNum2" style="display:none;">
+							<input type="hidden" name="btnAddGridNum2UseYn" value="Y">
+							<div class="panelContent">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="10%"/>
+										<col width="90%"/>
+									</colgroup>
+									<tr>
+										<th>상품 구분 2<br><br>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum2();">구분 삭제</button>
+										</th>
+										<td>
+											<div class="">
+												<table  class="frmStyle">
+													<tr>
+														<th class="w100">구분자 명</th>
+														<td>
+															<input type="text" name="mailtcNm2"/>
+														</td>
+													</tr>
+													<tr>
+														<th>링크</th>
+														<td>
+															<input type="text" name="mailtcLink2"/>
+														</td>
+													</tr>
+													<tr>
+														<th>상품 노출 기준</th>
+														<td>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr2" value="1"/>1개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr2" value="2"/>2개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr2" value="3" checked/>3개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr2" value="4"/>4개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr2" value="5"/>5개</label>
+														</td>
+													</tr>
+												</table>
+												<ul class="panelBar">
+													<li class="left">
+														<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow('gridOptions_c2');">상품삭제</button>
+													</li>
+													<li class="right">
+														<button type="button" class="btn btn-info btn-lg" onclick="fnOpenGoodsPopup('gridOptions_c2');">상품추가</button>
+													</li>													
+												</ul>
+												<!-- Agrid -->
+												<div id="gridSectionGbList2" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+						<!-- 구분2  -->
+						
+						<!-- 구분3 -->
+						<div class="inner-panelContent" id="btnAddGridNum3" style="display:none;">
+							<input type="hidden" name="btnAddGridNum3UseYn" value="Y">
+							<div class="panelContent">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="10%"/>
+										<col width="90%"/>
+									</colgroup>
+									<tr>
+										<th>상품 구분 3<br><br>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum3('gridOptions_c3');">구분 삭제</button>
+										</th>
+										<td>
+											<div class="">
+												<table  class="frmStyle">
+													<tr>
+														<th class="w100">구분자 명</th>
+														<td>
+															<input type="text" name="mailtcNm3"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>링크</th>
+														<td>
+															<input type="text" name="mailtcLink3"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>상품 노출 기준</th>
+														<td>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr3" value="1"/>1개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr3" value="2"/>2개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr3" value="3" checked/>3개</label>						
+															<label class="rdoBtn"><input type="radio" name="goodsCpr3" value="4"/>4개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr3" value="5"/>5개</label>
+														</td>
+													</tr>
+												</table>
+												<ul class="panelBar">
+													<li class="left">
+														<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow('gridOptions_c3');">상품삭제</button>
+													</li>
+													<li class="right">
+														<button type="button" class="btn btn-info btn-lg" onclick="fnOpenGoodsPopup('gridOptions_c3');">상품추가</button>
+													</li>													
+												</ul>
+												<!-- Agrid -->
+												<div id="gridSectionGbList3" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+						<!-- 구분3 -->
+						
+						<!-- 구분4 -->
+						<div class="inner-panelContent" id="btnAddGridNum4" style="display:none;">
+							<input type="hidden" name="btnAddGridNum4UseYn" value="Y">
+							<div class="panelContent">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="10%"/>
+										<col width="90%"/>
+									</colgroup>
+									<tr>
+										<th>상품 구분 4<br><br>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum4('gridOptions_c4');">구분 삭제</button>
+										</th>
+										<td>
+											<div class="">
+												<table  class="frmStyle">
+													<tr>
+														<th class="w100">번호</th>
+														<td>
+															<input type="text" name="mailtcNm4"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>링크</th>
+														<td>
+															<input type="text" name="mailtcLink4"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>상품 노출 기준</th>
+														<td>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr4" value="1"/>1개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr4" value="2"/>2개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr4" value="3" checked/>3개</label>						
+															<label class="rdoBtn"><input type="radio" name="goodsCpr4" value="4"/>4개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr4" value="5"/>5개</label>
+														</td>
+													</tr>
+												</table>
+												<ul class="panelBar">
+													<li class="left">
+														<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow('gridOptions_c4');">상품삭제</button>
+													</li>
+													<li class="right">
+														<button type="button" class="btn btn-info btn-lg" onclick="fnOpenGoodsPopup('gridOptions_c4');">상품추가</button>
+													</li>													
+												</ul>
+												<!-- Agrid -->
+												<div id="gridSectionGbList4" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+						<!-- 구분4 -->
+						
+						<!-- 구분5 -->
+						<div class="inner-panelContent" id="btnAddGridNum5" style="display:none;">
+							<input type="hidden" name="btnAddGridNum5UseYn" value="Y">
+							<div class="panelContent">
+								<table class="frmStyle">
+									<colgroup>
+										<col width="10%"/>
+										<col width="90%"/>
+									</colgroup>
+									<tr>
+										<th>상품 구분 5<br><br>
+											<button type="button" class="btn btn-danger btn-lg" id="" onclick="btnDeleteGridNum5('gridOptions_c5');">구분 삭제</button>
+										</th>
+										<td>
+											<div class="">
+												<table  class="frmStyle">
+													<tr>
+														<th class="w100">구분자 명</th>
+														<td>
+															<input type="text" name="mailtcNm5"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>링크</th>
+														<td>
+															<input type="text" name="mailtcLink5"/>								
+														</td>
+													</tr>
+													<tr>
+														<th>상품 노출 기준</th>
+														<td>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr5" value="1"/>1개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr5" value="2"/>2개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr5" value="3" checked/>3개</label>						
+															<label class="rdoBtn"><input type="radio" name="goodsCpr5" value="4"/>4개</label>
+															<label class="rdoBtn"><input type="radio" name="goodsCpr5" value="5"/>5개</label>
+														</td>
+													</tr>
+												</table>
+												<ul class="panelBar">
+													<li class="left">
+														<button type="button" class="btn btn-danger btn-lg" onclick="fnGoodsDeleteRow('gridOptions_c5');">상품삭제</button>
+													</li>
+													<li class="right">
+														<button type="button" class="btn btn-info btn-lg" onclick="fnOpenGoodsPopup('gridOptions_c5');">상품추가</button>
+													</li>													
+												</ul>
+												<!-- Agrid -->
+												<div id="gridSectionGbList5" style="width:100%; height:200px;" class="ag-theme-balham"></div>
+											</div>
+										</td>
+									</tr>
+								</table>
+							</div>
+						</div>
+						<!-- 구분5 -->
+					
+						
+					</div> <!-- panelContent -->
+				</div> <!-- end of inner-panelContent -->
+			</div>
+			<!-- 팡업창 하단부분 끝 -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar">
+			<li class="left"  th:if="${mode  == 'N' }">
+				<button type="button" class="btn btn-danger btn-lg" id="btndeleteMktmail">삭제</button>
+			</li>
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" id="btnSaveMktMail">저장</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
+				</form>
+		</div>
+	</div>//
+</div>
+
+<script type="text/javascript" src="/ux/plugins/summernote/summernote.js?v=2020102902"></script>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.summernote.js?v=20201030"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+		let AddgridRow;		
+		let mode = [[${mode}]]; 
+		let mktmailInfo = [[${mktmailInfo}]];
+		
+		//팝업창 삭제버튼
+		$('#btndeleteMktmail').on('click', function() {
+			mcxDialog.confirm("등록하신 내용을 삭제하시겠습니까?<br>삭제한 내용은 복원하실 수 없습니다.", {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					uifnPopupClose('popupMktMail');
+				}
+			});
+		});
+		
+		//상품 전시 그리드 그리기
+		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: "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);
+		var gridOptions_c2 = gagaAgGrid.getGridOptions(columnDefs);
+		var gridOptions_c3 = gagaAgGrid.getGridOptions(columnDefs);
+		var gridOptions_c4 = gagaAgGrid.getGridOptions(columnDefs);
+		var gridOptions_c5 = gagaAgGrid.getGridOptions(columnDefs);
+		
+		// 표시순번 수정가능
+		gridOptions_c1.defaultColDef.editable = true;
+		gridOptions_c2.defaultColDef.editable = true;
+		gridOptions_c3.defaultColDef.editable = true;
+		gridOptions_c4.defaultColDef.editable = true;
+		gridOptions_c5.defaultColDef.editable = true;
+		gridOptions_c1.suppressRowClickSelection = true;
+		gridOptions_c2.suppressRowClickSelection = true;
+		gridOptions_c3.suppressRowClickSelection = true;
+		gridOptions_c4.suppressRowClickSelection = true;
+		gridOptions_c5.suppressRowClickSelection = true;
+		
+		///저장
+		$('#btnSaveMktMail').on('click', function() {
+		
+			//타이틀 길이 제한 2자 이상 50자미만
+			var check = $('#mailManagementForm input[name=mailtNm]').val();
+
+			if(check.length < 2){
+				mcxDialog.alert('타이틀은 2자 이상 50자 미만으로 입력하세요.');
+				return false;
+			}
+			
+			let arrayData = gagaAgGrid.getAllRowData(gridOptions_c1)
+			let arrayData2 = gagaAgGrid.getAllRowData(gridOptions_c2)
+			let arrayData3 = gagaAgGrid.getAllRowData(gridOptions_c3)
+			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();
+			
+			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(!gagajf.validation('#mailManagementForm'))
+				return false;
+			
+			if(gagajf.isNull($('#mailContent').val())){
+				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;
+				}
+			}
+						
+			mcxDialog.confirm("내용을 등록 하시겠습니까?", {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					
+					let data = {
+					};
+					
+					data.mktmailManagementTc = mailTc;
+					data.mktmailManagementTc2 = mailTc2;
+					data.mktmailManagementTc3 = mailTc3;
+					data.mktmailManagementTc4 = mailTc4;
+					data.mktmailManagementTc5 = mailTc5;
+					
+					data.mktmailManagementGoods = arrayData;
+					data.mktmailManagementGoods2 = arrayData2;
+					data.mktmailManagementGoods3 = arrayData3;
+					data.mktmailManagementGoods4 = arrayData4;
+					data.mktmailManagementGoods5 = arrayData5;
+					
+					data.mktHeader = $('#mailManagementForm select[name=mailHsq]').val();
+					data.mktFooter = $('#mailManagementForm select[name=mailFsq]').val();
+					data.mailtNm = $('#mailManagementForm input[name=mailtNm]').val();
+					data.mailtGb = $('#mailManagementForm input:radio[name=mailtGb]:checked').val();
+					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');
+					});
+				
+				}
+			});
+		
+		});
+		
+		// 상품 구분 추가 버튼 추가 버튼 표시는 1~5까지 순서대로 표시
+		$('#btnAddGrid').on('click', function(){
+			if($('#btnAddGridNum').css('display') == 'none'){
+				$('#btnAddGridNum').show();
+			}else if($('#btnAddGridNum2').css('display') == 'none' && $('#btnAddGridNum').css('display') != 'none'){
+				$('#btnAddGridNum2').show();
+			}else if($('#btnAddGridNum3').css('display') == 'none' && $('#btnAddGridNum2').css('display') != 'none'){
+				$('#btnAddGridNum3').show();
+			}else if($('#btnAddGridNum4').css('display') == 'none' && $('#btnAddGridNum3').css('display') != 'none'){
+				$('#btnAddGridNum4').show();
+			}else if($('#btnAddGridNum5').css('display') == 'none' && $('#btnAddGridNum4').css('display') != 'none'){
+				$('#btnAddGridNum5').show();
+			}else if($('#btnAddGridNum5').css('display') != 'none'){
+				mcxDialog.alertC("구분자는 최대 5개까지 등록가능합니다.", {
+					sureBtnText: "확인"
+				});
+				return false;
+			}
+		});
+		
+		// 버튼별 상품추가 팝업
+		var fnOpenGoodsPopup = function(param) {
+			switch (param){
+			case 'gridOptions_c1': 
+				AddgridRow = gridOptions_c1;
+				break;
+			case 'gridOptions_c2' : 
+				AddgridRow = gridOptions_c2;
+				break;
+			case 'gridOptions_c3' : 
+				AddgridRow = gridOptions_c3;
+				break;
+			case 'gridOptions_c4' : 
+				AddgridRow = gridOptions_c4;
+				break;
+			case 'gridOptions_c5' : 
+				AddgridRow = gridOptions_c5;
+				break;
+			}
+			
+			cfnOpenGoodsPopup('fnFetchGoods');
+		}
+
+		// 상품추가
+		var fnFetchGoods = function(goodsData) {
+			
+			if (goodsData.length < 1) return;
+			
+			// 기존상품
+			var oldGoodsSetList = gagaAgGrid.getAllRowData(AddgridRow);
+			var index = oldGoodsSetList.length+1;
+			
+			var arrGoodsCd = [];
+			$.each(goodsData, function(idx, item) {
+				arrGoodsCd.push(item.goodsCd);
+			})
+			
+			var isExist = false;
+			var jsonData = JSON.stringify(arrGoodsCd);
+			gagajf.ajaxJsonSubmit('/marketing/mktMailManagement/goods/info', jsonData, function(result) {
+				$.each(result, function(idx, item) {
+					isExist = false;
+					AddgridRow.api.forEachNode(function(rowNode, index) {
+						//중복상품 여부 확인
+						if (item.goodsCd == rowNode.data.goodsCd){
+							isExist = true;
+						}
+					});
+					
+					//상품 추가 갯수 제한
+					if(goodsData.length > 40){
+						mcxDialog.alert('상품은 최대 40개까지 추가 가능합니다.');
+						return false;
+					}
+					
+					if(!isExist){
+						var data = {
+							   goodsCd : item.goodsCd
+						   ,  brandEnm : item.brandEnm
+						   ,   goodNms : item.goodsNm
+						   ,      cdNm : item.goodsStat
+						   , listPrice : item.listPrice
+						   , currPrice : item.currPrice
+						   ,   dispOrd : index
+	
+						};
+						//그리드 마지막에 추가해야함
+						AddgridRow.api.updateRowData({add: [data], addIndex: idx});
+						AddgridRow.api.refreshCells();
+						index++;
+					}
+				});
+			});
+		}
+	
+		// 상품 삭제
+		var fnGoodsDeleteRow = function(param) {
+			switch (param){
+			case 'gridOptions_c1': 
+				AddgridRow = gridOptions_c1;
+				break;
+			case 'gridOptions_c2' : 
+				AddgridRow = gridOptions_c2;
+				break;
+			case 'gridOptions_c3' : 
+				AddgridRow = gridOptions_c3;
+				break;
+			case 'gridOptions_c4' : 
+				AddgridRow = gridOptions_c4;
+				break;
+			case 'gridOptions_c5' : 
+				AddgridRow = gridOptions_c5;
+				break;
+			}
+			
+			var selectedData = gagaAgGrid.selectedRowData(AddgridRow);
+		
+			if (selectedData.length == 0) {
+				mcxDialog.alert('선택된 행이 없습니다.');
+				return false;
+			}		
+			//화면에서 삭제
+			gagaAgGrid.removeRowData(AddgridRow, false);
+		}
+		
+		
+		// 상품 구분 삭제 버튼  삭제는 해당 하는 폼이 삭제
+		function btnDeleteGridNum(param){
+			if($('#btnAddGridNum').css('display') !='none'){
+				$('#btnAddGridNum').hide();
+				$('#btnAddGridNum')[0].reset();
+			}
+		}		
+		function btnDeleteGridNum2(param){
+			if($('#btnAddGridNum2').css('display') !='none'){
+				$('#btnAddGridNum2').hide();
+				$('#searchForm2')[0].reset();
+			}			
+		}			
+		function btnDeleteGridNum3(param){
+			if ($('#btnAddGridNum3').css('display') !='none'){
+				$('#btnAddGridNum3').hide();
+				$('#searchForm3')[0].reset();
+			}			
+		}		
+		function btnDeleteGridNum4(param){
+			if ($('#btnAddGridNum4').css('display') !='none'){
+				$('#btnAddGridNum4').hide();
+				$('#searchForm3')[0].reset();
+			}			
+		}
+		function btnDeleteGridNum5(param){
+			if ($('#btnAddGridNum5').css('display') !='none'){
+				$('#btnAddGridNum5').hide();
+				$('#searchForm5')[0].reset();
+			}
+		} 
+
+	$(document).ready(function() {
+		
+		if (mode == 'U') {
+			
+			$('#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);
+			}
+		}
+		
+		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();
+		gagaSn.createSummernote(snOptions, '#mailContent');
+
+	});
+/*]]>*/
+</script>
+
+</html>

+ 190 - 0
src/main/webapp/WEB-INF/views/marketing/MktmailmanagementForm.html

@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MktmailmanagementForm.html
+ * @desc    : MKT 메일관리
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.05   csh9191     최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<!-- 메인타이틀 영역 -->
+		<div class="main-title"></div>
+		<!-- //메인타이틀 영역 -->
+		
+		<!-- 메뉴 설명 -->
+		<div class="infoBox menu-desc"></div>
+
+		<form id="searchForm" name="searchForm" action="#" th:action="@{'/marketing/mktmailManagement/list'}"  onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<!-- 검색조건 영역 -->
+			<div class="panelStyle" >
+				<!-- //TITLE -->
+				<div class="panelContent">
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width: 7%;"/>
+							<col/>
+						</colgroup>
+						<tr>
+							<th>기간<em class="required" title="필수"></em></th>
+							<td id="sellTerms"></td>
+						</tr>
+
+						<tr>
+							<th>조회</th>
+							<td>
+								<label class="rdoBtn"><input type="radio" name="searchGb" value="mailtSq"checked/>메일번호</label>
+								<label class="rdoBtn"><input type="radio" name="searchGb" value="mailtNm"/>타이틀</label>
+								<input type="text" class="w900" name="searchTxt" id="searchTxt"/>
+							</td>
+						</tr>
+					</table>
+					<ul class="panelBar">
+						<li class="center">
+							<button type="button" class="btn btn-gray btn-lg" onclick="$('#searchForm')[0].reset();" >초기화</button>
+							<button type="button" class="btn btn-info btn-lg" id="btnSearch" >조회</button>
+						</li>
+					</ul>
+				</div>
+			</div>
+			<!-- 검색조건 영역 -->
+
+			<!-- 리스트 영역 -->
+			<div class="panelStyle">
+				<!-- 버튼 배치 영역 -->
+				<ul class="panelBar">
+					<li class="left">
+						<button type="button" class="btn btn-danger btn-lg" id="btnDeleteRow">선택삭제</button>	
+					</li>
+					<li class="right">
+						<button type="button" class="btn btn-info btn-lg" onclick="fnOpenMailHFPopup('N');">메일템플릿 등록</button>
+				</ul>
+				<!-- //버튼 배치 영역 -->
+				<div id="gridList" style="width: 100%; height: 570px" class="ag-theme-balham"></div>
+			</div>
+		<!-- //리스트 영역 -->
+		</form>
+	</div>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	
+	//메일구분
+	let mailtGb = {"M" :"마케팅메일", "A":"자동메일"};
+	
+	var columnDefs = [];
+	columnDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "메일번호", field: "mailtSq", width: 100, cellClass: 'text-center'},
+		{headerName: "메일구분", field: "mailtGb", width: 200, cellClass: 'text-center',
+		 	valueFormatter: function (params) { return gagaAgGrid.lookupValue(mailtGb, params.value); }},
+		{	headerName: "타이틀", field: "mailtNm", width: 350, cellClass: 'text-center',
+			cellRenderer: function(params) 
+			{ 
+				return '<a href="javascript:void(0);">' + params.value + '</a>'; 
+			}
+		},
+		{	//미리보기 
+			headerName: "미리보기", width: 150, cellClass: 'text-center'
+		},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "등록일시", field: "regDt", width: 200, cellClass: 'text-center',
+			cellRenderer: function(params) 
+			{ 
+				return gagaAgGrid.toDateTimeFormat(params.value); 
+			}
+		},
+		{
+			headerName: "수정자", field: "updNm", width: 150, cellClass: 'text-center'},
+		{
+			headerName: "수정일시", field: "updDt", width: 200, cellClass: 'text-center', 
+			cellRenderer: function(params) 
+			{ 
+				return gagaAgGrid.toDateTimeFormat(params.value); 
+			}
+		}
+	];
+	
+	// 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);
+	}
+	
+	// grid row Delete
+	$('#btnDeleteRow').on('click', function() {
+		var removedData = gagaAgGrid.removeRowData(gridOptions);
+		
+		if (removedData.length == 0) {
+			mcxDialog.alert('선택된 행이 없습니다.');
+			return;
+		}
+		
+		mcxDialog.confirm("삭제하시겠습니까?", {
+			sureBtnText: "확인",
+			cancelBtnText: "취소",
+			sureBtnClick: function() {
+				// delete 대신 update 처리해야 하므로 다음과 같이 useYn 값으로 처리
+				var updatedData = [];
+				
+				$.each(removedData, function(idx, item) {
+					item.useYn = 'N';
+					updatedData.push(item);
+				});
+				
+				
+				var jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/marketing/mktmailManagement/delete', jsonData, function() {
+					$('#btnSearch').trigger('click');
+				});
+			}
+		});
+	});
+	
+	// 조회버튼 - 검색
+	$('#btnSearch').on('click', function() {
+		var formId = "#searchForm";
+		gagaAgGrid.fetch($(formId).prop('action'), gridOptions, formId);
+	});
+	
+	
+	// 등록/상세 팝업
+	var fnOpenMailHFPopup = function(mode, mailtSq) {
+		var actionUrl = '/marketing/mktmailmanagement/detail/form' + '?mode=' + mode;
+		if (!gagajf.isNull(mailtSq)) actionUrl += '&mailtSq=' + mailtSq;
+		cfnOpenModalPopup(actionUrl, 'popupMktMail');
+	}
+	
+	$(document).ready(function() {
+	
+		cfnCreateCalendar('#sellTerms', 'mktmailStdt', 'mktmailEddt', true);
+	
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridList', gridOptions);
+		gagaAgGrid.hideStatusBar('gridList');
+	
+	});
+
+/*]]>*/
+
+</script>
+</html>