feat: Implement web reservation functionality with new controllers, services, data access objects, mappers, and UI components.

This commit is contained in:
pjs
2026-02-16 01:24:50 +09:00
parent f7e00b745f
commit ce39cc5c99
14 changed files with 2371 additions and 4672 deletions

View File

@@ -0,0 +1,240 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Reservation">
<!-- 병원 휴일 조회 (달력 표출용) -->
<select id="selectHospitalHolidayList" parameterType="hashmap" resultType="hashmap">
SELECT 'hospitalHoliday' AS "dateType"
, HOSPITAL_HOLIDAY_NAME AS "hospitalHolidayName"
, DATE_FORMAT(LOC_DATE, '%Y-%m-%d') AS "locDate"
FROM MU_HOSPITAL_HOLIDAY MH
WHERE MH.USE_YN = 'Y'
AND MH.MU_HOSPITAL_ID = (SELECT MU_HOSPITAL_ID FROM MU_HOSPITAL WHERE USE_YN='Y' AND CENTER_DIV_CD='DIET' LIMIT 1)
AND (
(MH.REPEAT_YN = 'Y')
OR
(MH.REPEAT_YN = 'N' AND DATE_FORMAT( MH.LOC_DATE, '%Y' ) >= DATE_FORMAT( CURDATE( ), '%Y' ))
)
UNION ALL
(
SELECT 'publicHoliday' AS "dateType"
, MPH.PUBLIC_HOLIDAY_NAME AS "publicHolidayName"
, DATE_FORMAT(MPH.LOC_DATE, '%Y-%m-%d') AS "locDate"
FROM MU_PUBLIC_HOLIDAY MPH
JOIN MU_HOSPITAL MH
ON MH.MU_HOSPITAL_ID = (SELECT MU_HOSPITAL_ID FROM MU_HOSPITAL WHERE USE_YN='Y' AND CENTER_DIV_CD='DIET' LIMIT 1)
AND MH.PUBLIC_HOLIDAY_USE_YN = 'Y'
WHERE MPH.USE_YN = 'Y'
AND DATE_FORMAT( MPH.LOC_DATE, '%Y' ) >= DATE_FORMAT( CURDATE( ), '%Y' )
)
UNION ALL
(
SELECT CASE WHEN OPEN_YN = 'Y' THEN 'hospitalScheduleOpen' ELSE 'hospitalSchedule' END AS "dateType"
, CASE WHEN OPEN_YN = 'Y' THEN '운영' ELSE '휴무' END AS "hospitalHolidayName"
, DATE_FORMAT(SCHEDULE_DATE, '%Y-%m-%d') AS "locDate"
FROM MU_HOSPITAL_SCHEDULE
WHERE MU_HOSPITAL_ID = (SELECT MU_HOSPITAL_ID FROM MU_HOSPITAL WHERE USE_YN='Y' AND CENTER_DIV_CD='DIET' LIMIT 1)
AND USE_YN = 'Y'
AND DATE_FORMAT( SCHEDULE_DATE, '%Y' ) >= DATE_FORMAT( CURDATE( ), '%Y' )
)
</select>
<!-- 특정 날짜 운영시간 조회 -->
<select id="selectHospitalWorkTime" parameterType="hashmap" resultType="hashmap">
SELECT MH.MU_HOSPITAL_ID AS "muHospitalId"
,MH.HOSPITAL_NAME AS "hospitalName"
,CASE
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL THEN MHS.OPEN_YN
ELSE
CASE DAYOFWEEK(#{searchDate})
WHEN 2 THEN MH.MON_OPEN_YN
WHEN 3 THEN MH.TUE_OPEN_YN
WHEN 4 THEN MH.WED_OPEN_YN
WHEN 5 THEN MH.THU_OPEN_YN
WHEN 6 THEN MH.FRI_OPEN_YN
WHEN 7 THEN MH.SAT_OPEN_YN
WHEN 1 THEN MH.SUN_OPEN_YN
END
END AS "openYn"
,CASE
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL AND MHS.OPEN_YN = 'Y' THEN 'N'
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL AND MHS.OPEN_YN = 'N' THEN 'Y'
WHEN EXISTS (
SELECT 1
FROM MU_HOSPITAL_HOLIDAY HH
WHERE HH.USE_YN = 'Y'
AND HH.MU_HOSPITAL_ID = MH.MU_HOSPITAL_ID
AND (
(HH.REPEAT_YN = 'Y' AND DATE_FORMAT(HH.LOC_DATE, '%m-%d') = DATE_FORMAT(#{searchDate}, '%m-%d'))
OR
(HH.REPEAT_YN = 'N' AND HH.LOC_DATE = #{searchDate})
)) OR
EXISTS (
SELECT 1
FROM MU_PUBLIC_HOLIDAY MPH
WHERE MPH.USE_YN = 'Y'
AND MH.PUBLIC_HOLIDAY_USE_YN='Y'
AND MPH.LOC_DATE = #{searchDate}
)
THEN 'Y'
ELSE 'N'
END AS "holidayYn"
,CASE
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL THEN MHS.OPEN_START_TIME
ELSE
CASE DAYOFWEEK(#{searchDate})
WHEN 2 THEN MH.MON_OPEN_START_TIME
WHEN 3 THEN MH.TUE_OPEN_START_TIME
WHEN 4 THEN MH.WED_OPEN_START_TIME
WHEN 5 THEN MH.THU_OPEN_START_TIME
WHEN 6 THEN MH.FRI_OPEN_START_TIME
WHEN 7 THEN MH.SAT_OPEN_START_TIME
WHEN 1 THEN MH.SUN_OPEN_START_TIME
END
END AS "openStartTime"
,CASE
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL THEN MHS.OPEN_END_TIME
ELSE
CASE DAYOFWEEK(#{searchDate})
WHEN 2 THEN MH.MON_OPEN_END_TIME
WHEN 3 THEN MH.TUE_OPEN_END_TIME
WHEN 4 THEN MH.WED_OPEN_END_TIME
WHEN 5 THEN MH.THU_OPEN_END_TIME
WHEN 6 THEN MH.FRI_OPEN_END_TIME
WHEN 7 THEN MH.SAT_OPEN_END_TIME
WHEN 1 THEN MH.SUN_OPEN_END_TIME
END
END AS "openEndTime"
,CASE
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL THEN MHS.BREAK_START_TIME
ELSE
CASE DAYOFWEEK(#{searchDate})
WHEN 2 THEN MH.MON_BREAK_START_TIME
WHEN 3 THEN MH.TUE_BREAK_START_TIME
WHEN 4 THEN MH.WED_BREAK_START_TIME
WHEN 5 THEN MH.THU_BREAK_START_TIME
WHEN 6 THEN MH.FRI_BREAK_START_TIME
WHEN 7 THEN MH.SAT_BREAK_START_TIME
WHEN 1 THEN MH.SUN_BREAK_START_TIME
END
END AS "breakStartTime"
,CASE
WHEN MHS.MU_HOSPITAL_SCHEDULE_ID IS NOT NULL THEN MHS.BREAK_END_TIME
ELSE
CASE DAYOFWEEK(#{searchDate})
WHEN 2 THEN MH.MON_BREAK_END_TIME
WHEN 3 THEN MH.TUE_BREAK_END_TIME
WHEN 4 THEN MH.WED_BREAK_END_TIME
WHEN 5 THEN MH.THU_BREAK_END_TIME
WHEN 6 THEN MH.FRI_BREAK_END_TIME
WHEN 7 THEN MH.SAT_BREAK_END_TIME
WHEN 1 THEN MH.SUN_BREAK_END_TIME
END
END AS "breakEndTime"
,MH.PUBLIC_HOLIDAY_USE_YN AS "publicHolidayUseYn"
FROM MU_HOSPITAL AS MH
LEFT JOIN MU_HOSPITAL_SCHEDULE MHS
ON MH.MU_HOSPITAL_ID = MHS.MU_HOSPITAL_ID
AND MHS.SCHEDULE_DATE = #{searchDate}
AND MHS.USE_YN = 'Y'
WHERE MH.USE_YN = 'Y'
AND MH.CENTER_DIV_CD = 'DIET'
LIMIT 0, 1
</select>
<!-- 예약 카운트 조회 -->
<select id="selectReservationCnt" resultType="hashmap" parameterType="hashmap">
SELECT COUNT(*) AS RES_CNT
FROM MU_RESERVE
WHERE RESERVE_DATE = #{SELECTED_DATE}
AND RESERVE_TIME = #{TIME}
</select>
<!-- 예약 시술 정보 조회 -->
<select id="selectReservationService" resultType="hashmap" parameterType="hashmap">
SELECT A.TREATMENT_PROCEDURE_NAME, (B.PRICE + B.VAT) AS PRICE, B.VAT, B.DISCOUNT_PRICE, C.MU_TREATMENT_ID, C.TREATMENT_NAME, B.MU_TREATMENT_PROCEDURE_ID
FROM MU_TREATMENT_PROCEDURE A
LEFT OUTER JOIN MU_TREATMENT_PROCEDURE_PRICE B ON A.MU_TREATMENT_PROCEDURE_ID = B.MU_TREATMENT_PROCEDURE_ID AND B.USE_YN = 'Y'
LEFT OUTER JOIN MU_TREATMENT C ON A.MU_TREATMENT_ID = C.MU_TREATMENT_ID
WHERE A.MU_TREATMENT_PROCEDURE_ID = #{PROCEDURE_ID}
</select>
<!-- 시술 상세 조회 (CRM 연동용) -->
<select id="selectServiceDetail" resultType="hashmap" parameterType="hashmap">
SELECT A.CATEGORY_DIV_CD
, A.CATEGORY_NO
, A.POST_NO
, C.CATEGORY_NM
, A.TITLE
, A.CONTENT
, A.THUMBNAIL_BOTTOM_TXT
, A.HASHTAG
, A.OLD_CRM_ITEM_ID as oldCrmItemId
, D.FILE_PATH AS THUMBNAIL_PATH
, E.FILE_PATH AS CONTENTS_PATH
, (SELECT MIN(PRICE + VAT) FROM MU_TREATMENT_PROCEDURE_PRICE C
LEFT OUTER JOIN HP_CONTENTS_BBS_PROCEDURE B ON A.POST_NO = B.POST_NO AND A.CATEGORY_DIV_CD = B.CATEGORY_DIV_CD AND A.CATEGORY_NO = B.CATEGORY_NO AND B.USE_YN = 'Y'
WHERE B.MU_TREATMENT_PROCEDURE_ID = C.MU_TREATMENT_PROCEDURE_ID AND C.USE_YN = 'Y') AS PRICE
, (SELECT MIN(DISCOUNT_PRICE) FROM MU_TREATMENT_PROCEDURE_PRICE C
LEFT OUTER JOIN HP_CONTENTS_BBS_PROCEDURE B ON A.POST_NO = B.POST_NO AND A.CATEGORY_DIV_CD = B.CATEGORY_DIV_CD AND A.CATEGORY_NO = B.CATEGORY_NO AND B.USE_YN = 'Y'
WHERE B.MU_TREATMENT_PROCEDURE_ID = C.MU_TREATMENT_PROCEDURE_ID AND C.USE_YN = 'Y') AS DISCOUNT_PRICE
FROM HP_CONTENTS_BBS A
LEFT OUTER JOIN HP_CATEGORY C ON A.CATEGORY_NO = C.CATEGORY_NO AND A.CATEGORY_DIV_CD = C.CATEGORY_DIV_CD
LEFT OUTER JOIN HP_ATTACH_FILE D ON A.THUMBNAIL_ATTACHFILE_ID = D.ATTACHFILE_ID
LEFT OUTER JOIN HP_ATTACH_FILE E ON A.CONTENTS_ATTACHFILE_ID = E.ATTACHFILE_ID
WHERE A.USE_YN = 'Y'
AND A.CATEGORY_DIV_CD = #{CATEGORY_DIV_CD}
AND A.CATEGORY_NO = #{CATEGORY_NO}
AND A.POST_NO = #{POST_NO}
</select>
<!-- 예약 저장 -->
<insert id="insertReservation" parameterType="hashmap">
<selectKey resultType="string" keyProperty="id" order="BEFORE">
SELECT CONCAT(#{muReserveId},LPAD((SELECT NEXTVAL(MU_RESERVE_SEQ)), 11, 0))
</selectKey>
INSERT INTO MU_RESERVE(
MU_RESERVE_ID
,USER_NAME
,PHONE_NUMBER
,RESERVE_DATE
,RESERVE_TIME
,MU_TREATMENT_ID
,TREATMENT_NAME
,MU_TREATMENT_PROCEDURE_ID
,TREATMENT_PROCEDURE_NAME
,ETC
,STATUS
,STATUS2
,WRITE_DATE
,WRITE_TIME
,CUD_FLAG
,USE_YN
,REG_ID
,REG_DATE
,MOD_ID
,MOD_DATE
)VALUES(
#{id}
,#{NAME}
,#{PHONE_NUMBER}
,#{SELECTED_DATE}
,#{TIME}
,#{P_TREATMENT_ID}
,#{P_TREATMENT_NM}
,#{P_PROCEDURE_ID}
,#{P_PROCEDURE_NM}
,#{ETC,jdbcType=VARCHAR}
,'T'
,'N'
,CURDATE()
,CURTIME()
,'C'
,'Y'
,'customer'
,NOW()
,'customer'
,NOW()
)
</insert>
</mapper>

View File

@@ -69,71 +69,5 @@
AND A.CATEGORY_NO = #{CATEGORY_NO}
AND A.POST_NO = #{POST_NO}
</select>
<!-- 예약 조회 -->
<select id="selectReservationCnt" resultType="hashmap" parameterType="hashmap">
SELECT COUNT(*) AS RES_CNT
FROM MU_RESERVE
WHERE RESERVE_DATE = #{SELECTED_DATE}
AND RESERVE_TIME = #{TIME}
</select>
<!-- 시술 목록 조회 -->
<select id="selectReservationService" resultType="hashmap" parameterType="hashmap">
SELECT A.TREATMENT_PROCEDURE_NAME, (B.PRICE + B.VAT) AS PRICE, B.VAT, B.DISCOUNT_PRICE, C.MU_TREATMENT_ID, C.TREATMENT_NAME, B.MU_TREATMENT_PROCEDURE_ID
FROM MU_TREATMENT_PROCEDURE A
LEFT OUTER JOIN MU_TREATMENT_PROCEDURE_PRICE B ON A.MU_TREATMENT_PROCEDURE_ID = B.MU_TREATMENT_PROCEDURE_ID AND B.USE_YN = 'Y'
LEFT OUTER JOIN MU_TREATMENT C ON A.MU_TREATMENT_ID = C.MU_TREATMENT_ID
WHERE A.MU_TREATMENT_PROCEDURE_ID = #{PROCEDURE_ID}
</select>
<!-- 예약 저장 -->
<insert id="insertReservation" parameterType="hashmap">
<selectKey resultType="string" keyProperty="id" order="BEFORE">
SELECT CONCAT(#{muReserveId},LPAD((SELECT NEXTVAL(MU_RESERVE_SEQ)), 11, 0))
</selectKey>
INSERT INTO MU_RESERVE(
MU_RESERVE_ID
,USER_NAME
,PHONE_NUMBER
,RESERVE_DATE
,RESERVE_TIME
,MU_TREATMENT_ID
,TREATMENT_NAME
,MU_TREATMENT_PROCEDURE_ID
,TREATMENT_PROCEDURE_NAME
,ETC
,STATUS
,STATUS2
,WRITE_DATE
,WRITE_TIME
,CUD_FLAG
,USE_YN
,REG_ID
,REG_DATE
,MOD_ID
,MOD_DATE
)VALUES(
#{id}
,#{NAME}
,#{PHONE_NUMBER}
,#{SELECTED_DATE}
,#{TIME}
,#{P_TREATMENT_ID}
,#{P_TREATMENT_NM}
,#{P_PROCEDURE_ID}
,#{P_PROCEDURE_NM}
,#{ETC,jdbcType=VARCHAR}
,'T'
,'N'
,CURDATE()
,CURTIME()
,'C'
,'Y'
,'customer'
,NOW()
,'customer'
,NOW()
)
</insert>
</mapper>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff