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

Merge branch 'develop' into xyzp1539

xyzp1539 5 лет назад
Родитель
Сommit
9b9dc257c7
22 измененных файлов с 1465 добавлено и 475 удалено
  1. 2 2
      pom.xml
  2. 45 6
      src/main/java/com/style24/admin/biz/dao/TsaCustomerDao.java
  3. 10 1
      src/main/java/com/style24/admin/biz/dao/TsaMorebetterDao.java
  4. 45 1
      src/main/java/com/style24/admin/biz/service/TsaCustomerService.java
  5. 35 30
      src/main/java/com/style24/admin/biz/service/TsaKakaoService.java
  6. 14 5
      src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java
  7. 371 11
      src/main/java/com/style24/admin/biz/web/TsaCustomerController.java
  8. 12 0
      src/main/java/com/style24/admin/biz/web/TsaMarketingController.java
  9. 33 2
      src/main/java/com/style24/admin/support/security/TsaAuthenticationProvider.java
  10. 13 19
      src/main/java/com/style24/persistence/domain/Delivery.java
  11. 20 0
      src/main/java/com/style24/persistence/domain/MoreBetter.java
  12. 124 1
      src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml
  13. 31 0
      src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml
  14. 1 0
      src/main/resources/i18n/messages/message_ko_KR.properties
  15. BIN
      src/main/webapp/WEB-INF/lib/gagaframework-web-security-1.7.2-RELEASE.jar
  16. BIN
      src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar
  17. 363 365
      src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html
  18. 148 0
      src/main/webapp/WEB-INF/views/customer/EmailPopupForm.html
  19. 141 0
      src/main/webapp/WEB-INF/views/customer/LmsPopupForm.html
  20. 54 27
      src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html
  21. 1 1
      src/main/webapp/dx5/module/dextuploadx5-application-api.js
  22. 2 4
      src/main/webapp/ux/js/admin.popup.js

+ 2 - 2
pom.xml

@@ -76,9 +76,9 @@
 		<dependency>
 			<groupId>com.gagaframework</groupId>
 			<artifactId>gagaframework-web-security</artifactId>
-			<version>1.7.1-RELEASE</version>
+			<version>1.7.2-RELEASE</version>
 			<scope>system</scope>
-			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-security-1.7.1-RELEASE.jar</systemPath>
+			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-web-security-1.7.2-RELEASE.jar</systemPath>
 		</dependency>
 		<dependency>
 			<groupId>com.gagaframework</groupId>

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

@@ -3,6 +3,8 @@ package com.style24.admin.biz.dao;
 import com.style24.core.support.annotation.ShopDs;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.Order;
 import org.springframework.stereotype.Repository;
 
 import java.util.Collection;
@@ -22,7 +24,7 @@ public interface TsaCustomerDao {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 12
+	 * @since 2021. 01. 12
 	 */
 	Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch);
 
@@ -31,24 +33,61 @@ public interface TsaCustomerDao {
 	 * @param custNo - 고객번호
 	 * @return Customer
 	 * @author jsshin
-	 * @since 2020. 01. 18
+	 * @since 2021. 01. 18
 	 */
-	Customer getCustomerInfo(String custNo);
+	Customer getCustomerInfo(Integer custNo);
 
 	/**
 	 * 회원정보 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 01. 20
 	 */
 	void updateCustomerInfo(Customer customer);
 
+	/**
+	 * 회원 주문내역
+	 * @param custNo - 고객번호
+	 * @return Collection<Order>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<Order> getCustomerOrderList(Integer custNo);
+
+	/**
+	 * 회원상세-주소정보
+	 *
+	 * @param custNo - 고객번호
+	 * @return Collection<Delivery>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	Collection<Delivery> getCustomerDeliveryAddrList(Integer custNo);
+
+	/**
+	 * 회원상세- 기본배송지 초기화
+	 *
+	 * @param delivery -배송지정보
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	void updateCustomerDeliveryAddrDefaultInit(Delivery delivery);
+
+	/**
+	 * 회원상세- 배송지 등록/수정
+	 *
+	 * @param delivery -배송지정보
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	void saveCustomerDeliveryAddr(Delivery delivery);
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2021. 01. 14
 	 */
 	Collection<Customer> getCustomerSecedeList(CustomerSearch customerSearch);
 
@@ -57,7 +96,7 @@ public interface TsaCustomerDao {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2021. 01. 14
 	 */
 	Collection<Customer> getCustomerDormantList(CustomerSearch customerSearch);
 

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

@@ -21,7 +21,7 @@ public interface TsaMorebetterDao {
     /* CSB 진행 */
     /**
      * 다다익선 프로모션 리스트
-     * @param param
+     * @param moreBetter
      * @return
      * @author bin2107
      * @since 2020. 12. 28
@@ -186,5 +186,14 @@ public interface TsaMorebetterDao {
      * @since 2021. 1. 12
      */
     void deleteTmtbBurdenList(MoreBetterBurden moreBetterBurden);
+
+    /**
+     * 다다익선 중복 상품 조회
+     * @param moreBetter
+     * @return
+     * @author bin2107
+     * @since 2021. 1. 12
+     */
+    Collection<MoreBetter> getMorebetterDuplicateList(MoreBetter moreBetter);
     /* // CSB 진행 */
 }

+ 45 - 1
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -6,6 +6,8 @@ import com.style24.core.biz.dao.TscCustomerDao;
 import com.style24.core.biz.service.TscCustomerService;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.Order;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -47,7 +49,7 @@ public class TsaCustomerService {
 	 * @author jsshin
 	 * @since 2020. 01. 18
 	 */
-	public Customer getCustomerInfo(String custNo) {
+	public Customer getCustomerInfo(Integer custNo) {
 		return customerDao.getCustomerInfo(custNo);
 	}
 
@@ -79,6 +81,48 @@ public class TsaCustomerService {
 		coreCustomerService.updateCustomerPassword(customer);
 	}
 
+	/**
+	 * 회원 주문내역
+	 * @param custNo - 고객번호
+	 * @return Collection<Order>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<Order> getCustomerOrderList(Integer custNo) {
+		return customerDao.getCustomerOrderList(custNo);
+	}
+
+	/**
+	 * 회원상세-주소정보
+	 *
+	 * @param custNo - 고객번호
+	 * @return Collection<Delivery>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	public Collection<Delivery> getCustomerDeliveryAddrList(Integer custNo) {
+		return customerDao.getCustomerDeliveryAddrList(custNo);
+	}
+
+	/**
+	 * 회원상세-주소정보 수정
+	 *
+	 * @param delivery - 배송지정보
+	 * @author jsshin
+	 * @since 2021. 1 21.
+	 */
+	@Transactional("shopTxnManager")
+	public void saveCustomerDeliveryAddr(Delivery delivery) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		delivery.setRegNo(userNo);
+		delivery.setUpdNo(userNo);
+		if ("Y".equals(delivery.getDefaultYn())) {
+			customerDao.updateCustomerDeliveryAddrDefaultInit(delivery);
+		}
+		customerDao.saveCustomerDeliveryAddr(delivery);
+	}
+
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

+ 35 - 30
src/main/java/com/style24/admin/biz/service/TsaKakaoService.java

@@ -65,6 +65,40 @@ public class TsaKakaoService {
 			// Do nothing
 		}
 	}
+
+	/**
+	 * 기본 LMS 발송
+	 * @param customer - LMS 정보
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@Transactional("shopTxnManager")
+	public void sendCustomerBasicLms(Customer customer) {
+		SsgDirectMessage dm = new SsgDirectMessage();
+		dm.setFdestine(customer.getCellPhnno());
+
+		GagaMap replaceInfo = new GagaMap();
+		replaceInfo.setString("siteNm", TscConstants.Style24Infomation.SITE_NAME.value());
+		replaceInfo.setString("custNm", customer.getCustNm());
+		replaceInfo.setString("content", customer.getContent());
+		replaceInfo.setString("callcenterTelNo", TscConstants.CALLCENTER_TEL_NO);
+		kakaoSender.sendLms(SsgKakaoSender.KakaoAnswerSq.BasicLms.value(), dm, replaceInfo);
+
+		try {
+			// 고객접촉이력 정보
+			CustContactHst custContactHst = new CustContactHst();
+			custContactHst.setContactType(TscConstants.ContactType.BASIC_LMS.value()); // 접촉유형:회원-기본LMS안내발송
+			custContactHst.setContactMethod(TscConstants.ContactMethod.LMS.value()); // 접촉방법:LMS(공통코드G055)
+			custContactHst.setContactContents("기본LMS안내발송");
+			custContactHst.setReceiverNo(customer.getCustNo());
+			custContactHst.setSenderNo(TsaSession.getInfo().getUserNo());
+			coreCustomerService.createCustomerContactHistory(custContactHst);
+		} catch (Exception e) {
+			log.error("error", e);
+			// Do nothing
+		}
+	}
+
 //
 //	/**
 //	 * 일대일문의 답변 알림톡 발송
@@ -213,35 +247,6 @@ public class TsaKakaoService {
 //		}
 //	}
 //
-//	/**
-//	 * 기본 LMS 발송
-//	 * @param customer - LMS 정보
-//	 * @author gagamel
-//	 * @since 2020. 11. 9
-//	 */
-//	@Transactional("shopTxnManager")
-//	public void sendCustomerBasicLms(AdmCustomer customer) {
-//		SsgDirectMessage dm = new SsgDirectMessage();
-//		dm.setFdestine(customer.getCellPhnno());
-//
-//		GagaMap replaceInfo = new GagaMap();
-//		replaceInfo.setString("siteNm", customer.getSiteNm());
-//		replaceInfo.setString("custNm", customer.getCustNm());
-//		replaceInfo.setString("content", customer.getContent());
-//		replaceInfo.setString("callcenterTelNo", TscConstants.CALLCENTER_TEL_NO);
-//		kakaoSender.sendLms(SsgKakaoSender.KakaoAnswerSq.BasicLms.value(), dm, replaceInfo);
-//
-//		try {
-//			// 고객접촉이력 정보
-//			customer.setContactType("207"); // 접촉유형:회원-기본LMS안내발송
-//			customer.setContactMethod(TscConstants.ContactMethod.LMS.value()); // 접촉방법:LMS(공통코드G055)
-//			customer.setContactContents("기본LMS안내발송");
-//			customer.setReceiverId(customer.getCustNo());
-//			customerService.createCustomerContactHistory(customer);
-//		} catch (Exception e) {
-//			log.error("error", e);
-//			// Do nothing
-//		}
-//	}
+
 
 }

+ 14 - 5
src/main/java/com/style24/admin/biz/service/TsaMorebetterService.java

@@ -4,10 +4,7 @@ import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
-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.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +13,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.style24.admin.biz.dao.TsaMorebetterDao;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 /**
@@ -119,6 +117,9 @@ public class TsaMorebetterService {
         return morebetterDao.getMorebetterBurdenList(tmtbSq);
     }
 
+    public Collection<MoreBetter> getMorebetterDuplicateList(MoreBetter moreBetter) {
+        return morebetterDao.getMorebetterDuplicateList(moreBetter);
+    }
     /**
      * 다다익선 저장
      * @param moreBetter
@@ -130,11 +131,19 @@ public class TsaMorebetterService {
     public void saveMoreBetterDetail(MoreBetter moreBetter) {
         Gson gson = new Gson();
         String jsonData = gson.toJson(moreBetter);
+        log.info("{ saveMoreBetterDetail jsonData}",jsonData);
 
         // <,> replace 처리
         moreBetter.setRegNo(TsaSession.getInfo().getUserNo());
         moreBetter.setUpdNo(TsaSession.getInfo().getUserNo());
 
+        Collection<MoreBetter> dupList = this.getMorebetterDuplicateList(moreBetter);
+
+        log.info("[dupList size]",dupList.size());
+
+        // 업체&브랜드
+
+/*
         // TMTB 마스터(TB_TMTB) 저장
         morebetterDao.saveMorebetterMst(moreBetter);
 
@@ -277,7 +286,7 @@ public class TsaMorebetterService {
 
             morebetterDao.saveMorebetterBurden(regBurden);
         }
-
+*/
         log.info("newBurdenSq = {}, newTmtbSq = {}, newSupplyCd = {}, newBurdenRate = {} , newUseYn = {}");
     }
 

+ 371 - 11
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -6,10 +6,14 @@ import com.gagaframework.web.security.GagaPasswordEncoder;
 import com.style24.admin.biz.service.TsaCustomerService;
 import com.style24.admin.biz.service.TsaKakaoService;
 import com.style24.admin.biz.service.TsaSystemService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.core.support.session.TscSession;
+import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
-import com.sun.xml.internal.bind.v2.TODO;
+import com.style24.persistence.domain.Delivery;
+import com.style24.persistence.domain.Order;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -17,6 +21,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -259,7 +264,7 @@ public class TsaCustomerController extends TsaBaseController {
 	 * 활동회원
 	 * @return ModelAndView
 	 * @author jsshin
-	 * @since 2020. 01. 12
+	 * @since 2021. 01. 12
 	 */
 	@GetMapping("/active/list/form")
 	public ModelAndView customerActiveListForm() {
@@ -290,7 +295,7 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 12
+	 * @since 2021. 01. 12
 	 */
 	@PostMapping("/active/list")
 	@ResponseBody
@@ -304,10 +309,10 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @param custNo - 고객번호
 	 * @return ModelAndView
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2021. 01. 14
 	 */
 	@GetMapping("/detail/form/{custNo}")
-	public ModelAndView getCustomerDetailForm(@PathVariable String custNo) {
+	public ModelAndView getCustomerDetailForm(@PathVariable Integer custNo) {
 		ModelAndView mav = new ModelAndView();
 
 		// 사이트 목록
@@ -380,11 +385,11 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @param custNo - 고객번호
 	 * @return Customer
 	 * @author jsshin
-	 * @since 2020. 01. 18
+	 * @since 2021. 01. 18
 	 */
 	@GetMapping("/info/{custNo}")
 	@ResponseBody
-	public Customer getCustomerInfo(@PathVariable String custNo) {
+	public Customer getCustomerInfo(@PathVariable Integer custNo) {
 		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerInfo(custNo);
 	}
@@ -394,7 +399,7 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @param customer - 고객정보
 	 * @return Customer
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 01. 21
 	 */
 	@PostMapping("/info/save")
 	@ResponseBody
@@ -410,7 +415,7 @@ public class TsaCustomerController extends TsaBaseController {
 	 * @return GagaResponse
 	 * @throws Exception
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 01. 21
 	 */
 	@PostMapping("/password/reset")
 	@ResponseBody
@@ -426,13 +431,368 @@ public class TsaCustomerController extends TsaBaseController {
 		customerService.updateCustomerPassword(customer);
 
 		// 카카오 알림톡
-		kakaoService.sendCustomerTempPassword(customer);
-
+		if (StringUtils.isNotBlank(customer.getCellPhnno())) {
+			kakaoService.sendCustomerTempPassword(customer);
+		}
 		// TODO: 2021.1.20 메일발송 서비스 붙여야함 - jsshin
 
 		return ok(message.getMessage("SUCC_0005"));
 	}
 
+	/**
+	 * 메시지 발송 팝업 화면
+	 *
+	 * @param elementCellPhnno - 휴대폰
+	 * @param elementCustNo - 고객일련번호
+	 * @param division - 호출화면구분
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/lms/popup/form")
+	public ModelAndView lmsPopupForm(@RequestParam(value = "elementCellPhnno", required = false) String elementCellPhnno
+									, @RequestParam(value = "elementCustNo") String elementCustNo
+									, @RequestParam(value = "division", required = false) String division) {
+		ModelAndView mav = new ModelAndView();
+		// 휴대폰 번호
+		mav.addObject("elementCellPhnno", elementCellPhnno);
+
+		// 고객 아이디
+		mav.addObject("elementCustNo", elementCustNo);
+
+		// 접속유형 구분값
+		mav.addObject("division", division);
+
+		mav.addObject("callBack", TscConstants.CALLCENTER_TEL_NO);
+
+		mav.setViewName("customer/LmsPopupForm");
+
+		return mav;
+	}
+
+
+	/**
+	 * 메시지 발송
+	 *
+	 * @param customer -고객정보
+	 * @return GagaResponse
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@PostMapping("/message/send")
+	@ResponseBody
+	public GagaResponse sendMessage(@RequestBody Customer customer) {
+		Customer custInfo = customerService.getCustomerInfo(customer.getCustNo());
+		customer.setCustNm(custInfo.getCustNm());
+
+		if (StringUtils.isNotBlank(customer.getCellPhnno())) {
+			kakaoService.sendCustomerBasicLms(customer);
+		}
+
+		return super.ok(message.getMessage("SUCC_0005"));
+	}
+
+	/**
+	 * 인증번호 발송
+	 *
+	 * @param customer -고객정보
+	 * @return GagaResponse
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@PostMapping("/certno/send")
+	@ResponseBody
+	public GagaResponse sendCustomerCertNo(@RequestBody Customer customer) {
+//		String certNo = GagaStringUtil.getRandomNumber(6);
+//		TsaSession.setAttribute("certNo", certNo);
+//		customer.setCertNo(certNo);
+//		log.info("certNo {}", certNo);
+//
+//		// 카카오알림톡 발송(카카오 템플릿 문구검수 후 변경 해야함)
+//		// 광고가 아니므로 SMS수신동의여부 체크할 필요 없음. 무조건 발송해야 함
+//		if (StringUtils.isNotBlank(customer.getCellPhnno())) {
+//			try {
+//				kakaoService.sendCustomerCertNo(customer);
+//			} catch (Exception e) {
+//				log.error(e.getMessage());
+//			}
+//
+//		}
+
+		return super.ok(message.getMessage("SUCC_0005"));
+	}
+
+	/**
+	 * 인증번호 확인
+	 *
+	 * @param customer -고객정보
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@PostMapping("/certno/confirm")
+	@ResponseBody
+	public Customer confirmCustomerCertNo(@RequestBody Customer customer) {
+		Customer custResult = new Customer();
+//		String certNo = TsaSession.getAttribute("certNo");
+//		String result = "N";
+//		if (certNo.equals(customer.getCrtfdNo())) {
+//			result = "Y";
+//		}
+//		custResult.setCrtfdNoYn(result);
+		return custResult;
+	}
+
+	/**
+	 * 메일 발송 팝업 화면
+	 *
+	 * @param elementEmail  - 이메일
+	 * @param elementCustNo - 고객일련번호
+	 * @param division - 호출화면구분
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/email/popup/form")
+	public ModelAndView emailPopupForm(@RequestParam(value = "elementEmail") String elementEmail
+									, @RequestParam(value = "elementCustNo") String elementCustNo
+									, @RequestParam(value = "division", required = false) String division) {
+
+		ModelAndView mav = new ModelAndView();
+
+		// 받는사람 이메일
+		mav.addObject("elementEmail", elementEmail);
+
+		// 고객 번호
+		mav.addObject("elementCustNo", elementCustNo);
+
+		mav.addObject("sendEmail", TscConstants.REP_EMAIL);
+
+		// 접속유형 구분값
+		mav.addObject("division", division);
+
+		mav.setViewName("customer/EmailPopupForm");
+
+		return mav;
+	}
+
+	/**
+	 * 이메일 발송
+	 *
+	 * @param customer -고객정보
+	 * @return GagaResponse
+	 * @throws Exception
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@PostMapping("/email/send")
+	@ResponseBody
+	public GagaResponse sendEmail(@RequestBody Customer customer) throws Exception {
+		Customer custInfo = customerService.getCustomerInfo(customer.getCustNo());
+		customer.setCustNm(custInfo.getCustNm());
+
+		// 메일 발송
+		if (StringUtils.isNotBlank(customer.getEmail())) {
+			//mailService.sendBasicMail(customer);
+		}
+
+		return super.ok(message.getMessage("SUCC_0005"));
+	}
+
+	/**
+	 * 회원상세-주문내역목록
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Order>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/order/list/{custNo}")
+	@ResponseBody
+	public Collection<Order> getCustomerOrderList(@PathVariable Integer custNo) {
+		return customerService.getCustomerOrderList(custNo);
+	}
+
+	/**
+	 * 회원상세-주소정보
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Delivery>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/delivery/list/{custNo}")
+	@ResponseBody
+	public Collection<Delivery> getCustomerDeliveryList(@PathVariable Integer custNo) {
+		return customerService.getCustomerDeliveryAddrList(custNo);
+	}
+
+	/**
+	 * 회원상세 - 주소지 저장
+	 *
+	 * @param delivery -배송지정보
+	 * @return GagaResponse
+	 * @author jsshin
+	 * @since 2021. 1. 21.
+	 */
+	@PostMapping("/delivery/addr/save")
+	@ResponseBody
+	public GagaResponse saveCustomerDeliveryAddr(@RequestBody Delivery delivery) {
+		customerService.saveCustomerDeliveryAddr(delivery);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+	/**
+	 * 회원상세-1:1문의내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/counsel/list/{custNo}")
+	@ResponseBody
+	public Collection<Counsel> getCustomerCounselList(@PathVariable Integer custNo) {
+		//return customerService.getCustomerCounselList(custNo);
+		return null;
+	}
+
+	/**
+	 * 회원상세-상품문의내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Counsel>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/goodsQna/list/{custNo}")
+	@ResponseBody
+	public Collection<Counsel> getCustomerGoodsQnaList(@PathVariable Integer custNo) {
+		//return customerService.getCustomerGoodsQnaList(custNo);
+		return null;
+	}
+
+	/**
+	 * 회원상세-상품문의 상세화면
+	 *
+	 * @param counselSq -상담일련번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/goodsQna/detail/form/{counselSq}")
+	public ModelAndView goodsQnaDetailForm(@PathVariable String counselSq) {
+		ModelAndView mav = new ModelAndView();
+		// 문의상세
+		//mav.addObject("goodsQna", customerService.getGoodsQnaDetail(counselSq));
+		mav.setViewName("customer/GoodsQnaPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 회원상세-쿠폰내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Coupon>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/coupon/list/{custNo}")
+	@ResponseBody
+	public Collection<Coupon> getCustomerCouponList(@PathVariable Integer custNo) {
+		//return customerService.getCustomerCouponList(custNo);
+		return null;
+	}
+
+	/**
+	 * 회원상세-포인트
+	 *
+	 * @param custNo -고객일련번호
+	 * @return TsaPoint
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+//	@GetMapping("/point/{custNo}")
+//	@ResponseBody
+//	public Point getCustomerPoint(@PathVariable Integer custNo) {
+//		return customerService.getCustomerPoint(custNo);
+//	}
+
+	/**
+	 * 회원상세-포인트내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<TsaPoint>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+//	@GetMapping("/point/list/{custNo}")
+//	@ResponseBody
+//	public Collection<TsaPoint> getCustomerPointList(@PathVariable Integer custNo) {
+//		return customerService.getCustomerPointList(custNo);
+//	}
+
+	/**
+	 * 회원상세-상품평내역
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<TsaReview>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+//	@GetMapping("/review/list/{custNo}")
+//	@ResponseBody
+//	public Collection<Review> getCustomerReviewList(@PathVariable Integer custNo) {
+//		return customerService.getCustomerReviewList(custNo);
+//	}
+
+	/**
+	 * 회원상세-회원등급변경이력
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<TsaCustomer>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+//	@GetMapping("/change/grade/list/{custNo}")
+//	@ResponseBody
+//	public Collection<TsaCustomer> getCustomerChageGradeList(@PathVariable Integer custNo) {
+//		return customerService.getCustomerChangeGradeList(custNo);
+//	}
+
+
+	/**
+	 * 회원상세-회원접촉이력
+	 *
+	 * @param custNo -고객일련번호
+	 * @return Collection<Customer>
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/contact/list/{custNo}")
+	@ResponseBody
+	public Collection<Customer> getCustomerContactList(@PathVariable Integer custNo) {
+		//return customerService.getCustomerContactList(custNo);
+		return null;
+	}
+
+	/**
+	 * 회원상세-회원접촉이력 생성
+	 *
+	 * @param customer -고객정보
+	 * @return GagaResponse
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@PostMapping("/contact/create")
+	@ResponseBody
+	public GagaResponse createCustomerContactHistory(@RequestBody Customer customer) {
+//		customer.setReceiverId(customer.getCustNo());
+//		customerService.createCustomerContactHistory(customer);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
+
 	/**
 	 * 탈퇴회원
 	 * @return ModelAndView

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

@@ -4,6 +4,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.style24.persistence.TscPageRequest;
 import com.style24.persistence.domain.*;
 import org.apache.commons.lang3.StringUtils;
@@ -575,6 +577,16 @@ public class TsaMarketingController extends TsaBaseController {
 	@PostMapping("/morebetter/save")
 	@ResponseBody
 	public GagaResponse saveMorebetterDetail(@RequestBody MoreBetter moreBetter) {
+		log.info("18 moreBetter::::::::{}",moreBetter);
+		String[] supplyCompList2 = moreBetter.getSupplyCompArr().split(",");
+		String[] brandList2 = moreBetter.getBrandArr().split(",");
+		//String[] supplyCompList2 = {"1","2"};
+		//String[] brandList2 = {"S001","S006"};
+
+
+		moreBetter.setMultiSupplyCompCd(supplyCompList2);
+		moreBetter.setMultiBrand(brandList2);
+		log.info("19 moreBetter::::::::{}",moreBetter);
 		morebetterService.saveMoreBetterDetail(moreBetter);
 		return super.ok(message.getMessage("SUCC_0001"));
 	}

+ 33 - 2
src/main/java/com/style24/admin/support/security/TsaAuthenticationProvider.java

@@ -3,6 +3,7 @@ package com.style24.admin.support.security;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -13,13 +14,13 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.stereotype.Component;
 
 import com.style24.admin.biz.service.TsaLoginService;
+import com.style24.admin.support.security.session.TsaSession;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.persistence.domain.User;
 
 import lombok.extern.slf4j.Slf4j;
 
 import com.gagaframework.web.security.GagaPasswordEncoder;
-import com.gagaframework.web.util.GagaCryptoUtil;
 
 /**
  * 로그인 인증 처리
@@ -60,7 +61,6 @@ public class TsaAuthenticationProvider implements AuthenticationProvider {
 			throw new BadCredentialsException(message.getMessage("LOGN_0005"));
 		}
 
-		log.info("encoded password: {}", GagaCryptoUtil.encryptSha512(passwd));
 		boolean isMatch = passwordEncoder.matches(passwd, loginInfo.getPasswd());
 		log.info("isMatch: {}", isMatch);
 
@@ -70,6 +70,11 @@ public class TsaAuthenticationProvider implements AuthenticationProvider {
 			throw new BadCredentialsException(message.getMessage("LOGN_0002"));
 		}
 
+		// IP주소 체크
+		if (!matchIpAddress(loginInfo.getIpChkYn(), loginInfo.getIpAddr())) {
+			throw new BadCredentialsException(message.getMessage("LOGN_0005"));
+		}
+
 		// 권한 설정
 		List<SimpleGrantedAuthority> authorities = new ArrayList<>();
 		authorities.add(new SimpleGrantedAuthority(loginInfo.getRoleCd()));
@@ -87,4 +92,30 @@ public class TsaAuthenticationProvider implements AuthenticationProvider {
 		return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
 	}
 
+	/**
+	 * IP주소 체크
+	 * @param ipChkYn - IP주소체크여부
+	 * @param loginIpAddr - 로그인IP주소
+	 * @return
+	 */
+	private boolean matchIpAddress(String ipChkYn, String loginIpAddr) {
+		String requestIpAddr = TsaSession.getIpAddress();
+
+		log.info("ipChkYn: {}, request ip address: {} vs user's ip address: {}", ipChkYn, requestIpAddr, loginIpAddr);
+
+		if (ipChkYn.equals("N")) {
+			return true;
+		}
+
+		if (!StringUtils.isNotBlank(loginIpAddr)) {
+			return true;
+		}
+
+		if (!loginIpAddr.equals(requestIpAddr)) {
+			return false;
+		}
+
+		return true;
+	}
+
 }

+ 13 - 19
src/main/java/com/style24/persistence/domain/Delivery.java

@@ -37,7 +37,18 @@ public class Delivery extends TscBaseDomain {
 	private String searchTxt;
 	private String colorCd;
 	private String sysImgNm;
-	
+	private String delvAddrNm;
+	private String defaultYn;
+	private String recipNm;
+	private String recipTelno;
+	private String recipPhnno;
+	private String recipZipNo;
+	private String recipBaseAddr;
+	private String recipDtlAddr;
+	private String delvMemo;
+	private String delYn;
+	private Integer custNo;
+	private Integer custDelvAddrSq;
 	
 	/* 위로  작성  ('' ) ( '')*/
 	
@@ -56,10 +67,8 @@ public class Delivery extends TscBaseDomain {
 	private String mallGb;
 	private String mallGbNm;
 	private String ordStat;
-	private String custNo;
 	private String orderNm;
 	private String orderEmail;
-	private String recipNm;
 	private String colorKnm;
 
 	private Integer ordQty;
@@ -79,7 +88,6 @@ public class Delivery extends TscBaseDomain {
 	private String extmallOrdDtlNo;
 	private String supplyCompNm;
 	private String supplyGoodsCd;
-	private String delvMemo;
 	private String ordExchGb;
 	private String frontGb;
 	private String termGb;
@@ -158,11 +166,7 @@ public class Delivery extends TscBaseDomain {
 	private String extmallNm;
 	private String productId;
 
-	private String recipTelno;
-	private String recipPhnno;
-	private String recipPostNo;
-	private String recipBaseAddr;
-	private String recipDtlAddr;
+
 	private String dasRecipStsCd;
 	private String dasRecipIngDt;
 	private String dasRecipCplDt;
@@ -185,14 +189,9 @@ public class Delivery extends TscBaseDomain {
 	private String delvArId;
 	private String rejectReason;
 	private String chulgoQty;
-
 	private String ordExchGbYn;
 	private String payStDate;
 	private String payEdDate;
-
-	private String delYn;
-
-
 	private String goodsStatNm;
 
 	private String stDt;
@@ -201,11 +200,6 @@ public class Delivery extends TscBaseDomain {
 	private String goodsGb;
 
 	private String colorGrpFile;
-
-	private String custDelvAddrSq;
-	private String delvAddrNm;
-	private String defaultYn;
-	private String recipEmail;
 	private Integer invoiceQty;
 
 	private String delayDt;

+ 20 - 0
src/main/java/com/style24/persistence/domain/MoreBetter.java

@@ -1,5 +1,6 @@
 package com.style24.persistence.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.style24.persistence.TscBaseDomain;
 import com.style24.persistence.TscPageRequest;
 import lombok.Data;
@@ -62,6 +63,25 @@ public class MoreBetter extends TscBaseDomain {
 	private String exceptGoodsList;
 	private String burdenList;
 	private String sectionGbList;
+	private String compBrandGoodsList;
+
+	private String supplyCompArr;
+	private String brandArr;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] arrCompBrandGoods;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiSupplyCompCd;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] multiBrand;
+
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] supplyCompList2; // 고시항목
+	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
+	private String[] brandList2; // 고시항목
+
 
 	// Pagination
 	private TscPageRequest pageable;

+ 124 - 1
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -115,7 +115,7 @@
 	</select>
 
 	<!-- 회원기본정보 -->
-	<select id="getCustomerInfo" parameterType="String" resultType="Customer">
+	<select id="getCustomerInfo" parameterType="Integer" resultType="Customer">
 		/* TsaCustomer.getCustomerInfo */
 		SELECT CUST_NO
 		     , CUST_ID
@@ -234,6 +234,129 @@
 		WHERE CUST_NO = #{custNo}
 	</update>
 
+	<!-- 회원 주문내역 -->
+	<select id="getCustomerOrderList" parameterType="Integer" resultType="Order">
+		/* TsaCustomer.getCustomerOrderList */
+		SELECT O.SITE_CD
+		     , O.ORD_NO
+		     , O.MALL_GB
+		     , OD.ORD_DTL_NO
+		     , DATE_FORMAT(O.PAY_DT, '%Y%m%d%H%i%S') AS PAY_DT
+		     , OD.DELV_STDT
+		     , OD.DELV_EDDT
+		     , O.ORD_TELNO
+		     , O.ORD_PHNNO
+		     , OD.ORD_DTL_STAT
+		     , OD.GOODS_CD
+		     , ODI.OPT_CD1              -- 색상
+		     , ODI.OPT_CD2              -- 사이즈
+		     , E.GOODS_NM
+		     , OD.ORD_QTY
+		     , OD.CURR_PRICE
+		     , C.CUST_NO
+		     , DA.RECIP_NM
+		FROM   TB_CUSTOMER C
+		     , TB_ORDER O
+		     , TB_ORDER_DETAIL OD
+		     , TB_ORDER_DETAIL_ITEM ODI
+		     , TB_GOODS E
+		     , TB_DELIVERY_ADDR DA
+		WHERE  C.CUST_NO = O.CUST_NO
+		AND    O.ORD_NO = OD.ORD_NO
+		AND    OD.ORD_NO = ODI.ORD_NO
+		AND    OD.ORD_DTL_NO = ODI.ORD_DTL_NO
+		AND    OD.GOODS_CD = E.GOODS_CD
+		AND    OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
+		AND    C.CUST_NO = #{custNo}
+		ORDER BY O.ORD_NO DESC, OD.ORD_DTL_NO
+	</select>
+
+	<!-- 주소정보 내역 -->
+	<select id="getCustomerDeliveryAddrList" parameterType="Integer" resultType="Delivery">
+		/* TsaCustomer.getCustomerDeliveryAddrList */
+		SELECT C.CUST_ID
+		     , C.CUST_NO
+		     , CDA.CUST_DELV_ADDR_SQ
+		     , CDA.CUST_NO
+		     , CDA.DELV_ADDR_NM
+		     , CDA.DEFAULT_YN
+		     , CDA.RECIP_NM
+		     , CDA.RECIP_PHNNO
+		     , CDA.RECIP_TELNO
+		     , CDA.RECIP_BASE_ADDR
+		     , CDA.RECIP_DTL_ADDR
+		     , CDA.DEL_YN
+		     , FN_GET_USER_NM(CDA.REG_NO)              AS REG_NM
+		     , DATE_FORMAT(CDA.REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(CDA.UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(CDA.UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_CUSTOMER C
+		     , TB_CUST_DELIVERY_ADDR CDA
+		WHERE  C.CUST_NO = CDA.CUST_NO
+		AND    C.CUST_NO = #{custNo}
+	</select>
+
+	<!-- 주소정보 - 기본배송지 초기화 -->
+	<update id="updateCustomerDeliveryAddrDefaultInit" parameterType="Delivery">
+		/* TsaCustomer.updateCustomerDeliveryAddrDefaultInit */
+		UPDATE TB_CUST_DELIVERY_ADDR
+		SET    DEFAULT_YN = 'N'
+		WHERE  CUST_NO = #{custNo}
+		AND    DEFAULT_YN = 'Y'
+		AND    DEL_YN = 'N'
+	</update>
+
+	<!--주소정보 등록/수정 -->
+	<update id="saveCustomerDeliveryAddr" parameterType="Delivery">
+		/* TsaCustomer.saveCustomerDeliveryAddr */
+		INSERT INTO TB_CUST_DELIVERY_ADDR (
+		       CUST_NO
+		     , DELV_ADDR_NM
+		     , DEFAULT_YN
+		     , RECIP_NM
+		     , RECIP_PHNNO
+		     , RECIP_TELNO
+		     , RECIP_ZIP_NO
+		     , RECIP_BASE_ADDR
+		     , RECIP_DTL_ADDR
+		     , DELV_MEMO
+		     , DEL_YN
+		     , REG_NO
+		     , REG_DT
+		     , UPD_NO
+		     , UPD_DT
+		)
+		VALUES (
+		       #{custNo}
+		     , #{delvAddrNm}
+		     , #{defaultYn}
+		     , #{recipNm}
+		     , #{recipPhnno}
+		     , #{recipTelno}
+		     , #{recipZipNo}
+		     , #{recipBaseAddr}
+		     , #{recipDtlAddr}
+		     , #{delvMemo}
+		     , #{delYn}
+		     , #{regNo}
+		     , NOW()
+		     , #{updNo}
+		     , NOW()
+		)
+		ON DUPLICATE KEY UPDATE
+		       DELV_ADDR_NM = #{delvAddrNm}
+		     , DEFAULT_YN = IFNULL(#{defaultYn}, 'N')
+		     , RECIP_NM = #{recipNm}
+		     , RECIP_PHNNO = #{recipPhnno}
+		     , RECIP_TELNO = #{recipTelno}
+		     , RECIP_ZIP_NO = #{recipZipNo}
+		     , RECIP_BASE_ADDR = #{recipBaseAddr}
+		     , RECIP_DTL_ADDR  = #{recipDtlAddr}
+		     , DEL_YN = IFNULL(#{delYn}, 'N')
+		     , UPD_NO = #{updNo}
+		     , UPD_DT = NOW()
+	</update>
+
 	<!-- 탈퇴회원목록 -->
 	<select id="getCustomerSecedeList" parameterType="CustomerSearch" resultType="Customer">
 		/* TsaCustomer.getSecedeCustomerList */

+ 31 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaMorebetter.xml

@@ -483,5 +483,36 @@
 			</foreach>
 		</if>
 	</delete>
+
+	<select id="getMorebetterDuplicateList" parameterType="MoreBetter" resultType="MoreBetter">
+		/* TsaMarketing.getMorebetterDuplicateList */
+		SELECT 		B.TMTB_SQ
+			 		, SUM(CASE WHEN B.GOODS_GB = 'G800_30' THEN -1 ELSE 1 END) USE_YN
+		FROM 		TB_TMTB A
+		INNER JOIN  TB_TMTB_APPLY_GOODS B
+			ON A.TMTB_SQ = B.TMTB_SQ
+		WHERE 1=1
+		  AND NOW() BETWEEN DATE_FORMAT(A.TMTB_ST_DT, '%Y-%m-%d %H:%i:%S') AND DATE_FORMAT(A.TMTB_ED_DT, '%Y-%m-%d %H:%i:%S')	-- 적용날짜에 속하고
+		  AND A.TMTB_STAT = 'G232_11'
+		  AND B.DEL_YN = 'N'
+		  AND EXISTS (SELECT 1
+					  FROM TB_GOODS G
+					  WHERE 1=1
+						AND B.GOODS_CD = G.GOODS_CD
+						<if test="multiSupplyCompCd != null and multiSupplyCompCd != ''">
+							AND G.SUPPLY_COMP_CD IN
+							<foreach collection="multiSupplyCompCd" item="item" index="index"  open="(" close=")" separator=",">
+								#{item}
+							</foreach>
+						</if>
+						<if test="multiBrand != null and multiBrand != ''">
+							AND G.BRAND_CD IN
+							<foreach collection="multiBrand" item="item" index="index"  open="(" close=")" separator=",">
+								#{item}
+							</foreach>
+						</if>
+			)
+		GROUP BY B.TMTB_SQ
+	</select>
 	<!--// CSB 진행 -->
 </mapper>

+ 1 - 0
src/main/resources/i18n/messages/message_ko_KR.properties

@@ -30,6 +30,7 @@ LOGN_0001=\uc785\ub825\ud558\uc2e0 \uc815\ubcf4\ub85c \uac00\uc785\ub41c \ub0b4\
 LOGN_0002=\ube44\ubc00\ubc88\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
 LOGN_0003=\ub85c\uadf8\uc778 \uc0c1\ud0dc\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ub2e4\uc2dc \ub85c\uadf8\uc778 \ud574\uc8fc\uc138\uc694.
 LOGN_0004=\ube44\ubc00\ubc88\ud638\ub97c \ubcc0\uacbd\ud55c \ub0a0\ub85c\ubd80\ud130 3\uac1c\uc6d4\uc774 \uacbd\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
+LOGN_0005=\uc811\uc18d \uac00\ub2a5\ud55c IP\uc8fc\uc18c\uac00 \uc544\ub2d9\ub2c8\ub2e4.
 
 ##\uc8fc\ubb38
 ORDER_0001=\uc8fc\ubb38\uc815\ubcf4\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.

BIN
src/main/webapp/WEB-INF/lib/gagaframework-web-security-1.7.1-RELEASE.jar → src/main/webapp/WEB-INF/lib/gagaframework-web-security-1.7.2-RELEASE.jar


BIN
src/main/webapp/WEB-INF/lib/gagaframework-web-util-1.7-RELEASE.jar


+ 363 - 365
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -7,11 +7,11 @@
  * @desc    : 회원 상세 팝업 Page
  *============================================================================
  * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
+ * Copyright(C) 2021 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2020.01.18   jsshin     최초 작성
+ * 1.0  2021.01.18   jsshin     최초 작성
  *******************************************************************************
  -->
 <div class="modalPopup" id="popupCustomerDetail" data-width="1600">
@@ -37,7 +37,7 @@
 				<tbody>
 				<th>이름</th>
 				<td>
-					<span id="custNm" name="custNm"></span>
+					<span id="spanCustNm" name="spanCustNm"></span>
 					<span id="managedRsnNm" name="managedRsnNm" class="infoTxt cRed h5"></span>
 				</td>
 				<th>아이디</th>
@@ -80,142 +80,147 @@
 					<li class="tab on" id="tab1">
 						<!-- TAB1 PANELSTYLE -->
 						<div class="panelStyle">
-							<h4>기본정보</h4>
-							<table class="frmStyle">
-								<colgroup>
-									<col style="width:10%;"/>
-									<col style="width:40%;"/>
-									<col style="width:10%;"/>
-									<col/>
-								</colgroup>
-								<tbody>
-								<tr>
-									<th class="dashR">회원구분<i class="star"></i></th>
-									<td class="dashR">
-										<select id="custGb" name="custGb">
-											<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-									</td>
-									<th class="dashR">회원등급<i class="star"></i></th>
-									<td class="dashR">
-										<select id="custGrade" name="custGrade">
-											<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">관리대상</th>
-									<td class="dashR">
-										<select id="managedRsn" name="managedRsn">
-											<option value="">일반</option>
-											<option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-										<span class="infoTxt cRed h5" id="managedRsnDp" name="managedRsnDp"></span>
-									</td>
-									<th class="dashR">관리대상 지정 날짜</th>
-									<td class="dashR" id="managedDt" name="managedDt">
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">관리대상 지정 사유</th>
-									<td class="dashR" colspan="3">
-										<input type="text" id="managedDtlRsn" name="managedDtlRsn" class="w600" />
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">비밀번호</th>
-									<td class="dashR" colspan="3">
-										*******
-										<button type="button" id="btnResetPassword" class="btn btn-info btn-lg">초기화</button>
-										<span class="infoTxt cBlue">
-											<i class="fa fa-info-circle"></i>회원에게 임시비밀번호를 발송합니다. (이메일, 알림톡)
-										</span>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">생년월일</th>
-									<td class="dashR">
-										<input type="text" id="birthYmd" name="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
-									</td>
-									<th class="dashR">성별</th>
-									<td class="dashR" id="sexGb" name="sexGb"></td>
-								</tr>
-								<tr>
-									<th class="dashR">자택주소</th>
-									<td class="dashR" colspan="3">
-										<input type="text" id="homePostNo" name="homePostNo" class="w100" readonly="readonly"/>
-										<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfo');">우편번호찾기</button>
-										<br/>
-										<input type="text" id="homeBaseAddr" name="homeBaseAddr" class="w300" readonly="readonly"/>
-										<input type="text" id="homeDtlAddr" name="homeDtlAddr" class="w300"/>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">휴대전화번호<i class="star"></i></th>
-									<td class="dashR">
-										<select id="cellPhnno1" name="cellPhnno1">
-											<option value="">선택</option>
-											<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
-													th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
-										</select> -
-										<input type="text" id="cellPhnno2" name="cellPhnno2" class="w50" maxlength="4" required="required"
-											   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
-										<input type="text" id="cellPhnno3" name="cellPhnno3" class="w50" maxlength="4" required="required"
-											   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
-										<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
-										<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
-									</td>
-									<th class="dashR">SMS수신여부<i class="star"></i></th>
-									<td class="dashR">
-										<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
-										<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">이메일<i class="star"></i></th>
-									<td class="dashR">
-										<input type="text" id="email1" name="email1" class="w300"/>
-										@
-										<input type="text" id="email2" name="email2" class="w150"/>
-										<select name="emailDomain">
-											<option value="">선택하세요</option>
-											<option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-										<button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
-									</td>
-									<th class="dashR">메일수신여부<i class="star"></i></th>
-									<td class="dashR">
-										<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
-										<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">가입일시</th>
-									<td class="dashR" id="joinDt" name="joinDt"></td>
-									<th class="dashR">최종로그인일시</th>
-									<td class="dashR" id="loginDt" name="loginDt"></td>
-								</tr>
-								<tr>
-									<th class="dashR">내외국인</th>
-									<td class="dashR" id="foreignerYn" name="foreignerYn"></td>
-									<th class="dashR">탈퇴여부</th>
-									<td class="dashR" id="secedeRsnYn" name="secedeRsnYn"></td>
-								</tr>
-								<tr>
-									<th class="dashR">SNS가입유형</th>
-									<td class="dashR" id="snsType" name="snsType" colspan="3"></td>
-								</tr>
-								</tbody>
-							</table>
-							<ul class="panelBar">
-								<li class="right">
-									<button type="button" id="btnCustInfoSave" class="btn btn-success btn-lg">저장</button>
-								</li>
-							</ul>
+							<form id="custInfoForm" name="custInfoForm" action="#" method="post">
+								<input type="hidden" name="custNo" th:value="${custNo}"/>
+								<h4>기본정보</h4>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:10%;"/>
+										<col style="width:40%;"/>
+										<col style="width:10%;"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th class="dashR">회원구분<i class="star"></i></th>
+										<td class="dashR">
+											<select id="custGb" name="custGb">
+												<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+										</td>
+										<th class="dashR">회원등급<i class="star"></i></th>
+										<td class="dashR">
+											<select id="custGrade" name="custGrade">
+												<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상</th>
+										<td class="dashR">
+											<select id="managedRsn" name="managedRsn">
+												<option value="">일반</option>
+												<option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+											<span class="infoTxt cRed h5" id="managedRsnDp" name="managedRsnDp"></span>
+										</td>
+										<th class="dashR">관리대상 지정 날짜</th>
+										<td class="dashR" id="managedDt" name="managedDt">
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상 지정 사유</th>
+										<td class="dashR" colspan="3">
+											<input type="text" id="managedDtlRsn" name="managedDtlRsn" class="w600" />
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">비밀번호</th>
+										<td class="dashR" colspan="3">
+											*******
+											<button type="button" id="btnResetPassword" class="btn btn-info btn-lg">초기화</button>
+											<span class="infoTxt cBlue">
+												<i class="fa fa-info-circle"></i>회원에게 임시비밀번호를 발송합니다. (이메일, 알림톡)
+											</span>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">생년월일</th>
+										<td class="dashR">
+											<input type="text" id="birthYmd" name="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
+										</td>
+										<th class="dashR">성별</th>
+										<td class="dashR" id="sexGb" name="sexGb"></td>
+									</tr>
+									<tr>
+										<th class="dashR">자택주소</th>
+										<td class="dashR" colspan="3">
+											<input type="text" id="homePostNo" name="homePostNo" class="w100" readonly="readonly"/>
+											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfoForm');">우편번호찾기</button>
+											<br/>
+											<input type="text" id="homeBaseAddr" name="homeBaseAddr" class="w300" readonly="readonly"/>
+											<input type="text" id="homeDtlAddr" name="homeDtlAddr" class="w300"/>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">휴대전화번호<i class="star"></i></th>
+										<td class="dashR">
+											<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
+											<select id="firstNo" name="firstNo">
+												<option value="">선택</option>
+												<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
+														th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
+											</select> -
+											<input type="text" id="middleNo" name="middleNo" class="w50" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
+											<input type="text" id="lastNo" name="lastNo" class="w50" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
+											<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
+											<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
+										</td>
+										<th class="dashR">SMS수신여부<i class="star"></i></th>
+										<td class="dashR">
+											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
+											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">이메일<i class="star"></i></th>
+										<td class="dashR">
+											<input type="hidden" name="email" data-valid-name="이메일"/>
+											<input type="text" id="emailId" name="emailId" class="w300"/>
+											@
+											<input type="text" id="emailDomain" name="emailDomain" class="w150"/>
+											<select id="emailDomainList" name="emailDomainList">
+												<option value="">선택하세요</option>
+												<option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+											<button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
+										</td>
+										<th class="dashR">메일수신여부<i class="star"></i></th>
+										<td class="dashR">
+											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
+											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">가입일시</th>
+										<td class="dashR" id="joinDt" name="joinDt"></td>
+										<th class="dashR">최종로그인일시</th>
+										<td class="dashR" id="loginDt" name="loginDt"></td>
+									</tr>
+									<tr>
+										<th class="dashR">내외국인</th>
+										<td class="dashR" id="foreignerYn" name="foreignerYn"></td>
+										<th class="dashR">탈퇴여부</th>
+										<td class="dashR" id="secedeRsnYn" name="secedeRsnYn"></td>
+									</tr>
+									<tr>
+										<th class="dashR">SNS가입유형</th>
+										<td class="dashR" id="snsType" name="snsType" colspan="3"></td>
+									</tr>
+									</tbody>
+								</table>
+								<ul class="panelBar">
+									<li class="right">
+										<button type="button" id="btnCustInfoSave" class="btn btn-success btn-lg">저장</button>
+									</li>
+								</ul>
+							</form>
 						</div>
 						<!-- //TAB1 PANELSTYLE -->
 					</li>
@@ -236,80 +241,88 @@
 					<li id="tab3" class="tab">
 						<!-- TAB3 PANELSTYLE -->
 						<div class="panelStyle">
-							<h4>배송지정보</h4>
-							<div id="custAddrList" class="ag-theme-balham" style="width: 100%; height: 300px;" ></div>
+							<form id="custAddrForm" name="custAddrForm" action="#" method="post">
+								<input type="hidden" name="custNo" th:value="${custNo}"/>
+								<h4>배송지정보</h4>
+								<div id="custAddrList" class="ag-theme-balham" style="width: 100%; height: 300px;" ></div>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:5%;"/>
+										<col style="width:25%;"/>
+										<col style="width:5%;"/>
+										<col style="width:25%;"/>
+										<col style="width:5%;"/>
+										<col style="width:25%;"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th>배송지명<i class="star"></i></th>
+										<td>
+											<input type="text" class="w200" name="delvAddrNm" maxlength="30" required="required" data-valid-name="배송지명"/>
+											<label class="chkBox">
+												<input type="checkbox" name="defaultYn" value="Y"/>기본
+											</label>
+										</td>
+										<th>수령인<i class="star"></i></th>
+										<td>
+											<input type="text" class="w200" name="recipNm" maxlength="10" required="required" data-valid-name="수령인"/>
+										</td>
+										<th>삭제여부</th>
+										<td>
+											<label class="chkBox">
+												<input type="checkbox" name="delYn" value="Y"/>
+											</label>
+										</td>
+									</tr>
+									<tr>
+										<th>전화번호</th>
+										<td>
+											<input th:type="hidden" id="recipTelno" name="recipTelno">
+											<select class="w100" id="telFirstNo" name="telFirstNo"/>
+												<option value="">선택</option>
+												<option th:if="${nationalNumberList}" th:each="oneData, status : ${nationalNumberList}"
+														th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
+											</select> -
+											<input type="text" class="w100" name="telMiddleNo" maxlength="4" data-valid-type="numeric"
+												   data-valid-name="전화번호"/> -
+											<input type="text" class="w100" name="telLastNo" maxlength="4" data-valid-type="numeric"
+												   data-valid-name="전화번호"/>
+										</td>
+										<th>휴대전화번호<i class="star"></i></th>
+										<td colspan="4">
+											<input th:type="hidden" id="recipPhnno" name="recipPhnno"/>
+											<select class="w100" id="recipFirstNo" name="recipFirstNo">
+												<option value="">선택</option>
+												<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
+														th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
+											</select> -
+											<input type="text" class="w100" id="recipMiddleNo" name="recipMiddleNo" maxlength="4" required="required" data-valid-type="numeric"
+												   data-valid-name="휴대전화번호"/> -
+											<input type="text" class="w100" id="recipLastNo" name="recipLastNo" maxlength="4" required="required" data-valid-type="numeric"
+												   data-valid-name="휴대전화번호"/>
+										</td>
+									</tr>
+									<tr>
+										<th>주소<i class="star"></i></th>
+										<td colspan="5">
+											<input type="text" id="recipZipNo" name="recipZipNo" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
+											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custAddrForm');">우편번호찾기</button>
+											<br/>
+											<input type="text" id="recipBaseAddr" name="recipBaseAddr" class="w300" maxlength="50" required="required" data-valid-name="주소"/>
+											<input type="text" id="recipDtlAddr" name="recipDtlAddr" class="w300" maxlength="30" required="required" data-valid-name="상세주소"/>
+										</td>
+									</tr>
+									</tbody>
+								</table>
+								<ul class="panelBar">
+									<li class="right">
+										<button type="button" class="btn btn-info btn-lg" id="btnCustAddrNew">신규</button>
+										<button type="button" class="btn btn-success btn-lg" id="btnCustAddrSave">저장</button>
+									</li>
+								</ul>
+							</form>
 						</div>
-						<ul class="panelBar">
-							<li class="right">
-								<button type="button" class="btn btn-info btn-lg" id="btnCustAddrNew">신규</button>
-								<button type="button" class="btn btn-success btn-lg" id="btnCustAddrSave">저장</button>
-							</li>
-						</ul>
-						<table class="frmStyle">
-							<colgroup>
-								<col style="width:5%;"/>
-								<col style="width:25%;"/>
-								<col style="width:5%;"/>
-								<col style="width:25%;"/>
-								<col style="width:5%;"/>
-								<col style="width:25%;"/>
-								<col/>
-							</colgroup>
-							<tbody>
-							<tr>
-								<th>배송지명<i class="star"></i></th>
-								<td>
-									<input type="text" class="w200" name="delvAddrNm" maxlength="30" required="required" data-valid-name="배송지명"/>
-									<label><input type="checkbox" name="defaultYn" value="Y"/>기본</label>
-								</td>
-
-								<th>이메일</th>
-								<td>
-									<input type="text" class="w200" name="recipEmail" maxlength="50" data-valid-type="email" data-valid-name="이메일"/>
-								</td>
-
-								<th>삭제여부</th>
-								<td>
-									<label><input type="checkbox" name="delYn" value="Y"/></label>
-								</td>
-							</tr>
-							<tr>
-								<th>수령인<i class="star"></i></th>
-								<td>
-									<input type="text" class="w200" name="recipNm" maxlength="10" required="required" data-valid-name="수령인"/>
-								</td>
-
-								<th>전화번호</th>
-								<td>
-									<input type="text" class="w100" name="recipTelno1" maxlength="4" data-valid-type="numeric"
-										   data-valid-name="전화번호"/> -
-									<input type="text" class="w100" name="recipTelno2" maxlength="4" data-valid-type="numeric"
-										   data-valid-name="전화번호"/> -
-									<input type="text" class="w100" name="recipTelno3" maxlength="4" data-valid-type="numeric"
-										   data-valid-name="전화번호"/>
-								</td>
-								<th>휴대전화번호<i class="star"></i></th>
-								<td>
-									<input type="text" class="w100" name="recipPhnno1" maxlength="4" required="required" data-valid-type="numeric"
-										   data-valid-name="휴대전화번호"/> -
-									<input type="text" class="w100" name="recipPhnno2" maxlength="4" required="required" data-valid-type="numeric"
-										   data-valid-name="휴대전화번호"/> -
-									<input type="text" class="w100" name="recipPhnno3" maxlength="4" required="required" data-valid-type="numeric"
-										   data-valid-name="휴대전화번호"/>
-								</td>
-							</tr>
-							<tr>
-								<th>주소<i class="star"></i></th>
-								<td colspan="5">
-									<input type="text" name="recipPostNo" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
-									<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custAddr');">우편번호찾기</button>
-									<br/>
-									<input type="text" name="recipBaseAddr" class="w300" maxlength="50" required="required" data-valid-name="주소"/>
-									<input type="text" name="recipDtlAddr" class="w300" maxlength="30" required="required" data-valid-name="상세주소"/>
-								</td>
-							</tr>
-							</tbody>
-						</table>
 						<!-- //TAB3 PANELSTYLE -->
 					</li>
 					<!-- //TAB3 : 배송지정보 -->
@@ -538,8 +551,8 @@
 				return gagaAgGrid.toDateTimeFormat(params.value);
 			}
 		},
-		{headerName: "주문자전화번호", field: "orderTelno", width: 120, cellClass: 'text-center'},
-		{headerName: "주문자휴대폰", field: "orderPhnno", width: 130, cellClass: 'text-center'},
+		{headerName: "주문자전화번호", field: "ordTelno", width: 120, cellClass: 'text-center'},
+		{headerName: "주문자휴대폰", field: "ordPhnno", width: 130, cellClass: 'text-center'},
 		{
 			headerName: "주문상세상태", field: "ordDtlStat", width: 100, cellClass: 'text-center',
 			valueFormatter: function (params) {
@@ -553,11 +566,11 @@
 				return '<a href="javascript:void(0);">' + params.value + '</a>';
 			}
 		},
-		{headerName: "사이즈", field: "sizeCd", width: 100, cellClass: 'text-center'},
+		{headerName: "색상", field: "optCd1", width: 100, cellClass: 'text-center'},
+		{headerName: "사이즈", field: "optCd2", width: 100, cellClass: 'text-center'},
 		{headerName: "상품명", field: "goodsNm", width: 250, cellClass: 'text-left'},
 		{headerName: "주문수량", field: "ordQty", width: 100, cellClass: 'text-center'},
 		{headerName: "판매상품가격", field: "currPrice", width: 100, cellClass: 'text-center'},
-		{headerName: "총 판매 상품가격", field: "totCurrPrice", width: 150, cellClass: 'text-center'}
 	];
 
 	// 1:1문의 내역 그리드
@@ -829,111 +842,134 @@
 
 	gridCouponOptions.rowSelection = 'multiple';
 
-	// 비밀번호 초기화 버튼
+	// 기본정보 - 비밀번호 초기화 버튼
 	$('#btnResetPassword').on('click', function () {
 
-		//이메일
-		let email = $('#email1').val() + '@' + $('#email2').val();
-
-		if (!fnCheckValidationEmail(email)) {
+		if (!fnCheckValidationEmail('#custInfoForm')) {
 			return false;
 		}
-		
-		let customer = {};
-		customer.custNo = custNo;
 
 		mcxDialog.confirm("초기화 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				let jsonData = JSON.stringify(customer);
+				let jsonData = JSON.stringify($('#custInfoForm').serializeObject());
 				gagajf.ajaxJsonSubmit('/customer/password/reset', jsonData, fnSearchCustInfo);
 			}
 		});
 
 	});
 
-	// LMS발송 버튼
+	// 기본정보 - LMS발송 버튼
 	$('#btnCustSendLms').on('click', function () {
+
+		if (!fnCheckValidationPhnno('#custInfoForm')) {
+			return false;
+		}
+
 		let param = {};
-		param.elementCellPhnno = '#cellPhnno';
-		param.elementCustNo = '#custNo';
+		param.elementCellPhnno = '#custInfoForm input[name=cellPhnno]';
+		param.elementCustNo = '#custInfoForm input[name=custNo]';
+
 		cfnOpenLmsPopup(param);
 	});
 
 
-	// 이메일발송 버튼
+	// 기본정보 - 이메일발송 버튼
 	$('#btnCustSendEmail').on('click', function () {
+
+		if (!fnCheckValidationEmail('#custInfoForm')) {
+			return false;
+		}
+
 		let param = {};
-		param.elementRecipEmail = '#email';
-		param.elementCustNm = '#custNm';
-		param.elementCustNo = '#custNo';
+		param.elementEmail = '#custInfoForm input[name=email]';
+		param.elementCustNo ='#custInfoForm input[name=custNo]';
+
 		cfnOpenEmailPopup(param);
 	});
 
-	// 이메일 도메인 선택 이벤트
-	$('#emailDomain').on('change', function () {
+	// 기본정보 - 이메일 도메인 선택 이벤트
+	$('#emailDomainList').on('change', function () {
 		let domain = $(this).val();
-		let $email2 = $('#email2');
+		let $emailDomain = $('#emailDomain');
 
 		if (domain === '99') {  //기타(직접입력)
-			$email2.val('');
+			$emailDomain.val('');
 		} else if (domain !== '99' && !gagajf.isNull(domain)) {
-			$email2.val(domain);
+			$emailDomain.val(domain);
 		}
 
 	});
 
-	// 저장 버튼
+	// 기본정보 - 저장버튼
 	$('#btnCustInfoSave').on('click', function () {
-
-		let cellPhnno = $('#cellPhnno1').val() + '-' + $('#cellPhnno2').val() + '-' + $('#cellPhnno3').val();
-		let email = $('#email1').val() + '@' + $('#email2').val();
+		let custInfoFrom = '#custInfoForm';
 
 		//휴대폰번호
-		if (!fnCheckValidationPhnno(cellPhnno))
+		if (!fnCheckValidationPhnno(custInfoFrom))
 			return false;
 
 		//이메일
-		if (!fnCheckValidationEmail(email))
+		if (!fnCheckValidationEmail(custInfoFrom))
 			return false;
 
-
 		let managedRsn = $('#managedRsn').val();
 		let	managedDtlRsn = $('#managedDtlRsn').val();
 
-
 		if (!gagajf.isNull(managedRsn) && gagajf.isNull(managedDtlRsn)) {
 			mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
 			return;
 		}
 
-		let customer = {};
-		customer.custNo = custNo;
-		customer.managedRsn = managedRsn;
-		customer.managedDtlRsn = managedDtlRsn;
-		customer.email = email;
-		customer.custGb = $('#custGb').val();
-		customer.custGrade = $('#custGrade').val();
-		customer.birthYmd = $('#birthYmd').val();
-		customer.homePostNo = $('#homePostNo').val();
-		customer.homeBaseAddr = $('#homeBaseAddr').val();
-		customer.homeDtlAddr = $('#homeDtlAddr').val();
-		customer.emailAgreeYn = $('input:radio[name=emailAgreeYn]:checked').val();
-		customer.smsAgreeYn = $('input:radio[name=smsAgreeYn]:checked').val();
-
-
 		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				let jsonData = JSON.stringify(customer);
+				let jsonData = JSON.stringify($(custInfoFrom).serializeObject());
 				//console.log(jsonData);
 				gagajf.ajaxJsonSubmit('/customer/info/save', jsonData, fnSearchCustInfo);
 			}
 		});
 	});
 
+	// 배송지정보 - 신규버튼
+	$('#btnCustAddrNew').on('click', function () {
+		$('#custAddrForm')[0].reset();
+		$('#custAddrForm input[name=custDelvAddrSq]').val('');
+		$('#custAddrForm input[name=recipPhnno]').val('');
+		$('#custAddrForm input[name=recipTelno]').val('');
+	});
+
+	// 배송지정보 - 저장버튼
+	$('#btnCustAddrSave').on('click', function () {
+		if (!gagajf.validation('#custAddrForm'))
+			return false;
+
+		// 전화번호
+		let telFirstNo = $('#custAddrForm input[name=telFirstNo]').val();
+		let telMiddleNo = $('#custAddrForm input[name=telMiddleNo]').val();
+		let telLastNo = $('#custAddrForm input[name=telLastNo]').val();
+		$('#custAddrForm input[name=recipTelno]').val(telFirstNo + '-' + telMiddleNo + '-' + telLastNo);
+
+		// 핸드폰번호 필수값 validation 함수에서 null 체크
+		let recipFirstNo = $('#custAddrForm input[name=recipFirstNo]').val();
+		let recipMiddleNo = $('#custAddrForm input[name=recipMiddleNo]').val();
+		let recipLastNo = $('#custAddrForm input[name=recipLastNo]').val();
+		$('#custAddrForm input[name=recipPhnno]').val(recipFirstNo + '-' + recipMiddleNo + '-' + recipLastNo);
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				gagajf.removeCommaAtNumberFormattedInput('#custAddrForm');
+				let jsonData = JSON.stringify($('#custAddrForm').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/delivery/addr/save', jsonData, fnSearchDelivery);
+			}
+		});
+
+	});
+
 	// 쿠폰삭제 버튼
 	$('#btnCustCouponDelete').on('click', function () {
 		let removedData = gagaAgGrid.removeRowData(gridCouponOptions);
@@ -971,45 +1007,7 @@
 		cfnCpnPubForCustPopup();
 	});
 
-	// 배송지정보 신규
-	$('#btnCustAddrNew').on('click', function () {
-		$('#custAddr')[0].reset();
-		$('#custAddr input[name=custDelvAddrSq]').val('');
-		$('#custAddr input[name=recipPhnno]').val('');
-		$('#custAddr input[name=recipTelno]').val('');
-	});
-
-	// 배송지정보 저장
-	$('#btnCustAddrSave').on('click', function () {
-
-		if (!gagajf.validation('#custAddr'))
-			return false;
-
-		// 전화번호
-		let recipTelno1 = $('#custAddr input[name=recipTelno1]').val();
-		let recipTelno2 = $('#custAddr input[name=recipTelno2]').val();
-		let recipTelno3 = $('#custAddr input[name=recipTelno3]').val();
-
-		$('#custAddr input[name=recipTelno]').val(recipTelno1 + '-' + recipTelno2 + '-' + recipTelno3);
-
-
-		// 핸드폰번호 필수값 validation 함수에서 null 체크
-		let recipPhnno1 = $('#custAddr input[name=recipPhnno1]').val();
-		let recipPhnno2 = $('#custAddr input[name=recipPhnno2]').val();
-		let recipPhnno3 = $('#custAddr input[name=recipPhnno3]').val();
-		$('#custAddr input[name=recipPhnno]').val(recipPhnno1 + '-' + recipPhnno2 + '-' + recipPhnno3);
-
-		mcxDialog.confirm("저장하시겠습니까?", {
-			cancelBtnText: "취소",
-			sureBtnText: "확인",
-			sureBtnClick: function () {
-				gagajf.removeCommaAtNumberFormattedInput('#custAddr');
-				let jsonData = JSON.stringify($('#custAddr').serializeObject());
-				gagajf.ajaxJsonSubmit('/customer/delivery/addr/save', jsonData, fnSearchDelivery);
-			}
-		});
 
-	});
 
 	// 회원접촉이력 저장
 	$('#btnSaveContact').on('click', function () {
@@ -1068,34 +1066,34 @@
 			return;
 
 		if (!gagajf.isNull(event.data)) {
-			$('#custAddr input[name=custDelvAddrSq]').val(event.data.custDelvAddrSq);
-			$('#custAddr input[name=delvAddrNm]').val(event.data.delvAddrNm);
-			$('#custAddr input[name=recipEmail]').val(event.data.recipEmail);
-			$('#custAddr input[name=recipNm]').val(event.data.recipNm);
+			$('#custAddrForm input[name=custDelvAddrSq]').val(event.data.custDelvAddrSq);
+			$('#custAddrForm input[name=delvAddrNm]').val(event.data.delvAddrNm);
+			$('#custAddrForm input[name=recipEmail]').val(event.data.recipEmail);
+			$('#custAddrForm input[name=recipNm]').val(event.data.recipNm);
 
 			if (!gagajf.isNull(event.data.recipPhnno)) {
-				let recipPhnno = event.data.recipPhnno.split("-");
-				$('#custAddr input[name=recipPhnno1]').val(recipPhnno[0]);
-				$('#custAddr input[name=recipPhnno2]').val(recipPhnno[1]);
-				$('#custAddr input[name=recipPhnno3]').val(recipPhnno[2]);
+				let phnNoSplit = event.data.recipPhnno.split("-");
+				$('#custAddrForm input[name=recipFirstNo]').val(phnNoSplit[0]);
+				$('#custAddrForm input[name=recipMiddleNo]').val(phnNoSplit[1]);
+				$('#custAddrForm input[name=recipLastNo]').val(phnNoSplit[2]);
 			}
 
 			if (!gagajf.isNull(event.data.recipTelno)) {
-				let recipTelno = event.data.recipTelno.split("-");
-				$('#custAddr input[name=recipTelno1]').val(recipTelno[0]);
-				$('#custAddr input[name=recipTelno2]').val(recipTelno[1]);
-				$('#custAddr input[name=recipTelno3]').val(recipTelno[2]);
+				let telNoSplit = event.data.recipTelno.split("-");
+				$('#custAddrForm input[name=telFirstNo]').val(telNoSplit[0]);
+				$('#custAddrForm input[name=telMiddleNo]').val(telNoSplit[1]);
+				$('#custAddrForm input[name=telLiastNo]').val(telNoSplit[2]);
 			}
 
-			$('#custAddr input[name=recipPostNo]').val(event.data.recipPostNo);
-			$('#custAddr input[name=recipBaseAddr]').val(event.data.recipBaseAddr);
-			$('#custAddr input[name=recipDtlAddr]').val(event.data.recipDtlAddr);
+			$('#custAddrForm input[name=recipZipNo]').val(event.data.recipZipNo);
+			$('#custAddrForm input[name=recipBaseAddr]').val(event.data.recipBaseAddr);
+			$('#custAddrForm input[name=recipDtlAddr]').val(event.data.recipDtlAddr);
 
 			let defaultYn = event.data.defaultYn === 'Y' ? true : false;
 			let delYn = event.data.delYn === 'Y' ? true : false;
 
-			$('#custAddr input:checkbox[name=defaultYn]').prop('checked', defaultYn);
-			$('#custAddr input:checkbox[name=delYn]').prop('checked', delYn);
+			$('#custAddrForm input:checkbox[name=defaultYn]').prop('checked', defaultYn);
+			$('#custAddrForm input:checkbox[name=delYn]').prop('checked', delYn);
 
 		}
 	};
@@ -1105,7 +1103,7 @@
 		$.get('/customer/info/' + custNo
 			, function (data) {
 				if (!gagajf.isNull(data)) {
-					$('#custNm').text(data.maskingCustNm);
+					$('#spanCustNm').text(data.maskingCustNm);
 					$('#custId').text(data.maskingCustId);
 					$('#siteNm').text(gagaAgGrid.lookupValue(siteList, data.siteCd));
 					$('#custGrade').val(data.custGrade);
@@ -1136,7 +1134,10 @@
 					fnDisplaySmsAgree(data.smsAgreeYn);				// SMS 수신여부
 					fnDisplayEmail(data.maskingEmail);				// EMAIL
 					fnDisplayCellPhnno(data.maskingCellPhnno);		// 핸드폰
-					fnDisplayManaged(data.managedRsnNm);			// 관리대상
+					fnDisplayManaged(data.managedRsn);			// 관리대상
+
+					//custInfoForm Hidden : LMS팝업 사용시 필요
+					$('#custNm').val(data.maskingCustNm);
 
 					//기존데이트 저장
 					orgData = data;
@@ -1218,15 +1219,16 @@
 		let daumZip = new daum.Postcode({
 			oncomplete: function(data) {
 				// 우편번호와 주소 정보를 해당 필드에 넣는다.
-				if (id === 'custInfo') {
+				if (id === 'custInfoForm') {
 					$('#homePostNo').val(data.zonecode);
 					$('#homeBaseAddr').val(cfnGetDaumRoadAddr(data));
 					$('#homeDtlAddr').focus();
 				}
 
-				if (id === 'custAddr') {
-					$('#recipPostNo').val(data.zonecode);
+				if (id === 'custAddrForm') {
+					$('#recipZipNo').val(data.zonecode);
 					$('#recipBaseAddr').val(cfnGetDaumRoadAddr(data));
+					$('#recipDtlAddr').focus();
 				}
 
 				cfnCloseDaumAddr();
@@ -1237,36 +1239,31 @@
 		cfnOpenDaumAddr(daumZip);
 	}
 
-	// 휴대전화 유효성체크
-	var fnCheckValidationPhnno = function (cellPhnno) {
+	// 휴대전화 유효성 체크 및 데이터 셋팅
+	var fnCheckValidationPhnno = function (formId) {
 		let result = true;
-		let regexp = /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/ ;
-
-		if (!regexp.test(cellPhnno)) {
-			mcxDialog.alertC('휴대전화의 형식이 잘못되었습니다.', {
-				sureBtnText: "확인",
-				sureBtnClick: function() {
-					$('#cellPhnno1').select();
-					$('#cellPhnno1').focus();
-				}
-			});
+
+		let firstNo = $(formId + ' select[name=firstNo]').val();
+		let middleNo = $(formId + ' input[name=middleNo]').val();
+		let lastNo = $(formId + ' input[name=lastNo]').val();
+		let cellPhnno = firstNo + '-' + middleNo + '-' + lastNo;
+		$(formId + ' input[name=cellPhnno]').val(cellPhnno);
+
+		if (!gagajf.testRegexp($(formId + ' input[name=cellPhnno]'), /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/)) {
 			result = false;
 		}
+
 		return result;
 	};
 
-	// 이메일 체크
-	var fnCheckValidationEmail = function (email) {
+	// 이메일 체크 및 데이터 셋팅
+	var fnCheckValidationEmail = function (formId) {
 		let result = true;
-		let regexp = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/;
+		let emailId = $(formId + ' input[name=emailId]').val();
+		let emailDomain = $(formId + ' input[name=emailDomain]').val();
+		$(formId + ' input[name=email]').val(emailId + '@' + emailDomain);
 
-		if (!regexp.test(email)) {
-			mcxDialog.alertC('이메일 형식이 잘못되었습니다.', {
-				sureBtnText: "확인",
-				sureBtnClick: function() {
-					$('#email1').focus();
-				}
-			});
+		if (!gagajf.testRegexp($(formId + ' input[name=email]'), /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/)) {
 			result = false;
 		}
 
@@ -1299,15 +1296,14 @@
 	};
 
 	// 관리대상
-	var fnDisplayManaged = function (managedRsnNm) {
+	var fnDisplayManaged = function (managedRsn) {
 		const $managedRsnNm = $('#managedRsnNm');
 		const $managedRsnDp = $('#managedRsnDp');
-
 		$managedRsnNm.text('');
 		$managedRsnNm.hide();
 		$managedRsnDp.text('');
 		$managedRsnDp.hide();
-		if (!gagajf.isNull(managedRsnNm)) {
+		if (!gagajf.isNull(managedRsn)) {
 			let html = '<i class="fa fa-info-circle"></i>';
 			$managedRsnNm.html(html);
 			$managedRsnNm.show();
@@ -1317,12 +1313,11 @@
 
 	};
 
-
 	// 탈퇴여부
 	var fnGetSecedeRsnYn = function (custStat, secedeRsn) {
 		let secedeRsnYn = gagajf.isNull(secedeRsn) ? '아니요' : '예';
 		if (custStat === '10') {
-			secedeRsnYn += '<button type="button" class="btn btn-danger btn-lg marL5"onClick="fnCustomerSecede();">';
+			secedeRsnYn += '<button type="button" class="btn btn-danger btn-lg marL5" onClick="fnCustomerSecede();">';
 			secedeRsnYn += ' 회원탈퇴';
 			secedeRsnYn += '</button>';
 		}
@@ -1333,9 +1328,9 @@
 	var fnDisplayCellPhnno = function (cellPhnno) {
 		if (!gagajf.isNull(cellPhnno)) {
 			let cellPhSplit = cellPhnno.split("-");
-			$('#cellPhnno1').val(cellPhSplit[0]);
-			$('#cellPhnno2').val(cellPhSplit[1]);
-			$('#cellPhnno3').val(cellPhSplit[2]);
+			$('#firstNo').val(cellPhSplit[0]);
+			$('#middleNo').val(cellPhSplit[1]);
+			$('#lastNo').val(cellPhSplit[2]);
 		}
 	};
 
@@ -1343,8 +1338,8 @@
 	var fnDisplayEmail = function (email) {
 		if (!gagajf.isNull(email)) {
 			let emailSplit = email.split("@");
-			$('#email1').val(emailSplit[0]);
-			$('#email2').val(emailSplit[1]);
+			$('#emailId').val(emailSplit[0]);
+			$('#emailDomain').val(emailSplit[1]);
 		}
 	};
 
@@ -1394,6 +1389,18 @@
 		return snsType;
 	};
 
+	// 생년월일 달력 설정
+	var fnDisplayBirthYmd = function () {
+		const $birthYmd = $('#birthYmd');
+		let currentYear = new Date().format('YYYY');
+		$birthYmd.datepicker("destroy");
+		$birthYmd.datepicker({
+			changeMonth: true,
+			changeYear: true,
+			yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
+			defaultDate: $birthYmd.val()
+		});
+	}
 
 	$('#btnLogin').on('click', function () {
 		let custId = $('span[name=custId]').text();
@@ -1404,19 +1411,10 @@
 	})
 
 	$(document).ready(function () {
-		// 생년월일 달력 설정
-		const $birthYmd = $('#birthYmd');
-		let currentYear = new Date().format('YYYY');
-		$birthYmd.datepicker("destroy");
-		$birthYmd.datepicker({
-			changeMonth: true,
-			changeYear: true,
-			yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
-			defaultDate: $birthYmd.val()
-		});
 
-		//회원정보 조회
-		fnSearchCustInfo();
+		fnDisplayBirthYmd(); //생년월일 달력 설정
+
+		fnSearchCustInfo();	//회원정보 조회
 
 		gagaAgGrid.createGrid('custOrderList', gridOrderOptions);		// 주문내역
 

+ 148 - 0
src/main/webapp/WEB-INF/views/customer/EmailPopupForm.html

@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : EmailPopupForm.html
+ * @desc    : 메일발송팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.21   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" id="popupEmailForm" data-width="800">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong >메일 발송</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupEmailForm')"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div class="tabs">
+				<!-- TABS CONTENT -->
+				<ul class="tabsCont">
+					<li class="tab on" id="tab1">
+						<div class="panelStyle">
+							<form id="emailForm" name="emailForm">
+								<input type="hidden" name="sendEmail" th:value="${sendEmail}"/>
+								<input type="hidden" name="email"/>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:1%"/>
+										<col style="width:40%"/>
+									</colgroup>
+									<tbody>
+									<tr >
+										<th>보내는사람</th>
+										<td>
+											<span name="sendEmail" th:text="${sendEmail}"></span>
+										</td>
+									</tr>
+									<tr>
+										<th>받는사람</th>
+										<td>
+											<span name="email"></span>
+										</td>
+									</tr>
+									<tr>
+										<th>제목<em class="star"></em></th>
+										<td>
+											<input type="text" class="w150" name="title" value="" required="required" data-valid-name="제목"/>
+										</td>
+									</tr>
+									<tr>
+										<th>내용<em class="star"></em></th>
+										<td>
+											<textarea class="textareaR4" style="resize: none;" name ="content" ></textarea>
+										</td>
+									</tr>
+									</tbody>
+								</table>
+							</form>
+						</div>
+					</li>
+				</ul>
+				<!-- //TABS CONTENT -->
+			</div>
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-success btn-lg" id="btnSendEmail">발송</button>
+					<button type="button" class="btn btn-gray btn-lg" onclick="uifnPopupClose('popupEmailForm')">취소</button>
+				</li>
+			</ul>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const elementEmail = [[${elementEmail}]];
+	const elementCustNo = [[${elementCustNo}]];
+
+	// 메시지 전송
+	$("#btnSendEmail").on("click",function() {
+		let formId = '#emailForm';
+		let $content = $(formId+' textarea[name=content]');
+		let $email = $(formId+' input[name=email]');
+
+
+		if(gagajf.isNull($content.val())) {
+			mcxDialog.alertC("내용을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$content.focus();
+				}
+			});
+			return;
+		}
+
+		if(gagajf.isNull($email.val())) {
+			mcxDialog.alertC("수신메일을 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$email.focus();
+				}
+			});
+			return;
+		}
+
+		if(!gagajf.validation(formId)){
+			return;
+		}
+
+		mcxDialog.confirm("메일을 발송하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = $(formId).serializeObject();
+				params.custNo = $(elementCustNo).val();
+				let jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/customer/email/send', jsonData, uifnPopupClose('popupEmailForm'));
+			}
+		});
+
+	});
+
+	// 데이터 셋팅
+	var fnInitDataSet = function () {
+		let email = $(elementEmail).val();
+
+		if(!gagajf.isNull(email)) {
+			$('#emailForm input[name=email]').val(email);
+			$('#emailForm span[name=email]').text(email);
+		}
+	}
+
+	$(document).ready(function() {
+		fnInitDataSet();
+	});
+
+	/*]]>*/
+</script>
+</html>

+ 141 - 0
src/main/webapp/WEB-INF/views/customer/LmsPopupForm.html

@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : LmsPopupForm.html
+ * @desc    : 메시지발송팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.21   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" id="popupLmsForm" data-width="800">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>LMS 발송</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupLmsForm')"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div class="tabs">
+				<div class="tabsNav">
+					<ul >
+						<li class="on"><a href="#tab1">LMS 발송</a></li>
+					</ul>
+				</div>
+				<!-- //TABS NAVI -->
+				<!-- TABS CONTENT -->
+				<ul class="tabsCont">
+					<!-- LMS 발송 -->
+					<li class="tab on" id="tab1">
+						<div class="panelStyle">
+							<form id="lmsForm" name="lmsForm">
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:1%"/>
+										<col style="width:40%"/>
+									</colgroup>
+									<tbody>
+									<tr >
+										<th>수신자번호 <em class="star"></em></th>
+										<td>
+											<input type="text" class="w150" name="cellPhnno" data-valid-name="수신번호"  required="required"  maxlength="13"/>
+										</td>
+									</tr>
+									<tr>
+										<th>발신자번호<em class="star"></em></th>
+										<td>
+											<input type="text" class="w150" name="callBack" th:value="${callBack}" maxlength="11" readonly="readonly"/>
+										</td>
+									<tr>
+										<th>메시지<em class="star"></em></th>
+										<td>
+											<textarea class="textareaR4"  style="resize: none;" name ="content" ></textarea>
+											<span name="count">0</span> / 2000 byte
+										</td>
+									</tr>
+									</tr>
+									</tbody>
+								</table>
+							</form>
+						</div>
+					</li>
+					<!-- //LMS발송 -->
+				</ul>
+				<!-- //TAB CONTENT -->
+			</div>
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" class="btn btn-success btn-lg" id="btnSendSms">발송</button>
+					<button type="button" class="btn btn-gray btn-lg" onclick="uifnPopupClose('popupLmsForm')">취소</button>
+				</li>
+			</ul>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const elementCellPhnno = [[${elementCellPhnno}]];
+	const elementCustNo = [[${elementCustNo}]];
+
+	// 메시지 전송
+	$("#btnSendSms").on("click",function() {
+		let formId = '#lmsForm';
+		let custNo = $(elementCustNo).val();
+		const $content = $(formId+' textarea[name=content]');
+
+		if(gagajf.isNull($content.val())) {
+			mcxDialog.alertC("보낼 메시지를 입력해 주세요.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					$content.focus();
+				}
+			});
+			return;
+		}
+
+		if(!gagajf.validation(formId)){
+			return;
+		}
+
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function() {
+				let params = $(formId).serializeObject();
+				params.custNo = custNo;
+				let jsonData = JSON.stringify(params);
+				gagajf.ajaxJsonSubmit('/customer/message/send', jsonData, uifnPopupClose('popupLmsForm'));
+			}
+		});
+
+	});
+
+	// LMS 글자수 변경 이벤트
+	$("#lmsForm textarea[name=content]").bind('focus focusout input keyup keydown paste change', function () {
+		cfnGetTextLength($(this), 2000, $('#lmsForm span[name=count]'));
+	});
+
+	var fnInitDataSet = function () {
+		let cellPhnno = $(elementCellPhnno).val();
+		if(!gagajf.isNull(cellPhnno)) {
+			$('#lmsForm input[name=cellPhnno]').val(cellPhnno);
+		}
+	}
+
+	$(document).ready(function() {
+		fnInitDataSet();
+
+		cfnGetTextLength("#lmsForm textarea[name=content]", 2000, $('#lmsForm span[name=count]'));
+	});
+	/*]]>*/
+</script>
+</html>

+ 54 - 27
src/main/webapp/WEB-INF/views/marketing/MorebetterPopupForm.html

@@ -29,6 +29,12 @@
 			<input type="hidden" name="exceptGoodsList"/>			<!-- 제외상품 리스트 -->
 			<input type="hidden" name="burdenList"/>				<!-- 업체 분담율 리스트 -->
 			<input type="hidden" name="sectionGbList"/>				<!-- 다다익선 구간/혜택 리스트 -->
+			<input type="hidden" name="supplyCompArr"/>
+			<input type="hidden" name="brandArr"/>
+			<input type="hidden" name="supplyCompList2"/>
+			<input type="hidden" name="brandList2"/>
+			<!--<input type="hidden" name="multiSupplyCompCd"/>
+			<input type="hidden" name="multiBrand"/>-->
 
 			<div class="panelContent">
 				<table class="frmStyle">
@@ -519,8 +525,55 @@
 		});
 	});
 
-	// 저장 버튼 클릭시
 	$('#btnMorebetterSave').on('click', function() {
+		var allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
+		var allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
+
+		var test1 = {};
+		// 공급업체+브랜드 상품조회
+		var multiSupplyCompCd = [];
+		$.each(allSupplyCompData, function(idx, item) {
+			multiSupplyCompCd.push(item.supplyCompCd);
+		});
+
+		var multiBrand = [];
+		$.each(allBrandData, function(idx, item) {
+			multiBrand.push(item.brandCd);
+		});
+
+		/*var jsonMultiSupplyCompData = JSON.stringify(multiSupplyCompCd);
+		$('#moreBetterForm input[name=supplyCompArr]').val(jsonMultiSupplyCompData);
+
+		var jsonMultiBrandData = JSON.stringify(multiBrand);
+		$('#moreBetterForm input[name=brandArr]').val(jsonMultiBrandData);
+*/
+		//$('#moreBetterForm input[name=supplyCompArr]').val(JSON.stringify(multiSupplyCompCd));
+		//$('#moreBetterForm input[name=brandArr]').val(JSON.stringify(multiBrand));
+
+		$('#moreBetterForm input[name=supplyCompArr]').val(multiSupplyCompCd.join(','));
+		$('#moreBetterForm input[name=brandArr]').val(multiBrand.join(','));
+
+		console.log('1.>>'+multiBrand);
+		console.log('2.>>'+JSON.stringify(multiBrand));
+
+		//$('#moreBetterForm input[name=supplyCompList2]').val(multiSupplyCompCd);
+		//$('#moreBetterForm input[name=brandList2]').val(multiBrand);
+		/*var data = {multiSupplyCompCd : multiSupplyCompCd
+			,multiBrand : multiBrand
+		};
+
+		var jsonData = JSON.stringify(data);
+*/
+		var jsonData = JSON.stringify($('#moreBetterForm').serializeObject());
+		gagajf.ajaxJsonSubmit($('#moreBetterForm').prop('action'), jsonData, function() {
+			fnMorebetterFormClose();
+			$('#btnInit').trigger('click');
+			$('#btnSearch').trigger('click');
+		});
+	});
+
+	// 저장 버튼 클릭시
+	$('#btnMorebetterSave2').on('click', function() {
 		// validation
 		if (!gagajf.validation('#moreBetterForm'))
 			return false;
@@ -665,36 +718,10 @@
 		var allSupplyCompData = gagaAgGrid.getAllRowData(gridOptionsFGCompanyList);
 		var allBrandData = gagaAgGrid.getAllRowData(gridOptionsFGBrandList);
 
-		console.log('allSupplyCompData cnt>>'+allSupplyCompData.length);
-		console.log('allBrandData cnt>>'+allBrandData.length);
-
 		if(allSupplyCompData.length < 1){
 			mcxDialog.alert('공급업체를 추가해주세요.');
 			return;
 		}
-
-		// 공급업체+브랜드 상품조회
-		var multiSupplyCompCd = [];
-		$.each(allSupplyCompData, function(idx, item) {
-			multiSupplyCompCd.push(item.supplyCompCd);
-		});
-
-		var multiBrand = [];
-		$.each(allBrandData, function(idx, item) {
-			multiBrand.push(item.brandCd);
-		});
-
-		var data = {multiSupplyCompCd : multiSupplyCompCd
-			,multiBrand : multiBrand
-			,pageingYn : "N"
-		};
-
-		var jsonData = JSON.stringify(data);
-		gagajf.ajaxJsonSubmit('/goods/list', jsonData, function(result) {
-			console.log('goodsList cnt>>'+result.goodsList.length);
-			console.log('goodsList >>'+result.goodsList);
-		});
-
 	};
 
 	// 분담업체율 설정 / 업체 추가 콜백함수

+ 1 - 1
src/main/webapp/dx5/module/dextuploadx5-application-api.js

@@ -1,4 +1,4 @@
-/*
+/*
  * DEXTUploadX5 - Application
  * http://www.dextsolution.com
  *

+ 2 - 4
src/main/webapp/ux/js/admin.popup.js

@@ -398,8 +398,7 @@ function cfnCouponCreatePopup(cpnId, callbackfun){
  * @author : jsshin
  */
 var cfnOpenLmsPopup = function(param, division) {
-	var actionUrl = '/customer/lms/popup/form?elementContent=' + encodeURIComponent(param.elementContent)
-			+ '&elementCellPhnno=' + encodeURIComponent(param.elementCellPhnno)
+	var actionUrl = '/customer/lms/popup/form?elementCellPhnno=' + encodeURIComponent(param.elementCellPhnno)
 			+ '&elementCustNo=' + encodeURIComponent(param.elementCustNo)
 			+ '&division=' + division;
 	cfnOpenModalPopup(actionUrl, 'popupLmsForm');
@@ -420,8 +419,7 @@ var cfnOpenLmsPopup = function(param, division) {
  * @author : jsshin
  */
 var cfnOpenEmailPopup = function(param, division) {
-	var actionUrl = '/customer/email/popup/form?elementRecipEmail=' + encodeURIComponent(param.elementRecipEmail)
-	+ '&elementCustNm=' + encodeURIComponent(param.elementCustNm)
+	var actionUrl = '/customer/email/popup/form?elementEmail=' + encodeURIComponent(param.elementEmail)
 	+ '&elementCustNo=' + encodeURIComponent(param.elementCustNo);
 	+ '&division=' + division;
 	cfnOpenModalPopup(actionUrl, 'popupEmailForm');