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

+ 372 - 6
src/main/java/com/style24/admin/biz/web/TsaCustomerController.java

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

+ 217 - 224
src/main/webapp/WEB-INF/views/customer/CustomerDetailForm.html

@@ -37,7 +37,7 @@
 				<tbody>
 				<th>이름</th>
 				<td>
-					<span id="custNm" name="custNm"></span>
+					<span id="spanCustNm" name="spanCustNm"></span>
 					<span id="managedRsnNm" name="managedRsnNm" class="infoTxt cRed h5"></span>
 				</td>
 				<th>아이디</th>
@@ -80,142 +80,148 @@
 					<li class="tab on" id="tab1">
 						<!-- TAB1 PANELSTYLE -->
 						<div class="panelStyle">
-							<h4>기본정보</h4>
-							<table class="frmStyle">
-								<colgroup>
-									<col style="width:10%;"/>
-									<col style="width:40%;"/>
-									<col style="width:10%;"/>
-									<col/>
-								</colgroup>
-								<tbody>
-								<tr>
-									<th class="dashR">회원구분<i class="star"></i></th>
-									<td class="dashR">
-										<select id="custGb" name="custGb">
-											<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-									</td>
-									<th class="dashR">회원등급<i class="star"></i></th>
-									<td class="dashR">
-										<select id="custGrade" name="custGrade">
-											<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">관리대상</th>
-									<td class="dashR">
-										<select id="managedRsn" name="managedRsn">
-											<option value="">일반</option>
-											<option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-										<span class="infoTxt cRed h5" id="managedRsnDp" name="managedRsnDp"></span>
-									</td>
-									<th class="dashR">관리대상 지정 날짜</th>
-									<td class="dashR" id="managedDt" name="managedDt">
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">관리대상 지정 사유</th>
-									<td class="dashR" colspan="3">
-										<input type="text" id="managedDtlRsn" name="managedDtlRsn" class="w600" />
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">비밀번호</th>
-									<td class="dashR" colspan="3">
-										*******
-										<button type="button" id="btnResetPassword" class="btn btn-info btn-lg">초기화</button>
-										<span class="infoTxt cBlue">
-											<i class="fa fa-info-circle"></i>회원에게 임시비밀번호를 발송합니다. (이메일, 알림톡)
-										</span>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">생년월일</th>
-									<td class="dashR">
-										<input type="text" id="birthYmd" name="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
-									</td>
-									<th class="dashR">성별</th>
-									<td class="dashR" id="sexGb" name="sexGb"></td>
-								</tr>
-								<tr>
-									<th class="dashR">자택주소</th>
-									<td class="dashR" colspan="3">
-										<input type="text" id="homePostNo" name="homePostNo" class="w100" readonly="readonly"/>
-										<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfo');">우편번호찾기</button>
-										<br/>
-										<input type="text" id="homeBaseAddr" name="homeBaseAddr" class="w300" readonly="readonly"/>
-										<input type="text" id="homeDtlAddr" name="homeDtlAddr" class="w300"/>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">휴대전화번호<i class="star"></i></th>
-									<td class="dashR">
-										<select id="cellPhnno1" name="cellPhnno1">
-											<option value="">선택</option>
-											<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
-													th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
-										</select> -
-										<input type="text" id="cellPhnno2" name="cellPhnno2" class="w50" maxlength="4" required="required"
-											   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
-										<input type="text" id="cellPhnno3" name="cellPhnno3" class="w50" maxlength="4" required="required"
-											   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
-										<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
-										<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
-									</td>
-									<th class="dashR">SMS수신여부<i class="star"></i></th>
-									<td class="dashR">
-										<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
-										<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">이메일<i class="star"></i></th>
-									<td class="dashR">
-										<input type="text" id="email1" name="email1" class="w300"/>
-										@
-										<input type="text" id="email2" name="email2" class="w150"/>
-										<select name="emailDomain">
-											<option value="">선택하세요</option>
-											<option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
-													th:text="|${oneData.cdNm}|"></option>
-										</select>
-										<button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
-									</td>
-									<th class="dashR">메일수신여부<i class="star"></i></th>
-									<td class="dashR">
-										<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
-										<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
-									</td>
-								</tr>
-								<tr>
-									<th class="dashR">가입일시</th>
-									<td class="dashR" id="joinDt" name="joinDt"></td>
-									<th class="dashR">최종로그인일시</th>
-									<td class="dashR" id="loginDt" name="loginDt"></td>
-								</tr>
-								<tr>
-									<th class="dashR">내외국인</th>
-									<td class="dashR" id="foreignerYn" name="foreignerYn"></td>
-									<th class="dashR">탈퇴여부</th>
-									<td class="dashR" id="secedeRsnYn" name="secedeRsnYn"></td>
-								</tr>
-								<tr>
-									<th class="dashR">SNS가입유형</th>
-									<td class="dashR" id="snsType" name="snsType" colspan="3"></td>
-								</tr>
-								</tbody>
-							</table>
-							<ul class="panelBar">
-								<li class="right">
-									<button type="button" id="btnCustInfoSave" class="btn btn-success btn-lg">저장</button>
-								</li>
-							</ul>
+							<form id="custInfoForm" name="custInfoForm" action="#" method="post">
+								<input type="hidden" id="custNo" name="custNo" th:value="${custNo}"/>
+								<input type="hidden" id="custNm" name="custNm"/>
+								<h4>기본정보</h4>
+								<table class="frmStyle">
+									<colgroup>
+										<col style="width:10%;"/>
+										<col style="width:40%;"/>
+										<col style="width:10%;"/>
+										<col/>
+									</colgroup>
+									<tbody>
+									<tr>
+										<th class="dashR">회원구분<i class="star"></i></th>
+										<td class="dashR">
+											<select id="custGb" name="custGb">
+												<option th:if="${custGbList}" th:each="oneData, status : ${custGbList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+										</td>
+										<th class="dashR">회원등급<i class="star"></i></th>
+										<td class="dashR">
+											<select id="custGrade" name="custGrade">
+												<option th:if="${custGradeList}" th:each="oneData, status : ${custGradeList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상</th>
+										<td class="dashR">
+											<select id="managedRsn" name="managedRsn">
+												<option value="">일반</option>
+												<option th:if="${managedRsnList}" th:each="oneData, status : ${managedRsnList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+											<span class="infoTxt cRed h5" id="managedRsnDp" name="managedRsnDp"></span>
+										</td>
+										<th class="dashR">관리대상 지정 날짜</th>
+										<td class="dashR" id="managedDt" name="managedDt">
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">관리대상 지정 사유</th>
+										<td class="dashR" colspan="3">
+											<input type="text" id="managedDtlRsn" name="managedDtlRsn" class="w600" />
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">비밀번호</th>
+										<td class="dashR" colspan="3">
+											*******
+											<button type="button" id="btnResetPassword" class="btn btn-info btn-lg">초기화</button>
+											<span class="infoTxt cBlue">
+												<i class="fa fa-info-circle"></i>회원에게 임시비밀번호를 발송합니다. (이메일, 알림톡)
+											</span>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">생년월일</th>
+										<td class="dashR">
+											<input type="text" id="birthYmd" name="birthYmd" class="schDate w100" data-valid-name="생년월일"/>
+										</td>
+										<th class="dashR">성별</th>
+										<td class="dashR" id="sexGb" name="sexGb"></td>
+									</tr>
+									<tr>
+										<th class="dashR">자택주소</th>
+										<td class="dashR" colspan="3">
+											<input type="text" id="homePostNo" name="homePostNo" class="w100" readonly="readonly"/>
+											<button type="button" class="btn btn-info btn-lg" onclick="fnOpenDaumAddr('custInfoForm');">우편번호찾기</button>
+											<br/>
+											<input type="text" id="homeBaseAddr" name="homeBaseAddr" class="w300" readonly="readonly"/>
+											<input type="text" id="homeDtlAddr" name="homeDtlAddr" class="w300"/>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">휴대전화번호<i class="star"></i></th>
+										<td class="dashR">
+											<input type="hidden" name="cellPhnno" data-valid-name="휴대전화"/>
+											<select id="firstNumber" name="firstNumber">
+												<option value="">선택</option>
+												<option th:if="${nationalHpNumberList}" th:each="oneData, status : ${nationalHpNumberList}"
+														th:value="${oneData.cd}" th:text="|${oneData.cd}|"></option>
+											</select> -
+											<input type="text" id="middleNumber" name="middleNumber" class="w50" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/> -
+											<input type="text" id="lastNumber" name="lastNumber" class="w50" maxlength="4" required="required"
+												   data-valid-type="numeric" data-valid-name="휴대전화번호"/>
+											<button type="button" id="btnCustSendLms" class="btn btn-info btn-lg">LMS전송</button>
+											<button type="button" id="btnCustCrtfd" class="btn btn-info btn-lg">번호변경</button>
+										</td>
+										<th class="dashR">SMS수신여부<i class="star"></i></th>
+										<td class="dashR">
+											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="Y"/>수신</label>
+											<label class="rdoBtn"><input type="radio" name="smsAgreeYn" value="N"/>미수신</label>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">이메일<i class="star"></i></th>
+										<td class="dashR">
+											<input type="hidden" name="email" data-valid-name="이메일"/>
+											<input type="text" id="emailId" name="emailId" class="w300"/>
+											@
+											<input type="text" id="emailDomain" name="emailDomain" class="w150"/>
+											<select id="emailDomainList" name="emailDomainList">
+												<option value="">선택하세요</option>
+												<option th:if="${emailDomainList}" th:each="oneData, status : ${emailDomainList}" th:value="${oneData.cd}"
+														th:text="|${oneData.cdNm}|"></option>
+											</select>
+											<button type="button" id="btnCustSendEmail" class="btn btn-info btn-lg" >이메일발송</button>
+										</td>
+										<th class="dashR">메일수신여부<i class="star"></i></th>
+										<td class="dashR">
+											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="Y"/>수신</label>
+											<label class="rdoBtn"><input type="radio" name="emailAgreeYn" value="N"/>미수신</label>
+										</td>
+									</tr>
+									<tr>
+										<th class="dashR">가입일시</th>
+										<td class="dashR" id="joinDt" name="joinDt"></td>
+										<th class="dashR">최종로그인일시</th>
+										<td class="dashR" id="loginDt" name="loginDt"></td>
+									</tr>
+									<tr>
+										<th class="dashR">내외국인</th>
+										<td class="dashR" id="foreignerYn" name="foreignerYn"></td>
+										<th class="dashR">탈퇴여부</th>
+										<td class="dashR" id="secedeRsnYn" name="secedeRsnYn"></td>
+									</tr>
+									<tr>
+										<th class="dashR">SNS가입유형</th>
+										<td class="dashR" id="snsType" name="snsType" colspan="3"></td>
+									</tr>
+									</tbody>
+								</table>
+								<ul class="panelBar">
+									<li class="right">
+										<button type="button" id="btnCustInfoSave" class="btn btn-success btn-lg">저장</button>
+									</li>
+								</ul>
+							</form>
 						</div>
 						<!-- //TAB1 PANELSTYLE -->
 					</li>
@@ -831,22 +837,17 @@
 
 	// 비밀번호 초기화 버튼
 	$('#btnResetPassword').on('click', function () {
+		let custInfoForm = '#custInfoForm';
 
-		//이메일
-		let email = $('#email1').val() + '@' + $('#email2').val();
-
-		if (!fnCheckValidationEmail(email)) {
+		if (!fnCheckValidationEmail(custInfoForm)) {
 			return false;
 		}
-		
-		let customer = {};
-		customer.custNo = custNo;
 
 		mcxDialog.confirm("초기화 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				let jsonData = JSON.stringify(customer);
+				let jsonData = JSON.stringify($(custInfoForm).serializeObject());
 				gagajf.ajaxJsonSubmit('/customer/password/reset', jsonData, fnSearchCustInfo);
 			}
 		});
@@ -855,79 +856,72 @@
 
 	// LMS발송 버튼
 	$('#btnCustSendLms').on('click', function () {
+		let custInfoForm = '#custInfoForm';
+
+		if (!fnCheckValidationPhnno(custInfoForm)) {
+			return false;
+		}
+
 		let param = {};
-		param.elementCellPhnno = '#cellPhnno';
-		param.elementCustNo = '#custNo';
+		param.elementCellPhnno = custInfoForm + ' input[name=cellPhnno]';
+		param.elementCustNo = custInfoForm + ' input[name=custNo]';
 		cfnOpenLmsPopup(param);
 	});
 
 
 	// 이메일발송 버튼
 	$('#btnCustSendEmail').on('click', function () {
+		let custInfoForm = '#custInfoForm';
+
+		if (!fnCheckValidationEmail(custInfoForm)) {
+			return false;
+		}
+
 		let param = {};
-		param.elementRecipEmail = '#email';
-		param.elementCustNm = '#custNm';
-		param.elementCustNo = '#custNo';
+		param.elementEmail = custInfoForm +' input[name=email]';
+		param.elementCustNm = custInfoForm +' input[name=custNm]';
+		param.elementCustNo = custInfoForm +' input[name=custNo]';
 		cfnOpenEmailPopup(param);
 	});
 
 	// 이메일 도메인 선택 이벤트
-	$('#emailDomain').on('change', function () {
+	$('#emailDomainList').on('change', function () {
 		let domain = $(this).val();
-		let $email2 = $('#email2');
+		let $emailDomain = $('#emailDomain');
 
 		if (domain === '99') {  //기타(직접입력)
-			$email2.val('');
+			$emailDomain.val('');
 		} else if (domain !== '99' && !gagajf.isNull(domain)) {
-			$email2.val(domain);
+			$emailDomain.val(domain);
 		}
 
 	});
 
 	// 저장 버튼
 	$('#btnCustInfoSave').on('click', function () {
-
-		let cellPhnno = $('#cellPhnno1').val() + '-' + $('#cellPhnno2').val() + '-' + $('#cellPhnno3').val();
-		let email = $('#email1').val() + '@' + $('#email2').val();
+		let custInfoFrom = '#custInfoForm';
 
 		//휴대폰번호
-		if (!fnCheckValidationPhnno(cellPhnno))
+		if (!fnCheckValidationPhnno(custInfoFrom))
 			return false;
 
 		//이메일
-		if (!fnCheckValidationEmail(email))
+		if (!fnCheckValidationEmail(custInfoFrom))
 			return false;
 
-
 		let managedRsn = $('#managedRsn').val();
 		let	managedDtlRsn = $('#managedDtlRsn').val();
 
-
 		if (!gagajf.isNull(managedRsn) && gagajf.isNull(managedDtlRsn)) {
 			mcxDialog.alert("관리대상 지정 사유를 입력해주세요");
 			return;
 		}
 
-		let customer = {};
-		customer.custNo = custNo;
-		customer.managedRsn = managedRsn;
-		customer.managedDtlRsn = managedDtlRsn;
-		customer.email = email;
-		customer.custGb = $('#custGb').val();
-		customer.custGrade = $('#custGrade').val();
-		customer.birthYmd = $('#birthYmd').val();
-		customer.homePostNo = $('#homePostNo').val();
-		customer.homeBaseAddr = $('#homeBaseAddr').val();
-		customer.homeDtlAddr = $('#homeDtlAddr').val();
-		customer.emailAgreeYn = $('input:radio[name=emailAgreeYn]:checked').val();
-		customer.smsAgreeYn = $('input:radio[name=smsAgreeYn]:checked').val();
-
-
 		mcxDialog.confirm("기본정보를 수정 하시겠습니까?", {
 			cancelBtnText: "취소",
 			sureBtnText: "확인",
 			sureBtnClick: function () {
-				let jsonData = JSON.stringify(customer);
+				let jsonData = JSON.stringify($(custInfoFrom).serializeObject());
 				//console.log(jsonData);
 				gagajf.ajaxJsonSubmit('/customer/info/save', jsonData, fnSearchCustInfo);
 			}
@@ -1105,7 +1099,7 @@
 		$.get('/customer/info/' + custNo
 			, function (data) {
 				if (!gagajf.isNull(data)) {
-					$('#custNm').text(data.maskingCustNm);
+					$('#spanCustNm').text(data.maskingCustNm);
 					$('#custId').text(data.maskingCustId);
 					$('#siteNm').text(gagaAgGrid.lookupValue(siteList, data.siteCd));
 					$('#custGrade').val(data.custGrade);
@@ -1136,7 +1130,10 @@
 					fnDisplaySmsAgree(data.smsAgreeYn);				// SMS 수신여부
 					fnDisplayEmail(data.maskingEmail);				// EMAIL
 					fnDisplayCellPhnno(data.maskingCellPhnno);		// 핸드폰
-					fnDisplayManaged(data.managedRsnNm);			// 관리대상
+					fnDisplayManaged(data.managedRsn);			// 관리대상
+
+					//custInfoForm Hidden : LMS팝업 사용시 필요
+					$('#custNm').val(data.maskingCustNm);
 
 					//기존데이트 저장
 					orgData = data;
@@ -1218,7 +1215,7 @@
 		let daumZip = new daum.Postcode({
 			oncomplete: function(data) {
 				// 우편번호와 주소 정보를 해당 필드에 넣는다.
-				if (id === 'custInfo') {
+				if (id === 'custInfoForm') {
 					$('#homePostNo').val(data.zonecode);
 					$('#homeBaseAddr').val(cfnGetDaumRoadAddr(data));
 					$('#homeDtlAddr').focus();
@@ -1237,36 +1234,31 @@
 		cfnOpenDaumAddr(daumZip);
 	}
 
-	// 휴대전화 유효성체크
-	var fnCheckValidationPhnno = function (cellPhnno) {
+	// 휴대전화 유효성 체크 및 데이터 셋팅
+	var fnCheckValidationPhnno = function (formId) {
 		let result = true;
-		let regexp = /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/ ;
-
-		if (!regexp.test(cellPhnno)) {
-			mcxDialog.alertC('휴대전화의 형식이 잘못되었습니다.', {
-				sureBtnText: "확인",
-				sureBtnClick: function() {
-					$('#cellPhnno1').select();
-					$('#cellPhnno1').focus();
-				}
-			});
+
+		let firstNumber = $(formId + ' select[name=firstNumber]').val();
+		let middleNumber = $(formId + ' input[name=middleNumber]').val();
+		let lastNumber = $(formId + ' input[name=lastNumber]').val();
+		let cellPhnno = firstNumber + '-' + middleNumber + '-' + lastNumber;
+		$(formId + ' input[name=cellPhnno]').val(cellPhnno);
+
+		if (!gagajf.testRegexp($(formId + ' input[name=cellPhnno]'), /^(01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4})$/)) {
 			result = false;
 		}
+
 		return result;
 	};
 
-	// 이메일 체크
-	var fnCheckValidationEmail = function (email) {
+	// 이메일 체크 및 데이터 셋팅
+	var fnCheckValidationEmail = function (formId) {
 		let result = true;
-		let regexp = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/;
+		let emailId = $(formId + ' input[name=emailId]').val();
+		let emailDomain = $(formId + ' input[name=emailDomain]').val();
+		$(formId + ' input[name=email]').val(emailId + '@' + emailDomain);
 
-		if (!regexp.test(email)) {
-			mcxDialog.alertC('이메일 형식이 잘못되었습니다.', {
-				sureBtnText: "확인",
-				sureBtnClick: function() {
-					$('#email1').focus();
-				}
-			});
+		if (!gagajf.testRegexp($(formId + ' input[name=email]'), /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/)) {
 			result = false;
 		}
 
@@ -1299,15 +1291,14 @@
 	};
 
 	// 관리대상
-	var fnDisplayManaged = function (managedRsnNm) {
+	var fnDisplayManaged = function (managedRsn) {
 		const $managedRsnNm = $('#managedRsnNm');
 		const $managedRsnDp = $('#managedRsnDp');
-
 		$managedRsnNm.text('');
 		$managedRsnNm.hide();
 		$managedRsnDp.text('');
 		$managedRsnDp.hide();
-		if (!gagajf.isNull(managedRsnNm)) {
+		if (!gagajf.isNull(managedRsn)) {
 			let html = '<i class="fa fa-info-circle"></i>';
 			$managedRsnNm.html(html);
 			$managedRsnNm.show();
@@ -1317,12 +1308,11 @@
 
 	};
 
-
 	// 탈퇴여부
 	var fnGetSecedeRsnYn = function (custStat, secedeRsn) {
 		let secedeRsnYn = gagajf.isNull(secedeRsn) ? '아니요' : '예';
 		if (custStat === '10') {
-			secedeRsnYn += '<button type="button" class="btn btn-danger btn-lg marL5"onClick="fnCustomerSecede();">';
+			secedeRsnYn += '<button type="button" class="btn btn-danger btn-lg marL5" onClick="fnCustomerSecede();">';
 			secedeRsnYn += ' 회원탈퇴';
 			secedeRsnYn += '</button>';
 		}
@@ -1333,9 +1323,9 @@
 	var fnDisplayCellPhnno = function (cellPhnno) {
 		if (!gagajf.isNull(cellPhnno)) {
 			let cellPhSplit = cellPhnno.split("-");
-			$('#cellPhnno1').val(cellPhSplit[0]);
-			$('#cellPhnno2').val(cellPhSplit[1]);
-			$('#cellPhnno3').val(cellPhSplit[2]);
+			$('#firstNumber').val(cellPhSplit[0]);
+			$('#middleNumber').val(cellPhSplit[1]);
+			$('#lastNumber').val(cellPhSplit[2]);
 		}
 	};
 
@@ -1343,8 +1333,8 @@
 	var fnDisplayEmail = function (email) {
 		if (!gagajf.isNull(email)) {
 			let emailSplit = email.split("@");
-			$('#email1').val(emailSplit[0]);
-			$('#email2').val(emailSplit[1]);
+			$('#emailId').val(emailSplit[0]);
+			$('#emailDomain').val(emailSplit[1]);
 		}
 	};
 
@@ -1394,6 +1384,18 @@
 		return snsType;
 	};
 
+	// 생년월일 달력 설정
+	var fnDisplayBirthYmd = function () {
+		const $birthYmd = $('#birthYmd');
+		let currentYear = new Date().format('YYYY');
+		$birthYmd.datepicker("destroy");
+		$birthYmd.datepicker({
+			changeMonth: true,
+			changeYear: true,
+			yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
+			defaultDate: $birthYmd.val()
+		});
+	}
 
 	$('#btnLogin').on('click', function () {
 		let custId = $('span[name=custId]').text();
@@ -1404,19 +1406,10 @@
 	})
 
 	$(document).ready(function () {
-		// 생년월일 달력 설정
-		const $birthYmd = $('#birthYmd');
-		let currentYear = new Date().format('YYYY');
-		$birthYmd.datepicker("destroy");
-		$birthYmd.datepicker({
-			changeMonth: true,
-			changeYear: true,
-			yearRange: (currentYear - 100) + ' : ' + (currentYear - 14),
-			defaultDate: $birthYmd.val()
-		});
 
-		//회원정보 조회
-		fnSearchCustInfo();
+		fnDisplayBirthYmd(); //생년월일 달력 설정
+
+		fnSearchCustInfo();	//회원정보 조회
 
 		gagaAgGrid.createGrid('custOrderList', gridOrderOptions);		// 주문내역
 

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

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