Преглед на файлове

활동, 탈퇴, 휴면 목록 수정 및 회원상세 개발 중

jsshin преди 5 години
родител
ревизия
57119a8aa5

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

@@ -26,6 +26,15 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch);
 
+	/**
+	 * 회원 정보
+	 * @param custNo - 고객번호
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2020. 01. 18
+	 */
+	Customer getCustomerInfo(String custNo);
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

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

@@ -33,6 +33,17 @@ public class TsaCustomerService {
 		return customerDao.getCustomerActiveList(customerSearch);
 	}
 
+	/**
+	 * 회원 정보
+	 * @param custNo - 고객번호
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2020. 01. 18
+	 */
+	public Customer getCustomerInfo(String custNo) {
+		return customerDao.getCustomerInfo(custNo);
+	}
+
 	/**
 	 * 탈퇴회원 목록
 	 * @param customerSearch - 검색조건

+ 98 - 67
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -3,6 +3,7 @@ package com.style24.admin.biz.web;
 import java.util.Collection;
 
 import com.style24.admin.biz.service.TsaCustomerService;
+import com.style24.core.support.session.TscSession;
 import com.style24.persistence.domain.Customer;
 import com.style24.persistence.domain.CustomerSearch;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,7 +13,6 @@ 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;
 
@@ -255,6 +255,9 @@ public class TsaCustomerController extends TsaBaseController {
 		// 사이트 목록
 		mav.addObject("siteList", rendererService.getCommonCodeList("G000", "Y"));
 
+		// 성별
+		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007", "Y"));
+
 		// 회원 구분
 		mav.addObject("custGbList", rendererService.getCommonCodeList("G100", "Y"));
 
@@ -279,9 +282,100 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/active/list")
 	@ResponseBody
 	public Collection<Customer> getCustomerActiveList(@RequestBody CustomerSearch customerSearch) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerActiveList(customerSearch);
 	}
 
+	/**
+	 * 회원상세 목록
+	 * @param custNo - 고객번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2020. 01. 14
+	 */
+	@GetMapping("/detail/form/{custNo}")
+	public ModelAndView getCustomerDetailForm(@PathVariable String custNo) {
+		ModelAndView mav = new ModelAndView();
+
+		// 사이트 목록
+		mav.addObject("siteList", rendererService.getCommonCodeList("G000"));
+
+		// 몰구분
+		mav.addObject("mallGbList", rendererService.getCommonCodeList("G011"));
+
+		// 성별
+		mav.addObject("genderGbList", rendererService.getCommonCodeList("G007"));
+
+		// 회원 구분
+		mav.addObject("custGbList", rendererService.getCommonCodeList("G100"));
+
+		// 회원 등급
+		mav.addObject("custGradeList", rendererService.getCommonCodeList("G110"));
+
+		// 관리대상
+		mav.addObject("managedRsnList", rendererService.getCommonCodeList("G103"));
+
+		// 전화번호국번
+		mav.addObject("nationalNumberList", rendererService.getCommonCodeList("G095"));
+
+		// 휴대폰번호국번
+		mav.addObject("nationalHpNumberList", rendererService.getCommonCodeList("G096"));
+
+		// 이메일도메인
+		mav.addObject("emailDomainList", rendererService.getCommonCodeList("G097"));
+
+		// 상담분류
+		mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059"));
+
+		// 회원접촉유형 목록
+		mav.addObject("contactTypeList", rendererService.getCommonCodeList("G054"));
+
+		// 회원접촉방법 목록
+		mav.addObject("contactMethodList", rendererService.getCommonCodeList("G055"));
+
+		// 주문상태
+		mav.addObject("orderStatList", rendererService.getCommonCodeList("G012"));
+
+		// 주문상세상태
+		mav.addObject("orderDtlStatList", rendererService.getCommonCodeList("G013"));
+
+		// 쿠폰유형
+		mav.addObject("cpnType", rendererService.getCommonCodeList("G230"));
+
+		// 쿠폰할인방식
+		//mav.addObject("dcWayList", rendererService.getCommonCodeList("G240"));
+
+		// 쿠폰발행사유
+		mav.addObject("pubReasonList", rendererService.getCommonCodeList("G597"));
+
+		// 포인트반영상태
+		mav.addObject("pntOccurGbList", rendererService.getCommonCodeList("G069"));
+
+		// 포인트반영상태
+		mav.addObject("pntUploadStatList", rendererService.getCommonCodeList("G070"));
+
+
+		mav.addObject("custNo", custNo);
+
+		mav.setViewName("customer/CustomerDetailForm");
+
+		return mav;
+	}
+
+	/**
+	 * 회원 정보
+	 * @param custNo - 고객번호
+	 * @return Customer
+	 * @author jsshin
+	 * @since 2020. 01. 18
+	 */
+	@GetMapping("/info/{custNo}")
+	@ResponseBody
+	public Customer getCustomerInfo(@PathVariable String custNo) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
+		return customerService.getCustomerInfo(custNo);
+	}
+
 	/**
 	 * 탈퇴회원
 	 * @return ModelAndView
@@ -296,7 +390,7 @@ public class TsaCustomerController extends TsaBaseController {
 		mav.addObject("siteList", rendererService.getCommonCodeList("G000", "Y"));
 
 		// 탈퇴 구분
-		mav.addObject("secedeGbList", rendererService.getCommonCodeList("G111", "Y"));
+		mav.addObject("secedeRsnList", rendererService.getCommonCodeList("G102", "Y"));
 
 		mav.setViewName("customer/CustomerSecedeListForm");
 
@@ -313,6 +407,7 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/secede/list")
 	@ResponseBody
 	public Collection<Customer> getCustomerSecedeList(@RequestBody CustomerSearch customerSearch) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerSecedeList(customerSearch);
 	}
 
@@ -344,74 +439,10 @@ public class TsaCustomerController extends TsaBaseController {
 	@PostMapping("/dormant/list")
 	@ResponseBody
 	public Collection<Customer>getCustomerDormantList(@RequestBody CustomerSearch customerSearch) {
+		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
 		return customerService.getCustomerDormantList(customerSearch);
 	}
 
 
-	@GetMapping("/detail/form/")
-	public ModelAndView getCustomerDetailForm(@RequestParam(value = "custNo") String custNo) {
-		ModelAndView mav = new ModelAndView();
-
-		// 사이트 목록
-		mav.addObject("siteList", rendererService.getCommonCodeList("G000"));
-
-		// 몰구분
-		mav.addObject("mallGbList", rendererService.getCommonCodeList("G011"));
-
-		// 회원 구분
-		mav.addObject("custGbList", rendererService.getCommonCodeList("G100"));
-
-		// 회원 등급
-		mav.addObject("custGradeList", rendererService.getCommonCodeList("G110"));
-
-		// 관리대상
-		mav.addObject("managedRsnList", rendererService.getCommonCodeList("G103"));
-
-		// 전화번호국번
-		mav.addObject("nationalNumberList", rendererService.getCommonCodeList("G095"));
-
-		// 휴대폰번호국번
-		mav.addObject("nationalHpNumberList", rendererService.getCommonCodeList("G096"));
-
-		// 이메일도메인
-		mav.addObject("emailDomainList", rendererService.getCommonCodeList("G097"));
-
-		// 상담분류
-		mav.addObject("counselClsfList", rendererService.getCommonCodeList("G059"));
-
-		// 회원접촉유형 목록
-		mav.addObject("contactTypeList", rendererService.getCommonCodeList("G054"));
-
-		// 회원접촉방법 목록
-		mav.addObject("contactMethodList", rendererService.getCommonCodeList("G055"));
-
-		// 주문상태
-		mav.addObject("orderStatList", rendererService.getCommonCodeList("G012"));
-
-		// 주문상세상태 G013
-		mav.addObject("orderDtlStatList", rendererService.getCommonCodeList("G013"));
-
-		// 쿠폰유형
-		mav.addObject("cpnType", rendererService.getCommonCodeList("G230"));
-
-		// 쿠폰할인방식
-		mav.addObject("dcWayList", rendererService.getCommonCodeList("G240"));
-
-		// 쿠폰발행사유
-		mav.addObject("pubReasonList", rendererService.getCommonCodeList("G250"));
-
-		// 포인트반영상태
-		mav.addObject("pntOccurGbList", rendererService.getCommonCodeList("G270"));
-
-		// 포인트반영상태
-		mav.addObject("pntUploadStatList", rendererService.getCommonCodeList("G280"));
-
-
-		mav.addObject("custNo", custNo);
-
-		mav.setViewName("customer/CustomerDetailForm");
-
-		return mav;
-	}
 
 }

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

@@ -28,5 +28,6 @@ public class CustomerSearch extends TscBaseDomain {
 	private String smsAgreeYn;
 	private String emailAgreeYn;
 	private String appAgreeYn;
+	private String secedeRsn;
 
 }

+ 217 - 4
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -47,10 +47,10 @@
 		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
 		     , MANAGED_RSN
 		     , MANAGED_DTL_RSN
-		     , MANAGED_DT
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
 		     , SECEDE_RSN
 		     , SECEDE_DTL_RSN
-		     , SECEDE_DT
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
 		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
 		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
 		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
@@ -105,14 +105,227 @@
 		</if>
 	</select>
 
+	<!-- 회원기본정보 -->
+	<select id="getCustomerInfo" parameterType="String" resultType="Customer">
+		/* TsaCustomer.getCustomerInfo */
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , BIRTH_SM
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
+		     , HOME_POST_NO
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
+		     , NV_JOIN_ID
+		     , NV_ACCESS_TOKEN
+		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
+		     , KK_JOIN_ID
+		     , KK_ACCESS_TOKEN
+		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
+		     , YS_JOIN_ID
+		     , YS_ACCESS_TOKEN
+		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
+		     , CI
+		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
+		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_CUSTOMER
+		WHERE  CUST_NO = #{custNo}
+	</select>
+
 	<!-- 탈퇴회원목록 -->
 	<select id="getCustomerSecedeList" parameterType="CustomerSearch" resultType="Customer">
-		SELECT '1111'
+		/* TsaCustomer.getSecedeCustomerList */
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , BIRTH_SM
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
+		     , HOME_POST_NO
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
+		     , NV_JOIN_ID
+		     , NV_ACCESS_TOKEN
+		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
+		     , KK_JOIN_ID
+		     , KK_ACCESS_TOKEN
+		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
+		     , YS_JOIN_ID
+		     , YS_ACCESS_TOKEN
+		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
+		     , CI
+		     , DATE_FORMAT(AUTH_DT, '%Y%m%d%H%i%S') AS AUTH_DT
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
+		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		FROM   TB_SECEDE_CUST
+		WHERE  CUST_STAT = 'G104_30'
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test="searchGb == 'custNo'">
+		AND    CUST_NO = #{searchTxt}
+		    </if>
+		    <if test="searchGb == 'custNm'">
+		AND    LOWER(CUST_NM) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'email'">
+		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'custNo'">
+		AND    LOWER(CUST_NO) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		</if>
+		<if test="siteCd != null and siteCd != ''">
+		AND    SITE_CD = #{siteCd}
+		</if>
+		<if test="cellPhnno != null and cellPhnno != ''">
+		AND    CELL_PHNNO = #{cellPhnno}
+		</if>
+		<if test="secedeRsn != null and secedeRsn != ''">
+		AND    SECEDE_RSN = #{secedeRsn}
+		</if>
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+		AND    SECEDE_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		AND    SECEDE_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		</if>
 	</select>
 
 	<!-- 휴면회원목록 -->
 	<select id="getCustomerDormantList" parameterType="CustomerSearch" resultType="Customer">
-		SELECT '1111'
+		/* TsaCustomer.getDormantCustomerList */
+		SELECT CUST_NO
+		     , CUST_ID
+		     , CUST_NM
+		     , PASSWD
+		     , BIRTH_YMD
+		     , BIRTH_SM
+		     , SEX_GB
+		     , CELL_PHNNO
+		     , APP_AGREE_YN
+		     , DATE_FORMAT(APP_AGREE_DT, '%Y%m%d%H%i%S') AS APP_AGREE_DT
+		     , SMS_AGREE_YN
+		     , DATE_FORMAT(SMS_AGREE_DT, '%Y%m%d%H%i%S') AS SMS_AGREE_DT
+		     , EMAIL
+		     , EMAIL_AGREE_YN
+		     , DATE_FORMAT(EMAIL_AGREE_DT, '%Y%m%d%H%i%S') AS EMAIL_AGREE_DT
+		     , HOME_POST_NO
+		     , HOME_BASE_ADDR
+		     , HOME_DTL_ADDR
+		     , SITE_CD
+		     , FRONT_GB
+		     , AF_LINK_CD
+		     , CUST_GB
+		     , CUST_GRADE
+		     , DATE_FORMAT(JOIN_DT, '%Y%m%d%H%i%S') AS JOIN_DT
+		     , FOREIGNER_YN
+		     , CUST_STAT
+		     , DATE_FORMAT(PASSWD_CHG_DT, '%Y%m%d%H%i%S') AS PASSWD_CHG_DT
+		     , TEMP_PASSWD_YN
+		     , DATE_FORMAT(LOGIN_LDT, '%Y%m%d%H%i%S') AS LOGIN_LDT
+		     , NV_JOIN_ID
+		     , NV_ACCESS_TOKEN
+		     , DATE_FORMAT(NV_JOIN_DT, '%Y%m%d%H%i%S') AS NV_JOIN_DT
+		     , KK_JOIN_ID
+		     , KK_ACCESS_TOKEN
+		     , DATE_FORMAT(KK_JOIN_DT, '%Y%m%d%H%i%S') AS KK_JOIN_DT
+		     , YS_JOIN_ID
+		     , YS_ACCESS_TOKEN
+		     , DATE_FORMAT(YS_JOIN_DT, '%Y%m%d%H%i%S') AS YS_JOIN_DT
+		     , CI
+		     , AUTH_DT
+		     , MANAGED_RSN
+		     , MANAGED_DTL_RSN
+		     , DATE_FORMAT(MANAGED_DT, '%Y%m%d%H%i%S') AS MANAGED_DT
+		     , SECEDE_RSN
+		     , SECEDE_DTL_RSN
+		     , DATE_FORMAT(SECEDE_DT, '%Y%m%d%H%i%S') AS SECEDE_DT
+		     , FN_GET_USER_NM(REG_NO)              AS REG_NM
+		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(UPD_NO)              AS UPD_NM
+		     , DATE_FORMAT(UPD_DT, '%Y%m%d%H%i%S') AS UPD_DT
+		     , DATE_FORMAT(DORMANT_DT, '%Y%m%d%H%i%S') AS DORMANT_DT
+		FROM   TB_DORMANT_CUST
+		WHERE  CUST_STAT = 'G104_20'
+		<if test="searchTxt != null and searchTxt != ''">
+		    <if test="searchGb == 'custNo'">
+		AND    CUST_NO = #{searchTxt}
+		    </if>
+		    <if test="searchGb == 'custNm'">
+		AND    LOWER(CUST_NM) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'email'">
+		AND    LOWER(EMAIL) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		    <if test="searchGb == 'custNo'">
+		AND    LOWER(CUST_NO) LIKE CONCAT('%',LOWER(#{searchTxt}),'%')
+		    </if>
+		</if>
+		<if test="siteCd != null and siteCd != ''">
+		AND    SITE_CD = #{siteCd}
+		</if>
+		<if test="cellPhnno != null and cellPhnno != ''">
+		AND    CELL_PHNNO = #{cellPhnno}
+		</if>
+		<if test="stDate != null and stDate != '' and edDate != null and edDate != ''">
+		AND    DORMANT_DT >= DATE_FORMAT(#{stDate}, '%Y-%m-%d %H:%i:%S')
+		AND    DORMANT_DT <![CDATA[<]]> DATE_FORMAT(DATE_ADD(#{edDate}, INTERVAL 1 DAY), '%Y-%m-%d %H:%i:%S')
+		</if>
 	</select>
 
 </mapper>

+ 21 - 19
src/main/webapp/WEB-INF/views/customer/CustomerActiveListForm.html

@@ -44,7 +44,6 @@
 					<td class="dashR">
 						<select name="searchGb">
 							<option value="">선택</option>
-							<option value="custNo">회원번호 </option>
 							<option value="custNm">회원명 </option>
 							<option value="email">이메일</option>
 							<option value="custId">아이디</option>
@@ -132,16 +131,12 @@
 
 <script th:inline="javascript">
 	/*<![CDATA[*/
-	// 사이트목록
-	const siteList = gagajf.convertToArray([[${siteList}]]);
-	// 회원구분
-	const custGbList = gagajf.convertToArray([[${custGbList}]]);
-	// 회원등급
-	const custGradeList = gagajf.convertToArray([[${custGradeList}]]);
-	// 관리대상
-	const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]);
-	// 성별
-	const genderGb = {"G007_F":"여성", "G007_M":"남성"};
+
+	const siteList = gagajf.convertToArray([[${siteList}]]);				// 사이트목록
+	const custGbList = gagajf.convertToArray([[${custGbList}]]);			// 회원구분
+	const custGradeList = gagajf.convertToArray([[${custGradeList}]]);		// 회원등급
+	const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]);	// 관리대상
+	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);		// 성별
 
 	// specify the columns
 	const columnDefs = [
@@ -149,11 +144,12 @@
 			headerName: "사이트", field:'siteCd', width:100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
 		},
-		{headerName: "회원ID", field:'custId', width:120, cellClass: 'text-center'},
-		{headerName: "회원NO", field:'custNo', width:100, cellClass: 'text-center'},
+		{headerName: "회원ID", field:'maskingCustId', width:120, cellClass: 'text-left',
+			valueGetter: function (params) { return params.data.maskingCustId; }
+		},
 		{
-			headerName: "회원명", field:'custNm', width:100, cellClass: 'text-center',
-			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
+			headerName: "회원명", field:'maskingCustNm', width:100, cellClass: 'text-center',
+			cellRenderer: function(params) { return '<a href="javascript:void(0);">' + params.data.maskingCustNm + '</a>'; }
 		},
 		{
 			headerName: "회원구분", field:'custGb', width:100, cellClass: 'text-center',
@@ -175,11 +171,17 @@
 			headerName: "로그인일자", field:'loginLdt', width:120, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.loginLdt); }
 		},
-		{headerName: "핸드폰", field:'cellPhnno', width:140, cellClass: 'text-center'},
-		{headerName: "이메일", field:'email', width:220, cellClass: 'text-center'},
+		{
+			headerName: "핸드폰", field:'maskingCellPhnno', width:140, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.maskingCellPhnno; }
+		},
+		{
+			headerName: "이메일", field:'maskingEmail', width:220, cellClass: 'text-left',
+			valueGetter: function (params) { return params.data.maskingEmail; }
+		},
 		{
 			headerName: "성별", field:'sexGb', width:50, cellClass: 'text-center',
-			valueGetter: function (params) { return gagaAgGrid.lookupValue(genderGb, params.data.sexGb); }
+			valueGetter: function (params) { return gagaAgGrid.lookupValue(genderGbList, params.data.sexGb); }
 		},
 		{headerName: "수신동의(SMS)", field:'smsAgreeYn', width:110, cellClass: 'text-center'},
 		{headerName: "수신동의(Email)", field:'emailAgreeYn', width:110, cellClass: 'text-center'},
@@ -191,7 +193,7 @@
 
 	// 셀 클릭 이벤트
 	gridOptions.onCellClicked = function(event) {
-		 if (event.colDef.field === 'custNm') {
+		 if (event.colDef.field === 'maskingCustNm') {
 			// 고객 상세
 			cfnOpenCustDetailPopup(event.data.custNo);
 		}

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

@@ -0,0 +1,1471 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CustomerDetailForm.html
+ * @desc    : 회원 상세 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.01.18   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" id="popupCustomerDetail">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>회원상세</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCustomerDetail');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<table class="frmStyle" aria-describedby="회원정보">
+				<colgroup>
+					<col style="width:10%;"/>
+					<col style="width:15%;"/>
+					<col style="width:10%;"/>
+					<col style="width:15%;"/>
+					<col style="width:10%;"/>
+					<col style="width:15%;"/>
+				</colgroup>
+				<tbody>
+				<th>이름</th>
+				<td>
+					<span name="custNm"></span>
+					<span name="managedRsnNm" class="infoTxt cRed" style="font-size:15px;"></span>
+				</td>
+				<th>아이디</th>
+				<td><span name="custId"></span>
+					<th:block th:if="${sessionInfo.userId == 'jsshin'}">
+						<button type="button" class="btn btnRight btn-success btn-lg" id="btnLogin">Login</button>
+					</th:block>
+				</td>
+				<!--<th>등급</th>-->
+				<!--<td><span name="custGradeNm"></span></td>-->
+				<th>가입사이트</th>
+				<td><span name="siteNm"></span></td>
+				</tbody>
+			</table>
+
+			<!-- TABS SPACE -->
+			<div class="tabs">
+				<!-- TABS NAVI -->
+				<ul class="tabsNav">
+					<li class="on"><a href="#tab1" onclick="fnSearchCustInfo();">기본정보</a></li>
+					<li><a href="#tab2" onclick="fnSearchOrder();">주문내역</a></li>
+					<li><a href="#tab3" onclick="fnSearchCounsel();">1:1문의내역</a></li>
+					<li><a href="#tab4" onclick="fnSearchGoodsQna();">상품문의내역</a></li>
+					<li><a href="#tab5" onclick="fnSearchCoupon();">쿠폰내역</a></li>
+					<li><a href="#tab6" onclick="fnSearchPoint();">포인트내역</a></li>
+					<li><a href="#tab7" onclick="fnSearchReview();">상품평내역</a></li>
+					<li><a href="#tab8" onclick="fnSearchChangeGrade();">회원등급변경이력</a></li>
+					<li><a href="#tab9" onclick="fnSearchDelivery();">배송지정보</a></li>
+					<li><a href="#tab10" onclick="fnSearchContact();">회원접촉이력</a></li>
+				</ul>
+				<!-- //TABS NAVI -->
+				<!-- TABS CONTENTS -->
+				<ul class="tabsCont">
+					<!-- TAB1 : 회원정보 -->
+					<li class="tab on" id="tab1">
+						<form id="custInfo">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<input type="hidden" name="custNm"/>
+							<input type="hidden" name="homeTelno" data-valid-name="전화번호"/>
+							<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
+							<input type="hidden" name="email" data-valid-name="이메일"/>
+							<input type="hidden" name="orgCustGrade"/>
+							<input type="hidden" name="orgManagedRsn"/>
+							<input type="hidden" name="changeManagedYn" value="N">
+							<input type="hidden" name="changeGradeYn" value="N">
+							<input type="hidden" name="crtfdNoYn" value="N">
+							<!-- TAB1 CONTENTS AREA -->
+							<div class="tabContArea">
+								<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 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 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 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" style="font-size:15px;" name="managedRsnDp"></span>
+										</td>
+										<th class="dashR">관리대상 지정 날짜</th>
+										<td class="dashR" name="managedDt">
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상 지정 사유</th>
+										<td class="dashR" colspan="3">
+											<input type="text" class="w600" name="managedDtlRsn" id="managedDtlRsn"/>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">비밀번호</th>
+										<td class="dashR" colspan="3">
+											*******
+											<button type="button" class="btn btn-info btn-lg" id="btnCustPasswordReset">초기화</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" name="birthYmd" id="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
+										</td>
+										<th class="dashR">성별</th>
+										<td class="dashR" name="sexGb"></td>
+									</tr>
+									<tr>
+										<th class="dashR">자택주소</th>
+										<td class="dashR" colspan="3">
+											<input type="text" name="homePostNo" class="w100" readonly="readonly"/>
+											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfo');">우편번호찾기</button>
+											<br/>
+											<input type="text" name="homeBaseAddr" class="w300" readonly="readonly"/>
+											<input type="text" name="homeDtlAddr" class="w300"/>
+										</td>
+
+									</tr>
+									<tr>
+										<th class="dashR">휴대전화번호<i class="star"></i></th>
+										<td class="dashR">
+											<select 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" class="w50" name="cellPhnno2" id="cellPhnno2" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
+											<input type="text" class="w50" name="cellPhnno3" id="cellPhnno3" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustSendLms">LMS전송</button>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustCrtfd">번호변경</button>
+											<input type="text" class="w200" name="crtfdNo" placeholder="인증번호 입력" style="display: none;">
+											<button type="button" class="btn btn-info btn-lg" id="btnSendCustCrtfdNo" style="display: none;">전송</button>
+											<button type="button" class="btn btn-info btn-lg" id="btnCustCrtfdNo" style="display: none;">확인</button>
+											<span class="infoTxt cBlue" style="display: none;" name="message"></span>
+											<span id="expln" class="infoTxt cBlue"><i class="fa fa-info-circle"></i>인증번호 확인 후 번호변경가능</span>
+											<span id="explnPhone" class="infoTxt cBlue"><i class="fa fa-info-circle"></i>변경 해야 할 휴대폰번호 입력 후 전송</span>
+										</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" class="w300" name="email1"/>
+											@
+											<input type="text" class="w150" name="email2"/>
+											<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" class="btn btn-info btn-lg" id="btnCustSendEmail">이메일발송</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" name="joinDt"></td>
+										<th class="dashR">최종로그인일시</th>
+										<td class="dashR" name="loginDt"></td>
+									</tr>
+									<tr>
+										<th class="dashR">내외국인</th>
+										<td class="dashR" name="foreignerYn"></td>
+										<th class="dashR">탈퇴여부</th>
+										<td class="dashR" name="secedeRsnYn"></td>
+									</tr>
+									<tr>
+										<th class="dashR">SNS가입유형</th>
+										<td class="dashR" name="snsType" colspan="3"></td>
+									</tr>
+									</tbody>
+								</table>
+								<div class="aR" style="margin-top:10px;">
+									<button type="button" class="btn btn-success btn-lg" id="btnCustInfoSave">저장</button>
+								</div>
+							</div>
+							<!-- //TAB1 CONTENTS AREA -->
+						</form>
+					</li>
+					<!-- //TAB1 : 회원정보 -->
+
+					<!-- TAB2 : 주문내역 -->
+					<li class="tab" id="tab2">
+						<!-- TAB2 CONTENTS AREA -->
+						<form id="custOrder">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>주문내역</h4>
+								<div id="custOrderList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+							<!-- //TAB2 CONTENTS AREA -->
+						</form>
+					</li>
+					<!-- //TAB2 : 주문내역 -->
+
+					<!-- TAB3 : 1:1문의 내역 -->
+					<li class="tab" id="tab3">
+						<!-- TAB3 CONTENTS AREA -->
+						<form id="custOnetoOne">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>1:1문의 내역</h4>
+								<div id="custCounselList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //TAB3 CONTENTS AREA -->
+					</li>
+					<!-- //TAB3 : 1:1문의 내역 -->
+
+					<!-- TAB4 : 상품문의 내역 -->
+					<li class="tab" id="tab4">
+						<!-- TAB3 CONTENTS AREA -->
+						<form id="custGoodsQna">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>상품문의 내역</h4>
+								<div id="custGoodsQnaList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //TAB4 CONTENTS AREA -->
+					</li>
+					<!-- //TAB4 : 상품문의 내역 -->
+
+					<!-- TAB5 : 쿠폰 내역 -->
+					<li class="tab" id="tab5">
+						<!-- TAB5 CONTENTS AREA -->
+						<form id="custCoupon">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>쿠폰 내역</h4>
+								<div id="custCouponList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+								<div class="panelBtnB" style="padding-top: 10px;">
+								<span class="btnLeft">
+									<button type="button" class="btn btn-danger btn-lg"id="btnCustCouponDelete">쿠폰삭제</button>
+								</span>
+									<span class="btnRight"><button type="button" class="btn btn-info btn-lg" id="btnCustCouponCreate">쿠폰발급</button></span>
+								</div>
+							</div>
+						</form>
+						<!-- //TAB5 CONTENTS AREA -->
+					</li>
+					<!-- //TAB5 : 쿠폰 내역 -->
+
+					<!-- TAB6 : 포인트 내역 -->
+					<li class="tab" id="tab6">
+						<!-- TAB6 CONTENTS AREA -->
+						<form id="custPoint">
+							<div class="tabContArea">
+								<input type="hidden" name="custNo" th:value="${custNo}"/>
+								<h4>포인트 내역</h4>
+								<table class="tableStyle">
+									<colgroup>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+										<col style="width:20%;"/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th>가용포인트</th>
+										<th>누적 포인트</th>
+										<th>사용포인트</th>
+										<th>적립예정포인트</th>
+										<th>소멸예정포인트(30일)</th>
+									</tr>
+									<tr>
+										<td name="availPntAmt">0 P</td>
+										<td name="accumPntAmt">0 P</td>
+										<td name="usePntAmt">0 P</td>
+										<td name="expectedPntAmt">0 P</td>
+										<td name="expectedExpirePntAmt">0 P</td>
+									</tr>
+									</tbody>
+								</table>
+								<br/>
+								<div id="custPointList" style="width: 100%; height: 420px;" class="ag-theme-balham"></div>
+								<div class="panelBtnB aR" style="padding-top: 10px;">
+									<button type="button" class="btn btn-info btn-lg" id="btnCustPointCreate">포인트부여</button>
+								</div>
+							</div>
+						</form>
+						<!-- //TAB6 CONTENTS AREA -->
+					</li>
+					<!-- //TAB6 : 포인트 내역 -->
+
+					<!-- TAB7 : 상품평 -->
+					<li class="tab" id="tab7">
+						<!-- TAB7 CONTENTS AREA -->
+						<form id="custReview">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>상품평 내역</h4>
+								<div id="custReviewList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //tab7 CONTENTS AREA -->
+					</li>
+					<!-- //TAB7 : 상품평 내역 -->
+
+					<!-- TAB8 : 등급변경이력 -->
+					<li class="tab" id="tab8">
+						<!-- TAB8 CONTENTS AREA -->
+						<form id="custGrade">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea">
+								<h4>등급변경이력</h4>
+								<div id="custGradeList" style="width: 100%; height: 510px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //tab8 CONTENTS AREA -->
+					</li>
+					<!-- //TAB8 : 등급변경이력 -->
+
+					<!-- TAB9 : 배송지정보 -->
+					<li class="tab" id="tab9">
+						<!-- TAB9 CONTENTS AREA -->
+						<form id="custAddr">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<input type="hidden" name="custDelvAddrSq" value=""/>
+							<input type="hidden" name="recipPhnno" value="">
+							<input type="hidden" name="recipTelno" value="">
+							<div class="tabContArea" style="height: 365px;">
+								<h4>배송지정보</h4>
+								<div id="custAddrList" style="width: 100%; height: 300px;" class="ag-theme-balham"></div>
+							</div>
+
+							<div class="aR" style="margin-bottom: 10px;">
+								<button type="button" class="btn btn-info btn-lg" id="btnCustAddrNew">신규</button>
+								<button type="button" class="btn btn-success btn-lg" id="btnCustAddrSave">저장</button>
+							</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><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>
+						</form>
+						<!-- //TAB9 CONTENTS AREA -->
+					</li>
+
+					<!-- TAB10 : 회원접촉이력 -->
+					<li class="tab" id="tab10">
+						<!-- TAB10 CONTENTS AREA -->
+						<form id="custContact">
+							<input type="hidden" name="custNo" th:value="${custNo}"/>
+							<div class="tabContArea" style="height: 454px;">
+								<h4>회원접촉이력</h4>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:3%;"/>
+										<col style="width:7%;"/>
+										<col style="width:6%;"/>
+										<col style="width:5%;"/>
+										<col style="width:6%;"/>
+										<col style="width:29%;"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th>접촉유형<i class="star"></i></th>
+										<td>
+											<select class="w150" name="contactType" required="required" data-valid-type="select" data-valid-name="접촉유형">
+												<option value="">[선택]</option>
+												<option th:if="${contactTypeList}" th:each="oneData, status : ${contactTypeList}" th:value="${oneData.cd}"
+														th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>접촉방법<i class="star"></i></th>
+										<td>
+											<select class="w150" name="contactMethod" required="required" data-valid-type="select" data-valid-name="접촉방법">
+												<option value="">[선택]</option>
+												<option th:if="${contactMethodList}" th:each="oneData, status : ${contactMethodList}"
+														th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
+											</select>
+										</td>
+										<th>내용<i class="star"></i></th>
+										<td>
+											<textarea class="textareaR2 w600" name="contactContents" required="required" data-valid-name="내용"></textarea>
+											<button type="button" class="btn btn-success btn-lg" id="btnSaveContact">저장</button>
+										</td>
+									</tr>
+									</tbody>
+								</table>
+								<br/>
+								<div id="custContactList" style="width: 100%; height: 420px;" class="ag-theme-balham"></div>
+							</div>
+						</form>
+						<!-- //TAB10 CONTENTS AREA -->
+					</li>
+					<!-- //TAB10 : 회원접촉이력 -->
+
+				</ul>
+				<!-- //TABS CONTENTS -->
+			</div>
+			<!-- // TABS SPACE -->
+
+		</div>
+		<!-- //CONTENT -->
+
+	</div>
+</div>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	const custNo = [[${custNo}]];													//고객번호
+	const siteList = gagajf.convertToArray([[${siteList}]]);						//사이트목록
+	//const custGbList = gagajf.convertToArray([[${custGbList}]]);					//회원구분
+	const custGradeList = gagajf.convertToArray([[${custGradeList}]]);				//회원등급
+	//const managedRsnList = gagajf.convertToArray([[${managedRsnList}]]);			//관리대상
+	const mallGbList = gagajf.convertToArray([[${mallGbList}]]);					//몰구분
+	const orderStatList = gagajf.convertToArray([[${orderStatList}]]);				//주문상태
+	const orderDtlStatList = gagajf.convertToArray([[${orderDtlStatList}]]);		//주문상세상태
+	const cpnType = gagajf.convertToArray([[${cpnType}]]);							//쿠폰유형
+	//const dcWayList = gagajf.convertToArray([[${dcWayList}]]);					//쿠폰할인방식
+	const pubReasonList = gagajf.convertToArray([[${pubReasonList}]]);				//쿠폰발행사유
+	const pntOccurGbList = gagajf.convertToArray([[${pntOccurGbList}]]);			//포인트반영구분
+	const pntUploadStatList = gagajf.convertToArray([[${pntUploadStatList}]]);		//포인트반영상태
+	const counselClsfList = gagajf.convertToArray([[${counselClsfList}]]);			//상담분류
+	const contactTypeList = gagajf.convertToArray([[${contactTypeList}]]);			//회원접촉유형
+	const contactMethodList = gagajf.convertToArray([[${contactMethodList}]]);		//회원접촉방법
+	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);				// 성별
+
+	//구매내역 그리드
+	const columnOrderDefs = [
+		{
+			headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "주문상세번호", field: "ordDtlNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "몰구분", field: "mallGb", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(mallGbList, params.value);
+			}
+		},
+		{
+			headerName: "결제일시", field: "payDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "배송완료일시", field: "delvEddt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문자전화번호", field: "orderTelno", width: 120, cellClass: 'text-center'},
+		{headerName: "주문자휴대폰", field: "orderPhnno", width: 130, cellClass: 'text-center'},
+		{
+			headerName: "주문상세상태", field: "ordDtlStat", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(orderDtlStatList, params.value);
+			}
+		},
+		{headerName: "수령인", field: "recipNm", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "상품코드", field: "goodsCd", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "사이즈", field: "sizeCd", 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문의 내역 그리드
+	const columnCounselDefs = [
+		{
+			headerName: "상담분류", field: "counselClsf", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(counselClsfList, params.value);
+			}
+		},
+		{headerName: "상담상세분류", field: "counselDclsf", width: 200, cellClass: 'text-center'},
+		{headerName: "주문번호", field: "relOrdNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "질문제목", field: "questTitle", width: 300, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "등록일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "답변일시", field: "ansTransDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "확인ID", field: "ansId", width: 100, cellClass: 'text-center'},
+		{headerName: "확인자", field: "userNm", width: 100, cellClass: 'text-center'}
+	];
+
+	// 상품문의 내역 그리드
+	const columnGoodsQnaDefs = [
+		{headerName: "상품코드", field: "relGoodsCd", width: 200, cellClass: 'text-center'},
+		{
+			headerName: "질문제목", field: "questTitle", width: 300, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{
+			headerName: "등록일시", field: "questDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "답변일시", field: "ansTransDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "확인ID", field: "ansId", width: 100, cellClass: 'text-center'},
+		{headerName: "확인자", field: "userNm", width: 100, cellClass: 'text-center'}
+	];
+
+	//쿠폰내역 그리드
+	const columnCouponDefs = [
+		{width: 40, minWidth: 40, cellClass: 'text-center', pinned: 'left', headerCheckboxSelection: true, checkboxSelection: true, filter: false},
+		{headerName: "회원쿠폰SQ", field: "custCpnSq", width: 100, cellClass: 'text-center', hide: true},
+		{headerName: "쿠폰ID", field: "cpnId", width: 100, cellClass: 'text-center'},
+		{headerName: "쿠폰명", field: "cpnNm", width: 300, cellClass: 'text-center'},
+		{
+			headerName: "유효기간 시작일시", field: "availStdt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "유효기간 종료일시", field: "availEddt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 130, cellClass: 'text-center'},
+		{
+			headerName: "사용일시", field: "usedDt", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "쿠폰발행 사유", field: "pubReason", width: 200, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pubReasonList, params.value);
+			}
+		},
+		{headerName: "쿠폰발행 상세사유", field: "pubReasonDtl", width: 300, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		}
+	];
+
+	//포인트내역 그리드
+	const columnPointDefs = [
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "반영일시", field: "pntUploadDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "주문번호", field: "ordNo", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "반영상태", field: "pntUploadStat", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pntUploadStatList, params.value); }
+		},
+		{
+			headerName: "포인트", field: "pntAmt", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "포인트사유", field: "occurGb", width: 300, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pntOccurGbList, params.value);
+			}
+		},
+		{headerName: "포인트상세사유", field: "occurDtlDesc", width: 300, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'}
+	];
+
+	//상품평 그리드
+	const columnReviewDefs = [
+		{headerName: "상품코드", field: "goodsCd", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "제목", field: "reviewTitle", width: 300, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "만족도", field: "score", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "작성일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{
+			headerName: "지급일시", field: "confirmDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "지급ID", field: "confirmId", width: 130, cellClass: 'text-center'},
+		{headerName: "게시여부", field: "dispYn", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "지급예정포인트", field: "giveDuePnt", width: 120, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "포인트지급상태", field: "pntGiveStat", width: 120, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(pntUploadStatList, params.value);
+			}
+		}
+	];
+
+	//등급변경 그리드
+	const columnGradeDefs = [
+		{headerName: "적용연월일", field: "applyYmd", width: 150, cellClass: 'text-center'},
+		{headerName: "고객ID", field: "custId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "이전회원등급", field: "gradeBcd", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(custGradeList, params.value);
+			}
+		},
+		{
+			headerName: "변경회원등급", field: "gradeAcd", width: 100, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(custGradeList, params.value);
+			}
+		},
+		{
+			headerName: "3개월간 총 주문건수", field: "ordCnt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		},
+		{
+			headerName: "3개월간 총 결제금액", field: "realOrdAmt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return !gagajf.isNull(params.value) ? params.value.addComma() : '0';
+			}
+		}
+	];
+
+	//주소정보 그리드
+	const columnAddrDefs = [
+		{
+			headerName: "배송지명", field: "delvAddrNm", width: 100, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return '<a href="javascript:void(0);">' + params.value + '</a>';
+			}
+		},
+		{headerName: "수령자", field: "recipNm", width: 100, cellClass: 'text-center'},
+		{headerName: "전화번호", field: "recipTelno", width: 130, cellClass: 'text-center'},
+		{headerName: "휴대전화번호", field: "recipPhnno", width: 130, cellClass: 'text-center'},
+		{headerName: "이메일", field: "recipEmail", width: 150, cellClass: 'text-center'},
+		{headerName: "우편번호", field: "recipPostNo", width: 100, cellClass: 'text-center'},
+		{headerName: "기본주소", field: "recipBaseAddr", width: 300, cellClass: 'text-left'},
+		{headerName: "상세주소", field: "recipDtlAddr", width: 150, cellClass: 'text-left'},
+		{
+			headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "삭제", field: "delYn", width: 50, cellClass: 'text-center'},
+		{headerName: "수정자", field: "updId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "수정일시", field: "updDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		},
+		{headerName: "기본배송지", field: "defaultYn", width: 90, cellClass: 'text-center'}
+	];
+
+	//회원접촉이력 그리드
+	const columnContactDefs = [
+		{
+			headerName: "접촉유형", field: "contactType", width: 150, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(contactTypeList, params.value);
+			}
+		},
+		{
+			headerName: "접촉방법", field: "contactMethod", width: 120, cellClass: 'text-center',
+			valueFormatter: function (params) {
+				return gagaAgGrid.lookupValue(contactMethodList, params.value);
+			}
+		},
+		{headerName: "내용", field: "contactContents", width: 1000, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regId", width: 100, cellClass: 'text-center'},
+		{
+			headerName: "등록일", field: "regDt", width: 150, cellClass: 'text-center',
+			cellRenderer: function (params) {
+				return gagaAgGrid.toDateTimeFormat(params.value);
+			}
+		}
+	];
+
+	let gridOrderOptions = gagaAgGrid.getGridOptions(columnOrderDefs);		//구매내역 그리드
+	let gridCounselOptions = gagaAgGrid.getGridOptions(columnCounselDefs);	//1:1문의내역 그리드
+	let gridGoodsQnaOptions = gagaAgGrid.getGridOptions(columnGoodsQnaDefs);//상품문의내역 그리드
+	let gridCouponOptions = gagaAgGrid.getGridOptions(columnCouponDefs);	//쿠폰내역 그리드
+	let gridPointOptions = gagaAgGrid.getGridOptions(columnPointDefs);		//포인트내역 그리드
+	let gridReviewOptions = gagaAgGrid.getGridOptions(columnReviewDefs);	//상품평 그리드
+	let gridGradeOptions = gagaAgGrid.getGridOptions(columnGradeDefs);		//등급변경 그리드
+	let gridAddrOptions = gagaAgGrid.getGridOptions(columnAddrDefs);		//주소정보 그리드
+	let gridContactOptions = gagaAgGrid.getGridOptions(columnContactDefs);	//회원접촉이력 그리드
+
+	gridCouponOptions.rowSelection = 'multiple';
+
+	// 비밀번호 초기화 버튼
+	$('#btnCustPasswordReset').on('click', function () {
+		//이메일
+		if (!fnCheckValidationEmail('#custInfo'))
+			return false;
+		let jsonData = JSON.stringify($('#custInfo').serializeObject());
+		mcxDialog.confirm("초기화 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				gagajf.ajaxJsonSubmit('/customer/reset/password/save', jsonData, fnSearchCustInfo);
+			}
+		});
+
+	});
+
+	// LMS발송 버튼
+	$('#btnCustSendLms').on('click', function () {
+		let param = {};
+		param.elementCellPhnno = '#custInfo input[name=cellPhnno]';
+		param.elementCustNo = '#custInfo input[name=custNo]';
+		cfnOpenLmsPopup(param);
+	});
+
+	// 인증버튼
+	$('#btnCustCrtfd').on('click', function () {
+		$('#btnSendCustCrtfdNo').show();
+		$('#btnCustCrtfdNo').show();
+		$('#custInfo input[name=crtfdNo]').show();
+		$('#expln').hide();
+		$('#explnPhone').show();
+	});
+
+	// 인증번호 전송
+	$('#btnSendCustCrtfdNo').on('click', function () {
+		//휴대폰번호
+		if (!fnCheckValidationPhnno('#custInfo'))
+			return false;
+
+		mcxDialog.confirm("인증번호를 전송 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let jsonData = JSON.stringify($('#custInfo').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/certno/send', jsonData, function () {
+				});
+			}
+		});
+	});
+
+	// 인증확인버튼
+	$('#btnCustCrtfdNo').on('click', function () {
+		let jsonData = JSON.stringify($('#custInfo').serializeObject());
+		gagajf.ajaxJsonSubmit('/customer/certno/confirm', jsonData, fnCertificationResult);
+	});
+
+	// 이메일발송 버튼
+	$('#btnCustSendEmail').on('click', function () {
+		let param = {};
+		param.elementRecipEmail = '#custInfo input[name=email]';
+		param.elementCustNm = '#custInfo input[name=custNm]';
+		param.elementCustNo = '#custInfo input[name=custNo]';
+		cfnOpenEmailPopup(param);
+	});
+
+	// 이메일 도메인 선택 이벤트
+	$('#custInfo select[name=emailDomain]').on('change', function () {
+
+		let domain = $(this).val();
+		let $email2 = $('#custInfo input[name=email2]');
+		if (domain === '99') {  //기타(직접입력)
+			$email2.val('');
+		} else if (domain !== '99' && !gagajf.isNull(domain)) {
+			$email2.val(domain);
+		}
+
+	});
+
+	// 저장 버튼
+	$('#btnCustInfoSave').on('click', function () {
+
+		//휴대폰번호
+		if (!fnCheckValidationPhnno('#custInfo'))
+			return false;
+		//이메일
+		if (!fnCheckValidationEmail('#custInfo'))
+			return false;
+
+		// 관리대상 변경 여부 및 관리대상 지정 사유
+		let managedRsn = $('#custInfo select[name=managedRsn]').val();
+		let	orgManagedRsn = $('#custInfo input[name=orgManagedRsn]').val();
+		let	managedDtlRsn = $('#custInfo input[name=managedDtlRsn]').val();
+
+		if (managedRsn !== orgManagedRsn && !gagajf.isNull(managedRsn)) { // 관리대상 값 변경시 체크
+			$('#custInfo input[name=changeManagedYn]').val('Y');
+		} else {
+			$('#custInfo input[name=changeManagedYn]').val('N');
+		}
+
+		if (!gagajf.isNull(managedRsn) && gagajf.isNull(managedDtlRsn)) {
+			mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
+			return;
+		}
+
+		// 등급 변경 여부 판단
+		let custGrade = $('#custInfo select[name=custGrade]').val();
+		let orgCustGrade = $('#custInfo input[name=orgCustGrade]').val();
+		let $changeGradeYn = $('#custInfo input[name=changeGradeYn]');
+
+		if (custGrade !== orgCustGrade) { // 등급 변경시 값 체크
+			$changeGradeYn.val('Y');
+		} else {
+			$changeGradeYn.val('Y');
+		}
+		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let jsonData = JSON.stringify($('#custInfo').serializeObject());
+				//console.log(jsonData);
+				gagajf.ajaxJsonSubmit('/customer/info/update', jsonData, fnSearchCustInfo);
+			}
+		});
+	});
+
+	// 쿠폰삭제 버튼
+	$('#btnCustCouponDelete').on('click', function () {
+		let removedData = gagaAgGrid.removeRowData(gridCouponOptions);
+
+		if (removedData.length < 1) {
+			mcxDialog.alert("선택된 데이터가 없습니다.");
+			return;
+		}
+		mcxDialog.confirm("삭제 하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				let updatedData = [];
+
+				$.each(removedData, function (idx, item) {
+					let param = {};
+					param.custCpnSq = item.custCpnSq;
+					param.custNo = item.custNo;
+					updatedData.push(param);
+				});
+
+				let jsonData = JSON.stringify(updatedData);
+				gagajf.ajaxJsonSubmit('/marketing/coupon/cust/delete', jsonData, fnSearchCoupon);
+			}
+		});
+	});
+
+	// 포인트부여 버튼
+	$('#btnCustPointCreate').on('click', function () {
+		cfnGrantPointPopup();
+	});
+
+	// 쿠폰발급 버튼
+	$('#btnCustCouponCreate').on('click', function () {
+		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 () {
+		if (!gagajf.validation('#custContact')) {
+			return;
+		}
+		mcxDialog.confirm("저장하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function () {
+				var jsonData = JSON.stringify($('#custContact').serializeObject());
+				gagajf.ajaxJsonSubmit('/customer/contact/create', jsonData, fnSearchContact);
+			}
+		});
+	});
+
+	// 주문내역 셀 클릭 이벤트
+	gridOrderOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'goodsCd') {
+			let goodsCd = event.data.goodsCd;
+			cfnOpenGoodsDetailPopup('U', goodsCd);
+		}
+		if (event.colDef.field === 'ordNo') {
+			let ordNo = event.data.ordNo;
+			cfnOpenOrderDetailPopup(ordNo);
+		}
+	};
+
+	// 1:1문의 내역 셀 클릭 이벤트
+	gridCounselOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'questTitle') {
+			let counselSq = event.data.counselSq;
+			cfnOpenOneToOneQnaDetailPopup(counselSq);
+		}
+	};
+
+	// 상품문의 내역 셀 클릭 이벤트
+	gridGoodsQnaOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'questTitle') {
+			let counselSq = event.data.counselSq;
+			cfnOpenGoodsQnaDetailPopup(counselSq);
+		}
+	};
+
+	// 상품평내역 셀 클릭 이벤트
+	gridReviewOptions.onCellClicked = function (event) {
+		if (event.colDef.field === 'reviewTitle') {
+			let reviewSq = event.data.reviewSq;
+			cfnOpenReviewDetailPopup(reviewSq);
+		}
+	};
+
+	// 주소지 셀 클릭 이벤트
+	gridAddrOptions.onCellClicked = function (event) {
+		if (event.colDef.field !== 'delvAddrNm')
+			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);
+
+			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]);
+			}
+
+			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]);
+			}
+
+			$('#custAddr input[name=recipPostNo]').val(event.data.recipPostNo);
+			$('#custAddr input[name=recipBaseAddr]').val(event.data.recipBaseAddr);
+			$('#custAddr 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);
+
+		}
+	};
+
+	// 회원정보 조회
+	var fnSearchCustInfo = function () {
+		$.get('/customer/info/' + custNo
+			, function (data) {
+				if (!gagajf.isNull(data)) {
+					$('span[name=custNm]').text(data.maskingCustNm);
+					$('span[name=custId]').text(data.maskingCustId);
+					$('span[name=siteNm]').text(gagaAgGrid.lookupValue(siteList, data.siteCd));
+					$('span[name=custNo]').text(data.custNo);
+					$('span[name=custGradeNm]').text(data.custGradeNm);
+					$('#custInfo select[name=custGrade]').val(data.custGrade);
+					$('#custInfo select[name=custGb]').val(data.custGb);
+					$('#custInfo select[name=managedRsn]').val(data.managedRsn);
+					$('#custInfo input[name=orgManagedRsn]').val(data.managedRsn);
+					$('#custInfo input[name=managedDtlRsn]').val(data.managedDtlRsn);
+					$('#custInfo td[name=managedDt]').text(gagaAgGrid.toDateTimeFormat(data.managedDt));
+					$('#custInfo td[name=joinDt]').text(gagaAgGrid.toDateTimeFormat(data.joinDt));
+
+					if (gagajf.isNull(data.loginDt)) {
+						$('#custInfo td[name=loginDt]').text("로그인 이력이 없습니다.");
+					} else {
+						$('#custInfo td[name=loginDt]').text(gagaAgGrid.toDateTimeFormat(data.loginDt));
+					}
+					$('#custInfo td[name=foreignerYn]').text(data.foreignerYn == 'Y' ? '외국인' : '내국인');
+					let secedeRsnYn = gagajf.isNull(data.secedeRsn) ? '아니요' : '예';
+					if (data.custStat == '10') {
+						secedeRsnYn = secedeRsnYn + '<button type="button" class="btn btn-danger btn-lg" style="margin-left: 5px;" onClick="fnCustomerSecede();">회원탈퇴</button>';
+					}
+					$('#custInfo td[name=secedeRsnYn]').html(secedeRsnYn);
+					let snsType = '';
+					if (!gagajf.isNull(data.nvJoinId)) {
+						snsType = 'NAVER'
+					}
+					if (!gagajf.isNull(data.kkJoinId)) {
+						if (!gagajf.isNull(snsType)) {
+							snsType += ','
+						}
+						snsType += 'KAKAO';
+					}
+					if (!gagajf.isNull(data.ysJoinId)) {
+						if (!gagajf.isNull(snsType)) {
+							snsType += ','
+						}
+						snsType += 'YES24';
+					}
+					$('#custInfo td[name=snsType]').text(snsType);
+					$('#custInfo input[name=homePostNo]').val(data.homePostNo);
+					$('#custInfo input[name=homeBaseAddr]').val(data.homeBaseAddr);
+					$('#custInfo input[name=homeDtlAddr]').val(data.homeDtlAddr);
+					$('#custInfo input[name=cellPhnno]').val(data.cellPhnno);
+					$('#custInfo input[name=custNm]').val(data.custNm);
+					$('#custInfo input[name=email]').val(data.email);
+					$('#custInfo input[name=orgCustGrade]').val(data.custGrade);
+					$('#custInfo td[name=sexGb]').text(gagaAgGrid.lookupValue(genderGbList, data.sexGb));
+
+					const $managedRsnNm = $('span[name=managedRsnNm]');
+					const $managedRsnDp = $('span[name=managedRsnDp]');
+
+					$managedRsnNm.text('');
+					$managedRsnNm.hide();
+					$managedRsnDp.text('');
+					$managedRsnDp.hide();
+					if (!gagajf.isNull(data.managedRsnNm)) {
+						let html = '<i class="fa fa-info-circle"></i>';
+						$managedRsnNm.html(html);
+						$managedRsnNm.show();
+						$managedRsnDp.html(html);
+						$managedRsnDp.show();
+					}
+
+					if (!gagajf.isNull(data.birthYmd)) {
+						$('#custInfo input[name=birthYmd]').val(data.birthYmd.toDate('YYYYMMDD').format("YYYY-MM-DD"));
+					}
+
+					if (!gagajf.isNull(data.maskingCellPhnno)) {
+						let cellPhnno = data.maskingCellPhnno.split("-");
+						$('#custInfo select[name=cellPhnno1]').val(cellPhnno[0]);
+						$('#custInfo input[name=cellPhnno2]').val(cellPhnno[1]);
+						$('#custInfo input[name=cellPhnno3]').val(cellPhnno[2]);
+					}
+
+					if (!gagajf.isNull(data.maskingEmail)) {
+						let email = data.maskingEmail.split("@");
+						$('#custInfo input[name=email1]').val(email[0]);
+						$('#custInfo input[name=email2]').val(email[1]);
+					}
+					const $emailAgreeYn = $('#custInfo input:radio[name=emailAgreeYn]');
+					let emailAgreeYn = data.emailAgreeYn === 'Y' ? 0 : 1;
+					$emailAgreeYn.eq(emailAgreeYn).prop('checked', true);
+					$emailAgreeYn.eq(emailAgreeYn).parent().addClass('checked');
+
+					const $smsAgreeYn = $('#custInfo input:radio[name=smsAgreeYn]');
+					let smsAgreeYn = data.smsAgreeYn === 'Y' ? 0 : 1;
+					$smsAgreeYn.eq(smsAgreeYn).prop('checked', true);
+					$smsAgreeYn.eq(smsAgreeYn).parent().addClass('checked');
+
+				}
+			});
+		const $crtfdNo = $('#custInfo input[name=crtfdNo]');
+		const $message = $('#custInfo span[name=message]');
+
+		$crtfdNo.val('');
+		$crtfdNo.hide();
+		$message.text('');
+		$message.hide();
+		$('#custInfo input[name=crtfdNoYn]').val('N');
+		$('#btnCustCrtfdNo').hide();
+		$('#btnSendCustCrtfdNo').hide();
+		$('#explnPhone').hide();
+	};
+
+	// 구매내역 조회
+	var fnSearchOrder = function () {
+		const actionUrl = "/customer/order/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridOrderOptions);
+	};
+
+	//	1:1문의 내역 조회
+	var fnSearchCounsel = function () {
+		const actionUrl = "/customer/counsel/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridCounselOptions);
+	};
+
+	//	상품문의 내역 조회
+	var fnSearchGoodsQna = function () {
+		const actionUrl = "/customer/goodsQna/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGoodsQnaOptions);
+	};
+
+	//	쿠폰내역 조회
+	var fnSearchCoupon = function () {
+		const actionUrl = "/customer/coupon/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridCouponOptions);
+	};
+
+	// 	포인트내역 조회
+	var fnSearchPoint = function () {
+		$.get('/customer/point/' + custNo
+			, function (data) {
+				if (!gagajf.isNull(data)) {
+					$('#custPoint td[name=availPntAmt]').text(data.availPntAmt.addComma() + ' P');
+					$('#custPoint td[name=accumPntAmt]').text(data.accumPntAmt.addComma() + ' P');
+					$('#custPoint td[name=usePntAmt]').text(data.usePntAmt.addComma() + ' P');
+					$('#custPoint td[name=expectedPntAmt]').text(data.expectedPntAmt.addComma() + ' P');
+					$('#custPoint td[name=expectedExpirePntAmt]').text(data.expirePntAmt.addComma() + ' P');
+				}
+			});
+		const actionUrl = "/customer/point/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridPointOptions);
+	};
+
+	// 상품평내역 조회
+	var fnSearchReview = function () {
+		const actionUrl = "/customer/review/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridReviewOptions);
+	};
+
+	// 회원등급변경이력 조회
+	var fnSearchChangeGrade = function () {
+		const actionUrl = "/customer/change/grade/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridGradeOptions);
+	};
+
+	// 주소정보 조회
+	var fnSearchDelivery = function () {
+		const actionUrl = "/customer/delivery/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridAddrOptions);
+		$('#btnCustAddrNew').trigger('click');
+	};
+
+	// 회원접촉이력 조회
+	var fnSearchContact = function () {
+		const actionUrl = "/customer/contact/list/" + custNo;
+		gagaAgGrid.fetch(actionUrl, gridContactOptions);
+	};
+
+
+	/**
+	 * DAUM을 이용한 우편번호 팝업 레이어
+	 */
+	var fnOpenDaumAddr = function(id) {
+		let daumZip = new daum.Postcode({
+			oncomplete: function(data) {
+				// 우편번호와 주소 정보를 해당 필드에 넣는다.
+				if (id == 'custInfo') {
+					let formId = '#' + id;
+					$(formId + ' input[name=homePostNo]').val(data.zonecode);
+					$(formId + ' input[name=homeBaseAddr]').val(cfnGetDaumRoadAddr(data));
+					$(formId + ' input[name=homeDtlAddr]').focus();
+				}
+
+				if (id == 'custAddr') {
+					let formId = '#' + id;
+					$(formId + ' input[name=recipPostNo]').val(data.zonecode);
+					$(formId + ' input[name=recipBaseAddr]').val(cfnGetDaumRoadAddr(data));
+				}
+
+				cfnCloseDaumAddr();
+			},
+			width: '100%'
+		});
+
+		cfnOpenDaumAddr(daumZip);
+	}
+
+	// 휴대전화 유효성체크
+	var fnCheckValidationPhnno = function (formId) {
+		let result = true;
+		let cellPhnno1 = $(formId + ' select[name=cellPhnno1]').val();
+		let cellPhnno2 = $(formId + ' input[name=cellPhnno2]').val();
+		let cellPhnno3 = $(formId + ' input[name=cellPhnno3]').val();
+		let cellPhnno  = cellPhnno1 + '-' + cellPhnno2 + '-' + cellPhnno3;
+		$(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 (formId) {
+		let result = true;
+
+		let email1 = $(formId + ' input[name=email1]').val();
+		let email2 = $(formId + ' input[name=email2]').val();
+
+		const $email = $(formId + ' input[name=email]');
+		$email.val(email1 + '@' + email2);
+
+		if (!gagajf.testRegexp($email, /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/)) {
+			result = false;
+		}
+
+		return result;
+	};
+
+	var fnCertificationResult = function (data) {
+		const $message = $('#custInfo span[name=message]');
+
+		if (data.crtfdNoYn === 'Y') {
+			mcxDialog.alert("인증이 완료되었습니다.");
+			$message.text('');
+			$message.hide();
+		} else {
+			$message.text('인증번호가 일치하지 않습니다.\n확인 후 다시 입력해 주세요.');
+			$message.show();
+		}
+
+		$('#custInfo input[name=crtfdNoYn]').val(data.crtfdNoYn);
+	};
+
+	var fnCustomerSecede = function () {
+
+		if (gagajf.isNull(custNo)) {
+			mcxDialog.alert("탈퇴시킬 회원번호가 없습니다.");
+			return;
+		}
+
+		const actionUrl = "/customer/info/secede/form";
+		let paramsStr = "?custNo=" + custNo;
+		paramsStr += "&callBackFn=" + 'fnCustomerNotUseAfter';
+
+		cfnOpenModalPopup(actionUrl + paramsStr, 'popupCustSecede');
+	};
+
+	var fnCustomerNotUseAfter = function () {
+
+		if (!gagajf.isNull(fnSearch) && typeof fnSearch == "function") {
+			fnSearch();
+		}
+
+		uifnPopupClose('popupCustomerDetail');
+
+	};
+
+	$('#btnLogin').on('click', function () {
+		let custId = $('span[name=custId]').text();
+		const actionUrl = _frontUrl + '/customer/front/login?custId=' + custId;
+		let popupWidth = window.screen.width;
+		let popupHeight = window.screen.height;
+		window.open(actionUrl);
+	})
+
+	$(document).ready(function () {
+		// 생년월일 달력 설정
+		const $birthYmd = $('#custInfo input[name=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();
+
+		gagaAgGrid.createGrid('custOrderList', gridOrderOptions);		// 주문내역
+
+		gagaAgGrid.createGrid('custCounselList', gridCounselOptions);	// 1:1문의 내역
+
+		gagaAgGrid.createGrid('custGoodsQnaList', gridGoodsQnaOptions);	// 상품문의 내역
+
+		gagaAgGrid.createGrid('custCouponList', gridCouponOptions);		// 쿠폰내역
+
+		gagaAgGrid.createGrid('custPointList', gridPointOptions);		// 포인트내역 그리드
+
+		gagaAgGrid.createGrid('custReviewList', gridReviewOptions);		// 상품평 그리드
+
+		gagaAgGrid.createGrid('custGradeList', gridGradeOptions);		// 등급변경 그리드
+
+		gagaAgGrid.createGrid('custAddrList', gridAddrOptions);			// 주소정보 그리드
+
+		gagaAgGrid.createGrid('custContactList', gridContactOptions);	// 회원접촉이력 그리드
+	});
+
+
+	/*]]>*/
+</script>
+
+</html>

+ 5 - 6
src/main/webapp/WEB-INF/views/customer/CustomerDormantListForm.html

@@ -44,7 +44,6 @@
 					<td class="dashR">
 						<select name="searchGb">
 							<option value="">선택</option>
-							<option value="custNo">회원번호 </option>
 							<option value="custNm">회원명 </option>
 							<option value="email">이메일</option>
 							<option value="custId">아이디</option>
@@ -99,9 +98,10 @@
 			headerName: "사이트", field:'siteCd', width:100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
 		},
-		{headerName: "회원ID", field:'custId', width:120, cellClass: 'text-center'},
-		{headerName: "회원명", field:'custNm', width:100, cellClass: 'text-center'},
-		{headerName: "핸드폰", field:'cellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "회원ID", field:'maskingCustId', width:120, cellClass: 'text-left'},
+		{headerName: "회원명", field:'maskingCustNm', width:100, cellClass: 'text-left'},
+		{headerName: "핸드폰", field:'maskingCellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "이메일", field:'maskingEmail', width:220, cellClass: 'text-left'},
 		{
 			headerName: "생년월일", field:'birthYmd', width:90, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.birthYmd); }
@@ -109,8 +109,7 @@
 		{
 			headerName: "휴면일자", field:'dormantDt', width:120, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.dormantDt); }
-		},
-		{headerName: "이메일", field:'email', width:220, cellClass: 'text-center'}
+		}
 	];
 
 	// Get GridOptions

+ 7 - 8
src/main/webapp/WEB-INF/views/customer/CustomerSecedeListForm.html

@@ -44,7 +44,6 @@
 					<td class="dashR">
 						<select name="searchGb">
 							<option value="">선택</option>
-							<option value="custNo">회원번호 </option>
 							<option value="custNm">회원명 </option>
 							<option value="email">이메일</option>
 							<option value="custId">아이디</option>
@@ -62,9 +61,9 @@
 				<tr>
 					<th class="dashR">탈퇴사유</th>
 					<td class="dashR">
-						<select name="secedeGb" class="w200">
+						<select name="secedeRsn" class="w200">
 							<option value="">전체</option>
-							<option th:if="${secedeGbList}" th:each="oneData, status : ${secedeGbList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+							<option th:if="${secedeRsnList}" th:each="oneData, status : ${secedeRsnList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
 						</select>
 					</td>
 					<th class="dashR">휴대폰번호(숫자만)</th>
@@ -108,9 +107,10 @@
 			headerName: "사이트", field:'siteCd', width:100, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.lookupValue(siteList, params.data.siteCd); }
 		},
-		{headerName: "회원ID", field:'custId', width:120, cellClass: 'text-center'},
-		{headerName: "회원명", field:'custNm', width:100, cellClass: 'text-center'},
-		{headerName: "핸드폰", field:'cellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "회원ID", field:'maskingCustId', width:120, cellClass: 'text-left'},
+		{headerName: "회원명", field:'maskingCustNm', width:100, cellClass: 'text-left'},
+		{headerName: "핸드폰", field:'maskingCellPhnno', width:140, cellClass: 'text-center'},
+		{headerName: "이메일", field:'maskingEmail', width:220, cellClass: 'text-left'},
 		{
 			headerName: "생년월일", field:'birthYmd', width:90, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.birthYmd); }
@@ -118,8 +118,7 @@
 		{
 			headerName: "탈퇴일자", field:'secedeDt', width:120, cellClass: 'text-center',
 			valueGetter: function (params) { return gagaAgGrid.toDateFormat(params.data.secedeDt); }
-		},
-		{headerName: "이메일", field:'email', width:220, cellClass: 'text-center'}
+		}
 	];
 
 	// Get GridOptions

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

@@ -521,8 +521,8 @@ var cfnOpenLookbookBannerPopup = function(lookbookSq, lookbookTitle) {
  * @author : jsshin
  */
 var cfnOpenCustDetailPopup = function(custNo) {
-	var actionUrl = "/customer/detail/form?custNo=" + custNo;
-	cfnOpenModalPopup(actionUrl,'popupCustDetail');
+	var actionUrl = "/customer/detail/form/" + custNo;
+	cfnOpenModalPopup(actionUrl,'popupCustomerDetail');
 }
 
 /**