diff --git a/.classpath b/.classpath index 14ae952..717c1fa 100644 --- a/.classpath +++ b/.classpath @@ -1,9 +1,10 @@ - + - - + + + @@ -12,11 +13,10 @@ - + - - - + + diff --git a/.gitignore b/.gitignore index 38fcbdf..25f9002 100644 --- a/.gitignore +++ b/.gitignore @@ -55,5 +55,15 @@ Thumbs.db # gradle-wrapper.jar를 제외 목록에서 제거하거나 # 다음 라인을 추가하여 명시적으로 포함 !gradle/wrapper/gradle-wrapper.jar -build_log.txt -gradle.properties +.classpath +.settings/org.eclipse.buildship.core.prefs +.settings/org.eclipse.jdt.core.prefs +.settings/org.eclipse.jdt.core.prefs +.settings/org.eclipse.buildship.core.prefs +.classpath + +# Wiki repo (별도 git 리포) +.wiki/ + +# Agent workflows +.agent/ diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index bcf33c3..30a04fc 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,15 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=ignore org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=javax.annotation.Nonnull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=javax.annotation.ParametersAreNonnullByDefault org.eclipse.jdt.core.compiler.annotation.nullable=javax.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled +org.eclipse.jdt.core.compiler.source=21 diff --git a/.vscode/launch.json b/.vscode/launch.json index 5bfae59..77e348a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,6 +9,16 @@ "projectName": "madeu", "args": "", "envFile": "${workspaceFolder}/.env" + }, + { + "type": "java", + "name": "Spring Boot-MadeuApplication", + "request": "launch", + "cwd": "${workspaceFolder}", + "mainClass": "com.madeu.MadeuApplication", + "projectName": "madeu_crm", + "args": "", + "envFile": "${workspaceFolder}/.env" } ] } \ No newline at end of file diff --git a/sql/MU_CTI_LOG_DDL.sql b/sql/MU_CTI_LOG_DDL.sql new file mode 100644 index 0000000..4402684 --- /dev/null +++ b/sql/MU_CTI_LOG_DDL.sql @@ -0,0 +1,54 @@ +-- ============================================ +-- CTI 통화 로그 테이블 (MariaDB) +-- ============================================ + +-- CTI 통화 로그 메인 테이블 +CREATE TABLE IF NOT EXISTS MU_CTI_LOG ( + MU_CTI_LOG_ID VARCHAR(20) NOT NULL COMMENT 'CTI 로그 ID (PK)', + RECORD_NO VARCHAR(50) NULL COMMENT 'CTI 레코드 번호', + CID VARCHAR(20) NULL COMMENT '발신자 전화번호', + FULLDNIS VARCHAR(20) NULL COMMENT '매장 수신번호 (ARS 대표번호)', + BOUND VARCHAR(10) NULL COMMENT '통화방향 (IN/OUT)', + MENU_NO VARCHAR(10) NULL COMMENT 'ARS 메뉴 번호', + STATE_TYPE VARCHAR(20) NULL COMMENT '상태유형 (start/ringout/link/callback/lms/local)', + CTI_STEP VARCHAR(5) NULL COMMENT '통화단계 (1=수신, 2=ring, 3=link, 4=linkend, 5=bend, 98=callback)', + LOGINCID VARCHAR(20) NULL COMMENT '상담원 전화번호', + C_TYPE1 VARCHAR(20) NULL COMMENT '구분2 (초진/재진)', + C_TYPE2 VARCHAR(20) NULL COMMENT '구분3 (상담/상담후예약/회차예약)', + CRM_MB_PID VARCHAR(20) NULL COMMENT 'CRM 회원 PID', + STORE_PID VARCHAR(20) NULL COMMENT '매장 PID', + INCALL_SEL VARCHAR(500) NULL COMMENT 'In Call 선택값 (파이프 구분)', + CALL_BACK_CHK CHAR(1) NULL DEFAULT 'N' COMMENT '콜백 확인 여부 (Y/N)', + USE_YN CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '사용여부', + CUD_FLAG CHAR(1) NULL DEFAULT 'C' COMMENT 'CUD 플래그', + REG_ID VARCHAR(20) NULL COMMENT '등록자 ID', + REG_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시', + MOD_ID VARCHAR(20) NULL COMMENT '수정자 ID', + MOD_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시', + PRIMARY KEY (MU_CTI_LOG_ID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CTI 통화 로그'; + +-- 인덱스 +CREATE INDEX IDX_MU_CTI_LOG_RECORD_NO ON MU_CTI_LOG (RECORD_NO); +CREATE INDEX IDX_MU_CTI_LOG_REG_DATE ON MU_CTI_LOG (REG_DATE); +CREATE INDEX IDX_MU_CTI_LOG_CID ON MU_CTI_LOG (CID); +CREATE INDEX IDX_MU_CTI_LOG_FULLDNIS ON MU_CTI_LOG (FULLDNIS); +CREATE INDEX IDX_MU_CTI_LOG_STORE_PID ON MU_CTI_LOG (STORE_PID); + + +-- CTI 통화 메모 테이블 +CREATE TABLE IF NOT EXISTS MU_CTI_TEXT ( + MU_CTI_TEXT_ID VARCHAR(20) NOT NULL COMMENT 'CTI 메모 ID (PK)', + RECORD_NO VARCHAR(50) NULL COMMENT 'CTI 레코드 번호', + CALL_MSG TEXT NULL COMMENT '통화 메모 내용', + USE_YN CHAR(1) NOT NULL DEFAULT 'Y' COMMENT '사용여부', + CUD_FLAG CHAR(1) NULL DEFAULT 'C' COMMENT 'CUD 플래그', + REG_ID VARCHAR(20) NULL COMMENT '등록자 ID', + REG_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록일시', + MOD_ID VARCHAR(20) NULL COMMENT '수정자 ID', + MOD_DATE DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일시', + PRIMARY KEY (MU_CTI_TEXT_ID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='CTI 통화 메모'; + +-- 인덱스 +CREATE INDEX IDX_MU_CTI_TEXT_RECORD_NO ON MU_CTI_TEXT (RECORD_NO); diff --git a/src/main/java/com/madeu/batch/InsertPublicHolidayBatchExcute.java b/src/main/java/com/madeu/batch/InsertPublicHolidayBatchExcute.java index 22e09da..1904a87 100644 --- a/src/main/java/com/madeu/batch/InsertPublicHolidayBatchExcute.java +++ b/src/main/java/com/madeu/batch/InsertPublicHolidayBatchExcute.java @@ -25,6 +25,7 @@ import javax.xml.xpath.XPathFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -33,75 +34,99 @@ import org.xml.sax.SAXException; import com.madeu.dao.web.webpublicholiday.WebPublicHolidaySqlMapDAO; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; + import lombok.extern.slf4j.Slf4j; @Slf4j @Component public class InsertPublicHolidayBatchExcute { - - @Autowired + + @Autowired private WebPublicHolidaySqlMapDAO webPublicHolidaySqlMapDAO; - - // 21~22년 (공공 api 조회 가능 연도가 내년꺼까지만 가능.) https://www.data.go.kr/dataset/15012690/openapi.do + + /** + * [임시 실행용] 서버 시작(또는 리로드) 시 배치를 즉시 1회 실행합니다. + * 실행이 완료된 후에는 다시 주석 처리하거나 삭제하세요. + */ + // @EventListener(ContextRefreshedEvent.class) + public void forceRunBatch() { + log.info("============================================================================"); + log.info("============== [FORCE START] Public Holiday Batch Execution =============="); + log.info("============================================================================"); + try { + go(); + } catch (Exception e) { + log.error("Force Batch Error", e); + } + log.info("============================================================================"); + log.info("============== [FORCE END] Public Holiday Batch Execution ================"); + log.info("============================================================================"); + } + + // 21~22년 (공공 api 조회 가능 연도가 내년꺼까지만 가능.) + // https://www.data.go.kr/dataset/15012690/openapi.do @Scheduled(cron = "0 0 03 1 * ?") // 매월 1일 03:00 -// @Scheduled(cron = "0 0/1 * * * ?") + // @Scheduled(cron = "0 0/1 * * * ?") + @Transactional public void go() { log.debug("InsertPublicHolidayBatchExcute - run start"); List> publicHolidayList = new ArrayList>(); - + Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); - - for (int i = year; i <= year+1; i++) { + + for (int i = year; i <= year + 1; i++) { // 공휴일을 가져온다 - for(int j=1; j<=12; j++) { + for (int j = 1; j <= 12; j++) { int month = j; - - if(i==year) { - month = c.get(Calendar.MONTH)+j; + + if (i == year) { + month = c.get(Calendar.MONTH) + j; } - - if(12 < month) { - - }else { + + if (12 < month) { + + } else { String yearString = String.valueOf(i); String monthString = String.valueOf(month); - - if(10 > month) { - //한자리수일시 01, 02같이 0을 필요로함, request param이 2자리수 + + if (10 > month) { + // 한자리수일시 01, 02같이 0을 필요로함, request param이 2자리수 monthString = "0" + monthString; } - - List> listTemp = getPublicHolidayMap(yearString, monthString); - log.debug(yearString+"년 "+monthString+"월 결과 : " + listTemp); - + + List> listTemp = getPublicHolidayMap(yearString, monthString); + log.debug(yearString + "년 " + monthString + "월 결과 : " + listTemp); + publicHolidayList.addAll(listTemp); } } log.debug(i + "년의 totalPublicHolidayCount : " + publicHolidayList.size()); - //logger.debug("publicHolidayList : " + publicHolidayList); + // logger.debug("publicHolidayList : " + publicHolidayList); } - + int insertedCount = 0; - - for(int i=0; i publicHolidayParamMap = publicHolidayList.get(i); StringBuffer sbTemp = new StringBuffer(String.valueOf(publicHolidayParamMap.get("locdate"))); sbTemp.insert(6, "-"); sbTemp.insert(4, "-"); - + String dateName = publicHolidayParamMap.get("dateName").toString().replaceAll(" ", ""); publicHolidayParamMap.put("dateName", dateName); publicHolidayParamMap.put("locDate", sbTemp.toString()); - - List> listMapTemp = webPublicHolidaySqlMapDAO.selectListPublicHolidayDate(publicHolidayParamMap); - + + List> listMapTemp = webPublicHolidaySqlMapDAO + .selectListPublicHolidayDate(publicHolidayParamMap); + // 존재하는 공휴일일 경우 - if(1 <= listMapTemp.size()) { - - } - else{ + if (1 <= listMapTemp.size()) { + + } else { String muPublicHolidayId = ("PH").concat(String.valueOf(System.currentTimeMillis())); publicHolidayParamMap.put("muPublicHolidayId", muPublicHolidayId); publicHolidayParamMap.put("regId", "BATCH_SYSTEM"); @@ -111,58 +136,61 @@ public class InsertPublicHolidayBatchExcute { insertedCount++; } } - + log.debug("InsertPublicHolidayBatchExcute - " + insertedCount + " record inserted"); - + log.debug("InsertPublicHolidayBatchExcute - run end"); } - + // 해당 년/월의 공휴일을 가져오는 메서드 public List> getPublicHolidayMap(String year, String month) { - List> holidayList = new ArrayList>(); - + List> holidayList = new ArrayList>(); + log.debug("InsertPublicHolidayBatchExcute getPublicHolidayMap START"); - + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder; Document doc = null; - - String addr = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService"; - String query = "/getRestDeInfo?"; - + + String addr = "https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService"; + String query = "/getRestDeInfo?"; + StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(addr); stringBuffer.append(query); - stringBuffer.append("ServiceKey=" + "IMP1dVPnFLL2UYlH8yyENSeLeS5UMLYxnaomTs5L2IHp8qnyd%2FzApTGcCUV9%2FD76wZQzD24HegGoNFotIoh9GA%3D%3D"); + stringBuffer.append("ServiceKey=" + + "bd37daa85809e0f1ef330722c6b92dd8ebbe7226a63be7644d9f334662996e7c"); stringBuffer.append("&solYear=" + year); stringBuffer.append("&solMonth=" + month); - - log.debug("stringBuffer.toString() "+ stringBuffer.toString()); - + + log.debug("stringBuffer.toString() " + stringBuffer.toString()); + try { URL url = new URL(stringBuffer.toString()); - + URLConnection conn = url.openConnection(); - + BufferedReader rd = null; - - rd = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); + + rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuffer result = new StringBuffer(); - + String line; - - while((line=rd.readLine())!=null){ + + while ((line = rd.readLine()) != null) { result.append(line.trim()); } - + // xml 리절트 출력부분 - /*if(0 paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - - try{ - if(!webCheckLogin(session)){ + + try { + if (!webCheckLogin(session)) { return "/web/login/logout"; - } - else { + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = webHospitalService.selectHospitalIntro(paramMap); - + model.addAttribute("selectUseYn", map.get("selectUseYn")); model.addAttribute("insertUseYn", map.get("insertUseYn")); model.addAttribute("updateUseYn", map.get("updateUseYn")); model.addAttribute("deleteUseYn", map.get("deleteUseYn")); model.addAttribute("downloadUseYn", map.get("downloadUseYn")); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return "/web/login/logout"; } log.debug("WebHospitalController selectHospitalIntro END"); return "/web/hospital/hospitalUpdate"; } - + /** * 병원 정보 상세 조회 * * @param request - * @param response + * @param response * @return */ - @RequestMapping(value="/webhospital/selectHospital.do") - public ModelAndView selectHospital(HttpSession session,HttpServletRequest request, HttpServletResponse response) { - + @RequestMapping(value = "/webhospital/selectHospital.do") + public ModelAndView selectHospital(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + log.debug("WebHospitalController selectHospital START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - - try{ - if(!webCheckLogin(session)){ + + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = webHospitalService.selectHospital(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } } @@ -120,91 +114,125 @@ public class WebHospitalController extends ManagerDraftAction{ * @param response * @return */ - @RequestMapping(value="/webhospital/selectWorkTime.do") - public ModelAndView selectWorkTime(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + @RequestMapping(value = "/webhospital/selectWorkTime.do") + public ModelAndView selectWorkTime(HttpSession session, HttpServletRequest request, HttpServletResponse response) { log.debug("WebHospitalController selectWorkTime START"); HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = webHospitalService.selectWorkTime(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } } log.debug("WebHospitalController selectWorkTime END"); return HttpUtil.makeHashToJsonModelAndView(map); } - + + /** + * 병원 휴일 정보 조회 (달력 표출용) + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/webhospital/selectHospitalHolidayList.do") + public ModelAndView selectHospitalHolidayList(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("WebHospitalController selectHospitalHolidayList START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + map = webHospitalService.selectHospitalHolidayList(paramMap); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + if (Constants.OK == map.get("msgCode")) { + + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + + log.debug("WebHospitalController selectHospitalHolidayList END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + /** * 병원 정보 수정 * * @param request - * @param response + * @param response * @return */ - @RequestMapping(value="/webhospital/updateHospital.do") - public ModelAndView updateHospital(HttpSession session,HttpServletRequest request, HttpServletResponse response, MultipartHttpServletRequest file) { - + @RequestMapping(value = "/webhospital/updateHospital.do") + public ModelAndView updateHospital(HttpSession session, HttpServletRequest request, HttpServletResponse response, + MultipartHttpServletRequest file) { + log.debug("WebHospitalController updateHospital START"); - + HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - try{ - if(!webCheckLogin(session)){ + + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("regId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); map = webHospitalService.updateHospital(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } - + try { HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); HashMap insertMap = new HashMap(); - + insertMap.put("url", "/webhospital/updateHospital.do"); insertMap.put("func", "updateHospital"); insertMap.put("funcName", "병원 수정"); @@ -213,22 +241,192 @@ public class WebHospitalController extends ManagerDraftAction{ insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); insertMap.put("tId", map.get("tId")); - if((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) || String.valueOf(errorMsg).length() == 0){ + if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) + || String.valueOf(errorMsg).length() == 0) { insertMap.put("resultCode", "SUCCESS"); - } - else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); insertMap.put("muMemberId", paramMap.get("loginMemberId")); - + webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } log.debug("WebHospitalController updateHospital END"); return HttpUtil.makeHashToJsonModelAndView(map); } + + /** + * 병원 스케줄 상세 조회 + */ + @RequestMapping(value = "/webhospital/selectHospitalScheduleDetail.do") + public ModelAndView selectHospitalScheduleDetail(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("WebHospitalController selectHospitalScheduleDetail START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + map = webHospitalService.selectHospitalScheduleDetail(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("WebHospitalController selectHospitalScheduleDetail END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 병원 스케줄 저장 + */ + @RequestMapping(value = "/webhospital/saveHospitalSchedule.do") + public ModelAndView saveHospitalSchedule(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("WebHospitalController saveHospitalSchedule START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("regId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); + map = webHospitalService.saveHospitalSchedule(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("WebHospitalController saveHospitalSchedule END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 병원 스케줄 삭제 + */ + @RequestMapping(value = "/webhospital/deleteHospitalSchedule.do") + public ModelAndView deleteHospitalSchedule(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("WebHospitalController deleteHospitalSchedule START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); + map = webHospitalService.deleteHospitalSchedule(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("WebHospitalController deleteHospitalSchedule END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 병원 지정 휴일 개별 저장 (insert or update) + */ + @RequestMapping(value = "/webhospital/saveHospitalHoliday.do") + public ModelAndView saveHospitalHoliday(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("WebHospitalController saveHospitalHoliday START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("regId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); + map = webHospitalService.saveHospitalHoliday(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("WebHospitalController saveHospitalHoliday END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 병원 지정 휴일 선택 삭제 (체크된 row 일괄 삭제) + */ + @RequestMapping(value = "/webhospital/deleteHospitalHolidays.do") + public ModelAndView deleteHospitalHolidays(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("WebHospitalController deleteHospitalHolidays START"); + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); + map = webHospitalService.deleteHospitalHolidays(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("WebHospitalController deleteHospitalHolidays END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } } diff --git a/src/main/java/com/madeu/crm/callLog/ctrl/CallLogController.java b/src/main/java/com/madeu/crm/callLog/ctrl/CallLogController.java new file mode 100644 index 0000000..602b79a --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/ctrl/CallLogController.java @@ -0,0 +1,215 @@ +package com.madeu.crm.callLog.ctrl; + +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.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.madeu.constants.Constants; +import com.madeu.crm.callLog.dto.CallLogSearchDTO; +import com.madeu.crm.callLog.dto.CallMemoDTO; +import com.madeu.crm.callLog.service.CallLogService; +import com.madeu.crm.callLog.service.GoodArsService; +import com.madeu.init.ManagerDraftAction; +import com.madeu.util.HttpUtil; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Controller +@RequestMapping("/callLog") +public class CallLogController extends ManagerDraftAction { + + @Autowired + private CallLogService callLogService; + + @Autowired + private GoodArsService goodArsService; + + /** + * 통화 로그 관리 화면으로 이동 + */ + @RequestMapping("/moveCallLogList.do") + public String moveCallLogList(HttpSession session, HttpServletRequest request, HttpServletResponse response, + Model model) { + log.debug("CallLogController moveCallLogList START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = null; + + try { + if (!webCheckLogin(session)) { + return "/web/login/logout"; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + map = callLogService.moveCallLogList(paramMap); + model.addAttribute("selectUseYn", map.get("selectUseYn")); + model.addAttribute("insertUseYn", map.get("insertUseYn")); + model.addAttribute("updateUseYn", map.get("updateUseYn")); + model.addAttribute("deleteUseYn", map.get("deleteUseYn")); + model.addAttribute("downloadUseYn", map.get("downloadUseYn")); + } + } catch (Exception e) { + e.printStackTrace(); + return "/web/login/logout"; + } + log.debug("CallLogController moveCallLogList END"); + + return "/web/callLog/callLogSelectList"; + } + + /** + * 통화 로그 목록 조회 (통계 포함) + */ + @PostMapping("/getCallLogList.do") + public ModelAndView getCallLogList(HttpSession session, HttpServletRequest request, + HttpServletResponse response, CallLogSearchDTO searchDTO) { + log.debug("CallLogController getCallLogList START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + searchDTO.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = callLogService.getCallLogList(searchDTO); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "서버 오류가 발생했습니다."); + } 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("CallLogController getCallLogList END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 통화 메모 저장 + */ + @PostMapping("/saveCallMemo.do") + public ModelAndView saveCallMemo(HttpSession session, HttpServletRequest request, + HttpServletResponse response, CallMemoDTO memoDTO) { + log.debug("CallLogController saveCallMemo START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + memoDTO.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = callLogService.saveCallMemo(memoDTO); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "메모 저장 중 오류가 발생하였습니다."); + } + log.debug("CallLogController saveCallMemo END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 전화 걸기 (아웃바운드) + */ + @PostMapping("/makeOutboundCall.do") + public ModelAndView makeOutboundCall(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("CallLogController makeOutboundCall START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + String loginCid = String.valueOf(paramMap.get("loginCid")); + String sendCid = String.valueOf(paramMap.get("sendCid")); + String userCid = String.valueOf(paramMap.get("userCid")); + + map = goodArsService.makeOutboundCall(loginCid, sendCid, userCid); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("success", false); + map.put("msgDesc", "전화 발신 중 오류가 발생하였습니다."); + } + log.debug("CallLogController makeOutboundCall END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 전화 돌려주기 (Push) + */ + @PostMapping("/pushCall.do") + public ModelAndView pushCall(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("CallLogController pushCall START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + String loginCid = String.valueOf(paramMap.get("loginCid")); + String pushCid = String.valueOf(paramMap.get("pushCid")); + + map = goodArsService.pushCall(loginCid, pushCid); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("success", false); + map.put("msgDesc", "전화 연결 중 오류가 발생하였습니다."); + } + log.debug("CallLogController pushCall END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 녹음 파일 URL 조회 + */ + @PostMapping("/getRecordFileUrl.do") + public ModelAndView getRecordFileUrl(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + log.debug("CallLogController getRecordFileUrl START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + String recordNo = String.valueOf(paramMap.get("recordNo")); + String url = goodArsService.getRecordFileUrl(recordNo); + map.put("success", true); + map.put("recordUrl", url); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("success", false); + map.put("msgDesc", "녹음 파일 조회 중 오류가 발생하였습니다."); + } + log.debug("CallLogController getRecordFileUrl END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeu/crm/callLog/ctrl/CtiWebhookController.java b/src/main/java/com/madeu/crm/callLog/ctrl/CtiWebhookController.java new file mode 100644 index 0000000..9feb3b9 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/ctrl/CtiWebhookController.java @@ -0,0 +1,199 @@ +package com.madeu.crm.callLog.ctrl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.madeu.crm.callLog.dto.CallLogDTO; +import com.madeu.crm.callLog.service.CallLogService; + +import lombok.extern.slf4j.Slf4j; + +/** + * GoodARS Webhook 수신 Controller + * + * ARS 서버에서 통화 단계별로 이 엔드포인트를 호출하여 통화 로그를 저장합니다. + * 인증 없이(public) 접근 가능해야 합니다. + * + * 통화 흐름: + * step01 (수신) → step02 (ARS 메뉴 선택) → step03 (통화 연결) + * → step04 (통화 종료) → step05 (기타 종료) + * callback (콜백 요청) + */ +@Slf4j +@RestController +@RequestMapping("/api/cti/webhook") +public class CtiWebhookController { + + @Autowired + private CallLogService callLogService; + + /** + * Step 01 - 전화 수신 (통화 시작) + */ + @PostMapping("/step01") + public String step01( + @RequestParam(value = "FULLDNIS", required = false, defaultValue = "") String fulldnis, + @RequestParam(value = "CID", required = false, defaultValue = "") String cid, + @RequestParam(value = "MENU_NO", required = false, defaultValue = "") String menuNo, + @RequestParam(value = "LOGINCID", required = false, defaultValue = "") String logincid, + @RequestParam(value = "RECORD_NO", required = false, defaultValue = "") String recordNo, + @RequestParam(value = "BOUND", required = false, defaultValue = "") String bound, + @RequestParam(value = "STATE_TYPE", required = false, defaultValue = "") String stateType) { + + log.debug("CtiWebhook step01 - RECORD_NO:{}, CID:{}, FULLDNIS:{}", recordNo, cid, fulldnis); + + try { + CallLogDTO logDTO = buildLogDTO(fulldnis, cid, menuNo, logincid, recordNo, bound, stateType, "1"); + callLogService.putCtiLog(logDTO); + return "success"; + } catch (Exception e) { + log.error("CtiWebhook step01 error", e); + return "fail"; + } + } + + /** + * Step 02 - ARS 메뉴 선택 (Ring) + */ + @PostMapping("/step02") + public String step02( + @RequestParam(value = "FULLDNIS", required = false, defaultValue = "") String fulldnis, + @RequestParam(value = "CID", required = false, defaultValue = "") String cid, + @RequestParam(value = "MENU_NO", required = false, defaultValue = "") String menuNo, + @RequestParam(value = "LOGINCID", required = false, defaultValue = "") String logincid, + @RequestParam(value = "RECORD_NO", required = false, defaultValue = "") String recordNo, + @RequestParam(value = "BOUND", required = false, defaultValue = "") String bound, + @RequestParam(value = "STATE_TYPE", required = false, defaultValue = "") String stateType) { + + log.debug("CtiWebhook step02 - RECORD_NO:{}, MENU_NO:{}", recordNo, menuNo); + + try { + CallLogDTO logDTO = buildLogDTO(fulldnis, cid, menuNo, logincid, recordNo, bound, stateType, "2"); + callLogService.putCtiLog(logDTO); + return "success"; + } catch (Exception e) { + log.error("CtiWebhook step02 error", e); + return "fail"; + } + } + + /** + * Step 03 - 통화 연결 (Link) + */ + @PostMapping("/step03") + public String step03( + @RequestParam(value = "FULLDNIS", required = false, defaultValue = "") String fulldnis, + @RequestParam(value = "CID", required = false, defaultValue = "") String cid, + @RequestParam(value = "MENU_NO", required = false, defaultValue = "") String menuNo, + @RequestParam(value = "LOGINCID", required = false, defaultValue = "") String logincid, + @RequestParam(value = "RECORD_NO", required = false, defaultValue = "") String recordNo, + @RequestParam(value = "BOUND", required = false, defaultValue = "") String bound, + @RequestParam(value = "STATE_TYPE", required = false, defaultValue = "") String stateType) { + + log.debug("CtiWebhook step03 - RECORD_NO:{}, LOGINCID:{}", recordNo, logincid); + + try { + CallLogDTO logDTO = buildLogDTO(fulldnis, cid, menuNo, logincid, recordNo, bound, stateType, "3"); + callLogService.putCtiLog(logDTO); + return "success"; + } catch (Exception e) { + log.error("CtiWebhook step03 error", e); + return "fail"; + } + } + + /** + * Step 04 - 통화 종료 (Link End) + */ + @PostMapping("/step04") + public String step04( + @RequestParam(value = "FULLDNIS", required = false, defaultValue = "") String fulldnis, + @RequestParam(value = "CID", required = false, defaultValue = "") String cid, + @RequestParam(value = "MENU_NO", required = false, defaultValue = "") String menuNo, + @RequestParam(value = "LOGINCID", required = false, defaultValue = "") String logincid, + @RequestParam(value = "RECORD_NO", required = false, defaultValue = "") String recordNo, + @RequestParam(value = "BOUND", required = false, defaultValue = "") String bound, + @RequestParam(value = "STATE_TYPE", required = false, defaultValue = "") String stateType) { + + log.debug("CtiWebhook step04 - RECORD_NO:{}", recordNo); + + try { + CallLogDTO logDTO = buildLogDTO(fulldnis, cid, menuNo, logincid, recordNo, bound, stateType, "4"); + callLogService.putCtiLog(logDTO); + return "success"; + } catch (Exception e) { + log.error("CtiWebhook step04 error", e); + return "fail"; + } + } + + /** + * Step 05 - 기타 종료 (Bend) + */ + @PostMapping("/step05") + public String step05( + @RequestParam(value = "FULLDNIS", required = false, defaultValue = "") String fulldnis, + @RequestParam(value = "CID", required = false, defaultValue = "") String cid, + @RequestParam(value = "MENU_NO", required = false, defaultValue = "") String menuNo, + @RequestParam(value = "LOGINCID", required = false, defaultValue = "") String logincid, + @RequestParam(value = "RECORD_NO", required = false, defaultValue = "") String recordNo, + @RequestParam(value = "BOUND", required = false, defaultValue = "") String bound, + @RequestParam(value = "STATE_TYPE", required = false, defaultValue = "") String stateType) { + + log.debug("CtiWebhook step05 - RECORD_NO:{}", recordNo); + + try { + CallLogDTO logDTO = buildLogDTO(fulldnis, cid, menuNo, logincid, recordNo, bound, stateType, "5"); + callLogService.putCtiLog(logDTO); + return "success"; + } catch (Exception e) { + log.error("CtiWebhook step05 error", e); + return "fail"; + } + } + + /** + * Callback - 콜백 요청 + */ + @PostMapping("/callback") + public String callback( + @RequestParam(value = "FULLDNIS", required = false, defaultValue = "") String fulldnis, + @RequestParam(value = "CID", required = false, defaultValue = "") String cid, + @RequestParam(value = "MENU_NO", required = false, defaultValue = "") String menuNo, + @RequestParam(value = "LOGINCID", required = false, defaultValue = "") String logincid, + @RequestParam(value = "RECORD_NO", required = false, defaultValue = "") String recordNo, + @RequestParam(value = "BOUND", required = false, defaultValue = "") String bound, + @RequestParam(value = "STATE_TYPE", required = false, defaultValue = "") String stateType) { + + log.debug("CtiWebhook callback - RECORD_NO:{}, CID:{}", recordNo, cid); + + try { + CallLogDTO logDTO = buildLogDTO(fulldnis, cid, menuNo, logincid, recordNo, bound, "callback", "98"); + callLogService.putCtiLog(logDTO); + return "success"; + } catch (Exception e) { + log.error("CtiWebhook callback error", e); + return "fail"; + } + } + + /** + * 공통 DTO 빌드 메서드 + */ + private CallLogDTO buildLogDTO(String fulldnis, String cid, String menuNo, String logincid, + String recordNo, String bound, String stateType, String ctiStep) { + CallLogDTO dto = new CallLogDTO(); + dto.setFulldnis(fulldnis); + dto.setCid(cid); + dto.setMenuNo(menuNo); + dto.setLogincid(logincid); + dto.setRecordNo(recordNo); + dto.setBound(bound); + dto.setStateType(stateType); + dto.setCtiStep(ctiStep); + return dto; + } +} diff --git a/src/main/java/com/madeu/crm/callLog/dto/CallLogDTO.java b/src/main/java/com/madeu/crm/callLog/dto/CallLogDTO.java new file mode 100644 index 0000000..659c598 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/dto/CallLogDTO.java @@ -0,0 +1,44 @@ +package com.madeu.crm.callLog.dto; + +import lombok.Data; + +/** + * 통화 로그 결과 DTO + */ +@Data +public class CallLogDTO { + /* ---- PK / 기본 필드 ---- */ + private String muCtiLogId; + private String recordNo; + private String cid; // 발신자 전화번호 + private String fulldnis; // 매장 수신번호 + private String bound; // IN/OUT + private String menuNo; // ARS 메뉴 번호 + private String stateType; // 상태유형 + private String ctiStep; // 통화단계 + private String logincid; // 상담원 전화번호 + private String cType1; // 초진/재진 + private String cType2; // 상담/상담후예약/회차예약 + private String crmMbPid; // CRM 회원 PID + private String storePid; // 매장 PID + private String incallSel; // In Call 선택값 + private String callBackChk; // 콜백 확인 여부 + private String useYn; + private String cudFlag; + private String regId; + private String regDate; + private String modId; + private String modDate; + + /* ---- 조인/서브쿼리 결과 필드 ---- */ + private String ring; // ARS 메뉴 선택 (step2) + private String linkDate; // 통화 연결 시각 (step3) + private String linkCid; // 통화 연결 상담원 (step3) + private String linkEndDate; // 통화 종료 시각 (step4) + private String bendDate; // 기타 종료 시각 (step5) + private String callbackCid; // 콜백 전화번호 (step98) + private String smsFlag; // SMS 전송 여부 + private String callMsg; // 통화 메모 + private String memberName; // 고객명 + private String rowNum; // 행 번호 +} diff --git a/src/main/java/com/madeu/crm/callLog/dto/CallLogSearchDTO.java b/src/main/java/com/madeu/crm/callLog/dto/CallLogSearchDTO.java new file mode 100644 index 0000000..25756c1 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/dto/CallLogSearchDTO.java @@ -0,0 +1,28 @@ +package com.madeu.crm.callLog.dto; + +import lombok.Data; + +/** + * 통화 로그 검색 조건 DTO + */ +@Data +public class CallLogSearchDTO { + /* ---- 검색 조건 ---- */ + private String sDate; // 검색 시작일 + private String eDate; // 검색 종료일 + private String callType; // 구분1 (ARS 메뉴: 1=상담, 2=예약, 3=위치안내, callback) + private String callType1; // 구분2 (초진/재진) + private String callType2; // 구분3 (상담/상담후예약/회차예약) + private String mCid; // 고객 전화번호 검색 + private String fulldnis; // 매장 수신번호 + private String incallSel; // In Call 선택값 필터 + + /* ---- 페이징 ---- */ + private Integer gridLimitStart; + private Integer gridLimitEnd; + private String gridSort; + + /* ---- 권한/세션 ---- */ + private String menuClass; + private String loginMemberId; +} diff --git a/src/main/java/com/madeu/crm/callLog/dto/CallLogStatsDTO.java b/src/main/java/com/madeu/crm/callLog/dto/CallLogStatsDTO.java new file mode 100644 index 0000000..e66c3a3 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/dto/CallLogStatsDTO.java @@ -0,0 +1,18 @@ +package com.madeu.crm.callLog.dto; + +import lombok.Data; + +/** + * 통화 로그 통계 DTO + */ +@Data +public class CallLogStatsDTO { + private int totalCnt; // 전체 건수 + private int inCnt; // IN 건수 + private int outCnt; // OUT 건수 + private int type1Cnt; // 초진 건수 + private int type2Cnt; // 재진 건수 + private int type11Cnt; // 상담 건수 + private int type12Cnt; // 상담후예약 건수 + private int type13Cnt; // 회차예약 건수 +} diff --git a/src/main/java/com/madeu/crm/callLog/dto/CallMemoDTO.java b/src/main/java/com/madeu/crm/callLog/dto/CallMemoDTO.java new file mode 100644 index 0000000..081a6ac --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/dto/CallMemoDTO.java @@ -0,0 +1,14 @@ +package com.madeu.crm.callLog.dto; + +import lombok.Data; + +/** + * 통화 메모 DTO + */ +@Data +public class CallMemoDTO { + private String muCtiTextId; + private String recordNo; + private String callMsg; + private String loginMemberId; +} diff --git a/src/main/java/com/madeu/crm/callLog/map/CallLogMAP.java b/src/main/java/com/madeu/crm/callLog/map/CallLogMAP.java new file mode 100644 index 0000000..5ea4571 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/map/CallLogMAP.java @@ -0,0 +1,38 @@ +package com.madeu.crm.callLog.map; + +import java.util.HashMap; +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + +import com.madeu.crm.callLog.dto.CallLogDTO; +import com.madeu.crm.callLog.dto.CallLogSearchDTO; +import com.madeu.crm.callLog.dto.CallLogStatsDTO; +import com.madeu.crm.callLog.dto.CallMemoDTO; + +@Mapper +public interface CallLogMAP { + // 통화 로그 목록 건수 조회 + int getCallLogCnt(CallLogSearchDTO searchDTO); + + // 통화 로그 목록 조회 + List getCallLogList(CallLogSearchDTO searchDTO); + + // 통화 로그 통계 집계 + CallLogStatsDTO getCallLogStats(CallLogSearchDTO searchDTO); + + // 통화 메모 존재 여부 확인 + int getCallMemoCnt(CallMemoDTO memoDTO); + + // 통화 메모 신규 저장 + int saveCallMemo(CallMemoDTO memoDTO); + + // 통화 메모 수정 + int modCallMemo(CallMemoDTO memoDTO); + + // CTI 로그 저장 (Webhook용) + int putCtiLog(CallLogDTO logDTO); + + // CTI 로그 회원 매핑 업데이트 + int modCtiLogMember(HashMap paramMap); +} diff --git a/src/main/java/com/madeu/crm/callLog/service/CallLogService.java b/src/main/java/com/madeu/crm/callLog/service/CallLogService.java new file mode 100644 index 0000000..3a4c874 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/service/CallLogService.java @@ -0,0 +1,134 @@ +package com.madeu.crm.callLog.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.madeu.common.service.MenuAuthService; +import com.madeu.constants.Constants; +import com.madeu.crm.callLog.dto.CallLogDTO; +import com.madeu.crm.callLog.dto.CallLogSearchDTO; +import com.madeu.crm.callLog.dto.CallLogStatsDTO; +import com.madeu.crm.callLog.dto.CallMemoDTO; +import com.madeu.crm.callLog.map.CallLogMAP; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class CallLogService { + + @Autowired + private CallLogMAP callLogMAP; + + @Autowired + private MenuAuthService menuAuthService; + + /** + * 통화 로그 화면 이동 + */ + public HashMap moveCallLogList(HashMap paramMap) throws Exception { + log.debug("moveCallLogList START"); + + HashMap map = menuAuthService.getMenuAuthority(paramMap); + + log.debug("loginMemberId : " + paramMap.get("loginMemberId")); + log.debug("menuClass : " + paramMap.get("menuClass")); + log.debug("moveCallLogList END"); + return map; + } + + /** + * 통화 로그 목록 조회 (통계 포함) + */ + public HashMap getCallLogList(CallLogSearchDTO searchDTO) throws Exception { + log.debug("getCallLogList START"); + + HashMap map = new HashMap<>(); + + List listMap = new ArrayList<>(); + + int totalCount = callLogMAP.getCallLogCnt(searchDTO); + + if (0 < totalCount) { + listMap = callLogMAP.getCallLogList(searchDTO); + } + + // 통계 집계 + CallLogStatsDTO stats = callLogMAP.getCallLogStats(searchDTO); + + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("totalCount", totalCount); + map.put("rows", listMap); + map.put("stats", stats); + + log.debug("getCallLogList END"); + return map; + } + + /** + * 통화 메모 저장 + */ + public HashMap saveCallMemo(CallMemoDTO memoDTO) throws Exception { + log.debug("saveCallMemo START"); + + HashMap map = new HashMap<>(); + + int existCnt = callLogMAP.getCallMemoCnt(memoDTO); + int result = 0; + + if (existCnt > 0) { + // 기존 메모 수정 + result = callLogMAP.modCallMemo(memoDTO); + } else { + // 신규 메모 등록 + result = callLogMAP.saveCallMemo(memoDTO); + } + + if (0 < result) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("msgDesc", "메모가 저장되었습니다."); + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", "false"); + map.put("msgDesc", "메모 저장에 실패하였습니다."); + } + + log.debug("saveCallMemo END"); + return map; + } + + /** + * CTI 로그 저장 (Webhook에서 호출) + */ + public HashMap putCtiLog(CallLogDTO logDTO) throws Exception { + log.debug("putCtiLog START"); + + HashMap map = new HashMap<>(); + + int result = callLogMAP.putCtiLog(logDTO); + + if (0 < result) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", "false"); + } + + log.debug("putCtiLog END"); + return map; + } + + /** + * CTI 로그 회원 매핑 + */ + public void updateCtiLogMember(HashMap paramMap) throws Exception { + callLogMAP.modCtiLogMember(paramMap); + } +} diff --git a/src/main/java/com/madeu/crm/callLog/service/GoodArsService.java b/src/main/java/com/madeu/crm/callLog/service/GoodArsService.java new file mode 100644 index 0000000..483d173 --- /dev/null +++ b/src/main/java/com/madeu/crm/callLog/service/GoodArsService.java @@ -0,0 +1,129 @@ +package com.madeu.crm.callLog.service; + +import java.util.HashMap; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import lombok.extern.slf4j.Slf4j; + +/** + * GoodARS CTI API 연동 서비스 + * + * 연동 서버: ars.goodars.co.kr + * 고객사 ID(CPID): application.properties에 설정 + */ +@Slf4j +@Service +public class GoodArsService { + + @Value("${goodars.cpid:5000036030017}") + private String arsCpid; + + @Value("${goodars.base-url:http://ars.goodars.co.kr/LINK/MADEU}") + private String arsBaseUrl; + + @Value("${goodars.base-url-ssl:https://ars.goodars.co.kr/LINK/MADEU}") + private String arsBaseUrlSsl; + + private final RestTemplate restTemplate = new RestTemplate(); + + /** + * 아웃바운드 전화 발신 + * + * @param loginCid 상담원 전화번호 (내선번호) + * @param sendCid 매장 대표번호 + * @param userCid 고객 전화번호 + * @return 성공 여부 ("SUCCESS" = 성공) + */ + public HashMap makeOutboundCall(String loginCid, String sendCid, String userCid) { + log.debug("makeOutboundCall START - loginCid:{}, sendCid:{}, userCid:{}", loginCid, sendCid, userCid); + + HashMap result = new HashMap<>(); + + try { + String url = UriComponentsBuilder.fromHttpUrl(arsBaseUrl + "/wid_outcall.asp") + .queryParam("CPID", arsCpid) + .queryParam("LOGINCID", loginCid) + .queryParam("SENDCID", sendCid) + .queryParam("USERCID", userCid.replaceAll("[^0-9]", "")) + .toUriString(); + + log.debug("makeOutboundCall URL: {}", url); + + String response = restTemplate.getForObject(url, String.class); + log.debug("makeOutboundCall response: {}", response); + + if ("SUCCESS".equals(response)) { + result.put("success", true); + result.put("msgDesc", "전화 발신 중입니다."); + } else { + result.put("success", false); + result.put("msgDesc", "전화 발신에 실패하였습니다. (" + response + ")"); + } + } catch (Exception e) { + log.error("makeOutboundCall error", e); + result.put("success", false); + result.put("msgDesc", "전화 발신 중 오류가 발생하였습니다."); + } + + log.debug("makeOutboundCall END"); + return result; + } + + /** + * 녹음 파일 URL 생성 + * + * @param recordNo CTI 레코드 번호 + * @return 녹음 파일 URL + */ + public String getRecordFileUrl(String recordNo) { + return UriComponentsBuilder.fromHttpUrl(arsBaseUrl + "/wid_file.asp") + .queryParam("CPID", arsCpid) + .queryParam("SN", recordNo) + .toUriString(); + } + + /** + * 전화 돌려주기 (Push) + * + * @param loginCid 상담원 전화번호 + * @param pushCid 전달받을 상담원 전화번호 + * @return 성공 여부 + */ + public HashMap pushCall(String loginCid, String pushCid) { + log.debug("pushCall START - loginCid:{}, pushCid:{}", loginCid, pushCid); + + HashMap result = new HashMap<>(); + + try { + String url = UriComponentsBuilder.fromHttpUrl(arsBaseUrlSsl + "/wid_push.asp") + .queryParam("CPID", arsCpid) + .queryParam("LOGINCID", loginCid) + .queryParam("PUSHCID", pushCid) + .toUriString(); + + log.debug("pushCall URL: {}", url); + + String response = restTemplate.getForObject(url, String.class); + log.debug("pushCall response: {}", response); + + if ("1".equals(response)) { + result.put("success", true); + result.put("msgDesc", "전화가 연결되었습니다."); + } else { + result.put("success", false); + result.put("msgDesc", "연결에 실패하였습니다."); + } + } catch (Exception e) { + log.error("pushCall error", e); + result.put("success", false); + result.put("msgDesc", "전화 연결 중 오류가 발생하였습니다."); + } + + log.debug("pushCall END"); + return result; + } +} diff --git a/src/main/java/com/madeu/crm/contentsBbs/ctrl/ContentsBbsController.java b/src/main/java/com/madeu/crm/contentsBbs/ctrl/ContentsBbsController.java index 8d849b5..3d74b30 100644 --- a/src/main/java/com/madeu/crm/contentsBbs/ctrl/ContentsBbsController.java +++ b/src/main/java/com/madeu/crm/contentsBbs/ctrl/ContentsBbsController.java @@ -39,17 +39,17 @@ public class ContentsBbsController extends ManagerDraftAction { * @return */ @PostMapping("/contentsBbs/moveContentsBbsList.do") - public String moveContentsBbsList(HttpSession session, HttpServletRequest request, HttpServletResponse response, Model model) { + public String moveContentsBbsList(HttpSession session, HttpServletRequest request, HttpServletResponse response, + Model model) { log.debug("WebTreatmentPetitController selectListWebTreatmentPetitIntro START"); HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return "/web/login/logout"; - } - else { + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.selectListWebTreatmentPetitIntro(paramMap); @@ -59,17 +59,15 @@ public class ContentsBbsController extends ManagerDraftAction { model.addAttribute("deleteUseYn", map.get("deleteUseYn")); model.addAttribute("downloadUseYn", map.get("downloadUseYn")); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return "/web/login/logout"; } log.debug("WebTreatmentPetitController selectListWebTreatmentPetitIntro END"); - - + model.addAttribute("categoryDivCd", getMenuToCdTitle(paramMap.get("menuClass")).get("cd")); model.addAttribute("title", getMenuToCdTitle(paramMap.get("menuClass")).get("title")); - + return "/web/contentsBbs/ContentsBbsSelectList"; } @@ -81,33 +79,30 @@ public class ContentsBbsController extends ManagerDraftAction { * @return */ @PostMapping("/contentsBbs/getContentsBbsList.do") - public ModelAndView getContentsBbsList(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + public ModelAndView getContentsBbsList(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.getContentsBbsList(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } } @@ -115,6 +110,44 @@ public class ContentsBbsController extends ManagerDraftAction { return HttpUtil.makeHashToJsonModelAndView(map); } + /** + * 카테고리 목록 조회 + * + * @param request + * @param response + * @return + */ + @PostMapping("/contentsBbs/getCategoryList.do") + public ModelAndView getCategoryList(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = new HashMap(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + map = contentsBbsService.getCategoryList(paramMap); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + if (Constants.OK == map.get("msgCode")) { + + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + } + log.debug("ContentsBbsController getCategoryList END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + /** * 홈페이지 시술예약(쁘띠) 정보 상세 조회 * @@ -123,41 +156,37 @@ public class ContentsBbsController extends ManagerDraftAction { * @return */ @PostMapping("/contentsBbs/getContentsBbs.do") - public ModelAndView getContentsBbs(HttpSession session,HttpServletRequest request, HttpServletResponse response) { + public ModelAndView getContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response) { log.debug("WebTreatmentPetitController selectWebTreatmentPetit START"); HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.getContentsBbs(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } } log.debug("WebTreatmentPetitController selectWebTreatmentPetit END"); return HttpUtil.makeHashToJsonModelAndView(map); } - + /** * 홈페이지 등록 화면으로 이동. * @@ -166,17 +195,17 @@ public class ContentsBbsController extends ManagerDraftAction { * @return */ @PostMapping("/contentsBbs/moveRegContentsBbs.do") - public String moveRegContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response, Model model) { + public String moveRegContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response, + Model model) { log.debug("ContentsBbsController moveRegContentsBbs START"); HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return "/web/login/logout"; - } - else { + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.insertWebTreatmentPetitIntro(paramMap); @@ -187,15 +216,14 @@ public class ContentsBbsController extends ManagerDraftAction { model.addAttribute("downloadUseYn", map.get("downloadUseYn")); model.addAttribute("categorylist", map.get("categorylist")); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return "/web/login/logout"; } log.debug("ContentsBbsController moveRegContentsBbs END"); - + model.addAttribute("title", getMenuToCdTitle(paramMap.get("menuClass")).get("title")); - + return "/web/contentsBbs/ContentsBbsReg"; } @@ -206,8 +234,10 @@ public class ContentsBbsController extends ManagerDraftAction { * @param response * @return */ - @PostMapping(value="/contentsBbs/putContentsBbs.do") - public ModelAndView putContentsBbs(HttpSession session,HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "file", required = false) MultipartFile file,@RequestParam(value = "content_file", required = false) MultipartFile content_file) { + @PostMapping(value = "/contentsBbs/putContentsBbs.do") + public ModelAndView putContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response, + @RequestParam(value = "file", required = false) MultipartFile file, + @RequestParam(value = "content_file", required = false) MultipartFile content_file) { log.debug("ContentsBbsController putContentsBbs START"); HashMap paramMap = HttpUtil.getParameterMap(request); @@ -215,30 +245,26 @@ public class ContentsBbsController extends ManagerDraftAction { StringBuffer errorMsg = new StringBuffer(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("regId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); - map = contentsBbsService.putContentsBbs(paramMap,file,content_file); + map = contentsBbsService.putContentsBbs(paramMap, file, content_file); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } @@ -254,18 +280,17 @@ public class ContentsBbsController extends ManagerDraftAction { insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); insertMap.put("tId", map.get("tId")); - if((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) || String.valueOf(errorMsg).length() == 0){ + if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) + || String.valueOf(errorMsg).length() == 0) { insertMap.put("resultCode", "SUCCESS"); - } - else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); insertMap.put("muMemberId", paramMap.get("loginMemberId")); webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } @@ -280,18 +305,18 @@ public class ContentsBbsController extends ManagerDraftAction { * @param response * @return */ - @PostMapping(value="/contentsBbs/moveContentsBbs.do") - public String moveContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response, Model model) { + @PostMapping(value = "/contentsBbs/moveContentsBbs.do") + public String moveContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response, + Model model) { log.debug("ContentsBbsController moveContentsBbs START"); HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return "/web/login/logout"; - } - else { + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.moveContentsBbs(paramMap); @@ -303,14 +328,13 @@ public class ContentsBbsController extends ManagerDraftAction { model.addAttribute("categoryDivCd", paramMap.get("categoryDivCd")); model.addAttribute("category", map.get("category")); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return "/web/login/logout"; } - + model.addAttribute("title", getMenuToCdTitle(paramMap.get("menuClass")).get("title")); - + log.debug("ContentsBbsController moveContentsBbs END"); return "/web/contentsBbs/ContentsBbsUpd"; } @@ -322,8 +346,10 @@ public class ContentsBbsController extends ManagerDraftAction { * @param response * @return */ - @PostMapping(value="/contentsBbs/modContentsBbs.do") - public ModelAndView modContentsBbs(HttpSession session,HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "file", required = false) MultipartFile file, @RequestParam(value = "content_file", required = false) MultipartFile content_file) { + @PostMapping(value = "/contentsBbs/modContentsBbs.do") + public ModelAndView modContentsBbs(HttpSession session, HttpServletRequest request, HttpServletResponse response, + @RequestParam(value = "file", required = false) MultipartFile file, + @RequestParam(value = "content_file", required = false) MultipartFile content_file) { log.debug("WebTreatmentPetitController updateWebTreatmentPetit START"); HashMap paramMap = HttpUtil.getParameterMap(request); @@ -331,30 +357,26 @@ public class ContentsBbsController extends ManagerDraftAction { StringBuffer errorMsg = new StringBuffer(); - try{ - if(!webCheckLogin(session)){ + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("regId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); - map = contentsBbsService.modContentsBbs(paramMap, file, content_file ); + map = contentsBbsService.modContentsBbs(paramMap, file, content_file); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } @@ -370,18 +392,17 @@ public class ContentsBbsController extends ManagerDraftAction { insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); insertMap.put("tId", map.get("tId")); - if((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) || String.valueOf(errorMsg).length() == 0){ + if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) + || String.valueOf(errorMsg).length() == 0) { insertMap.put("resultCode", "SUCCESS"); - } - else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); insertMap.put("muMemberId", paramMap.get("loginMemberId")); webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } @@ -389,7 +410,6 @@ public class ContentsBbsController extends ManagerDraftAction { return HttpUtil.makeHashToJsonModelAndView(map); } - /** * 홈페이지 시술예약(쁘띠) 정보 삭제 * @@ -397,41 +417,36 @@ public class ContentsBbsController extends ManagerDraftAction { * @param response * @return */ - @PostMapping(value="/contentsBbs/delContentsBbs.do") - public ModelAndView delContentsBbs(@RequestBody HashMap paramMap, HttpSession session, HttpServletRequest request, HttpServletResponse response) { + @PostMapping(value = "/contentsBbs/delContentsBbs.do") + public ModelAndView delContentsBbs(@RequestBody HashMap paramMap, HttpSession session, + HttpServletRequest request, HttpServletResponse response) { log.debug("WebTreatmentPetitController deleteWebTreatmentPetit START"); - //HashMap paramMap = HttpUtil.getParameterMap(request); + // HashMap paramMap = HttpUtil.getParameterMap(request); HashMap map = new HashMap(); StringBuffer errorMsg = new StringBuffer(); - - - - try{ - if(!webCheckLogin(session)){ + + try { + if (!webCheckLogin(session)) { return null; - } - else{ + } else { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("regId", String.valueOf(session.getAttribute("loginMemberId"))); paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.delContentsBbs(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); errorMsg.append(e); - } - finally { - if(Constants.OK == map.get("msgCode")) { + } finally { + if (Constants.OK == map.get("msgCode")) { - } - else{ + } else { map.put("msgCode", Constants.FAIL); map.put("success", false); - if(null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { - map.put("msgDesc","정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); } } @@ -447,34 +462,105 @@ public class ContentsBbsController extends ManagerDraftAction { insertMap.put("requestValue", String.valueOf(paramMap)); insertMap.put("responseValue", String.valueOf(map)); insertMap.put("tId", map.get("tId")); - if((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) || String.valueOf(errorMsg).length() == 0){ + if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) + || String.valueOf(errorMsg).length() == 0) { insertMap.put("resultCode", "SUCCESS"); - } - else{ + } else { insertMap.put("resultCode", "ERROR"); } insertMap.put("resultMsg", String.valueOf(errorMsg)); insertMap.put("muMemberId", paramMap.get("loginMemberId")); webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } log.debug("WebTreatmentPetitController deleteWebTreatmentPetit END"); return HttpUtil.makeHashToJsonModelAndView(map); } - + /** - * 시술 정보 리스트 조회 (option) - * 시술등록 팝업 + * 출력순서 일괄 업데이트 + * + * @param paramMap + * @param session * @param request * @param response * @return */ - //@RequestMapping(value = "/webtreatmentpetit/selectListTreatmentOption.do") - public ModelAndView selectListTreatmentOption(HttpSession session, HttpServletRequest request, HttpServletResponse response) { + @PostMapping(value = "/contentsBbs/updateOrdNo.do") + public ModelAndView updateOrdNo(@RequestBody HashMap paramMap, HttpSession session, + HttpServletRequest request, HttpServletResponse response) { + log.debug("ContentsBbsController updateOrdNo START"); + + HashMap map = new HashMap(); + + StringBuffer errorMsg = new StringBuffer(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId"))); + map = contentsBbsService.updateContentsBbsOrdNo(paramMap); + } + } catch (Exception e) { + e.printStackTrace(); + errorMsg.append(e); + } finally { + if (Constants.OK == map.get("msgCode")) { + + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", false); + if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) { + map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다."); + } + } + + try { + HashMap visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request); + HashMap insertMap = new HashMap(); + + insertMap.put("url", "/contentsBbs/updateOrdNo.do"); + insertMap.put("func", "updateOrdNo"); + insertMap.put("funcName", "출력순서 변경"); + insertMap.put("service", "contentsBbsService"); + insertMap.put("serviceName", "출력순서 변경"); + insertMap.put("requestValue", String.valueOf(paramMap)); + insertMap.put("responseValue", String.valueOf(map)); + insertMap.put("tId", map.get("tId")); + if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null) + || String.valueOf(errorMsg).length() == 0) { + insertMap.put("resultCode", "SUCCESS"); + } else { + insertMap.put("resultCode", "ERROR"); + } + insertMap.put("resultMsg", String.valueOf(errorMsg)); + insertMap.put("muMemberId", paramMap.get("loginMemberId")); + + webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + log.debug("ContentsBbsController updateOrdNo END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 시술 정보 리스트 조회 (option) + * 시술등록 팝업 + * + * @param request + * @param response + * @return + */ + // @RequestMapping(value = "/webtreatmentpetit/selectListTreatmentOption.do") + public ModelAndView selectListTreatmentOption(HttpSession session, HttpServletRequest request, + HttpServletResponse response) { log.debug("WebTreatmentPetitController selectListTreatmentOption START"); HashMap paramMap = HttpUtil.getParameterMap(request); @@ -487,8 +573,7 @@ public class ContentsBbsController extends ManagerDraftAction { paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); map = contentsBbsService.selectListTreatmentOption(paramMap); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return null; } finally { @@ -505,35 +590,44 @@ public class ContentsBbsController extends ManagerDraftAction { log.debug("WebTreatmentPetitController selectListTreatmentOption END"); return HttpUtil.makeHashToJsonModelAndView(map); } - + private HashMap getMenuToCdTitle(Object obj) { - HashMap map = new HashMap(); - String cd = ""; + HashMap map = new HashMap(); + String cd = ""; String title = ""; - if( "100101".equals(obj) ) { - cd = "01"; - title = "시술예약(다이어트)"; - } else if( "100102".equals(obj) ) { - cd = "02"; - title = "이벤트(다이어트)"; - } else if( "100201".equals(obj) ) { - cd = "03"; - title = "시술예약(쁘띠)"; - } else if( "100202".equals(obj) ){ - cd = "04"; - title = "이벤트(쁘띠)"; + if ("100101".equals(obj)) { + cd = "01"; + title = "시술예약(다이어트)"; + } else if ("100102".equals(obj)) { + cd = "02"; + title = "이벤트(다이어트)"; + } else if ("100201".equals(obj)) { + cd = "03"; + title = "시술예약(쁘띠)"; + } else if ("100202".equals(obj)) { + cd = "04"; + title = "이벤트(쁘띠)"; } else { - cd = "01"; - title = "시술예약(다이어트)"; + cd = "01"; + title = "시술예약(다이어트)"; } - + map.put("cd", cd); map.put("title", title); - return map; - + return map; + + } + + /** + * 미리보기 화면으로 이동 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/contentsBbs/contentsBbsPreview.do") + public String contentsBbsPreview(HttpSession session, HttpServletRequest request, HttpServletResponse response, + Model model) { + return "/web/contentsBbs/ContentsBbsPreview"; } - - } - - diff --git a/src/main/java/com/madeu/crm/contentsBbs/service/ContentsBbsService.java b/src/main/java/com/madeu/crm/contentsBbs/service/ContentsBbsService.java index d48c18d..a85a2a8 100644 --- a/src/main/java/com/madeu/crm/contentsBbs/service/ContentsBbsService.java +++ b/src/main/java/com/madeu/crm/contentsBbs/service/ContentsBbsService.java @@ -5,15 +5,28 @@ import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; public interface ContentsBbsService { - public HashMap selectListWebTreatmentPetitIntro(HashMap paramMap) throws Exception; - public HashMap getContentsBbsList(HashMap paramMap) throws Exception; - public HashMap getContentsBbs(HashMap paramMap) throws Exception; + public HashMap selectListWebTreatmentPetitIntro(HashMap paramMap) + throws Exception; - public HashMap insertWebTreatmentPetitIntro(HashMap paramMap) throws Exception; - public HashMap putContentsBbs(HashMap paramMap, MultipartFile file, MultipartFile content_file) throws Exception; - - public HashMap moveContentsBbs(HashMap paramMap) throws Exception; - public HashMap modContentsBbs(HashMap paramMap, MultipartFile file, MultipartFile content_file) throws Exception; - public HashMap delContentsBbs(HashMap paramMap) throws Exception; - public HashMap selectListTreatmentOption(HashMap paramMap) throws Exception; + public HashMap getContentsBbsList(HashMap paramMap) throws Exception; + + public HashMap getContentsBbs(HashMap paramMap) throws Exception; + + public HashMap insertWebTreatmentPetitIntro(HashMap paramMap) throws Exception; + + public HashMap putContentsBbs(HashMap paramMap, MultipartFile file, + MultipartFile content_file) throws Exception; + + public HashMap moveContentsBbs(HashMap paramMap) throws Exception; + + public HashMap modContentsBbs(HashMap paramMap, MultipartFile file, + MultipartFile content_file) throws Exception; + + public HashMap delContentsBbs(HashMap paramMap) throws Exception; + + public HashMap selectListTreatmentOption(HashMap paramMap) throws Exception; + + public HashMap updateContentsBbsOrdNo(HashMap paramMap) throws Exception; + + public HashMap getCategoryList(HashMap paramMap) throws Exception; } diff --git a/src/main/java/com/madeu/crm/contentsBbs/service/impl/ContentsBbsServiceImpl.java b/src/main/java/com/madeu/crm/contentsBbs/service/impl/ContentsBbsServiceImpl.java index 5bee9c6..f856cda 100644 --- a/src/main/java/com/madeu/crm/contentsBbs/service/impl/ContentsBbsServiceImpl.java +++ b/src/main/java/com/madeu/crm/contentsBbs/service/impl/ContentsBbsServiceImpl.java @@ -30,13 +30,13 @@ import lombok.extern.slf4j.Slf4j; @Service("ContentsBbsService") public class ContentsBbsServiceImpl implements ContentsBbsService { - /* - * @Autowired private WebTreatmentPetitSqlMapDAO webTreatmentPetitSqlMapDAO; - */ - + /* + * @Autowired private WebTreatmentPetitSqlMapDAO webTreatmentPetitSqlMapDAO; + */ + @Autowired private CommonDao cmmnDAO; - + @Autowired private WebMemberSqlMapDAO webMemberSqlMapDAO; @@ -45,13 +45,12 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { @Autowired private FileService fileService; - + @Autowired private AttachFileService afs; - - - @Value("${url.cdn}") - String CDN_URL; + + @Value("${url.cdn}") + String CDN_URL; /** * 홈페이지 시술예약(쁘띠) 리스트 화면으로 이동. @@ -68,62 +67,60 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("menuClass :" + paramMap.get("menuClass")); - try{ - boolean check = true; + try { + boolean check = true; - String menuClass = String.valueOf(paramMap.get("menuClass")); + String menuClass = String.valueOf(paramMap.get("menuClass")); // 정렬 - if(true != ValidationCheckUtil.emptyCheck(menuClass)){ + if (true != ValidationCheckUtil.emptyCheck(menuClass)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","메뉴 정보가 없습니다."); + map.put("msgDesc", "메뉴 정보가 없습니다."); } - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - if(1==authMenuRelationlistMapSize){ + if (1 == authMenuRelationlistMapSize) { map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); map.put("selectUseYn", authMenuRelationlistMap.get(0).get("selectUseYn")); map.put("insertUseYn", authMenuRelationlistMap.get(0).get("insertUseYn")); map.put("updateUseYn", authMenuRelationlistMap.get(0).get("updateUseYn")); map.put("deleteUseYn", authMenuRelationlistMap.get(0).get("deleteUseYn")); map.put("downloadUseYn", authMenuRelationlistMap.get(0).get("downloadUseYn")); - } - else { + } else { map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -145,102 +142,97 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("menuClass :" + paramMap.get("menuClass")); - log.debug("webTreatmentPetitSearchKeywordParam :"+paramMap.get("webTreatmentPetitSearchKeywordParam")); - log.debug("webTreatmentPetitSort :"+paramMap.get("webTreatmentPetitSort")); - log.debug("webTreatmentPetitStart :"+paramMap.get("webTreatmentPetitStart")); - log.debug("webTreatmentPetitLimit :"+paramMap.get("webTreatmentPetitLimit")); - log.debug("webTreatmentPetitSort :"+paramMap.get("webTreatmentPetitSort")); - log.debug("webTreatmentPetitDir :"+paramMap.get("webTreatmentPetitDir")); - log.debug("webTreatmentPetitCurrentPage :"+paramMap.get("webTreatmentPetitCurrentPage")); + log.debug("webTreatmentPetitSearchKeywordParam :" + paramMap.get("webTreatmentPetitSearchKeywordParam")); + log.debug("webTreatmentPetitSort :" + paramMap.get("webTreatmentPetitSort")); + log.debug("webTreatmentPetitStart :" + paramMap.get("webTreatmentPetitStart")); + log.debug("webTreatmentPetitLimit :" + paramMap.get("webTreatmentPetitLimit")); + log.debug("webTreatmentPetitSort :" + paramMap.get("webTreatmentPetitSort")); + log.debug("webTreatmentPetitDir :" + paramMap.get("webTreatmentPetitDir")); + log.debug("webTreatmentPetitCurrentPage :" + paramMap.get("webTreatmentPetitCurrentPage")); - log.debug("webTreatmentPetitSearchStartDate :"+paramMap.get("webTreatmentPetitSearchStartDate")); - log.debug("webTreatmentPetitSearchEndDate :"+paramMap.get("webTreatmentPetitSearchEndDate")); + log.debug("webTreatmentPetitSearchStartDate :" + paramMap.get("webTreatmentPetitSearchStartDate")); + log.debug("webTreatmentPetitSearchEndDate :" + paramMap.get("webTreatmentPetitSearchEndDate")); - List> listMap = new ArrayList>(); + List> listMap = new ArrayList>(); - try{ - boolean check = true; + try { + boolean check = true; - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); - if(1==authMenuRelationlistMap.size()){ + if (1 == authMenuRelationlistMap.size()) { - if(("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) { - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "조회 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - if(true == check){ - // 정렬 - if(null==paramMap.get("webTreatmentPetitDir")||("").equals(paramMap.get("webTreatmentPetitDir"))){ + if (true == check) { + // 정렬 + if (null == paramMap.get("webTreatmentPetitDir") || ("").equals(paramMap.get("webTreatmentPetitDir"))) { - } - else{ + } else { String dir = String.valueOf(paramMap.get("webTreatmentPetitDir")); - if(("A").equals(dir)){ + if (("A").equals(dir)) { paramMap.put("webTreatmentPetitDir", "DESC"); - } - else if(("B").equals(dir)){ + } else if (("B").equals(dir)) { paramMap.put("webTreatmentPetitDir", "ASC"); - } - else { + } else { paramMap.put("webTreatmentPetitDir", "DESC"); } } paramMap.put("useYn", "Y"); - - //List> totalCountListMap = webTreatmentPetitSqlMapDAO.selectTotalWebTreatmentPetitCount(paramMap); + + // List> totalCountListMap = + // webTreatmentPetitSqlMapDAO.selectTotalWebTreatmentPetitCount(paramMap); int totalCount = cmmnDAO.selectCount("ContentsBbsSql.getContentsBbsCnt", paramMap); - if(0 < totalCount) { + if (0 < totalCount) { // 리스트 조회 - //listMap = webTreatmentPetitSqlMapDAO.selectListWebTreatmentPetit(paramMap); + // listMap = webTreatmentPetitSqlMapDAO.selectListWebTreatmentPetit(paramMap); listMap = cmmnDAO.selectList("ContentsBbsSql.getContentsBbsList", paramMap); } map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); map.put("totalCount", totalCount); - map.put("rows",listMap); + map.put("rows", listMap); } - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -262,66 +254,63 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { HashMap map = new HashMap(); - try{ - boolean check = true; - String postNo = String.valueOf(paramMap.get("postNo")); + try { + boolean check = true; + String postNo = String.valueOf(paramMap.get("postNo")); // 정렬 - if(true != ValidationCheckUtil.emptyCheck(postNo)){ + if (true != ValidationCheckUtil.emptyCheck(postNo)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","시술예약(쁘띠)정보가 없습니다."); + map.put("msgDesc", "시술예약(쁘띠)정보가 없습니다."); } - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); - if(1==authMenuRelationlistMap.size()){ + if (1 == authMenuRelationlistMap.size()) { - if(("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) { - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "조회 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - if(true == check){ - + if (true == check) { + map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); map.put("detail", cmmnDAO.select("ContentsBbsSql.getContentsBbs", paramMap)); map.put("treatmentList", cmmnDAO.selectList("ContentsBbsSql.getProcedureList", paramMap)); } - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -344,65 +333,64 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("menuClass :" + paramMap.get("menuClass")); - try{ - boolean check = true; + try { + boolean check = true; - String menuClass = String.valueOf(paramMap.get("menuClass")); + String menuClass = String.valueOf(paramMap.get("menuClass")); // 정렬 - if(true != ValidationCheckUtil.emptyCheck(menuClass)){ + if (true != ValidationCheckUtil.emptyCheck(menuClass)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","메뉴 정보가 없습니다."); + map.put("msgDesc", "메뉴 정보가 없습니다."); } - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - if(1==authMenuRelationlistMapSize){ + if (1 == authMenuRelationlistMapSize) { map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); map.put("selectUseYn", authMenuRelationlistMap.get(0).get("selectUseYn")); map.put("insertUseYn", authMenuRelationlistMap.get(0).get("insertUseYn")); map.put("updateUseYn", authMenuRelationlistMap.get(0).get("updateUseYn")); map.put("deleteUseYn", authMenuRelationlistMap.get(0).get("deleteUseYn")); map.put("downloadUseYn", authMenuRelationlistMap.get(0).get("downloadUseYn")); - } - else { + } else { map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - //List> listMap = webTreatmentPetitSqlMapDAO.selectWebTreatmentPetitCategory(paramMap); - List> listMap = cmmnDAO.selectList("ContentsBbsSql.getCategoryList",paramMap); + // List> listMap = + // webTreatmentPetitSqlMapDAO.selectWebTreatmentPetitCategory(paramMap); + List> listMap = cmmnDAO.selectList("ContentsBbsSql.getCategoryList", paramMap); map.put("categorylist", listMap); - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -418,123 +406,135 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { * @throws Exception */ @Override - @Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) public HashMap putContentsBbs( - HashMap paramMap, MultipartFile file, MultipartFile content_file) throws Exception{ + HashMap paramMap, MultipartFile file, MultipartFile content_file) throws Exception { log.debug("WebTreatmentPetitServiceImpl insertTreatmentPetit START"); HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("menuClass :" + paramMap.get("menuClass")); - log.debug("title :"+paramMap.get("title")); - log.debug("content :"+paramMap.get("content")); - log.debug("hashtag :"+paramMap.get("hashtag")); - log.debug("thumbnail_bottom_txt :"+paramMap.get("thumbnail_bottom_txt")); - log.debug("file :"+file); - log.debug("content_file :"+content_file); - log.debug("treatmentlist :"+paramMap.get("treatmentlist")); - log.debug("treatmentprocedurelist :"+paramMap.get("treatmentprocedurelist")); + log.debug("title :" + paramMap.get("title")); + log.debug("content :" + paramMap.get("content")); + log.debug("hashtag :" + paramMap.get("hashtag")); + log.debug("thumbnail_bottom_txt :" + paramMap.get("thumbnail_bottom_txt")); + log.debug("file :" + file); + log.debug("content_file :" + content_file); + log.debug("treatmentlist :" + paramMap.get("treatmentlist")); + log.debug("treatmentprocedurelist :" + paramMap.get("treatmentprocedurelist")); - try{ - boolean check = true; + try { + boolean check = true; String tId = String.valueOf(System.currentTimeMillis()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c1 = Calendar.getInstance(); String tDate = sdf.format(c1.getTime()); - String title = String.valueOf(paramMap.get("title")); - String content = String.valueOf(paramMap.get("content")); - String hashtag = String.valueOf(paramMap.get("hashtag")); - String thumbnail_bottom_txt = String.valueOf(paramMap.get("thumbnail_bottom_txt")); - String[] treatmentlist = String.valueOf(paramMap.get("treatmentlist")).split(","); - String[] treatmentprocedurelist = String.valueOf(paramMap.get("treatmentprocedurelist")).split(","); + String title = String.valueOf(paramMap.get("title")); + String content = String.valueOf(paramMap.get("content")); + String hashtag = String.valueOf(paramMap.get("hashtag")); + String thumbnail_bottom_txt = String.valueOf(paramMap.get("thumbnail_bottom_txt")); + String[] treatmentlist = String.valueOf(paramMap.get("treatmentlist")).split(","); + String[] treatmentprocedurelist = String.valueOf(paramMap.get("treatmentprocedurelist")).split(","); - if(true != ValidationCheckUtil.emptyCheck(title)){ + String eventStartDt = String.valueOf(paramMap.get("eventStartDt")); + String eventEndDt = String.valueOf(paramMap.get("eventEndDt")); + + if (eventStartDt != null) + eventStartDt = eventStartDt.replaceAll("-", ""); + if (eventEndDt != null) + eventEndDt = eventEndDt.replaceAll("-", ""); + + paramMap.put("eventStartDt", eventStartDt); + paramMap.put("eventEndDt", eventEndDt); + + log.debug("eventStartDt : " + eventStartDt); + log.debug("eventEndDt : " + eventEndDt); + + if (true != ValidationCheckUtil.emptyCheck(title)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","제목 정보가 없습니다."); + map.put("msgDesc", "제목 정보가 없습니다."); } -// if(true != ValidationCheckUtil.emptyCheck(content)){ -// check = false; -// map.put("msgCode", Constants.FAIL); -// map.put("msgDesc","시술예약(쁘띠) 상세 정보가 없습니다."); -// } -// if(true != ValidationCheckUtil.emptyCheck(hashtag)){ -// check = false; -// map.put("msgCode", Constants.FAIL); -// map.put("msgDesc","시술예약(쁘띠) 해시태그 정보가 없습니다."); -// } -// if(true != ValidationCheckUtil.emptyCheck(thumbnail_bottom_txt)){ -// check = false; -// map.put("msgCode", Constants.FAIL); -// map.put("msgDesc","시술예약(쁘띠) 썸네일 하단 정보가 없습니다."); -// } -// -// if(null==file|| file.isEmpty()){ -// check = false; -// map.put("msgCode", Constants.FAIL); -// map.put("msgDesc","배너 이미지 정보가 없습니다."); -// } -// if(null==content_file|| content_file.isEmpty()){ -// check = false; -// map.put("msgCode", Constants.FAIL); -// map.put("msgDesc","첨부파일 정보가 없습니다."); -// } + // if(true != ValidationCheckUtil.emptyCheck(content)){ + // check = false; + // map.put("msgCode", Constants.FAIL); + // map.put("msgDesc","시술예약(쁘띠) 상세 정보가 없습니다."); + // } + // if(true != ValidationCheckUtil.emptyCheck(hashtag)){ + // check = false; + // map.put("msgCode", Constants.FAIL); + // map.put("msgDesc","시술예약(쁘띠) 해시태그 정보가 없습니다."); + // } + // if(true != ValidationCheckUtil.emptyCheck(thumbnail_bottom_txt)){ + // check = false; + // map.put("msgCode", Constants.FAIL); + // map.put("msgDesc","시술예약(쁘띠) 썸네일 하단 정보가 없습니다."); + // } + // + // if(null==file|| file.isEmpty()){ + // check = false; + // map.put("msgCode", Constants.FAIL); + // map.put("msgDesc","배너 이미지 정보가 없습니다."); + // } + // if(null==content_file|| content_file.isEmpty()){ + // check = false; + // map.put("msgCode", Constants.FAIL); + // map.put("msgDesc","첨부파일 정보가 없습니다."); + // } - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - if(1==authMenuRelationlistMapSize){ + if (1 == authMenuRelationlistMapSize) { - if(("Y").equals(authMenuRelationlistMap.get(0).get("insertUseYn"))) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("insertUseYn"))) { - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "등록 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - if(true == check){ + if (true == check) { if (null != file && !file.isEmpty()) { - Map thumbnailImgMap = afs.saveAttachFile("img", file); - paramMap.put("thumbnailAttachfileId", thumbnailImgMap.get("attachfileId")); + Map thumbnailImgMap = afs.saveAttachFile("img", file); + paramMap.put("thumbnailAttachfileId", thumbnailImgMap.get("attachfileId")); } if (null != content_file && !content_file.isEmpty()) { - Map contentsImgMap = afs.saveAttachFile("img", content_file); + Map contentsImgMap = afs.saveAttachFile("img", content_file); paramMap.put("contentsAttachfileId", contentsImgMap.get("attachfileId")); } paramMap.put("tDate", tDate); @@ -544,23 +544,20 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { // 게시글 등록 cmmnDAO.insert("ContentsBbsSql.putContentsBbs", paramMap); - - for(int i = 0; i < treatmentlist.length; i++) { - if(StringUtils.isNotEmpty(treatmentlist[i]) && - StringUtils.isNotEmpty(treatmentprocedurelist[i])) { - paramMap.put("muTreatmentId", treatmentlist[i]); - paramMap.put("muTreatmentProcedureId", treatmentprocedurelist[i]); - - cmmnDAO.insert("ContentsBbsSql.putContentsBbsProcedure", paramMap); - } + for (int i = 0; i < treatmentlist.length; i++) { + if (StringUtils.isNotEmpty(treatmentlist[i]) && + StringUtils.isNotEmpty(treatmentprocedurelist[i])) { + paramMap.put("muTreatmentId", treatmentlist[i]); + paramMap.put("muTreatmentProcedureId", treatmentprocedurelist[i]); + + cmmnDAO.insert("ContentsBbsSql.putContentsBbsProcedure", paramMap); + } } - - + map.put("msgCode", Constants.OK); map.put("msgDesc", "등록되었습니다."); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -583,56 +580,55 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("menuClass :" + paramMap.get("menuClass")); - try{ - boolean check = true; + try { + boolean check = true; - String menuClass = String.valueOf(paramMap.get("menuClass")); + String menuClass = String.valueOf(paramMap.get("menuClass")); // 정렬 - if(true != ValidationCheckUtil.emptyCheck(menuClass)){ + if (true != ValidationCheckUtil.emptyCheck(menuClass)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","메뉴 정보가 없습니다."); + map.put("msgDesc", "메뉴 정보가 없습니다."); } - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - if(1==authMenuRelationlistMapSize){ + if (1 == authMenuRelationlistMapSize) { map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); map.put("selectUseYn", authMenuRelationlistMap.get(0).get("selectUseYn")); map.put("insertUseYn", authMenuRelationlistMap.get(0).get("insertUseYn")); map.put("updateUseYn", authMenuRelationlistMap.get(0).get("updateUseYn")); map.put("deleteUseYn", authMenuRelationlistMap.get(0).get("deleteUseYn")); map.put("downloadUseYn", authMenuRelationlistMap.get(0).get("downloadUseYn")); - } - else { + } else { map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } @@ -640,8 +636,7 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { map.put("category", cmmnDAO.selectList("ContentsBbsSql.getCategoryList", paramMap)); - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -657,125 +652,126 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { * @throws Exception */ @Override - @Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) public HashMap modContentsBbs( - HashMap paramMap, MultipartFile file, MultipartFile content_file) throws Exception{ + HashMap paramMap, MultipartFile file, MultipartFile content_file) throws Exception { HashMap map = new HashMap(); - try{ - boolean check = true; + try { + boolean check = true; - String title = String.valueOf(paramMap.get("title")); - String content = String.valueOf(paramMap.get("content")); - String hashtag = String.valueOf(paramMap.get("hashtag")); - String thumbnailBottomTxt = String.valueOf(paramMap.get("thumbnailBottomTxt")); - String[] treatmentlist = String.valueOf(paramMap.get("treatmentlist")).split(","); - String[] treatmentprocedurelist = String.valueOf(paramMap.get("treatmentprocedurelist")).split(","); - -// String treatmentpetitStartDate = String.valueOf(paramMap.get("treatmentpetitStartDate")); -// String treatmentpetitEndDate = String.valueOf(paramMap.get("treatmentpetitEndDate")); + String title = String.valueOf(paramMap.get("title")); + String content = String.valueOf(paramMap.get("content")); + String hashtag = String.valueOf(paramMap.get("hashtag")); + String thumbnailBottomTxt = String.valueOf(paramMap.get("thumbnailBottomTxt")); + String[] treatmentlist = String.valueOf(paramMap.get("treatmentlist")).split(","); + String[] treatmentprocedurelist = String.valueOf(paramMap.get("treatmentprocedurelist")).split(","); - if(true != ValidationCheckUtil.emptyCheck(title)){ + String eventStartDt = String.valueOf(paramMap.get("eventStartDt")); + String eventEndDt = String.valueOf(paramMap.get("eventEndDt")); + + if (eventStartDt != null) + eventStartDt = eventStartDt.replaceAll("-", ""); + if (eventEndDt != null) + eventEndDt = eventEndDt.replaceAll("-", ""); + + paramMap.put("eventStartDt", eventStartDt); + paramMap.put("eventEndDt", eventEndDt); + + if (true != ValidationCheckUtil.emptyCheck(title)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","제목 정보가 없습니다."); + map.put("msgDesc", "제목 정보가 없습니다."); } /* - if(true != ValidationCheckUtil.emptyCheck(content)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","시술예약(쁘띠) 상세 정보가 없습니다."); - } - if(true != ValidationCheckUtil.emptyCheck(hashtag)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","시술예약(쁘띠) 해시태그 정보가 없습니다."); - } - if(true != ValidationCheckUtil.emptyCheck(thumbnailBottomTxt)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","시술예약(쁘띠) 썸네일 하단 정보가 없습니다."); - } - */ - if(true == check){ + * if(true != ValidationCheckUtil.emptyCheck(content)){ + * check = false; + * map.put("msgCode", Constants.FAIL); + * map.put("msgDesc","시술예약(쁘띠) 상세 정보가 없습니다."); + * } + * if(true != ValidationCheckUtil.emptyCheck(hashtag)){ + * check = false; + * map.put("msgCode", Constants.FAIL); + * map.put("msgDesc","시술예약(쁘띠) 해시태그 정보가 없습니다."); + * } + * if(true != ValidationCheckUtil.emptyCheck(thumbnailBottomTxt)){ + * check = false; + * map.put("msgCode", Constants.FAIL); + * map.put("msgDesc","시술예약(쁘띠) 썸네일 하단 정보가 없습니다."); + * } + */ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - - if(true == check){ + + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - if(1==authMenuRelationlistMapSize){ + if (1 == authMenuRelationlistMapSize) { - if(("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) { - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "수정 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - if(true == check){ - if (null != file && !file.isEmpty()) { - Map thumbnailImgMap = afs.saveAttachFile("img", file); - paramMap.put("thumbnailAttachfileId", thumbnailImgMap.get("attachfileId")); + if (true == check) { + if (null != file && !file.isEmpty()) { + Map thumbnailImgMap = afs.saveAttachFile("img", file); + paramMap.put("thumbnailAttachfileId", thumbnailImgMap.get("attachfileId")); } if (null != content_file && !content_file.isEmpty()) { - Map contentsImgMap = afs.saveAttachFile("img", content_file); + Map contentsImgMap = afs.saveAttachFile("img", content_file); paramMap.put("contentsAttachfileId", contentsImgMap.get("attachfileId")); } paramMap.put("muMemberId", paramMap.get("loginMemberId")); - - + cmmnDAO.update("ContentsBbsSql.modContentsBbs", paramMap); - //webTreatmentPetitSqlMapDAO.updateWebTreatmentPetit(paramMap); - - - + // webTreatmentPetitSqlMapDAO.updateWebTreatmentPetit(paramMap); + map.put("postNo", paramMap.get("postNo")); cmmnDAO.delete("ContentsBbsSql.delContentsBbsProcedure", paramMap); - //webTreatmentPetitSqlMapDAO..updateWebTreatmentListDiet(paramMap); - for(int i = 0; i < treatmentlist.length; i++) { - if(StringUtils.isNotEmpty(treatmentlist[i]) && - StringUtils.isNotEmpty(treatmentprocedurelist[i])) { - paramMap.put("muTreatmentId", treatmentlist[i]); - paramMap.put("muTreatmentProcedureId", treatmentprocedurelist[i]); - cmmnDAO.insert("ContentsBbsSql.putContentsBbsProcedure", paramMap); - } - + // webTreatmentPetitSqlMapDAO..updateWebTreatmentListDiet(paramMap); + for (int i = 0; i < treatmentlist.length; i++) { + if (StringUtils.isNotEmpty(treatmentlist[i]) && + StringUtils.isNotEmpty(treatmentprocedurelist[i])) { + paramMap.put("muTreatmentId", treatmentlist[i]); + paramMap.put("muTreatmentProcedureId", treatmentprocedurelist[i]); + cmmnDAO.insert("ContentsBbsSql.putContentsBbsProcedure", paramMap); + } + } - - + map.put("msgCode", Constants.OK); map.put("msgDesc", "수정되었습니다."); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -791,66 +787,62 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { * @throws Exception */ @Override - @Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) public HashMap delContentsBbs( - HashMap paramMap) throws Exception{ + HashMap paramMap) throws Exception { - HashMap map = new HashMap(); + HashMap map = new HashMap(); - try{ - boolean check = true; + try { + boolean check = true; - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - if(1==authMenuRelationlistMapSize){ + if (1 == authMenuRelationlistMapSize) { - if(("Y").equals(authMenuRelationlistMap.get(0).get("deleteUseYn"))) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("deleteUseYn"))) { - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "삭제 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } int delCnt = 0; - if(true == check) { - - - delCnt = cmmnDAO.update("ContentsBbsSql.delContentsBbs", paramMap); - map.put("msgCode", Constants.OK); + if (true == check) { + + delCnt = cmmnDAO.update("ContentsBbsSql.delContentsBbs", paramMap); + map.put("msgCode", Constants.OK); map.put("msgDesc", delCnt + "건 삭제 되었습니다."); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -858,7 +850,7 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { log.debug("WebTreatmentPetitServiceImpl deleteWebTreatmentPetit END"); return map; } - + /** * 고객 리스트 조회.(List,Option) * 예약팝업에서 고객 조회 @@ -873,50 +865,46 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { HashMap map = new HashMap(); List> listMap = new ArrayList<>(); - log.debug("userSearchKeywordParam :"+paramMap.get("userSearchKeywordParam")); - log.debug("userTypeCode :"+paramMap.get("userTypeCode")); - log.debug("membershipYn :"+paramMap.get("membershipYn")); - log.debug("nationalityCode :"+paramMap.get("nationalityCode")); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); - log.debug("userSort :"+paramMap.get("userSort")); - log.debug("userStart :"+paramMap.get("userStart")); - log.debug("nationality :"+paramMap.get("nationality")); - log.debug("menuClass :"+paramMap.get("menuClass")); - log.debug("userType :"+paramMap.get("userType")); - log.debug("userLimit :"+paramMap.get("userLimit")); + log.debug("userSearchKeywordParam :" + paramMap.get("userSearchKeywordParam")); + log.debug("userTypeCode :" + paramMap.get("userTypeCode")); + log.debug("membershipYn :" + paramMap.get("membershipYn")); + log.debug("nationalityCode :" + paramMap.get("nationalityCode")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); + log.debug("userSort :" + paramMap.get("userSort")); + log.debug("userStart :" + paramMap.get("userStart")); + log.debug("nationality :" + paramMap.get("nationality")); + log.debug("menuClass :" + paramMap.get("menuClass")); + log.debug("userType :" + paramMap.get("userType")); + log.debug("userLimit :" + paramMap.get("userLimit")); - try{ - boolean check = true; + try { + boolean check = true; - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 정렬 - if(null==paramMap.get("userDir")||("").equals(paramMap.get("userDir"))){ + if (null == paramMap.get("userDir") || ("").equals(paramMap.get("userDir"))) { - } - else{ + } else { String dir = String.valueOf(paramMap.get("userDir")); - if(("A").equals(dir)){ + if (("A").equals(dir)) { paramMap.put("userDir", "DESC"); - } - else if(("B").equals(dir)){ + } else if (("B").equals(dir)) { paramMap.put("userDir", "ASC"); - } - else { + } else { paramMap.put("userDir", "DESC"); } } @@ -924,17 +912,17 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { paramMap.put("useYn", "Y"); int totalCount = cmmnDAO.selectCount("WebTreatmentPetit.selectTotalTreatmentCount", paramMap); - if( 0 < totalCount ){ + if (0 < totalCount) { listMap = cmmnDAO.selectList("WebTreatmentPetit.selectListTreatment", paramMap); } map.put("msgCode", Constants.OK); - map.put("success","true"); + map.put("success", "true"); map.put("totalCount", totalCount); - map.put("rows",listMap); + map.put("rows", listMap); } - }catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -942,4 +930,113 @@ public class ContentsBbsServiceImpl implements ContentsBbsService { log.debug("WebTreatmentPetitServiceImpl selectListTreatmentOption END"); return map; } + + /** + * 출력순서 일괄 업데이트 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) + public HashMap updateContentsBbsOrdNo( + HashMap paramMap) throws Exception { + log.debug("ContentsBbsServiceImpl updateContentsBbsOrdNo START"); + + HashMap map = new HashMap(); + + try { + boolean check = true; + + if (true == check) { + // 사용자 확인 + List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); + int userListMapSize = userListMap.size(); + + if (1 == userListMapSize) { + paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); + } else { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); + } + } + + if (true == check) { + // 권한 조회 + HashMap authCheckParamMap = new HashMap(); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); + int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); + + if (1 == authMenuRelationlistMapSize) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) { + + } else { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "수정 권한 정보가 없습니다."); + } + } else { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "권한 정보가 없습니다."); + } + } + + if (true == check) { + List> orderList = (List>) paramMap.get("orderList"); + int updCnt = 0; + for (Map item : orderList) { + HashMap updateParam = new HashMap(); + updateParam.put("categoryDivCd", paramMap.get("categoryDivCd")); + updateParam.put("categoryNo", item.get("categoryNo")); + updateParam.put("postNo", item.get("postNo")); + updateParam.put("ordNo", item.get("ordNo")); + updateParam.put("modId", paramMap.get("loginMemberId")); + cmmnDAO.update("ContentsBbsSql.updateContentsBbsOrdNo", updateParam); + updCnt++; + } + map.put("msgCode", Constants.OK); + map.put("msgDesc", updCnt + "건 순서가 변경되었습니다."); + } + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("ContentsBbsServiceImpl updateContentsBbsOrdNo END"); + return map; + } + + /** + * 카테고리 목록 조회 + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap getCategoryList(HashMap paramMap) throws Exception { + log.debug("ContentsBbsServiceImpl getCategoryList START"); + + HashMap map = new HashMap(); + + try { + List> listMap = cmmnDAO.selectList("ContentsBbsSql.getCategoryList", paramMap); + map.put("msgCode", Constants.OK); + map.put("rows", listMap); + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "카테고리 목록 조회 중 오류가 발생하였습니다."); + } + + log.debug("ContentsBbsServiceImpl getCategoryList END"); + return map; + } } diff --git a/src/main/java/com/madeu/crm/smsTemplate/ctrl/SmsTemplateController.java b/src/main/java/com/madeu/crm/smsTemplate/ctrl/SmsTemplateController.java new file mode 100644 index 0000000..d15a787 --- /dev/null +++ b/src/main/java/com/madeu/crm/smsTemplate/ctrl/SmsTemplateController.java @@ -0,0 +1,201 @@ +package com.madeu.crm.smsTemplate.ctrl; + +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.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.madeu.constants.Constants; +import com.madeu.crm.smsTemplate.dto.SmsTemplateDTO; +import com.madeu.crm.smsTemplate.dto.SmsTemplateSearchDTO; +import com.madeu.crm.smsTemplate.service.SmsTemplateService; +import com.madeu.init.ManagerDraftAction; +import com.madeu.util.HttpUtil; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Controller +@RequestMapping("/smsTemplate") +public class SmsTemplateController extends ManagerDraftAction { + + @Autowired + private SmsTemplateService smsTemplateService; + + /** + * 문자 상용구 관리 화면으로 이동 + */ + @RequestMapping("/moveSmsTemplateList.do") + public String moveSmsTemplateList(HttpSession session, HttpServletRequest request, HttpServletResponse response, + Model model) { + log.debug("SmsTemplateController moveSmsTemplateList START"); + + HashMap paramMap = HttpUtil.getParameterMap(request); + HashMap map = null; + + try { + if (!webCheckLogin(session)) { + return "/web/login/logout"; + } else { + paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId"))); + map = smsTemplateService.moveSmsTemplateList(paramMap); + model.addAttribute("selectUseYn", map.get("selectUseYn")); + model.addAttribute("insertUseYn", map.get("insertUseYn")); + model.addAttribute("updateUseYn", map.get("updateUseYn")); + model.addAttribute("deleteUseYn", map.get("deleteUseYn")); + model.addAttribute("downloadUseYn", map.get("downloadUseYn")); + } + } catch (Exception e) { + e.printStackTrace(); + return "/web/login/logout"; + } + log.debug("SmsTemplateController moveSmsTemplateList END"); + + return "/web/smsTemplate/smsTemplateSelectList"; + } + + /** + * 문자 상용구 목록 조회 + */ + @PostMapping("/getSmsTemplateList.do") + public ModelAndView getSmsTemplateList(HttpSession session, HttpServletRequest request, + HttpServletResponse response, SmsTemplateSearchDTO searchDTO) { + log.debug("SmsTemplateController getSmsTemplateList START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + searchDTO.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = smsTemplateService.getSmsTemplateList(searchDTO); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "서버 오류가 발생했습니다."); + } 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("SmsTemplateController getSmsTemplateList END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 문자 상용구 상세 조회 + */ + @PostMapping("/getSmsTemplate.do") + public ModelAndView getSmsTemplate(HttpSession session, HttpServletRequest request, + HttpServletResponse response, SmsTemplateDTO dto) { + log.debug("SmsTemplateController getSmsTemplate START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + dto.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = smsTemplateService.getSmsTemplate(dto); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "조회 중 오류가 발생하였습니다."); + } + log.debug("SmsTemplateController getSmsTemplate END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 문자 상용구 등록 + */ + @PostMapping("/putSmsTemplate.do") + public ModelAndView putSmsTemplate(HttpSession session, HttpServletRequest request, + HttpServletResponse response, SmsTemplateDTO dto) { + log.debug("SmsTemplateController putSmsTemplate START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + dto.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = smsTemplateService.putSmsTemplate(dto); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "등록 중 오류가 발생하였습니다."); + } + log.debug("SmsTemplateController putSmsTemplate END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 문자 상용구 수정 + */ + @PostMapping("/modSmsTemplate.do") + public ModelAndView modSmsTemplate(HttpSession session, HttpServletRequest request, + HttpServletResponse response, SmsTemplateDTO dto) { + log.debug("SmsTemplateController modSmsTemplate START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + dto.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = smsTemplateService.modSmsTemplate(dto); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "수정 중 오류가 발생하였습니다."); + } + log.debug("SmsTemplateController modSmsTemplate END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } + + /** + * 문자 상용구 삭제 + */ + @PostMapping("/delSmsTemplate.do") + public ModelAndView delSmsTemplate(HttpSession session, HttpServletRequest request, + HttpServletResponse response, SmsTemplateDTO dto) { + log.debug("SmsTemplateController delSmsTemplate START"); + + HashMap map = new HashMap<>(); + + try { + if (!webCheckLogin(session)) { + return null; + } else { + dto.setLoginMemberId(String.valueOf(session.getAttribute("loginMemberId"))); + map = smsTemplateService.delSmsTemplate(dto); + } + } catch (Exception e) { + e.printStackTrace(); + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "삭제 중 오류가 발생하였습니다."); + } + log.debug("SmsTemplateController delSmsTemplate END"); + return HttpUtil.makeHashToJsonModelAndView(map); + } +} diff --git a/src/main/java/com/madeu/crm/smsTemplate/dto/SmsTemplateDTO.java b/src/main/java/com/madeu/crm/smsTemplate/dto/SmsTemplateDTO.java new file mode 100644 index 0000000..35d27b3 --- /dev/null +++ b/src/main/java/com/madeu/crm/smsTemplate/dto/SmsTemplateDTO.java @@ -0,0 +1,27 @@ +package com.madeu.crm.smsTemplate.dto; + +import lombok.Data; + +/** + * SMS 상용구 결과 DTO + */ +@Data +public class SmsTemplateDTO { + /* ---- 테이블 필드 ---- */ + private String muSmsTemplateId; + private String title; + private String content; + private String useYn; + private String cudFlag; + private String regId; + private String regDate; + private String modId; + private String modDate; + + /* ---- 조인/서브쿼리 결과 필드 ---- */ + private String regName; // 등록자명 + private String rowNum; // 행 번호 + + /* ---- 세션/공통 ---- */ + private String loginMemberId; +} diff --git a/src/main/java/com/madeu/crm/smsTemplate/dto/SmsTemplateSearchDTO.java b/src/main/java/com/madeu/crm/smsTemplate/dto/SmsTemplateSearchDTO.java new file mode 100644 index 0000000..e2d6c4e --- /dev/null +++ b/src/main/java/com/madeu/crm/smsTemplate/dto/SmsTemplateSearchDTO.java @@ -0,0 +1,21 @@ +package com.madeu.crm.smsTemplate.dto; + +import lombok.Data; + +/** + * SMS 상용구 검색 조건 DTO + */ +@Data +public class SmsTemplateSearchDTO { + /* ---- 검색 조건 ---- */ + private String searchKeyword; + + /* ---- 페이징 ---- */ + private Integer gridLimitStart; + private Integer gridLimitEnd; + private String gridSort; + + /* ---- 권한/세션 ---- */ + private String menuClass; + private String loginMemberId; +} diff --git a/src/main/java/com/madeu/crm/smsTemplate/map/SmsTemplateMAP.java b/src/main/java/com/madeu/crm/smsTemplate/map/SmsTemplateMAP.java new file mode 100644 index 0000000..382f7f6 --- /dev/null +++ b/src/main/java/com/madeu/crm/smsTemplate/map/SmsTemplateMAP.java @@ -0,0 +1,29 @@ +package com.madeu.crm.smsTemplate.map; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; + +import com.madeu.crm.smsTemplate.dto.SmsTemplateDTO; +import com.madeu.crm.smsTemplate.dto.SmsTemplateSearchDTO; + +@Mapper +public interface SmsTemplateMAP { + // 상용구 목록 건수 조회 + int getSmsTemplateCnt(SmsTemplateSearchDTO searchDTO); + + // 상용구 목록 조회 + List getSmsTemplateList(SmsTemplateSearchDTO searchDTO); + + // 상용구 상세 조회 + SmsTemplateDTO getSmsTemplate(SmsTemplateDTO dto); + + // 상용구 등록 + int putSmsTemplate(SmsTemplateDTO dto); + + // 상용구 수정 + int modSmsTemplate(SmsTemplateDTO dto); + + // 상용구 삭제 (논리 삭제) + int delSmsTemplate(SmsTemplateDTO dto); +} diff --git a/src/main/java/com/madeu/crm/smsTemplate/service/SmsTemplateService.java b/src/main/java/com/madeu/crm/smsTemplate/service/SmsTemplateService.java new file mode 100644 index 0000000..4672699 --- /dev/null +++ b/src/main/java/com/madeu/crm/smsTemplate/service/SmsTemplateService.java @@ -0,0 +1,162 @@ +package com.madeu.crm.smsTemplate.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.madeu.common.service.MenuAuthService; +import com.madeu.constants.Constants; +import com.madeu.crm.smsTemplate.dto.SmsTemplateDTO; +import com.madeu.crm.smsTemplate.dto.SmsTemplateSearchDTO; +import com.madeu.crm.smsTemplate.map.SmsTemplateMAP; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +public class SmsTemplateService { + + @Autowired + private SmsTemplateMAP smsTemplateMAP; + + @Autowired + private MenuAuthService menuAuthService; + + /** + * 상용구 관리 화면 이동 + */ + public HashMap moveSmsTemplateList(HashMap paramMap) throws Exception { + log.debug("moveSmsTemplateList START"); + + HashMap map = menuAuthService.getMenuAuthority(paramMap); + + log.debug("loginMemberId : " + paramMap.get("loginMemberId")); + log.debug("menuClass : " + paramMap.get("menuClass")); + log.debug("moveSmsTemplateList END"); + return map; + } + + /** + * 상용구 목록 조회 + */ + public HashMap getSmsTemplateList(SmsTemplateSearchDTO searchDTO) throws Exception { + log.debug("getSmsTemplateList START"); + + HashMap map = new HashMap<>(); + + List listMap = new ArrayList<>(); + + int totalCount = smsTemplateMAP.getSmsTemplateCnt(searchDTO); + + if (0 < totalCount) { + listMap = smsTemplateMAP.getSmsTemplateList(searchDTO); + } + + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("totalCount", totalCount); + map.put("rows", listMap); + + log.debug("getSmsTemplateList END"); + return map; + } + + /** + * 상용구 상세 조회 + */ + public HashMap getSmsTemplate(SmsTemplateDTO dto) throws Exception { + log.debug("getSmsTemplate START"); + + HashMap map = new HashMap<>(); + + SmsTemplateDTO detail = smsTemplateMAP.getSmsTemplate(dto); + + if (detail != null) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("data", detail); + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", "false"); + map.put("msgDesc", "상용구 정보를 찾을 수 없습니다."); + } + + log.debug("getSmsTemplate END"); + return map; + } + + /** + * 상용구 등록 + */ + public HashMap putSmsTemplate(SmsTemplateDTO dto) throws Exception { + log.debug("putSmsTemplate START"); + + HashMap map = new HashMap<>(); + + int result = smsTemplateMAP.putSmsTemplate(dto); + + if (0 < result) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("msgDesc", "상용구가 등록되었습니다."); + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", "false"); + map.put("msgDesc", "상용구 등록에 실패하였습니다."); + } + + log.debug("putSmsTemplate END"); + return map; + } + + /** + * 상용구 수정 + */ + public HashMap modSmsTemplate(SmsTemplateDTO dto) throws Exception { + log.debug("modSmsTemplate START"); + + HashMap map = new HashMap<>(); + + int result = smsTemplateMAP.modSmsTemplate(dto); + + if (0 < result) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("msgDesc", "상용구가 수정되었습니다."); + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", "false"); + map.put("msgDesc", "상용구 수정에 실패하였습니다."); + } + + log.debug("modSmsTemplate END"); + return map; + } + + /** + * 상용구 삭제 (논리 삭제) + */ + public HashMap delSmsTemplate(SmsTemplateDTO dto) throws Exception { + log.debug("delSmsTemplate START"); + + HashMap map = new HashMap<>(); + + int result = smsTemplateMAP.delSmsTemplate(dto); + + if (0 < result) { + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("msgDesc", "상용구가 삭제되었습니다."); + } else { + map.put("msgCode", Constants.FAIL); + map.put("success", "false"); + map.put("msgDesc", "상용구 삭제에 실패하였습니다."); + } + + log.debug("delSmsTemplate END"); + return map; + } +} diff --git a/src/main/java/com/madeu/dao/web/webhospital/WebHospitalSqlMapDAO.java b/src/main/java/com/madeu/dao/web/webhospital/WebHospitalSqlMapDAO.java index a9db70b..8edd7da 100644 --- a/src/main/java/com/madeu/dao/web/webhospital/WebHospitalSqlMapDAO.java +++ b/src/main/java/com/madeu/dao/web/webhospital/WebHospitalSqlMapDAO.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Map; @Repository -public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport{ +public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport { @Autowired private SqlSessionTemplate sqlSessionTemplate; @@ -21,13 +21,13 @@ public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport{ void init() { setSqlSessionTemplate(sqlSessionTemplate); } - + /** * 병원 정보 조회 * * @param Map * @return - * @throws DataAccessException + * @throws DataAccessException */ public List> selectHospital(HashMap paramMap) throws DataAccessException { @@ -36,13 +36,13 @@ public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport{ logger.debug("WebHospitalSqlMapDAO selectHospital END"); return getSqlSession().selectList(sqlId, paramMap); } - + /** * 병원 정보 휴일 조회 * * @param Map * @return - * @throws DataAccessException + * @throws DataAccessException */ public List> selectHospitalWeek(HashMap paramMap) throws DataAccessException { @@ -66,6 +66,7 @@ public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport{ logger.debug("WebHospitalSqlMapDAO selectHospitalWeek2 END"); return getSqlSession().selectList(sqlId, paramMap); } + /** * 병원 월별 휴일 정보 * @@ -80,7 +81,7 @@ public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport{ logger.debug("WebHospitalSqlMapDAO selectHospitalHoliday END"); return getSqlSession().selectList(sqlId, paramMap); } - + /** * 병원 정보 수정 * @@ -95,4 +96,49 @@ public class WebHospitalSqlMapDAO extends SqlSessionDaoSupport{ logger.debug("WebHospitalSqlMapDAO updateHospital END"); return getSqlSession().update(sqlId, paramMap); } + + /** + * 병원 스케줄 상세 조회 + */ + public Map selectHospitalScheduleDetail(HashMap paramMap) + throws DataAccessException { + return getSqlSession().selectOne("WebHospital.selectHospitalScheduleDetail", paramMap); + } + + /** + * 병원 스케줄 존재 여부 확인 + */ + public Map selectHospitalScheduleCheck(HashMap paramMap) + throws DataAccessException { + return getSqlSession().selectOne("WebHospital.selectHospitalScheduleCheck", paramMap); + } + + /** + * 병원 휴일 여부 확인 (스케줄 등록되지 않은 날짜 기준) + */ + public Map selectHospitalHolidayCheck(HashMap paramMap) + throws DataAccessException { + return getSqlSession().selectOne("WebHospital.selectHospitalHolidayCheck", paramMap); + } + + /** + * 병원 스케줄 등록 + */ + public int insertHospitalSchedule(HashMap paramMap) throws DataAccessException { + return getSqlSession().insert("WebHospital.insertHospitalSchedule", paramMap); + } + + /** + * 병원 스케줄 수정 + */ + public int updateHospitalSchedule(HashMap paramMap) throws DataAccessException { + return getSqlSession().update("WebHospital.updateHospitalSchedule", paramMap); + } + + /** + * 병원 스케줄 삭제 + */ + public int deleteHospitalSchedule(HashMap paramMap) throws DataAccessException { + return getSqlSession().update("WebHospital.deleteHospitalSchedule", paramMap); + } } diff --git a/src/main/java/com/madeu/service/web/webhospital/WebHospitalService.java b/src/main/java/com/madeu/service/web/webhospital/WebHospitalService.java index 557b376..9541b76 100644 --- a/src/main/java/com/madeu/service/web/webhospital/WebHospitalService.java +++ b/src/main/java/com/madeu/service/web/webhospital/WebHospitalService.java @@ -5,8 +5,22 @@ import java.util.HashMap; public interface WebHospitalService { public HashMap selectHospitalIntro(HashMap paramMap) throws Exception; + public HashMap selectHospital(HashMap paramMap) throws Exception; + public HashMap selectWorkTime(HashMap paramMap) throws Exception; + public HashMap updateHospital(HashMap paramMap) throws Exception; + public HashMap selectHospitalHolidayList(HashMap paramMap) throws Exception; + + public HashMap selectHospitalScheduleDetail(HashMap paramMap) throws Exception; + + public HashMap saveHospitalSchedule(HashMap paramMap) throws Exception; + + public HashMap deleteHospitalSchedule(HashMap paramMap) throws Exception; + + public HashMap saveHospitalHoliday(HashMap paramMap) throws Exception; + + public HashMap deleteHospitalHolidays(HashMap paramMap) throws Exception; } diff --git a/src/main/java/com/madeu/service/web/webhospital/impl/WebHospitalServiceImpl.java b/src/main/java/com/madeu/service/web/webhospital/impl/WebHospitalServiceImpl.java index 7a88581..ca0c558 100644 --- a/src/main/java/com/madeu/service/web/webhospital/impl/WebHospitalServiceImpl.java +++ b/src/main/java/com/madeu/service/web/webhospital/impl/WebHospitalServiceImpl.java @@ -8,10 +8,6 @@ import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.*; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -32,20 +28,19 @@ import org.springframework.web.multipart.MultipartFile; @Slf4j @Service("WebHospitalService") public class WebHospitalServiceImpl implements WebHospitalService { - + @Autowired private WebHospitalSqlMapDAO webHospitalSqlMapDAO; - + @Autowired private WebHospitalHolidaySqlMapDAO webHospitalHolidaySqlMapDAO; - + @Autowired private WebMemberSqlMapDAO webMemberSqlMapDAO; - + @Autowired private WebAuthMenuRelationSqlMapDAO webAuthMenuRelationSqlMapDAO; - /** * 병원 상세 화면으로 이동. * @@ -61,62 +56,60 @@ public class WebHospitalServiceImpl implements WebHospitalService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); - - log.debug("menuClass :"+paramMap.get("menuClass")); - - try{ - boolean check = true; - - String menuClass = String.valueOf(paramMap.get("menuClass")); - + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); + + log.debug("menuClass :" + paramMap.get("menuClass")); + + try { + boolean check = true; + + String menuClass = String.valueOf(paramMap.get("menuClass")); + // 정렬 - if(true != ValidationCheckUtil.emptyCheck(menuClass)){ + if (true != ValidationCheckUtil.emptyCheck(menuClass)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","메뉴 정보가 없습니다."); + map.put("msgDesc", "메뉴 정보가 없습니다."); } - - if(true == check){ + + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - - if(1==userListMapSize){ + + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - - if(true == check){ + + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - - if(1==authMenuRelationlistMapSize){ + + if (1 == authMenuRelationlistMapSize) { map.put("msgCode", Constants.OK); - map.put("success","true"); - + map.put("success", "true"); + map.put("selectUseYn", authMenuRelationlistMap.get(0).get("selectUseYn")); map.put("insertUseYn", authMenuRelationlistMap.get(0).get("insertUseYn")); map.put("updateUseYn", authMenuRelationlistMap.get(0).get("updateUseYn")); map.put("deleteUseYn", authMenuRelationlistMap.get(0).get("deleteUseYn")); map.put("downloadUseYn", authMenuRelationlistMap.get(0).get("downloadUseYn")); - } - else { + } else { map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -124,8 +117,7 @@ public class WebHospitalServiceImpl implements WebHospitalService { log.debug("WebHospitalServiceImpl selectHospitalIntro END"); return map; } - - + /** * 병원 정보 상세 조회 (one) * @@ -141,77 +133,74 @@ public class WebHospitalServiceImpl implements WebHospitalService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); - - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - try{ - boolean check = true; - - if(true == check){ + log.debug("menuClass :" + paramMap.get("menuClass")); + + try { + boolean check = true; + + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - - if(1==userListMapSize){ + + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); - if(1==authMenuRelationlistMap.size()){ + if (1 == authMenuRelationlistMap.size()) { - if(("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) { + if (("Y").equals(authMenuRelationlistMap.get(0).get("selectUseYn"))) { - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "조회 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - if(true == check){ + if (true == check) { List> hospitalListMap = webHospitalSqlMapDAO.selectHospital(paramMap); int hospitalListMapSize = hospitalListMap.size(); - - if(1 == hospitalListMapSize){ + + if (1 == hospitalListMapSize) { // 병원 휴일 정보 조회 paramMap.put("muHospitalId", hospitalListMap.get(0).get("muHospitalId")); - List> hospitalHolidayListMap = webHospitalHolidaySqlMapDAO.selectListHospitalHoliday(paramMap); - + List> hospitalHolidayListMap = webHospitalHolidaySqlMapDAO + .selectListHospitalHoliday(paramMap); + hospitalListMap.get(0).put("holidayRows", hospitalHolidayListMap); - + map.put("msgCode", Constants.OK); - map.put("success","true"); - map.put("rows",hospitalListMap); - } - else { + map.put("success", "true"); + map.put("rows", hospitalListMap); + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "병원 정보가 없습니다."); } - + } - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } @@ -234,44 +223,43 @@ public class WebHospitalServiceImpl implements WebHospitalService { HashMap map = new HashMap(); - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); - log.debug("menuClass :"+paramMap.get("menuClass")); + log.debug("menuClass :" + paramMap.get("menuClass")); - try{ - boolean check = true; + try { + boolean check = true; - if(true == check){ + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - if(1==userListMapSize){ + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - if(true == check){ + if (true == check) { List> hospitalListMap = webHospitalSqlMapDAO.selectHospital(paramMap); int hospitalListMapSize = hospitalListMap.size(); - if(1 == hospitalListMapSize){ + if (1 == hospitalListMapSize) { // 병원 휴일 정보 조회 paramMap.put("muHospitalId", hospitalListMap.get(0).get("muHospitalId")); - List> hospitalHolidayListMap = webHospitalHolidaySqlMapDAO.selectListHospitalHoliday(paramMap); + List> hospitalHolidayListMap = webHospitalHolidaySqlMapDAO + .selectListHospitalHoliday(paramMap); hospitalListMap.get(0).put("holidayRows", hospitalHolidayListMap); map.put("msgCode", Constants.OK); - map.put("success","true"); - map.put("rows",hospitalListMap); - } - else { + map.put("success", "true"); + map.put("rows", hospitalListMap); + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "병원 정보가 없습니다."); @@ -279,454 +267,584 @@ public class WebHospitalServiceImpl implements WebHospitalService { } - } - catch(Exception e){ + } catch (Exception e) { e.printStackTrace(); throw e; } log.debug("WebHospitalServiceImpl selectWorkTime END"); return map; } - + + /** + * 병원 휴일 정보 조회 (달력 표출용) + * + * @param paramMap + * @return + * @throws Exception + */ + @Override + public HashMap selectHospitalHolidayList(HashMap paramMap) throws Exception { + log.debug("WebHospitalServiceImpl selectHospitalHolidayList START"); + + HashMap map = new HashMap(); + try { + // 병원 정보 조회 (병원 ID 등을 가져오기 위함) + // paramMap에 muHospitalId가 없을 수 있으므로, 로그인한 사용자의 병원을 찾아야 할 수도 있음. + // 하지만 보통 관리자 메뉴이므로 muHospitalId를 parameter로 받거나, 없으면 첫번째 병원을 가져오는 로직이 필요할 수 있음. + // 여기서는 selectHospital 로직을 참고하여 병원 조회를 먼저 수행. + + List> hospitalListMap = null; + + if (paramMap.get("muHospitalId") == null || "".equals(paramMap.get("muHospitalId"))) { + hospitalListMap = webHospitalSqlMapDAO.selectHospital(paramMap); + if (hospitalListMap.size() > 0) { + paramMap.put("muHospitalId", hospitalListMap.get(0).get("muHospitalId")); + } + } + + // muHospitalId가 있어야 조회 가능 + if (paramMap.get("muHospitalId") != null && !"".equals(paramMap.get("muHospitalId"))) { + // 병원 휴일 및 공휴일 조회 (UNION 쿼리 사용) + List> holidayList = webHospitalSqlMapDAO.selectHospitalHoliday(paramMap); + + map.put("msgCode", Constants.OK); + map.put("success", "true"); + map.put("rows", holidayList); + } else { + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "병원 정보가 없습니다."); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + + log.debug("WebHospitalServiceImpl selectHospitalHolidayList END"); + return map; + } + /** * 병원 정보 수정 * * @param paramMap * @return - * @throws Exception + * @throws Exception */ @Override - @Transactional(rollbackFor={Exception.class}, propagation = Propagation.REQUIRES_NEW) + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) public HashMap updateHospital( - HashMap paramMap) throws Exception{ + HashMap paramMap) throws Exception { log.debug("WebHospitalServiceImpl updateHospital START"); - - HashMap map = new HashMap(); - - log.debug("loginMemberId :"+paramMap.get("loginMemberId")); - - log.debug("menuClass :"+paramMap.get("menuClass")); - - log.debug("muHospitalId :"+paramMap.get("muHospitalId")); - - log.debug("monOpenYn :"+paramMap.get("monOpenYn")); - log.debug("monOpenStartTime :"+paramMap.get("monOpenStartTime")); - log.debug("monOpenEndTime :"+paramMap.get("monOpenEndTime")); - log.debug("monBreakStartTime :"+paramMap.get("monBreakStartTime")); - log.debug("monBreakEndTime :"+paramMap.get("monBreakEndTime")); - log.debug("tueOpenYn :"+paramMap.get("tueOpenYn")); - log.debug("tueOpenStartTime :"+paramMap.get("tueOpenStartTime")); - log.debug("tueOpenEndTime :"+paramMap.get("tueOpenEndTime")); - log.debug("tueBreakStartTime :"+paramMap.get("tueBreakStartTime")); - log.debug("tueBreakEndTime :"+paramMap.get("tueBreakEndTime")); - log.debug("wedOpenYn :"+paramMap.get("wedOpenYn")); - log.debug("wedOpenStartTime :"+paramMap.get("wedOpenStartTime")); - log.debug("wedOpenEndTime :"+paramMap.get("wedOpenEndTime")); - log.debug("wedBreakStartTime :"+paramMap.get("wedBreakStartTime")); - log.debug("wedBreakEndTime :"+paramMap.get("wedBreakEndTime")); - log.debug("thuOpenYn :"+paramMap.get("thuOpenYn")); - log.debug("thuOpenStartTime :"+paramMap.get("thuOpenStartTime")); - log.debug("thuOpenEndTime :"+paramMap.get("thuOpenEndTime")); - log.debug("thuBreakStartTime :"+paramMap.get("thuBreakStartTime")); - log.debug("thuBreakEndTime :"+paramMap.get("thuBreakEndTime")); - log.debug("friOpenYn :"+paramMap.get("friOpenYn")); - log.debug("friOpenStartTime :"+paramMap.get("friOpenStartTime")); - log.debug("friOpenEndTime :"+paramMap.get("friOpenEndTime")); - log.debug("friBreakStartTime :"+paramMap.get("friBreakStartTime")); - log.debug("friBreakEndTime :"+paramMap.get("friBreakEndTime")); - log.debug("satOpenYn :"+paramMap.get("satOpenYn")); - log.debug("satOpenStartTime :"+paramMap.get("satOpenStartTime")); - log.debug("satOpenEndTime :"+paramMap.get("satOpenEndTime")); - log.debug("satBreakStartTime :"+paramMap.get("satBreakStartTime")); - log.debug("satBreakEndTime :"+paramMap.get("satBreakEndTime")); - log.debug("sunOpenYn :"+paramMap.get("sunOpenYn")); - log.debug("sunOpenStartTime :"+paramMap.get("sunOpenStartTime")); - log.debug("sunOpenEndTime :"+paramMap.get("sunOpenEndTime")); - log.debug("sunBreakStartTime :"+paramMap.get("sunBreakStartTime")); - log.debug("sunBreakEndTime :"+paramMap.get("sunBreakEndTime")); - log.debug("publicHolidayUseYn :"+paramMap.get("publicHolidayUseYn")); - - log.debug("holidayRows :"+paramMap.get("holidayRows")); - try{ - boolean check = true; + HashMap map = new HashMap(); + + log.debug("loginMemberId :" + paramMap.get("loginMemberId")); + + log.debug("menuClass :" + paramMap.get("menuClass")); + + log.debug("muHospitalId :" + paramMap.get("muHospitalId")); + + log.debug("monOpenYn :" + paramMap.get("monOpenYn")); + log.debug("monOpenStartTime :" + paramMap.get("monOpenStartTime")); + log.debug("monOpenEndTime :" + paramMap.get("monOpenEndTime")); + log.debug("monBreakStartTime :" + paramMap.get("monBreakStartTime")); + log.debug("monBreakEndTime :" + paramMap.get("monBreakEndTime")); + log.debug("tueOpenYn :" + paramMap.get("tueOpenYn")); + log.debug("tueOpenStartTime :" + paramMap.get("tueOpenStartTime")); + log.debug("tueOpenEndTime :" + paramMap.get("tueOpenEndTime")); + log.debug("tueBreakStartTime :" + paramMap.get("tueBreakStartTime")); + log.debug("tueBreakEndTime :" + paramMap.get("tueBreakEndTime")); + log.debug("wedOpenYn :" + paramMap.get("wedOpenYn")); + log.debug("wedOpenStartTime :" + paramMap.get("wedOpenStartTime")); + log.debug("wedOpenEndTime :" + paramMap.get("wedOpenEndTime")); + log.debug("wedBreakStartTime :" + paramMap.get("wedBreakStartTime")); + log.debug("wedBreakEndTime :" + paramMap.get("wedBreakEndTime")); + log.debug("thuOpenYn :" + paramMap.get("thuOpenYn")); + log.debug("thuOpenStartTime :" + paramMap.get("thuOpenStartTime")); + log.debug("thuOpenEndTime :" + paramMap.get("thuOpenEndTime")); + log.debug("thuBreakStartTime :" + paramMap.get("thuBreakStartTime")); + log.debug("thuBreakEndTime :" + paramMap.get("thuBreakEndTime")); + log.debug("friOpenYn :" + paramMap.get("friOpenYn")); + log.debug("friOpenStartTime :" + paramMap.get("friOpenStartTime")); + log.debug("friOpenEndTime :" + paramMap.get("friOpenEndTime")); + log.debug("friBreakStartTime :" + paramMap.get("friBreakStartTime")); + log.debug("friBreakEndTime :" + paramMap.get("friBreakEndTime")); + log.debug("satOpenYn :" + paramMap.get("satOpenYn")); + log.debug("satOpenStartTime :" + paramMap.get("satOpenStartTime")); + log.debug("satOpenEndTime :" + paramMap.get("satOpenEndTime")); + log.debug("satBreakStartTime :" + paramMap.get("satBreakStartTime")); + log.debug("satBreakEndTime :" + paramMap.get("satBreakEndTime")); + log.debug("sunOpenYn :" + paramMap.get("sunOpenYn")); + log.debug("sunOpenStartTime :" + paramMap.get("sunOpenStartTime")); + log.debug("sunOpenEndTime :" + paramMap.get("sunOpenEndTime")); + log.debug("sunBreakStartTime :" + paramMap.get("sunBreakStartTime")); + log.debug("sunBreakEndTime :" + paramMap.get("sunBreakEndTime")); + log.debug("publicHolidayUseYn :" + paramMap.get("publicHolidayUseYn")); + + log.debug("holidayRows :" + paramMap.get("holidayRows")); + + try { + boolean check = true; String tId = String.valueOf(System.currentTimeMillis()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c1 = Calendar.getInstance(); String tDate = sdf.format(c1.getTime()); - - String muHospitalId = String.valueOf(paramMap.get("muHospitalId")); - - String monOpenYn = String.valueOf(paramMap.get("monOpenYn")); - String monOpenStartTime = String.valueOf(paramMap.get("monOpenStartTime")); - String monOpenEndTime = String.valueOf(paramMap.get("monOpenEndTime")); - String monBreakStartTime = String.valueOf(paramMap.get("monBreakStartTime")); - String monBreakEndTime = String.valueOf(paramMap.get("monBreakEndTime")); - String tueOpenYn = String.valueOf(paramMap.get("tueOpenYn")); - String tueOpenStartTime = String.valueOf(paramMap.get("tueOpenStartTime")); - String tueOpenEndTime = String.valueOf(paramMap.get("tueOpenEndTime")); - String tueBreakStartTime = String.valueOf(paramMap.get("tueBreakStartTime")); - String tueBreakEndTime = String.valueOf(paramMap.get("tueBreakEndTime")); - String wedOpenYn = String.valueOf(paramMap.get("wedOpenYn")); - String wedOpenStartTime = String.valueOf(paramMap.get("wedOpenStartTime")); - String wedOpenEndTime = String.valueOf(paramMap.get("wedOpenEndTime")); - String wedBreakStartTime = String.valueOf(paramMap.get("wedBreakStartTime")); - String wedBreakEndTime = String.valueOf(paramMap.get("wedBreakEndTime")); - String thuOpenYn = String.valueOf(paramMap.get("thuOpenYn")); - String thuOpenStartTime = String.valueOf(paramMap.get("thuOpenStartTime")); - String thuOpenEndTime = String.valueOf(paramMap.get("thuOpenEndTime")); - String thuBreakStartTime = String.valueOf(paramMap.get("thuBreakStartTime")); - String thuBreakEndTime = String.valueOf(paramMap.get("thuBreakEndTime")); - String friOpenYn = String.valueOf(paramMap.get("friOpenYn")); - String friOpenStartTime = String.valueOf(paramMap.get("friOpenStartTime")); - String friOpenEndTime = String.valueOf(paramMap.get("friOpenEndTime")); - String friBreakStartTime = String.valueOf(paramMap.get("friBreakStartTime")); - String friBreakEndTime = String.valueOf(paramMap.get("friBreakEndTime")); - String satOpenYn = String.valueOf(paramMap.get("satOpenYn")); - String satOpenStartTime = String.valueOf(paramMap.get("satOpenStartTime")); - String satOpenEndTime = String.valueOf(paramMap.get("satOpenEndTime")); - String satBreakStartTime = String.valueOf(paramMap.get("satBreakStartTime")); - String satBreakEndTime = String.valueOf(paramMap.get("satBreakEndTime")); - String sunOpenYn = String.valueOf(paramMap.get("sunOpenYn")); - String sunOpenStartTime = String.valueOf(paramMap.get("sunOpenStartTime")); - String sunOpenEndTime = String.valueOf(paramMap.get("sunOpenEndTime")); - String sunBreakStartTime = String.valueOf(paramMap.get("sunBreakStartTime")); - String sunBreakEndTime = String.valueOf(paramMap.get("sunBreakEndTime")); - String publicHolidayUseYn = String.valueOf(paramMap.get("publicHolidayUseYn")); - - if(true != ValidationCheckUtil.emptyCheck(muHospitalId)){ + String muHospitalId = String.valueOf(paramMap.get("muHospitalId")); + + String monOpenYn = String.valueOf(paramMap.get("monOpenYn")); + String monOpenStartTime = String.valueOf(paramMap.get("monOpenStartTime")); + String monOpenEndTime = String.valueOf(paramMap.get("monOpenEndTime")); + String monBreakStartTime = String.valueOf(paramMap.get("monBreakStartTime")); + String monBreakEndTime = String.valueOf(paramMap.get("monBreakEndTime")); + String tueOpenYn = String.valueOf(paramMap.get("tueOpenYn")); + String tueOpenStartTime = String.valueOf(paramMap.get("tueOpenStartTime")); + String tueOpenEndTime = String.valueOf(paramMap.get("tueOpenEndTime")); + String tueBreakStartTime = String.valueOf(paramMap.get("tueBreakStartTime")); + String tueBreakEndTime = String.valueOf(paramMap.get("tueBreakEndTime")); + String wedOpenYn = String.valueOf(paramMap.get("wedOpenYn")); + String wedOpenStartTime = String.valueOf(paramMap.get("wedOpenStartTime")); + String wedOpenEndTime = String.valueOf(paramMap.get("wedOpenEndTime")); + String wedBreakStartTime = String.valueOf(paramMap.get("wedBreakStartTime")); + String wedBreakEndTime = String.valueOf(paramMap.get("wedBreakEndTime")); + String thuOpenYn = String.valueOf(paramMap.get("thuOpenYn")); + String thuOpenStartTime = String.valueOf(paramMap.get("thuOpenStartTime")); + String thuOpenEndTime = String.valueOf(paramMap.get("thuOpenEndTime")); + String thuBreakStartTime = String.valueOf(paramMap.get("thuBreakStartTime")); + String thuBreakEndTime = String.valueOf(paramMap.get("thuBreakEndTime")); + String friOpenYn = String.valueOf(paramMap.get("friOpenYn")); + String friOpenStartTime = String.valueOf(paramMap.get("friOpenStartTime")); + String friOpenEndTime = String.valueOf(paramMap.get("friOpenEndTime")); + String friBreakStartTime = String.valueOf(paramMap.get("friBreakStartTime")); + String friBreakEndTime = String.valueOf(paramMap.get("friBreakEndTime")); + String satOpenYn = String.valueOf(paramMap.get("satOpenYn")); + String satOpenStartTime = String.valueOf(paramMap.get("satOpenStartTime")); + String satOpenEndTime = String.valueOf(paramMap.get("satOpenEndTime")); + String satBreakStartTime = String.valueOf(paramMap.get("satBreakStartTime")); + String satBreakEndTime = String.valueOf(paramMap.get("satBreakEndTime")); + String sunOpenYn = String.valueOf(paramMap.get("sunOpenYn")); + String sunOpenStartTime = String.valueOf(paramMap.get("sunOpenStartTime")); + String sunOpenEndTime = String.valueOf(paramMap.get("sunOpenEndTime")); + String sunBreakStartTime = String.valueOf(paramMap.get("sunBreakStartTime")); + String sunBreakEndTime = String.valueOf(paramMap.get("sunBreakEndTime")); + String publicHolidayUseYn = String.valueOf(paramMap.get("publicHolidayUseYn")); + + if (true != ValidationCheckUtil.emptyCheck(muHospitalId)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","병원 식별자 정보가 없습니다."); + map.put("msgDesc", "병원 식별자 정보가 없습니다."); } - if(("Y").equals(monOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(monOpenStartTime)){ + if (("Y").equals(monOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(monOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","월요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(monOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","월요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "월요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(monBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(monOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","월요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "월요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(monBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(monBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","월요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "월요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(monBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "월요일 휴게 종료시간 정보가 없습니다."); + } + } else { monOpenYn = "N"; monOpenStartTime = "00:00"; monOpenEndTime = "00:00"; monBreakStartTime = "00:00"; monBreakEndTime = "00:00"; } - - if(("Y").equals(tueOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(tueOpenStartTime)){ + + if (("Y").equals(tueOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(tueOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","화요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(tueOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","화요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "화요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(tueBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(tueOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","화요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "화요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(tueBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(tueBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","화요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "화요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(tueBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "화요일 휴게 종료시간 정보가 없습니다."); + } + } else { tueOpenYn = "N"; tueOpenStartTime = "00:00"; tueOpenEndTime = "00:00"; tueBreakStartTime = "00:00"; tueBreakEndTime = "00:00"; } - - if(("Y").equals(wedOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(wedOpenStartTime)){ + + if (("Y").equals(wedOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(wedOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","수요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(wedOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","수요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "수요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(wedBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(wedOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","수요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "수요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(wedBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(wedBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","수요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "수요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(wedBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "수요일 휴게 종료시간 정보가 없습니다."); + } + } else { wedOpenYn = "N"; wedOpenStartTime = "00:00"; wedOpenEndTime = "00:00"; wedBreakStartTime = "00:00"; wedBreakEndTime = "00:00"; } - - if(("Y").equals(thuOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(thuOpenStartTime)){ + + if (("Y").equals(thuOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(thuOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","목요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(thuOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","목요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "목요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(thuBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(thuOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","목요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "목요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(thuBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(thuBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","목요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "목요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(thuBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "목요일 휴게 종료시간 정보가 없습니다."); + } + } else { thuOpenYn = "N"; thuOpenStartTime = "00:00"; thuOpenEndTime = "00:00"; thuBreakStartTime = "00:00"; thuBreakEndTime = "00:00"; } - - if(("Y").equals(friOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(friOpenStartTime)){ + + if (("Y").equals(friOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(friOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","금요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(friOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","금요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "금요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(friBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(friOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","금요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "금요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(friBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(friBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","금요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "금요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(friBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "금요일 휴게 종료시간 정보가 없습니다."); + } + } else { friOpenYn = "N"; friOpenStartTime = "00:00"; friOpenEndTime = "00:00"; friBreakStartTime = "00:00"; friBreakEndTime = "00:00"; } - - if(("Y").equals(satOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(satOpenStartTime)){ + + if (("Y").equals(satOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(satOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","토요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(satOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","토요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "토요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(satBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(satOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","토요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "토요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(satBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(satBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","토요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "토요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(satBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "토요일 휴게 종료시간 정보가 없습니다."); + } + } else { satOpenYn = "N"; satOpenStartTime = "00:00"; satOpenEndTime = "00:00"; satBreakStartTime = "00:00"; satBreakEndTime = "00:00"; } - - if(("Y").equals(sunOpenYn)){ - if(true != ValidationCheckUtil.emptyCheck(sunOpenStartTime)){ + + if (("Y").equals(sunOpenYn)) { + if (true != ValidationCheckUtil.emptyCheck(sunOpenStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","일요일 운영 시작시간 정보가 없습니다."); - } - - if(true != ValidationCheckUtil.emptyCheck(sunOpenEndTime)){ - check = false; - map.put("msgCode", Constants.FAIL); - map.put("msgDesc","일요일 운영 종료시간 정보가 없습니다."); + map.put("msgDesc", "일요일 운영 시작시간 정보가 없습니다."); } - if(true != ValidationCheckUtil.emptyCheck(sunBreakStartTime)){ + if (true != ValidationCheckUtil.emptyCheck(sunOpenEndTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","일요일 휴게 시작시간 정보가 없습니다."); + map.put("msgDesc", "일요일 운영 종료시간 정보가 없습니다."); } - - if(true != ValidationCheckUtil.emptyCheck(sunBreakEndTime)){ + + if (true != ValidationCheckUtil.emptyCheck(sunBreakStartTime)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","일요일 휴게 종료시간 정보가 없습니다."); + map.put("msgDesc", "일요일 휴게 시작시간 정보가 없습니다."); } - } - else { + + if (true != ValidationCheckUtil.emptyCheck(sunBreakEndTime)) { + check = false; + map.put("msgCode", Constants.FAIL); + map.put("msgDesc", "일요일 휴게 종료시간 정보가 없습니다."); + } + } else { sunOpenYn = "N"; sunOpenStartTime = "00:00"; sunOpenEndTime = "00:00"; sunBreakStartTime = "00:00"; sunBreakEndTime = "00:00"; } - - if(true != ValidationCheckUtil.emptyCheck(publicHolidayUseYn)){ + + if (true != ValidationCheckUtil.emptyCheck(publicHolidayUseYn)) { check = false; map.put("msgCode", Constants.FAIL); - map.put("msgDesc","법정공휴일 반영여부 정보가 없습니다."); + map.put("msgDesc", "법정공휴일 반영여부 정보가 없습니다."); } - - if(true == check){ + + if (true == check) { // 사용자 확인 List> userListMap = webMemberSqlMapDAO.checkMember(paramMap); int userListMapSize = userListMap.size(); - - if(1==userListMapSize){ + + if (1 == userListMapSize) { paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId")); - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "사용자 정보가 올바르지 않습니다."); } } - - if(true == check){ + + if (true == check) { // 권한 조회 HashMap authCheckParamMap = new HashMap(); - authCheckParamMap.put("menuClass",paramMap.get("menuClass")); - authCheckParamMap.put("muAuthId",paramMap.get("menuClassAuthId")); - List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO.selectAuthMenuRelation(authCheckParamMap); + authCheckParamMap.put("menuClass", paramMap.get("menuClass")); + authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId")); + List> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO + .selectAuthMenuRelation(authCheckParamMap); int authMenuRelationlistMapSize = authMenuRelationlistMap.size(); - - if(1==authMenuRelationlistMapSize){ - - if(("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) { - - } - else { + + if (1 == authMenuRelationlistMapSize) { + + if (("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) { + + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "수정 권한 정보가 없습니다."); } - } - else { + } else { check = false; map.put("msgCode", Constants.FAIL); map.put("msgDesc", "권한 정보가 없습니다."); } } - - if(true == check){ + + if (true == check) { paramMap.put("tDate", tDate); paramMap.put("tId", tId); - + webHospitalSqlMapDAO.updateHospital(paramMap); - - // 휴일정보 삭제 - webHospitalHolidaySqlMapDAO.deleteHospitalHoliday(paramMap); - - // 휴일정보 등록 - JSONParser jsonParser = new JSONParser(); - JSONObject jsonObject = (JSONObject) jsonParser.parse(String.valueOf(paramMap.get("holidayRows"))); - JSONArray detailArray = (JSONArray) jsonObject.get("data"); - - for(int j=0; j holidayParamMap = new HashMap(); - String muHospitalHolidayId = ("HH").concat(String.valueOf(System.currentTimeMillis())); - holidayParamMap.put("muHospitalHolidayId",muHospitalHolidayId); - holidayParamMap.put("muHospitalId", paramMap.get("muHospitalId")); - holidayParamMap.put("hospitalHolidayName", hospitalHolidayName); - holidayParamMap.put("locDate", locDate); - holidayParamMap.put("repeatYn", repeatYn); - holidayParamMap.put("regId", paramMap.get("regId")); - holidayParamMap.put("modId", paramMap.get("modId")); - holidayParamMap.put("tId", paramMap.get("tId")); - holidayParamMap.put("tDate", paramMap.get("tDate")); - webHospitalHolidaySqlMapDAO.insertHospitalHoliday(holidayParamMap); - } - } + map.put("msgCode", Constants.OK); map.put("msgDesc", "수정되었습니다."); } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); throw e; } log.debug("WebHospitalServiceImpl updateHospital END"); return map; } + + @Override + public HashMap selectHospitalScheduleDetail(HashMap paramMap) throws Exception { + HashMap map = new HashMap(); + try { + Map result = webHospitalSqlMapDAO.selectHospitalScheduleDetail(paramMap); + + if (result == null) { + // 스케줄이 없으면 휴일 여부 확인 + Map holidayCheck = webHospitalSqlMapDAO.selectHospitalHolidayCheck(paramMap); + if (holidayCheck != null) { + map.put("isHoliday", "Y"); + } + } + + map.put("msgCode", Constants.OK); + map.put("rows", result); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + return map; + } + + @Override + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) + public HashMap saveHospitalSchedule(HashMap paramMap) throws Exception { + HashMap map = new HashMap(); + try { + String muHospitalScheduleId = String.valueOf(paramMap.get("muHospitalScheduleId")); + + if (muHospitalScheduleId == null || muHospitalScheduleId.isEmpty() || "null".equals(muHospitalScheduleId)) { + // 중복 체크 + Map existingSchedule = webHospitalSqlMapDAO.selectHospitalScheduleCheck(paramMap); + + if (existingSchedule != null && existingSchedule.get("muHospitalScheduleId") != null) { + // 이미 존재하면 UPDATE 로 전환 (삭제된 데이터 복구 포함) + paramMap.put("muHospitalScheduleId", existingSchedule.get("muHospitalScheduleId")); + webHospitalSqlMapDAO.updateHospitalSchedule(paramMap); + } else { + webHospitalSqlMapDAO.insertHospitalSchedule(paramMap); + } + } else { + webHospitalSqlMapDAO.updateHospitalSchedule(paramMap); + } + map.put("msgCode", Constants.OK); + map.put("msgDesc", "저장되었습니다."); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + return map; + } + + @Override + @Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW) + public HashMap deleteHospitalSchedule(HashMap paramMap) throws Exception { + HashMap map = new HashMap(); + try { + webHospitalSqlMapDAO.deleteHospitalSchedule(paramMap); + map.put("msgCode", Constants.OK); + map.put("msgDesc", "삭제되었습니다."); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + return map; + } + + /** + * 병원 지정 휴일 개별 저장 (insert or update) + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class }) + public HashMap saveHospitalHoliday(HashMap paramMap) throws Exception { + log.debug("WebHospitalServiceImpl saveHospitalHoliday START"); + HashMap map = new HashMap<>(); + try { + String muHospitalHolidayId = String.valueOf(paramMap.get("muHospitalHolidayId")); + if (muHospitalHolidayId != null && !muHospitalHolidayId.isEmpty() && !"null".equals(muHospitalHolidayId)) { + // 기존 row 수정 + webHospitalHolidaySqlMapDAO.updateHospitalHoliday(paramMap); + } else { + // 신규 row 등록 + paramMap.put("muHospitalHolidayId", "HH"); + webHospitalHolidaySqlMapDAO.insertHospitalHoliday(paramMap); + } + map.put("msgCode", Constants.OK); + map.put("msgDesc", "저장되었습니다."); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + log.debug("WebHospitalServiceImpl saveHospitalHoliday END"); + return map; + } + + /** + * 병원 지정 휴일 선택 삭제 (체크된 row 일괄 삭제) + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class }) + public HashMap deleteHospitalHolidays(HashMap paramMap) throws Exception { + log.debug("WebHospitalServiceImpl deleteHospitalHolidays START"); + HashMap map = new HashMap<>(); + try { + String holidayIds = String.valueOf(paramMap.get("holidayIds")); + if (holidayIds != null && !holidayIds.isEmpty() && !"null".equals(holidayIds)) { + String[] ids = holidayIds.split(","); + for (String id : ids) { + HashMap delMap = new HashMap<>(); + delMap.put("muHospitalId", paramMap.get("muHospitalId")); + delMap.put("muHospitalHolidayId", id.trim()); + delMap.put("modId", paramMap.get("modId")); + webHospitalHolidaySqlMapDAO.deleteHospitalHoliday(delMap); + } + } + map.put("msgCode", Constants.OK); + map.put("msgDesc", "삭제되었습니다."); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + log.debug("WebHospitalServiceImpl deleteHospitalHolidays END"); + return map; + } } diff --git a/src/main/resources/mappers/WebHospitalHolidaySqlMap.xml b/src/main/resources/mappers/WebHospitalHolidaySqlMap.xml index ae91519..c2bc216 100644 --- a/src/main/resources/mappers/WebHospitalHolidaySqlMap.xml +++ b/src/main/resources/mappers/WebHospitalHolidaySqlMap.xml @@ -81,6 +81,7 @@ ,USE_YN = 'N' WHERE USE_YN = 'Y' AND MU_HOSPITAL_ID = #{muHospitalId} + AND MU_HOSPITAL_HOLIDAY_ID = #{muHospitalHolidayId} \ No newline at end of file diff --git a/src/main/resources/mappers/WebHospitalSqlMap.xml b/src/main/resources/mappers/WebHospitalSqlMap.xml index 77f04af..72e157c 100644 --- a/src/main/resources/mappers/WebHospitalSqlMap.xml +++ b/src/main/resources/mappers/WebHospitalSqlMap.xml @@ -5,6 +5,7 @@ @@ -136,7 +166,11 @@ FROM T_TEMP_DATES WHERE RESULT_DATE < #{endDate} ) - SELECT TTD.OPEN_YN AS "openYn" + SELECT + CASE + WHEN MHS.OPEN_YN IS NOT NULL THEN MHS.OPEN_YN + ELSE TTD.OPEN_YN + END AS "openYn" ,TTD.HOLIDAY_YN AS "holidayYn" FROM ( SELECT TTD.RESULT_DATE AS RESULT_DATE @@ -160,21 +194,20 @@ END AS OPEN_YN ,CASE WHEN EXISTS( - SELECT 1 - FROM MU_HOSPITAL_HOLIDAY AS MH - WHERE MH.USE_YN = 'Y' - AND ((MH.REPEAT_YN = 'Y' AND DATE_FORMAT(MH.LOC_DATE, '%m-%d') = DATE_FORMAT(TTD.RESULT_DATE, '%m-%d')) - OR - (MH.REPEAT_YN = 'N' AND MH.LOC_DATE = TTD.RESULT_DATE)) - ) - OR EXISTS( - SELECT 1 - FROM MU_PUBLIC_HOLIDAY AS MPH - JOIN MU_HOSPITAL - ON PUBLIC_HOLIDAY_USE_YN='Y' - WHERE MPH.USE_YN = 'Y' - AND MPH.LOC_DATE = TTD.RESULT_DATE + SELECT 1 + FROM MU_HOSPITAL_HOLIDAY AS MHH + WHERE MHH.USE_YN = 'Y' + AND MHH.MU_HOSPITAL_ID = MH.MU_HOSPITAL_ID + AND ((MHH.REPEAT_YN = 'Y' AND DATE_FORMAT(MHH.LOC_DATE, '%m-%d') = DATE_FORMAT(TTD.RESULT_DATE, '%m-%d')) + OR + (MHH.REPEAT_YN = 'N' AND MHH.LOC_DATE = TTD.RESULT_DATE)) ) + OR (MH.PUBLIC_HOLIDAY_USE_YN = 'Y' AND EXISTS( + SELECT 1 + FROM MU_PUBLIC_HOLIDAY AS MPH + WHERE MPH.USE_YN = 'Y' + AND MPH.LOC_DATE = TTD.RESULT_DATE + )) THEN 'Y' ELSE 'N' END AS HOLIDAY_YN @@ -185,32 +218,139 @@ ORDER BY TTD.RESULT_DATE ASC ) AS TTD LEFT JOIN MU_HOSPITAL AS MH - ON 1 = 1 + ON MH.USE_YN = 'Y' + + AND MH.CENTER_DIV_CD = #{centerDivCd} + ) AS TTD + LEFT JOIN MU_HOSPITAL_SCHEDULE MHS + ON MHS.SCHEDULE_DATE = TTD.RESULT_DATE + AND MHS.USE_YN = 'Y' + + + + + + + + INSERT INTO MU_HOSPITAL_SCHEDULE ( + MU_HOSPITAL_SCHEDULE_ID, MU_HOSPITAL_ID, SCHEDULE_DATE, OPEN_YN, + OPEN_START_TIME, OPEN_END_TIME, BREAK_START_TIME, BREAK_END_TIME, + WRITE_DATE, WRITE_TIME, CUD_FLAG, USE_YN, REG_ID, MOD_ID, + REG_DATE, MOD_DATE + ) VALUES ( + (SELECT CONCAT('S', DATE_FORMAT(NOw(), '%y%m%d%H%i%s%f'), LPAD(NEXT_NOT_CACHED_VALUE, 9, '0')) + FROM MU_HOSPITAL_SCHEDULE_SEQ), + #{muHospitalId}, #{scheduleDate}, #{openYn}, + #{openStartTime}, #{openEndTime}, #{breakStartTime}, #{breakEndTime}, + CURDATE(), CURTIME(), 'C', 'Y', #{regId}, #{modId}, + NOW(),NOW() + ) + + + + UPDATE MU_HOSPITAL_SCHEDULE + SET OPEN_YN = #{openYn}, + OPEN_START_TIME = #{openStartTime}, + OPEN_END_TIME = #{openEndTime}, + BREAK_START_TIME = #{breakStartTime}, + BREAK_END_TIME = #{breakEndTime}, + USE_YN = 'Y', + MOD_ID = #{modId}, + MOD_DATE = NOW(), + CUD_FLAG = 'U' + WHERE MU_HOSPITAL_SCHEDULE_ID = #{muHospitalScheduleId} + + + + UPDATE MU_HOSPITAL_SCHEDULE + SET USE_YN = 'N', + CUD_FLAG = 'D', + MOD_ID = #{modId}, + MOD_DATE = NOW() + WHERE MU_HOSPITAL_SCHEDULE_ID = #{muHospitalScheduleId} + + UPDATE MU_HOSPITAL SET MOD_ID = #{modId} @@ -255,4 +395,5 @@ WHERE USE_YN = 'Y' AND MU_HOSPITAL_ID = #{muHospitalId} + \ No newline at end of file diff --git a/src/main/resources/mappers/WebMainBannerSqlMap.xml b/src/main/resources/mappers/WebMainBannerSqlMap.xml index d602441..d1e3692 100644 --- a/src/main/resources/mappers/WebMainBannerSqlMap.xml +++ b/src/main/resources/mappers/WebMainBannerSqlMap.xml @@ -9,10 +9,7 @@ AND MWMB.BANNER_TYPE = #{webMainBannerSearchType} - - AND DATE_FORMAT(MWMB.WRITE_DATE, '%Y-%m-%d') >= #{webMainBannerSearchStartDate} - AND DATE_FORMAT(MWMB.WRITE_DATE, '%Y-%m-%d') <= #{webMainBannerSearchEndDate} - + AND MWMB.TITLE LIKE CONCAT('%',TRIM(#{webMainBannerSearchKeywordParam}),'%') @@ -57,10 +54,7 @@ AND MWMB.BANNER_TYPE = #{webMainBannerSearchType} - - AND DATE_FORMAT(MWMB.WRITE_DATE, '%Y-%m-%d') >= #{webMainBannerSearchStartDate} - AND DATE_FORMAT(MWMB.WRITE_DATE, '%Y-%m-%d') <= #{webMainBannerSearchEndDate} - + AND MWMB.TITLE LIKE CONCAT('%',TRIM(#{webMainBannerSearchKeywordParam}),'%') diff --git a/src/main/resources/mappers/WebTreatmentDietSqlMap.xml b/src/main/resources/mappers/WebTreatmentDietSqlMap.xml index 5d50911..4ccce61 100644 --- a/src/main/resources/mappers/WebTreatmentDietSqlMap.xml +++ b/src/main/resources/mappers/WebTreatmentDietSqlMap.xml @@ -332,7 +332,7 @@ ,MTP.MU_TREATMENT_PROCEDURE_ID AS "treatmentProcedureId" ,MTP.MU_TREATMENT_ID AS "treatmentId" ,MTP.TREATMENT_PROCEDURE_NAME AS "treatmentNm" - ,MTPP.PRICE AS "price" + ,(MTPP.PRICE + MTPP.VAT) AS "price" ,IFNULL(MTPP.DISCOUNT_PRICE, 0) AS "discountPrice" FROM MU_TREATMENT_PROCEDURE AS MTP LEFT OUTER JOIN MU_TREATMENT_PROCEDURE_PRICE MTPP ON MTP.MU_TREATMENT_PROCEDURE_ID = MTPP.MU_TREATMENT_PROCEDURE_ID diff --git a/src/main/resources/mappers/crm/callLog/CallLogSql.xml b/src/main/resources/mappers/crm/callLog/CallLogSql.xml new file mode 100644 index 0000000..f9c54ca --- /dev/null +++ b/src/main/resources/mappers/crm/callLog/CallLogSql.xml @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + SELECT CONCAT('CTXT', LPAD(IFNULL(MAX(CAST(SUBSTRING(MU_CTI_TEXT_ID, 5) AS UNSIGNED)), 0) + 1, 11, '0')) + FROM MU_CTI_TEXT + + /** CallLogMAP.saveCallMemo **/ + INSERT INTO MU_CTI_TEXT ( + MU_CTI_TEXT_ID + ,RECORD_NO + ,CALL_MSG + ,USE_YN + ,CUD_FLAG + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + ) VALUES ( + #{muCtiTextId} + ,#{recordNo} + ,#{callMsg} + ,'Y' + ,'C' + ,#{loginMemberId} + ,NOW() + ,#{loginMemberId} + ,NOW() + ) + + + + + /** CallLogMAP.modCallMemo **/ + UPDATE MU_CTI_TEXT + SET CALL_MSG = #{callMsg} + ,CUD_FLAG = 'U' + ,MOD_ID = #{loginMemberId} + ,MOD_DATE = NOW() + WHERE RECORD_NO = #{recordNo} + AND USE_YN = 'Y' + + + + + + SELECT CONCAT('CLOG', LPAD(IFNULL(MAX(CAST(SUBSTRING(MU_CTI_LOG_ID, 5) AS UNSIGNED)), 0) + 1, 11, '0')) + FROM MU_CTI_LOG + + /** CallLogMAP.putCtiLog **/ + INSERT INTO MU_CTI_LOG ( + MU_CTI_LOG_ID + ,RECORD_NO + ,CID + ,FULLDNIS + ,BOUND + ,MENU_NO + ,STATE_TYPE + ,CTI_STEP + ,LOGINCID + ,C_TYPE1 + ,C_TYPE2 + ,CRM_MB_PID + ,STORE_PID + ,INCALL_SEL + ,USE_YN + ,CUD_FLAG + ,REG_DATE + ,MOD_DATE + ) VALUES ( + #{muCtiLogId} + ,#{recordNo} + ,#{cid} + ,#{fulldnis} + ,#{bound} + ,#{menuNo} + ,#{stateType} + ,#{ctiStep} + ,#{logincid} + ,#{cType1} + ,#{cType2} + ,#{crmMbPid} + ,#{storePid} + ,#{incallSel} + ,'Y' + ,'C' + ,NOW() + ,NOW() + ) + + + + + /** CallLogMAP.modCtiLogMember **/ + UPDATE MU_CTI_LOG + SET STORE_PID = #{storePid} + ,CRM_MB_PID = #{crmMbPid} + ,MOD_DATE = NOW() + WHERE RECORD_NO = #{recordNo} + AND USE_YN = 'Y' + + + diff --git a/src/main/resources/mappers/crm/contentsBbs/ContentsBbsSql.xml b/src/main/resources/mappers/crm/contentsBbs/ContentsBbsSql.xml index 4de462a..b9202d8 100644 --- a/src/main/resources/mappers/crm/contentsBbs/ContentsBbsSql.xml +++ b/src/main/resources/mappers/crm/contentsBbs/ContentsBbsSql.xml @@ -12,15 +12,12 @@ AND HC.CATEGORY_NO = HCB.CATEGORY_NO AND HCB.USE_YN = 'Y' AND HCB.CATEGORY_DIV_CD = #{categoryDivCd} - - AND HCB.CATEGORY_NM LIKE CONCAT('%', #{categoryNm}, '%') + + AND HC.CATEGORY_NO = #{searchCategoryNo} AND HCB.TITLE LIKE CONCAT('%', #{title}, '%') - - AND MM.NAME = #{regNm} - ) total @@ -38,8 +35,11 @@ ,HC.CATEGORY_NO ,HCB.THUMBNAIL_BOTTOM_TXT ,HCB.HASHTAG + ,HCB.ORD_NO ,DATE_FORMAT(HCB.REG_DATE, '%Y-%m-%d') as REG_DT ,MM.NAME as REG_NM + ,DATE_FORMAT(HCB.EVENT_START_DT, '%Y-%m-%d') as START_DT + ,DATE_FORMAT(HCB.EVENT_END_DT, '%Y-%m-%d') as END_DT FROM HP_CATEGORY HC, HP_CONTENTS_BBS HCB, (SELECT * FROM MU_MEMBER WHERE USE_YN = 'Y') MM @@ -49,21 +49,18 @@ AND HCB.USE_YN = 'Y' AND HC.USE_YN = 'Y' AND HCB.CATEGORY_DIV_CD = #{categoryDivCd} - - AND HCB.CATEGORY_NM LIKE CONCAT('%', #{categoryNm}, '%') + + AND HC.CATEGORY_NO = #{searchCategoryNo} AND HCB.TITLE LIKE CONCAT('%', #{title}, '%') - - AND MM.NAME = #{regNm} - ORDER BY ${webTreatmentPetitSort} - ORDER BY CATEGORY_NO, POST_NO ASC + ORDER BY HCB.ORD_NO DESC LIMIT 18446744073709551615 @@ -85,7 +82,9 @@ ,HAF2.FILE_PATH as THUMBNAIL_IMG_PATH ,HAF.FILE_PATH as CONTENT_IMG_PATH ,HCB.OLD_CRM_ITEM_ID - ,HCB.ORD_NO + ,HCB.ORD_NO + ,DATE_FORMAT(HCB.EVENT_START_DT, '%Y-%m-%d') as START_DT + ,DATE_FORMAT(HCB.EVENT_END_DT, '%Y-%m-%d') as END_DT FROM HP_CONTENTS_BBS AS HCB LEFT OUTER JOIN HP_ATTACH_FILE HAF ON HAF.ATTACHFILE_ID = HCB.CONTENTS_ATTACHFILE_ID LEFT OUTER JOIN HP_ATTACH_FILE HAF2 ON HAF2.ATTACHFILE_ID = HCB.THUMBNAIL_ATTACHFILE_ID @@ -103,7 +102,7 @@ ,HCBP.MU_TREATMENT_ID ,HCBP.MU_TREATMENT_PROCEDURE_ID ,MTP.TREATMENT_PROCEDURE_NAME - ,MTPP.PRICE + ,MTPP.PRICE + MTPP.VAT as PRICE ,IFNULL(MTPP.DISCOUNT_PRICE, 0) as DISCOUNT_PRICE FROM HP_CONTENTS_BBS_PROCEDURE AS HCBP LEFT OUTER JOIN MU_TREATMENT_PROCEDURE MTP ON HCBP.MU_TREATMENT_ID = MTP.MU_TREATMENT_ID AND HCBP.MU_TREATMENT_PROCEDURE_ID = MTP.MU_TREATMENT_PROCEDURE_ID @@ -141,6 +140,8 @@ ,MOD_DATE ,OLD_CRM_ITEM_ID ,ORD_NO + ,EVENT_START_DT + ,EVENT_END_DT )VALUES( #{categoryDivCd} ,#{categoryNo} @@ -160,6 +161,8 @@ ,(SELECT MAX(ORD_NO) + 1 FROM HP_CONTENTS_BBS as TEMP WHERE CATEGORY_DIV_CD = #{categoryDivCd} AND CATEGORY_NO = #{categoryNo}) + ,NULLIF(#{eventStartDt}, '') + ,NULLIF(#{eventEndDt}, '') ) @@ -264,6 +267,8 @@ ,CONTENT = #{content} ,THUMBNAIL_BOTTOM_TXT = #{thumbnailBottomTxt} ,HASHTAG = #{hashtag} + ,EVENT_START_DT = NULLIF(#{eventStartDt}, '') + ,EVENT_END_DT = NULLIF(#{eventEndDt}, '') ,THUMBNAIL_ATTACHFILE_ID = #{thumbnailAttachfileId} @@ -305,4 +310,16 @@ AND HC.CATEGORY_DIV_CD = #{categoryDivCd} ORDER BY HC.CATEGORY_NO ASC + + + /** ContentsBbsSql.updateContentsBbsOrdNo **/ + UPDATE HP_CONTENTS_BBS + SET ORD_NO = #{ordNo} + ,MOD_ID = #{modId} + ,MOD_DATE = NOW() + WHERE USE_YN = 'Y' + AND CATEGORY_DIV_CD = #{categoryDivCd} + AND CATEGORY_NO = #{categoryNo} + AND POST_NO = #{postNo} + \ No newline at end of file diff --git a/src/main/resources/mappers/crm/smsTemplate/SmsTemplateSql.xml b/src/main/resources/mappers/crm/smsTemplate/SmsTemplateSql.xml new file mode 100644 index 0000000..d167c9e --- /dev/null +++ b/src/main/resources/mappers/crm/smsTemplate/SmsTemplateSql.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + SELECT CONCAT('SMST', LPAD(IFNULL(MAX(CAST(SUBSTRING(MU_SMS_TEMPLATE_ID, 5) AS UNSIGNED)), 0) + 1, 11, '0')) + FROM MU_SMS_TEMPLATE + + /** SmsTemplateMAP.putSmsTemplate **/ + INSERT INTO MU_SMS_TEMPLATE ( + MU_SMS_TEMPLATE_ID + ,TITLE + ,CONTENT + ,USE_YN + ,CUD_FLAG + ,REG_ID + ,REG_DATE + ,MOD_ID + ,MOD_DATE + ) VALUES ( + #{muSmsTemplateId} + ,#{title} + ,#{content} + ,'Y' + ,'C' + ,#{loginMemberId} + ,NOW() + ,#{loginMemberId} + ,NOW() + ) + + + + + /** SmsTemplateMAP.modSmsTemplate **/ + UPDATE MU_SMS_TEMPLATE + SET TITLE = #{title} + ,CONTENT = #{content} + ,CUD_FLAG = 'U' + ,MOD_ID = #{loginMemberId} + ,MOD_DATE = NOW() + WHERE USE_YN = 'Y' + AND MU_SMS_TEMPLATE_ID = #{muSmsTemplateId} + + + + + /** SmsTemplateMAP.delSmsTemplate **/ + UPDATE MU_SMS_TEMPLATE + SET USE_YN = 'N' + ,CUD_FLAG = 'D' + ,MOD_ID = #{loginMemberId} + ,MOD_DATE = NOW() + WHERE USE_YN = 'Y' + AND MU_SMS_TEMPLATE_ID = #{muSmsTemplateId} + + + diff --git a/src/main/resources/sql/center_div_migration.sql b/src/main/resources/sql/center_div_migration.sql new file mode 100644 index 0000000..ede2aa0 --- /dev/null +++ b/src/main/resources/sql/center_div_migration.sql @@ -0,0 +1,38 @@ +-- ================================================================ +-- 센터구분(CENTER_DIV_CD) 컬럼 추가 및 쁘띠센터 행 생성 마이그레이션 +-- ================================================================ + +-- 1. 센터구분 컬럼 추가 +ALTER TABLE MU_HOSPITAL ADD COLUMN CENTER_DIV_CD VARCHAR(10) DEFAULT 'DIET' COMMENT '센터구분(DIET/PETIT)' AFTER HOSPITAL_NAME; + +-- 2. 기존 행을 다이어트센터로 설정 +UPDATE MU_HOSPITAL SET CENTER_DIV_CD = 'DIET' WHERE USE_YN = 'Y'; + +-- 3. 쁘띠센터 행 생성 (기존 다이어트 운영시간을 복사, 운영시간은 별도 설정 필요) +INSERT INTO MU_HOSPITAL ( + MU_HOSPITAL_ID, HOSPITAL_NAME, CENTER_DIV_CD, + MON_OPEN_YN, MON_OPEN_START_TIME, MON_OPEN_END_TIME, MON_BREAK_START_TIME, MON_BREAK_END_TIME, + TUE_OPEN_YN, TUE_OPEN_START_TIME, TUE_OPEN_END_TIME, TUE_BREAK_START_TIME, TUE_BREAK_END_TIME, + WED_OPEN_YN, WED_OPEN_START_TIME, WED_OPEN_END_TIME, WED_BREAK_START_TIME, WED_BREAK_END_TIME, + THU_OPEN_YN, THU_OPEN_START_TIME, THU_OPEN_END_TIME, THU_BREAK_START_TIME, THU_BREAK_END_TIME, + FRI_OPEN_YN, FRI_OPEN_START_TIME, FRI_OPEN_END_TIME, FRI_BREAK_START_TIME, FRI_BREAK_END_TIME, + SAT_OPEN_YN, SAT_OPEN_START_TIME, SAT_OPEN_END_TIME, SAT_BREAK_START_TIME, SAT_BREAK_END_TIME, + SUN_OPEN_YN, SUN_OPEN_START_TIME, SUN_OPEN_END_TIME, SUN_BREAK_START_TIME, SUN_BREAK_END_TIME, + PUBLIC_HOLIDAY_USE_YN, MU_MEMBER_ID, + WRITE_DATE, WRITE_TIME, CUD_FLAG, USE_YN, REG_ID, REG_DATE, MOD_ID, MOD_DATE +) +SELECT + CONCAT(LEFT(MU_HOSPITAL_ID, 24), '2'), -- 새 ID 생성 + HOSPITAL_NAME, 'PETIT', + MON_OPEN_YN, MON_OPEN_START_TIME, MON_OPEN_END_TIME, MON_BREAK_START_TIME, MON_BREAK_END_TIME, + TUE_OPEN_YN, TUE_OPEN_START_TIME, TUE_OPEN_END_TIME, TUE_BREAK_START_TIME, TUE_BREAK_END_TIME, + WED_OPEN_YN, WED_OPEN_START_TIME, WED_OPEN_END_TIME, WED_BREAK_START_TIME, WED_BREAK_END_TIME, + THU_OPEN_YN, THU_OPEN_START_TIME, THU_OPEN_END_TIME, THU_BREAK_START_TIME, THU_BREAK_END_TIME, + FRI_OPEN_YN, FRI_OPEN_START_TIME, FRI_OPEN_END_TIME, FRI_BREAK_START_TIME, FRI_BREAK_END_TIME, + SAT_OPEN_YN, SAT_OPEN_START_TIME, SAT_OPEN_END_TIME, SAT_BREAK_START_TIME, SAT_BREAK_END_TIME, + SUN_OPEN_YN, SUN_OPEN_START_TIME, SUN_OPEN_END_TIME, SUN_BREAK_START_TIME, SUN_BREAK_END_TIME, + PUBLIC_HOLIDAY_USE_YN, MU_MEMBER_ID, + CURDATE(), CURTIME(), 'C', 'Y', 'SYSTEM', NOW(), 'SYSTEM', NOW() +FROM MU_HOSPITAL +WHERE USE_YN = 'Y' AND CENTER_DIV_CD = 'DIET' +LIMIT 1; diff --git a/src/main/resources/sql/hospital_schedule_migration.sql b/src/main/resources/sql/hospital_schedule_migration.sql new file mode 100644 index 0000000..b62b313 --- /dev/null +++ b/src/main/resources/sql/hospital_schedule_migration.sql @@ -0,0 +1,36 @@ +CREATE TABLE `MU_HOSPITAL_SCHEDULE` ( + `MU_HOSPITAL_SCHEDULE_ID` varchar(25) NOT NULL COMMENT '병원 스케줄 식별자', + `MU_HOSPITAL_ID` varchar(25) NOT NULL COMMENT '병원 식별자', + `SCHEDULE_DATE` date NOT NULL COMMENT '스케줄 날짜', + `OPEN_YN` char(1) NOT NULL DEFAULT 'Y' COMMENT '운영여부 (Y/N)', + `OPEN_START_TIME` varchar(5) DEFAULT NULL COMMENT '운영 시작시간 (HH:mm)', + `OPEN_END_TIME` varchar(5) DEFAULT NULL COMMENT '운영 종료시간 (HH:mm)', + `BREAK_START_TIME` varchar(5) DEFAULT NULL COMMENT '휴게 시작시간 (HH:mm)', + `BREAK_END_TIME` varchar(5) DEFAULT NULL COMMENT '휴게 종료시간 (HH:mm)', + `WRITE_DATE` date NOT NULL COMMENT '작성일자', + `WRITE_TIME` time NOT NULL COMMENT '작성시간', + `REMARK` text DEFAULT NULL COMMENT '비고', + `CUD_FLAG` char(1) DEFAULT 'C' COMMENT '작업타입', + `USE_YN` char(1) NOT NULL DEFAULT 'Y' COMMENT '사용여부', + `REG_ID` varchar(25) NOT NULL COMMENT '등록자', + `REG_DATE` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '등록일시', + `MOD_ID` varchar(25) NOT NULL COMMENT '수정자', + `MOD_DATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '수정일시', + `T_ID` varchar(13) DEFAULT NULL, + `T_DATE` datetime DEFAULT NULL, + PRIMARY KEY (`MU_HOSPITAL_SCHEDULE_ID`), + UNIQUE KEY `UK_HOSPITAL_DATE` (`MU_HOSPITAL_ID`, `SCHEDULE_DATE`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='병원별 날짜별 운영 스케줄 (예외처리)'; + +CREATE TABLE `MU_HOSPITAL_SCHEDULE_SEQ` ( + `next_not_cached_value` bigint(21) NOT NULL, + `minimum_value` bigint(21) NOT NULL, + `maximum_value` bigint(21) NOT NULL, + `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', + `increment` bigint(21) NOT NULL COMMENT 'increment value', + `cache_size` bigint(21) unsigned NOT NULL, + `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', + `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' +) ENGINE=InnoDB SEQUENCE=1; + +INSERT INTO `MU_HOSPITAL_SCHEDULE_SEQ` VALUES (1,1,9999999999,1,1,0,1,0); diff --git a/src/main/resources/static/css/web/ContentsBbsReg.css b/src/main/resources/static/css/web/ContentsBbsReg.css index 20cb861..1af56b1 100644 --- a/src/main/resources/static/css/web/ContentsBbsReg.css +++ b/src/main/resources/static/css/web/ContentsBbsReg.css @@ -1,37 +1,170 @@ -.project_wrap {width:100%; min-width:1080px; margin:0 auto;} +.project_wrap { + width: 100%; + min-width: 1080px; + margin: 0 auto; +} /*오른쪽영역*/ -.project_wrap .content_section {margin-top:50px; width:100%; min-width:1080px; display:table;} -.project_wrap .content_section .hospital_wrap {width: calc(100% - 72px); min-width:calc(1080px - 72px); height:calc(100vh - 50px); float:left; position:relative;} +.project_wrap .content_section { + margin-top: 50px; + width: 100%; + min-width: 1080px; + display: table; +} + +.project_wrap .content_section .hospital_wrap { + width: calc(100% - 72px); + min-width: calc(1080px - 72px); + height: calc(100vh - 50px); + float: left; + position: relative; +} /* 왼쪽_메뉴 영역 */ -.project_wrap .content_section .hospital_wrap .left_box {position:absolute; width:240px; height:calc(100vh - 50px); overflow:auto; padding:10px 20px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list {width:100%;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu {width:100%; height:auto; margin:20px 0 10px 0; padding:0; font-size:14px; font-weight:700;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first {margin-top:0;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a {width:100%; height:100%; display:block; margin-bottom:8px; padding:8px; font-size:14px; text-align:left; border-radius:5px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on {background:#3985EA; border:none;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li {width:100%; height:36px; margin-bottom:8px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on {color:#fff;} +.project_wrap .content_section .hospital_wrap .left_box { + position: absolute; + width: 240px; + height: calc(100vh - 50px); + overflow: auto; + padding: 10px 20px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list { + width: 100%; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + width: 100%; + height: auto; + margin: 20px 0 10px 0; + padding: 0; + font-size: 14px; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first { + margin-top: 0; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a { + width: 100%; + height: 100%; + display: block; + margin-bottom: 8px; + padding: 8px; + font-size: 14px; + text-align: left; + border-radius: 5px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on { + background: #3985EA; + border: none; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + width: 100%; + height: 36px; + margin-bottom: 8px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on { + color: #fff; +} /* 센터쪽 */ -.project_wrap .content_section .hospital_wrap .center_box {width:calc(100% - 240px); height:calc(100vh - 50px); position:absolute; left:240px; padding:10px 10px 10px 0;} -.project_wrap .content_section .hospital_wrap .center_box .page_title {min-width:90px; padding-left:10px; font-size:18px; font-weight:700; line-height:50px; float:left;} -.consultation-info input { width:80%; height:36px; padding:0 10px; border:1px solid #E9ECF0; border-radius:5px;} -.consultation-info input input::placeholder {color:#B5BDC4;} -.consultation-info label {padding-left: 10px;} -.consultation-info input[type="checkbox"] {width: 15px; height:15px; padding:0 10px; border:1px solid #E9ECF0; border-radius:5px;} -.consultation-info input[type="checkbox"] input::placeholder {color:#B5BDC4;} -.consultation-info select {width:80%; height:36px; padding:0 10px; border:1px solid #E9ECF0; border-radius:5px;} -.consultation-info textarea { width:80%; padding:10px; border:1px solid #E9ECF0; border-radius:5px; resize:none; } -.consultation-info textarea::placeholder {color:#B5BDC4;} -.wp60 input { width:80%; height:36px; padding:0 10px; border:1px solid #E9ECF0; border-radius:5px;} -.wp60 input input::placeholder {color:#B5BDC4;} -.wp60 textarea { width:80%; padding:10px; border:1px solid #E9ECF0; border-radius:5px; resize:none; } -.wp60 textarea::placeholder {color:#B5BDC4;} -.content{ - width: 100%; +.project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 240px); + height: calc(100vh - 50px); + position: absolute; + left: 240px; + padding: 10px 10px 10px 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 90px; + padding-left: 10px; + font-size: 18px; + font-weight: 700; + line-height: 50px; + float: left; +} + +.consultation-info input { + width: 80%; + height: 36px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.consultation-info input input::placeholder { + color: #B5BDC4; +} + +.consultation-info label { + padding-left: 10px; +} + +.consultation-info input[type="checkbox"] { + width: 15px; + height: 15px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.consultation-info input[type="checkbox"] input::placeholder { + color: #B5BDC4; +} + +.consultation-info select { + width: 80%; + height: 36px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.consultation-info textarea { + width: 80%; + padding: 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; + resize: none; +} + +.consultation-info textarea::placeholder { + color: #B5BDC4; +} + +.wp60 input { + width: 80%; + height: 36px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.wp60 input input::placeholder { + color: #B5BDC4; +} + +.wp60 textarea { + width: 80%; + padding: 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; + resize: none; +} + +.wp60 textarea::placeholder { + color: #B5BDC4; +} + +.content { + width: 100%; height: 100%; padding: 20px; border: solid 1px #E9ECF0; @@ -40,32 +173,52 @@ background: #fff; float: left; } + /* content_box */ -.project_wrap .content_section .hospital_wrap .center_box .content_box { width:100%; height:calc(100% - 50px); padding-top:20px; display:table; } -.add_btn{ - width:24px; - height:24px; - padding-left: 0px; +.project_wrap .content_section .hospital_wrap .center_box .content_box { + width: 100%; + height: calc(100% - 50px); + padding-top: 20px; + display: table; +} + +.add_btn { + width: 24px; + height: 24px; + padding-left: 0px; padding-right: 0px; padding-top: 0px; margin-top: 0px; - line-height:0px !important; + line-height: 0px !important; } -.ml50{ - margin-left:50%; + +.ml50 { + margin-left: 50%; } -.button_box button { width:70px; font-size:12px; height:32px; border-radius: 16px;} -.button_box button.cancel_btn {background: #F8FBFF;} + +.button_box button { + width: 70px; + font-size: 12px; + height: 32px; + border-radius: 16px; +} + +.button_box button.cancel_btn { + background: #F8FBFF; +} + .button_box button.registration_btn { - margin-left: 10px; + margin-left: 10px; color: #fff; background: #3985EA; } + .button_box { - width:100%; - margin-top: 30px; - margin-left:56%; + width: 100%; + margin-top: 30px; + margin-left: 56%; } + .fix_area { min-width: 1200px; width: 1200px; @@ -74,10 +227,10 @@ } .btn-basic { - width:120px; - height:40px; + width: 120px; + height: 40px; border: 1px solid #a73439; - border-radius:5px; + border-radius: 5px; background-color: white; color: #a73439; } @@ -92,12 +245,12 @@ } -.clear > .right { +.clear>.right { float: right; } -.clear > .left{ - float:left; +.clear>.left { + float: left; } .main-img-size { @@ -108,6 +261,7 @@ border-radius: 0.25rem; text-align: center; } + .img_center img { position: absolute; top: 50%; @@ -122,7 +276,7 @@ padding-top: 15px; } -.thumbnail-bottom-txt > span { +.thumbnail-bottom-txt>span { display: block; color: #6c696a; font-size: 13.5px; @@ -131,15 +285,17 @@ .content>.wp60 { width: 60%; } + .content>.wp40 { width: 40%; } -.wp10{ - width:10%; +.wp10 { + width: 10%; } -.wp90{ - width:90%; + +.wp90 { + width: 90%; } @@ -147,12 +303,13 @@ float: left; } -.consultation-info h2{ - font-size: 4rem; +.consultation-info h2 { + font-size: 4rem; } -.consultation-info p{ - margin-top: 2rem; - font-size:2rem; + +.consultation-info p { + margin-top: 2rem; + font-size: 2rem; } @@ -162,30 +319,31 @@ margin-top: 3rem; margin-bottom: 1rem; } + .price-area .border-line { height: 1px; background-color: #ddd; } -.hashtag_list{ - padding: 1rem 0 1.5rem; +.hashtag_list { + padding: 1rem 0 1.5rem; } -.hashtag_list span{ - font-size:1.6rem; - color:#a94442; +.hashtag_list span { + font-size: 1.6rem; + color: #a94442; } -.procedure-area>.procedure_select_txt{ +.procedure-area>.procedure_select_txt { float: left; width: 7rem; line-height: 1.5; padding-top: 0.375rem; } -.procedure-area > .dropdown_area { +.procedure-area>.dropdown_area { float: right; width: calc(100% - 7rem); } @@ -218,7 +376,7 @@ display: none; overflow: hidden; position: relative; - z-index:1; + z-index: 1; } .select_procedure_div.active .option_scrl_wrap { @@ -263,10 +421,11 @@ user-select: none; } -.cs-checkbox > label.d-block { +.cs-checkbox>label.d-block { display: block; } -.cs-checkbox > label { + +.cs-checkbox>label { position: relative; display: inline-block; cursor: pointer; @@ -297,14 +456,15 @@ /* } */ input[type="checkbox"] { - transform: scale(1.5); /* 크기를 1.5배로 확대 */ + transform: scale(1.5); + /* 크기를 1.5배로 확대 */ } -.idxChk{ - position:absolute; +.idxChk { + position: absolute; } -.cs-checkbox > label:before { +.cs-checkbox>label:before { content: ""; position: absolute; top: 0; @@ -359,9 +519,9 @@ input[type="checkbox"] { content: ""; } -.selected-procedure{ - margin-top:20px; - position:relative; +.selected-procedure { + margin-top: 20px; + position: relative; } @@ -380,9 +540,10 @@ input[type="checkbox"] { padding-top: 0.2em; text-align: right; } -.selt_info_wrap .info button{ - border:none; - background-color:#fff; + +.selt_info_wrap .info button { + border: none; + background-color: #fff; } @@ -394,14 +555,14 @@ input[type="checkbox"] { .selected-procedure .selt_info_wrap { padding: 0.8rem 0; - z-index:0; + z-index: 0; } .selt_info_wrap { position: relative; min-height: 2.5rem; - background-color:#fff; - border:1px solid #eee; + background-color: #fff; + border: 1px solid #eee; } .selected-procedure .selt_info_wrap .selt { @@ -428,6 +589,7 @@ input[type="checkbox"] { font-size: 2rem; opacity: 1; } + .total-price-area .total .right strong { font-size: 22px; font-weight: 600; @@ -472,83 +634,320 @@ input[type="checkbox"] { color: #fff; } -.img-content{ +.img-content { background-color: #eee; } -.img-area{ +.img-area { padding-top: 70px; padding-bottom: 200px; - text-align:center; + text-align: center; } /* 페이지게이션 */ -.project_wrap .content_section .hospital_wrap .center_box .page_box {position:absolute; bottom:20px; width:100%; height:24px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation {height:24px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination {margin:0 auto; display:table;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li {display:inline-block; padding:0} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a {position:relative; width:24px; height:24px; background:none;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a:hover, .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a:hover {background:none;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img {position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0); width:10px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img {position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0) rotate(180deg); width:10px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a {width:24px; height:24px; padding:0; border:none; text-align:center; line-height:22px; font-size:14px; font-weight:500; background:#FFF; font-size:14px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a:hover, .project_wrap .content_section .hospital_wrap .center_box .right_note .page_box .navigation .pagination li a:focus {background:#3985EA; color:#fff; font-weight:700;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li.active a {background:#3985EA; color:#fff;} +.project_wrap .content_section .hospital_wrap .center_box .page_box { + position: absolute; + bottom: 20px; + width: 100%; + height: 24px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { + height: 24px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination { + margin: 0 auto; + display: table; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li { + display: inline-block; + padding: 0 +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { + position: relative; + width: 24px; + height: 24px; + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a:hover, +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a:hover { + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + width: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0) rotate(180deg); + width: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { + width: 24px; + height: 24px; + padding: 0; + border: none; + text-align: center; + line-height: 22px; + font-size: 14px; + font-weight: 500; + background: #FFF; + font-size: 14px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a:hover, +.project_wrap .content_section .hospital_wrap .center_box .right_note .page_box .navigation .pagination li a:focus { + background: #3985EA; + color: #fff; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li.active a { + background: #3985EA; + color: #fff; +} /*반응형 View*/ @media only screen and (max-width:1500px) { - .project_wrap .content_section .hospital_wrap .left_box { width:160px; padding:10px 15px; } - .project_wrap .content_section .hospital_wrap .center_box { width:calc(100% - 160px); left:160px; } + .project_wrap .content_section .hospital_wrap .left_box { + width: 160px; + padding: 10px 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 160px); + left: 160px; + } } @media only screen and (max-width:1280px) { - .project_wrap .content_section .hospital_wrap { width:calc(100% - 60px); } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { font-size:12px; } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { height:32px; margin-bottom:5px; } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .page_title { min-width:80px; height:40px; font-size:16px; line-height:40px; } - .project_wrap .content_section .hospital_wrap .center_box .total { font-size:12px; line-height:40px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box { padding:15px 0; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box { width:120px; height:32px; background-size:18px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label { padding:0 10px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box { width:120px; height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box img { width:22px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box input { height:32px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box { width:110px; height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box img { width:20px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box .date_picker { height:32px; padding-left:35px; font-size:10px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .slash { line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn { margin-left:5px; padding-left:10px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn p { display:none; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn img { width:12px; margin-top:-3px; position:static; transform:none; } - .project_wrap .content_section .hospital_wrap .center_box .page_box { height:23px; } - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { height:23px; } - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { width:23px; height:23px; font-size:12px; } + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 60px); + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + height: 32px; + margin-bottom: 5px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 80px; + height: 40px; + font-size: 16px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .total { + font-size: 12px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box { + padding: 15px 0; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box { + width: 120px; + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box { + width: 120px; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box img { + width: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box input { + height: 32px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box { + width: 110px; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box img { + width: 20px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box .date_picker { + height: 32px; + padding-left: 35px; + font-size: 10px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .slash { + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn { + margin-left: 5px; + padding-left: 10px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn p { + display: none; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn img { + width: 12px; + margin-top: -3px; + position: static; + transform: none; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box { + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { + width: 23px; + height: 23px; + font-size: 12px; + } + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { width:23px; height:23px; } + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { + width: 23px; + height: 23px; + } + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img, - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { width:9px; } - .project_wrap .content_section .hospital_wrap .center_box .table_box { height:calc(100% - 155px); } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left { width:350px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left .title { font-size:14px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label { text-indent:20px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label::after { width:15px; height:15px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li input[type='checkbox']:checked + label::before { width:5px; height:8px; left:5px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right p { font-size:14px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li label { font-size:12px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box { width:120px; height:32px; background-size:18px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box .label { padding:0 10px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box .select_option_list .option_list_item { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li input { font-size:12px; height:32px; width:250px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li textarea { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.banner_li label { font-size:12px; height:32px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.banner_li label.file_btn img { width:22px; height:22px; } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right { width:calc(100% - 350px); } - .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right .button_box button { width:70px; font-size:12px; height:32px; } + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { + width: 9px; + } + + .project_wrap .content_section .hospital_wrap .center_box .table_box { + height: calc(100% - 155px); + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left { + width: 350px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left .title { + font-size: 14px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label { + text-indent: 20px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label::after { + width: 15px; + height: 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li input[type='checkbox']:checked+label::before { + width: 5px; + height: 8px; + left: 5px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right p { + font-size: 14px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li label { + font-size: 12px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box { + width: 120px; + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box .select_option_list .option_list_item { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li input { + font-size: 12px; + height: 32px; + width: 250px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li textarea { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.banner_li label { + font-size: 12px; + height: 32px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.banner_li label.file_btn img { + width: 22px; + height: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right { + width: calc(100% - 350px); + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right .button_box button { + width: 70px; + font-size: 12px; + height: 32px; + } } @media only screen and (max-width:1080px) { - .project_wrap .content_section .hospital_wrap { width:calc(100% - 50px); } + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 50px); + } } \ No newline at end of file diff --git a/src/main/resources/static/css/web/ContentsBbsSelectList.css b/src/main/resources/static/css/web/ContentsBbsSelectList.css new file mode 100644 index 0000000..8c21c22 --- /dev/null +++ b/src/main/resources/static/css/web/ContentsBbsSelectList.css @@ -0,0 +1,449 @@ +.project_wrap { + width: 100%; + min-width: 1080px; + margin: 0 auto; +} + +/*오른쪽영역*/ +.project_wrap .content_section { + margin-top: 50px; + width: 100%; + min-width: 1080px; + display: table; +} + +.project_wrap .content_section .hospital_wrap { + width: calc(100% - 72px); + min-width: calc(1080px - 72px); + height: calc(100vh - 50px); + float: left; + position: relative; +} + + +/* 왼쪽_메뉴 영역 */ +.project_wrap .content_section .hospital_wrap .left_box { + position: absolute; + width: 240px; + height: calc(100vh - 50px); + overflow: auto; + padding: 10px 20px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list { + width: 100%; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + width: 100%; + height: auto; + margin: 20px 0 10px 0; + padding: 0; + font-size: 14px; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first { + margin-top: 0; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a { + width: 100%; + height: 100%; + display: block; + margin-bottom: 8px; + padding: 8px; + font-size: 14px; + text-align: left; + border-radius: 5px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on { + background: #3985EA; + border: none; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + width: 100%; + height: 36px; + margin-bottom: 8px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on { + color: #fff; +} + +/* 센터쪽 */ +.project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 240px); + height: calc(100vh - 50px); + position: absolute; + left: 240px; + padding: 10px 10px 10px 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 90px; + padding-left: 10px; + font-size: 18px; + font-weight: 700; + line-height: 50px; + float: left; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box { + display: table; + width: 100%; + padding: 20px 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box { + width: 140px; + height: 36px; + margin-left: 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: url(/image/web/select_arrow.svg) no-repeat 95% 55%/20px auto #fff; + float: left; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box.first { + width: 150px; + margin-left: 0; + float: left; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box.active { + z-index: 10; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label { + width: 100%; + height: 100%; + padding: 0 10px; + outline: none; + font-size: 14px; + font-weight: 400; + text-align: left; + color: #494E53; + cursor: pointer; + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list { + min-width: 100%; + border-radius: 5px; + transition: .4s ease-in; + border: Solid 1px #E9ECF0; + padding: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { + width: 100%; + line-height: 30px; + transition: .1s; + position: relative; + display: table; + font-size: 14px; + color: #494E53; + cursor: pointer; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item label { + width: 100%; + line-height: 30px; + margin-bottom: 0px; + clear: both; + font-weight: 400; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list { + float: left; + position: relative; + margin-left: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box { + width: 150px; + float: left; + height: 36px; + position: relative; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box img { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 5px; + z-index: 1; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box input { + width: 100%; + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: none; + position: absolute; + left: 0; + padding: 0 10px 0 30px; + font-size: 14px; + background: #fff; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box input::placeholder { + color: #B5BDC4; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box .search_list { + position: absolute; + top: 40px; + left: 0; + width: 150px; + background: #fff; + color: #fff; + border-radius: 5px; + transition: .4s ease-in; + z-index: 1; + border: solid 1px #E9ECF0; + display: none; + margin: 0; + padding: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_btn { + background: #3985EA; + border-radius: 5px; + color: #fff; + margin-left: 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box { + float: right; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .treatmentpetit_btn { + background: #3985EA; + color: #fff; + border-radius: 5px; + float: left; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .treatmentpetit_btn img { + position: relative; + top: -2px; + width: 20px; + margin-right: 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .delete_btn { + background: #FF2222; + color: #fff; + border-radius: 5px; + margin-left: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .delete_btn img { + position: relative; + top: -2px; + width: 20px; + margin-right: 5px; +} + +/* table_box */ +.project_wrap .content_section .hospital_wrap .center_box .table_box { + width: 100%; + height: calc(100% - 180px); + overflow: auto; + background: #fff; + border: solid 1px #E9ECF0; + border-radius: 5px; +} + +/* 페이지게이션 */ +.project_wrap .content_section .hospital_wrap .center_box .page_box { + position: absolute; + bottom: 20px; + width: 100%; + height: 24px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { + height: 24px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination { + margin: 0 auto; + display: table; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li { + display: inline-block; + padding: 0 +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { + position: relative; + width: 24px; + height: 24px; + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a:hover, +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a:hover { + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + width: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0) rotate(180deg); + width: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { + width: 24px; + height: 24px; + padding: 0; + border: none; + text-align: center; + line-height: 22px; + font-size: 14px; + font-weight: 500; + background: #FFF; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a:hover, +.project_wrap .content_section .hospital_wrap .center_box .right_note .page_box .navigation .pagination li a:focus { + background: #3985EA; + color: #fff; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li.active a { + background: #3985EA; + color: #fff; +} + +/*반응형 View*/ +@media only screen and (max-width:1500px) { + .project_wrap .content_section .hospital_wrap .left_box { + width: 160px; + padding: 10px 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 160px); + left: 160px; + } +} + +@media only screen and (max-width:1280px) { + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 60px); + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + height: 32px; + margin-bottom: 5px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 80px; + height: 40px; + font-size: 16px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .total { + font-size: 12px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box { + padding: 15px 0; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box { + width: 120px; + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box { + width: 120px; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box img { + width: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box input { + height: 32px; + padding-left: 35px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box { + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { + width: 23px; + height: 23px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { + width: 23px; + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img, + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { + width: 9px; + } + + .project_wrap .content_section .hospital_wrap .center_box .table_box { + height: calc(100% - 155px); + } +} + +@media only screen and (max-width:1080px) { + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 50px); + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/ContentsBbsUpd.css b/src/main/resources/static/css/web/ContentsBbsUpd.css new file mode 100644 index 0000000..8543a26 --- /dev/null +++ b/src/main/resources/static/css/web/ContentsBbsUpd.css @@ -0,0 +1,1259 @@ +.project_wrap { + width: 100%; + min-width: 1080px; + margin: 0 auto; +} + +/*오른쪽영역*/ +.project_wrap .content_section { + margin-top: 50px; + width: 100%; + min-width: 1080px; + display: table; +} + +.project_wrap .content_section .hospital_wrap { + width: calc(100% - 72px); + min-width: calc(1080px - 72px); + height: calc(100vh - 50px); + float: left; + position: relative; +} + + +/* 왼쪽_메뉴 영역 */ +.project_wrap .content_section .hospital_wrap .left_box { + position: absolute; + width: 240px; + height: calc(100vh - 50px); + overflow: auto; + padding: 10px 20px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list { + width: 100%; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + width: 100%; + height: auto; + margin: 20px 0 10px 0; + padding: 0; + font-size: 14px; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first { + margin-top: 0; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a { + width: 100%; + height: 100%; + display: block; + margin-bottom: 8px; + padding: 8px; + font-size: 14px; + text-align: left; + border-radius: 5px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on { + background: #3985EA; + border: none; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + width: 100%; + height: 36px; + margin-bottom: 8px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on { + color: #fff; +} + +/* 센터쪽 */ +.project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 240px); + height: calc(100vh - 50px); + position: absolute; + left: 240px; + padding: 10px 10px 10px 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 90px; + padding-left: 10px; + font-size: 18px; + font-weight: 700; + line-height: 50px; + float: left; +} + +.consultation-info input { + width: 80%; + height: 36px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.consultation-info input input::placeholder { + color: #B5BDC4; +} + +.consultation-info label { + padding-left: 10px; +} + +.consultation-info input[type="checkbox"] { + width: 15px; + height: 15px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.consultation-info input[type="checkbox"] input::placeholder { + color: #B5BDC4; +} + +.consultation-info select { + width: 80%; + height: 36px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.consultation-info textarea { + width: 80%; + padding: 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; + resize: none; +} + +.consultation-info textarea::placeholder { + color: #B5BDC4; +} + +.wp60 input { + width: 80%; + height: 36px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.wp60 input input::placeholder { + color: #B5BDC4; +} + +.wp60 textarea { + width: 80%; + padding: 10px; + border: 1px solid #E9ECF0; + border-radius: 5px; + resize: none; +} + +.wp60 textarea::placeholder { + color: #B5BDC4; +} + +.content { + width: 100%; + height: 100%; + padding: 20px; + border: solid 1px #E9ECF0; + border-radius: 5px; + position: relative; + background: #fff; + float: left; +} + +/* content_box */ +.project_wrap .content_section .hospital_wrap .center_box .content_box { + width: 100%; + height: calc(100% - 50px); + padding-top: 20px; + display: table; +} + +.add_btn { + width: 24px; + height: 24px; + padding-left: 0px; + padding-right: 0px; + padding-top: 0px; + margin-top: 0px; + line-height: 0px !important; +} + +.ml50 { + margin-left: 50%; +} + +.button_box button { + width: 70px; + font-size: 12px; + height: 32px; + border-radius: 16px; +} + +.button_box button.cancel_btn { + background: #F8FBFF; +} + +.button_box button.registration_btn { + margin-left: 10px; + color: #fff; + background: #3985EA; +} + +.button_box { + width: 100%; + margin-top: 30px; + margin-left: 56%; +} + +.fix_area { + min-width: 1200px; + width: 1200px; + margin: 0 auto; + padding: 0 16px; +} + +.btn-basic { + width: 120px; + height: 40px; + border: 1px solid #a73439; + border-radius: 5px; + background-color: white; + color: #a73439; +} + +.clear:after { + display: block; + visibility: hidden; + height: 0; + font-size: 0; + clear: both; + content: ""; +} + + +.clear>.right { + float: right; +} + +.clear>.left { + float: left; +} + +.main-img-size { + position: relative; + width: 655px; + height: 368px; + overflow: hidden; + border-radius: 0.25rem; + text-align: center; +} + +.img_center img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + margin: 0; +} + + +.thumbnail-bottom-txt { + padding-top: 15px; +} + +.thumbnail-bottom-txt>span { + display: block; + color: #6c696a; + font-size: 13.5px; +} + +.content>.wp60 { + width: 60%; +} + +.content>.wp40 { + width: 40%; +} + +.wp10 { + width: 10%; +} + +.wp90 { + width: 90%; +} + + +.content>[class^=wp] { + float: left; +} + +.consultation-info h2 { + font-size: 4rem; +} + +.consultation-info p { + margin-top: 2rem; + font-size: 2rem; +} + + +.consultation-info .price { + display: block; + font-size: 3rem; + margin-top: 3rem; + margin-bottom: 1rem; +} + +.price-area .border-line { + height: 1px; + background-color: #ddd; +} + + +.hashtag_list { + padding: 1rem 0 1.5rem; +} + +.hashtag_list span { + font-size: 1.6rem; + color: #a94442; +} + + +.procedure-area>.procedure_select_txt { + float: left; + width: 7rem; + line-height: 1.5; + padding-top: 0.375rem; +} + +.procedure-area>.dropdown_area { + float: right; + width: calc(100% - 7rem); +} + +.select_procedure_div { + position: relative; +} + +.select_procedure_div .default_item { + padding-top: 0.5rem; + padding-left: 0.5rem; + padding-bottom: 0.5rem; +} + +.select_procedure_div .default_item { + position: relative; + width: 100%; + padding-right: 2.5rem; + background-color: #fff; + border: 1px solid #cb9f76; + text-align: left; + border-radius: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + + +.option_scrl_wrap { + display: none; + overflow: hidden; + position: relative; + z-index: 1; +} + +.select_procedure_div.active .option_scrl_wrap { + border: 1px solid #76232f; +} + +.select_service_form.active .default_item:after { + border-top-color: #333; +} + +.default_item:after { + content: ''; + display: block; + position: absolute; + top: 50%; + right: 1.1em; + margin-top: -0.2rem; + border: 0.28571428em solid transparent; + border-top-color: #999; +} + + +.optipon_item { + padding: 0.4rem 0.5rem; +} + +.sepr_wrap { + position: relative; + min-height: 2.5rem; +} + +.item_subprice { + min-height: 42px; +} + +.select_procedure_div.active .option_scrl_wrap { + display: block; + position: absolute; + right: -1px; + left: -1px; + background-color: #fff; + user-select: none; +} + +.cs-checkbox>label.d-block { + display: block; +} + +.cs-checkbox>label { + position: relative; + display: inline-block; + cursor: pointer; + padding-left: 30px; + margin: 0; + line-height: 20px; + transition: color .3s ease-out; +} + + + +.oi-wrap { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +/* .cs-checkbox input[type="checkbox"] { */ +/* visibility: hidden; */ +/* display: none; */ +/* } */ + +/* .cs-checkbox > label:before, .cs-radio > .r_visible { */ +/* border: 1px solid #ccc; */ +/* } */ + +input[type="checkbox"] { + transform: scale(1.5); + /* 크기를 1.5배로 확대 */ +} + +.idxChk { + position: absolute; +} + +.cs-checkbox>label:before { + content: ""; + position: absolute; + top: 0; + left: 0; + display: inline-block; + margin-right: 0.8em; + border-radius: 0; + background-color: #fff; +} + +.oi-wrap .oi-txt { + flex: 0 0 65%; + max-width: 65%; +} + +.option_list { + display: block; + background: #fff; + max-height: 224px; + overflow-y: auto; + overflow-x: hidden; +} + + +.oi-wrap .oi-price { + flex: 0 0 35%; + max-width: 35%; + text-align: right; +} + +.original_price { + color: #757575; + opacity: 0.7; +} + +.d-block { + display: block; +} + +.discount_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.procedure-area:after { + display: block; + visibility: hidden; + height: 0; + font-size: 0; + clear: both; + content: ""; +} + +.selected-procedure { + margin-top: 20px; + position: relative; +} + + +.selected-procedure .selt_info_wrap .info { + top: 0.7rem; + width: 9.5em; + padding-top: 0.3em; +} + +.selt_info_wrap .info { + position: absolute; + top: 0.2rem; + right: 0.2rem; + width: 8.5em; + padding-right: 1rem; + padding-top: 0.2em; + text-align: right; +} + +.selt_info_wrap .info button { + border: none; + background-color: #fff; +} + + +.real_price { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.selected-procedure .selt_info_wrap { + padding: 0.8rem 0; + z-index: 0; +} + +.selt_info_wrap { + position: relative; + min-height: 2.5rem; + background-color: #fff; + border: 1px solid #eee; +} + +.selected-procedure .selt_info_wrap .selt { + padding-right: 9.5em; + padding-left: 1rem; + width: 100%; +} + +.selt_info_wrap .selt { + padding-top: 0.3em; + padding-right: 8.5em; +} + +.total-price-area .total { + position: relative; + background-color: #e6e6e6; + padding: 25px 25px 60px; + display: flex; + justify-content: space-between; +} + +.total-price-area .total .txt_sub { + color: #222222; + font-size: 2rem; + opacity: 1; +} + +.total-price-area .total .right strong { + font-size: 22px; + font-weight: 600; +} + +.total-price-area .total-price-txt { + font-family: 'Campton', Sans-serif; + font-weight: 600; + color: #A73439; +} + +.total-price-area .total .bs-txt { + position: absolute; + bottom: 17px; + right: 25px; + display: block; + margin-top: 4px; + font-size: 12px; + color: #999999; + letter-spacing: -1px; +} + + +.main_btn { + text-align: right; + margin: 1rem 0; +} + +.main_btn button { + width: 180px; + height: 50px; +} + + +.fastrack-btn { + position: relative; +} + +.btn-primary { + border: 1px solid #a73439; + background-color: #a73439; + color: #fff; +} + +.img-content { + background-color: #eee; +} + +.img-area { + padding-top: 70px; + padding-bottom: 200px; + text-align: center; +} + +/* 페이지게이션 */ +.project_wrap .content_section .hospital_wrap .center_box .page_box { + position: absolute; + bottom: 20px; + width: 100%; + height: 24px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { + height: 24px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination { + margin: 0 auto; + display: table; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li { + display: inline-block; + padding: 0 +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { + position: relative; + width: 24px; + height: 24px; + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a:hover, +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a:hover { + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + width: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0) rotate(180deg); + width: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { + width: 24px; + height: 24px; + padding: 0; + border: none; + text-align: center; + line-height: 22px; + font-size: 14px; + font-weight: 500; + background: #FFF; + font-size: 14px; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a:hover, +.project_wrap .content_section .hospital_wrap .center_box .right_note .page_box .navigation .pagination li a:focus { + background: #3985EA; + color: #fff; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li.active a { + background: #3985EA; + color: #fff; +} + +/*반응형 View*/ +@media only screen and (max-width:1500px) { + .project_wrap .content_section .hospital_wrap .left_box { + width: 160px; + padding: 10px 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 160px); + left: 160px; + } +} + +@media only screen and (max-width:1280px) { + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 60px); + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + height: 32px; + margin-bottom: 5px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 80px; + height: 40px; + font-size: 16px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .total { + font-size: 12px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box { + padding: 15px 0; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box { + width: 120px; + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box { + width: 120px; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box img { + width: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box .search_box input { + height: 32px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box { + width: 110px; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box img { + width: 20px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .date_box .date_picker { + height: 32px; + padding-left: 35px; + font-size: 10px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .calendar_box .slash { + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn { + margin-left: 5px; + padding-left: 10px; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn p { + display: none; + } + + .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn img { + width: 12px; + margin-top: -3px; + position: static; + transform: none; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box { + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { + width: 23px; + height: 23px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { + width: 23px; + height: 23px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img, + .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { + width: 9px; + } + + .project_wrap .content_section .hospital_wrap .center_box .table_box { + height: calc(100% - 155px); + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left { + width: 350px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left .title { + font-size: 14px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label { + text-indent: 20px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.checkbox_li label::after { + width: 15px; + height: 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li input[type='checkbox']:checked+label::before { + width: 5px; + height: 8px; + left: 5px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right p { + font-size: 14px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li label { + font-size: 12px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box { + width: 120px; + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li .select_box .select_option_list .option_list_item { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li input { + font-size: 12px; + height: 32px; + width: 250px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.first li textarea { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.banner_li label { + font-size: 12px; + height: 32px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_left ul.last li.banner_li label.file_btn img { + width: 22px; + height: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right { + width: calc(100% - 350px); + } + + .project_wrap .content_section .hospital_wrap .center_box .content_box .content_right .button_box button { + width: 70px; + font-size: 12px; + height: 32px; + } +} + +@media only screen and (max-width:1080px) { + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 50px); + } +} + +/* ========================================= + NEW ONE-PAGE LAYOUT STYLES (ContentsBbsUpd) + ========================================= */ + +/* Override content box to fit screen height */ +.project_wrap .content_section .hospital_wrap .center_box .content_box { + width: 100%; + /* 100vh - header(approx 50px) - title(approx 50px) - padding */ + /* 100vh - header(approx 50px) - title(approx 50px) - padding */ + height: calc(100vh - 120px) !important; + padding: 0 !important; + overflow: hidden; + /* Prevent outer scroll */ + background: none; + /* remove white bg from container */ + border: none; + display: block !important; + /* Override display: table to enforce fixed height */ +} + +/* New Flex Container */ +.update-container { + display: flex; + width: 100%; + height: 100%; + gap: 20px; +} + +/* Panels */ +.left-panel, +.right-panel { + flex: 1; + background: #fff; + border: 1px solid #E9ECF0; + border-radius: 5px; + padding: 20px; + display: flex; + flex-direction: column; + overflow-y: auto; + height: 100%; +} + +/* Right Panel (Images) - Row Layout */ +.right-panel { + flex-direction: row; + gap: 20px; + overflow: hidden; + /* Prevent overflow */ +} + +/* Left Panel (Forms) - Column Layout (Default) */ +.left-panel { + /* Uses default flex-direction: column from shared rule above */ + overflow: hidden; + /* Prevent main scroll, force grid scroll */ +} + +/* Update selector for image panel children to target right-panel now */ +.right-panel .panel-section { + margin-bottom: 0; + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + overflow: hidden; +} + +/* Specific layout for Left Panel to be side-by-sid*/ +/* This rule is now redundant as .left-panel is column and .right-panel is row */ +/* .left-panel, +.right-panel { + flex: 1; + background: #fff; + border: 1px solid #E9ECF0; + border-radius: 5px; + padding: 20px; + display: flex; + flex-direction: column; + overflow-y: auto; + height: 100%; +} */ + +/* Make image panel (previously left-panel) flex-row as requested in previous step */ +/* This rule is now applied directly to .right-panel */ +/* .image-panel-style { + flex-direction: row; + gap: 20px; +} */ + +.right-panel .panel-section .top-label { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; + font-weight: 700; + color: #333; +} + +/* Image preview container */ +.img-preview-wrapper { + flex: 1; + /* Take remaining vertical space */ + background: #f8f9fa; + border: 1px dashed #ccc; + border-radius: 4px; + margin-bottom: 10px; + overflow: auto; + /* Allow scrolling */ + position: relative; + min-height: 0; + /* Important for flex child inside flex container */ +} + +/* Specific: Thumbnail Box (16:9 Aspect Ratio) */ +.img_box { + flex: none; + width: 100%; + height: auto; + aspect-ratio: 16 / 9; + /* 800x450 ratio */ + overflow: hidden; + /* Override wrapper's auto scroll */ +} + +/* Specific: Content File Box (Fit to screen) */ +.file_box { + flex: 1; + overflow: auto; + /* Ensure it doesn't push the container */ + height: auto; + max-height: calc(100vh - 300px); + /* Safety cap to prevent screen scroll */ +} + +/* Image inside preview */ +.img-preview-wrapper img { + width: 100%; + /* Fill width */ + height: auto; + /* Allow height to expand */ + display: block; +} + +/* For thumbnail, force fit with cover/contain since ratio is fixed */ +.img_box img { + width: 100%; + height: 100%; + object-fit: contain; +} + +/* Ensure textarea doesn't push layout too much */ +.right-panel textarea { + width: 100%; + height: 100px; + min-height: 60px; + resize: none; + border: 1px solid #E9ECF0; + padding: 10px; + font-size: 14px; + flex-shrink: 0; +} + +/* Image inside preview */ + + +.form-grid-row { + display: flex; + gap: 15px; + margin-bottom: 15px; +} + +.form-group { + flex: 1; + display: flex; + flex-direction: column; + gap: 5px; +} + +.form-group label { + font-size: 14px; + font-weight: 700; + color: #333; +} + +.form-group input, +.form-group select { + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 4px; + padding: 0 10px; + font-size: 14px; +} + +.form-group textarea.content-area-sm { + height: 80px; + resize: none; + border: 1px solid #E9ECF0; + padding: 10px; +} + +.grid-section { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + /* Allow shrinking */ + overflow: hidden; + /* Contain scroll */ +} + +.grid-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; + flex-shrink: 0; + /* Header doesn't shrink */ +} + +.grid-header p { + font-weight: 700; + margin: 0; +} + +/* Custom Grid Table Styles */ +.custom-grid-container { + flex: 1; + width: 100%; + border: 1px solid #E9ECF0; + border-radius: 4px; + overflow-y: auto; + position: relative; + background-color: #fff; + min-height: 0; + /* CRITICAL: Allow container to shrink to fit parent */ +} + +.treatment-table { + width: 100%; + border-collapse: collapse; + table-layout: fixed; + /* Fixed layout for consistent column widths */ +} + +.treatment-table thead { + position: sticky; + top: 0; + z-index: 10; + background-color: #f8f9fa; + /* Light grey header */ +} + +.treatment-table th, +.treatment-table td { + padding: 10px; + border-bottom: 1px solid #E9ECF0; + text-align: center; + font-size: 14px; + color: #333; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.treatment-table th { + font-weight: 700; + color: #555; + border-bottom: 2px solid #E9ECF0; +} + +.treatment-table tbody tr:hover { + background-color: #f1f5f9; + /* Hover effect */ +} + +/* Checkbox Column */ +.treatment-table th:first-child, +.treatment-table td:first-child { + width: 50px; + text-align: center; +} + +/* Ensure price columns align right for better readability */ +.treatment-table td:nth-child(3), +.treatment-table td:nth-child(4) { + text-align: right; + padding-right: 20px; +} + +.bottom-actions { + margin-top: 15px; + display: flex; + justify-content: flex-end; + gap: 10px; +} + +.grid-section { + flex: 1; + display: flex; + flex-direction: column; + /* height: 100%; Remvoed to prevent overflow */ + min-height: 0; + overflow: hidden; + /* Contain the scrollable table */ +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/call_log.css b/src/main/resources/static/css/web/call_log.css new file mode 100644 index 0000000..671d69b --- /dev/null +++ b/src/main/resources/static/css/web/call_log.css @@ -0,0 +1,350 @@ +/* ============================================ + 통화 로그 관리 (call_log.css) + ============================================ */ + +/* ---- 검색 필터 영역 ---- */ +.cl_filter_wrap { + background: #fff; + border: 1px solid #E9ECF0; + border-radius: 5px; + padding: 12px 16px; + margin-bottom: 10px; + clear: both; +} + +.cl_filter_row { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.cl_filter_row+.cl_filter_row { + margin-top: 8px; + padding-top: 8px; + border-top: 1px solid #F0F1F3; +} + +.cl_filter_item { + display: flex; + align-items: center; + gap: 6px; +} + +.cl_filter_item label { + font-size: 13px; + font-weight: 600; + color: #555; + white-space: nowrap; + min-width: 55px; +} + +.cl_filter_item select, +.cl_filter_item .cl_select { + height: 32px; + padding: 0 8px; + border: 1px solid #E9ECF0; + border-radius: 4px; + font-size: 13px; + color: #333; + background: #fff url(/image/web/select_arrow.svg) no-repeat 95% 55%/18px auto; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding-right: 28px; + min-width: 90px; +} + +.cl_filter_item input[type="text"] { + height: 32px; + padding: 0 10px; + border: 1px solid #E9ECF0; + border-radius: 4px; + font-size: 13px; + width: 140px; +} + +.cl_filter_item input[type="text"]::placeholder { + color: #B5BDC4; +} + +/* 날짜 필터 */ +.cl_date_item input[type="date"] { + height: 32px; + padding: 0 8px; + border: 1px solid #E9ECF0; + border-radius: 4px; + font-size: 13px; + color: #333; +} + +.cl_date_sep { + color: #888; + font-size: 13px; + margin: 0 2px; +} + +/* 날짜 단축 버튼 */ +.cl_quick_btns { + display: flex; + gap: 4px; +} + +.cl_quick_btns button { + height: 30px; + padding: 0 10px; + border: 1px solid #D5D8DC; + border-radius: 4px; + background: #FAFBFC; + color: #555; + font-size: 12px; + cursor: pointer; + white-space: nowrap; + transition: all 0.15s; +} + +.cl_quick_btns button:hover { + background: #3985EA; + color: #fff; + border-color: #3985EA; +} + +/* 조회 버튼 */ +.cl_search_btn { + height: 32px; + padding: 0 20px; + background: #3985EA; + color: #fff; + border: none; + border-radius: 4px; + font-size: 13px; + font-weight: 600; + cursor: pointer; + white-space: nowrap; + margin-left: auto; +} + +.cl_search_btn:hover { + background: #2D6CC0; +} + +/* ---- 통계 요약 바 ---- */ +.cl_stats_bar { + display: flex; + align-items: center; + gap: 10px; + background: #F7F9FC; + border: 1px solid #E9ECF0; + border-radius: 5px; + padding: 10px 16px; + margin-bottom: 10px; + font-size: 13px; + color: #555; + flex-wrap: wrap; +} + +.cl_stats_bar strong { + color: #3985EA; + font-weight: 700; +} + +.cl_stats_sep { + color: #D5D8DC; +} + +.cl_stats_detail { + font-size: 12px; + color: #888; +} + +.cl_stats_detail strong { + color: #333; + font-weight: 600; +} + +/* ---- ag-Grid 영역 ---- */ +.cl_grid_box { + width: 100%; + height: calc(100% - 230px); + min-height: 300px; + background: #fff; + border: solid 1px #E9ECF0; + border-radius: 5px; + overflow: hidden; +} + +/* ---- 메모 팝업 ---- */ +.cl_memo_overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.35); + z-index: 9999; + display: flex; + align-items: center; + justify-content: center; +} + +.cl_memo_popup { + background: #fff; + border-radius: 8px; + width: 480px; + max-width: 90%; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); + overflow: hidden; +} + +.cl_memo_header { + display: flex; + align-items: center; + gap: 10px; + padding: 16px 20px; + border-bottom: 1px solid #E9ECF0; +} + +.cl_memo_header h3 { + margin: 0; + font-size: 16px; + font-weight: 700; + color: #333; +} + +.cl_memo_record { + font-size: 12px; + color: #888; +} + +.cl_memo_close { + margin-left: auto; + background: none; + border: none; + font-size: 22px; + color: #999; + cursor: pointer; + line-height: 1; +} + +.cl_memo_close:hover { + color: #333; +} + +.cl_memo_body { + padding: 16px 20px; +} + +.cl_memo_body textarea { + width: 100%; + padding: 10px 12px; + border: 1px solid #E9ECF0; + border-radius: 5px; + font-size: 14px; + resize: vertical; + min-height: 120px; + line-height: 1.6; + box-sizing: border-box; +} + +.cl_memo_body textarea:focus { + border-color: #3985EA; + outline: none; + box-shadow: 0 0 0 2px rgba(57, 133, 234, 0.12); +} + +.cl_memo_footer { + display: flex; + gap: 8px; + padding: 12px 20px 16px; + justify-content: flex-end; +} + +.cl_memo_save_btn { + height: 34px; + padding: 0 20px; + border: none; + border-radius: 5px; + background: #3985EA; + color: #fff; + font-size: 13px; + cursor: pointer; +} + +.cl_memo_save_btn:hover { + background: #2D6CC0; +} + +.cl_memo_cancel_btn { + height: 34px; + padding: 0 16px; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: #fff; + color: #666; + font-size: 13px; + cursor: pointer; +} + +.cl_memo_cancel_btn:hover { + background: #F7F8FA; +} + +/* ---- 그리드 내 버튼/뱃지 ---- */ +.cl_play_btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: 1px solid #3985EA; + border-radius: 50%; + background: #fff; + color: #3985EA; + font-size: 11px; + cursor: pointer; + transition: all 0.15s; +} + +.cl_play_btn:hover { + background: #3985EA; + color: #fff; +} + +.cl_incall_badge { + display: inline-block; + padding: 1px 6px; + margin: 1px 2px; + background: #EEF3FB; + color: #3366AA; + border-radius: 3px; + font-size: 11px; + white-space: nowrap; +} + +/* ---- 반응형 ---- */ +@media screen and (max-width: 1500px) { + .cl_filter_row { + gap: 8px; + } + + .cl_filter_item label { + min-width: 45px; + font-size: 12px; + } + + .cl_filter_item select, + .cl_filter_item .cl_select { + min-width: 80px; + font-size: 12px; + } + + .cl_filter_item input[type="text"] { + width: 120px; + font-size: 12px; + } + + .cl_quick_btns button { + padding: 0 7px; + font-size: 11px; + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/datepicker-fix.css b/src/main/resources/static/css/web/datepicker-fix.css new file mode 100644 index 0000000..3bdaa56 --- /dev/null +++ b/src/main/resources/static/css/web/datepicker-fix.css @@ -0,0 +1,4 @@ +/* Fix datepicker z-index issue */ +.ui-datepicker { + z-index: 9999 !important; +} diff --git a/src/main/resources/static/css/web/hospital_info.css b/src/main/resources/static/css/web/hospital_info.css index e1c419c..558b54e 100644 --- a/src/main/resources/static/css/web/hospital_info.css +++ b/src/main/resources/static/css/web/hospital_info.css @@ -1,72 +1,393 @@ - -.project_wrap {width:100%; max-width:1920px; min-width:1080px; margin:0 auto;} +.project_wrap { + width: 100%; + max-width: 1920px; + min-width: 1080px; + margin: 0 auto; +} /*오른쪽영역*/ -.project_wrap .content_section {margin-top:50px; width:100%; min-width:1080px; display:table;} -.project_wrap .content_section .hospital_wrap {width: calc(100% - 72px); min-width:calc(1080px - 72px); height:calc(100vh - 50px); float:left; position:relative;} +.project_wrap .content_section { + margin-top: 50px; + width: 100%; + min-width: 1080px; + display: table; +} + +.project_wrap .content_section .hospital_wrap { + width: calc(100% - 72px); + min-width: calc(1080px - 72px); + height: calc(100vh - 50px); + float: left; + position: relative; +} /* 왼쪽 */ -.project_wrap .content_section .hospital_wrap .left_box {position:absolute; width:240px; height:calc(100vh - 50px); overflow:auto; padding:10px 20px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list {width:100%;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu {width:100%; height:auto; margin:20px 0 10px 0; padding:0; font-size:14px; font-weight:700;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first {margin-top:0;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a {width:100%; height:100%; display:block; margin-bottom:8px; padding:8px; font-size:14px; text-align:left; border-radius:5px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on {background:#3985EA; border:none;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a:hover {background:#EDF5FF;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on:hover {background:#3985EA;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li {width:100%; height:36px; margin-bottom:8px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on {color:#fff;} +.project_wrap .content_section .hospital_wrap .left_box { + position: absolute; + width: 240px; + height: calc(100vh - 50px); + overflow: auto; + padding: 10px 20px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list { + width: 100%; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + width: 100%; + height: auto; + margin: 20px 0 10px 0; + padding: 0; + font-size: 14px; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first { + margin-top: 0; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a { + width: 100%; + height: 100%; + display: block; + margin-bottom: 8px; + padding: 8px; + font-size: 14px; + text-align: left; + border-radius: 5px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on { + background: #3985EA; + border: none; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a:hover { + background: #EDF5FF; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on:hover { + background: #3985EA; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + width: 100%; + height: 36px; + margin-bottom: 8px; +} + +.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on { + color: #fff; +} /* 센터쪽 */ -.project_wrap .content_section .hospital_wrap .center_box {width:calc(100% - 240px); height:calc(100vh - 50px); position:absolute; left:240px; padding:10px 10px 10px 0;} -.project_wrap .content_section .hospital_wrap .center_box .page_title {min-width:100px; height:50px; font-size:18px; line-height:50px; text-align:left; font-weight:700; padding-left:10px;} +.project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 240px); + height: calc(100vh - 50px); + position: absolute; + left: 240px; + padding: 10px 10px 10px 0; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box {width:100%; height:calc(100% - 70px); overflow:auto; background:#fff; border:solid 1px #E9ECF0; border-radius:5px; padding:50px; margin-top:20px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .info {width:700px;} +.project_wrap .content_section .hospital_wrap .center_box .page_title { + min-width: 100px; + height: 50px; + font-size: 18px; + line-height: 50px; + text-align: left; + font-weight: 700; + padding-left: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box { + width: 100%; + height: calc(100% - 70px); + overflow: auto; + background: #fff; + border: solid 1px #E9ECF0; + border-radius: 5px; + padding: 50px; + margin-top: 20px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box { + width: 100%; + height: calc(100% - 70px); + overflow: auto; + background: #fff; + border: solid 1px #E9ECF0; + border-radius: 5px; + padding: 20px 50px 50px 50px; + margin-top: 20px; + display: flex; + flex-wrap: wrap; + gap: 30px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .info_left { + flex: 1 1 400px; + min-width: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .info_right { + flex: 1 1 400px; + min-width: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .info { + width: 100%; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box {display:table; width:100%; margin-top:20px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box.first { margin-top: 0; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .title {height:50px; font-size:18px; line-height:50px; text-align:left; font-weight:700;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box { + display: table; + width: 100%; + margin-top: 20px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box.first { + margin-top: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .title { + height: 50px; + font-size: 18px; + line-height: 50px; + text-align: left; + font-weight: 700; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box {width:100%; background:#fff; display:table;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_title {width:100px; font-size:14px; line-height:36px; float:left; font-weight:700;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list {width:700px; float:left;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li {margin-top:10px; display:table; width:100%;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.list_title_li {background:#EDF5FF; border-radius:5px; display:table; width:100%; padding:8px; margin:0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title {font-size:14px; font-weight:700; float:left; padding:0 10px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(1) {width:13%; border-radius:5px 0 0 5px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(2) {width:37%;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(3) {width:37%;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(4) {width:13%; border-radius:0 5px 5px 0;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box { + width: 100%; + background: #fff; + display: table; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.on .day_box .day{ background:#3985EA; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .day_box {width:13%; padding:0 10px; float:left; border-right:solid 1px #E9ECF0; box-sizing:border-box;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .day_box .day { width:70px; line-height:36px; border-radius:16px; font-size:14px; font-weight:700; color:#fff; background:#B5BDC4; text-align:center;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_title { + width: 100px; + font-size: 14px; + line-height: 36px; + float: left; + font-weight: 700; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box {width:37%; padding:0 10px; float:left; border-right:solid 1px #E9ECF0; box-sizing:border-box;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list {background:#fff; border-radius:5px; width:calc(50% - 15px); float:left; position:relative;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box {width:100%; height:36px; border:1px solid #E9ECF0; border-radius:5px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box.active {z-index:10;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .label {border: 1px solid #B5BDC4; background:#E9ECF0; cursor:pointer; position:absolute; top:50%; left:50%; transform:translate3D(-50%, -50%, 0); width:100%; height:100%; outline:none; color:#8F8F8F; font-size:14px; font-weight:400; padding:0 15px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.on .select_time_list_box .select_list .select_box .label { border: none; background: none; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list { min-width:100%; height:250px; overflow-y:auto; border-radius:5px; border:Solid 1px #E9ECF0; padding:10px; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .option_list_item {transition:.1s; position:relative; line-height:30px; font-size:14px; color:#494E53; text-align:center;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .option_list_item.first {margin:0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .slash {color:#000; font-size:14px; font-weight:400; line-height:36px; margin:0 12px; width:6px; display:block; float:left;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list { + width: 100%; + float: left; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li { + margin-top: 10px; + display: table; + width: 100%; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.list_title_li { + background: #EDF5FF; + border-radius: 5px; + display: table; + width: 100%; + padding: 8px; + margin: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title { + font-size: 14px; + font-weight: 700; + float: left; + padding: 0 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(1) { + width: 13%; + border-radius: 5px 0 0 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(2) { + width: 37%; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(3) { + width: 37%; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title:nth-child(4) { + width: 13%; + border-radius: 0 5px 5px 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.on .day_box .day { + background: #3985EA; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .day_box { + width: 13%; + padding: 0 10px; + float: left; + border-right: solid 1px #E9ECF0; + box-sizing: border-box; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .day_box .day { + width: 100%; + max-width: 70px; + line-height: 36px; + border-radius: 16px; + font-size: 14px; + font-weight: 700; + color: #fff; + background: #B5BDC4; + text-align: center; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box { + width: 37%; + padding: 0 10px; + float: left; + border-right: solid 1px #E9ECF0; + box-sizing: border-box; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list { + background: #fff; + border-radius: 5px; + width: calc(50% - 15px); + float: left; + position: relative; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box { + width: 100%; + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box.active { + z-index: 10; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .label { + border: 1px solid #B5BDC4; + background: #E9ECF0; + cursor: pointer; + position: absolute; + top: 50%; + left: 50%; + transform: translate3D(-50%, -50%, 0); + width: 100%; + height: 100%; + outline: none; + color: #8F8F8F; + font-size: 14px; + font-weight: 400; + padding: 0 15px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.on .select_time_list_box .select_list .select_box .label { + border: none; + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list { + min-width: 100%; + height: 250px; + overflow-y: auto; + border-radius: 5px; + border: Solid 1px #E9ECF0; + padding: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .option_list_item { + transition: .1s; + position: relative; + line-height: 30px; + font-size: 14px; + color: #494E53; + text-align: center; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .option_list_item.first { + margin: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .slash { + color: #000; + font-size: 14px; + font-weight: 400; + line-height: 36px; + margin: 0 12px; + width: 6px; + display: block; + float: left; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box {width:13%; height:36px; padding:0 10px; float:left; box-sizing:border-box; position:relative;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper {position:absolute; height:24px; top:50%; left:50%; transform:translate3d(-75%, -50%, 0);} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_input {position:absolute; appearance:none; -webkit-appearance:none; -moz-appearance:none;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_label {position:relative; cursor:pointer; display:inline-block; width:50px; height:24px; background:#D8DDE3; border:1px solid #B5BDC4; border-radius:20px; transition:0.2s; margin:0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_label .switch_btn {position:absolute; top:0; left:0; display:inline-block; width:22px; height:22px; border-radius:20px; background:#B5BDC4; transition:0.2s;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_input:checked+.switch_label {background:#EDF5FF; border:1px solid #3985EA;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_input:checked+.switch_label .switch_btn {top:0px; left:26px; background:#3985EA; box-shadow:1px 2px 3px #00000020;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box { + width: 13%; + height: 36px; + padding: 0 10px; + float: left; + box-sizing: border-box; + position: relative; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper { + position: absolute; + height: 24px; + top: 50%; + left: 50%; + transform: translate3d(-75%, -50%, 0); +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_input { + position: absolute; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_label { + position: relative; + cursor: pointer; + display: inline-block; + width: 50px; + height: 24px; + background: #D8DDE3; + border: 1px solid #B5BDC4; + border-radius: 20px; + transition: 0.2s; + margin: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_label .switch_btn { + position: absolute; + top: 0; + left: 0; + display: inline-block; + width: 22px; + height: 22px; + border-radius: 20px; + background: #B5BDC4; + transition: 0.2s; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_input:checked+.switch_label { + background: #EDF5FF; + border: 1px solid #3985EA; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper .switch_input:checked+.switch_label .switch_btn { + top: 0px; + left: 26px; + background: #3985EA; + box-shadow: 1px 2px 3px #00000020; +} @@ -74,17 +395,59 @@ -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box {display:table; width:100%; margin-top:40px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .holiday_title {width:100px; font-size:14px; line-height:36px; float:left; font-weight:700;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box { + display: table; + width: 100%; + margin-top: 40px; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box {width:calc(100% - 100px); height:36px; float:left; position:relative;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box .check_box {width:18px; height:18px; float:left; position:absolute; top:50%; left:0; transform:translateY(-50%);} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .holiday_title { + width: 100px; + font-size: 14px; + line-height: 36px; + float: left; + font-weight: 700; +} -.select_check_hide {display:none;} -.select_check_show {width:18px; height:18px; background:url(/image/web/check_off.svg) no-repeat; background-size:contain; } -.select_check_hide:checked + .select_check_show {background:url("/image/web/check_on.svg") no-repeat; background-size:contain;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box { + width: calc(100% - 100px); + height: 36px; + float: left; + position: relative; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box span {line-height:34px; font-size:14px; color:#494E53; margin-left:25px;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box .check_box { + width: 18px; + height: 18px; + float: left; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); +} + +.select_check_hide { + display: none; +} + +.select_check_show { + width: 18px; + height: 18px; + background: url(/image/web/check_off.svg) no-repeat; + background-size: contain; +} + +.select_check_hide:checked+.select_check_show { + background: url("/image/web/check_on.svg") no-repeat; + background-size: contain; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box span { + line-height: 34px; + font-size: 14px; + color: #494E53; + margin-left: 25px; +} @@ -93,72 +456,394 @@ -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box {width:100%; background:#fff; display:table; margin-top:40px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_title {width:100px; font-size:14px; line-height:36px; float:left; font-weight:700;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list {width:700px; float:left;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li {margin-top:10px; display:table; width:100%;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li.list_title_li {background:#EDF5FF; border-radius:5px; display:table; width:100%; padding:8px; margin:0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title {font-size:14px; font-weight:700; float:left; padding:0 10px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(1) {width:38%; border-radius:5px 0 0 5px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(2) {width:25%;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(3) {width:20%;border-radius: 0 5px 5px 0;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box { + width: 100%; + background: #fff; + display: table; + margin-top: 40px; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box {width:41%; float:left; position:relative; padding:0 10px; border-right:solid 1px #E9ECF0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box input {width:100%; height:36px; border:1px solid #E9ECF0; border-radius:5px; background:none; padding:0 10px; font-size:14px; background:#fff;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box input::placeholder {color:#B5BDC4;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_title { + width: 100px; + font-size: 14px; + line-height: 36px; + float: left; + font-weight: 700; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box {width:25%; float:left; position:relative; padding:0 10px; border-right:solid 1px #E9ECF0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box {position:relative; width:100%; height:36px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box.last {margin-left:0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box img {position:absolute; top:50%; transform:translateY(-50%); left:10px; z-index:1; width:22px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box .date_picker {line-height:34px; display:block; width:100%; font-size:14px; padding:0 12px; padding-left:40px; outline:none; border:1px solid #E9ECF0; border-radius:5px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box input[type="date"]::-webkit-calendar-picker-indicator {display:none;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box .date_picker {-webkit-appearance:none; -moz-appearance:none; appearance:none; position:absolute; cursor:pointer;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list { + width: 100%; + float: left; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li { + margin-top: 10px; + display: table; + width: 100%; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li.list_title_li { + background: #EDF5FF; + border-radius: 5px; + display: table; + width: 100%; + padding: 8px; + margin: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title { + font-size: 14px; + font-weight: 700; + float: left; + padding: 0 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(1) { + width: 38%; + border-radius: 5px 0 0 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(2) { + width: 25%; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(3) { + width: 20%; + border-radius: 0 5px 5px 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box { + width: 41%; + float: left; + position: relative; + padding: 0 10px; + border-right: solid 1px #E9ECF0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box input { + width: 100%; + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: none; + padding: 0 10px; + font-size: 14px; + background: #fff; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box input::placeholder { + color: #B5BDC4; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box { + width: 25%; + float: left; + position: relative; + padding: 0 10px; + border-right: solid 1px #E9ECF0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box { + position: relative; + width: 100%; + height: 36px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box.last { + margin-left: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box img { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 10px; + z-index: 1; + width: 22px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box .date_picker { + line-height: 34px; + display: block; + width: 100%; + font-size: 14px; + padding: 0 12px; + padding-left: 40px; + outline: none; + border: 1px solid #E9ECF0; + border-radius: 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box input[type="date"]::-webkit-calendar-picker-indicator { + display: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box .date_picker { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + position: absolute; + cursor: pointer; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list {background:#fff; border-right:solid 1px #E9ECF0; width:20%; float:left; position:relative; padding:0 10px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box {width:100%; height:36px; border: 1px solid #E9ECF0; border-radius:5px; background:url(/image/web/select_arrow.svg) no-repeat 95% 55%/20px auto;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box.active {z-index:10;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .label {display:flex; align-items:center; border:none; background:transparent; cursor:pointer; position:absolute; top:50%; transform:translateY(-50%); width:100%; height:100%; outline:none; color:#8F8F8F; font-size:14px; font-weight:400; padding:0 15px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list {position:absolute; top:40px; left:0; width:200px; background:#fff; color:#fff; border-radius:5px; transition:.4s ease-in; z-index:1; border:solid 1px #E9ECF0; display:none; margin:0; padding:10px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .search_box {width:100%; float:left; height:34px; position:relative; margin:0;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .search_box img {position:absolute; top:50%; transform:translateY(-50%); left:5px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .search_box input {width:100%; height:34px; border:solid 1px #D8DDE3; border-radius:5px; background:none; position:absolute; left:0; padding:0 10px 0 30px; font-size:14px;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list { + background: #fff; + border-right: solid 1px #E9ECF0; + width: 20%; + float: left; + position: relative; + padding: 0 10px; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .option_item {transition:.1s; position:relative;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .option_item.first {margin-top:40px;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box { + width: 100%; + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: url(/image/web/select_arrow.svg) no-repeat 95% 55%/20px auto; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_item .select_check_wrap {width:18px; height:18px; float:left; position:absolute; top:50%; left:0; transform:translateY(-50%);} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list { min-width:100%; border-radius:5px; border:solid 1px #E9ECF0; padding:10px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .option_list_item {transition:.1s; position:relative; line-height:30px; font-size:14px; margin-top:0; color:#494E53;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .option_list_item.first {margin:0;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box.active { + z-index: 10; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box { width:7%; height:36px; float:left; padding:0 10px; position:relative; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button { width:24px; height:24px; padding:0; position:absolute; top:50%; transform:translateY(-50%); background:none; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button img { vertical-align:top; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box { width:7%; height:36px; float:left; position:relative; padding:0 10px; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button { width:24px; height:24px; padding:0; position:absolute; top:50%; transform:translateY(-50%); background:none; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button img { width:24px; height:24px; vertical-align:top; } +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .label { + display: flex; + align-items: center; + border: none; + background: transparent; + cursor: pointer; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100%; + height: 100%; + outline: none; + color: #8F8F8F; + font-size: 14px; + font-weight: 400; + padding: 0 15px; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li button:hover { background: none !important; } +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list { + position: absolute; + top: 40px; + left: 0; + width: 200px; + background: #fff; + color: #fff; + border-radius: 5px; + transition: .4s ease-in; + z-index: 1; + border: solid 1px #E9ECF0; + display: none; + margin: 0; + padding: 10px; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box {width:100%; background:#fff; display:table;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .admset_title {width:100px; font-size:14px; line-height:36px; float:left; font-weight:700;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box {width:calc(100% - 100px); float:left; display:table; margin-bottom:10px;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box button { margin-left: 10px; clear: both; font-size: 14px; font-weight: 700; line-height: 36px; color: #3985EA; background: none; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input { width: 200px; } -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input:read-only { outline: 0; border: 1px solid #D8DDE3; background: #E9ECF0; } +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .search_box { + width: 100%; + float: left; + height: 34px; + position: relative; + margin: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .search_box img { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 5px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .search_box input { + width: 100%; + height: 34px; + border: solid 1px #D8DDE3; + border-radius: 5px; + background: none; + position: absolute; + left: 0; + padding: 0 10px 0 30px; + font-size: 14px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .option_item { + transition: .1s; + position: relative; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_list .option_item.first { + margin-top: 40px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .option_item .select_check_wrap { + width: 18px; + height: 18px; + float: left; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list { + min-width: 100%; + border-radius: 5px; + border: solid 1px #E9ECF0; + padding: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .option_list_item { + transition: .1s; + position: relative; + line-height: 30px; + font-size: 14px; + margin-top: 0; + color: #494E53; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .option_list_item.first { + margin: 0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box { + width: 7%; + height: 36px; + float: left; + padding: 0 10px; + position: relative; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button { + width: 24px; + height: 24px; + padding: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button img { + vertical-align: top; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box { + width: 7%; + height: 36px; + float: left; + position: relative; + padding: 0 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button { + width: 24px; + height: 24px; + padding: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button img { + width: 24px; + height: 24px; + vertical-align: top; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li button:not(.save_box button):hover { + background: none !important; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .save_box button:hover { + background: #2d3748 !important; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box { + width: 100%; + background: #fff; + display: table; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .admset_title { + width: 100px; + font-size: 14px; + line-height: 36px; + float: left; + font-weight: 700; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box { + width: calc(100% - 100px); + float: left; + display: table; + margin-bottom: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box button { + margin-left: 10px; + clear: both; + font-size: 14px; + font-weight: 700; + line-height: 36px; + color: #3985EA; + background: none; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input { + width: 200px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input:read-only { + outline: 0; + border: 1px solid #D8DDE3; + background: #E9ECF0; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input { + width: 200px; + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 5px; + font-size: 14px; + padding: 0 10px; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input {width:200px; height:36px; border:1px solid #E9ECF0; border-radius:5px; font-size:14px; padding:0 10px;} /* .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input::placeholder {color:#B5BDC4;} */ -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input:disabled {background:#E9ECF0; border:solid 1px #D8DDE3; color:#21272C;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box a {font-size:14px; color:#3985EA; line-height:36px; margin-left:20px; font-weight:700;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input:disabled { + background: #E9ECF0; + border: solid 1px #D8DDE3; + color: #21272C; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box .comment {font-size:12px; margin-top:10px; padding-left:10px;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box a { + font-size: 14px; + color: #3985EA; + line-height: 36px; + margin-left: 20px; + font-weight: 700; +} -.project_wrap .content_section .hospital_wrap .center_box .info_box .button_box {margin-top:50px; text-align:center;} -.project_wrap .content_section .hospital_wrap .center_box .info_box .button_box button {border-radius:16px; color:#fff; background:#3985EA;} +.project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box .comment { + font-size: 12px; + margin-top: 10px; + padding-left: 10px; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .button_box { + margin-top: 50px; + text-align: center; +} + +.project_wrap .content_section .hospital_wrap .center_box .info_box .button_box button { + border-radius: 16px; + color: #fff; + background: #3985EA; +} @@ -167,75 +852,402 @@ +/* FullCalendar Custom Style */ +.fc .fc-toolbar-title { + font-size: 18px !important; + font-weight: 700; + color: #21272C; +} + +.fc .fc-button-primary { + background-color: #fff; + border: 1px solid #D8DDE3; + color: #494E53; + font-size: 14px; + font-weight: 500; + padding: 6px 12px; + border-radius: 5px; + transition: all 0.2s; +} + +.fc .fc-button-primary:hover { + background-color: #F5F7FA; + border-color: #D8DDE3; + color: #21272C; +} + +.fc .fc-button-primary:not(:disabled).fc-button-active, +.fc .fc-button-primary:not(:disabled):active { + background-color: #3985EA; + border-color: #3985EA; + color: #fff; +} + +.fc .fc-button-primary:disabled { + background-color: #F5F7FA; + border-color: #E9ECF0; + color: #B5BDC4; + opacity: 1; +} + +.fc .fc-button .fc-icon { + font-size: 1.2em; + vertical-align: bottom; +} + +.fc .fc-col-header-cell-cushion { + color: #21272C; + font-weight: 700; + padding: 10px 0; + font-size: 14px; + text-decoration: none; +} + +.fc .fc-daygrid-day-number { + color: #494E53; + font-size: 12px; + padding: 5px 10px; + text-decoration: none; + font-weight: 500; +} + +.fc .fc-day-sunday .fc-col-header-cell-cushion, +.fc .fc-day-sunday .fc-daygrid-day-number { + color: #E02020; +} + +.fc .fc-day-saturday .fc-col-header-cell-cushion, +.fc .fc-day-saturday .fc-daygrid-day-number { + color: #3985EA; +} + +.fc .fc-day-today { + background-color: #EDF5FF !important; +} + +.fc-theme-standard td, +.fc-theme-standard th { + border-color: #E9ECF0; +} + +.fc-event { + border: none; + border-radius: 3px; + padding: 2px 5px; + font-size: 12px; + font-weight: 500; + letter-spacing: -0.02em; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} + +.fc-h-event .fc-event-main { + color: #fff; +} + + /*반응형 View*/ @media only screen and (max-width:1500px) { - .project_wrap .content_section .hospital_wrap .left_box { width:160px; padding:10px 15px; } - .project_wrap .content_section .hospital_wrap .center_box { width:calc(100% - 160px); left:160px; } + .project_wrap .content_section .hospital_wrap .left_box { + width: 160px; + padding: 10px 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box { + width: calc(100% - 160px); + left: 160px; + } } @media only screen and (max-width:1280px) { - .project_wrap .content_section .hospital_wrap { width:calc(100% - 60px); } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { font-size:12px; } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { height:32px; margin-bottom:5px; } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .page_title { height:40px; font-size:16px; line-height:40px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box { height:calc(100% - 60px); padding:30px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .info { width:500px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .title { height:40px; line-height:40px; font-size:16px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_title { width:80px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list { width:500px; float:none; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.list_title_li { padding:0; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .day_box .day { width:100%; line-height:32px; font-size:12px; border-radius:10px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box { height:32px; background-size:18px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .label { padding:0 10px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list { width:100%; height:180px; overflow-y:auto; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .search_box { height:28px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .search_box img { width:22px; margin-top:1px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .option_list_item { font-size:12px; margin-top:0; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .slash { margin:0 5px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box { height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper { transform: translate(-50%, -50%); } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box { margin-top:30px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .holiday_title { width:80px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box { width:calc(100% - 80px); height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box span { margin-left:20px; font-size:12px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box .check_box { width:15px; height:15px; } - .select_check_show { width:15px; height:15px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box { margin-top:20px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list { width:500px; float:none; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li.list_title_li { padding:0; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box { width:40%; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box { width:27%; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list { width:23%; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box { width:10%; height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(1) {width:40%; border-radius:5px 0 0 5px;} - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(2) {width:27%;} - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(3) {width:23%;border-radius: 0 5px 5px 0;} - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box input { height:32px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box { width:110px; height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box img { width:20px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box .date_picker { height:32px; padding-left:35px; font-size:12px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box { height:32px; background-size:18px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .label { padding:0 10px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list { width:100%; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .search_box { height:28px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .search_box img { width:22px; margin-top:1px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .option_list_item { font-size:12px; margin-top:0; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button { width:22px; height:22px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button img { width:22px; height:22px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button { width:22px; height:22px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button img { width:22px; height:22px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .admset_title { width:80px; font-size:12px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box { width:calc(100% - 80px); } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input { width:140px; height:32px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box a { font-size:12px; line-height:32px; margin-left:10px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .button_box { margin-top:30px; } - .project_wrap .content_section .hospital_wrap .center_box .info_box .button_box button { width:80px; } + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 60px); + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { + height: 32px; + margin-bottom: 5px; + } + + .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .page_title { + height: 40px; + font-size: 16px; + line-height: 40px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box { + height: calc(100% - 60px); + padding: 30px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .info { + width: 500px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .title { + height: 40px; + line-height: 40px; + font-size: 16px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_title { + width: 80px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list { + width: 500px; + float: none; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li.list_title_li { + padding: 0; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .list_title { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .day_box .day { + width: 100%; + line-height: 32px; + font-size: 12px; + border-radius: 10px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box { + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list { + width: 100%; + height: 180px; + overflow-y: auto; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .search_box { + height: 28px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .search_box img { + width: 22px; + margin-top: 1px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .select_list .select_box .select_option_list .option_list_item { + font-size: 12px; + margin-top: 0; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .select_time_list_box .slash { + margin: 0 5px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box { + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .time_box .time_list li .wrapper_box .wrapper { + transform: translate(-50%, -50%); + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box { + margin-top: 30px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .holiday_title { + width: 80px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box { + width: calc(100% - 80px); + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box span { + margin-left: 20px; + font-size: 12px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .holiday_box .check_holiday_box .check_box { + width: 15px; + height: 15px; + } + + .select_check_show { + width: 15px; + height: 15px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box { + margin-top: 20px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list { + width: 500px; + float: none; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li.list_title_li { + padding: 0; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title { + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box { + width: 40%; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box { + width: 27%; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list { + width: 23%; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box { + width: 10%; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(1) { + width: 40%; + border-radius: 5px 0 0 5px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(2) { + width: 27%; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .list_title:nth-child(3) { + width: 23%; + border-radius: 0 5px 5px 0; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .input_box input { + height: 32px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box { + width: 110px; + height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box img { + width: 20px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .calendar_box .date_box .date_picker { + height: 32px; + padding-left: 35px; + font-size: 12px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box { + height: 32px; + background-size: 18px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .label { + padding: 0 10px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list { + width: 100%; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .search_box { + height: 28px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .search_box img { + width: 22px; + margin-top: 1px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .select_list .select_box .select_option_list .option_list_item { + font-size: 12px; + margin-top: 0; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button { + width: 22px; + height: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .add_box button img { + width: 22px; + height: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button { + width: 22px; + height: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .hospital_box .hospital_list li .subtract_box button img { + width: 22px; + height: 22px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .admset_title { + width: 80px; + font-size: 12px; + line-height: 32px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box { + width: calc(100% - 80px); + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box input { + width: 140px; + height: 32px; + font-size: 12px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .form_box .admset_box .input_box a { + font-size: 12px; + line-height: 32px; + margin-left: 10px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .button_box { + margin-top: 30px; + } + + .project_wrap .content_section .hospital_wrap .center_box .info_box .button_box button { + width: 80px; + } } @media only screen and (max-width:1080px) { - .project_wrap .content_section .hospital_wrap { width:calc(100% - 50px); } + .project_wrap .content_section .hospital_wrap { + width: calc(100% - 50px); + } } \ No newline at end of file diff --git a/src/main/resources/static/css/web/sms_template.css b/src/main/resources/static/css/web/sms_template.css new file mode 100644 index 0000000..6d92076 --- /dev/null +++ b/src/main/resources/static/css/web/sms_template.css @@ -0,0 +1,285 @@ +/* ============================================ + 문자 상용구 관리 - 좌측 목록 / 우측 상세 + ============================================ */ + +/* ---- 2패널 컨테이너 ---- */ +.sms_two_panel { + display: flex; + gap: 10px; + height: calc(100% - 60px); + min-height: 400px; + clear: both; +} + +/* ---- 좌측 목록 패널 ---- */ +.sms_left_panel { + width: 45%; + min-width: 360px; + display: flex; + flex-direction: column; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: #fff; + overflow: hidden; +} + +/* 검색 영역 */ +.sms_search_area { + display: flex; + gap: 5px; + padding: 10px; + border-bottom: 1px solid #E9ECF0; + align-items: center; +} + +.sms_search_box { + flex: 1; + position: relative; + height: 36px; +} + +.sms_search_box img { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 8px; + z-index: 1; + width: 18px; +} + +.sms_search_box input { + width: 100%; + height: 36px; + border: 1px solid #E9ECF0; + border-radius: 5px; + padding: 0 10px 0 32px; + font-size: 13px; + background: #fff; +} + +.sms_search_box input::placeholder { + color: #B5BDC4; +} + +.sms_search_btn { + height: 36px; + padding: 0 14px; + background: #3985EA; + color: #fff; + border: none; + border-radius: 5px; + font-size: 13px; + cursor: pointer; + white-space: nowrap; +} + +.sms_search_btn:hover { + background: #2D6CC0; +} + +.sms_new_btn { + height: 36px; + padding: 0 14px; + background: #fff; + color: #3985EA; + border: 1px solid #3985EA; + border-radius: 5px; + font-size: 13px; + cursor: pointer; + white-space: nowrap; +} + +.sms_new_btn:hover { + background: #3985EA; + color: #fff; +} + +/* ag-Grid 영역 */ +.sms_grid_box { + flex: 1; + width: 100%; +} + +/* ---- 우측 상세 패널 ---- */ +.sms_right_panel { + flex: 1; + display: flex; + flex-direction: column; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: #fff; + overflow: hidden; +} + +/* 빈 상태 */ +.sms_empty_state { + flex: 1; + display: flex; + align-items: center; + justify-content: center; +} + +.sms_empty_state p { + text-align: center; + color: #B5BDC4; + font-size: 14px; + line-height: 2; +} + +/* 상세 폼 */ +.sms_detail_form { + flex: 1; + display: flex; + flex-direction: column; + overflow-y: auto; +} + +.sms_detail_title_bar { + padding: 14px 20px; + border-bottom: 1px solid #E9ECF0; +} + +.sms_detail_title_bar h3 { + margin: 0; + font-size: 16px; + font-weight: 700; + color: #333; +} + +.sms_form_row { + padding: 0 20px; + margin-top: 14px; +} + +.sms_form_row label { + display: block; + margin-bottom: 5px; + font-size: 13px; + font-weight: 600; + color: #555; +} + +.sms_form_row input[type="text"] { + width: 100%; + height: 38px; + padding: 0 12px; + border: 1px solid #E9ECF0; + border-radius: 5px; + font-size: 14px; + box-sizing: border-box; +} + +.sms_form_row textarea { + width: 100%; + padding: 10px 12px; + border: 1px solid #E9ECF0; + border-radius: 5px; + font-size: 14px; + resize: vertical; + min-height: 160px; + line-height: 1.6; + box-sizing: border-box; +} + +.sms_form_row input:focus, +.sms_form_row textarea:focus { + border-color: #3985EA; + outline: none; + box-shadow: 0 0 0 2px rgba(57, 133, 234, 0.12); +} + +.byte_info { + text-align: right; + margin-top: 5px; + font-size: 12px; + color: #888; +} + +.type_badge { + display: inline-block; + padding: 2px 8px; + border-radius: 10px; + font-size: 11px; + font-weight: 600; + margin-left: 4px; + vertical-align: middle; +} + +.type_badge.sms { + background: #E8F5E9; + color: #2E7D32; +} + +.type_badge.lms { + background: #FFF3E0; + color: #E65100; +} + +.sms_info_row { + display: flex; + gap: 16px; + padding: 10px 20px !important; + margin-top: 10px !important; + border-top: 1px solid #F0F1F3; + font-size: 12px; + color: #888; +} + +.sms_info_row strong { + font-weight: 500; + color: #555; +} + +.sms_btn_group { + display: flex; + gap: 8px; + padding: 14px 20px; + border-top: 1px solid #E9ECF0; + margin-top: auto; +} + +.sms_save_btn { + height: 36px; + padding: 0 24px; + border: none; + border-radius: 5px; + background: #3985EA; + color: #fff; + font-size: 13px; + cursor: pointer; +} + +.sms_save_btn:hover { + background: #2D6CC0; +} + +.sms_delete_btn { + height: 36px; + padding: 0 18px; + border: 1px solid #FF2222; + border-radius: 5px; + background: transparent; + color: #FF2222; + font-size: 13px; + cursor: pointer; +} + +.sms_delete_btn:hover { + background: #FF2222; + color: #fff; +} + +.sms_cancel_btn { + height: 36px; + padding: 0 18px; + border: 1px solid #E9ECF0; + border-radius: 5px; + background: #fff; + color: #666; + font-size: 13px; + cursor: pointer; +} + +.sms_cancel_btn:hover { + background: #F7F8FA; +} \ No newline at end of file diff --git a/src/main/resources/static/css/web/webPopupSelectList.css b/src/main/resources/static/css/web/webPopupSelectList.css index 000f582..eb7524e 100644 --- a/src/main/resources/static/css/web/webPopupSelectList.css +++ b/src/main/resources/static/css/web/webPopupSelectList.css @@ -1,11 +1,6 @@ .project_wrap {width:100%; min-width:1080px; margin:0 auto;} -#homepageDivCd{ - float:left; - font-size:18px; - padding: 5px; - border-radius: 5px; - border-color: #ddd; -} +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box.first { width:150px; } +.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { cursor:pointer; } /*오른쪽영역*/ .project_wrap .content_section {margin-top:50px; width:100%; min-width:1080px; display:table;} .project_wrap .content_section .hospital_wrap {width: calc(100% - 72px); min-width:calc(1080px - 72px); height:calc(100vh - 50px); float:left; position:relative;} diff --git a/src/main/resources/static/css/web/webTreatmentPetitSelectList.css b/src/main/resources/static/css/web/webTreatmentPetitSelectList.css deleted file mode 100644 index 356e714..0000000 --- a/src/main/resources/static/css/web/webTreatmentPetitSelectList.css +++ /dev/null @@ -1,107 +0,0 @@ -.project_wrap {width:100%; min-width:1080px; margin:0 auto;} - -/*오른쪽영역*/ -.project_wrap .content_section {margin-top:50px; width:100%; min-width:1080px; display:table;} -.project_wrap .content_section .hospital_wrap {width: calc(100% - 72px); min-width:calc(1080px - 72px); height:calc(100vh - 50px); float:left; position:relative;} - - -/* 왼쪽_메뉴 영역 */ -.project_wrap .content_section .hospital_wrap .left_box {position:absolute; width:240px; height:calc(100vh - 50px); overflow:auto; padding:10px 20px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list {width:100%;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu {width:100%; height:auto; margin:20px 0 10px 0; padding:0; font-size:14px; font-weight:700;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu.first {margin-top:0;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a {width:100%; height:100%; display:block; margin-bottom:8px; padding:8px; font-size:14px; text-align:left; border-radius:5px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list a.on {background:#3985EA; border:none;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li {width:100%; height:36px; margin-bottom:8px;} -.project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a.on {color:#fff;} - -/* 센터쪽 */ -.project_wrap .content_section .hospital_wrap .center_box {width:calc(100% - 240px); height:calc(100vh - 50px); position:absolute; left:240px; padding:10px 10px 10px 0;} -.project_wrap .content_section .hospital_wrap .center_box .page_title {min-width:90px; padding-left:10px; font-size:18px; font-weight:700; line-height:50px; float:left;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box {display:table; width:100%; padding:20px 0;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box {width:140px; height:36px; margin-left:10px; border:1px solid #E9ECF0; border-radius:5px; background:url(/image/web/select_arrow.svg) no-repeat 95% 55%/20px auto #fff;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box.first { width:100px; margin-left:0; float:left; } -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .slash {width:6px; font-size:14px; font-weight:400; color:#000; line-height:36px; margin:0 12px; display:block; float:left;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list_box { margin-left:10px; } -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box.active {z-index:10;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label {width:100%; height:100%; padding:0 10px; outline:none; font-size:14px; font-weight:400; text-align:left; color: #494E53; cursor:pointer; background:none;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list {min-width:100%; border-radius:5px; transition:.4s ease-in; border:Solid 1px #E9ECF0; padding:10px; } -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item {width:100%; line-height:30px; transition:.1s; position:relative; display:table; font-size:14px; color:#494E53;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item label {width:100%; line-height:30px; margin-bottom:0px; clear:both; font-weight:400;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box {border-radius:8px; float:left; position:relative;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box {position:relative; width:140px; height:36px; float:left; margin-left:10px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box.last {margin-left:0;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box img {position:absolute; top:50%; transform:translateY(-50%); left:10px; z-index:1; width:22px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box .date_picker {line-height:34px; display:block; margin-right:20px; width:100%; font-size:14px; padding:0 12px; padding-left:40px; outline:none; border:1px solid #E9ECF0; border-radius:5px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box input[type="date"]::-webkit-calendar-picker-indicator {display:none;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box .date_picker {-webkit-appearance:none; -moz-appearance:none; appearance:none; position:absolute; cursor:pointer;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .slash {color:#000; font-size:14px; font-weight:400; line-height:36px; margin:0 5px; width:6px; display:block; float:left;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list {float:left; position:relative; margin-left:10px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box {width:150px; float:left; height:36px; position:relative;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box img {position:absolute; top:50%; transform:translateY(-50%); left:5px; z-index:1;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box input {width:100%; height:36px; border:1px solid #E9ECF0; border-radius:5px; background:none; position:absolute; left:0; padding:0 10px 0 30px; font-size:14px; background:#fff;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box input::placeholder {color:#B5BDC4;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box .search_list {position:absolute; top:40px; left:0; width:150px; background:#fff; color:#fff; border-radius:5px; transition:.4s ease-in; z-index:1; border:solid 1px #E9ECF0; display:none; margin:0; padding:10px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_btn {background:#3985EA; border-radius:5px; color:#fff; margin-left:5px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box {float:right;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .treatmentpetit_btn {background:#3985EA; color:#fff; border-radius:5px; float:left;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .treatmentpetit_btn img {position:relative; top:-2px; width:20px; margin-right:5px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .delete_btn {background:#FF2222; color:#fff; border-radius:5px; margin-left:10px;} -.project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .right_btn_box .delete_btn img {position:relative; top:-2px; width:20px; margin-right:5px;} - -/* table_box */ -.project_wrap .content_section .hospital_wrap .center_box .table_box {width:100%; height:calc(100% - 180px); overflow:auto; background:#fff; border:solid 1px #E9ECF0; border-radius:5px;} - -/* 페이지게이션 */ -.project_wrap .content_section .hospital_wrap .center_box .page_box {position:absolute; bottom:20px; width:100%; height:24px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation {height:24px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination {margin:0 auto; display:table;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li {display:inline-block; padding:0} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a {position:relative; width:24px; height:24px; background:none;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a:hover, .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a:hover {background:none;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img {position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0); width:10px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img {position:absolute; top:50%; left:50%; transform:translate3d(-50%, -50%, 0) rotate(180deg); width:10px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a {width:24px; height:24px; padding:0; border:none; text-align:center; line-height:22px; font-size:14px; font-weight:500; background:#FFF; font-size:14px;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a:hover, .project_wrap .content_section .hospital_wrap .center_box .right_note .page_box .navigation .pagination li a:focus {background:#3985EA; color:#fff; font-weight:700;} -.project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li.active a {background:#3985EA; color:#fff;} - -/*반응형 View*/ -@media only screen and (max-width:1500px) { - .project_wrap .content_section .hospital_wrap .left_box { width:160px; padding:10px 15px; } - .project_wrap .content_section .hospital_wrap .center_box { width:calc(100% - 160px); left:160px; } -} - -@media only screen and (max-width:1280px) { - .project_wrap .content_section .hospital_wrap { width:calc(100% - 60px); } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list .title_menu { font-size:12px; } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li { height:32px; margin-bottom:5px; } - .project_wrap .content_section .hospital_wrap .left_box .sub_menu_list li a { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .page_title { min-width:80px; height:40px; font-size:16px; line-height:40px; } - .project_wrap .content_section .hospital_wrap .center_box .total { font-size:12px; line-height:40px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box { padding:15px 0; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box { width:120px; height:32px; background-size:18px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .label { padding:0 10px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .select_box .select_option_list .option_list_item { font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box { width:120px; height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box img { width:20px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .date_box .date_picker { height:32px; padding-left:35px; font-size:12px; line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .calendar_box .slash { line-height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box { width:120px; height:32px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box img { width:22px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .form_box .search_list .search_box input { height:32px; padding-left:35px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn { margin-left:5px; padding-left:10px; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn p { display:none; } - .project_wrap .content_section .hospital_wrap .center_box .filter_box .right_btn_box .download_btn img { width:12px; margin-top:-3px; position:static; transform:none; } - .project_wrap .content_section .hospital_wrap .center_box .page_box { height:23px; } - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation { height:23px; } - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li a { width:23px; height:23px; font-size:12px; } - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a, - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a { width:23px; height:23px; } - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:first-child a img, - .project_wrap .content_section .hospital_wrap .center_box .page_box .navigation .pagination li:last-child a img { width:9px; } - .project_wrap .content_section .hospital_wrap .center_box .table_box { height:calc(100% - 155px); } -} - -@media only screen and (max-width:1080px) { - .project_wrap .content_section .hospital_wrap { width:calc(100% - 50px); } -} \ No newline at end of file diff --git a/src/main/resources/static/js/web/callLog/callLogSelectList.js b/src/main/resources/static/js/web/callLog/callLogSelectList.js new file mode 100644 index 0000000..a6517d5 --- /dev/null +++ b/src/main/resources/static/js/web/callLog/callLogSelectList.js @@ -0,0 +1,427 @@ +/** + * 통화 로그 관리 - ag-Grid + */ +$(document).ready(function () { + fn_initGrid(); + fn_init(); + fn_setToday(); + fn_loadCallLogList(); +}); + +/* ============================================ + 전역 변수 + ============================================ */ +var gridApi = null; + +/* ARS 메뉴 번호 → 텍스트 매핑 */ +var arsMenuMap = { + '1': '상담', + '2': '예약', + '3': '위치안내' +}; + +/* ============================================ + ag-Grid 초기화 + ============================================ */ +function fn_initGrid() { + var columnDefs = [ + { + headerName: 'No', + valueGetter: function (params) { + return params.node.rowIndex + 1; + }, + width: 60, + maxWidth: 60, + cellStyle: { textAlign: 'center' }, + suppressSizeToFit: true + }, + { + headerName: 'RECORD NO', + field: 'recordNo', + width: 100, + maxWidth: 110, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '구분1', + field: 'menuText', + width: 100, + maxWidth: 120, + cellStyle: { textAlign: 'center' }, + valueGetter: function (params) { + var d = params.data; + if (!d) return ''; + if (d.bound === 'OUT') return 'OUT'; + if (d.callbackCid) return 'Call Back'; + return arsMenuMap[d.ring] || ''; + }, + cellRenderer: function (params) { + if (!params.data) return ''; + if (params.data.bound === 'OUT') { + return 'OUT'; + } + if (params.data.callbackCid) { + return 'Call Back
' + params.data.callbackCid + ''; + } + return params.value || ''; + } + }, + { + headerName: '구분2', + field: 'cType1', + width: 65, + maxWidth: 80, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '구분3', + field: 'cType2', + width: 80, + maxWidth: 100, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '고객명', + field: 'memberName', + width: 90, + maxWidth: 120, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '전화번호', + field: 'cid', + width: 120, + maxWidth: 140, + cellStyle: { textAlign: 'center' }, + valueFormatter: function (params) { + return fn_formatPhone(params.value); + } + }, + { + headerName: '전화 온 시간', + field: 'regDate', + width: 145, + maxWidth: 160, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '통화 시작', + field: 'linkDate', + width: 145, + maxWidth: 160, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '통화 종료', + valueGetter: function (params) { + if (!params.data) return ''; + return params.data.linkEndDate || params.data.bendDate || ''; + }, + width: 145, + maxWidth: 160, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '상담 전화번호', + field: 'linkCid', + width: 110, + maxWidth: 130, + cellStyle: { textAlign: 'center' } + }, + { + headerName: '통화파일', + field: 'recordNo', + width: 80, + maxWidth: 90, + cellStyle: { textAlign: 'center' }, + cellRenderer: function (params) { + if (!params.data || !params.data.recordNo || !params.data.linkDate) return ''; + var btn = ''; + return btn; + } + }, + { + headerName: 'In Call', + field: 'incallSel', + width: 150, + minWidth: 100, + cellStyle: { textAlign: 'left' }, + cellRenderer: function (params) { + var val = params.value; + if (!val) return ''; + // incallSel은 '|=|값1|=||=|값2|=|' 형식 + var items = val.split('|=|').filter(function (v) { return v.trim() !== ''; }); + if (items.length === 0) return ''; + return items.map(function (item) { + return '' + item + ''; + }).join(' '); + } + }, + { + headerName: '메모', + field: 'callMsg', + flex: 1, + minWidth: 120, + cellStyle: { textAlign: 'left', cursor: 'pointer' }, + cellRenderer: function (params) { + var msg = params.value || ''; + // HTML 태그 제거하여 표시 + var plainText = msg.replace(/<[^>]+>/g, '').trim(); + if (plainText.length > 30) { + plainText = plainText.substring(0, 30) + '...'; + } + return plainText || '클릭하여 메모 입력'; + } + } + ]; + + var gridOptions = { + columnDefs: columnDefs, + rowData: [], + rowSelection: 'single', + animateRows: true, + headerHeight: 36, + rowHeight: 40, + suppressCellFocus: true, + overlayNoRowsTemplate: '검색된 통화 내역이 없습니다.', + onCellClicked: function (event) { + if (event.colDef.field === 'callMsg') { + fn_openMemo(event.data); + } + }, + defaultColDef: { + resizable: true, + sortable: true + } + }; + + var gridDiv = document.querySelector('#callLogGrid'); + gridApi = new agGrid.Grid(gridDiv, gridOptions); + gridApi = gridOptions.api; +} + +/* ============================================ + 초기화 (이벤트 바인딩) + ============================================ */ +function fn_init() { + $('#searchBtn').on('click', function () { + fn_loadCallLogList(); + }); + + $('#mCid').on('keypress', function (e) { + if (e.which === 13) fn_loadCallLogList(); + }); + + $('#sDate, #eDate').on('change', function () { + // 날짜 변경 시 자동 검색하지 않음 (사용자가 조회 버튼 클릭) + }); +} + +/* ============================================ + 오늘 날짜 설정 + ============================================ */ +function fn_setToday() { + var today = fn_getDateStr(new Date()); + $('#sDate').val(today); + $('#eDate').val(today); +} + +/* ============================================ + 날짜 단축 버튼 + ============================================ */ +function fn_dayChk(type) { + var now = new Date(); + var sDate, eDate; + + switch (type) { + case 't': // 오늘 + sDate = new Date(); + eDate = new Date(); + break; + case 'p': // 어제 + sDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); + eDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); + break; + case 'w': // 이번주 (월요일~오늘) + var dayOfWeek = now.getDay(); + var diff = dayOfWeek === 0 ? 6 : dayOfWeek - 1; + sDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - diff); + eDate = new Date(); + break; + case 'pw': // 지난주 (월요일~일요일) + var dayOfWeek = now.getDay(); + var diff = dayOfWeek === 0 ? 6 : dayOfWeek - 1; + var thisMonday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - diff); + sDate = new Date(thisMonday.getFullYear(), thisMonday.getMonth(), thisMonday.getDate() - 7); + eDate = new Date(thisMonday.getFullYear(), thisMonday.getMonth(), thisMonday.getDate() - 1); + break; + case 'm': // 이번달 + sDate = new Date(now.getFullYear(), now.getMonth(), 1); + eDate = new Date(); + break; + case 'pm': // 지난달 + sDate = new Date(now.getFullYear(), now.getMonth() - 1, 1); + eDate = new Date(now.getFullYear(), now.getMonth(), 0); + break; + default: + return; + } + + $('#sDate').val(fn_getDateStr(sDate)); + $('#eDate').val(fn_getDateStr(eDate)); + fn_loadCallLogList(); +} + +/* ============================================ + 목록 조회 + ============================================ */ +function fn_loadCallLogList() { + var param = { + sDate: $('#sDate').val(), + eDate: $('#eDate').val(), + callType: $('#callType').val(), + callType1: $('#callType1').val(), + callType2: $('#callType2').val(), + mCid: $('#mCid').val().replace(/[^0-9]/g, ''), + fulldnis: '', // TODO: 매장별 수신번호 설정 필요 + menuClass: menuClass + }; + + $.ajax({ + url: '/callLog/getCallLogList.do', + type: 'POST', + data: param, + dataType: 'json', + success: function (data) { + var rows = data.rows || []; + gridApi.setRowData(rows); + + if (rows.length === 0) { + gridApi.showNoRowsOverlay(); + } + + // 통계 업데이트 + fn_updateStats(data.stats); + }, + error: function () { + alert('목록 조회 중 오류가 발생하였습니다.'); + } + }); +} + +/* ============================================ + 통계 업데이트 + ============================================ */ +function fn_updateStats(stats) { + if (!stats) { + $('#statTotal, #statIn, #statOut, #statType1, #statType2, #statType11, #statType12, #statType13').text('0'); + return; + } + + $('#statTotal').text(fn_numberFormat(stats.totalCnt || 0)); + $('#statIn').text(fn_numberFormat(stats.inCnt || 0)); + $('#statOut').text(fn_numberFormat(stats.outCnt || 0)); + $('#statType1').text(fn_numberFormat(stats.type1Cnt || 0)); + $('#statType2').text(fn_numberFormat(stats.type2Cnt || 0)); + $('#statType11').text(fn_numberFormat(stats.type11Cnt || 0)); + $('#statType12').text(fn_numberFormat(stats.type12Cnt || 0)); + $('#statType13').text(fn_numberFormat(stats.type13Cnt || 0)); +} + +/* ============================================ + 메모 팝업 + ============================================ */ +function fn_openMemo(data) { + if (!data || !data.recordNo) return; + + $('#memoRecordNoVal').val(data.recordNo); + $('#memoRecordNo').text('RECORD NO: ' + data.recordNo); + $('#memoContent').val(data.callMsg || ''); + $('#memoOverlay').fadeIn(200); + $('#memoContent').focus(); +} + +function fn_closeMemo() { + $('#memoOverlay').fadeOut(200); +} + +function fn_saveMemo() { + var recordNo = $('#memoRecordNoVal').val(); + var callMsg = $.trim($('#memoContent').val()); + + if (!recordNo) return; + + var param = { + recordNo: recordNo, + callMsg: callMsg, + menuClass: menuClass + }; + + $.ajax({ + url: '/callLog/saveCallMemo.do', + type: 'POST', + data: param, + dataType: 'json', + success: function (data) { + alert(data.msgDesc || '저장되었습니다.'); + fn_closeMemo(); + fn_loadCallLogList(); + }, + error: function () { + alert('메모 저장 중 오류가 발생하였습니다.'); + } + }); +} + +/* ============================================ + 유틸리티 함수 + ============================================ */ +function fn_getDateStr(date) { + var y = date.getFullYear(); + var m = ('0' + (date.getMonth() + 1)).slice(-2); + var d = ('0' + date.getDate()).slice(-2); + return y + '-' + m + '-' + d; +} + +function fn_numberFormat(num) { + if (!num && num !== 0) return '0'; + return Number(num).toLocaleString(); +} + +function fn_formatPhone(phone) { + if (!phone) return ''; + phone = phone.replace(/[^0-9]/g, ''); + if (phone.length === 11) { + return phone.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3'); + } else if (phone.length === 10) { + return phone.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3'); + } else if (phone.length === 9) { + return phone.replace(/(\d{2})(\d{3})(\d{4})/, '$1-$2-$3'); + } + return phone; +} + +/* ============================================ + 녹음 파일 재생 + ============================================ */ +function fn_playRecord(recordNo) { + if (!recordNo) return; + + $.ajax({ + url: '/callLog/getRecordFileUrl.do', + type: 'POST', + data: { recordNo: recordNo }, + dataType: 'json', + success: function (data) { + if (data.success && data.recordUrl) { + window.open(data.recordUrl, '_blank', 'width=400,height=200'); + } else { + alert('녹음 파일을 불러올 수 없습니다.'); + } + }, + error: function () { + alert('녹음 파일 조회 중 오류가 발생하였습니다.'); + } + }); +} + diff --git a/src/main/resources/static/js/web/common.js b/src/main/resources/static/js/web/common.js index f0d93c3..57c96d2 100644 --- a/src/main/resources/static/js/web/common.js +++ b/src/main/resources/static/js/web/common.js @@ -1,19 +1,19 @@ /**************************************************************************** * 로그아웃 ****************************************************************************/ -function fn_logout(){ - window.location ='/weblogin/logout.do'; +function fn_logout() { + window.location = '/weblogin/logout.do'; } /**************************************************************************** * 로그아웃(session 종료) ****************************************************************************/ -function fn_sessionLogout(){ - if(checkMobile()){ +function fn_sessionLogout() { + if (checkMobile()) { getLoginInfo(); } - else{ - window.location ='/weblogin/logout.do'; + else { + window.location = '/weblogin/logout.do'; } } @@ -28,25 +28,25 @@ function fn_numberFormat(str) { /**************************************************************************** * 페이지 이동 ****************************************************************************/ -function fn_leftFormAction(action){ +function fn_leftFormAction(action) { let newForm = $("
"); - newForm.attr("name","submitForm"); - newForm.attr("method","POST"); - - if(-1 != action.indexOf("?")) { + newForm.attr("name", "submitForm"); + newForm.attr("method", "POST"); + + if (-1 != action.indexOf("?")) { let actionArr = action.split('?'); - newForm.attr("action",actionArr[0]); - + newForm.attr("action", actionArr[0]); + let paramUrlArr = actionArr[1].split('&'); - for(let i = 0; i < paramUrlArr.length; i++){ + for (let i = 0; i < paramUrlArr.length; i++) { let paramArr = paramUrlArr[i].split('='); - newForm.append($('',{type:'hidden',name:paramArr[0],value:paramArr[1]})); + newForm.append($('', { type: 'hidden', name: paramArr[0], value: paramArr[1] })); } } else { - newForm.attr("action",action); + newForm.attr("action", action); } - + // newForm.append($('',{type:'hidden',name:"menuCode",value:menuCode})); newForm.appendTo('body'); newForm.submit(); @@ -55,26 +55,26 @@ function fn_leftFormAction(action){ /**************************************************************************** * 페이지 이동2 ****************************************************************************/ -function fn_leftFormAction2(menuClass, action){ +function fn_leftFormAction2(menuClass, action) { let newForm = $(""); - newForm.attr("name","submitForm"); - newForm.attr("method","POST"); + newForm.attr("name", "submitForm"); + newForm.attr("method", "POST"); - if(-1 != action.indexOf("?")) { + if (-1 != action.indexOf("?")) { let actionArr = action.split('?'); - newForm.attr("action",actionArr[0]); + newForm.attr("action", actionArr[0]); let paramUrlArr = actionArr[1].split('&'); - for(let i = 0; i < paramUrlArr.length; i++){ + for (let i = 0; i < paramUrlArr.length; i++) { let paramArr = paramUrlArr[i].split('='); - newForm.append($('',{type:'hidden',name:paramArr[0],value:paramArr[1]})); + newForm.append($('', { type: 'hidden', name: paramArr[0], value: paramArr[1] })); } } else { - newForm.attr("action",action); + newForm.attr("action", action); } - newForm.append($('',{type:'hidden',name:"menuClass",value:menuClass})); + newForm.append($('', { type: 'hidden', name: "menuClass", value: menuClass })); newForm.appendTo('body'); newForm.submit(); } @@ -82,26 +82,26 @@ function fn_leftFormAction2(menuClass, action){ /**************************************************************************** * 새창 이동 (미리보기) ****************************************************************************/ -function fn_openPopup(action){ +function fn_openPopup(action) { let newForm = $(""); - newForm.attr("name","submitForm"); - newForm.attr("method","POST"); - newForm.attr("target","_blank"); - - if(-1 != action.indexOf("?")) { + newForm.attr("name", "submitForm"); + newForm.attr("method", "POST"); + newForm.attr("target", "_blank"); + + if (-1 != action.indexOf("?")) { let actionArr = action.split('?'); - newForm.attr("action",actionArr[0]); - + newForm.attr("action", actionArr[0]); + let paramUrlArr = actionArr[1].split('&'); - for(let i = 0; i < paramUrlArr.length; i++){ + for (let i = 0; i < paramUrlArr.length; i++) { let paramArr = paramUrlArr[i].split('='); - newForm.append($('',{type:'hidden',name:paramArr[0],value:paramArr[1]})); + newForm.append($('', { type: 'hidden', name: paramArr[0], value: paramArr[1] })); } } else { - newForm.attr("action",action); + newForm.attr("action", action); } - + newForm.appendTo('body'); newForm.submit(); } @@ -109,29 +109,29 @@ function fn_openPopup(action){ /**************************************************************************** * 새창 이동2 (미리보기) ****************************************************************************/ -function fn_openPopup2(menuClass, action){ +function fn_openPopup2(menuClass, action) { const newWindow = window.open("about:blank", "popup", "width=1600, height=800"); let newForm = $(""); - newForm.attr("name","submitForm"); - newForm.attr("method","POST"); - newForm.attr("target","popup"); + newForm.attr("name", "submitForm"); + newForm.attr("method", "POST"); + newForm.attr("target", "popup"); - if(-1 != action.indexOf("?")) { + if (-1 != action.indexOf("?")) { let actionArr = action.split('?'); - newForm.attr("action",actionArr[0]); + newForm.attr("action", actionArr[0]); let paramUrlArr = actionArr[1].split('&'); - for(let i = 0; i < paramUrlArr.length; i++){ + for (let i = 0; i < paramUrlArr.length; i++) { let paramArr = paramUrlArr[i].split('='); - newForm.append($('',{type:'hidden',name:paramArr[0],value:paramArr[1]})); + newForm.append($('', { type: 'hidden', name: paramArr[0], value: paramArr[1] })); } } else { - newForm.attr("action",action); + newForm.attr("action", action); } - newForm.append($('',{type:'hidden',name:"menuClass",value:menuClass})); + newForm.append($('', { type: 'hidden', name: "menuClass", value: menuClass })); newForm.appendTo('body'); newForm.submit(); } @@ -139,14 +139,14 @@ function fn_openPopup2(menuClass, action){ /**************************************************************************** * 뒤로가기 ****************************************************************************/ -function fn_back(){ +function fn_back() { history.back(); } /**************************************************************************** * 새로고침 ****************************************************************************/ -function fn_reload(){ +function fn_reload() { location.reload(); } @@ -154,36 +154,36 @@ function fn_reload(){ * 전화번호 형식 변경 * type:0이면 중간번호 가리기 ****************************************************************************/ -function fn_setFormatPhone(num,type){ +function fn_setFormatPhone(num, type) { if (!num) return ''; - num = String(num); + num = String(num); let formatNum = ''; - if(11 == num.length){ - if(0 == type){ + if (11 == num.length) { + if (0 == type) { formatNum = num.replace(/(\d{3})(\d{4})(\d{4})/, '$1-****-$3'); } - else{ + else { formatNum = num.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3'); } } - else if(8 == num.length){ + else if (8 == num.length) { formatNum = num.replace(/(\d{4})(\d{4})/, '$1-$2'); } - else{ - if(0 == num.indexOf('02')){ - if(0 == type){ + else { + if (0 == num.indexOf('02')) { + if (0 == type) { formatNum = num.replace(/(\d{2})(\d{4})(\d{4})/, '$1-****-$3'); } - else{ + else { formatNum = num.replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3'); } } - else{ - if(0 == type){ + else { + if (0 == type) { formatNum = num.replace(/(\d{3})(\d{3})(\d{4})/, '$1-***-$3'); } - else{ + else { formatNum = num.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3'); } } @@ -195,48 +195,48 @@ function fn_setFormatPhone(num,type){ /**************************************************************************** * 날짜 보이는 영역에 셋팅 ****************************************************************************/ -function fn_selectDateTime(paramId, paramValue){ - $("#"+paramId).val(paramValue); +function fn_selectDateTime(paramId, paramValue) { + $("#" + paramId).val(paramValue); } /**************************************************************************** * datePicker 생성 ****************************************************************************/ -function fn_datePicker(id){ +function fn_datePicker(id) { $(id).datetimepicker({ allowInputToggle: true, format: 'YYYY-MM-DD' }); - + } /**************************************************************************** * datePicker ****************************************************************************/ -function fn_searchDatePicker(startId, endId){ +function fn_searchDatePicker(startId, endId) { $(startId).datetimepicker({ allowInputToggle: true, format: 'YYYY-MM-DD', defaultDate: moment() }); - + $(endId).datetimepicker({ allowInputToggle: true, useCurrent: false, //Important! See issue #1075 format: 'YYYY-MM-DD', defaultDate: moment() }); - + /*$(endId).data("DateTimePicker").minDate(fn_getToDate());*/ - + //$(endId).data("DateTimePicker").maxDate(fn_getToDate()); //$(startId).data("DateTimePicker").maxDate(fn_getToDate()); - + $(startId).on("dp.change", function (e) { $(endId).data("DateTimePicker").minDate(e.date); - - if($(endId).data("DateTimePicker").date() < e.date){ - $(endId).data("DateTimePicker").date(e.date); + + if ($(endId).data("DateTimePicker").date() < e.date) { + $(endId).data("DateTimePicker").date(e.date); } }); } @@ -244,15 +244,15 @@ function fn_searchDatePicker(startId, endId){ /**************************************************************************** * dateTimePicker 생성 ****************************************************************************/ -function fn_dateTimePicker1(id, value){ - if(value){ +function fn_dateTimePicker1(id, value) { + if (value) { $(id).datetimepicker({ allowInputToggle: true, format: 'HH:mm', - defaultDate: moment().format('YYYY-MM-DD')+'T'+ value + defaultDate: moment().format('YYYY-MM-DD') + 'T' + value }); } - else{ + else { $(id).datetimepicker({ allowInputToggle: true, format: 'HH:mm' @@ -263,17 +263,17 @@ function fn_dateTimePicker1(id, value){ /**************************************************************************** * dateTimePicker 생성 (AM, PM 선택) ****************************************************************************/ -function fn_dateTimePicker2(id){ +function fn_dateTimePicker2(id) { $(id).datetimepicker({ allowInputToggle: true, format: 'LT' - }); + }); } /**************************************************************************** * dateTimePicker 생성 ****************************************************************************/ -function fn_dateTimePicker3(id){ +function fn_dateTimePicker3(id) { $(id).datetimepicker({ allowInputToggle: true, format: 'YYYY-MM-DD HH:mm' @@ -283,24 +283,24 @@ function fn_dateTimePicker3(id){ /**************************************************************************** * dateTimePicker 생성 (AM, PM 선택) ****************************************************************************/ -function fn_dateMonthPicker(id){ +function fn_dateMonthPicker(id) { $(id).datetimepicker({ allowInputToggle: true, format: 'YYYY-MM', defaultDate: moment().format('YYYY-MM') - }); + }); } /**************************************************************************** * null 확인 ****************************************************************************/ -function fn_emptyYn(value){ - if( value == "" || value == null || value == undefined || ( value != null && typeof value == "object" && !Object.keys(value).length ) ){ - return true +function fn_emptyYn(value) { + if (value == "" || value == null || value == undefined || (value != null && typeof value == "object" && !Object.keys(value).length)) { + return true + } + else { + return false } - else{ - return false - } } @@ -310,7 +310,7 @@ function fn_emptyYn(value){ function fn_getToDate() { let toDate = new Date(); let newToDate = fn_formatToDate(toDate.getFullYear(), 4) + '-' + fn_formatToDate(toDate.getMonth() + 1, 2) + '-' + fn_formatToDate(toDate.getDate(), 2); - + return newToDate; } @@ -319,8 +319,8 @@ function fn_getToDate() { ****************************************************************************/ function fn_getToYesterday() { let toDate = new Date(); - let newToDate = fn_formatToDate(toDate.getFullYear(), 4) + '-' + fn_formatToDate(toDate.getMonth() + 1, 2) + '-' + fn_formatToDate(toDate.getDate()-1, 2); - + let newToDate = fn_formatToDate(toDate.getFullYear(), 4) + '-' + fn_formatToDate(toDate.getMonth() + 1, 2) + '-' + fn_formatToDate(toDate.getDate() - 1, 2); + return newToDate; } @@ -330,13 +330,13 @@ function fn_getToYesterday() { function fn_formatToDate(day, number) { let temp = ''; day = day.toString(); - + if (day.length < number) { - for (i = 0; i < number - day.length; i++){ + for (i = 0; i < number - day.length; i++) { temp += '0'; } } - + return temp + day; } @@ -344,12 +344,12 @@ function fn_formatToDate(day, number) { /**************************************************************************** * 날짜 요일 조회 ****************************************************************************/ -function fn_getDayName(param){ +function fn_getDayName(param) { let paramArray = param.split('-'); - let week = new Array('일', '월', '화', '수', '목', '금', '토'); - let dt = new Date(parseInt(paramArray[0]), parseInt(paramArray[1])-1, parseInt(paramArray[2])); + let week = new Array('일', '월', '화', '수', '목', '금', '토'); + let dt = new Date(parseInt(paramArray[0]), parseInt(paramArray[1]) - 1, parseInt(paramArray[2])); let dayName = week[dt.getDay()]; - + return dayName; } @@ -366,61 +366,61 @@ function fn_getDayName(param){ **************************************************************************/ function setFormatDate(type, param) { let retureValue = param; - - if("A" == type){ + + if ("A" == type) { let dateArray = param.split("-"); - retureValue = dateArray[0]+"년 "+dateArray[1]+"월 "+dateArray[2]+"일"; + retureValue = dateArray[0] + "년 " + dateArray[1] + "월 " + dateArray[2] + "일"; } - else if("B" == type){ + else if ("B" == type) { let dateArray = param.split("-"); - retureValue = dateArray[1]+"월 "+dateArray[2]+"일"; + retureValue = dateArray[1] + "월 " + dateArray[2] + "일"; } - else if("C" == type){ + else if ("C" == type) { let tempArray = param.split(" "); let dateArray1 = tempArray[0].split("-"); let dateArray2 = tempArray[1]; - - retureValue = dateArray1[0]+"년 "+dateArray1[1]+"월 "+dateArray1[2]+"일 "+dateArray2; + + retureValue = dateArray1[0] + "년 " + dateArray1[1] + "월 " + dateArray1[2] + "일 " + dateArray2; } - else if("D" == type){ + else if ("D" == type) { let dateArray = param.split("-"); - retureValue = dateArray[0].substring(2, 4)+"."+dateArray[1]+"."+dateArray[2]; + retureValue = dateArray[0].substring(2, 4) + "." + dateArray[1] + "." + dateArray[2]; } - else if("E" == type){ + else if ("E" == type) { let dateArray = param.split("-"); - retureValue = dateArray[0].substring(0, 4)+"."+dateArray[1]+"."+dateArray[2]; + retureValue = dateArray[0].substring(0, 4) + "." + dateArray[1] + "." + dateArray[2]; } - else if("F" == type){ + else if ("F" == type) { let dateArray = param.split("-"); const week = ['일', '월', '화', '수', '목', '금', '토']; const dayOfWeek = week[new Date(dateArray[0], dateArray[1], dateArray[2]).getDay()]; - - retureValue = dateArray[1]+"/"+dateArray[2]+"("+dayOfWeek+")"; + + retureValue = dateArray[1] + "/" + dateArray[2] + "(" + dayOfWeek + ")"; } - else if("G" == type){ + else if ("G" == type) { // 년.월.일(요일) let dateArray = param.split("-"); const week = ['일', '월', '화', '수', '목', '금', '토']; const dayOfWeek = week[new Date(dateArray[0], dateArray[1], dateArray[2]).getDay()]; - - retureValue = dateArray[0].substring(0, 4)+"."+dateArray[1]+"."+dateArray[2]+"("+dayOfWeek+")"; + + retureValue = dateArray[0].substring(0, 4) + "." + dateArray[1] + "." + dateArray[2] + "(" + dayOfWeek + ")"; } - else if("H" == type){ + else if ("H" == type) { let dateArray = param.split("-"); - retureValue = dateArray[0].substr(2, 4)+dateArray[1]+dateArray[2]; + retureValue = dateArray[0].substr(2, 4) + dateArray[1] + dateArray[2]; } - + return retureValue; } /**************************************************************************** * 빈값 체크 ****************************************************************************/ -function fn_emptyCheck(param){ - if(param === null || param === "" || param === "null" || param === "NULL" || param === undefined || param === "undefined"){ +function fn_emptyCheck(param) { + if (param === null || param === "" || param === "null" || param === "NULL" || param === undefined || param === "undefined") { return false; } - else{ + else { return true; } } @@ -428,13 +428,13 @@ function fn_emptyCheck(param){ /**************************************************************************** * 길이 체크 ****************************************************************************/ -function fn_lengthCheck(str, maxLength){ +function fn_lengthCheck(str, maxLength) { let strLength = str.length; - - if(strLength > maxLength){ + + if (strLength > maxLength) { return false; } - else{ + else { return true; } } @@ -442,26 +442,26 @@ function fn_lengthCheck(str, maxLength){ /**************************************************************************** * 날짜 체크 ****************************************************************************/ -function fn_dateCheck(value){ +function fn_dateCheck(value) { let strLength = value.length; let cnt = 0; let searchChar = "-"; // 찾으려는 문자 let pos = value.indexOf(searchChar); // pos는 0의 값을 가짐 - if(10 == strLength){ - while(-1 !== pos){ + if (10 == strLength) { + while (-1 !== pos) { cnt++; pos = value.indexOf(searchChar, pos + 1) // 첫 번째 - 이후의 인덱스부터 -를 찾음 } - if(2 == cnt){ + if (2 == cnt) { return true; } - else{ + else { return false; } } - else{ + else { return false; } // let date = value.split("-"); @@ -480,26 +480,26 @@ function fn_dateCheck(value){ /**************************************************************************** * 날짜 시간 체크 ****************************************************************************/ -function fn_dateTimeCheck(value){ +function fn_dateTimeCheck(value) { let strLength = value.length; let cnt = 0; let searchChar = "-"; // 찾으려는 문자 let pos = value.indexOf(searchChar); // pos는 0의 값을 가짐 - if(10 == strLength){ - while(-1 !== pos){ + if (10 == strLength) { + while (-1 !== pos) { cnt++; pos = value.indexOf(searchChar, pos + 1) // 첫 번째 - 이후의 인덱스부터 -를 찾음 } - if(2 == cnt){ + if (2 == cnt) { return true; } - else{ + else { return false; } } - else{ + else { return false; } @@ -519,148 +519,148 @@ function fn_dateTimeCheck(value){ /**************************************************************************** * 첨부파일 최대 용량 ****************************************************************************/ -function fn_maxFileSize(){ +function fn_maxFileSize() { return 52428800; } /**************************************************************************** * 첨부파일 최대 갯수 : 10 ****************************************************************************/ -function fn_maxFileCount(){ +function fn_maxFileCount() { return 10; } /**************************************************************************** * 첨부파일 최대 갯수 : 5 ****************************************************************************/ -function fn_maxFileCount2(){ +function fn_maxFileCount2() { return 5; } /**************************************************************************** * 약관 페이지 이동 ****************************************************************************/ -function fn_selectPolicyIntro(param){ - let pagingParam = '?policyType='+param; +function fn_selectPolicyIntro(param) { + let pagingParam = '?policyType=' + param; - fn_openPopup("/webpolicy/policyDetailIntro.do"+pagingParam); + fn_openPopup("/webpolicy/policyDetailIntro.do" + pagingParam); } /**************************************************************************** * 기본 프로필 사진 처리 ****************************************************************************/ -function fn_setProfileUrlEmpty(param, widthParam, heightParam, index, className){ - if(fn_emptyCheck(param)){ - if(widthParamtoday){ + const paramDay = new Date(dateArray[0], dateArray[1] - 1, dateArray[2]); + + if (paramDay > today) { const gapDay = paramDay.getTime() - today.getTime(); - + const resultDate = Math.ceil(gapDay / (1000 * 60 * 60 * 24)); - - return 'D-'+resultDate; + + return 'D-' + resultDate; } - else{ + else { const gapDay = today.getTime() - paramDay.getTime(); - - const resultDate = Math.ceil(gapDay / (1000 * 60 * 60 * 24))-1; - - if(0==resultDate){ + + const resultDate = Math.ceil(gapDay / (1000 * 60 * 60 * 24)) - 1; + + if (0 == resultDate) { return 'D-day'; } - else{ + else { return ''; } } @@ -670,202 +670,202 @@ function fn_setDday(param){ /**************************************************************************** * selectBox 선택 시 색상 ****************************************************************************/ -function fn_selectColor(param){ +function fn_selectColor(param) { let selectValue = $(param).val(); - - if(""!=selectValue){ - $(param).css("color","#121212"); - }else{ - $(param).css("color","#969696"); + + if ("" != selectValue) { + $(param).css("color", "#121212"); + } else { + $(param).css("color", "#969696"); } } /**************************************************************************** * 프로필 화면 이동 ****************************************************************************/ -function fn_userProfileIntro(param){ - location.href = "/webuserprofile/selectListUserProfileIntro.do?userName="+param; - +function fn_userProfileIntro(param) { + location.href = "/webuserprofile/selectListUserProfileIntro.do?userName=" + param; + //fn_leftFormAction2("", "/webuserprofile/selectListUserProfileIntro.do?userName="+param+"&loginId="+param2); } /**************************************************************************** * 검색 화면 이동 ****************************************************************************/ -function fn_searchFeedIntro(param,param2){ - fn_leftFormAction2(menuClass, "/websearch/selectListSearchIntro.do?searchText=#"+param+"&searchType="+param2); +function fn_searchFeedIntro(param, param2) { + fn_leftFormAction2(menuClass, "/websearch/selectListSearchIntro.do?searchText=#" + param + "&searchType=" + param2); } /**************************************************************************** * 전화번호 형식 (가운데 마스킹 처리) ****************************************************************************/ -function fn_setFormatPhoneNumber(param){ - if(fn_emptyCheck(param)){ +function fn_setFormatPhoneNumber(param) { + if (fn_emptyCheck(param)) { return param - .replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3') - .split('-') - .reduce((pre, cur, idx) => (idx === 1 ? pre + '****' : pre + cur), ''); + .replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3') + .split('-') + .reduce((pre, cur, idx) => (idx === 1 ? pre + '****' : pre + cur), ''); } else { return ''; } } -function modalCloseEvent(){ +function modalCloseEvent() { $(".loading-image-layer").hide(); - - let modalCheck = false; + + let modalCheck = false; let modalArrLength = modalArr.length; - - for(let i=0;i'; - timeHTML += '
  • '+hour+':30
  • '; + + if (hour < 10) hour = '0' + hour; + + if (i == 0) { + timeHTML += '
  • ' + hour + ':00
  • '; + timeHTML += '
  • ' + hour + ':30
  • '; } - else{ - timeHTML += '
  • '+hour+':00
  • '; - timeHTML += '
  • '+hour+':30
  • '; + else { + timeHTML += '
  • ' + hour + ':00
  • '; + timeHTML += '
  • ' + hour + ':30
  • '; } - + } - $('#'+target).empty().html(timeHTML); - - $('#'+target).siblings("button").text(defaultTime); - $('#'+target).siblings("input").val(defaultTime); - + $('#' + target).empty().html(timeHTML); + + $('#' + target).siblings("button").text(defaultTime); + $('#' + target).siblings("input").val(defaultTime); + // 옵션 선택 이벤트 - $('#'+target + '>.option_list_item').on('click', function() { + $('#' + target + '>.option_list_item').on('click', function () { let selectedOption = $(this).text(); $(this).parent().siblings("button").text(selectedOption); $(this).parent().siblings("input").val(selectedOption); @@ -875,10 +875,10 @@ function fn_setTimeValue(target, defaultTime){ // 공백처리 -function fn_formatNull(param){ - if(null==param){ +function fn_formatNull(param) { + if (null == param) { return ''; - }else{ + } else { return param; } } diff --git a/src/main/resources/static/js/web/contentsBbs/ContentsBbsPop.js b/src/main/resources/static/js/web/contentsBbs/ContentsBbsPop.js index 41e5503..2e5ebb8 100644 --- a/src/main/resources/static/js/web/contentsBbs/ContentsBbsPop.js +++ b/src/main/resources/static/js/web/contentsBbs/ContentsBbsPop.js @@ -1,10 +1,10 @@ /* ############################################################## - 설 명 : [Modal]고객 검색 팝업 - 작성일 : 2025. 06. 24. - 작성자 : NTsoft - 수정일 수정자 수정내용 - ------- -------- --------------------------- - 2024. 03. 14. NTsoft 최초 생성 + 설 명 : [Modal]고객 검색 팝업 + 작성일 : 2025. 06. 24. + 작성자 : NTsoft + 수정일 수정자 수정내용 + ------- -------- --------------------------- + 2024. 03. 14. NTsoft 최초 생성 */ let treatmentSelectModal = { callback: null, @@ -16,52 +16,62 @@ let treatmentSelectModal = { $('body').append(this.HtmlTemplate); //그리드 이벤트 this.setEvent(); - treatmentSelectModal.searchIntroUserList('Y'); + treatmentSelectModal.searchIntroUserList('Y'); }, /* 그리드 이벤트 설정 */ setEvent: function () { - $('#treatmentSelectModal .btnCancle').on("click", function () { + $('#treatmentSelectModal .btnCancle').off('click').on("click", function () { treatmentSelectModal.close(); }); - $('#treatmentSelectModal .btnSave').on("click", function () { - treatmentSelectModal.save(); - }); - document.getElementById("searchIntroUserBtn").addEventListener('click',()=>{ - treatmentSelectModal.searchIntroUserList('N'); - }); - document.getElementById("introUserSearchKeyword").addEventListener('keypress',(e)=>{ - fn_IntroUserEnter(e) - }); + + // Remove existing listener to prevent duplicates if any + let searchBtn = document.getElementById("searchIntroUserBtn"); + if (searchBtn) { + let newSearchBtn = searchBtn.cloneNode(true); + searchBtn.parentNode.replaceChild(newSearchBtn, searchBtn); + newSearchBtn.addEventListener('click', () => { + treatmentSelectModal.searchIntroUserList('N'); + }); + } + + let searchInput = document.getElementById("introUserSearchKeyword"); + if (searchInput) { + let newSearchInput = searchInput.cloneNode(true); + searchInput.parentNode.replaceChild(newSearchInput, searchInput); + newSearchInput.addEventListener('keypress', (e) => { + fn_IntroUserEnter(e) + }); + } }, /* 데이터 선택 */ setSelect: function (selectNumber) { - let checkedData = dataList[selectNumber]; - if(dataList==null||checkedData==undefined){ - return ; - } - - if( treatmentSelectModal.callback ) { - treatmentSelectModal.callback(checkedData); - } - treatmentSelectModal.close(); + let checkedData = dataList[selectNumber]; + if (dataList == null || checkedData == undefined) { + return; + } + + if (treatmentSelectModal.callback) { + treatmentSelectModal.callback(checkedData); + } + treatmentSelectModal.close(); }, //저장 save: function () { }, - searchIntroUserList:function (initflag){ + searchIntroUserList: function (initflag) { let searchKeyword = document.querySelector("#introUserSearchKeyword").value; let formData = new FormData(); - if(2 > searchKeyword.length && initflag == 'N'){ + if (2 > searchKeyword.length && initflag == 'N') { modalEvent.warning("", "검색어는 2자 이상으로 입력해 주시기 바랍니다."); return; } formData.append("menuClass", menuClass); - formData.append("userSearchKeywordParam", searchKeyword??''); + formData.append("userSearchKeywordParam", searchKeyword ?? ''); $.ajax({ url: encodeURI('/webtreatmentdiet/selectListTreatmentOption.do'), @@ -78,17 +88,19 @@ let treatmentSelectModal = { tbody.removeChild(tbody.firstChild); } dataList = data.rows; - data.rows.forEach(function(treatment, index) { + data.rows.forEach(function (treatment, index) { let tr = document.createElement('tr'); + // Use style pointer to indicate clickable + tr.style.cursor = 'pointer'; tr.innerHTML = '' + treatment.treatmentNm + ''; - tr.innerHTML += '' + treatment.price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ''; - tr.innerHTML += '' + treatment.discountPrice.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ''; - tr.onclick = function() { + tr.innerHTML += '' + treatment.price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ''; + tr.innerHTML += '' + treatment.discountPrice.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ''; + tr.onclick = function () { treatmentSelectModal.setSelect(index); }; - + tbody.appendChild(tr); - + }); } }, @@ -127,11 +139,15 @@ let treatmentSelectModal = { close: function () { $('#treatmentSelectModal').modal('hide'); - setTimeout(function(){ - $('#treatmentSelectModal').remove(); - },500); + setTimeout(function () { + // Properly dispose of modal if using bootstrap 5 or just remove for simple usage + $('#treatmentSelectModal').remove(); + $('.modal-backdrop').remove(); // Ensure backdrop is removed + $('body').removeClass('modal-open'); + $('body').css('padding-right', ''); + }, 500); }, - HtmlTemplate : ` + HtmlTemplate: `