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

Merge branch 'jsshin' into develop

jsshin 5 лет назад
Родитель
Сommit
cdba60ba82

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

@@ -37,15 +37,6 @@ public interface TsaCustomerDao {
 	 */
 	Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch);
 
-	/**
-	 * 회원 정보
-	 * @param custNo - 고객번호
-	 * @return Customer
-	 * @author jsshin
-	 * @since 2021. 01. 18
-	 */
-	Customer getCustomerInfo(Integer custNo);
-
 	/**
 	 * 회원정보 수정
 	 * @param customer - 고객정보

+ 48 - 22
src/main/java/com/style24/admin/biz/service/TsaCustomerService.java

@@ -1,9 +1,10 @@
 package com.style24.admin.biz.service;
 
+import com.gagaframework.web.parameter.GagaMap;
 import com.style24.admin.biz.dao.TsaCustomerDao;
 import com.style24.admin.support.security.session.TsaSession;
-import com.style24.core.biz.dao.TscCustomerDao;
 import com.style24.core.biz.service.TscCustomerService;
+import com.style24.core.support.env.TscConstants;
 import com.style24.persistence.domain.Counsel;
 import com.style24.persistence.domain.Coupon;
 import com.style24.persistence.domain.CustContactHst;
@@ -17,6 +18,7 @@ import com.style24.persistence.domain.Point;
 import com.style24.persistence.domain.Review;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -44,7 +46,7 @@ public class TsaCustomerService {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 12
+	 * @since 2021. 1. 12
 	 */
 	public Collection<Customer> getCustomerActiveList(CustomerSearch customerSearch) {
 		return customerDao.getCustomerActiveList(customerSearch);
@@ -55,25 +57,38 @@ public class TsaCustomerService {
 	 * @param custNo - 고객번호
 	 * @return Customer
 	 * @author jsshin
-	 * @since 2020. 01. 18
+	 * @since 2021. 1. 18
 	 */
 	public Customer getCustomerInfo(Integer custNo) {
-		return customerDao.getCustomerInfo(custNo);
+		Customer customer = new Customer();
+		customer.setCustNo(custNo);
+		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
+		return coreCustomerService.getCustomerInfo(customer);
 	}
 
 	/**
 	 * 회원정보 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 1. 20
 	 */
 	@Transactional("shopTxnManager")
 	public void saveCustomerInfo(Customer customer) {
 		Integer userNo = TsaSession.getInfo().getUserNo();
 		customer.setRegNo(userNo);
 		customer.setUpdNo(userNo);
+
 		// 고객 이력 생성
 		coreCustomerService.createCustomerHistory(customer);
+
+		// 마케팅수신동의 이력 화면단에서 수신 변경이 없으면 ''처리
+		if (StringUtils.isNotBlank(customer.getSmsAgreeYn())
+				|| StringUtils.isNotBlank(customer.getSmsAgreeYn())
+				|| StringUtils.isNotBlank(customer.getAppAgreeYn()) ){
+
+			coreCustomerService.createCustomerMarketHst(customer);
+		}
+
 		// 정보 수정
 		customerDao.updateCustomerInfo(customer);
 	}
@@ -82,7 +97,7 @@ public class TsaCustomerService {
 	 * 회원 비밀번호 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 20
+	 * @since 2021. 1. 20
 	 */
 	@Transactional("shopTxnManager")
 	public void updateCustomerPassword(Customer customer) {
@@ -93,7 +108,7 @@ public class TsaCustomerService {
 	 * 회원 휴대전화번호 수정
 	 * @param customer - 고객정보
 	 * @author jsshin
-	 * @since 2020. 01. 25
+	 * @since 2021. 1. 25
 	 */
 	@Transactional("shopTxnManager")
 	public void updateCustomerCellphnno(Customer customer) {
@@ -104,12 +119,24 @@ public class TsaCustomerService {
 		customerDao.updateCustomerCellPhnno(customer);
 	}
 
+	/**
+	 * 회원 탈퇴처리
+	 * @param customer - 고객정보
+	 * @author jsshin
+	 * @since 2021. 1. 26
+	 */
+	@Transactional("shopTxnManager")
+	public GagaMap saveCustomerSecede(Customer customer) {
+		customer.setCustStat(TscConstants.CustStat.SECEDE.value());
+		return coreCustomerService.saveCustomerSecede(customer);
+	}
+
 	/**
 	 * 회원 주문내역
 	 * @param custNo - 고객번호
 	 * @return Collection<Order>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Order> getCustomerOrderList(Integer custNo) {
 		return customerDao.getCustomerOrderList(custNo);
@@ -121,7 +148,7 @@ public class TsaCustomerService {
 	 * @param custNo - 고객번호
 	 * @return Collection<Delivery>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Delivery> getCustomerDeliveryAddrList(Integer custNo) {
 		return customerDao.getCustomerDeliveryAddrList(custNo);
@@ -151,7 +178,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Coupon>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Coupon> getCustomerCouponList(Integer custNo) {
 		return customerDao.getCustomerCouponList(custNo);
@@ -163,7 +190,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Point
 	 * @author jsshin
-	 * @since 2021. 01. 25
+	 * @since 2021. 1. 25
 	 */
 	public Point getCustomerPoint(Integer custNo){
 		return customerDao.getCustomerPoint(custNo);
@@ -175,7 +202,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Coupon>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Point> getCustomerPointList(Integer custNo) {
 		return customerDao.getCustomerPointList(custNo);
@@ -187,7 +214,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<GiftCard>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<GiftCard> getCustomerGiftCardList(Integer custNo) {
 		return customerDao.getCustomerGiftCardList(custNo);
@@ -199,7 +226,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Review>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Review> getCustomerReviewList(Integer custNo) {
 		return customerDao.getCustomerReviewList(custNo);
@@ -211,7 +238,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Counsel> getCustomerCounselList(Integer custNo) {
 		return customerDao.getCustomerCounselList(custNo);
@@ -223,7 +250,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<Counsel> getCustomerGoodsQnaList(Integer custNo) {
 		return customerDao.getCustomerGoodsQnaList(custNo);
@@ -235,7 +262,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<CustGrade> getCustomerChangeGradeList(Integer custNo) {
 		return customerDao.getCustomerChangeGradeList(custNo);
@@ -247,7 +274,7 @@ public class TsaCustomerService {
 	 * @param custNo -고객일련번호
 	 * @return Collection<Counsel>
 	 * @author jsshin
-	 * @since 2021. 01. 21
+	 * @since 2021. 1. 21
 	 */
 	public Collection<CustContactHst> getCustomerContactList(Integer custNo) {
 		return customerDao.getCustomerContactList(custNo);
@@ -259,7 +286,7 @@ public class TsaCustomerService {
 	 * @param custContactHst -고객정보
 	 * @return void
 	 * @author jsshin
-	 * @since 2021. 01. 25
+	 * @since 2021. 1. 25
 	 */
 	@Transactional("shopTxnManager")
 	public void createCustomerContactHistory(CustContactHst custContactHst) {
@@ -276,7 +303,7 @@ public class TsaCustomerService {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2020. 0. 14
 	 */
 	public Collection<Customer> getCustomerSecedeList(CustomerSearch customerSearch) {
 		return customerDao.getCustomerSecedeList(customerSearch);
@@ -287,12 +314,11 @@ public class TsaCustomerService {
 	 * @param customerSearch - 검색조건
 	 * @return Collection<Customer>
 	 * @author jsshin
-	 * @since 2020. 01. 14
+	 * @since 2020. 1. 14
 	 */
 	public Collection<Customer> getCustomerDormantList(CustomerSearch customerSearch) {
 		return customerDao.getCustomerDormantList(customerSearch);
 	}
 
 
-
 }

+ 34 - 0
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

@@ -401,6 +401,7 @@ public class TsaCustomerController extends TsaBaseController {
 	@ResponseBody
 	public Customer getCustomerInfo(@PathVariable Integer custNo) {
 		TscSession.setAttribute("maskingYn", TsaSession.getInfo().getMaskingYn());
+
 		return customerService.getCustomerInfo(custNo);
 	}
 
@@ -433,6 +434,7 @@ public class TsaCustomerController extends TsaBaseController {
 		String tempPasswd = systemService.getTemporaryPassword(10);
 		log.info("tempPasswd  ====> {}", tempPasswd);
 
+		customer.setTempPasswdYn("Y"); // 임시비밀번호여부
 		customer.setPasswd(tempPasswd);
 		customer.setEncodedPasswd(passwordEncoder.encodeSha256(tempPasswd));
 		customer.setRegNo(TsaSession.getInfo().getRegNo());
@@ -646,6 +648,38 @@ public class TsaCustomerController extends TsaBaseController {
 		return super.ok(message.getMessage("SUCC_0005"));
 	}
 
+	/**
+	 * 회원탈퇴처리
+	 *
+	 * @param elementCustNo - 고객일련번호
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 01. 21
+	 */
+	@GetMapping("/secede/popup/form")
+	public ModelAndView emailPopupForm( @RequestParam(value = "elementCustNo") String elementCustNo) {
+
+		ModelAndView mav = new ModelAndView();
+
+		// 고객일련번호
+		mav.addObject("elementCustNo", elementCustNo);
+
+		// 탈퇴 구분
+		mav.addObject("secedeRsnList", rendererService.getCommonCodeList("G102", "Y"));
+
+		mav.setViewName("customer/CustomerSecedePopupForm");
+
+		return mav;
+	}
+	@PostMapping("/secede/save")
+	@ResponseBody
+	public GagaMap saveCustomerSecede(@RequestBody Customer customer) {
+		Integer userNo = TsaSession.getInfo().getUserNo();
+		customer.setRegNo(userNo);
+		customer.setUpdNo(userNo);
+		return customerService.saveCustomerSecede(customer);
+	}
+
 	/**
 	 * 회원상세-주문내역목록
 	 *

+ 20 - 87
src/main/java/com/style24/persistence/mybatis/shop/TsaCustomer.xml

@@ -114,119 +114,52 @@
 		</if>
 	</select>
 
-	<!-- 회원기본정보 -->
-	<select id="getCustomerInfo" parameterType="Integer" 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_ZIPCODE
-		     , 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>
-
 	<!--회원정보 수정-->
 	<update id="updateCustomerInfo" parameterType="Customer">
 		/* TsaCustomer.updateCustomerInfo */
 		UPDATE TB_CUSTOMER
 		<set>
-		    <if test="custGb != null and custGb != ''">
-		     CUST_GB = #{custGb},
-		    </if>
-		    <if test="custGrade != null and custGrade !=''">
-		     CUST_GRADE = #{custGrade},
-		    </if>
+		      CUST_GB = #{custGb}
+		    , CUST_GRADE = #{custGrade}
 		    <if test="emailAgreeYn != null and emailAgreeYn != ''">
-		     EMAIL_AGREE_DT = CASE WHEN EMAIL_AGREE_YN = #{emailAgreeYn}
-		                      THEN EMAIL_AGREE_DT
-		                      ELSE NOW()
-		                      END,
-		     EMAIL_AGREE_YN = #{emailAgreeYn},
+		    , EMAIL_AGREE_DT = NOW()
+		    , EMAIL_AGREE_YN = #{emailAgreeYn}
 		    </if>
 		    <if test="smsAgreeYn != null and smsAgreeYn != ''">
-		     SMS_AGREE_DT = CASE WHEN SMS_AGREE_YN = #{smsAgreeYn}
-		                    THEN SMS_AGREE_DT
-		                    ELSE NOW()
-		                    END,
-		     SMS_AGREE_YN = #{smsAgreeYn},
+		    , SMS_AGREE_DT = NOW()
+		    , SMS_AGREE_YN = #{smsAgreeYn}
 		    </if>
 		    <if test="homeZipcode != null and homeZipcode != ''">
-		     HOME_ZIPCODE = #{homeZipcode},
+		    , HOME_ZIPCODE = #{homeZipcode}
 		    </if>
 		    <if test="homeBaseAddr != null and homeBaseAddr != ''">
-		     HOME_BASE_ADDR = #{homeBaseAddr},
+		    , HOME_BASE_ADDR = #{homeBaseAddr}
 		    </if>
 		    <if test="homeDtlAddr != null and homeDtlAddr != ''">
-		     HOME_DTL_ADDR = #{homeDtlAddr},
+		    , HOME_DTL_ADDR = #{homeDtlAddr}
 		    </if>
 		    <if test="birthYmd != null and birthYmd != ''">
-		     BIRTH_YMD = REPLACE(#{birthYmd}, '-', ''),
+		    , BIRTH_YMD = REPLACE(#{birthYmd}, '-', '')
 		    </if>
 		    <if test="email != null and email != ''">
-		     EMAIL = #{email},
+		    , EMAIL = #{email}
 		    </if>
 		    <if test="managedRsn != null and managedRsn != ''">
-		     MANAGED_DT = CASE WHEN MANAGED_RSN = #{managedRsn}
+		    , MANAGED_DT = CASE WHEN MANAGED_RSN = #{managedRsn}
 		                       AND  MANAGED_DTL_RSN = #{managedDtlRsn}
 		                  THEN MANAGED_DT
 		                  ELSE NOW()
-		                  END,
-		     MANAGED_RSN = #{managedRsn},
-		     MANAGED_DTL_RSN = #{managedDtlRsn},
+		                  END
+		    , MANAGED_RSN = #{managedRsn}
+		    , MANAGED_DTL_RSN = #{managedDtlRsn}
 		    </if>
 		    <if test="managedRsn == null or managedRsn == ''">
-		     MANAGED_RSN = NULL,
-		     MANAGED_DTL_RSN =  NULL,
-		     MANAGED_DT = NULL,
+		    , MANAGED_RSN = NULL
+		    , MANAGED_DTL_RSN =  NULL
+		    , MANAGED_DT = NULL
 		    </if>
-		     UPD_NO = #{updNo},
-		     UPD_DT = NOW()
+		    , UPD_NO = #{updNo}
+		    , UPD_DT = NOW()
 		</set>
 		WHERE CUST_NO = #{custNo}
 	</update>

+ 60 - 52
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -92,14 +92,14 @@
 									</colgroup>
 									<tbody>
 									<tr>
-										<th class="dashR">회원구분<i class="star"></i></th>
+										<th class="dashR">회원구분<em class="required" title="필수"></em></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>
+										<th class="dashR">회원등급<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<select id="custGrade" name="custGrade">
 												<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
@@ -156,7 +156,7 @@
 										</td>
 									</tr>
 									<tr>
-										<th class="dashR">휴대전화번호<i class="star"></i></th>
+										<th class="dashR">휴대전화번호<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
 											<select id="firstNo" name="firstNo">
@@ -171,14 +171,14 @@
 											<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>
+										<th class="dashR">SMS수신여부<em class="required" title="필수"></em></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>
+										<th class="dashR">이메일<em class="required" title="필수"></em></th>
 										<td class="dashR">
 											<input type="hidden" name="email" data-valid-name="이메일"/>
 											<input type="text" id="emailId" name="emailId" class="w300"/>
@@ -191,7 +191,7 @@
 											</select>
 											<button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
 										</td>
-										<th class="dashR">메일수신여부<i class="star"></i></th>
+										<th class="dashR">메일수신여부<em class="required" title="필수"></em></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>
@@ -207,7 +207,12 @@
 										<th class="dashR">내외국인</th>
 										<td class="dashR" id="foreignerYn" name="foreignerYn"></td>
 										<th class="dashR">탈퇴여부</th>
-										<td class="dashR" id="secedeRsnYn" name="secedeRsnYn"></td>
+										<td class="dashR">
+											<spna id="secedeRsnYn" name="secedeRsnYn" ></spna>
+											<button type="button" id="btnCustSecede" class="btn btn-danger btn-lg marL5" style="display: none">
+												회원탈퇴
+											</button>
+										</td>
 									</tr>
 									<tr>
 										<th class="dashR">SNS가입유형</th>
@@ -258,14 +263,14 @@
 									</colgroup>
 									<tbody>
 									<tr>
-										<th>배송지명<i class="star"></i></th>
+										<th>배송지명<em class="required" title="필수"></em></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>
+										<th>수령인<em class="required" title="필수"></em></th>
 										<td>
 											<input type="text" class="w200" name="recipNm" maxlength="10" required="required" data-valid-name="수령인"/>
 										</td>
@@ -290,7 +295,7 @@
 											<input type="text" class="w100" name="telLastNo" maxlength="4" data-valid-type="numeric"
 												   data-valid-name="전화번호"/>
 										</td>
-										<th>휴대전화번호<i class="star"></i></th>
+										<th>휴대전화번호<em class="required" title="필수"></em></th>
 										<td colspan="4">
 											<input type="hidden" id="recipPhnno" name="recipPhnno"/>
 											<select class="w100" id="recipFirstNo" name="recipFirstNo">
@@ -305,7 +310,7 @@
 										</td>
 									</tr>
 									<tr>
-										<th>주소<i class="star"></i></th>
+										<th>주소<em class="required" title="필수"></em></th>
 										<td colspan="5">
 											<input type="text" id="recipZipcode" name="recipZipcode" class="w100" maxlength="10" required="required" data-valid-name="주소"/>
 											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custAddrForm');">우편번호찾기</button>
@@ -454,7 +459,7 @@
 								</colgroup>
 								<tbody>
 								<tr>
-									<th>접촉유형<i class="star"></i></th>
+									<th>접촉유형<em class="required" title="필수"></em></th>
 									<td>
 										<select name="contactType" class="w150" required="required" data-valid-type="select" data-valid-name="접촉유형">
 											<option value="">[선택]</option>
@@ -462,7 +467,7 @@
 													th:text="${oneData.cdNm}"></option>
 										</select>
 									</td>
-									<th>접촉방법<i class="star"></i></th>
+									<th>접촉방법<em class="required" title="필수"></em></th>
 									<td>
 										<select name="contactMethod" class="w150" required="required" data-valid-type="select" data-valid-name="접촉방법">
 											<option value="">[선택]</option>
@@ -470,7 +475,7 @@
 													th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
 										</select>
 									</td>
-									<th>내용<i class="star"></i></th>
+									<th>내용<em class="required" title="필수"></em></th>
 									<td>
 										<textarea class="textareaR2 w600" name="contactContents" required="required" data-valid-name="내용"></textarea>
 										<button type="button" id="btnSaveContact" class="btn btn-success btn-lg">저장</button>
@@ -529,6 +534,7 @@
 	const contactTypeList = gagajf.convertToArray([[${contactTypeList}]]);			//회원접촉유형
 	const contactMethodList = gagajf.convertToArray([[${contactMethodList}]]);		//회원접촉방법
 	const genderGbList = gagajf.convertToArray([[${genderGbList}]]);				// 성별
+	let orgData;
 
 	//구매내역 그리드
 	const columnOrderDefs = [
@@ -948,35 +954,61 @@
 
 	});
 
+	$('#btnCustSecede').on('click', function () {
+		let custNo = $('#custInfoForm input[name=custNo]').val();
+		if (gagajf.isNull(custNo)) {
+			mcxDialog.alert("탈퇴시킬 회원번호가 없습니다.");
+			return;
+		}
+
+		let elementCustNo ='#custInfoForm input[name=custNo]';
+
+		const actionUrl = '/customer/secede/popup/form?elementCustNo='+ encodeURIComponent(elementCustNo)
+
+		cfnOpenModalPopup(actionUrl, 'popupCustSecedeForm');
+	});
+
+
 	// 기본정보 - 저장버튼
 	$('#btnCustInfoSave').on('click', function () {
-		let custInfoFrom = '#custInfoForm';
 
 		//휴대폰번호
-		if (!fnCheckValidationPhnno(custInfoFrom))
+		if (!fnCheckValidationPhnno('#custInfoForm'))
 			return false;
 
 		//이메일
-		if (!fnCheckValidationEmail(custInfoFrom))
+		if (!fnCheckValidationEmail('#custInfoForm'))
 			return false;
 
-		let managedRsn = $('#managedRsn').val();
-		let	managedDtlRsn = $('#managedDtlRsn').val();
+		let customer = $('#custInfoForm').serializeObject();
 
-		if (!gagajf.isNull(managedRsn) && gagajf.isNull(managedDtlRsn)) {
+		if (!gagajf.isNull(customer.managedRsn) && gagajf.isNull(customer.managedDtlRsn)) {
 			mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
 			return;
 		}
 
+		// 데이터 변경 없으면 공배처리
+		if (customer.emailAgreeYn === orgData.emailAgreeYn) {
+			customer.emailAgreeYn = '';
+		}
+		// 데이터 변경 없으면 공배처리
+		if (customer.smsAgreeYn === orgData.smsAgreeYn) {
+			customer.smsAgreeYn = '';
+		}
+
+		// 마케팅 수신여부가 기존하고 바꼈는지 확인
+
+
 		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				let jsonData = JSON.stringify($(custInfoFrom).serializeObject());
+				let jsonData = JSON.stringify(customer);
 				//console.log(jsonData);
 				gagajf.ajaxJsonSubmit('/customer/info/save', jsonData, fnSearchCustInfo);
 			}
 		});
+
 	});
 
 	// 배송지정보 - 신규버튼
@@ -1159,8 +1191,7 @@
 					let foreignerYn = data.foreignerYn === 'Y' ? '외국인' : '내국인';
 					$('#foreignerYn').text(foreignerYn);
 
-					let secedeRsnYn = fnGetSecedeRsnYn(data.custStat, data.secedeRsn);
-					$('#secedeRsnYn').html(secedeRsnYn);
+					fnGetSecedeRsnYn(data.custStat, data.secedeRsn);	// 탈퇴여부
 
 					let snsType = fnGetSnsType(data.nvJoinId, data.kkJoinId, data.ysJoinId);
 					$('#snsType').text(snsType);
@@ -1176,6 +1207,8 @@
 					fnDisplayCellPhnno(data.maskingCellPhnno);		// 핸드폰
 					fnDisplayManaged(data.managedRsn);				// 관리대상
 
+					orgData = data;									// 기존 데이터
+
 				}
 			});
 	};
@@ -1313,30 +1346,6 @@
 	};
 
 
-	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');
-
-	};
-
 	// 관리대상
 	var fnDisplayManaged = function (managedRsn) {
 		const $managedRsnNm = $('#managedRsnNm');
@@ -1357,13 +1366,12 @@
 
 	// 탈퇴여부
 	var fnGetSecedeRsnYn = function (custStat, secedeRsn) {
+		const activeCustomer = 'G104_10';
 		let secedeRsnYn = gagajf.isNull(secedeRsn) ? '아니요' : '예';
-		if (custStat === '10') {
-			secedeRsnYn += '<button type="button" class="btn btn-danger btn-lg marL5" onClick="fnCustomerSecede();">';
-			secedeRsnYn += ' 회원탈퇴';
-			secedeRsnYn += '</button>';
+		$('#secedeRsnYn').text(secedeRsnYn);
+		if (custStat === activeCustomer) {
+			$('#btnCustSecede').show();
 		}
-		return secedeRsnYn;
 	}
 
 	// 휴대전화번호

+ 122 - 0
src/main/webapp/WEB-INF/views/customer/CustomerSecedePopupForm.html

@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : CustomerSecedePopupForm.html
+ * @desc    : 회원탈퇴처리 화면 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.01.26   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="800">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong>회원탈퇴처리</strong>
+			<button type="button" class="close" onclick="uifnPopupClose('popupCustSecedeForm')"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div class="panelStyle">
+				<form id="custSecedeForm" name="custSecedeForm">
+					<input type="hidden" name="custNo"/>
+					<table class="frmStyle">
+						<colgroup>
+							<col style="width:10%;"/>
+							<col style="width:20%;"/>
+							<col style="width:10%;"/>
+							<col style="width:15%;"/>
+							<col style="width:10%;"/>
+							<col style="width:20%;"/>
+							<col/>
+						</colgroup>
+						<tbody>
+						<tr>
+							<th class="dashR">탈퇴사유</th>
+							<td class="dashR" colspan="5">
+								<select name="secedeRsn" > <!-- 탈퇴사유 (공통코드G102) -->
+									<option value="">전체</option>
+									<option th:if="${secedeRsnList}" th:each="oneData, status : ${secedeRsnList}" th:value="${oneData.cd}" th:text="|[${oneData.cd}] ${oneData.cdNm}|"></option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<th class="dashR">탈퇴 상세 사유</th>
+							<td class="dashR" colspan="5">
+								<input type="text" class="w600" id="secedeDtlRsn" name="secedeDtlRsn" />
+							</td>
+						</tr>
+						</tbody>
+					</table>
+				</form>
+			</div>
+			<ul class="panelBar">
+				<li class="right">
+					<button type="button" id="btnSaveSecede" class="btn btn-success btn-lg">탈퇴처리</button>
+				</li>
+			</ul>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	const elementCustNo = [[${elementCustNo}]];
+
+	// 회원탈퇴
+	$("#btnSaveSecede").on("click",function() {
+		let custSecedeForm = $('#custSecedeForm').serializeObject();
+
+		if(gagajf.isNull(custSecedeForm.secedeRsn)){
+			mcxDialog.alert("탈퇴 사유를 선택해주세요.");
+			return;
+		}
+
+		mcxDialog.confirm('회원 탈퇴를 진행하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxFormSubmit('/customer/secede/save', '#custSecedeForm', fnSaveCall);
+			}
+		});
+
+	});
+
+	var fnSaveCall = function (data) {
+		console.log('typeof', typeof data.isSuccess);
+		if (data.isSuccess) {
+			mcxDialog.alertC(data.resultMessage, {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					uifnPopupClose('popupCustSecedeForm');
+					uifnPopupClose('popupCustomerDetail');
+				}
+			});
+		} else {
+			mcxDialog.alert(data.resultMessage);
+			return;
+		}
+	}
+
+	var fnInitDataSet = function () {
+		let custNo = $(elementCustNo).val();
+		if(!gagajf.isNull(custNo)) {
+			$('#custSecedeForm input[name=custNo]').val(custNo);
+		}
+	}
+
+	$(document).ready(function() {
+
+		fnInitDataSet();
+
+	});
+	/*]]>*/
+</script>
+</html>