diff --git a/src/main/java/com/madeu/controller/web/webhospital/WebHospitalController.java b/src/main/java/com/madeu/controller/web/webhospital/WebHospitalController.java index efaffb3..f6801c2 100644 --- a/src/main/java/com/madeu/controller/web/webhospital/WebHospitalController.java +++ b/src/main/java/com/madeu/controller/web/webhospital/WebHospitalController.java @@ -258,4 +258,106 @@ public class WebHospitalController extends ManagerDraftAction { 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); + } } 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 3ac64f1..5995609 100644 --- a/src/main/java/com/madeu/service/web/webhospital/WebHospitalService.java +++ b/src/main/java/com/madeu/service/web/webhospital/WebHospitalService.java @@ -14,4 +14,9 @@ public interface WebHospitalService { 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; } 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 9ceebcf..bf435c6 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 @@ -758,4 +758,72 @@ public class WebHospitalServiceImpl implements WebHospitalService { 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; + } } diff --git a/src/main/resources/mappers/WebHospitalSqlMap.xml b/src/main/resources/mappers/WebHospitalSqlMap.xml index 5ab5297..41b3638 100644 --- a/src/main/resources/mappers/WebHospitalSqlMap.xml +++ b/src/main/resources/mappers/WebHospitalSqlMap.xml @@ -55,14 +55,18 @@ @@ -136,7 +160,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 @@ -187,6 +215,9 @@ LEFT JOIN MU_HOSPITAL AS MH ON 1 = 1 ) 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} 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/js/web/hospital/hospitalUpdate.js b/src/main/resources/static/js/web/hospital/hospitalUpdate.js index e192411..beb87cf 100644 --- a/src/main/resources/static/js/web/hospital/hospitalUpdate.js +++ b/src/main/resources/static/js/web/hospital/hospitalUpdate.js @@ -2,7 +2,7 @@ /**************************************************************************** * 병원 정보 상세 조회 ****************************************************************************/ -function fn_selectHospitalJson() { +function fn_selectHospitalJson(onlyOperatingHours) { let formData = new FormData(); formData.append("menuClass", menuClass); @@ -120,16 +120,20 @@ function fn_selectHospitalJson() { if ('Y' == hospitalRows.publicHolidayUseYn) { $('#checkPublicHolidayUseYn').prop('checked', true); + } else { + $('#checkPublicHolidayUseYn').prop('checked', false); } $("#txt_muMemberId").val(hospitalRows.muMemberId); $("#txt_memberName").val(hospitalRows.memberName); - // 휴일 상세 정보 - fn_addRow2(hospitalRows.holidayRows); + if (!onlyOperatingHours) { + // 휴일 상세 정보 + fn_addRow2(hospitalRows.holidayRows); - // 달력 조회 (병원 ID 확보 후 실행) - fn_selectHospitalHolidayList(); + // 달력 조회 (병원 ID 확보 후 실행) + fn_selectHospitalHolidayList(); + } } else { modalEvent.danger("조회 오류", data.msgDesc); @@ -147,6 +151,9 @@ function fn_selectHospitalJson() { }); } +/**************************************************************************** +* 조회 row 추가 이벤트 +****************************************************************************/ /**************************************************************************** * 조회 row 추가 이벤트 ****************************************************************************/ @@ -154,116 +161,137 @@ function fn_addRow2(detailList) { let addRowHtml = ''; if (0 < detailList.length) { - addRowHtml += '
  • '; - addRowHtml += ' 휴일명'; - addRowHtml += ' 날짜'; - addRowHtml += ' 일정반복'; - addRowHtml += ' '; + // Rebuild Header (must match HTML exactly) + addRowHtml += '
  • '; + addRowHtml += ' '; + addRowHtml += ' 휴일명'; + addRowHtml += ' 날짜'; + addRowHtml += ' 일정반복'; + addRowHtml += ' 저장'; addRowHtml += '
  • '; for (let i = 0; i < detailList.length; i++) { let hospitalHolidayName = detailList[i].hospitalHolidayName; let locDate = detailList[i].locDate; let repeatYn = detailList[i].repeatYn; + let repeatLabel = ('Y' == repeatYn) ? '반복' : '반복 안함'; - addRowHtml += '
  • '; - addRowHtml += '
    '; - addRowHtml += ' '; + addRowHtml += '
  • '; + + // Checkbox + addRowHtml += '
    '; + addRowHtml += ' '; addRowHtml += '
    '; - addRowHtml += '
    '; - addRowHtml += '
    '; - addRowHtml += ' calendar'; - addRowHtml += ' '; + // Name + addRowHtml += '
    '; + addRowHtml += ' '; + addRowHtml += '
    '; + + // Date + // Use simpler structure to avoid CSS conflict + addRowHtml += '
    '; + addRowHtml += '
    '; + addRowHtml += ' calendar'; + addRowHtml += ' '; addRowHtml += '
    '; addRowHtml += '
    '; - addRowHtml += '
    '; - addRowHtml += '