Kaynağa Gözat

Merge branch 'develop' into bin2107

bin2107 5 yıl önce
ebeveyn
işleme
058d007eb0

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

@@ -227,6 +227,6 @@ public interface TsaCustomerDao {
 
 	void createException();
 
-
+	void updateCutomerEncodeData(Customer customer);
 
 }

+ 59 - 0
src/main/java/com/style24/admin/biz/dao/TsaPollDao.java

@@ -0,0 +1,59 @@
+package com.style24.admin.biz.dao;
+
+import java.util.Collection;
+
+import org.springframework.stereotype.Repository;
+
+import com.style24.core.support.annotation.ShopDs;
+import com.style24.persistence.domain.Poll;
+
+/**
+ * poll Dao
+ *
+ * @author sowon
+ * @since 2021. 2. 19
+ */
+
+@ShopDs
+@Repository
+public interface TsaPollDao {
+	
+	/**
+	 * POLL 저장
+	 *
+	 * @param poll 정보
+	 * @author sowon
+	 * @since 2021. 02. 19
+	 */
+	void savePoll(Poll poll);
+	
+	/**
+	 * POLL 문항 삭제
+	 *
+	 * @param pollSq
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	void deletePollQuestion(Poll poll);
+	
+	/**
+	 * POLL 문항 등록
+	 *
+	 * @param Poll 문항 정보
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	void createPollQuestion(Poll poll);
+
+	/**
+	 * POLL 목록
+	 *
+	 * @param Poll
+	 * @return Poll목록
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	Collection<Poll> getPollList(Poll poll);
+
+
+}

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

@@ -248,5 +248,14 @@ public interface TsaRendererDao {
 	 * @since  2021-01-14
 	 */
 	Collection<CommonCode> getSelfBrandList();
+	
+	/**
+	 * poll 질문유형 조회
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	Collection<CommonCode> getPollQtypeList();
 
 }

+ 5 - 4
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -92,18 +92,19 @@ public class TsaCustomerService {
 		customer.setRegNo(userNo);
 		customer.setUpdNo(userNo);
 		customer.encryptData();  // 암호화 처리
-		// 고객 이력 생성
+		// 1.고객 이력 생성
 		coreCustomerService.createCustomerHistory(customer);
 
-		// 마케팅수신동의 이력 화면단에서 수신 변경이 없으면 ''처리
+		// 2.마케팅수신동의 이력 화면단에서 수신 변경이 없으면 ''처리
 		if (StringUtils.isNotBlank(customer.getSmsAgreeYn())
 				|| StringUtils.isNotBlank(customer.getEmailAgreeYn())
 				|| StringUtils.isNotBlank(customer.getAppAgreeYn())) {
 			coreCustomerService.createCustomerMarketHst(customer);
 		}
-
-		// 정보 수정
+		// 3.고객정보 수정
 		customerDao.updateCustomerInfo(customer);
+		// 임시 암호화
+		//customerDao.updateCutomerEncodeData(customer);
 	}
 
 	/**

+ 0 - 3
src/main/java/com/style24/admin/biz/service/TsaPlanService.java

@@ -16,9 +16,6 @@ import com.gagaframework.web.util.GagaFileUtil;
 import com.gagaframework.web.util.GagaStringUtil;
 import com.style24.admin.biz.dao.TsaPlanDao;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.support.session.TscSession;
-import com.style24.persistence.domain.Coupon;
-import com.style24.persistence.domain.MoreBetterGoods;
 import com.style24.persistence.domain.Plan;
 
 import lombok.extern.slf4j.Slf4j;

+ 86 - 0
src/main/java/com/style24/admin/biz/service/TsaPollService.java

@@ -0,0 +1,86 @@
+package com.style24.admin.biz.service;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.style24.admin.biz.dao.TsaPollDao;
+import com.style24.admin.support.security.session.TsaSession;
+import com.style24.persistence.domain.Poll;
+
+import lombok.extern.slf4j.Slf4j;
+
+/*
+* poll Service
+* 
+* @author sowon
+* @since 2021. 02. 19
+*/
+
+@Service
+@Slf4j
+public class TsaPollService {
+	
+	@Autowired
+	private TsaPollDao pollDao;
+	
+	/**
+	 * POLL 등록
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	@Transactional("shopTxnManager")
+	public void createPoll(Collection<Poll> params) {
+		int userNo = TsaSession.getInfo().getUserNo();
+
+		// POLL 마스터
+		Poll pollInfo = new Poll();
+		pollInfo.setPollSq(params.iterator().next().getPollSq());
+		pollInfo.setPollTitle(params.iterator().next().getPollTitle());
+		pollInfo.setSiteCd(params.iterator().next().getSiteCd());
+		pollInfo.setDupPartiYn(params.iterator().next().getDupPartiYn());
+		pollInfo.setFstComYn(params.iterator().next().getFstComYn());
+		pollInfo.setPartiCnt(params.iterator().next().getPartiCnt());
+		pollInfo.setPollStdt(params.iterator().next().getPollStdt());
+		pollInfo.setPollEddt(params.iterator().next().getPollEddt());
+		pollInfo.setRegNo(userNo);
+		pollInfo.setUpdNo(userNo);
+		pollDao.savePoll(pollInfo);
+
+		int pollSq = params.iterator().next().getPollSq() == null ? pollInfo.getPollSqTemp() : params.iterator().next().getPollSq();
+
+		// POLL 문항
+		Poll deletePollQuestion = new Poll();
+		deletePollQuestion.setPollSq(pollSq);
+		pollDao.deletePollQuestion(deletePollQuestion);
+
+		int dispOrd = 1;
+		
+		for (Poll pollQuestion : params) {
+			pollQuestion.setPollSq(pollSq);
+			pollQuestion.setRegNo(userNo);
+			pollQuestion.setUpdNo(userNo);
+			pollQuestion.setDispOrd(dispOrd);
+			pollDao.createPollQuestion(pollQuestion);
+			dispOrd++;
+		}
+	}
+	
+
+	/**
+	 * POLL 목록
+	 *
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	public Collection<Poll> getPollList(Poll poll) {
+		return pollDao.getPollList(poll);
+	}
+
+
+}

+ 11 - 0
src/main/java/com/style24/admin/biz/service/TsaRendererService.java

@@ -565,4 +565,15 @@ public class TsaRendererService {
 	public Collection<CommonCode> getSelfBrandList() {
 		return rendererDao.getSelfBrandList();
 	}
+	
+	/**
+	 * poll 질문유형 조회
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	public Collection<CommonCode> getPollQtypeList() {
+		return rendererDao.getPollQtypeList();
+	}
 }

+ 35 - 38
src/main/java/com/style24/admin/biz/web/TsaCommonController.java

@@ -1,6 +1,5 @@
 package com.style24.admin.biz.web;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
@@ -31,13 +30,12 @@ import lombok.extern.slf4j.Slf4j;
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaFileUploadUtil;
 import com.gagaframework.web.util.GagaFileUtil;
-import com.gagaframework.web.util.GagaFtpUtil;
 import com.gagaframework.web.util.GagaUploadedFileInfo;
 
 /**
  * 공통 Controller
  *
- * @author renderer
+ * @author gagamel
  * @since 2020. 10. 22
  */
 @Controller
@@ -45,14 +43,12 @@ import com.gagaframework.web.util.GagaUploadedFileInfo;
 @Slf4j
 public class TsaCommonController extends TsaBaseController {
 
-
 	@Autowired
 	private Environment env;
 
 	@Autowired
 	private TsaCommonService commonService;
 
-
 	@Value("${upload.default.target.path}")
 	private String uploadTargetPath;
 
@@ -104,17 +100,17 @@ public class TsaCommonController extends TsaBaseController {
 		GagaFileUploadUtil fuUtil = new GagaFileUploadUtil(targetPath, Long.parseLong(env.getProperty("upload." + policy + ".max.size")), env.getProperty("upload." + policy + ".allow.extension"), env.getProperty("upload." + policy + ".view"));
 
 		GagaUploadedFileInfo ufInfo = fuUtil.uploadFile(file);
-		if (!"excel".equals(policy)) {
-			// 운영서버에서만 FTP로 파일 업로드
-			String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-			if ("run".equals(profiles) || "locp".equals(profiles)) {
-				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
-
-				File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
-				ftpUtil.upload(srcFile, "/" + subDir);
-				ftpUtil.close();
-			}
-		}
+//		if (!"excel".equals(policy)) {
+//			// 운영서버에서만 FTP로 파일 업로드
+//			String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+//			if ("run".equals(profiles) || "locp".equals(profiles)) {
+//				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
+//
+//				File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
+//				ftpUtil.upload(srcFile, "/" + subDir);
+//				ftpUtil.close();
+//			}
+//		}
 		return ufInfo;
 	}
 
@@ -135,14 +131,14 @@ public class TsaCommonController extends TsaBaseController {
 
 		GagaFileUtil.deleteFile(GagaFileUtil.getConcatenationPath(targetPath, fileNm));
 
-		// 운영서버이면 FTP 파일 삭제
-		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-		if ("run".equals(profiles) || "locp".equals(profiles)) {
-			GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
-			log.debug("targetPath : " + targetPath);
-			ftpUtil.delete("/" + subDir, fileNm);
-			ftpUtil.close();
-		}
+//		// 운영서버이면 FTP 파일 삭제
+//		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+//		if ("run".equals(profiles) || "locp".equals(profiles)) {
+//			GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
+//			log.debug("targetPath : " + targetPath);
+//			ftpUtil.delete("/" + subDir, fileNm);
+//			ftpUtil.close();
+//		}
 	}
 
 	/**
@@ -164,20 +160,20 @@ public class TsaCommonController extends TsaBaseController {
 		Collection<GagaUploadedFileInfo> ufList = fuUtil.uploadFiles(files);
 		log.debug("ufList: {}", ufList);
 
-		// 운영서버에서만 FTP로 파일 업로드
-		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
-		if ("run".equals(profiles) || "locp".equals(profiles)) {
-			if (ufList != null && !ufList.isEmpty()) {
-				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
-
-				for (GagaUploadedFileInfo ufInfo : ufList) {
-					File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
-					ftpUtil.upload(srcFile, "/" + subDir);
-				}
-
-				ftpUtil.close();
-			}
-		}
+//		// 운영서버에서만 FTP로 파일 업로드
+//		String profiles = env.getProperty("spring.profiles.active").toLowerCase();
+//		if ("run".equals(profiles) || "locp".equals(profiles)) {
+//			if (ufList != null && !ufList.isEmpty()) {
+//				GagaFtpUtil ftpUtil = new GagaFtpUtil(env.getProperty("speedy.ftp.host"), env.getProperty("speedy.ftp.port"), env.getProperty("speedy.ftp.username"), env.getProperty("speedy.ftp.pwd"));
+//
+//				for (GagaUploadedFileInfo ufInfo : ufList) {
+//					File srcFile = new File(GagaFileUtil.getConcatenationPath(targetPath, ufInfo.getNewFileName()));
+//					ftpUtil.upload(srcFile, "/" + subDir);
+//				}
+//
+//				ftpUtil.close();
+//			}
+//		}
 
 		return ufList;
 	}
@@ -218,4 +214,5 @@ public class TsaCommonController extends TsaBaseController {
 	public String getSampleFileSystemFilename(@PathVariable("sampleFileId") String sampleFileId) {
 		return commonService.getSampleFileSystemFilename(sampleFileId);
 	}
+
 }

+ 64 - 2
src/main/java/com/style24/admin/biz/web/TsaMarketingController.java

@@ -27,6 +27,7 @@ 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.TsaPollService;
 import com.style24.admin.biz.service.TsaRendererService;
 import com.style24.admin.biz.service.TsaReviewService;
 import com.style24.admin.biz.service.TsaSystemService;
@@ -35,7 +36,6 @@ import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.biz.service.TscPointService;
 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;
@@ -108,7 +108,8 @@ public class TsaMarketingController extends TsaBaseController {
 	@Autowired
 	private TsaMailTemplateService mailTemplateService;
 	
-
+	@Autowired
+	private TsaPollService pollService;
 
 	@Autowired
 	private TsaCardPromotionService cardPromotionService;
@@ -1535,6 +1536,7 @@ public class TsaMarketingController extends TsaBaseController {
 	 *   카드관련 작업 종료 - eskim
 	 */
 
+	
 	/**
 	 *   기획전 작업 시작 - sowon
 	 */
@@ -2012,6 +2014,66 @@ public class TsaMarketingController extends TsaBaseController {
 		return mav;
 	}
 
+	/**
+	 *   기획전 작업 종료 - sowon
+	 */
+	
+	/**
+	 *   poll 작업 시작 - sowon
+	 */
+	
+	/**
+	 * poll 관리
+	 * @param
+	 * @return
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	@GetMapping("/poll/list/Form")
+	public ModelAndView pollListForm() {
+		ModelAndView mav = new ModelAndView();		
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getCommonCodeList("G000"));
+		
+		// 사용여부
+		mav.addObject("useYnList", rendererService.getAvailCommonCodeList("G002"));
+		
+		// 문제유형
+		mav.addObject("pollQtype", rendererService.getPollQtypeList());
+		
+		mav.setViewName("marketing/PollListForm");
+		return mav;
+	}
+	
+	/**
+	 * POLL 저장
+	 *
+	 * @param POLL 목록
+	 * @return
+	 * @author sowon
+	 * @since 2021. 02. 19
+	 */
+	@PostMapping("/poll/create")
+	@ResponseBody
+	public GagaResponse createPoll(@RequestBody Collection<Poll> params) {
+		pollService.createPoll(params);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+	
+	/**
+	 * POLL 목록
+	 *
+	 * @param POLL 조회 정보
+	 * @return POLL 목록
+	 * @author sowon
+	 * @since 2021. 2. 19
+	 */
+	@PostMapping("/poll/list")
+	@ResponseBody
+	public Collection<Poll> getPollList(@RequestBody Poll poll) {
+		Collection<Poll> pollList = pollService.getPollList(poll);
+		return pollList;
+	}
 	
 	
 

+ 68 - 0
src/main/java/com/style24/persistence/domain/Poll.java

@@ -0,0 +1,68 @@
+package com.style24.persistence.domain;
+
+
+import com.style24.persistence.TscBaseDomain;
+
+import lombok.Data;
+
+/**
+ * poll관리 Domain
+ *
+ * @author sowon
+ * @since 2021. 02. 19
+ */
+
+@SuppressWarnings("serial")
+@Data
+public class Poll extends TscBaseDomain{
+	
+	// poll
+	private Integer pollSq;			// 투표일련번호
+	private Integer pollSqTemp;		// 신규투표일련번호
+	private String siteCd;			// 사이트 코드
+	private String pollTitle;		// 투표제목
+	private String pollContent;		// 투표내용
+	private String pollStdt;		// 투표시작일시
+	private String pollEddt;		// 투표종료일시
+	private String delYn;			// 삭제여부
+	private String dupPartiYn;		// 중복참여 여부
+	private String fstComYn;		// 선착순 여부
+    private int partiCnt;			// 선착순참여 여부
+	
+	// poll_question
+	private Integer pollQsq;		// 투표문항일련번호
+	private String pollQtitle;		// 투표문항제목
+	private String pollQtype;		// 문제유형 구분
+	private String pollQval1;		// 투표문항참고값1
+	private String pollQval2;		// 투표문항참고값2
+	private String pollQval3;		// 투표문항참고값3
+	private String pollQval4;		// 투표문항참고값4
+	private String pollQval5;		// 투표문항참고값5
+	private String pollQval6;		// 투표문항참고값6
+	private String pollQval7;		// 투표문항참고값7
+	private String pollQval8;		// 투표문항참고값8
+	private String pollQval9;		// 투표문항참고값9
+	private String pollQval10;		// 투표문항참고값10
+	private Integer dispOrd;		// 표시 순서
+	
+	//poll_answer
+	private String ansCustNo;		// 투표회원번호
+	private String dummy;			// 임시 (고객 답변)
+
+	// 검색
+	private String stDate;			// 시작일시
+	private String edDate;			// 종료일시
+
+	
+	private Integer voteCnt;		// 투표수
+	private Integer voteRate;		// 투표율
+	
+	
+	
+	
+	
+	
+	private String voterNm;			// 투표자명
+	private String voteDt;			// 투표일시
+
+}

+ 17 - 5
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -463,7 +463,7 @@
 		               FROM   TB_CUST_POINT
 		               WHERE  CUST_NO = C.CUST_NO
 		               AND    EXP_CMP_DT IS NULL
-		               AND    EXP_BE_DT > NOW()
+		               /*AND    EXP_BE_DT > NOW()*/
 		               ), 0)                           AS RM_PNT_AMT -- 가용포인트
 		     , IFNULL((
 		               SELECT SUM(GV_PNT_AMT)
@@ -479,7 +479,7 @@
 		               SELECT SUM(RM_PNT_AMT)
 		               FROM   TB_CUST_POINT
 		               WHERE  CUST_NO = C.CUST_NO
-		               AND    (EXP_CMP_DT IS NOT NULL OR EXP_BE_DT <![CDATA[<]]> NOW())
+		               AND    EXP_CMP_DT IS NOT NULL
 		               ), 0)                           AS EXPIRE_PNT_AMT -- 소멸포인트
 		     , IFNULL((
 		               SELECT SUM(A.PNT_AMT + B.PNT_AMT) AS PNT_AMT
@@ -494,9 +494,9 @@
 		                 , (
 		                    SELECT SUM(PNT_AMT) AS PNT_AMT
 		                         , ORD_NO
-		                    FROM TB_CUST_POINT_HST
-		                    WHERE OCCUR_GB = 'G069_13' -- 적립예정취소
-		                    AND   CUST_NO = #{custNo}
+		                    FROM   TB_CUST_POINT_HST
+		                    WHERE  OCCUR_GB = 'G069_13' -- 적립예정취소
+		                    AND    CUST_NO = #{custNo}
 		                    GROUP BY ORD_NO
 		                    ) B
 		               WHERE A.ORD_NO = B.ORD_NO
@@ -987,4 +987,16 @@
 		VALUES (NULL)
 	</insert>
 
+	<update id="updateCutomerEncodeData" parameterType="Customer">
+		UPDATE TB_CUSTOMER
+		SET    CUST_NM = #{encodedCustNm}
+		     , SEX_GB = #{encodedSexGb}
+		     , EMAIL = #{encodedEmail}
+		     , CELL_PHNNO = #{encodedCellPhnno}
+		     , BIRTH_YMD = #{encodedBirthYmd}
+		     , HOME_BASE_ADDR = #{encodedHomeBaseAddr}
+		     , HOME_DTL_ADDR = #{encodedHomeDtlAddr}
+		WHERE  CUST_NO = #{custNo}
+	</update>
+
 </mapper>

+ 202 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaPoll.xml

@@ -0,0 +1,202 @@
+<?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.TsaPollDao">
+	<!-- POLL 저장 -->
+	<update id="savePoll" parameterType="Poll">
+		<selectKey keyProperty="pollSqTemp" resultType="int" order="AFTER">
+			SELECT LAST_INSERT_ID()
+		</selectKey>
+		/* TsaPoll.savePoll */
+		INSERT INTO
+	      TB_POLL(
+	            POLL_SQ 
+	          , SITE_CD
+	          , POLL_TITLE
+	          , POLL_CONTENT
+	          , POLL_STDT
+	          , POLL_EDDT
+	          , DUP_PARTI_YN
+	          , FST_COM_YN
+	          , PARTI_CNT
+	          , DEL_YN
+	          , REG_NO
+	          , REG_DT
+	          , UPD_NO
+	          , UPD_DT        
+	      )
+	   VALUES (
+	     	    #{pollSqTemp}
+	   		   ,#{siteCd}
+	   		   ,#{pollTitle}
+	   		   ,#{pollContent}
+	   		   ,DATE_FORMAT(#{pollStdt}, '%Y-%m-%d %H:%i:%s') 
+			   ,DATE_FORMAT(#{pollEddt}, '%Y-%m-%d %H:%i:%s') 
+	   		   ,#{dupPartiYn}
+	   		   ,#{fstComYn}
+	   		   ,#{partiCnt}
+	   		   , 'N'
+	   		   , #{regNo}                                          
+               , now()                                           
+               , #{updNo}                                            
+               , now()
+	   	     )
+	   ON
+	      DUPLICATE KEY
+	   UPDATE
+	        POLL_TITLE = #{pollTitle}                                       
+		  , SITE_CD = #{siteCd}   	
+		  , DUP_PARTI_YN = #{dupPartiYn}
+		  , FST_COM_YN   = #{fstComYn} 
+		  , PARTI_CNT    = #{partiCnt}                                        
+		  , POLL_STDT = DATE_FORMAT(#{pollStdt}, '%Y-%m-%d %H:%i:%s')      
+		  , POLL_EDDT = DATE_FORMAT(#{pollEddt}, '%Y-%m-%d %H:%i:%s')      
+		  , UPD_NO = #{updNo}                                            
+		  , UPD_DT = now()                              
+	</update>
+	
+	<!-- POLL 문항 삭제 -->
+	<delete id="deletePollQuestion" parameterType="Poll">
+		/* TsaPoll.deletePollQuestion */
+		DELETE 
+		FROM TB_POLL_QUESTION
+		WHERE  1=1
+		   AND POLL_SQ = #{pollSq}
+	</delete>
+	
+	<!-- POLL 문항 등록 -->
+	<insert id="createPollQuestion" parameterType="Poll">
+	/* TsaPoll.createPollQuestion */
+		INSERT INTO TB_POLL_QUESTION (
+		       		  	POLL_SQ
+		       		  , POLL_QTITLE
+		       		  , POLL_QTYPE
+		       		  , POLL_QVAL1
+		       		  , POLL_QVAL2
+		       		  , POLL_QVAL3
+		       		  , POLL_QVAL4
+		       		  , POLL_QVAL5
+		       		  , POLL_QVAL6
+		       		  , POLL_QVAL7
+		       		  , POLL_QVAL8
+		       		  , POLL_QVAL9
+		       		  , POLL_QVAL10
+		       		  , DISP_ORD
+		       		  , DEL_YN
+		       		  , REG_NO
+		       		  , REG_DT
+		       		  , UPD_NO
+		       		  , UPD_DT
+		       ) VALUES (
+		            #{pollSq}
+		          , #{pollQtitle}
+		          , #{pollQtype}
+		          , #{pollQval1}
+		          , #{pollQval2}
+		          , #{pollQval3}
+		          , #{pollQval4}
+		          , #{pollQval5}
+		          , #{pollQval6}
+		          , #{pollQval7}
+		          , #{pollQval8}
+		          , #{pollQval9}
+		          , #{pollQval10}
+		          , #{dispOrd}
+		          , 'N'
+		          , #{regNo}
+		          , now()
+		          , #{updNo}
+		          , now()
+		       )
+	</insert>
+	
+	<!-- POLL 목록 -->
+	<select id="getPollList" parameterType="Poll" resultType="Poll">
+		 SELECT   M.POLL_SQ                                                                                                     
+				, M.POLL_TITLE                                                                                                 
+				, M.DUP_PARTI_YN                                                                                               
+				, M.FST_COM_YN                                                                                                 
+				, M.PARTI_CNT                                                                                                  
+				, M.SITE_CD 
+				, M.REG_DT                                                                                                   
+				, M.POLL_QSQ                                                                                                   
+				, M.POLL_QTITLE                                                                                                
+				, M.POLL_QTYPE      
+				, M.POLL_QVAL1                                                                                                 
+				, M.POLL_QVAL2                                                                                                 
+				, M.POLL_QVAL3                                                                                                 
+				, M.POLL_QVAL4                                                                                                 
+				, M.POLL_QVAL5                                                                                                 
+				, M.POLL_QVAL6                                                                                                 
+				, M.POLL_QVAL7                                                                                                 
+				, M.POLL_QVAL8                                                                                                 
+				, M.POLL_QVAL9                                                                                                 
+				, M.POLL_QVAL10                                                                                                
+				, M.ANS_CUST_NO                                                                                                
+				, M.DUMMY                                                                                                      
+				, M.VOTE_CNT                                                                             
+		 FROM
+		 (		      
+			SELECT A.POLL_SQ
+			      , A.POLL_TITLE 
+			      , A.DUP_PARTI_YN 
+			      , A.FST_COM_YN 
+			      , A.PARTI_CNT 
+			      , A.SITE_CD
+			      , A.REG_DT 
+			      , B.POLL_QSQ 
+			      , B.POLL_QTITLE 
+			      , CASE B.POLL_QTYPE WHEN 10 THEN '단수형' WHEN 20 THEN '복수형' WHEN 30 THEN '단답형' ELSE '서술형' END AS POLL_QTYPE
+			      , B.POLL_QVAL1 
+			      , B.POLL_QVAL2 
+			      , B.POLL_QVAL3 
+			      , B.POLL_QVAL4 
+			      , B.POLL_QVAL5 
+			      , B.POLL_QVAL6 
+			      , B.POLL_QVAL7 
+			      , B.POLL_QVAL8
+			      , B.POLL_QVAL9
+			      , B.POLL_QVAL10
+			      , C.ANS_CUST_NO 
+			      , C.DUMMY 
+			      , COUNT(C.ANS_CUST_NO) AS VOTE_CNT
+			FROM   TB_POLL A LEFT JOIN TB_POLL_QUESTION B ON A.POLL_SQ = B.POLL_SQ 
+			     			 LEFT JOIN TB_POLL_ANSWER C ON B.POLL_QSQ = C.POLL_QSQ 
+			WHERE 1=1
+		  		 AND A.DEL_YN = 'N'
+		   <if test="pollSq != null and pollSq != ''">
+		        AND    A.POLL_SQ = #{pollSq}
+			</if>
+			<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+		        AND    A.REG_DT <![CDATA[ >= ]]> DATE_FORMAT(#{stDate},'%Y-%m-%d %H:%i:%S')
+		        AND    A.REG_DT <![CDATA[ <= ]]> DATE_FORMAT(#{edDate},'%Y-%m-%d %H:%i:%S')
+			</if>
+			<if test="siteCd != null and siteCd != ''">
+		        AND    A.SITE_CD = #{siteCd}
+			</if>
+			<if test="pollTitle != null and pollTitle != ''">
+		        AND    A.POLL_TITLE LIKE CONCAT('%', #{pollTitle},'%') 
+			</if>
+		 GROUP  BY  A.POLL_SQ
+	     		   , A.POLL_TITLE 
+			      , A.DUP_PARTI_YN 
+			      , A.FST_COM_YN 
+			      , A.PARTI_CNT 
+			      , A.SITE_CD 
+			      , B.POLL_QSQ 
+			      , B.POLL_QTITLE 
+			      , B.POLL_QVAL1 
+			      , B.POLL_QVAL2 
+			      , B.POLL_QVAL3 
+			      , B.POLL_QVAL4 
+			      , B.POLL_QVAL5 
+			      , B.POLL_QVAL6 
+			      , B.POLL_QVAL7 
+			      , B.POLL_QVAL8
+			      , B.POLL_QVAL9
+			      , B.POLL_QVAL10
+			      , C.ANS_CUST_NO 
+			      , C.DUMMY 
+			)M
+	
+	</select>
+</mapper>

+ 10 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaRenderer.xml

@@ -405,5 +405,15 @@
 		  AND SELF_YN = 'Y'
 		ORDER  BY SUPPLY_COMP_CD, DISP_ORD
 	</select>
+	
+	<select id="getPollQtypeList" resultType="CommonCode">
+		/* TsaRenderer.getPollQtypeList */
+		SELECT CD
+		 	, CD_NM
+		FROM TB_COMMON_CODE
+				WHERE 1=1
+				AND CD_GB = 'G670'
+				AND USE_YN = 'Y'
+	</select>
 
 </mapper>

+ 7 - 0
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -1012,6 +1012,13 @@
 		}
 		customer.birthYmd = customer.birthYmd.replaceAll('-', '');
 
+		// customer.sexGb = orgData.sexGb;
+		// customer.cellPhnno = orgData.cellPhnno;
+		// customer.email = orgData.email;
+		// customer.custNm = orgData.custNm;
+		// customer.homeBaseAddr = orgData.homeBaseAddr;
+		// customer.homeDtlAddr = orgData.homeDtlAddr;
+
 		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",

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

@@ -1,6 +1,5 @@
 <!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
+<html lang="ko" xmlns:th="http://www.thymeleaf.org">
 <!--
  *******************************************************************************
  * @source  : PlanListForm.html
@@ -103,39 +102,38 @@
 					class="btn btn-gray btn-lg" id="btnInit" /> <input type="button"
 					value="조회" class="btn btn-base btn-lg" id="btnSearch" /></li>
 			</ul>
-		</div>
+	</div>
 
-			<div class="panelStyle">
-				<!-- 검색결과 영역 -->
-				<!-- 상단버튼 영역  -->
-				<ul class="panelBar">
-					<li>
-						<button type="button" class="btn btn-danger btn-lg"
-							onclick="fnSelectedDelete();">삭제</button>
-					</li>
-					<li class="right">
-						<button type="button" class="btn btn-primary btn-lg"
-							onclick="fnPlanWebRegisterPopup();">등록</button> 검색결과 : <strong><span
-							id="gridRowTotalCount">0</span> 건</strong>&nbsp; 쪽번호 <span id="pgNo">0</span>/
-						<strong id="endPgNo">0</strong>&nbsp;&nbsp; <select id="pageSize"
-						name="pageSize">
-							<option value="50" selected="selected">50개씩 보기</option>
-							<option value="100">100개씩 보기</option>
-							<option value="500">500개씩 보기</option>
-							<option value="1000">1000개씩 보기</option>
-					</select> <input type="hidden" name="pageNo" id="pageNo" value="1" />
-					</li>
-				</ul>
-
-				<div id="gridList" style="width: 100%; height: 500px;"
-					class="ag-theme-balham"></div>
-				<ul class="panelBar">
-					<li class="center">
-						<div class="tablePaging" id="planListPagination"></div>
-					</li>
-				</ul>
-			</div>
+	<div class="panelStyle">
+		<!-- 검색결과 영역 -->
+		<!-- 상단버튼 영역  -->
+		<ul class="panelBar">
+			<li>
+				<button type="button" class="btn btn-danger btn-lg"
+					onclick="fnSelectedDelete();">삭제</button>
+			</li>
+			<li class="right">
+				<button type="button" class="btn btn-primary btn-lg"
+					onclick="fnPlanWebRegisterPopup();">등록</button> 검색결과 : <strong><span
+					id="gridRowTotalCount">0</span> 건</strong>&nbsp; 쪽번호 <span id="pgNo">0</span>/
+				<strong id="endPgNo">0</strong>&nbsp;&nbsp; <select id="pageSize"
+				name="pageSize">
+					<option value="50" selected="selected">50개씩 보기</option>
+					<option value="100">100개씩 보기</option>
+					<option value="500">500개씩 보기</option>
+					<option value="1000">1000개씩 보기</option>
+			</select> <input type="hidden" name="pageNo" id="pageNo" value="1" />
+			</li>
+		</ul>
 
+		<div id="gridList" style="width: 100%; height: 500px;"
+			class="ag-theme-balham"></div>
+		<ul class="panelBar">
+			<li class="center">
+				<div class="tablePaging" id="planListPagination"></div>
+			</li>
+		</ul>
+	</div>
 	</form>
 </div>
 

+ 705 - 0
src/main/webapp/WEB-INF/views/marketing/PollListForm.html

@@ -0,0 +1,705 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : PollListForm.html
+ * @desc    : POLL관리화면 Page
+ *============================================================================
+ * SISUN
+ * Copyright(C) 2019 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.19   sowon		   최초 작성
+ *******************************************************************************
+ -->
+	<div id="main">
+		<div class="main-title">
+		</div>
+
+		<div class="panelStyle">
+			<form id="PollsearchForm" name="PollsearchForm" action="#" th:action="@{'/marketing/poll/list'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:30%;"/>
+						<col style="width:10%;"/>
+						<col style="width:30%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tbody>
+						<tr>
+							<th>등록기간</th>
+							<td id="terms" colspan="3"></td>
+						</tr>
+						<tr>
+							<th>POLL 제목</th>
+							<td>
+								<input type="text" name="pollTitle" id="pollTitle"/>
+							</td>
+
+							<th>사이트</th>
+							<td>
+								<select name="siteCd">
+									<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}|"></option>
+								</select>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<ul class="panelBar">
+					<li class="center">
+						<input type="button" value="초기화" class="btn btn-gray btn-lg" id="btnReset" onclick="fnReset();"/>
+						<input type="button" value="조회" class="btn btn-base btn-lg" id="btnSearch" onclick="fnSearch();"/>
+					</li>
+				</ul>
+			</form>
+		</div>
+
+		<div class="panelStyle">
+			<ul class="lrStyle">
+				<li class="aR">
+					<h4 class="btnLeft" id="pollQtitle">투표자수</h4>
+				</li>
+			</ul>
+			<div class="panelContent" style="padding-bottom: 530px;">
+				<div id="gridListPoll" style="width: 60%; height: 500px; float: left;" class="ag-theme-balham"></div>
+				<div id="gridListVote" style="width: 38%; height: 500px; float: right;" class="ag-theme-balham"></div>
+			</div>
+		</div>
+
+		<div class="panelStyle">
+			<div class="boxTitle"></div>
+			<form id="registerForm" name="registerForm">
+				<input type="hidden" name="pollSq"/>
+				<ul class="panelBar">
+					<li class="right">
+						<span class="btnRight">
+							<button type="button" class="btn btn-info btn-lg" onclick="fnReset();">신규</button>
+							<button type="button" class="btn btn-success btn-lg" onclick="fnPollSave();">저장</button>
+						</span>
+					</li>
+				</ul>
+				<ul class="boxContent">
+					<li class="boxContentTop">
+						<table class="frmStyle">
+							<colgroup>
+								<col style="width:5%;"/>
+								<col style="";/>
+								<col style=""/>
+								<col style=""/>
+								<col style=""/>
+								<col style=""/>
+							</colgroup>
+							<tbody>
+								<tr>
+									<th>POLL 제목<em class="required" title="필수"></em></th>
+									<td>
+										<input type="text" name="pollTitle" id="pollTitle"/>
+									</td>
+
+									<th>투표참여기간<em class="required" title="필수"></em></th>
+									<td>
+										<input name="stDate" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="투표시작일자">
+										<select id="stTimeHour" required="required" data-valid-name="투표기간 시작시간">
+											<th:block th:each="num, index  : ${#numbers.sequence(0,23)}">
+											<option  th:value="${#numbers.formatInteger(num,2)}" th:text="|${#numbers.formatInteger(num,2)}시|" >시간</option>
+											</th:block>
+										</select>
+										<select id="stTimeMin" required="required" data-valid-name="투표기간 시작시간">
+											<th:block th:each="num: ${#numbers.sequence(0,59)}">
+											<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" >분</option>
+											</th:block>
+										</select>
+										<input name="dispStTime" id="stTime" type="hidden" data-valid-name="투표기간 시작시간" value='000000' />
+										~
+										<input name="edDate" type="text" class="w80 schDate" maxlength="10" data-valid-type="calendar">
+										<select id="edTimeHour" required="required" data-valid-name="투표기간 종료시간">
+											<th:block th:each="num: ${#numbers.sequence(0,23)}">
+											<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}시|" th:selected="${#numbers.formatInteger(num,2)}==23 ? 'true'">시</option>
+											</th:block>
+										</select>
+										<select id="edTimeMin" required="required" data-valid-name="투표기간 종료시간">
+											<th:block th:each="num: ${#numbers.sequence(0,59)}">
+											<option  th:value="${#numbers.formatInteger(num,2)}"  th:text="|${#numbers.formatInteger(num,2)}분|" th:selected="${#numbers.formatInteger(num,2)}==59 ? 'true'">분</option>
+											</th:block>
+										</select>
+										<input name="dispEdTime" id="edTime" type="hidden" data-valid-name="투표기간 종료시간" value='235959' />
+									</td>
+
+									<th>사이트<i class="star"></i></th>
+									<td>
+										<select name="siteCd">
+											<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}|"></option>
+										</select>
+									</td>
+								</tr>
+								<tr>
+									<th>중복참여<i class="star"></i></th>
+									<td>
+										<select name="dupPartiYn">
+											<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>
+									<th>선착순<i class="star"></i></th>
+									<td>
+										<select name="fstComYn">
+											<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>	
+									<th>선착순 인원<i class="star"></i></th>
+									<td>
+										<input type="text" name="partiCnt" id="partiCnt" disabled="disabled" data-valid-type="numeric"/>
+									</td>	
+								</tr>
+								<tr style="height: 250px;">
+									<th>문항<em class="required" title="필수"></em></th>
+									<td colspan="5">
+										<button type="button" class="btn btn-info btn-lg" onclick="fnAddQuestion();">문항추가</button>
+										<button type="button" class="btn btn-info btn-lg" onclick="fnDeleteQuestion();">문항삭제</button>
+										<div id="questionDiv" class="btn_left" style="width: 100%; height: 300px; overflow: yes; overflow-x: scroll; overflow-y: auto;">
+											<table class="tableStyle" id="questionTable" width="100%" style="overflow-x: scroll; overflow-y: auto;">
+												<colgroup>
+													<col width="2%">
+													<col width="10%">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+													<col width="">
+												</colgroup>
+												<tbody>
+													<tr align="center" style="background-color: #EEEEEE;">
+														<td>선택</td>
+														<td>문항 제목</td>
+														<td>문제 유형</td>
+														<td>문항 참고값 1</td>
+														<td>문항 참고값 2</td>
+														<td>문항 참고값 3</td>
+														<td>문항 참고값 4</td>
+														<td>문항 참고값 5</td>
+														<td>문항 참고값 6</td>
+														<td>문항 참고값 7</td>
+														<td>문항 참고값 8</td>
+														<td>문항 참고값 9</td>
+														<td>문항 참고값 10</td>
+													</tr>
+												</tbody>
+											</table>
+										</div>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+					</li>
+					<li class="boxContentBtnB">
+						<span class="btnRight">
+						</span>
+					</li>
+				</ul>
+			</form>
+		</div>
+
+	</div>
+
+<!-- 문항 Start --------------------------------------------------------------->
+<table class="frmStyle" style="display: none;">
+	<tr id="trRowQuestion">
+	<td>
+		<input type="checkbox" name="chkIdx" style="margin-left: 10px; top: 50%;  left: 0;  width: 18px; height: 18px; transform: translate(0,-50%);"/>
+		<input type="hidden" name="crud" value="C"/>
+		<input type="hidden" name="pollQsq" value=""/>
+	</td>
+	<td>
+		<input type="text" name="pollQtitle" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<select name="pollQtype">
+			<option th:if="${pollQtype}" th:each="oneData, status : ${pollQtype}" th:value="${oneData.cd}" th:text="${oneData.cdNm}|"></option>
+		</select>
+	</td>
+	<td>
+		<input type="text" name="pollQval1" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval2" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval3" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval4" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval5" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval6" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval7" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval8" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval9" class="type-text" style="width: 100%;"/>
+	</td>
+	<td>
+		<input type="text" name="pollQval10" class="type-text" style="width: 100%;"/>
+	</td>
+	</tr>
+</table>
+<!-- 문항 End ----------------------------------------------------------------->
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var fistFlag = true;
+	var siteCdList = gagajf.convertToArray([[${siteList}]]);
+
+	var columnDefsPoll = [
+		{headerName: "사이트"			, field:'siteCd'	, width:100, cellClass: 'text-center',
+			cellEditor: 'agRichSelectCellEditor',
+			cellEditorParams: { values: gagaAgGrid.extractValues(siteCdList) },
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(siteCdList, params.value); },
+			valueParser: function (params) { return gagaAgGrid.lookupKey(siteCdList, params.newValue); }
+		},
+		{headerName: 'POLL번호'	, field:'pollSq'	, width:100, cellClass: 'text-center'
+			, cellRenderer: function(params) { return fnSetColumn(params); }
+		},
+		{headerName: 'POLL제목'	, field:'pollTitle'	, width:230, cellClass: 'text-left'
+			, cellRenderer: function(params) { return fnSetColumn(params); }
+		},
+		{headerName: '문항제목'		, field:'pollQtitle', width:230, cellClass: 'text-center'},
+		{headerName: '문항보기'		, field:'pollQval1', width:230, cellClass: 'text-center'},
+		{headerName: '문항보기'		, field:'pollQval2', width:230, cellClass: 'text-center'},
+		{headerName: '문항보기'		, field:'pollQval3', width:230, cellClass: 'text-center'},
+		{headerName: '문항보기'		, field:'pollQval4', width:230, cellClass: 'text-center'},
+		{headerName: '문항보기'		, field:'pollQval5', width:230, cellClass: 'text-center'},
+		{headerName: '투표수'		, field:'voteCnt'	, width:80, cellClass: 'text-center'
+			, cellRenderer : function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+		},
+		{headerName: '투표율'		, field:'voteRate'	, width:80, cellClass: 'text-center'
+			, cellRenderer : function(params) { return gagajf.isNull(params.value) ? '0%' : params.value + '%'; }
+		},
+	];
+
+	var columnDefsVote = [
+		{headerName: '투표자명'		, field:'voterNm'	, width:150, cellClass: 'text-center'},
+		{headerName: '투표자회원번호'	, field:'ansCustNo'	, width:200, cellClass: 'text-center'},
+		{headerName: '투표일시'		, field:'voteDt'	, width:200, cellClass: 'text-center'},
+	];
+
+	var gridOptionsPoll = gagaAgGrid.getGridOptions(columnDefsPoll);
+	var gridOptionsVote = gagaAgGrid.getGridOptions(columnDefsVote);
+
+	// 컬럼 설정
+	var fnSetColumn = function(params) {
+		var allData = gagaAgGrid.getAllRowData(gridOptionsPoll);
+
+		// 첫번째 일 때
+		if (params.rowIndex == 0) {
+
+			if (params.colDef.field == 'pollTitle') {
+				return '<a href="javascript:void(0);">' + params.value + '</a>'
+			} else {
+				return params.value;
+			}
+		} else {
+
+			if (allData[params.rowIndex - 1].pollSq != params.data.pollSq) {
+				if (params.colDef.field == 'pollTitle') {
+					return '<a href="javascript:void(0);">' + params.value + '</a>'
+				} else {
+					return params.value;
+				}
+			}
+		}
+	}
+
+	// 셀 클릭 시
+	var selectPoll = [];
+	gridOptionsPoll.onCellClicked = function(event)  {
+		if (event.colDef.field == 'pollTitle') {
+			$('#registerForm input[name=pollTitle]').focus();
+			fnAllDeleteQuestion();
+			fnSetDetail(event);
+		} else if (event.colDef.field == 'voteCnt') {
+			fnSearchVote(event.data);
+		}
+	}
+
+	// 투표자 조회
+	var fnSearchVote = function(data) {
+		if (gagajf.isNull(data.pollQtitle)) {
+			$('#pollQtitle').text(' 투표자수');
+		} else {
+			$('#pollQtitle').text(' [' + data.pollQtitle + '] 투표자수');
+		}
+
+
+		var params = new Object();
+		params.pollQsq = data.pollQsq;
+
+		var jsonData = JSON.stringify(params);
+		gagajf.ajaxJsonSubmit('/marketing/poll/voter/list', jsonData, function(dataList) {
+			gridOptionsVote.api.setRowData(dataList);
+		});
+
+	}
+
+	// 상세 설정
+	var fnSetDetail = function(event) {
+		var pollSq = event.data.pollSq;
+		var data = event.data;
+		var allData = gagaAgGrid.getAllRowData(gridOptionsPoll);
+
+		$(allData).each(function(idx) {
+			if (allData[idx].pollSq == pollSq) {
+				fnAddQuestion(allData[idx]);
+				selectPoll.push(allData[idx]);
+			}
+		});
+
+		$('#registerForm input[name=pollSq]').val(pollSq);
+		$('#registerForm input[name=pollTitle]').val(data.pollTitle);
+
+		// 시작 기간 설정
+		var sttime = data.pollStdt.split(" ");
+		$('#registerForm input[name=stDate]').val(sttime[0]);
+		$('#stTimeHour').val(sttime[1].substring(0,2));
+		$('#stTimeMin').val(sttime[1].substring(2,4));
+		$('#stTime').val(sttime[1]);
+
+		// 종료 기간 설정
+		var edtime = data.pollEddt.split(" ");
+		$('#registerForm input[name=edDate]').val(edtime[0]);
+		$('#edTimeHour').val(edtime[1].substring(0,2));
+		$('#edTimeMin').val(edtime[1].substring(2,4));
+		$('#edTime').val(edtime[1]);
+
+		$('#registerForm select[name=siteCd]').val(data.siteCd);
+	}
+
+	// 검색
+	var fnSearch = function() {
+		var formId = '#PollsearchForm';
+		gagaAgGrid.fetch('/marketing/poll/list', gridOptionsPoll, formId);
+	}
+	
+	// 선착순 y/n여부 따라 인원  input 활성화
+	$('#registerForm select[name=fstComYn]').change(function(){
+		if($('#registerForm select[name=fstComYn]').val() == 'Y'){
+			$("#partiCnt").attr("disabled",false);
+		}else{
+			$("#partiCnt").attr("disabled",true);
+		}
+	})
+	
+	// 유효성
+	function validationPoll() {
+		if($('#registerForm input[name=pollTitle]').val() == ''){
+			mcxDialog.alert('POLL 제목을 입력하세요');
+			return;
+		}
+		if($('#registerForm input[name=stDate]').val() == '' || $('#registerForm input[name=sdDate]').val() == '' ){
+			mcxDialog.alert('POLL 날짜를 설정하세요');
+			return;
+		}
+		if($('#registerForm select[name=fstComYn]').val() == 'Y'){
+			if($('#registerForm input[name=partiCnt]').val() == ''){
+				mcxDialog.alert('선착순 인원을 설정하세요.');
+				return;
+			}
+		}
+	};
+	 
+	
+
+
+
+	// 문항추가
+	var fnAddQuestion = function(data) {
+		if (typeof data == 'undefined') {
+			var cnt = $('#questionTable tr').length;
+
+			// 태그 복사
+			var tTbody = $('#questionTable')[0].tBodies[0];
+			var oNewTR = $('#trRowQuestion')[0].cloneNode(true);
+
+			// id 삭제
+			$(oNewTR).attr('id', 'questionTable' + cnt);
+			// id 변경
+			var val1 = $(oNewTR).find('.uFileInput');
+			$(val1).attr('id' , cnt + '_val1');
+			$(val1).attr('name' , cnt + '_val1');
+			$(val1).off('change');
+
+			var label = $(oNewTR).find('label');
+			$(label).attr('for', cnt + '_val1');
+
+			// 행 추가
+			tTbody.appendChild(oNewTR);
+
+		} else {
+			if (gagajf.isNull(data.pollQtitle)) return;
+			var cnt = $('#questionTable tr').length;
+
+			// 태그 복사
+			var tTbody = $('#questionTable')[0].tBodies[0];
+			var oNewTR = $('#trRowQuestion')[0].cloneNode(true);
+
+			// id 삭제
+			$(oNewTR).attr('id', 'questionTable' + cnt);
+			// id 변경
+			var val1 = $(oNewTR).find('.uFileInput');
+			$(val1).attr('id' , cnt + '_val1');
+			$(val1).attr('name' , cnt + '_val1');
+			$(val1).off('change');
+
+			var label = $(oNewTR).find('label');
+			$(label).attr('for', cnt + '_val1');
+
+			// 값 설정
+			$(oNewTR).find("input[name=crud]").val('R');
+			$(oNewTR).find("input[name=pollQsq]").val(data.pollQsq);
+			$(oNewTR).find("input[name=pollQtitle]").val(data.pollQtitle);
+			$(oNewTR).find("select[name=pollQtype]").val(data.pollQtype);
+			$(oNewTR).find("input[name=pollQval1]").val(data.pollQval1);
+			$(oNewTR).find("input[name=pollQval2]").val(data.pollQval2);
+			$(oNewTR).find("input[name=pollQval3]").val(data.pollQval3);
+			$(oNewTR).find("input[name=pollQval4]").val(data.pollQval4);
+			$(oNewTR).find("input[name=pollQval5]").val(data.pollQval5);
+			$(oNewTR).find("input[name=pollQval6]").val(data.pollQval6);
+			$(oNewTR).find("input[name=pollQval7]").val(data.pollQval7);
+			$(oNewTR).find("input[name=pollQval8]").val(data.pollQval8);
+			$(oNewTR).find("input[name=pollQval9]").val(data.pollQval9);
+			$(oNewTR).find("input[name=pollQval10]").val(data.pollQval10);
+
+			// 행 추가
+			tTbody.appendChild(oNewTR);
+		}
+	}
+
+	// 문항삭제
+	var fnDeleteQuestion = function() {
+		var tags = $('input[name=chkIdx]');
+
+		for (var idx = 0; idx < tags.length; idx++) {
+			var checkYn = tags[idx].checked;
+
+			if (checkYn) {
+				$(tags[idx]).closest('tr').remove();
+			}
+		}
+	}
+
+	// 문항 내용 전체 삭제
+	var fnAllDeleteQuestion = function() {
+		selectPoll = [];
+		$($('#questionTable')[0].rows).each(function(idx, item) {
+			if ( idx != 0) {
+				item.remove();
+			}
+		});
+	}
+
+	// 저장
+	var fnPollSave = function() {
+		var dataList = [];
+		if (selectPoll.length > 0) { // 저장
+			mcxDialog.confirm('저장 하시겠습니까?' , {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					var pollTitle = $('#registerForm input[name=pollTitle]').val();
+					var siteCd = $('#registerForm select[name=siteCd]').val();
+					var pollStdt = $('#registerForm input[name=stDate]').val() + ' ' + $('#stTime').val();
+					var pollEddt = $('#registerForm input[name=edDate]').val() + ' ' + $('#edTime').val();
+					var dupPartiYn = $('#registerForm select[name=dupPartiYn]').val();
+					var fstComYn = $('#registerForm select[name=fstComYn]').val();
+					var partiCnt = $('#registerForm input[name=partiCnt]').val();
+
+					$('#questionTable tr').each(function(index, tr) {
+						if (index < 1) return;
+						var pollQsq = $(tr).find("input[name=pollQsq]").val();
+						var crud = $(tr).find("input[name=crud]").val();
+
+						if (crud == 'R') { // 기존 데이터
+							$(selectPoll).each(function(idx) {
+								selectPoll[idx].pollTitle = pollTitle;
+								selectPoll[idx].siteCd = siteCd;
+								selectPoll[idx].pollStdt = pollStdt;
+								selectPoll[idx].pollEddt = pollEddt;
+								selectPoll[idx].dupPartiYn = dupPartiYn;
+								selectPoll[idx].fstComYn = fstComYn;
+								selectPoll[idx].partiCnt = partiCnt;
+
+								if (selectPoll[idx].pollQsq == pollQsq) {
+									selectPoll[idx].pollQtitle = $(tr).find('input[name=pollQtitle]').val();
+									selectPoll[idx].pollQtype = $(tr).find("#registerForm select[name=pollQtype]").val();
+									selectPoll[idx].pollQval1 = $(tr).find('input[name=pollQval1]').val();
+									selectPoll[idx].pollQval2 = $(tr).find('input[name=pollQval2]').val();
+									selectPoll[idx].pollQval3 = $(tr).find('input[name=pollQval3]').val();
+									selectPoll[idx].pollQval4 = $(tr).find('input[name=pollQval4]').val();
+									selectPoll[idx].pollQval5 = $(tr).find('input[name=pollQval5]').val();
+									selectPoll[idx].pollQval6 = $(tr).find('input[name=pollQval6]').val();
+									selectPoll[idx].pollQval7 = $(tr).find('input[name=pollQval7]').val();
+									selectPoll[idx].pollQval8 = $(tr).find('input[name=pollQval8]').val();
+									selectPoll[idx].pollQval9 = $(tr).find('input[name=pollQval9]').val();
+									selectPoll[idx].pollQval10 = $(tr).find('input[name=pollQval10]').val();
+									
+									dataList.push(selectPoll[idx]);
+								}
+							});
+						} else if (crud == 'C') { // 추가 된 데이터
+							var newData = new Object();
+							newData.pollTitle = pollTitle;
+							newData.siteCd = siteCd;
+							newData.pollStdt = pollStdt;
+							newData.pollEddt = pollEddt;
+							newData.dupPartiYn = dupPartiYn;
+							newData.fstComYn = fstComYn;
+							newData.partiCnt = partiCnt;
+							newData.pollQsq = gagajf.isNull(pollQsq) ? '' : pollQsq;
+							newData.pollSq = $('#registerForm input[name=pollSq]').val();
+							newData.pollQtitle = $(tr).find('input[name=pollQtitle]').val();
+							newData.pollQtype = $(tr).find("#registerForm select[name=pollQtype]").val();
+							newData.pollQval1 = $(tr).find('input[name=pollQval1]').val();
+							newData.pollQval2 = $(tr).find('input[name=pollQval2]').val();
+							newData.pollQval3 = $(tr).find('input[name=pollQval3]').val();
+							newData.pollQval4 = $(tr).find('input[name=pollQval4]').val();
+							newData.pollQval5 = $(tr).find('input[name=pollQval5]').val();
+							newData.pollQval6 = $(tr).find('input[name=pollQval6]').val();
+							newData.pollQval7 = $(tr).find('input[name=pollQval7]').val();
+							newData.pollQval8 = $(tr).find('input[name=pollQval8]').val();
+							newData.pollQval9 = $(tr).find('input[name=pollQval9]').val();
+							newData.pollQval10 = $(tr).find('input[name=pollQval0]').val();
+							
+
+							dataList.push(newData);
+						}
+
+					}); // 태그 끝
+
+					var jsonData = JSON.stringify(dataList);
+					gagajf.ajaxJsonSubmit('/marketing/poll/create', jsonData, function() {
+						fnReset();
+						fnSearch();
+					});
+					
+				}
+			});
+		} else { // 신규
+			mcxDialog.confirm('저장 하시겠습니까?' , {
+				cancelBtnText: "취소",
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					var pollTitle = $('#registerForm input[name=pollTitle]').val();
+					var siteCd = $('#registerForm select[name=siteCd]').val();
+					var pollStdt = $('#registerForm input[name=stDate]').val() + ' ' + $('#stTimeHour').val() + ':' + $('#stTimeMin').val() + ':' + '00';
+					var pollEddt = $('#registerForm input[name=edDate]').val() + ' ' + $('#edTimeHour').val() + ':' + $('#edTimeMin').val() + ':' + '59';
+					var dupPartiYn = $('#registerForm select[name=dupPartiYn]').val();
+					var fstComYn = $('#registerForm select[name=fstComYn]').val();
+					var partiCnt = $('#registerForm input[name=partiCnt]').val();
+
+					$('#questionTable tr').each(function(index, tr) {
+						if (index < 1) return;
+						var pollQsq = $(tr).find("input[name=pollQsq]").val();
+
+						var newData = new Object();
+						newData.pollTitle = pollTitle;
+						newData.siteCd = siteCd;
+						newData.pollStdt = pollStdt;
+						newData.pollEddt = pollEddt;
+						newData.dupPartiYn = dupPartiYn;
+						newData.fstComYn = fstComYn;
+						newData.partiCnt = partiCnt;
+						newData.pollQsq = gagajf.isNull(pollQsq) ? '' : pollQsq;
+						newData.pollSq = $('#registerForm input[name=pollSq]').val();
+						newData.pollQtitle = $(tr).find('input[name=pollQtitle]').val();
+						newData.pollQtype = $(tr).find("select[name=pollQtype]").val();
+						newData.pollQval1 = $(tr).find('input[name=pollQval1]').val();
+						newData.pollQval2 = $(tr).find('input[name=pollQval2]').val();
+						newData.pollQval3 = $(tr).find('input[name=pollQval3]').val();
+						newData.pollQval4 = $(tr).find('input[name=pollQval4]').val();
+						newData.pollQval5 = $(tr).find('input[name=pollQval5]').val();
+						newData.pollQval6 = $(tr).find('input[name=pollQval6]').val();
+						newData.pollQval7 = $(tr).find('input[name=pollQval7]').val();
+						newData.pollQval8 = $(tr).find('input[name=pollQval8]').val();
+						newData.pollQval9 = $(tr).find('input[name=pollQval9]').val();
+						newData.pollQval10 = $(tr).find('input[name=pollQval10]').val();
+
+						dataList.push(newData);
+
+					}); // 태그 끝
+			
+					
+					if (dataList.length < 1) {
+						mcxDialog.alert('저장 할 문항이 없습니다.');
+						return;
+					}
+					
+					var jsonData = JSON.stringify(dataList);
+					gagajf.ajaxJsonSubmit('/marketing/poll/create', jsonData, function() {
+						fnReset();
+						fnSearch();
+					});
+				}
+			});
+		}
+	}
+
+	$('#stTimeHour').on('change', function() {
+		$('#stTime').val($(this).val() + ':' + $('#stTimeMin').val() + ':' + '00');
+	});
+
+	$('#stTimeMin').on('change', function() {
+		$('#stTime').val($('#stTimeHour').val() + ':' + $(this).val() + ':' + '00');
+	});
+
+	$('#edTimeHour').on('change', function() {
+		$('#edTime').val($(this).val() + ':' + $('#edTimeMin').val() + ':' + '59');
+	});
+
+	$('#edTimeMin').on('change', function() {
+		$('#edTime').val($('#edTimeHour').val() + ':' + $(this).val() + ':' + '59');
+	});
+
+	var fnReset = function() {
+		selectPoll = [];
+		$('#registerForm')[0].reset();
+		$('#registerForm input[name=pollSq]').val('');
+		$('#questionTable tr').each(function(index, tr) {
+
+			if (index > 0) {
+				$(tr).remove();
+			}
+		});
+
+	}
+
+	$(document).ready(function() {
+		
+		// 날짜 셋팅
+		cfnCreateCalendar('#terms', 'stDate', 'edDate', false);
+
+		// 그리드 셋팅
+		gagaAgGrid.createGrid('gridListPoll', gridOptionsPoll);
+		gagaAgGrid.createGrid('gridListVote', gridOptionsVote);
+
+	});
+
+
+/*]]>*/
+</script>
+
+</html>