diff --git a/src/main/java/com/madeuhome/controller/web/reservation/ReservationController.java b/src/main/java/com/madeuhome/controller/web/reservation/ReservationController.java new file mode 100644 index 0000000..a205106 --- /dev/null +++ b/src/main/java/com/madeuhome/controller/web/reservation/ReservationController.java @@ -0,0 +1,209 @@ +package com.madeuhome.controller.web.reservation; + +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.madeuhome.constants.Constants; +import com.madeuhome.service.web.reservation.ReservationService; +import com.madeuhome.util.HttpUtil; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + +/** + * 예약 컨트롤러 + */ +@Controller +@Slf4j +public class ReservationController { + + @Autowired + private ReservationService reservationService; + + /** + * 예약 페이지 이동 + */ + @RequestMapping(value = "/webservice/selectMakeReservation.do") + public String selectMakeReservation(HttpSession session, HttpServletRequest request, Model model) { + log.debug("ReservationController selectMakeReservation START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); + model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); + model.addAttribute("POST_NO", paramMap.get("POST_NO")); + model.addAttribute("PROCEDURE_ID", paramMap.get("PROCEDURE_ID")); + log.debug("ReservationController selectMakeReservation END"); + return "/web/service/makeReservation"; + } + + /** + * 예약 시술 정보 조회 + */ + @RequestMapping(value = "/webservice/selectReservation.do") + public ModelAndView selectReservation(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("ReservationController selectReservation START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + StringBuffer errorMsg = new StringBuffer(); + + try { + map = reservationService.selectReservation(paramMap); + } catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + } finally { + if (Constants.OK == map.get("msgCode")) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + + log.debug("ReservationController selectReservation END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 병원 휴일 조회 (달력 표출용) + */ + @RequestMapping(value = "/webservice/selectHospitalHolidayList.do") + public ModelAndView selectHospitalHolidayList(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("ReservationController selectHospitalHolidayList START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + + try { + map = reservationService.selectHospitalHolidayList(paramMap); + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + if (Constants.OK != map.get("msgCode")) { + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + + log.debug("ReservationController selectHospitalHolidayList END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 특정 날짜 운영시간 조회 + */ + @RequestMapping(value = "/webservice/selectHospitalWorkTime.do") + public ModelAndView selectHospitalWorkTime(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("ReservationController selectHospitalWorkTime START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + + try { + map = reservationService.selectHospitalWorkTime(paramMap); + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + if (Constants.OK != map.get("msgCode")) { + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + + log.debug("ReservationController selectHospitalWorkTime END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 예약 카운트 조회 + */ + @RequestMapping(value = "/webservice/selectReservationCnt.do") + public ModelAndView selectReservationCnt(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("ReservationController selectReservationCnt START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + StringBuffer errorMsg = new StringBuffer(); + + try { + map = reservationService.selectReservationCnt(paramMap); + } catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + } finally { + if (Constants.OK == map.get("msgCode")) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + + log.debug("ReservationController selectReservationCnt END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 예약 저장 + */ + @RequestMapping(value = "/webservice/insertReservation.do") + public ModelAndView insertReservation(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("ReservationController insertReservation START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + StringBuffer errorMsg = new StringBuffer(); + + try { + map = reservationService.insertReservation(paramMap); + } catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + return null; + } finally { + if (Constants.OK == map.get("msgCode")) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + map.put("msgCode", Constants.FAIL); + } + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + + log.debug("ReservationController insertReservation END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java b/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java index 4518ea3..89cb9dc 100644 --- a/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java +++ b/src/main/java/com/madeuhome/controller/web/webevent/WebEventController.java @@ -18,10 +18,9 @@ import org.springframework.web.servlet.ModelAndView; import java.util.HashMap; - @Slf4j @Controller -public class WebEventController extends ManagerDraftAction{ +public class WebEventController extends ManagerDraftAction { @Autowired private WebEventService webEventService; @@ -36,8 +35,8 @@ public class WebEventController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webevent/selectListWebEventIntro.do") - public String selectListWebEventIntro(HttpSession session,HttpServletRequest request) { + @RequestMapping(value = "/webevent/selectListWebEventIntro.do") + public String selectListWebEventIntro(HttpSession session, HttpServletRequest request) { log.debug("WebEventController selectListWebEventIntro START"); @@ -52,33 +51,34 @@ public class WebEventController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webevent/selectListWebEvent.do") - public ModelAndView selectListWebEvent(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + @RequestMapping(value = "/webevent/selectListWebEvent.do") + public ModelAndView selectListWebEvent(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { log.debug("WebEventController selectListWebEvent START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - try{ + + try { map = webEventService.selectListWebEvent(paramMap); log.debug(map + ""); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); return null; - }finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { map.put("msgCode", Constants.FAIL); } map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); } } @@ -94,27 +94,26 @@ public class WebEventController extends ManagerDraftAction{ insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); ; - if(("true").equals(String.valueOf(map.get("success")))){ + if (("true").equals(String.valueOf(map.get("success")))) { insertMap.put("resultCode", "SUCCESS"); - }else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); insertMap.put("muMemberId", paramMap.get("muMemberId")); -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + // logHistoryService.insertLogHistory(insertMap, visitLogParamMap); } catch (Exception e) { e.printStackTrace(); } } log.debug("WebEventController selectListWebEvent END"); - - + return HttpUtil.makeHashToJsonModelAndView(map); } - + /** * 이벤트 별 항목 목록 조회 * @@ -122,33 +121,33 @@ public class WebEventController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webevent/selectListEvent.do") - public ModelAndView selectListEvent(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + @RequestMapping(value = "/webevent/selectListEvent.do") + public ModelAndView selectListEvent(HttpSession session, HttpServletRequest request, HttpServletResponse response) { log.debug("WebEventController selectListEvent START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - try{ + + try { map = webEventService.selectListEvent(paramMap); log.debug(map + ""); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); return null; - }finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { map.put("msgCode", Constants.FAIL); } map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); } } @@ -164,23 +163,22 @@ public class WebEventController extends ManagerDraftAction{ insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); ; - if(("true").equals(String.valueOf(map.get("success")))){ + if (("true").equals(String.valueOf(map.get("success")))) { insertMap.put("resultCode", "SUCCESS"); - }else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + // logHistoryService.insertLogHistory(insertMap, visitLogParamMap); } catch (Exception e) { e.printStackTrace(); } } log.debug("WebEventController selectListEvent END"); - - + return HttpUtil.makeHashToJsonModelAndView(map); } @@ -191,19 +189,19 @@ public class WebEventController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webevent/selectEventDetailIntro.do") + @RequestMapping(value = "/webevent/selectEventDetailIntro.do") public String selectEventDetailIntro(HttpSession session, HttpServletRequest request, Model model) { log.debug("WebEventController selectEventDetailIntro START"); HashMap paramMap = HttpUtil.getParameterMap(request); model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); - model.addAttribute("POST_NO", paramMap.get("POST_NO")); + model.addAttribute("POST_NO", paramMap.get("POST_NO")); log.debug("WebEventController selectEventDetailIntro END"); - + return "/web/webevent/webEventSelect"; } - + /** * 이벤트 안내 목록 상세 조회 * @@ -211,33 +209,34 @@ public class WebEventController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webevent/selectEventDetail.do") - public ModelAndView selectEventDetail(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + @RequestMapping(value = "/webevent/selectEventDetail.do") + public ModelAndView selectEventDetail(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { log.debug("WebEventController selectEventDetail START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - try{ + + try { map = webEventService.selectEventDetail(paramMap); log.debug(map + ""); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); return null; - }finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { map.put("msgCode", Constants.FAIL); } map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); } } @@ -253,27 +252,26 @@ public class WebEventController extends ManagerDraftAction{ insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); ; - if(("true").equals(String.valueOf(map.get("success")))){ + if (("true").equals(String.valueOf(map.get("success")))) { insertMap.put("resultCode", "SUCCESS"); - }else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + // logHistoryService.insertLogHistory(insertMap, visitLogParamMap); } catch (Exception e) { e.printStackTrace(); } } log.debug("WebEventController selectEventDetail END"); - - + return HttpUtil.makeHashToJsonModelAndView(map); } - - @RequestMapping(value="/webevent/selectMakeReservation.do") + + @RequestMapping(value = "/webevent/selectMakeReservation.do") public String selectMakeReservation(HttpSession session, HttpServletRequest request, Model model) { log.debug("WebServiceController selectMakeReservation START"); @@ -282,214 +280,9 @@ public class WebEventController extends ManagerDraftAction{ model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); model.addAttribute("POST_NO", paramMap.get("POST_NO")); model.addAttribute("PROCEDURE_ID", paramMap.get("PROCEDURE_ID")); - + log.debug("WebServiceController selectMakeReservation END"); - - return "/web/webevent/makeReservation"; - } - - /** - * 시술 목록 상세 조회 - * - * @param request - * @param response - * @return - */ - @RequestMapping(value="/webevent/selectReservation.do") - public ModelAndView selectReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { - log.debug("WebServiceController selectReservation START"); - - HashMap paramMap = HttpUtil.getParameterMap(request); - HashMap map = new HashMap(); - StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webEventService.selectReservation(paramMap); - }catch (Exception e) { - e.printStackTrace(); - errorMsg.append(e); - return null; - }finally { - if(Constants.OK == map.get("msgCode")) { - - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { - map.put("msgCode", Constants.FAIL); - } - - map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); - } - } - - try { - HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); - HashMap insertMap = new HashMap(); - - insertMap.put("url", "/webevent/selectReservation.do"); - insertMap.put("func", "selectListService"); - insertMap.put("funcName", "예약 조회"); - insertMap.put("service", "webEventService"); - insertMap.put("serviceName", "예약 상세"); - insertMap.put("requestValue", String.valueOf(paramMap)); - insertMap.put("responseValue", String.valueOf(map)); - ; - if(("true").equals(String.valueOf(map.get("success")))){ - insertMap.put("resultCode", "SUCCESS"); - }else{ - insertMap.put("resultCode", "ERROR"); - } - - insertMap.put("resultMsg", String.valueOf(errorMsg)); - -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } catch (Exception e) { - e.printStackTrace(); - } - } - - log.debug("WebServiceController selectReservation END"); - - - return HttpUtil.makeHashToJsonModelAndView(map); - } - - /** - * 시술 목록 상세 조회 - * - * @param request - * @param response - * @return - */ - @RequestMapping(value="/webevent/selectReservationCnt.do") - public ModelAndView selectReservationCnt(HttpSession session, HttpServletRequest request, HttpServletResponse response) { - - log.debug("WebServiceController selectReservationCnt START"); - - HashMap paramMap = HttpUtil.getParameterMap(request); - HashMap map = new HashMap(); - StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webEventService.selectReservationCnt(paramMap); - }catch (Exception e) { - e.printStackTrace(); - errorMsg.append(e); - return null; - }finally { - if(Constants.OK == map.get("msgCode")) { - - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { - map.put("msgCode", Constants.FAIL); - } - - map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); - } - } - - try { - HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); - HashMap insertMap = new HashMap(); - - insertMap.put("url", "/webevent/selectReservationCnt.do"); - insertMap.put("func", "selectReservationCnt"); - insertMap.put("funcName", "예약 조회"); - insertMap.put("service", "webEventService"); - insertMap.put("serviceName", "예약 상세"); - insertMap.put("requestValue", String.valueOf(paramMap)); - insertMap.put("responseValue", String.valueOf(map)); - ; - if(("true").equals(String.valueOf(map.get("success")))){ - insertMap.put("resultCode", "SUCCESS"); - }else{ - insertMap.put("resultCode", "ERROR"); - } - - insertMap.put("resultMsg", String.valueOf(errorMsg)); - -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } catch (Exception e) { - e.printStackTrace(); - } - } - - log.debug("WebServiceController selectReservationCnt END"); - - - return HttpUtil.makeHashToJsonModelAndView(map); - } - - /** - * 예약 저장 - * - * @param request - * @param response - * @return - */ - @RequestMapping(value="/webevent/insertReservation.do") - public ModelAndView insertReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { - - log.debug("WebServiceController insertReservation START"); - - HashMap paramMap = HttpUtil.getParameterMap(request); - HashMap map = new HashMap(); - StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webEventService.insertReservation(paramMap); - log.debug(map + "TEST"); - }catch (Exception e) { - e.printStackTrace(); - errorMsg.append(e); - return null; - }finally { - if(Constants.OK == map.get("msgCode")) { - - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { - map.put("msgCode", Constants.FAIL); - } - - map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); - } - } - - try { - HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); - HashMap insertMap = new HashMap(); - - insertMap.put("url", "/webevent/insertReservation.do"); - insertMap.put("func", "selectReservationCnt"); - insertMap.put("funcName", "예약 저장"); - insertMap.put("service", "webEventService"); - insertMap.put("serviceName", "예약 저장"); - insertMap.put("requestValue", String.valueOf(paramMap)); - insertMap.put("responseValue", String.valueOf(map)); - ; - if(("true").equals(String.valueOf(map.get("success")))){ - insertMap.put("resultCode", "SUCCESS"); - }else{ - insertMap.put("resultCode", "ERROR"); - } - - insertMap.put("resultMsg", String.valueOf(errorMsg)); - -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } catch (Exception e) { - e.printStackTrace(); - } - } - - log.debug("WebServiceController insertReservation END"); - - - return HttpUtil.makeHashToJsonModelAndView(map); + return "/web/service/makeReservation"; } } diff --git a/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java b/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java index 9db6d82..142ffc4 100644 --- a/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java +++ b/src/main/java/com/madeuhome/controller/web/webservice/WebServiceController.java @@ -25,13 +25,12 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import lombok.extern.slf4j.Slf4j; - @Slf4j @Controller -public class WebServiceController extends ManagerDraftAction{ +public class WebServiceController extends ManagerDraftAction { @Autowired private WebServiceService webServiceService; - + /** * 시술관리 목록으로 이동. * @@ -39,16 +38,16 @@ public class WebServiceController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webservice/selectServiceIntro.do") - public String selectListServiceIntro(HttpSession session,HttpServletRequest request) { + @RequestMapping(value = "/webservice/selectServiceIntro.do") + public String selectListServiceIntro(HttpSession session, HttpServletRequest request) { log.debug("WebServiceController selectListServiceIntro START"); log.debug("WebServiceController selectListServiceIntro END"); - + return "/web/service/serviceInfo"; } - + /** * 시술관리 카테고리 목록 조회 * @@ -56,33 +55,34 @@ public class WebServiceController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webservice/selectListCategory.do") - public ModelAndView selectListCategory(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + @RequestMapping(value = "/webservice/selectListCategory.do") + public ModelAndView selectListCategory(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { log.debug("WebServiceController selectListCategory START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - try{ + + try { map = webServiceService.selectListWebCategory(paramMap); log.debug(map + ""); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); return null; - }finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { map.put("msgCode", Constants.FAIL); } map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); } } @@ -98,27 +98,26 @@ public class WebServiceController extends ManagerDraftAction{ insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); ; - if(("true").equals(String.valueOf(map.get("success")))){ + if (("true").equals(String.valueOf(map.get("success")))) { insertMap.put("resultCode", "SUCCESS"); - }else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); insertMap.put("muMemberId", paramMap.get("muMemberId")); -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + // logHistoryService.insertLogHistory(insertMap, visitLogParamMap); } catch (Exception e) { e.printStackTrace(); } } log.debug("WebServiceController selectListCategory END"); - - + return HttpUtil.makeHashToJsonModelAndView(map); } - + /** * 카테고리 별 시술 목록 조회 * @@ -126,28 +125,28 @@ public class WebServiceController extends ManagerDraftAction{ * @param response * @return */ - @PostMapping(value="/webservice/selectListService.do") + @PostMapping(value = "/webservice/selectListService.do") @ResponseBody public ResponseEntity> selectListService(@RequestParam("categoryNo") String categoryNo) { - - Map response = new HashMap<>(); - - try { - HashMap paramMap = new HashMap<>(); - paramMap.put("categoryNo", categoryNo); - - Map result = webServiceService.selectListWebService(paramMap); - return ResponseEntity.ok(result); - - } catch (Exception e) { - log.error("서비스 조회 실패", e); - response.put("msgCode", Constants.FAIL); - response.put("msgDesc", e.getMessage()); - response.put("rows", new ArrayList<>()); - return ResponseEntity.ok(response); - } + + Map response = new HashMap<>(); + + try { + HashMap paramMap = new HashMap<>(); + paramMap.put("categoryNo", categoryNo); + + Map result = webServiceService.selectListWebService(paramMap); + return ResponseEntity.ok(result); + + } catch (Exception e) { + log.error("서비스 조회 실패", e); + response.put("msgCode", Constants.FAIL); + response.put("msgDesc", e.getMessage()); + response.put("rows", new ArrayList<>()); + return ResponseEntity.ok(response); + } } - + /** * 시술관리 상세로 이동. * @@ -155,19 +154,19 @@ public class WebServiceController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webservice/selectServiceDetailIntro.do") + @RequestMapping(value = "/webservice/selectServiceDetailIntro.do") public String selectServiceDetailIntro(HttpSession session, HttpServletRequest request, Model model) { log.debug("WebServiceController selectServiceDetailIntro START"); HashMap paramMap = HttpUtil.getParameterMap(request); model.addAttribute("CATEGORY_DIV_CD", paramMap.get("categoryDivCd")); model.addAttribute("CATEGORY_NO", paramMap.get("categoryNo")); - model.addAttribute("POST_NO", paramMap.get("postNo")); + model.addAttribute("POST_NO", paramMap.get("postNo")); log.debug("WebServiceController selectServiceDetailIntro END"); - + return "/web/service/webServiceDetail"; } - + /** * 시술 목록 상세 조회 * @@ -175,32 +174,33 @@ public class WebServiceController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webservice/selectServiceDetail.do") - public ModelAndView selectServiceDetail(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + @RequestMapping(value = "/webservice/selectServiceDetail.do") + public ModelAndView selectServiceDetail(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { log.debug("WebServiceController selectServiceDetail START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webServiceService.selectServiceDetail(paramMap); - }catch (Exception e) { + + try { + map = webServiceService.selectServiceDetail(paramMap); + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); return null; - }finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { + } else { + if (null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { map.put("msgCode", Constants.FAIL); } map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); } } @@ -216,243 +216,22 @@ public class WebServiceController extends ManagerDraftAction{ insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); ; - if(("true").equals(String.valueOf(map.get("success")))){ + if (("true").equals(String.valueOf(map.get("success")))) { insertMap.put("resultCode", "SUCCESS"); - }else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); + // logHistoryService.insertLogHistory(insertMap, visitLogParamMap); } catch (Exception e) { e.printStackTrace(); } } log.debug("WebServiceController selectServiceDetail END"); - - - return HttpUtil.makeHashToJsonModelAndView(map); - } - - @RequestMapping(value="/webservice/selectMakeReservation.do") - public String selectMakeReservation(HttpSession session, HttpServletRequest request, Model model) { - log.debug("WebServiceController selectMakeReservation START"); - HashMap paramMap = HttpUtil.getParameterMap(request); - model.addAttribute("CATEGORY_DIV_CD", paramMap.get("CATEGORY_DIV_CD")); - model.addAttribute("CATEGORY_NO", paramMap.get("CATEGORY_NO")); - model.addAttribute("POST_NO", paramMap.get("POST_NO")); - model.addAttribute("PROCEDURE_ID", paramMap.get("PROCEDURE_ID")); - - log.debug("WebServiceController selectMakeReservation END"); - - return "/web/service/makeReservation"; - } - - /** - * 시술 목록 상세 조회 - * - * @param request - * @param response - * @return - */ - @RequestMapping(value="/webservice/selectReservation.do") - public ModelAndView selectReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { - - log.debug("WebServiceController selectReservation START"); - - HashMap paramMap = HttpUtil.getParameterMap(request); - HashMap map = new HashMap(); - StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webServiceService.selectReservation(paramMap); - }catch (Exception e) { - e.printStackTrace(); - errorMsg.append(e); - return null; - }finally { - if(Constants.OK == map.get("msgCode")) { - - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { - map.put("msgCode", Constants.FAIL); - } - - map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); - } - } - - try { - HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); - HashMap insertMap = new HashMap(); - - insertMap.put("url", "/webservice/selectReservation.do"); - insertMap.put("func", "selectListService"); - insertMap.put("funcName", "예약 조회"); - insertMap.put("service", "webServiceService"); - insertMap.put("serviceName", "예약 상세"); - insertMap.put("requestValue", String.valueOf(paramMap)); - insertMap.put("responseValue", String.valueOf(map)); - ; - if(("true").equals(String.valueOf(map.get("success")))){ - insertMap.put("resultCode", "SUCCESS"); - }else{ - insertMap.put("resultCode", "ERROR"); - } - - insertMap.put("resultMsg", String.valueOf(errorMsg)); - -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } catch (Exception e) { - e.printStackTrace(); - } - } - - log.debug("WebServiceController selectReservation END"); - - - return HttpUtil.makeHashToJsonModelAndView(map); - } - - /** - * 시술 목록 상세 조회 - * - * @param request - * @param response - * @return - */ - @RequestMapping(value="/webservice/selectReservationCnt.do") - public ModelAndView selectReservationCnt(HttpSession session, HttpServletRequest request, HttpServletResponse response) { - - log.debug("WebServiceController selectReservationCnt START"); - - HashMap paramMap = HttpUtil.getParameterMap(request); - HashMap map = new HashMap(); - StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webServiceService.selectReservationCnt(paramMap); - }catch (Exception e) { - e.printStackTrace(); - errorMsg.append(e); - return null; - }finally { - if(Constants.OK == map.get("msgCode")) { - - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { - map.put("msgCode", Constants.FAIL); - } - - map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); - } - } - - try { - HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); - HashMap insertMap = new HashMap(); - - insertMap.put("url", "/webservice/selectReservationCnt.do"); - insertMap.put("func", "selectReservationCnt"); - insertMap.put("funcName", "예약 조회"); - insertMap.put("service", "webServiceService"); - insertMap.put("serviceName", "예약 상세"); - insertMap.put("requestValue", String.valueOf(paramMap)); - insertMap.put("responseValue", String.valueOf(map)); - ; - if(("true").equals(String.valueOf(map.get("success")))){ - insertMap.put("resultCode", "SUCCESS"); - }else{ - insertMap.put("resultCode", "ERROR"); - } - - insertMap.put("resultMsg", String.valueOf(errorMsg)); - -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } catch (Exception e) { - e.printStackTrace(); - } - } - - log.debug("WebServiceController selectReservationCnt END"); - - - return HttpUtil.makeHashToJsonModelAndView(map); - } - - /** - * 예약 저장 - * - * @param request - * @param response - * @return - */ - @RequestMapping(value="/webservice/insertReservation.do") - public ModelAndView insertReservation(HttpSession session, HttpServletRequest request, HttpServletResponse response) { - - log.debug("WebServiceController insertReservation START"); - - HashMap paramMap = HttpUtil.getParameterMap(request); - HashMap map = new HashMap(); - StringBuffer errorMsg = new StringBuffer(); - - try{ - map = webServiceService.insertReservation(paramMap); - log.debug(map + "TEST"); - }catch (Exception e) { - e.printStackTrace(); - errorMsg.append(e); - return null; - }finally { - if(Constants.OK == map.get("msgCode")) { - - }else{ - if(null == map.get("msgCode") || ("").equals(map.get("msgCode"))) { - map.put("msgCode", Constants.FAIL); - } - - map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다. (E0029)"); - } - } - - try { - HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); - HashMap insertMap = new HashMap(); - - insertMap.put("url", "/webservice/insertReservation.do"); - insertMap.put("func", "selectReservationCnt"); - insertMap.put("funcName", "예약 저장"); - insertMap.put("service", "webServiceService"); - insertMap.put("serviceName", "예약 저장"); - insertMap.put("requestValue", String.valueOf(paramMap)); - insertMap.put("responseValue", String.valueOf(map)); - ; - if(("true").equals(String.valueOf(map.get("success")))){ - insertMap.put("resultCode", "SUCCESS"); - }else{ - insertMap.put("resultCode", "ERROR"); - } - - insertMap.put("resultMsg", String.valueOf(errorMsg)); - -// logHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } catch (Exception e) { - e.printStackTrace(); - } - } - - log.debug("WebServiceController insertReservation END"); - - return HttpUtil.makeHashToJsonModelAndView(map); } } diff --git a/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java b/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java index 4aae690..9d31420 100644 --- a/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java +++ b/src/main/java/com/madeuhome/dao/web/webservice/WebServiceSqlMapDAO.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Repository; import jakarta.annotation.PostConstruct; @Repository -public class WebServiceSqlMapDAO extends SqlSessionDaoSupport{ +public class WebServiceSqlMapDAO extends SqlSessionDaoSupport { @Autowired private SqlSessionTemplate sqlSessionTemplate; @@ -22,124 +22,73 @@ public class WebServiceSqlMapDAO extends SqlSessionDaoSupport{ void init() { setSqlSessionTemplate(sqlSessionTemplate); } - + /** * 시술관리 정보 카테고리 리스트 조회 (List) * * @param Map * @return - * @throws DataAccessException + * @throws DataAccessException */ - public List> selectListWebCategory(HashMap paramMap) throws DataAccessException { + public List> selectListWebCategory(HashMap paramMap) + throws DataAccessException { logger.debug("WebServiceSqlMapDAO selectListWebCategory START"); - + String sqlId = "WebService.selectListWebCategory"; - + logger.debug("WebServiceSqlMapDAO selectListWebCategory END"); - + return getSqlSession().selectList(sqlId, paramMap); } - + /** * 시술관리 정보 시술 리스트 조회 (List) * * @param Map * @return - * @throws DataAccessException + * @throws DataAccessException */ - public List> selectListWebService(HashMap paramMap) throws DataAccessException { + public List> selectListWebService(HashMap paramMap) throws DataAccessException { logger.debug("WebServiceSqlMapDAO selectListWebService START"); - + String sqlId = "WebService.selectListWebService"; - + logger.debug("WebServiceSqlMapDAO selectListWebService END"); - + return getSqlSession().selectList(sqlId, paramMap); } - + /** - * 시술관리 정보 시술 상세 조회 + * 시술관리 정보 시술 상세 조회 * * @param Map * @return - * @throws DataAccessException + * @throws DataAccessException */ - public Map selectServiceDetail(HashMap paramMap) throws DataAccessException { + public Map selectServiceDetail(HashMap paramMap) throws DataAccessException { logger.debug("WebServiceSqlMapDAO selectServiceDetail START"); - + String sqlId = "WebService.selectServiceDetail"; - + logger.debug("WebServiceSqlMapDAO selectServiceDetail END"); - + return getSqlSession().selectOne(sqlId, paramMap); } - + /** * 시술관리 정보 시술 목록 조회 (List) * * @param Map * @return - * @throws DataAccessException + * @throws DataAccessException */ - public List> selectListService(HashMap paramMap) throws DataAccessException { + public List> selectListService(HashMap paramMap) throws DataAccessException { logger.debug("WebServiceSqlMapDAO selectListService START"); - + String sqlId = "WebService.selectListService"; - + logger.debug("WebServiceSqlMapDAO selectListService END"); - + return getSqlSession().selectList(sqlId, paramMap); } - - /** - * 예약 상세 조회 - * - * @param Map - * @return - * @throws DataAccessException - */ - public Map selectReservationCnt(HashMap paramMap) throws DataAccessException { - logger.debug("WebServiceSqlMapDAO selectReservationCnt START"); - - String sqlId = "WebService.selectReservationCnt"; - - logger.debug("WebServiceSqlMapDAO selectReservationCnt END"); - - return getSqlSession().selectOne(sqlId, paramMap); - } - - /** - * 예약 시술 정보 조회 - * - * @param Map - * @return - * @throws DataAccessException - */ - public Map selectReservationService(HashMap paramMap) throws DataAccessException { - logger.debug("WebServiceSqlMapDAO selectReservationService START"); - - String sqlId = "WebService.selectReservationService"; - - logger.debug("WebServiceSqlMapDAO selectReservationService END"); - - return getSqlSession().selectOne(sqlId, paramMap); - } - /** - * 예약 정보 저장 - * - * @param Map - * @return - * @throws DataAccessException - */ - public Map insertReservation(HashMap paramMap) throws DataAccessException { - logger.debug("WebServiceSqlMapDAO insertReservation START"); - - String sqlId = "WebService.insertReservation"; - - logger.debug("WebServiceSqlMapDAO insertReservation END"); - - getSqlSession().insert(sqlId, paramMap); - - return null; - } } diff --git a/src/main/java/com/madeuhome/dto/ReservationDto.java b/src/main/java/com/madeuhome/dto/ReservationDto.java new file mode 100644 index 0000000..5969779 --- /dev/null +++ b/src/main/java/com/madeuhome/dto/ReservationDto.java @@ -0,0 +1,40 @@ +package com.madeuhome.dto; + +import lombok.Data; + +/** + * 예약 관련 DTO + */ +@Data +public class ReservationDto { + // 예약 기본 정보 + private String muReserveId; + private String userName; + private String phoneNumber; + private String birthDate; + private String selectedDate; + private String time; + private String etc; + + // 시술 정보 + private String categoryDivCd; + private String categoryNo; + private String postNo; + private String procedureId; + private String treatmentId; + private String treatmentName; + private String treatmentProcedureId; + private String treatmentProcedureName; + private String treatmentInfos; + + // 병원 운영 정보 + private String muHospitalId; + private String hospitalName; + private String searchDate; + private String openYn; + private String holidayYn; + private String openStartTime; + private String openEndTime; + private String breakStartTime; + private String breakEndTime; +} diff --git a/src/main/java/com/madeuhome/service/web/reservation/ReservationService.java b/src/main/java/com/madeuhome/service/web/reservation/ReservationService.java new file mode 100644 index 0000000..b034557 --- /dev/null +++ b/src/main/java/com/madeuhome/service/web/reservation/ReservationService.java @@ -0,0 +1,211 @@ +package com.madeuhome.service.web.reservation; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.madeuhome.constants.Constants; +import com.madeuhome.util.OkHttpService; + +import lombok.extern.slf4j.Slf4j; + +/** + * 예약 서비스 (구현체 포함) - 쁘띠&피부센터 + */ +@Service +@Slf4j +public class ReservationService { + + @Autowired + private SqlSessionTemplate sqlSession; + + @Value("${url.old-crm-php}") + private String ocp; + + /** + * 예약 시술 정보 조회 + */ + public HashMap selectReservation(HashMap paramMap) throws Exception { + log.debug("ReservationService selectReservation START"); + HashMap map = new HashMap<>(); + + try { + List> listMap2 = new ArrayList<>(); + + if (paramMap.get("PROCEDURE_ID").toString().indexOf(",") != -1) { + String[] PROCEDURE_ID = paramMap.get("PROCEDURE_ID").toString().split(","); + for (int i = 0; i < PROCEDURE_ID.length; i++) { + HashMap map2 = new HashMap<>(); + map2.put("PROCEDURE_ID", PROCEDURE_ID[i]); + listMap2.add(sqlSession.selectOne("Reservation.selectReservationService", map2)); + } + } else { + listMap2.add(sqlSession.selectOne("Reservation.selectReservationService", paramMap)); + } + map.put("reservation", listMap2); + map.put("msgCode", Constants.OK); + map.put("success", "true"); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("ReservationService selectReservation END"); + return map; + } + + /** + * 병원 휴일 조회 (달력 표출용) + */ + public HashMap selectHospitalHolidayList(HashMap paramMap) throws Exception { + log.debug("ReservationService selectHospitalHolidayList START"); + HashMap map = new HashMap<>(); + + try { + List> listMap = sqlSession.selectList("Reservation.selectHospitalHolidayList", + paramMap); + map.put("rows", listMap); + map.put("msgCode", Constants.OK); + map.put("success", "true"); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("ReservationService selectHospitalHolidayList END"); + return map; + } + + /** + * 특정 날짜 운영시간 조회 + */ + public HashMap selectHospitalWorkTime(HashMap paramMap) throws Exception { + log.debug("ReservationService selectHospitalWorkTime START"); + HashMap map = new HashMap<>(); + + try { + Map result = sqlSession.selectOne("Reservation.selectHospitalWorkTime", paramMap); + if (result != null) { + map.put("rows", result); + } else { + map.put("rows", new HashMap<>()); + } + map.put("msgCode", Constants.OK); + map.put("success", "true"); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("ReservationService selectHospitalWorkTime END"); + return map; + } + + /** + * 예약 카운트 조회 + */ + public HashMap selectReservationCnt(HashMap paramMap) throws Exception { + log.debug("ReservationService selectReservationCnt START"); + HashMap map = new HashMap<>(); + + try { + Map result = sqlSession.selectOne("Reservation.selectReservationCnt", paramMap); + map.put("rows", result); + map.put("msgCode", Constants.OK); + map.put("success", "true"); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("ReservationService selectReservationCnt END"); + return map; + } + + /** + * 예약 저장 + */ + public HashMap insertReservation(HashMap paramMap) throws Exception { + log.debug("ReservationService insertReservation START"); + HashMap map = new HashMap<>(); + try { + String muReserveId = ("R").concat(String.valueOf(System.currentTimeMillis())); + paramMap.put("muReserveId", muReserveId); + ArrayList userRequest = new ArrayList<>(); + + // TREATMENT_INFOS 파라미터가 있으면 파싱하여 P_변수명으로 세팅 후 insertReservation 호출 + if (paramMap.get("TREATMENT_INFOS") != null) { + ObjectMapper objectMapper = new ObjectMapper(); + List> treatmentList = objectMapper.readValue( + paramMap.get("TREATMENT_INFOS").toString(), + new TypeReference>>() { + }); + for (Map t : treatmentList) { + paramMap.put("P_TREATMENT_ID", t.get("MU_TREATMENT_ID")); + paramMap.put("P_TREATMENT_NM", t.get("TREATMENT_NAME")); + paramMap.put("P_PROCEDURE_ID", t.get("MU_TREATMENT_PROCEDURE_ID")); + paramMap.put("P_PROCEDURE_NM", t.get("TREATMENT_PROCEDURE_NAME")); + userRequest.add((String) t.get("TREATMENT_PROCEDURE_NAME")); + sqlSession.insert("Reservation.insertReservation", paramMap); + } + } else { + // 기존 방식대로 단일 시술 정보로 처리 + paramMap.put("P_TREATMENT_ID", paramMap.get("MU_TREATMENT_ID")); + paramMap.put("P_TREATMENT_NM", paramMap.get("TREATMENT_NAME")); + paramMap.put("P_PROCEDURE_ID", paramMap.get("MU_TREATMENT_PROCEDURE_ID")); + paramMap.put("P_PROCEDURE_NM", paramMap.get("TREATMENT_PROCEDURE_NAME")); + userRequest.add((String) paramMap.get("TREATMENT_PROCEDURE_NAME")); + sqlSession.insert("Reservation.insertReservation", paramMap); + } + + Map formData = new HashMap<>(); + formData.put("visitorName", (String) paramMap.get("NAME")); + formData.put("visitorPhone", (String) paramMap.get("PHONE_NUMBER")); + + String strUserRequest = "[선택시술]:" + userRequest.stream().collect(Collectors.joining(", ")); + String birthDate = "[생년월일]:" + paramMap.get("BIRTH_DATE"); + String reqTxt = "[요청사항]:" + (String) paramMap.get("ETC"); + formData.put("userRequest", strUserRequest + "\n" + birthDate + "\n" + reqTxt); + String time = (String) paramMap.get("TIME"); + String date = (String) paramMap.get("SELECTED_DATE"); + String dateTime = date + " " + time; + formData.put("datetime", dateTime); + + Map detailMap = sqlSession.selectOne("Reservation.selectServiceDetail", paramMap); + + formData.put("itemName", "[홈페이지] 쁘띠&피부센터"); + // 구CRM 연동ID가 없을 경우 기본값 (피부 & 쁘띠센터) + String oldCrmItemId = (String) detailMap.get("oldCrmItemId") == null + ? "NBI-4aJSJ67P-f0ID-4xds-aReQ-MnhfErLts0HP" + : (String) detailMap.get("oldCrmItemId"); + formData.put("itemID", oldCrmItemId); + formData.put("etcText", "[진료]:" + (String) detailMap.get("CATEGORY_NM")); + + // OLD CRM으로 예약정보 POST + OkHttpService.postFormData(ocp, formData); + + map.put("msgCode", Constants.OK); + map.put("success", "true"); + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("ReservationService insertReservation END"); + return map; + } +} diff --git a/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java b/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java index 6253fc3..2988797 100644 --- a/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java +++ b/src/main/java/com/madeuhome/service/web/webservice/WebServiceService.java @@ -4,9 +4,8 @@ import java.util.HashMap; public interface WebServiceService { public HashMap selectListWebCategory(HashMap paramMap) throws Exception; + public HashMap selectListWebService(HashMap paramMap) throws Exception; + public HashMap selectServiceDetail(HashMap paramMap) throws Exception; - public HashMap selectReservation(HashMap paramMap) throws Exception; - public HashMap selectReservationCnt(HashMap paramMap) throws Exception; - public HashMap insertReservation(HashMap paramMap) throws Exception; } diff --git a/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java b/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java index e43e99b..2d75314 100644 --- a/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java +++ b/src/main/java/com/madeuhome/service/web/webservice/impl/WebServiceServiceImpl.java @@ -1,295 +1,113 @@ package com.madeuhome.service.web.webservice.impl; - -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.madeuhome.constants.Constants; import com.madeuhome.dao.web.webservice.WebServiceSqlMapDAO; import com.madeuhome.service.web.webservice.WebServiceService; -import com.madeuhome.util.OkHttpService; import lombok.extern.slf4j.Slf4j; @Slf4j @Service("WebServiceService") -public class WebServiceServiceImpl implements WebServiceService{ - +public class WebServiceServiceImpl implements WebServiceService { + @Autowired - private WebServiceSqlMapDAO webServiceSqlMapDAO; - - @Value("${url.old-crm-php}") - private String ocp; - + private WebServiceSqlMapDAO webServiceSqlMapDAO; + /** * 시술 정보 카테고리 리스트 조회 (List) * * @param paramMap * @return - * @throws Exception + * @throws Exception */ @Override public HashMap selectListWebCategory(HashMap paramMap) throws Exception { log.debug("WebServiceServiceImpl selectListWebCategory START"); - + HashMap map = new HashMap(); - try{ + try { List> listMap = webServiceSqlMapDAO.selectListWebCategory(paramMap); - map.put("rows",listMap); + map.put("rows", listMap); map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - throw e; + throw e; } - + log.debug("WebServiceServiceImpl selectListWebCategory END"); return map; } - + /** * 시술 정보 리스트 조회 (List) * * @param paramMap * @return - * @throws Exception + * @throws Exception */ @Override public HashMap selectListWebService(HashMap paramMap) throws Exception { log.debug("WebServiceServiceImpl selectListWebService START"); - + HashMap map = new HashMap(); - try{ + try { List> listMap = webServiceSqlMapDAO.selectListWebService(paramMap); - map.put("rows",listMap); + map.put("rows", listMap); map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - throw e; + throw e; } - + log.debug("WebServiceServiceImpl selectListWebService END"); return map; } - + /** - * 시술 정보 상세 조회 + * 시술 정보 상세 조회 * * @param paramMap * @return - * @throws Exception + * @throws Exception */ @Override public HashMap selectServiceDetail(HashMap paramMap) throws Exception { log.debug("WebServiceServiceImpl selectServiceDetail START"); - + HashMap map = new HashMap(); - try{ - //상세 내용 + try { + // 상세 내용 Map listMap = webServiceSqlMapDAO.selectServiceDetail(paramMap); - map.put("rows",listMap); - //시술 목록 + map.put("rows", listMap); + // 시술 목록 List> listServiceMap = webServiceSqlMapDAO.selectListService(paramMap); - map.put("price",listServiceMap); - - map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("price", listServiceMap); - }catch (Exception e) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + + } catch (Exception e) { e.printStackTrace(); - throw e; + throw e; } - + log.debug("WebServiceServiceImpl selectServiceDetail END"); return map; } - - /** - * 예약 정보 조회 - * - * @param paramMap - * @return - * @throws Exception - */ - @Override - public HashMap selectReservation(HashMap paramMap) throws Exception { - log.debug("WebServiceServiceImpl selectReservation START"); - HashMap map = new HashMap(); - - try{ - //예약 목록 - List> listMap2 = new ArrayList>(); - - if(paramMap.get("PROCEDURE_ID").toString().indexOf(",") != -1) { - String[] PROCEDURE_ID = paramMap.get("PROCEDURE_ID").toString().split(","); - - for(int i = 0; i < PROCEDURE_ID.length; i++) { - HashMap map2 = new HashMap(); - map2.put("PROCEDURE_ID", PROCEDURE_ID[i]); - listMap2.add(webServiceSqlMapDAO.selectReservationService(map2)); - } - }else { - listMap2.add(webServiceSqlMapDAO.selectReservationService(paramMap)); - } - map.put("reservation",listMap2); - map.put("msgCode", Constants.OK); - map.put("success","true"); - - }catch (Exception e) { - e.printStackTrace(); - throw e; - } - - log.debug("WebServiceServiceImpl selectReservation END"); - return map; - } - - /** - * 예약 정보 조회 - * - * @param paramMap - * @return - * @throws Exception - */ - @Override - public HashMap selectReservationCnt(HashMap paramMap) throws Exception { - log.debug("WebServiceServiceImpl selectReservationCnt START"); - - HashMap map = new HashMap(); - - try{ - //상세 내용 - Map listMap = webServiceSqlMapDAO.selectReservationCnt(paramMap); - map.put("rows",listMap); - - map.put("msgCode", Constants.OK); - map.put("success","true"); - - }catch (Exception e) { - e.printStackTrace(); - throw e; - } - - log.debug("WebServiceServiceImpl selectReservationCnt END"); - return map; - } - - /** - * 예약 정보 저장 - * - * @param paramMap - * @return - * @throws Exception - */ - @Override - public HashMap insertReservation(HashMap paramMap) throws Exception { - log.debug("WebServiceServiceImpl insertReservation START"); - HashMap map = new HashMap(); - try{ - String muReserveId = ("R").concat(String.valueOf(System.currentTimeMillis())); - paramMap.put("muReserveId",muReserveId); - ArrayList userRequest = new ArrayList(); - // TREATMENT_INFOS 파라미터가 있으면 파싱하여 P_변수명으로 세팅 후 insertReservation 호출 - if(paramMap.get("TREATMENT_INFOS") != null) { - ObjectMapper objectMapper = new ObjectMapper(); - List> treatmentList = objectMapper.readValue(paramMap.get("TREATMENT_INFOS").toString(), new TypeReference>>(){}); - for(Map t : treatmentList) { - paramMap.put("P_TREATMENT_ID", t.get("MU_TREATMENT_ID")); - paramMap.put("P_TREATMENT_NM", t.get("TREATMENT_NAME")); - paramMap.put("P_PROCEDURE_ID", t.get("MU_TREATMENT_PROCEDURE_ID")); - paramMap.put("P_PROCEDURE_NM", t.get("TREATMENT_PROCEDURE_NAME")); - userRequest.add((String) t.get("TREATMENT_PROCEDURE_NAME")); - webServiceSqlMapDAO.insertReservation(paramMap); - } - } else { - // 기존 방식대로 단일 시술 정보로 처리 - paramMap.put("P_TREATMENT_ID", paramMap.get("MU_TREATMENT_ID")); - paramMap.put("P_TREATMENT_NM", paramMap.get("TREATMENT_NAME")); - paramMap.put("P_PROCEDURE_ID", paramMap.get("MU_TREATMENT_PROCEDURE_ID")); - paramMap.put("P_PROCEDURE_NM", paramMap.get("TREATMENT_PROCEDURE_NAME")); - userRequest.add((String) paramMap.get("TREATMENT_PROCEDURE_NAME")); - webServiceSqlMapDAO.insertReservation(paramMap); - } - - Map formData = new HashMap<>(); - formData.put("visitorName", (String) paramMap.get("NAME")); - formData.put("visitorPhone", (String) paramMap.get("PHONE_NUMBER")); - - String strUserRequest = "[선택시술]:" + userRequest.stream().collect(Collectors.joining(", ")); - String birthDate = "[생년월일]:" + paramMap.get("BIRTH_DATE"); - String reqTxt = "[요청사항]:" + (String) paramMap.get("ETC"); - formData.put("userRequest", strUserRequest + "\n" + birthDate + "\n" + reqTxt); - String time = (String) paramMap.get("TIME"); - String date = (String) paramMap.get("SELECTED_DATE"); - String dateTime = date + " " + time; - formData.put("datetime", dateTime); - - Map detailMap = webServiceSqlMapDAO.selectServiceDetail(paramMap); - - formData.put("itemName", "[홈페이지] 쁘띠&피부센터"); - // 구CRM 연동ID가 없을 경우 모두 (재방문) 다이어트 센터 - String oldCrmItemId = (String) detailMap.get("oldCrmItemId") == null ? "NBI-4aJSJ67P-f0ID-4xds-aReQ-MnhfErLts0HP" : (String) detailMap.get("oldCrmItemId"); - formData.put("itemID", oldCrmItemId); - - formData.put("etcText", "[진료]:" + (String) detailMap.get("CATEGORY_NM")); - - // OLD CRM으로 예약정보 POST - /** - * //시술정보(상품명 , 상품ID) - 상품명 : 메쉬다주사(지방분해주사) - 상품 ID : NBI-1M0JEq5C-b8LM-4W0V-9YxZ-Z5r9XWJpIVEZ - - 피부 & 쁘띠센터 - NBI-4aJSJ67P-f0ID-4xds-aReQ-MnhfErLts0HP - - 프리미엄 레이저 리프팅 - NBI-1iPCWjih-2TDk-4NG3-ci56-tK7dgxxAT6dU - - (첫방문) 다이어트 센터 - NBI-1Q8doiCm-qzTh-4imi-9lsK-6YDslUzIK2OO - - (재방문) 다이어트 센터 - NBI-2WlrXQdl-esws-5aA5-al7z-d7HwxL9tX0YF - - 탈모약 - NBI-Nz00si0r-DkGc-5hdd-bs27-SLn0KHlHflS8 - - 비만치료제 위고비 - NBI-2nJnTFVm-ieDy-4TNQ-czDK-Ll9FyixFr7zn - - * - * - **/ - OkHttpService.postFormData(ocp, formData); - - - map.put("msgCode", Constants.OK); - map.put("success","true"); - - }catch (Exception e) { - e.printStackTrace(); - throw e; - } - - System.out.println("[insertReservation] paramMap: " + paramMap); - log.debug("WebServiceServiceImpl insertReservation END"); - return map; - } } \ No newline at end of file diff --git a/src/main/resources/mappers/ReservationMapper.xml b/src/main/resources/mappers/ReservationMapper.xml new file mode 100644 index 0000000..c312b00 --- /dev/null +++ b/src/main/resources/mappers/ReservationMapper.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + SELECT CONCAT(#{muReserveId},LPAD((SELECT NEXTVAL(MU_RESERVE_SEQ)), 11, 0)) + + INSERT INTO MU_RESERVE( + MU_RESERVE_ID + ,USER_NAME + ,PHONE_NUMBER + ,RESERVE_DATE + ,RESERVE_TIME + ,MU_TREATMENT_ID + ,TREATMENT_NAME + ,MU_TREATMENT_PROCEDURE_ID + ,TREATMENT_PROCEDURE_NAME + ,ETC + ,STATUS + ,STATUS2 + ,WRITE_DATE + ,WRITE_TIME + ,CUD_FLAG + ,USE_YN + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + )VALUES( + #{id} + ,#{NAME} + ,#{PHONE_NUMBER} + ,#{SELECTED_DATE} + ,#{TIME} + ,#{P_TREATMENT_ID} + ,#{P_TREATMENT_NM} + ,#{P_PROCEDURE_ID} + ,#{P_PROCEDURE_NM} + ,#{ETC,jdbcType=VARCHAR} + ,'T' + ,'N' + ,CURDATE() + ,CURTIME() + ,'C' + ,'Y' + ,'customer' + ,NOW() + ,'customer' + ,NOW() + ) + + diff --git a/src/main/resources/mappers/WebServiceSqlMap.xml b/src/main/resources/mappers/WebServiceSqlMap.xml index c71eb11..290fda1 100644 --- a/src/main/resources/mappers/WebServiceSqlMap.xml +++ b/src/main/resources/mappers/WebServiceSqlMap.xml @@ -69,71 +69,5 @@ AND A.CATEGORY_NO = #{CATEGORY_NO} AND A.POST_NO = #{POST_NO} - - - - - - - - - - SELECT CONCAT(#{muReserveId},LPAD((SELECT NEXTVAL(MU_RESERVE_SEQ)), 11, 0)) - - INSERT INTO MU_RESERVE( - MU_RESERVE_ID - ,USER_NAME - ,PHONE_NUMBER - ,RESERVE_DATE - ,RESERVE_TIME - ,MU_TREATMENT_ID - ,TREATMENT_NAME - ,MU_TREATMENT_PROCEDURE_ID - ,TREATMENT_PROCEDURE_NAME - ,ETC - ,STATUS - ,STATUS2 - ,WRITE_DATE - ,WRITE_TIME - ,CUD_FLAG - ,USE_YN - ,REG_ID - ,REG_DATE - ,MOD_ID - ,MOD_DATE - )VALUES( - #{id} - ,#{NAME} - ,#{PHONE_NUMBER} - ,#{SELECTED_DATE} - ,#{TIME} - ,#{P_TREATMENT_ID} - ,#{P_TREATMENT_NM} - ,#{P_PROCEDURE_ID} - ,#{P_PROCEDURE_NM} - ,#{ETC,jdbcType=VARCHAR} - ,'T' - ,'N' - ,CURDATE() - ,CURTIME() - ,'C' - ,'Y' - ,'customer' - ,NOW() - ,'customer' - ,NOW() - ) - \ No newline at end of file diff --git a/src/main/resources/static/css/web/service/makeReservation.css b/src/main/resources/static/css/web/service/makeReservation.css index b2ceb7b..44b3088 100644 --- a/src/main/resources/static/css/web/service/makeReservation.css +++ b/src/main/resources/static/css/web/service/makeReservation.css @@ -129,11 +129,75 @@ body { margin-right: 8px; } -/* Calendar section */ +/* Calendar section (CRM Style) */ .calendar-box { margin-bottom: 20px; } +/* Flatpickr inline calendar를 calendar-box에 맞춤 */ +.calendar-box .flatpickr-calendar { + width: 100% !important; + max-width: 100% !important; + box-shadow: none; + border: 1px solid #eee; + border-radius: 12px; +} + +.calendar-box .flatpickr-months { + padding: 8px 0; +} + +.calendar-box .dayContainer { + width: 100% !important; + min-width: 100% !important; + max-width: 100% !important; +} + +.calendar-box .flatpickr-days { + width: 100% !important; +} + +.calendar-box .flatpickr-day { + max-width: none; + height: 40px; + line-height: 40px; + border-radius: 8px; +} + +.calendar-box .flatpickr-day.selected { + background: #b23c3c; + border-color: #b23c3c; +} + +.calendar-box .flatpickr-day.today { + border-color: #b23c3c; +} + +/* 공휴일/일요일 스타일 - 빨간색+회색(지나간 날 스타일) */ +.calendar-box .flatpickr-day.flatpickr-holiday { + color: #e8a0a0 !important; + background: #f5f5f5 !important; + position: relative; + cursor: not-allowed; + opacity: 0.6; +} + +.calendar-box .flatpickr-day.flatpickr-holiday:hover { + background: #f5f5f5 !important; + color: #e8a0a0 !important; + cursor: not-allowed; +} + +.calendar-box .flatpickr-day.flatpickr-holiday.selected { + background: #f5f5f5 !important; + color: #e8a0a0 !important; +} + +/* 일요일 컬럼 (첫 번째 열) */ +.calendar-box .flatpickr-day:nth-child(7n+1) { + color: #D13E3E; +} + .calendar-header { display: flex; justify-content: center; @@ -299,9 +363,17 @@ body { } @keyframes pulse { - 0% { transform: scale(1); } - 50% { transform: scale(1.02); } - 100% { transform: scale(1); } + 0% { + transform: scale(1); + } + + 50% { + transform: scale(1.02); + } + + 100% { + transform: scale(1); + } } /* Phone message styles (common.js PhoneValidator용) */ @@ -392,7 +464,7 @@ body { gap: 16px; padding: 20px 15px; } - + .box { padding: 20px 14px; } @@ -406,7 +478,7 @@ body { height: auto; padding: 20px 15px; } - + .box { min-height: unset; min-width: unset; @@ -419,17 +491,17 @@ body { padding: 15px; gap: 20px; } - + .box { padding: 16px 12px; } - + .calendar-table th, .calendar-table td { width: 1.8em; height: 1.8em; } - + .time-btn { min-width: 70px; font-size: 0.95em; @@ -442,29 +514,29 @@ body { padding: 10px; gap: 16px; } - + .box { padding: 16px 8px; } - + .calendar-table th, .calendar-table td { width: 1.5em; height: 1.5em; font-size: 0.9em; } - + .time-btn { min-width: 60px; font-size: 0.9em; padding: 6px 0; } - + .step-title { font-size: 1em; } - + .service-item { font-size: 1em; } -} +} \ No newline at end of file diff --git a/src/main/resources/static/js/web/service/makeReservation.js b/src/main/resources/static/js/web/service/makeReservation.js index 5130362..36a0249 100644 --- a/src/main/resources/static/js/web/service/makeReservation.js +++ b/src/main/resources/static/js/web/service/makeReservation.js @@ -1,446 +1,922 @@ -/************************************************ - * 초기화 - ************************************************/ -function fn_init() { - fn_SelectReservation(category_div_cd, category_no, post_no, procedure_id); -} +// 생년월일 검증 클래스 +class BirthDateValidator { + constructor(inputId, options = {}) { + this.inputElement = document.getElementById(inputId); + this.messageElement = null; + this.options = { + showMessage: true, + realTimeValidation: true, + minAge: 0, + maxAge: 150, + format: 'YYYYMMDD', // YYYYMMDD, YYYY-MM-DD + allowFuture: false, + onValidationChange: null, + ...options + }; -var dietflag = false; + if (this.inputElement && this.options.showMessage) { + this.createMessageElement(); + } -var res_date = ''; -var res_time = ''; - -/* https://nhn.github.io/tui.date-picker/latest/DatePicker#event-change tui API 참조 */ - -const diettimes_mon_fri = [ - "09:00","09:30", - "10:00","10:30", - "11:00","11:30", - "12:00","12:30", - "14:00","14:30", - "15:00","15:30", - "16:00","16:30", - "17:00","17:30", -]; - -const diettimes_tue_ths = [ - "09:00","09:30", - "10:00","10:30", - "11:00","11:30", - "12:00","12:30", - "14:00","14:30", - "15:00","15:30", - "16:00","16:30", - "17:00","17:30", - "18:00","18:30", -]; - -const diettimes_wes_sat = [ - "09:00","09:30", - "10:00","10:30", - "11:00","11:30", - "12:00","12:30", - "13:00","13:30", - "14:00","14:30", -]; - -const etc_mon_wes_fri = [ - "10:00","10:30", - "11:00","11:30", - "12:00","12:30", - "13:00","13:30", - "15:00","15:30", - "16:00","16:30", - "17:00","17:30", - "18:00","18:30", -]; - -const etc_tue_ths = [ - "10:00","10:30", - "11:00","11:30", - "12:00","12:30", - "13:00","13:30", - "15:00","15:30", - "16:00","16:30", - "17:00","17:30", - "18:00","18:30", - "19:00","19:30", -]; - -const etc_sat = [ - "10:00","10:30", - "11:00","11:30", - "12:00","12:30", - "13:00","13:30", - "15:00","15:30", -]; - -const monthMap = { - Jan: '01', Feb: '02', Mar: '03', Apr: '04', - May: '05', Jun: '06', Jul: '07', Aug: '08', - Sep: '09', Oct: '10', Nov: '11', Dec: '12' -}; - -// 현재 년월일에서 일을 +- 일 한 결과 리턴. -Date.prototype.addDays = function (days) { -    var date = this; -    return new Date(date.setDate(date.getDate() + days)); -}; -  -// 현재 년월일에서 월을 +- 월 한 결과 리턴. -Date.prototype.addMonth = function (month) { -    var date = this; -    return new Date(date.setMonth(date.getMonth() + month)); -}; -  -// 현재 년월일에서 년을 +- 월 한 결과 리턴. -Date.prototype.addYear = function (year) { -    var date = this; -    return new Date(date.setFullYear(date.getFullYear() + year)); -}; - -/**************************************************************************** - * 카테고리 목록 가져오기 - ****************************************************************************/ -function fn_SelectReservation(category_div_cd, category_no, post_no, procedure_id){ - - let formData = new FormData(); - formData.append('CATEGORY_DIV_CD', category_div_cd); - formData.append('CATEGORY_NO', category_no); - formData.append('POST_NO', post_no); - formData.append('PROCEDURE_ID', procedure_id); - - $.ajax({ - url: encodeURI('/webservice/selectReservation.do'), - data: formData, - dataType: 'json', - processData: false, - contentType: false, - type: 'POST', - async: true, - success: function(data){ - if(data.msgCode=='0'){ - let totalCount = data.reservation.length; - let totalprice = 0; - if (0 < totalCount) { - for (let i = 0; i < data.reservation.length; i++) { - let listHTML = ''; - if(data.reservation[i].TREATMENT_PROCEDURE_NAME.toString().indexOf('다이어트') != -1){ - dietflag = true; - } - listHTML += '
  • '; - listHTML += ''; - listHTML += ''; - listHTML += ''; - listHTML += ''; - listHTML += '
    '; - listHTML += ' ' + data.reservation[i].TREATMENT_PROCEDURE_NAME + ''; - listHTML += '
    '; - listHTML += '
    '; - listHTML += '
    '; - listHTML += ' '; - listHTML += ' '; - if(data.reservation[i].DISCOUNT_PRICE == null || data.reservation[i].DISCOUNT_PRICE == undefined){ - if(data.reservation[i].PRICE == null || data.reservation[i].PRICE == undefined){ - listHTML += '0'; - }else{ - listHTML += (data.reservation[i].PRICE).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } - }else{ - listHTML += (data.reservation[i].DISCOUNT_PRICE).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } - listHTML += '원'; - listHTML += ' '; - listHTML += ' '; - if(data.reservation[i].DISCOUNT_PRICE == null || data.reservation[i].DISCOUNT_PRICE == undefined){ - if(data.reservation[i].PRICE == null || data.reservation[i].PRICE == undefined){ - listHTML += '0'; - }else{ - listHTML += (data.reservation[i].PRICE).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - totalprice += Number(data.reservation[i].PRICE); - } - }else{ - listHTML += (data.reservation[i].DISCOUNT_PRICE).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - totalprice += Number(data.reservation[i].DISCOUNT_PRICE); - } - listHTML += '원'; - listHTML += '
    '; - listHTML += ' '; - listHTML += '
    '; - listHTML += '
  • '; - $(".service-list-wrap").append(listHTML); - } - }else{ - - } - $('#total_price').text(totalprice.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")); - }else{ - modalEvent.danger("조회 오류", data.msgDesc); - } - /* 날짜 초기화 : 일요일이면 월요일이 선택하도록 설정. */ - var date = new Date(); - if(String(new Date()).split(" ")[0] == "Sun"){ - date = new Date().addDays(1); - } - datepicker.setDate(date); - }, - error : function(xhr, status, error) { - modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오."); - }, - beforeSend:function(){ - // 로딩열기 - $(".loading-image-layer").show(); - }, - complete:function(){ - // 로딩닫기 - $(".loading-image-layer").hide(); - } - }); -} - -function fn_deleteList(num){ - if(!confirm("삭제하시겠습니까?")){ - return; + if (this.inputElement && this.options.realTimeValidation) { + this.bindEvents(); + } } - var price = $("#total_price").text().replace(/,/g, ""); - var discount_price = $("#liid" + num + " > div.info > div > span").text().replace(/,/g, ""); - price = Number(price) - Number(discount_price); - $("#total_price").text(price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")); - $("#liid" + num).remove(); -} + createMessageElement() { + this.messageElement = document.createElement('div'); + this.messageElement.className = 'birth-date-message'; + this.messageElement.style.display = 'none'; + this.inputElement.parentNode.insertBefore(this.messageElement, this.inputElement.nextSibling); + } + bindEvents() { + this.inputElement.addEventListener('input', () => { + // 숫자만 입력되도록 제한 + this.inputElement.value = this.inputElement.value.replace(/[^0-9]/g, ''); + this.validateAndShowMessage(); + }); + this.inputElement.addEventListener('blur', () => { + this.validateAndShowMessage(); + }); -var datepicker = new tui.DatePicker('#wrapper', { - date: new Date(), - language: 'ko', - input: { - element: '#datepicker-input', - format: 'yyyy-MM-dd' - }, - showAlways: true, - selectableRanges: [ - [new Date(), new Date(2099, 11, 31)] - ] -}); - -datepicker.on('change', () => { - // 선택된 날짜 가져오기 - const selectedDate = datepicker.getDate(); - - //object to string - const strSelectedDate = String(selectedDate); - //string to array - const arrSelectedDate = strSelectedDate.split(" "); - //yyyymmdd 형태로 변경 - const selDate = arrSelectedDate[3] + monthNameToNumber(arrSelectedDate[1]) + arrSelectedDate[2]; - //setNull시 change발생하여 날짜선택시 - if(selectedDate){ - console.log(selDate); - res_date = ''; - res_time = ''; - $('.time-btn').removeClass('active'); - $('.person-cnt_span').html('- 명'); - const grid = document.getElementById('timeGrid'); - var times = diettimes_tue_ths; - if(dietflag){ - if(arrSelectedDate[0] == "Mon" || arrSelectedDate[0] == "Fri"){ - times = diettimes_mon_fri; - $('.section_div').removeClass("height850"); - }else if(arrSelectedDate[0] == "Tue" || arrSelectedDate[0] == "Thu"){ - times = diettimes_tue_ths; - $('.section_div').addClass("height850"); - }else if(arrSelectedDate[0] == "Wed" || arrSelectedDate[0] == "Sat"){ - times = diettimes_wes_sat; - $('.section_div').removeClass("height850"); + this.inputElement.addEventListener('keydown', (e) => { + // 백스페이스, 델리트, 탭, 화살표 키는 허용 + if ([8, 9, 46, 37, 38, 39, 40].includes(e.keyCode)) { + return; } - }else{ - if(arrSelectedDate[0] == "Mon" || arrSelectedDate[0] == "Wed" || arrSelectedDate[0] == "Fri"){ - times = etc_mon_wes_fri; - $('.section_div').removeClass("height850"); - }else if(arrSelectedDate[0] == "Tue" || arrSelectedDate[0] == "Thu"){ - times = etc_tue_ths; - $('.section_div').addClass("height850"); - }else if(arrSelectedDate[0] == "Sat"){ - times = etc_sat; - $('.section_div').removeClass("height850"); + // 숫자가 아니면 입력 방지 + if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) { + e.preventDefault(); + } + }); + } + + validateBirthDate(dateStr) { + if (!dateStr) return { valid: false, message: '생년월일을 입력해주세요.' }; + + let cleanDate = dateStr.replace(/[^0-9]/g, ''); + + // 길이 체크 + if (cleanDate.length !== 8) { + return { valid: false, message: '생년월일은 8자리 숫자로 입력해주세요. (예: 19900115)' }; + } + + // 형식 체크 + const datePattern = /^\d{8}$/; + if (!datePattern.test(cleanDate)) { + return { valid: false, message: '올바른 생년월일 형식이 아닙니다.' }; + } + + // 년월일 추출 + const year = parseInt(cleanDate.slice(0, 4)); + const month = parseInt(cleanDate.slice(4, 6)); + const day = parseInt(cleanDate.slice(6, 8)); + + // 기본 범위 체크 + const currentYear = new Date().getFullYear(); + const minYear = currentYear - this.options.maxAge; + const maxYear = currentYear - this.options.minAge; + + if (year < minYear || year > maxYear) { + return { + valid: false, + message: `출생연도는 ${minYear}년부터 ${maxYear}년 사이여야 합니다.` + }; + } + + if (month < 1 || month > 12) { + return { valid: false, message: '월은 01부터 12까지 입력 가능합니다.' }; + } + + if (day < 1 || day > 31) { + return { valid: false, message: '일은 01부터 31까지 입력 가능합니다.' }; + } + + // Date 객체로 실제 날짜 존재 여부 확인 + const date = new Date(year, month - 1, day); + const isValidDate = ( + date.getFullYear() === year && + date.getMonth() === month - 1 && + date.getDate() === day + ); + + if (!isValidDate) { + return { valid: false, message: '존재하지 않는 날짜입니다.' }; + } + + // 미래 날짜 체크 + if (!this.options.allowFuture && date > new Date()) { + return { valid: false, message: '미래 날짜는 입력할 수 없습니다.' }; + } + + // 특별한 월별 날짜 체크 + if (month === 4 || month === 6 || month === 9 || month === 11) { + if (day === 31) { + return { valid: false, message: '해당 월은 31일이 없습니다.' }; } } - grid.innerHTML = times.map(t => - `` - ).join(''); - } - - //일요일이면 선택불가 - if( arrSelectedDate[0] == "Sun" ){ - datepicker.setNull(); - alert("일요일은 선택할 수 없습니다."); - } + + // 2월 윤년 체크 + if (month === 2) { + const isLeapYear = (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)); + if (day > 29 || (day === 29 && !isLeapYear)) { + return { valid: false, message: isLeapYear ? '2월은 29일까지만 있습니다.' : '2월은 28일까지만 있습니다.' }; + } + } + + return { valid: true, message: '올바른 생년월일입니다.' }; + } + + validateAndShowMessage() { + const result = this.validateBirthDate(this.inputElement.value); + + if (this.messageElement) { + this.showMessage(result.message, result.valid ? 'success' : 'error'); + } + + // 콜백 실행 + if (typeof this.options.onValidationChange === 'function') { + this.options.onValidationChange(result, this.inputElement.value); + } + + return result.valid; + } + + showMessage(message, type) { + if (!this.messageElement) return; + + this.messageElement.textContent = message; + this.messageElement.className = `birth-date-message ${type}`; + this.messageElement.style.display = message ? 'block' : 'none'; + } + + isValid() { + return this.validateBirthDate(this.inputElement.value).valid; + } + + getAge() { + const result = this.validateBirthDate(this.inputElement.value); + if (!result.valid) return null; + + const cleanDate = this.inputElement.value.replace(/[^0-9]/g, ''); + const birthYear = parseInt(cleanDate.slice(0, 4)); + const birthMonth = parseInt(cleanDate.slice(4, 6)); + const birthDay = parseInt(cleanDate.slice(6, 8)); + + const today = new Date(); + let age = today.getFullYear() - birthYear; + + if (today.getMonth() + 1 < birthMonth || + (today.getMonth() + 1 === birthMonth && today.getDate() < birthDay)) { + age--; + } + + return age; + } + + static isValidBirthDate(dateStr) { + const validator = new BirthDateValidator('temp', { showMessage: false }); + return validator.validateBirthDate(dateStr).valid; + } +} + +// 전역 변수 +let birthDateValidator; + +// 초기화 +fn_SelectReservation(category_div_cd, category_no, post_no, procedure_id); + +// 개선된 시술 삭제 함수 (1개일 때 삭제 방지) +function removeService(el) { + const serviceItems = document.querySelectorAll('.service-item'); + const serviceCount = serviceItems.length; + + // 시술이 1개만 남았을 때 삭제 방지 + if (serviceCount <= 1) { + alert('최소 1개의 시술은 선택되어 있어야 합니다.'); + return false; + } + + // 삭제 확인 + const serviceName = el.closest('.service-item').querySelector('span:first-child').textContent; + if (!confirm(`'${serviceName}' 시술을 삭제하시겠습니까?`)) { + return false; + } + + // 시술 삭제 + const removedItem = el.closest('.service-item'); + const priceText = removedItem.querySelector('.price').textContent; + const price = parseInt(priceText.replace(/[^0-9]/g, '')) || 0; + + removedItem.remove(); + + // 총 금액 재계산 + updateTotalPrice(); + + // 시술 개수 업데이트 + updateServiceCount(); + + // selectedTreatments 배열에서도 제거 (인덱스 기반) + const removedIndex = Array.from(serviceItems).indexOf(removedItem); + if (removedIndex !== -1 && selectedTreatments[removedIndex]) { + selectedTreatments.splice(removedIndex, 1); + } + + return true; +} + +// 총 금액 업데이트 함수 +function updateTotalPrice() { + const serviceItems = document.querySelectorAll('.service-item'); + let totalPrice = 0; + + serviceItems.forEach(item => { + const priceText = item.querySelector('.price').textContent; + const price = parseInt(priceText.replace(/[^0-9]/g, '')) || 0; + totalPrice += price; + }); + + document.getElementById('total-price').textContent = totalPrice.toLocaleString() + '원'; +} + +// 시술 개수 및 삭제 버튼 상태 업데이트 함수 +function updateServiceCount() { + const serviceItems = document.querySelectorAll('.service-item'); + const serviceCount = serviceItems.length; + const serviceCountInfo = document.getElementById('service-count-info'); + + // 개수 표시 업데이트 + serviceCountInfo.textContent = `선택된 시술: ${serviceCount}개`; + + // 1개일 때 스타일 변경 + if (serviceCount === 1) { + serviceCountInfo.className = 'service-count-info single'; + serviceCountInfo.textContent = `선택된 시술: ${serviceCount}개 (최소 필수)`; + } else { + serviceCountInfo.className = 'service-count-info'; + } + + // 삭제 버튼 상태 업데이트 + serviceItems.forEach(item => { + const delBtn = item.querySelector('.del'); + if (serviceCount <= 1) { + delBtn.className = 'del disabled'; + delBtn.title = '최소 1개의 시술은 필요합니다'; + } else { + delBtn.className = 'del'; + delBtn.title = '삭제'; + } + }); +} + +// 캘린더 데이터 +let selectedDate = null; +let selectedTime = null; +let holidays = []; +let currentWorkData = null; + +function getHolidayList() { + $.ajax({ + url: '/webservice/selectHospitalHolidayList.do', + type: 'POST', + dataType: 'json', + success: function (data) { + if (data.msgCode == '0' && data.rows) { + holidays = data.rows; + // Flatpickr 갱신 (redraw) + if (fp) fp.redraw(); + } + } + }); +} + + +const timeSlots = document.getElementById('time-slots'); +const personCount = document.getElementById('person-count'); + +// 폼 요소들 +const form = document.getElementById('reserve-form'); +const agree = document.getElementById('agree'); +const submitBtn = document.getElementById('submit-btn'); +const step02Title = document.getElementById('step02-title'); +const step03Title = document.getElementById('step03-title'); + +// 이벤트 리스너 등록 (핸드폰 번호와 생년월일 제외한 필드들) +form.addEventListener('input', function (e) { + if (e.target.id !== 'customer-phone' && e.target.id !== 'birthDate') { + setTimeout(checkForm, 10); // Validator 처리 완료 대기 + } }); +agree.addEventListener('change', checkForm); -function monthNameToNumber(mon) { - return monthMap[mon] || ''; -} - -function onClickTime(selectedDate, time, el) { - document.querySelectorAll('.time-btn').forEach(btn => btn.classList.remove('active')); - el.classList.add('active'); - - let formData = new FormData(); - formData.append('SELECTED_DATE', selectedDate.toString().substr(0, 4) + '-' + selectedDate.toString().substr(4, 2) + '-' + selectedDate.toString().substr(6, 2)); - formData.append('TIME', time); - res_date = selectedDate.toString().substr(0, 4) + '-' + selectedDate.toString().substr(4, 2) + '-' + selectedDate.toString().substr(6, 2); - res_time = time; - - $.ajax({ - url: encodeURI('/webservice/selectReservationCnt.do'), - data: formData, - dataType: 'json', - processData: false, - contentType: false, - type: 'POST', - async: true, - success: function(data){ - - if(data.msgCode=='0'){ - let listHTML2 = ''; - listHTML2 += data.rows.RES_CNT - listHTML2 += ' 명'; - $('.person-cnt_span').html(listHTML2); - }else{ - modalEvent.danger("조회 오류", data.msgDesc); - } +// 개선된 checkForm 함수 (BirthDateValidator 연계) +function checkForm() { + const name = document.getElementById('customer-name').value.trim(); - }, - error : function(xhr, status, error) { - modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오."); - }, - beforeSend:function(){ - // 로딩열기 - $(".loading-image-layer").show(); - }, - complete:function(){ - // 로딩닫기 - $(".loading-image-layer").hide(); - } - }); + // common.js의 PhoneValidator 메서드 사용 + let phoneValid = false; + try { + if (typeof PhoneValidator !== 'undefined' && + PhoneValidator.isValid && + typeof PhoneValidator.isValid === 'function') { + phoneValid = PhoneValidator.isValid('customer-phone'); + } else { + // fallback: 기본 정규식 검증 + const phone = document.getElementById('customer-phone').value.trim(); + phoneValid = phone.match(/^01[0-9]{8,9}$/); + } + } catch (e) { + console.warn('PhoneValidator error:', e); + // fallback 검증 + const phone = document.getElementById('customer-phone').value.trim(); + phoneValid = phone.match(/^01[0-9]{8,9}$/); + } + + // BirthDateValidator 사용 + let birthDateValid = false; + try { + if (birthDateValidator && typeof birthDateValidator.isValid === 'function') { + birthDateValid = birthDateValidator.isValid(); + } else { + // fallback: 기본 검증 + const birthDate = document.getElementById('birthDate').value.trim(); + birthDateValid = birthDate.match(/^\d{8}$/); + } + } catch (e) { + console.warn('BirthDateValidator error:', e); + // fallback 검증 + const birthDate = document.getElementById('birthDate').value.trim(); + birthDateValid = birthDate.match(/^\d{8}$/); + } + + const conditions = { + date: !!selectedDate, + time: !!selectedTime, + name: !!name, + phone: phoneValid, + birthDate: birthDateValid, + agree: agree.checked + }; + + const valid = Object.values(conditions).every(Boolean); + submitBtn.disabled = !valid; + + const completedSteps = Object.values(conditions).filter(Boolean).length; + const totalSteps = Object.keys(conditions).length; + + updateStepStatus(conditions); + updateButtonText(conditions, completedSteps, totalSteps); + + // CSS 클래스 업데이트 + if (valid) { + submitBtn.className = 'submit-btn ready'; + } else { + submitBtn.className = 'submit-btn step-progress'; + } } -/**************************************************************************** - * validation check - ****************************************************************************/ -function fn_validation(){ - if(res_date == ''){ - alert('예약일자가 입력되지 않았습니다. 예약일자와 시간을 입력해주세요.'); +function updateStepStatus(conditions) { + // STEP 02 상태 업데이트 + if (conditions.date && conditions.time) { + step02Title.className = 'step-title completed'; + step02Title.textContent = 'STEP 02. 예약 시간 선택 ✓'; + } else { + step02Title.className = 'step-title'; + step02Title.textContent = 'STEP 02. 예약 시간 선택'; + } + + // STEP 03 상태 업데이트 + if (conditions.name && conditions.phone && conditions.birthDate && conditions.agree) { + step03Title.className = 'step-title completed'; + step03Title.textContent = 'STEP 03. 고객정보 ✓'; + } else { + step03Title.className = 'step-title'; + step03Title.textContent = 'STEP 03. 고객정보'; + } +} + +function updateButtonText(conditions, completedSteps, totalSteps) { + if (!conditions.date) { + submitBtn.textContent = '📅 예약 날짜를 선택해주세요'; + } else if (!conditions.time) { + submitBtn.textContent = '⏰ 예약 시간을 선택해주세요'; + } else if (!conditions.name) { + submitBtn.textContent = '👤 고객명을 입력해주세요'; + } else if (!conditions.birthDate) { + submitBtn.textContent = '📅 생년월일을 올바르게 입력해주세요'; + } else if (!conditions.phone) { + submitBtn.textContent = '📱 연락처를 올바르게 입력해주세요'; + } else if (!conditions.agree) { + submitBtn.textContent = '✅ 개인정보 동의를 체크해주세요'; + } else { + submitBtn.textContent = '🎉 시술 예약하기'; + } + + // 진행률 표시 (선택사항) + if (completedSteps < totalSteps) { + const progressText = ` (${completedSteps}/${totalSteps})`; + submitBtn.textContent += progressText; + } +} + +// Flatpickr 인스턴스 +let fp; +// 공휴일 + 병원휴일 목록 (Set으로 빠른 조회) +let holidayDates = new Set(); +// 반복 휴일 목록 (MM-DD 형식) +let repeatHolidayDates = new Set(); +// 스케줄 오버라이드(OPEN_YN='Y') 날짜 목록 +let openScheduleDates = new Set(); + +function initFlatpickr() { + fp = flatpickr("#inline-calendar", { + inline: true, + locale: "ko", + dateFormat: "Y-m-d", + minDate: "today", + disableMobile: "true", + onChange: function (selectedDates, dateStr, instance) { + if (selectedDates.length > 0) { + selectDate(selectedDates[0]); + } else { + selectedDate = null; + selectedTime = null; + renderTimeSlots(); + checkForm(); + } + }, + onDayCreate: function (dObj, dStr, fp, dayElem) { + const dateObj = dayElem.dateObj; + const y = dateObj.getFullYear(); + const m = String(dateObj.getMonth() + 1).padStart(2, '0'); + const d = String(dateObj.getDate()).padStart(2, '0'); + const dateString = `${y}-${m}-${d}`; + const mmdd = `${m}-${d}`; + + // 일요일 체크 (getDay() === 0) + const isSunday = dateObj.getDay() === 0; + // DB 공휴일 체크 (정확한 날짜 또는 반복 MM-DD) + const isHoliday = holidayDates.has(dateString) || repeatHolidayDates.has(mmdd); + // 스케줄 오버라이드 체크 (OPEN_YN='Y'인 날은 클릭 가능) + const hasOpenSchedule = openScheduleDates.has(dateString); + + if ((isSunday || isHoliday) && !hasOpenSchedule) { + dayElem.classList.add('flatpickr-holiday'); + dayElem.classList.add('flatpickr-disabled'); + } + } + }); +} + +// 공휴일 + 병원휴일 목록 로드 +function getHolidayList() { + $.ajax({ + url: '/webservice/selectHospitalHolidayList.do', + type: 'POST', + dataType: 'json', + success: function (data) { + if (data.msgCode == '0' && data.rows) { + const list = Array.isArray(data.rows) ? data.rows : [data.rows]; + holidayDates.clear(); + repeatHolidayDates.clear(); + openScheduleDates.clear(); + list.forEach(function (item) { + if (item.locDate) { + // 스케줄 오버라이드(OPEN_YN='Y')는 별도 관리 + if (item.dateType === 'hospitalScheduleOpen') { + openScheduleDates.add(item.locDate); + return; // holidayDates에 추가하지 않음 + } + // 반복 휴일은 MM-DD로, 비반복은 YYYY-MM-DD로 저장 + if (item.dateType === 'hospitalHoliday') { + const md = item.locDate.substring(5); // MM-DD + repeatHolidayDates.add(md); + } + holidayDates.add(item.locDate); + } + }); + // Flatpickr 캘린더 갱신하여 휴일 표시 적용 + if (fp) { + fp.redraw(); + } + } + }, + error: function () { + console.error('Error fetching holiday list'); + } + }); +} + +// 날짜 선택 (Flatpickr onChange에서 호출) +function selectDate(dateObj) { + const y = dateObj.getFullYear(); + const m = dateObj.getMonth(); + const d = dateObj.getDate(); + const tempDate = new Date(y, m, d); + + // dateStr 생성 (YYYY-MM-DD) + const dateStr = `${y}-${String(m + 1).padStart(2, '0')}-${String(d).padStart(2, '0')}`; + + // 서버에서 운영시간 및 휴일 여부 최종 확인 + getWorkTime(dateStr, function (data) { + if (!data || !data.openYn || data.openYn === 'N' || data.holidayYn === 'Y') { + alert('선택하신 날짜는 휴무일입니다.'); + // 선택 취소 (Flatpickr clear) + if (fp) fp.clear(); + selectedDate = null; + selectedTime = null; + renderTimeSlots(); + checkForm(); + return; + } + + currentWorkData = data; + selectedDate = tempDate; + selectedTime = null; // 날짜 변경 시 시간 초기화 + + renderTimeSlots(); + checkForm(); + }); +} + +function getWorkTime(dateStr, callback) { + // 요일 계산은 DB에서 DAYOFWEEK(searchDate)로 직접 수행 + $.ajax({ + url: '/webservice/selectHospitalWorkTime.do', + data: { searchDate: dateStr }, + type: 'POST', + dataType: 'json', + success: function (data) { + if (data.msgCode == '0' && data.rows) { + callback(data.rows); + } else { + console.error('Failed to get work time'); + callback(null); + } + }, + error: function () { + console.error('Error fetching work time'); + callback(null); + } + }); +} + +function parseMinutes(t) { + if (!t) return 0; + // DB에서 다양한 형식으로 올 수 있음: "10:00", "10:00:00", "1900-01-01 10:00:00" 등 + let timeStr = String(t); + // DATETIME 형식이면 시간 부분만 추출 + if (timeStr.includes(' ')) { + timeStr = timeStr.split(' ')[1]; + } + const parts = timeStr.split(':').map(Number); + const h = parts[0] || 0; + const m = parts[1] || 0; + return h * 60 + m; +} + +function formatMinutes(mins) { + const h = Math.floor(mins / 60); + const m = mins % 60; + return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`; +} + +// 시간 슬롯 렌더링 +function renderTimeSlots() { + let html = ''; + + if (!selectedDate || !currentWorkData || !currentWorkData.openStartTime || !currentWorkData.openEndTime) { + timeSlots.innerHTML = ''; + personCount.textContent = '-'; return; } - if(res_time == ''){ - alert('예약시간이 입력되지 않았습니다. 예약시간을 입력해주세요.'); + + const startMins = parseMinutes(currentWorkData.openStartTime); + const endMins = parseMinutes(currentWorkData.openEndTime); + const breakStartMins = currentWorkData.breakStartTime ? parseMinutes(currentWorkData.breakStartTime) : -1; + const breakEndMins = currentWorkData.breakEndTime ? parseMinutes(currentWorkData.breakEndTime) : -1; + + const now = new Date(); + const todayDate = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const isToday = selectedDate && selectedDate.toDateString() === todayDate.toDateString(); + const currentMins = now.getHours() * 60 + now.getMinutes(); + + let iterMins = startMins; + // 30분 단위 + while (iterMins < endMins) { + // 브레이크 타임 체크 (start <= t < end) + if (breakStartMins !== -1 && iterMins >= breakStartMins && iterMins < breakEndMins) { + iterMins += 30; + continue; + } + + const timeStr = formatMinutes(iterMins); + + let isDisabled = false; + let disabledClass = ''; + let clickHandler = `onclick="selectTimeAndCall('${timeStr}', this)"`; + + if (isToday) { + if (iterMins <= currentMins) { + isDisabled = true; + disabledClass = ' disabled'; + clickHandler = ''; + } + } + + const selectedClass = selectedTime === timeStr && !isDisabled ? ' selected' : ''; + html += ``; + + iterMins += 30; + } + + timeSlots.innerHTML = html; + personCount.textContent = selectedDate ? (personCount.textContent === '-' ? '-' : personCount.textContent) : '-'; +} + +// 시간 선택 시 selectedTime 설정 및 onClickTime 호출 (checkForm 추가) +function selectTimeAndCall(t, el) { + const now = new Date(); + const todayDate = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const isToday = selectedDate && selectedDate.toDateString() === todayDate.toDateString(); + + // 오늘 날짜인 경우 현재 시간과 비교 + if (isToday) { + const currentTime = now.getHours() * 100 + now.getMinutes(); + const [hour, minute] = t.split(':').map(Number); + const slotTime = hour * 100 + minute; + + if (slotTime <= currentTime) { + alert('지난 시간은 선택할 수 없습니다.'); + return; + } + } + + selectedTime = t; + renderTimeSlots(); + if (el) { + document.querySelectorAll('.time-btn').forEach(btn => btn.classList.remove('active')); + el.classList.add('active'); + } + onClickTime(getSelectedDateStr(), t, el); + checkForm(); +} + +// 선택된 날짜를 yyyymmdd 문자열로 반환 +function getSelectedDateStr() { + if (!selectedDate) return ''; + const yyyy = selectedDate.getFullYear(); + const mm = String(selectedDate.getMonth() + 1).padStart(2, '0'); + const dd = String(selectedDate.getDate()).padStart(2, '0'); + return `${yyyy}${mm}${dd}`; +} + +window.selectTime = function (t) { + selectedTime = t; + renderTimeSlots(); +} + +form.onsubmit = function (e) { + e.preventDefault(); + if (!selectedDate || !selectedTime) { + alert('예약 날짜와 시간을 선택해 주세요.'); return; } - if($('#reservationName').val() == ''){ - alert('이름이 입력되지 않았습니다. 이름을 입력해주세요.'); + if (!birthDateValidator || !birthDateValidator.isValid()) { + alert('올바른 생년월일을 입력해 주세요.'); return; } - if($('#phoneNumber').val() == ''){ - alert('휴대전화번호가 입력되지 않았습니다. 휴대전화번호를 입력해주세요.'); - return; - } - if($('input[name=procedure_id]').length == 0){ - alert('시술정보가 없습니다. 시술이 입력되었는지 확인해주세요.'); - return; - } - if(!$('#agree1').is(':checked')){ - alert('필수동의가 체크되어 있지 않습니다. 필수동의에 체크해주세요.'); - return; - } - fn_reservation(); + form.reset(); + submitBtn.disabled = true; + checkForm(); // 폼 리셋 후 재검증 +}; + +let selectedTreatments = []; + +function fn_reservation() { + let formData = new FormData(); + if (selectedDate) { + const yyyy = selectedDate.getFullYear(); + const mm = String(selectedDate.getMonth() + 1).padStart(2, '0'); + const dd = String(selectedDate.getDate()).padStart(2, '0'); + formData.append('SELECTED_DATE', `${yyyy}-${mm}-${dd}`); + } + if (selectedTime) { + formData.append('TIME', selectedTime); + } + formData.append('CATEGORY_DIV_CD', typeof category_div_cd !== 'undefined' ? category_div_cd : ''); + formData.append('CATEGORY_NO', typeof category_no !== 'undefined' ? category_no : ''); + formData.append('POST_NO', typeof post_no !== 'undefined' ? post_no : ''); + formData.append('NAME', document.getElementById('customer-name').value); + formData.append('BIRTH_DATE', document.getElementById('birthDate').value); + formData.append('PHONE_NUMBER', document.getElementById('customer-phone').value); + formData.append('ETC', document.getElementById('customer-req').value); + formData.append('TREATMENT_INFOS', JSON.stringify(selectedTreatments)); + + $.ajax({ + url: encodeURI('/webservice/insertReservation.do'), + data: formData, + dataType: 'json', + processData: false, + contentType: false, + type: 'POST', + async: true, + success: function (data) { + if (data.msgCode == '0') { + alert('예약이 완료되었습니다.'); + location.href = "/webservice/selectServiceIntro.do"; + } else { + modalEvent.danger("조회 오류", data.msgDesc); + } + }, + error: function (xhr, status, error) { + modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오."); + }, + beforeSend: function () { + $(".loading-image-layer").show(); + }, + complete: function () { + $(".loading-image-layer").hide(); + } + }); } -function fn_reservation(){ +function fn_SelectReservation(category_div_cd, category_no, post_no, procedure_id) { let formData = new FormData(); - formData.append('SELECTED_DATE', res_date); - formData.append('TIME', res_time); formData.append('CATEGORY_DIV_CD', category_div_cd); formData.append('CATEGORY_NO', category_no); formData.append('POST_NO', post_no); - formData.append('NAME', $('#reservationName').val()); - formData.append('PHONE_NUMBER', $('#phoneNumber').val()); - formData.append('ETC', $('#reservationMemo').val()); - var size = $('input[name=procedure_id]').length; - var procedure_id = ''; - var procedure_nm = ''; - var treatment_id = ''; - var treatment_nm = ''; - for(i=0; i 0) { + data.reservation.forEach(function (item, i) { + let price = item.DISCOUNT_PRICE != null ? item.DISCOUNT_PRICE : item.PRICE || 0; + totalprice += Number(price); + + selectedTreatments.push({ + MU_TREATMENT_ID: item.MU_TREATMENT_ID, + TREATMENT_NAME: item.TREATMENT_NAME, + TREATMENT_PROCEDURE_NAME: item.TREATMENT_PROCEDURE_NAME, + MU_TREATMENT_PROCEDURE_ID: item.MU_TREATMENT_PROCEDURE_ID + }); + + const li = document.createElement('div'); + li.className = 'service-item'; + li.innerHTML = ` + ${item.TREATMENT_PROCEDURE_NAME} + + ${item.DISCOUNT_PRICE != null ? (item.PRICE || 0).toLocaleString() : ''} + ${Number(price).toLocaleString()}원 + × + + `; + serviceList.appendChild(li); + }); + } + document.getElementById('total-price').textContent = totalprice.toLocaleString() + '원'; + + // 시술 개수 및 삭제 버튼 상태 업데이트 + updateServiceCount(); + } else { + modalEvent.danger("조회 오류", data.msgDesc); + } + + var date = new Date(); + if (String(new Date()).split(" ") == "Sun") { + date = new Date(); + date.setDate(date.getDate() + 1); + } + }, + error: function (xhr, status, error) { + modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오."); + }, + beforeSend: function () { + $(".loading-image-layer").show(); + }, + complete: function () { + $(".loading-image-layer").hide(); + } + }); } +function onClickTime(selectedDate, time, el) { + document.querySelectorAll('.time-btn').forEach(btn => btn.classList.remove('active')); + if (el) el.classList.add('active'); -/* 버튼 클릭했는지 안했는지 확인 class active */ -var $selectProcedureDiv = $('.select_procedure_div'); -$selectProcedureDiv.click(function(e){ - e.stopPropagation(); - $selectProcedureDiv.not(this).removeClass('active'); /*remove buttonactive from the others*/ - $(this).toggleClass('active'); /*toggle current clicked element*/ -}); + let formData = new FormData(); + formData.append('SELECTED_DATE', selectedDate.toString().substr(0, 4) + '-' + selectedDate.toString().substr(4, 2) + '-' + selectedDate.toString().substr(6, 2)); + formData.append('TIME', time); -$(window).on("click", function(){ - $selectProcedureDiv.removeClass('active'); -}) + res_date = selectedDate.toString().substr(0, 4) + '-' + selectedDate.toString().substr(4, 2) + '-' + selectedDate.toString().substr(6, 2); + res_time = time; + $.ajax({ + url: encodeURI('/webservice/selectReservationCnt.do'), + data: formData, + dataType: 'json', + processData: false, + contentType: false, + type: 'POST', + async: true, + success: function (data) { + if (data.msgCode == '0') { + if (data.rows && data.rows.RES_CNT !== undefined) { + personCount.textContent = data.rows.RES_CNT; + } else { + personCount.textContent = '-'; + } + } else { + modalEvent.danger("조회 오류", data.msgDesc); + } + }, + error: function (xhr, status, error) { + modalEvent.danger("조회 오류", "조회 중 오류가 발생하였습니다. 잠시후 다시시도하십시오."); + }, + beforeSend: function () { + $(".loading-image-layer").show(); + }, + complete: function () { + $(".loading-image-layer").hide(); + } + }); +} -//초기화 -fn_init(); \ No newline at end of file +$(document).ready(function () { + // Flatpickr 초기화 + initFlatpickr(); + + // common.js의 PhoneValidator 초기화 + try { + if (typeof PhoneValidator !== 'undefined' && PhoneValidator.init) { + console.log('Initializing PhoneValidator from common.js'); + PhoneValidator.init('customer-phone', { + showMessage: true, + realTimeValidation: true, + maxLength: 11, + allowedPrefixes: ['010', '011', '016', '017', '018', '019'], + onValidationChange: function (result, phoneNumber) { + // PhoneValidator 상태 변경 시 checkForm 호출 + setTimeout(checkForm, 10); + } + }); + } else { + console.warn('PhoneValidator not found in common.js'); + } + } catch (e) { + console.error('PhoneValidator initialization error:', e); + } + + // BirthDateValidator 초기화 + try { + console.log('Initializing BirthDateValidator'); + birthDateValidator = new BirthDateValidator('birthDate', { + showMessage: true, + realTimeValidation: true, + minAge: 0, + maxAge: 150, + format: 'YYYYMMDD', + allowFuture: false, + onValidationChange: function (result, birthDate) { + // BirthDateValidator 상태 변경 시 checkForm 호출 + setTimeout(checkForm, 10); + } + }); + console.log('BirthDateValidator initialized successfully'); + } catch (e) { + console.error('BirthDateValidator initialization error:', e); + } + + // PhoneValidator와 BirthDateValidator 이벤트 감지 (fallback 및 보완) + $('#customer-phone').on('input keyup blur paste', function () { + setTimeout(checkForm, 50); + }); + + $('#birthDate').on('input keyup blur paste', function () { + setTimeout(checkForm, 50); + }); + + // 초기 폼 상태 체크 + setTimeout(() => { + checkForm(); + updateServiceCount(); // 초기 시술 개수 상태 설정 + getHolidayList(); // 휴일 정보 가져오기 + }, 300); // Validator들 초기화 완료 대기 +}); \ No newline at end of file diff --git a/src/main/resources/templates/web/service/makeReservation.html b/src/main/resources/templates/web/service/makeReservation.html index e1856a4..c707f00 100644 --- a/src/main/resources/templates/web/service/makeReservation.html +++ b/src/main/resources/templates/web/service/makeReservation.html @@ -1,938 +1,99 @@ - + - + - + + + + + + -
    - -
    -
    STEP 01. 시술 예약
    -
    선택된 시술: 1개
    -
    -
    - 다이어트약처방 - - 50,000원 - 50,000원 - × - -
    -
    -
    - 총 금액 (부가세 별도) - 50,000원 -
    -
    결제는 내원시 이루어집니다.
    -
    +
    + +
    +
    STEP 01. 예약
    +
    선택된 시술: 1개
    +
    +
    + 다이어트약처방 + + 50,000원 + 50,000원 + × + +
    +
    +
    + 총 금액 (부가세 별도) + 50,000원 +
    +
    결제는 내원시 이루어집니다.
    +
    - -
    -
    STEP 02. 예약 시간 선택
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - -
    + +
    +
    STEP 02. 예약 시간 선택
    +
    + +
    +
    +
    + +
    + +
    - -
    -
    STEP 03. 고객정보
    -
    -
    - - -
    -
    - - - -
    -
    - - - -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    + +
    +
    STEP 03. 고객정보
    +
    +
    + + +
    +
    + + + +
    +
    + + + +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    - + - + + \ No newline at end of file diff --git a/src/main/resources/templates/web/webevent/makeReservation.html b/src/main/resources/templates/web/webevent/makeReservation.html deleted file mode 100644 index 28888f7..0000000 --- a/src/main/resources/templates/web/webevent/makeReservation.html +++ /dev/null @@ -1,938 +0,0 @@ - - - - - - - - - - - - -
    - -
    -
    STEP 01. 이벤트 예약
    -
    선택된 시술: 1개
    -
    -
    - 다이어트약처방 - - 50,000원 - 50,000원 - × - -
    -
    -
    - 총 금액 (부가세 별도) - 50,000원 -
    -
    결제는 내원시 이루어집니다.
    -
    - - -
    -
    STEP 02. 예약 시간 선택
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - -
    - - -
    -
    STEP 03. 고객정보
    -
    -
    - - -
    -
    - - - -
    -
    - - - -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    -
    - - - - -